index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <template>
  2. <div class="end_item">
  3. <div class="page_search">
  4. <div class="search_content">
  5. <div class="content_left">
  6. <TabSearch tabType="box" :tabList="tabList"
  7. :defaultTabKey="searchParams.defaultUserType"
  8. @tabChange="HandleUserTypeChange"/>
  9. <FormSearchGroup :searchList="formSearhList"
  10. @searchChange="HandleBlurSearch" />
  11. </div>
  12. <div class="content_right">
  13. <el-button class="button_border" @click="OpenUserFormDialog()">新增用户</el-button>
  14. </div>
  15. </div>
  16. </div>
  17. <div class="page_jg_20" />
  18. <Table :tableColumns="tableColumns" :tableData="userTableData"
  19. :currentPage = "currentPage" :pageSize = "pageSize" :totalNum = "totalNum">
  20. <template #num="{row,currentIndex}">
  21. {{ (currentPage - 1 ) * pageSize + currentIndex }}
  22. </template>
  23. <template #gender="{row}">
  24. {{ genderNumToName(row.gender) }}
  25. </template>
  26. <template #status="{row}">
  27. <TableRowStatus :statusMsg="accountStatusMsg" :useStatus="row.status" />
  28. </template>
  29. <!-- 公海跟进 -->
  30. <template #publicFollowStatus="{row}">
  31. <el-switch
  32. :model-value="Boolean(row.publicFollowStatus)"
  33. @change="(val)=>HandleCardSwitchOnOff({id:row.id,onOffVal:val,type:'public'})"
  34. style="--el-switch-on-color: #2e64fa; --el-switch-off-color: #bbbbbb"
  35. />
  36. </template>
  37. <!-- 历史跟进 -->
  38. <template #historyFollowStatus="{row}">
  39. <el-switch
  40. :model-value="Boolean(row.historyFollowStatus)"
  41. @change="(val)=>HandleCardSwitchOnOff({id:row.id,onOffVal:val,type:'history'})"
  42. style="--el-switch-on-color: #2e64fa; --el-switch-off-color: #bbbbbb"
  43. />
  44. </template>
  45. <template #operation="{row}">
  46. <div class="table_row_option">
  47. <span class="option_button_editor" @click="OpenUserFormDialog(row)">编辑</span>
  48. <span class="option_button_editor" @click="OpenresetPasswordFormDialog(row)">重置密码</span>
  49. <span class="option_button_editor" @click="OpenForbiddenDialog(row,'forbidden')">{{row.status === 1 ? '禁用' : '启用' }}</span>
  50. <span class="el_button_delete" @click="OpenForbiddenDialog(row,'delete')">删除</span>
  51. </div>
  52. </template>
  53. </Table>
  54. </div>
  55. <!-- 新增/修改用户 弹窗 -->
  56. <FormDialog
  57. class="user_form_dialog"
  58. width="482px"
  59. v-if="userFormDialogVisible"
  60. :formItemList="userFormItemList"
  61. :defaultFormData="defaultUserFormData"
  62. :title="userFormDialogTitle"
  63. :submitLoading="userFormDialogSubmiting"
  64. :visible="userFormDialogVisible"
  65. @close="CloseUserFormDialog"
  66. @confirm="HandleUserFormDialogConfirm">
  67. </FormDialog>
  68. <!-- 重置密码弹窗 -->
  69. <FormDialog
  70. class="reset_password_form_dialog"
  71. width="500px"
  72. v-if="resetPasswordFormDialogVisible"
  73. :formItemList="resetPasswordFormItemList" :defaultFormData="defaultResetPasswordFormData"
  74. title="重置密码"
  75. :submitLoading="resetPasswordFormDialogSubmiting"
  76. :visible="resetPasswordFormDialogVisible"
  77. @close="CloseResetPasswordFormDialog"
  78. @confirm="HandleresetPasswordFormDialogConfirm">
  79. </FormDialog>
  80. <!-- 禁用/删除 弹窗 -->
  81. <Dialog
  82. :visible="forbiddenDialogVisible"
  83. :submitLoading="forbiddenDialogLoading"
  84. @close="HandleForbiddenDialogClose"
  85. @confirm="HandleForbiddenDialogConfirm">
  86. 请确认是否{{currentOperationType == 'delete' ? '删除' : '禁用'}} 【{{currentEditRow?.username}}】 {{ currentEditRow?.account }}
  87. </Dialog>
  88. </template>
  89. <script setup lang="ts">
  90. import { onMounted, ref } from 'vue';
  91. import FormSearchGroup from '@/baseComponents/FormSearchGroup.vue';
  92. import {formSearhList} from './formSearch'
  93. import Table from '@/baseComponents/Table.vue';
  94. import {tableColumns} from './table'
  95. import TableRowStatus from '@/baseComponents/TableRowStatus.vue';
  96. import TabSearch from '@/baseComponents/TabSearch.vue';
  97. import {tabList} from './tabSearch'
  98. import FormDialog from '@/baseComponents/FormDialog.vue';
  99. import {userFormItemList, resetPasswordFormItemList} from './formDialog'
  100. import Dialog from '@/baseComponents/Dialog.vue';
  101. import {
  102. addUserApi,
  103. editUserApi,
  104. deleteUserApi,
  105. getUserListApi,
  106. openOrCloseUserAccountApi,
  107. resetUserPasswordApi,
  108. openOrCloseUserFollowStatusApi,
  109. } from '@/api/userManage'
  110. import {getPublicParameterConfigApi} from '@/api/parameterConfig'
  111. import {genderNumToName, accountStatusMsg} from '@/components/dict'
  112. import { ElMessage } from 'element-plus';
  113. /**
  114. * 1. 表格 有关数据
  115. */
  116. const currentPage = ref(1)
  117. const pageSize = ref(20)
  118. const totalNum = ref(0)
  119. const userTableData = ref([])
  120. const searchParams = ref({
  121. defaultUserType:1, // 默认展示的用户类型
  122. queryStr:"",
  123. })
  124. // 筛选不同的用户状态数据
  125. const HandleUserTypeChange = (val)=>{
  126. searchParams.value.defaultUserType = val
  127. GetUserList()
  128. }
  129. // 筛选模糊查询数据
  130. const HandleBlurSearch = (params,key)=>{
  131. searchParams.value = {
  132. ...searchParams.value,
  133. ...params,
  134. }
  135. GetUserList()
  136. }
  137. // 获取 启用/禁用 用户
  138. const GetUserList = async()=>{
  139. let params = {
  140. queryStr: searchParams.value.queryStr,
  141. "status": searchParams.value.defaultUserType,
  142. pageNum: currentPage.value,
  143. pageSize: pageSize.value
  144. }
  145. let res = await getUserListApi(params)
  146. if(res?.code == 200){
  147. userTableData.value = res.data.records
  148. totalNum.value = res.data.total
  149. }
  150. }
  151. /**
  152. * 2. 新增用户弹窗相关数据
  153. */
  154. const userFormDialogVisible = ref(false)
  155. const userFormDialogSubmiting = ref(false)
  156. const userFormDialogTitle = ref('')
  157. const defaultUserFormData = ref({
  158. publicFollowStatus:true,
  159. historyFollowStatus:true,
  160. // holdTopCount:100,
  161. // dayBackTopCount:15,
  162. // backPublicDayCount:15,
  163. })
  164. // 打开新增/修改用户弹窗
  165. const OpenUserFormDialog = async (row?:any)=>{
  166. if(row?.id){
  167. userFormDialogTitle.value = '修改用户'
  168. defaultUserFormData.value = {
  169. ...row,
  170. publicFollowStatus:Boolean(row.publicFollowStatus),
  171. historyFollowStatus:Boolean(row.historyFollowStatus)
  172. }
  173. console.log('当前赋值的form表单值',defaultUserFormData.value)
  174. }else{
  175. // 调用公海参数配置
  176. let res = await getPublicParameterConfigApi()
  177. if(res?.code == 200){
  178. const {holdTopCount,dayBackTopCount,backPublicDayCount} = res.data
  179. defaultUserFormData.value = {
  180. ...defaultUserFormData.value,
  181. holdTopCount,
  182. dayBackTopCount,
  183. backPublicDayCount,
  184. }
  185. }
  186. userFormDialogTitle.value = '新增用户'
  187. }
  188. userFormDialogVisible.value = true
  189. }
  190. // 关闭新增/修改用户弹窗
  191. const CloseUserFormDialog = ()=>{
  192. userFormDialogVisible.value = false
  193. userFormDialogSubmiting.value = false
  194. defaultUserFormData.value = {
  195. publicFollowStatus:true,
  196. historyFollowStatus:true,
  197. }
  198. }
  199. // 保存新增/修改用户弹窗
  200. const HandleUserFormDialogConfirm = async (params)=>{
  201. userFormDialogSubmiting.value = true
  202. const { formData,formRef } = params
  203. let transferParams = {
  204. ...formData,
  205. publicFollowStatus:formData.publicFollowStatus ? 1 : 0,
  206. historyFollowStatus:formData.historyFollowStatus ? 1 : 0,
  207. }
  208. let res = undefined
  209. try{
  210. if(formData.id){
  211. // 修改
  212. res = await editUserApi(formData.id,transferParams)
  213. }else{
  214. // 新增
  215. res = await addUserApi(transferParams)
  216. }
  217. }catch{}
  218. if(res?.code == 200){
  219. ElMessage.success(res?.msg)
  220. CloseUserFormDialog()
  221. GetUserList()
  222. }else{
  223. userFormDialogSubmiting.value = false
  224. }
  225. }
  226. /**
  227. * 3. 重置密码弹窗相关数据
  228. */
  229. const resetPasswordFormDialogVisible = ref(false)
  230. const resetPasswordFormDialogSubmiting = ref(false)
  231. const defaultResetPasswordFormData = ref({})
  232. // 打开 重置密码弹窗
  233. const OpenresetPasswordFormDialog = (row?:any)=>{
  234. defaultResetPasswordFormData.value = {...row}
  235. resetPasswordFormDialogVisible.value = true
  236. }
  237. // 关闭 重置密码弹窗
  238. const CloseResetPasswordFormDialog = ()=>{
  239. resetPasswordFormDialogVisible.value = false
  240. resetPasswordFormDialogSubmiting.value = false
  241. defaultResetPasswordFormData.value = {}
  242. }
  243. // 保存 重置密码弹窗
  244. const HandleresetPasswordFormDialogConfirm = async (params)=>{
  245. resetPasswordFormDialogSubmiting.value = true
  246. const { formData,formRef } = params
  247. let transferParams = {
  248. newPassword: formData.newPassword,
  249. userId: formData.id
  250. }
  251. let res = await resetUserPasswordApi(transferParams)
  252. if(res?.code == 200){
  253. ElMessage.success(res.msg)
  254. CloseResetPasswordFormDialog()
  255. GetUserList()
  256. }else{
  257. resetPasswordFormDialogSubmiting.value = false
  258. }
  259. }
  260. /**
  261. * 4. 禁用/删除 弹窗有关数据
  262. */
  263. const forbiddenDialogVisible = ref(false)
  264. const forbiddenDialogLoading = ref(false)
  265. const currentEditRow = ref()
  266. const currentOperationType = ref('') // 删除:delete | 禁用/启用 forbidden
  267. // 打开弹窗
  268. // type: delete | forbidden
  269. const OpenForbiddenDialog = (row,type)=>{
  270. currentOperationType.value = type
  271. currentEditRow.value = row
  272. forbiddenDialogVisible.value = true
  273. }
  274. // 关闭弹窗
  275. const HandleForbiddenDialogClose = ()=>{
  276. currentEditRow.value = undefined
  277. forbiddenDialogVisible.value = false
  278. forbiddenDialogLoading.value = false
  279. }
  280. // 弹窗确认
  281. const HandleForbiddenDialogConfirm = async ()=>{
  282. forbiddenDialogLoading.value = true
  283. let res = undefined
  284. try{
  285. if(currentOperationType.value == 'delete'){
  286. // 删除接口调用
  287. res = await deleteUserApi(currentEditRow.value.id)
  288. }else{
  289. // 禁用接口调用
  290. res = await openOrCloseUserAccountApi(currentEditRow.value.id)
  291. }
  292. }catch{}
  293. if(res?.code == 200){
  294. ElMessage.success(res?.msg)
  295. HandleForbiddenDialogClose()
  296. GetUserList()
  297. }else{
  298. forbiddenDialogLoading.value = false
  299. }
  300. }
  301. /**
  302. * 5. 公海跟进 / 历史跟进 操作控制
  303. */
  304. const HandleCardSwitchOnOff = async (params)=>{
  305. const { id, onOffVal, type } = params
  306. let res = undefined
  307. if(type == 'public'){
  308. res = await openOrCloseUserFollowStatusApi(id,'publicFollow')
  309. }else if(type == 'history'){
  310. res = await openOrCloseUserFollowStatusApi(id,'historyFollow')
  311. }
  312. if(res?.code == 200){
  313. ElMessage.success(res?.msg)
  314. GetUserList()
  315. }
  316. }
  317. /**
  318. * 获取用户信息
  319. */
  320. onMounted(()=>{
  321. GetUserList()
  322. })
  323. </script>
  324. <style lang="scss" scoped>
  325. .search_content{
  326. :deep(.box_tab){
  327. gap:10px;
  328. .selected + span{
  329. border-left: 1px solid #dcdfe6;
  330. }
  331. >span:nth-child(n):not(:last-child):not(.selected){
  332. border-right: 1px solid #dcdfe6;
  333. }
  334. > span{
  335. border-radius: 4px !important ;
  336. }
  337. }
  338. }
  339. .user_form_dialog{
  340. :deep(.el-dialog__body){
  341. min-height: 520px !important;
  342. max-height: 520px !important;
  343. }
  344. }
  345. .reset_password_form_dialog{
  346. :deep(.el-dialog__body){
  347. min-height: 210px !important;
  348. max-height: 210px !important;
  349. }
  350. }
  351. </style>