user.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. <template>
  2. <div class="page flex-col">
  3. <s-header :name="sys ? sys.title : $t('public.sysName')" :noback="true" :isFixed="false"></s-header>
  4. <div class="userPageBox">
  5. <div class="userBaseBox">
  6. <div class="baseRow flex-row justify-between">
  7. <div class="group2 flex-col"></div>
  8. <span class="baseText">{{ $t("user.essentialInformation") }}</span>
  9. </div>
  10. <div class="userMessage flex-row justify-between">
  11. <div class="userId">
  12. <p class="userText">{{ accountDetail.managerId }}</p>
  13. <p class="userText">{{ $t("user.systemId") }}</p>
  14. </div>
  15. <div class="userLine"></div>
  16. <div class="userId">
  17. <p class="userText">{{ accountDetail.username }}</p>
  18. <p class="userText">{{ $t("user.myAccount") }}</p>
  19. </div>
  20. <div class="userLine"></div>
  21. <div class="userId">
  22. <p class="userText">{{ accountDetail.name }}</p>
  23. <p class="userText">{{ $t("user.myName") }}</p>
  24. </div>
  25. </div>
  26. <div class="userInfoBox">
  27. <!-- 地区 -->
  28. <div v-if="!areaShow" class="userInfo l-flex-between">
  29. <span class="userInfoLeft">{{ $t("user.region") }}: </span>
  30. <div class="cust_vantBorder">
  31. <div class="filedInpPad">
  32. <van-field @click-input="fieldValueInpClk" readonly clearable v-model="fieldValue"
  33. :placeholder="$t('user.regionPlace')">
  34. <template #right-icon>
  35. <div class="l-flex-RC">
  36. <van-icon v-if="fieldValue" @click="
  37. fieldValue = '';
  38. accountDetail.areaId = '';
  39. " class="o-mr-6" name="clear" />
  40. <van-icon @click="fieldValueInpClk" name="arrow-down" />
  41. </div>
  42. </template>
  43. </van-field>
  44. </div>
  45. </div>
  46. <van-icon name="edit" class="editIcon" @click="editClk(4)" />
  47. </div>
  48. <div v-else class="userInfo l-flex-between">
  49. <span class="userInfoLeft">{{ $t("user.region") }}: </span>
  50. <span>{{ fieldValue }}</span>
  51. <van-icon name="edit" class="editIcon" @click="editClk(4)" />
  52. </div>
  53. <!-- 手机号 -->
  54. <div v-if="!phoneNumberShow" class="userInfo l-flex-between">
  55. <span class="userInfoLeft">{{ $t("user.phoneNumber") }}: </span>
  56. <div class="cust_vantBorder">
  57. <van-field class="relationClass" v-model="cofficentForm.phone" :placeholder="$t('user.phoneNumberPlace')">
  58. <template #button>
  59. <van-button type="primary" @click="mailboxChg(cofficentForm.phone, 3)">{{ $t("user.confirmLog") }}
  60. </van-button>
  61. </template>
  62. </van-field>
  63. </div>
  64. <van-icon name="edit" class="editIcon" @click="editClk(3)" />
  65. </div>
  66. <div v-else class="userInfo l-flex-between">
  67. <span class="userInfoLeft">{{ $t("user.phoneNumber") }}: </span>
  68. <span>{{ accountDetail.phone }}</span>
  69. <van-icon name="edit" class="editIcon" @click="editClk(3)" />
  70. </div>
  71. <!-- 邮箱 -->
  72. <div v-if="!mailboxShow" class="userInfo l-flex-between">
  73. <span class="userInfoLeft">{{ $t("user.mailbox") }}: </span>
  74. <div class="cust_vantBorder">
  75. <van-field class="relationClass" v-model="cofficentForm.mailBox" :placeholder="$t('user.mailboxPlace')">
  76. <template #button>
  77. <van-button type="primary" @click="mailboxChg(cofficentForm.mailBox, 2)">{{ $t("user.confirmLog") }}
  78. </van-button>
  79. </template>
  80. </van-field>
  81. </div>
  82. <van-icon name="edit" class="editIcon" @click="editClk(2)" />
  83. </div>
  84. <div v-else class="userInfo l-flex-between">
  85. <span class="userInfoLeft">{{ $t("user.mailbox") }}: </span>
  86. <span>{{ accountDetail.email }}</span>
  87. <van-icon name="edit" class="editIcon" @click="editClk(2)" />
  88. </div>
  89. <!-- 关联上级 -->
  90. <div v-if="!relationType" class="userInfo l-flex-between">
  91. <span class="userInfoLeft">{{ $t("user.associateParent") }}: </span>
  92. <div class="cust_vantBorder">
  93. <van-field class="relationClass" v-model="cofficentForm.associateParent"
  94. :placeholder="$t('user.associateParentPlace')">
  95. <template #button>
  96. <van-button type="primary" @click="mailboxChg(cofficentForm.associateParent, 1)">{{
  97. $t("user.confirmLog") }}
  98. </van-button>
  99. </template>
  100. </van-field>
  101. </div>
  102. <van-icon name="edit" class="editIcon" @click="editClk(1)" />
  103. </div>
  104. <div v-else class="userInfo l-flex-between">
  105. <span class="userInfoLeft">{{ $t("user.associateParent") }}: </span>
  106. <span>{{ relationAdminName }}</span>
  107. <van-icon name="edit" class="editIcon" @click="editClk(1)" />
  108. </div>
  109. <!-- 自定义货币符号 -->
  110. <div v-if="!symbolShow" class="userInfo l-flex-between">
  111. <span class="userInfoLeft">{{ $t("user.currencySymbol") }}: </span>
  112. <div class="cust_vantBorder">
  113. <van-field class="relationClass" v-model="cofficentForm.currencySymbol"
  114. :placeholder="$t('user.currencySymbolPlace')">
  115. <template #button>
  116. <van-button type="primary" @click="mailboxChg(cofficentForm.currencySymbol, 5)">{{
  117. $t("user.confirmLog") }}
  118. </van-button>
  119. </template>
  120. </van-field>
  121. </div>
  122. <van-icon name="edit" class="editIcon" @click="editClk(5)" />
  123. </div>
  124. <div v-else class="userInfo l-flex-between">
  125. <span class="userInfoLeft">{{ $t("user.currencySymbol") }}: </span>
  126. <span>{{ accountDetail.currencySymbol }}</span>
  127. <van-icon name="edit" class="editIcon" @click="editClk(5)" />
  128. </div>
  129. </div>
  130. </div>
  131. <div class="lineBox"></div>
  132. <div class="commonOperBox">
  133. <!-- 常用操作 -->
  134. <div class="baseRow flex-row justify-between">
  135. <div class="group2 flex-col"></div>
  136. <span class="baseText">{{ $t("user.commonOperations") }}</span>
  137. </div>
  138. <div class="operListBox">
  139. <!-- 任务消息 -->
  140. <div v-if="roleCheck()" class="taskListRow flex-col" @click="pushPageList('/taskMessage')">
  141. <div class="taskIcon taskMessageIcon"></div>
  142. <div class="taskRight">
  143. <div class="taskTitle">{{ $t("user.taskMessage") }}</div>
  144. </div>
  145. </div>
  146. <!-- 提现帐号 -->
  147. <div v-if="isInland" class="taskListRow flex-col" @click="pushPageList('/joinpayMch')">
  148. <div class="taskIcon joinPayMchIcon"></div>
  149. <div class="taskRight">
  150. <div class="taskTitle">{{ $t("user.withdrawalAccountNo") }}</div>
  151. </div>
  152. </div>
  153. <!-- Airwallex 钱包 -->
  154. <div v-if="isAbroad && user.companyType != '1'" class="taskListRow flex-col"
  155. @click="pushPageList('/airwallex')">
  156. <div class="taskIcon airwallexIcon"></div>
  157. <div class="taskRight">
  158. <div class="taskTitle">{{ $t("user.airwallex") }}</div>
  159. </div>
  160. </div>
  161. <!-- 备用提现账号 -->
  162. <div v-if="isInland" class="taskListRow flex-col" @click="pushPageList('/huifuMch')">
  163. <div class="taskIcon shandeMchIcon"></div>
  164. <div class="taskRight">
  165. <div class="taskTitle">
  166. {{ $t("user.standbyWithdrawalAccountNo") }}
  167. </div>
  168. </div>
  169. </div>
  170. <!-- <div class="taskListRow flex-col" @click="pushPageList('/shandeMch')">
  171. <div class="taskIcon shandeMchIcon"></div>
  172. <div class="taskRight">
  173. <div class="taskTitle">
  174. {{ $t("user.standbyWithdrawalAccountNo") }}
  175. </div>
  176. </div>
  177. </div>-->
  178. <!-- 绑定微信 -->
  179. <div v-if="isInWeChat" class="taskListRow flex-col" @click="pushPageList('/bindWechat')">
  180. <!-- <div class="taskListRow flex-col" @click="pushPageList('/bindWechat')">-->
  181. <div class="taskIcon bindWechatIcon"></div>
  182. <div class="taskRight">
  183. <div class="taskTitle">
  184. {{ $t("user.bindWechat") }}
  185. </div>
  186. </div>
  187. </div>
  188. <!-- 修改密码 -->
  189. <div class="taskListRow flex-col" @click="pushPageList('/changepassword')">
  190. <div class="taskIcon changePasswordIcon"></div>
  191. <div class="taskRight">
  192. <div class="taskTitle">{{ $t("user.changePassword") }}</div>
  193. </div>
  194. </div>
  195. <!-- 自动充值 -->
  196. <div v-if="isInland" class="taskListRow flex-col" @click="operUnipay()">
  197. <div class="taskIcon selfPayIcon"></div>
  198. <div class="taskRight">
  199. <div class="taskTitle">{{ $t("user.selfRecharging") }}</div>
  200. </div>
  201. </div>
  202. <div class="taskListRow flex-col" @click="onperExitSys()">
  203. <div class="taskIcon loginOutIcon"></div>
  204. <div class="taskRight">
  205. <div class="taskTitle">{{ $t("user.logOut") }}</div>
  206. </div>
  207. </div>
  208. </div>
  209. </div>
  210. </div>
  211. <nav-bar></nav-bar>
  212. <!-- 退出登录弹窗 -->
  213. <kDialog :dialogTitle="$t('user.logOutTips')" :cancelBtnTxt="$t('user.cancelLog')"
  214. :confirmBtnTxt="$t('user.confirmLog')" ref="kDialogRef" :dialogContent="$t('user.logOutContent')"
  215. @confirmclk="confirmClk">
  216. </kDialog>
  217. <!-- 地区弹窗 -->
  218. <kCascader @getareaname="getAreaName" :selectId="accountDetail.areaId" @areapopfinish="areaPopFinish"
  219. ref="kCascaderRef"></kCascader>
  220. </div>
  221. </template>
  222. <script>
  223. // 导入地区弹窗
  224. import kCascader from "@/components/commom/kCascader/index.vue";
  225. // 导入接口
  226. import { getAdmin } from "@/service/merchantManage";
  227. import { updateAdmin } from "@/service/merchantManage";
  228. // 引入弹窗
  229. import kDialog from "@/components/commom/kDialog/index.vue";
  230. import { onMounted, reactive, ref } from "vue";
  231. import sHeader from "@/components/SimpleHeader";
  232. import navBar from "@/components/NavBar";
  233. import {
  234. getLoginUser,
  235. $M_EmailAvailable,
  236. $M_PhoneTest,
  237. } from "@/common/js/utils";
  238. import { useRouter } from "vue-router";
  239. import { tAdminGetRelation, tAdminSetRelationAdmin } from "@/service/user";
  240. import { Toast } from "vant";
  241. import { useI18n } from "vue-i18n";
  242. import { styleUrl } from "../common/js/utils";
  243. export default {
  244. components: { sHeader, navBar, kDialog, kCascader },
  245. setup() {
  246. // 引入语言
  247. const { t } = useI18n();
  248. // 账户信息
  249. const accountDetail = ref({});
  250. // 控制地区显示隐藏
  251. const areaShow = ref(true);
  252. // 控制手机显示隐藏
  253. const phoneNumberShow = ref(true);
  254. // 控制邮箱显示隐藏
  255. const mailboxShow = ref(true);
  256. // 控制货币显示隐藏 货币符号,默认“¥”
  257. const symbolShow = ref(true);
  258. const user = getLoginUser();
  259. const router = useRouter();
  260. const relationAdminName = ref("");
  261. const relationType = ref(true);
  262. const sys = ref(null);
  263. // 修改的个人信息
  264. const cofficentForm = reactive({
  265. associateParent: relationAdminName.value,
  266. mailBox: accountDetail.value.email,
  267. phone: accountDetail.value.phone,
  268. area: "",
  269. currencySymbol: accountDetail.value.currencySymbol,
  270. });
  271. // 点击修改图标
  272. const editClk = (idx) => {
  273. switch (idx) {
  274. case 1:
  275. cofficentForm.associateParent = relationAdminName.value;
  276. relationType.value = !relationType.value;
  277. mailboxShow.value = true;
  278. phoneNumberShow.value = true;
  279. areaShow.value = true;
  280. symbolShow.value = true;
  281. break;
  282. case 2:
  283. cofficentForm.mailBox = accountDetail.value.email;
  284. relationType.value = true;
  285. mailboxShow.value = !mailboxShow.value;
  286. phoneNumberShow.value = true;
  287. areaShow.value = true;
  288. symbolShow.value = true;
  289. break;
  290. case 3:
  291. cofficentForm.phone = accountDetail.value.phone;
  292. relationType.value = true;
  293. mailboxShow.value = true;
  294. phoneNumberShow.value = !phoneNumberShow.value;
  295. areaShow.value = true;
  296. symbolShow.value = true;
  297. break;
  298. case 4:
  299. cofficentForm.area = accountDetail.value.area;
  300. relationType.value = true;
  301. mailboxShow.value = true;
  302. phoneNumberShow.value = true;
  303. areaShow.value = !areaShow.value;
  304. symbolShow.value = true;
  305. break;
  306. case 5:
  307. cofficentForm.currencySymbol = accountDetail.value.currencySymbol;
  308. relationType.value = true;
  309. mailboxShow.value = true;
  310. phoneNumberShow.value = true;
  311. areaShow.value = true;
  312. symbolShow.value = !symbolShow.value;
  313. break;
  314. }
  315. };
  316. // 点击邮箱的确定按钮
  317. const mailboxChg = async (e, idx) => {
  318. switch (idx) {
  319. case 1:
  320. if (!e) {
  321. Toast(t("user.associateParentPlace"));
  322. } else {
  323. const { data } = await tAdminSetRelationAdmin({
  324. adminId: user.id,
  325. username: e,
  326. });
  327. relationType.value = true;
  328. if (data.code === "00000") {
  329. Toast(data.message);
  330. setTimeout(() => {
  331. gettAdminGetRelation();
  332. }, 500);
  333. }
  334. }
  335. break;
  336. case 2:
  337. if (!e) {
  338. Toast(t("user.mailboxPlace"));
  339. } else if (!$M_EmailAvailable(e)) {
  340. Toast(t("user.corrEmailPlace"));
  341. } else {
  342. const params = {
  343. id: user.id,
  344. email: e,
  345. };
  346. const { data } = await updateAdmin(params);
  347. mailboxShow.value = true;
  348. if (data.code === "00000") {
  349. Toast(data.message);
  350. setTimeout(() => {
  351. getAcccountDetail();
  352. }, 500);
  353. }
  354. }
  355. break;
  356. case 3:
  357. if (!e) {
  358. Toast(t("user.phoneNumberPlace"));
  359. } else if (!$M_PhoneTest(e)) {
  360. Toast(t("user.corrPhonePlace"));
  361. } else {
  362. const params = {
  363. id: user.id,
  364. phone: e,
  365. };
  366. const { data } = await updateAdmin(params);
  367. phoneNumberShow.value = true;
  368. if (data.code === "00000") {
  369. Toast(data.message);
  370. setTimeout(() => {
  371. getAcccountDetail();
  372. }, 500);
  373. }
  374. }
  375. break;
  376. case 5:
  377. if (!e) {
  378. Toast(t("user.currencySymbolPlace"));
  379. } else {
  380. const params = {
  381. id: user.id,
  382. currencySymbol: e,
  383. };
  384. const { data } = await updateAdmin(params);
  385. symbolShow.value = true;
  386. if (data.code === "00000") {
  387. Toast(data.message);
  388. // 更新本地存储缓存中的currencySymbol的值
  389. user.currencySymbol = e; // 将新的currencySymbol的值赋值给user
  390. localStorage.setItem("loginUser", JSON.stringify(user));
  391. setTimeout(() => {
  392. getAcccountDetail();
  393. }, 500);
  394. }
  395. }
  396. break;
  397. }
  398. };
  399. // 获取账户详情
  400. const getAcccountDetail = () => {
  401. getAdmin({ id: user.id }).then((res) => {
  402. accountDetail.value = res.data.data;
  403. // 查询地址回显
  404. kCascaderRef.value.init(accountDetail.value.areaId);
  405. });
  406. };
  407. // 退出登录弹窗
  408. const kDialogRef = ref(null);
  409. // 点击右侧按钮
  410. const confirmClk = () => {
  411. // 获取缓存的语言
  412. const curLang = localStorage.getItem("curLang");
  413. // 清空缓存
  414. localStorage.clear();
  415. localStorage.setItem("curLang", curLang);
  416. if (sys.value) {
  417. setTimeout(() => {
  418. router.push({
  419. path: "login",
  420. query: { relation_admin_id: sys.value.relationAdminId },
  421. });
  422. }, 200);
  423. } else {
  424. setTimeout(() => {
  425. router.push({ path: "login" });
  426. }, 200);
  427. }
  428. };
  429. // 初始化页面获取列表
  430. onMounted(async () => {
  431. // 加载样式
  432. styleUrl('user');
  433. if (localStorage.getItem("loginSys")) {
  434. const loginSysString = localStorage.getItem("loginSys");
  435. sys.value = JSON.parse(loginSysString);
  436. }
  437. // 获取关联上级
  438. gettAdminGetRelation();
  439. // 获取账户
  440. getAcccountDetail();
  441. });
  442. const gettAdminGetRelation = async () => {
  443. const { data } = await tAdminGetRelation({
  444. relationAdminId: user.relationAdminId,
  445. });
  446. if (typeof data === "string") {
  447. relationAdminName.value = data;
  448. }
  449. };
  450. const operUnipay = () => {
  451. router.push({ path: "uniPay" });
  452. };
  453. const onperExitSys = () => {
  454. kDialogRef.value.openDialog();
  455. };
  456. const pushPageList = (url) => {
  457. router.push({ path: url });
  458. };
  459. const roleCheck = () => {
  460. if (user.isAdmined) {
  461. return true;
  462. } else {
  463. const menuList = user.menuCodeList.filter((item) => item === "M6");
  464. return menuList.length > 0;
  465. }
  466. };
  467. // 地区弹窗
  468. const fieldValue = ref("");
  469. const kCascaderRef = ref(null);
  470. // 点击地区输入框
  471. const fieldValueInpClk = () => {
  472. kCascaderRef.value.openPop();
  473. };
  474. // 选择地区完成
  475. const areaPopFinish = async (e) => {
  476. console.log("e", e);
  477. fieldValue.value = e.selectName;
  478. accountDetail.value.areaId = e.selectId;
  479. const params = {
  480. id: user.id,
  481. areaId: e.selectId,
  482. };
  483. const { data } = await updateAdmin(params);
  484. areaShow.value = true;
  485. if (data.code === "00000") {
  486. Toast(data.message);
  487. setTimeout(() => {
  488. getAcccountDetail();
  489. }, 500);
  490. }
  491. };
  492. const isInWeChat = ref(false);
  493. const checkInWechat = () => {
  494. const ua = window.navigator.userAgent.toLowerCase();
  495. // 如果是在微信中打开
  496. if (/MicroMessenger/i.test(ua)) {
  497. isInWeChat.value = true;
  498. }
  499. };
  500. // 是否内陆或海外
  501. const isInland = ref(true);
  502. const isAbroad = ref(false);
  503. // const checkIsAbroad = async () => {
  504. // try {
  505. // const { data } = await getIfForeign(user.id);
  506. // console.log("isAbroad >>> ", data);
  507. // if (data.data === '1') {
  508. // // TODO: 这里先把isAbroad设置为fasle,等开发完成再改成true;
  509. // isAbroad.value = false;
  510. // isInland.value = false;
  511. // }
  512. // } catch (error) {
  513. // console.error(error);
  514. // }
  515. // };
  516. const checkIsAbroad = async () => {
  517. try {
  518. const userInfo = localStorage.getItem("loginUser");
  519. const userIfForeign = JSON.parse(userInfo);
  520. // console.log("用户的海内外信息" + userIfForeign.ifForeign);
  521. // console.log("看下user是什么***" + user.menuCodeList);
  522. if (userIfForeign.ifForeign === '1') {
  523. isAbroad.value = true;
  524. isInland.value = false;
  525. }
  526. } catch (error) {
  527. console.error(error);
  528. }
  529. };
  530. onMounted(() => {
  531. checkInWechat();
  532. checkIsAbroad();
  533. })
  534. // 获取回显的值
  535. const getAreaName = (e) => {
  536. fieldValue.value = e;
  537. };
  538. return {
  539. user,
  540. operUnipay,
  541. onperExitSys,
  542. relationAdminName,
  543. relationType,
  544. pushPageList,
  545. roleCheck,
  546. sys,
  547. kDialogRef,
  548. confirmClk,
  549. mailboxShow,
  550. mailboxChg,
  551. phoneNumberShow,
  552. editClk,
  553. cofficentForm,
  554. areaShow,
  555. accountDetail,
  556. fieldValue,
  557. kCascaderRef,
  558. fieldValueInpClk,
  559. areaPopFinish,
  560. isInWeChat,
  561. getAreaName,
  562. isAbroad,
  563. checkIsAbroad,
  564. isInland,
  565. symbolShow
  566. };
  567. }
  568. };
  569. </script>
  570. <style lang="less" scoped>
  571. @import "../common/style/mixin.less";
  572. </style>