UserList.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. <script setup>
  2. import { Search, Plus } from '@element-plus/icons-vue'
  3. import { apiCustomerUser } from '@/api/customer'
  4. import { useRouter } from 'vue-router'
  5. import { ElMessage, ElMessageBox,dayjs } from 'element-plus'
  6. import EnableUser from './components/EnableUser.vue'
  7. const router = useRouter()
  8. const filterState = reactive({
  9. keyword: '',
  10. seller: '',
  11. status: '',
  12. register: '',
  13. subscribe: '',
  14. regsiterTime: [],
  15. createTime: [],
  16. sortType:'',
  17. sortVal:''
  18. })
  19. const tableColOpt = [
  20. {
  21. label: '姓名',
  22. key: 'RealName'
  23. },
  24. {
  25. label: '手机号',
  26. key: 'Phone'
  27. },
  28. {
  29. label: '邮箱',
  30. key: 'Email'
  31. },
  32. {
  33. label: '营业部/销售',
  34. key: 'SellerName'
  35. },
  36. {
  37. label: '用户状态',
  38. key: 'Status',
  39. width: '100px'
  40. },
  41. {
  42. label: '有效期',
  43. key: 'ValidStartTime',
  44. width: '200px'
  45. },
  46. {
  47. label: '到期时长',
  48. key: 'RestDate',
  49. sort: true,
  50. width: '120px'
  51. },
  52. {
  53. label: '是否注册',
  54. key: 'IsRegistered',
  55. width: '100px'
  56. },
  57. {
  58. label: '注册时间',
  59. key: 'RegisterTime',
  60. sort: true,
  61. headerTips: '用户首次登录小程序的时间'
  62. },
  63. {
  64. label: '创建时间',
  65. key: 'CreateTime',
  66. sort: true,
  67. headerTips: '系统中新增该用户的时间'
  68. },
  69. {
  70. label: '是否关注公众号',
  71. key: 'IsSubscribed'
  72. },
  73. ]
  74. const userList = ref([])
  75. const page = ref(1)
  76. const pageSize = ref(10)
  77. const tableLoading = ref(false)
  78. const totals = ref(0)
  79. async function getUserList() {
  80. tableLoading.value = true
  81. const res = await apiCustomerUser.userList({
  82. PageSize: pageSize.value,
  83. CurrentIndex: page.value,
  84. SellerId: filterState.seller ? filterState.seller.join(',') : '',
  85. Status: filterState.status,
  86. KeyWord: filterState.keyword,
  87. IsRegistered: filterState.register,
  88. IsSubscribed: filterState.subscribe,
  89. RegisterStartDate: filterState.regsiterTime ? filterState.regsiterTime[0] : '',
  90. RegisterEndDate: filterState.regsiterTime ? filterState.regsiterTime[1] : '',
  91. CreateStartDate: filterState.createTime ? filterState.createTime[0] : '',
  92. CreateEndDate: filterState.createTime ? filterState.createTime[1] : '',
  93. SortParam:filterState.sortType,
  94. SortType:filterState.sortVal
  95. })
  96. tableLoading.value = false
  97. if (res.Ret === 200) {
  98. userList.value = res.Data.List || []
  99. totals.value = res.Data.Paging.Totals
  100. }
  101. }
  102. getUserList()
  103. function handlePageChange(e) {
  104. page.value = e
  105. getUserList()
  106. }
  107. function handleTableSort(e) {
  108. // console.log(e);
  109. const { order, prop } = e//order:"descending",prop: "RegisterTime"
  110. filterState.sortType=prop
  111. if(!order){
  112. filterState.sortVal=''
  113. }else{
  114. filterState.sortVal=order==='descending'?'desc':'asc'
  115. }
  116. handleFilterList()
  117. }
  118. function handleFilterList() {
  119. page.value = 1
  120. getUserList()
  121. }
  122. function handleEditUser(e) {
  123. const link=router.resolve({
  124. path: '/customer/userEdit',
  125. query: {
  126. id: e.UserId
  127. }
  128. }).href
  129. window.open(link,'__blank')
  130. }
  131. // 禁用用户
  132. async function handleDisabledUser(row) {
  133. const res = await apiCustomerUser.setUserStatus({
  134. UserId: row.UserId,
  135. IsEnabled: false
  136. })
  137. if (res.Ret !== 200) return
  138. ElMessage.success('禁用成功')
  139. getUserList()
  140. }
  141. // 启用用户
  142. const showEnableUserPop = ref(false)
  143. const enableUserId = ref(0)
  144. function handleEnableUser(row) {
  145. enableUserId.value = row.UserId
  146. showEnableUserPop.value = true
  147. }
  148. // 删除用户
  149. function handleDelUser(row) {
  150. ElMessageBox.confirm(
  151. '该操作会删除该用户所有相关信息,不可恢复,确认删除吗?',
  152. '提示'
  153. ).then(() => {
  154. apiCustomerUser.userDelete({
  155. UserId: row.UserId
  156. }).then(res => {
  157. if (res.Ret === 200) {
  158. ElMessage.success('删除成功')
  159. getUserList()
  160. }
  161. })
  162. }).catch(() => { })
  163. }
  164. // 跳转详情
  165. function handleGoDetail(e){
  166. const link=router.resolve({
  167. path:'/customer/userDetail',
  168. query:{
  169. id:e.UserId
  170. }
  171. }).href
  172. window.open(link,'__blank')
  173. }
  174. </script>
  175. <template>
  176. <div class="customer-user-list-page">
  177. <div>
  178. <el-button
  179. type="primary"
  180. :icon="Plus"
  181. @click="$router.push('/customer/userAdd')"
  182. v-permission="'user:add'"
  183. >新增</el-button
  184. >
  185. <el-input
  186. placeholder="姓名/手机号/邮箱"
  187. v-model="filterState.keyword"
  188. :prefix-icon="Search"
  189. clearable
  190. style="max-width: 359px;float: right"
  191. @input="handleFilterList"
  192. />
  193. </div>
  194. <div class="flex filter-wrap">
  195. <all-user-for-depart
  196. style="width: 165px"
  197. v-model="filterState.seller"
  198. :props="{
  199. emitPath: false,
  200. multiple: true,
  201. }"
  202. clearable
  203. filterable
  204. @change="handleFilterList"
  205. />
  206. <el-select
  207. placeholder="用户状态"
  208. v-model="filterState.status"
  209. style="width: 165px"
  210. @change="handleFilterList"
  211. clearable
  212. >
  213. <el-option label="启用" value="正式"></el-option>
  214. <el-option label="禁用" value="禁用"></el-option>
  215. </el-select>
  216. <el-select
  217. placeholder="注册状态"
  218. v-model="filterState.register"
  219. style="width: 165px"
  220. clearable
  221. @change="handleFilterList"
  222. >
  223. <el-option label="是" value="是"></el-option>
  224. <el-option label="否" value="否"></el-option>
  225. </el-select>
  226. <el-select
  227. placeholder="是否关注公众号"
  228. v-model="filterState.subscribe"
  229. style="width: 165px"
  230. clearable
  231. @change="handleFilterList"
  232. >
  233. <el-option label="是" value="是"></el-option>
  234. <el-option label="否" value="否"></el-option>
  235. </el-select>
  236. <div style="width: 235px">
  237. <el-date-picker
  238. style="width: 235px"
  239. v-model="filterState.regsiterTime"
  240. type="daterange"
  241. range-separator="至"
  242. start-placeholder="注册时间"
  243. end-placeholder="注册时间"
  244. clearable
  245. value-format="YYYY-MM-DD"
  246. @change="handleFilterList"
  247. />
  248. </div>
  249. <div style="width: 235px">
  250. <el-date-picker
  251. style="width: 235px"
  252. v-model="filterState.createTime"
  253. type="daterange"
  254. range-separator="至"
  255. start-placeholder="创建时间"
  256. end-placeholder="创建时间"
  257. value-format="YYYY-MM-DD"
  258. clearable
  259. @change="handleFilterList"
  260. />
  261. </div>
  262. </div>
  263. <div class="userlist-wrap" style="margin-top: 20px">
  264. <el-table
  265. :data="userList"
  266. border
  267. stripe
  268. highlight-current-row
  269. element-loading-text="数据加载中..."
  270. v-loading="tableLoading"
  271. @sort-change="handleTableSort"
  272. @row-click="handleGoDetail"
  273. >
  274. <el-table-column
  275. v-for="column in tableColOpt"
  276. :key="column.key"
  277. :prop="column.key"
  278. :label="column.label"
  279. :sortable="column.sort ? 'custom' : false"
  280. :width="column.width"
  281. >
  282. <template v-if="column.headerTips" #header>
  283. <span>{{ column.label }}</span>
  284. <el-tooltip
  285. class="box-item"
  286. effect="dark"
  287. :content="column.headerTips"
  288. placement="top"
  289. >
  290. <el-icon style="position: relative; top: 2px"
  291. ><i-ep-QuestionFilled
  292. /></el-icon>
  293. </el-tooltip>
  294. </template>
  295. <template #default="{ row }">
  296. <span
  297. v-if="column.key === 'Status'"
  298. :style="{ color: !row.Status ? '#f00' : '' }"
  299. >{{ row.Status ? "启用" : "禁用" }}</span
  300. >
  301. <span v-else-if="column.key === 'IsRegistered'">{{
  302. row.IsRegistered ? "是" : "否"
  303. }}</span>
  304. <span v-else-if="column.key === 'IsSubscribed'">{{
  305. row.IsSubscribed ? "是" : "否"
  306. }}</span>
  307. <span v-else-if="column.key === 'ValidStartTime'"
  308. >{{ formatTime(row.ValidStartTime, "YYYY-MM-DD") }}~{{
  309. formatTime(row.ValidEndTime, "YYYY-MM-DD")
  310. }}</span
  311. >
  312. <span v-else-if="column.key === 'RegisterTime'">{{
  313. formatTime(row.RegisterTime)
  314. }}</span>
  315. <span v-else-if="column.key === 'CreateTime'">{{
  316. formatTime(row.CreateTime)
  317. }}</span>
  318. <span v-else>{{ row[column.key] }}</span>
  319. </template>
  320. </el-table-column>
  321. <el-table-column label="操作" width="160">
  322. <template #default="{ row }">
  323. <el-button
  324. v-permission="'user:edit'"
  325. type="primary"
  326. link
  327. @click.stop="handleEditUser(row)"
  328. >编辑</el-button
  329. >
  330. <el-button
  331. v-permission="'user:editEnabled'"
  332. type="danger"
  333. link
  334. v-if="row.Status"
  335. @click.stop="handleDisabledUser(row)"
  336. >禁用</el-button
  337. >
  338. <el-button
  339. v-permission="'user:editEnabled'"
  340. type="primary"
  341. link
  342. v-else
  343. @click.stop="handleEnableUser(row)"
  344. >启用</el-button
  345. >
  346. <el-button
  347. v-permission="'user:delete'"
  348. type="danger"
  349. link
  350. @click.stop="handleDelUser(row)"
  351. >删除</el-button
  352. >
  353. </template>
  354. </el-table-column>
  355. </el-table>
  356. <el-pagination
  357. background
  358. layout="total,prev,pager,next,jumper"
  359. :current-page="page"
  360. :page-size="pageSize"
  361. :total="totals"
  362. @current-change="handlePageChange"
  363. style="margin-top: 30px; justify-content: flex-end"
  364. />
  365. </div>
  366. </div>
  367. <!-- 开启用户 -->
  368. <EnableUser
  369. v-model:show="showEnableUserPop"
  370. :userId="enableUserId"
  371. @success="getUserList()"
  372. />
  373. </template>
  374. <style lang="scss" scoped>
  375. .customer-user-list-page {
  376. width: 100%;
  377. overflow: hidden;
  378. .filter-wrap {
  379. margin-top: 10px;
  380. flex-wrap: wrap;
  381. gap: 10px;
  382. }
  383. }
  384. </style>