index.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <template>
  2. <!-- 商户管理 -->
  3. <div class="merchantPage flex-col">
  4. <s-header :name="$t('merchantManage.merchantManagement')" :noback="false"></s-header>
  5. <div class="merchantBox flex-col">
  6. <van-list v-model:loading="loading" v-model:error="error" :error-text="$t('public.requestFailed')"
  7. :finished="finished" :finished-text="$t('public.noMore')" offset="300" :immediate-check="false" @load="onLoad">
  8. <div class="searchRow flex-row justify-between">
  9. <div class="flex-col">
  10. <div class="flex-row justify-between bd3">
  11. <span class="info2">{{ $t('merchantManage.total') }}</span>
  12. <span class="info3">{{ adminTotal }}</span>
  13. <span class="info4">{{ $t('merchantManage.recordsInTotal') }}</span>
  14. </div>
  15. </div>
  16. <div class="flex-col">
  17. <div class="main5 flex-row justify-between" @click="searchClick">
  18. <img class="label2" src="../../assets/device/searchIcon.png" />
  19. <!-- <div class="TextGroup2 flex-col">
  20. <span class="txt3">{{ $t('merchantManage.search') }}</span>
  21. </div> -->
  22. </div>
  23. </div>
  24. </div>
  25. <div class="main4 flex-col">
  26. <van-tabs v-model:active="active" @click-tab="clickLabel" class="tabs2 o-pb-15" v-if="user.type < 2">
  27. <van-tab title="商户" name="2">
  28. </van-tab>
  29. <van-tab title="子账号" name="3">
  30. </van-tab>
  31. </van-tabs>
  32. <div class="bd1 flex-col" v-for="(item, index) in adminList" :key="index">
  33. <div class="outer2 flex-col">
  34. <div class="box2 flex-row justify-between">
  35. <span class="word3" v-html="item.username + '&nbsp;' + item.name"></span>
  36. <!-- <div class="group6 flex-col"></div> -->
  37. </div>
  38. <span class="word4"
  39. v-html="`${$t('merchantManage.telephone')}:` + (item.phone == null ? '' : item.phone)"></span>
  40. <span class="word5"
  41. v-html="`${$t('merchantManage.mailbox')}:` + (item.email == null ? '' : item.email)"></span>
  42. <span class="word6"
  43. v-html="`${$t('merchantManage.loginTime')}:` + (item.loginDate == null ? '' : Format_time(item.loginDate))"></span>
  44. <span class="info6"
  45. v-html="`${$t('merchantManage.loginIPAddress')}:` + (item.loginIp == null ? '' : item.loginIp)"></span>
  46. <span class="txt2"
  47. v-html="`${$t('merchantManage.managementSystemId')}:` + (item.managerId == null ? '' : item.managerId)"></span>
  48. <div class="box3 flex-col">
  49. <span class="txt3"
  50. v-html="`${$t('merchantManage.creationTime')}:` + Format_time(item.createDate)"></span>
  51. </div>
  52. <div class="button-container">
  53. <van-button v-if="user.type < 2" class="btn1" round type="success"
  54. @click="autoLogin(item.id)">切换登陆</van-button>
  55. <van-button v-if="active == 2" class="btn1" round type="primary" @click="merchantSet(item)">详细信息</van-button>
  56. </div>
  57. </div>
  58. </div>
  59. <van-back-top @click="backTop" right="3vw" bottom="5vh" />
  60. </div>
  61. </van-list>
  62. </div>
  63. <merchantSearch ref="searchRef" @search="search($event)"></merchantSearch>
  64. </div>
  65. </template>
  66. <script>
  67. import { onMounted, reactive, ref, onActivated } from "vue";
  68. import sHeader from "../../components/SimpleHeader";
  69. import { getAdminList, autoLoginMerchant } from '../../service/merchantManage';
  70. import { getLoginUser, Format_time, styleUrl, setLocal } from "../../common/js/utils";
  71. import { showFailToast, showSuccessToast, showConfirmDialog } from 'vant';
  72. import merchantSearch from './merchantSearch.vue';
  73. import { useRouter, onBeforeRouteLeave } from "vue-router";
  74. import { useI18n } from "vue-i18n";
  75. export default {
  76. components: { sHeader, merchantSearch },
  77. setup() {
  78. const { t } = useI18n();
  79. const user = getLoginUser();
  80. const router = useRouter();
  81. const searchRef = ref(null);
  82. const adminList = ref([]);
  83. const adminTotal = ref(0); // 列表总数
  84. const loading = ref(false); // 加载状态
  85. const error = ref(false); // 错误状态
  86. const finished = ref(false); // 结束翻页状态
  87. const verticalScrollPosition = ref(0);
  88. // 点击标签
  89. const active = ref("");
  90. // 返回顶部
  91. const backTop = () => {
  92. window.scrollY = 0;
  93. }
  94. onActivated(() => {
  95. // 当组件被激活时,可能是从 keep-alive 缓存中激活的
  96. // 这时重新添加滚动事件监听器
  97. // console.log("进入时的位置", verticalScrollPosition.value);
  98. document.documentElement.scrollTop = verticalScrollPosition.value;
  99. document.body.scrollTop = verticalScrollPosition.value;
  100. window.scrollY = verticalScrollPosition.value;
  101. // window.addEventListener('scroll', handleScroll);
  102. });
  103. onBeforeRouteLeave(() => {
  104. verticalScrollPosition.value = document.documentElement.scrollTop || document.body.scrollTop || window.scrollY;
  105. // console.log("离开时的位置", verticalScrollPosition.value);
  106. })
  107. let searchParams = reactive({
  108. id: user.id,
  109. current: 1, // 页数
  110. size: 20, // 页大小
  111. type: "2",
  112. });
  113. onMounted(async () => {
  114. // 加载样式
  115. styleUrl('merchantManage');
  116. searchGetList();
  117. });
  118. // 查询列表
  119. const searchGetList = () => {
  120. adminList.value = [];
  121. searchParams.current = 1;
  122. getList();
  123. }
  124. const clickLabel = (item) => {
  125. adminList.value = [];
  126. searchParams.current = 1;
  127. searchParams.type = item.name;
  128. getList();
  129. }
  130. // 滚动加载
  131. const onLoad = () => { if (!finished.value) { searchParams.current = searchParams.current + 1; getList(); } };
  132. // 获取设备列表数据
  133. const getList = async () => {
  134. const { data } = await getAdminList(Object.assign({}, searchParams));
  135. if (data.code === "00000") {
  136. // 列表值叠加
  137. adminList.value = adminList.value.concat(data.data.records);
  138. adminTotal.value = data.data.total;
  139. if (adminList.value.length === data.data.total) { finished.value = true; }
  140. loading.value = false;
  141. } else { showFailToast(data.message); }
  142. };
  143. // 搜索点击
  144. const searchClick = () => { searchRef.value.showSearch(); };
  145. // 搜索弹窗触发搜索
  146. const search = (data) => {
  147. searchParams = Object.assign(searchParams, data);
  148. searchGetList();
  149. };
  150. // 跳转设备编辑
  151. const merchantSet = (e) => { router.push({ path: 'merchantSet', query: { merchantId: e.id } }) }
  152. // 切换登陆
  153. const autoLogin = (id) => {
  154. showConfirmDialog({
  155. title: t('merchantManage.tips'),
  156. message: t('merchantManage.autoLogin'),
  157. }).then(() => {
  158. autoLoginMerchant({ id }).then(res => {
  159. if (res.data.code === "00000") {
  160. // 获取缓存的语言
  161. const curLang = localStorage.getItem("curLang");
  162. const savedCredentials = localStorage.getItem('savedCredentials');
  163. const appVersion = localStorage.getItem("appVersion");
  164. // 清空缓存
  165. localStorage.clear();
  166. localStorage.setItem("curLang", curLang);
  167. localStorage.setItem("appVersion", appVersion);
  168. if (savedCredentials) {
  169. localStorage.setItem('savedCredentials', savedCredentials);
  170. }
  171. setLocal("loginUser", JSON.stringify(res.data.data));
  172. showSuccessToast(t('login.loginSucess'));
  173. localStorage.setItem('firstLogin', true);
  174. // 需要刷新页面,否则 axios.js 文件里的 token 不会被重置
  175. window.location.href = '/shenze/';
  176. setTimeout(() => {
  177. router.push("/home");
  178. }, 200);
  179. } else {
  180. showFailToast(res.data.message);
  181. }
  182. });
  183. }).catch((error) => {
  184. console.error(error);
  185. })
  186. }
  187. return {
  188. adminList,
  189. adminTotal,
  190. loading,
  191. error,
  192. finished,
  193. onLoad,
  194. searchClick,
  195. searchRef,
  196. search,
  197. merchantSet,
  198. autoLogin,
  199. Format_time,
  200. user,
  201. backTop,
  202. active,
  203. clickLabel,
  204. };
  205. },
  206. };
  207. </script>
  208. <style lang="less" scoped>
  209. @import "../../common/style/common.less";
  210. </style>