Просмотр исходного кода

添加用户管理-重置密码、禁用、跟进控制、删除接口调用

lm 1 месяц назад
Родитель
Сommit
690eefe56b

+ 4 - 1
src/api/login.ts

@@ -46,10 +46,13 @@ export const smsCodeLoginApi = (data:any) => {
 // 获取用户信息
 // 获取用户信息
 export const getUserInfo = () => {
 export const getUserInfo = () => {
   return request({
   return request({
-    url: `${adminPrefix}/api/v1/student_user/find_user_info`,
+    url: `${adminPrefix}/api/v1/sys/users/me/info`,
     method: 'get'
     method: 'get'
   })
   })
 }
 }
+
+
+
 //退出登录
 //退出登录
 export const loginOut = (data: any) => {
 export const loginOut = (data: any) => {
   return request({
   return request({

+ 13 - 1
src/baseComponents/FormDialog.vue

@@ -40,7 +40,17 @@
           <!-- autocomplete="off" -->
           <!-- autocomplete="off" -->
           <template v-if="!props.formDisabled">
           <template v-if="!props.formDisabled">
             <el-input v-if="item.type=='input'" v-model="formData[item.key]"  :disabled="item.disabled" :placeholder="item.placeholder"/>
             <el-input v-if="item.type=='input'" v-model="formData[item.key]"  :disabled="item.disabled" :placeholder="item.placeholder"/>
-            <el-input v-else-if="item.type=='password'" type="password" v-model="formData[item.key]"  :disabled="item.disabled"/>
+            
+            
+            <el-input v-else-if="item.type=='password'" :type="!showPass ? 'password' : 'text'" v-model="formData[item.key]"  :disabled="item.disabled">
+              <template #suffix>
+                  <span style="z-index: 10 !important;" >
+                    <i  @click.down="showPass = !showPass" :class="['iconfont', {'icon_xianshimima':showPass},{'icon_buxianshimima':!showPass}]"></i>
+                  </span>
+                </template>
+            </el-input>
+            
+            
             <el-input v-else-if="item.type=='textarea'" :autosize="{ minRows: item.rows, maxRows: item.rows }" v-model="formData[item.key]" type="textarea" :rows="item.rows"  :disabled="item.disabled" :placeholder="item.placeholder"/>
             <el-input v-else-if="item.type=='textarea'" :autosize="{ minRows: item.rows, maxRows: item.rows }" v-model="formData[item.key]" type="textarea" :rows="item.rows"  :disabled="item.disabled" :placeholder="item.placeholder"/>
             
             
             <template  v-else-if="item.type=='number'" > 
             <template  v-else-if="item.type=='number'" > 
@@ -651,6 +661,8 @@ const props = defineProps({
 })
 })
 const emit  = defineEmits(['close','confirm','formItemChange','fileUpload','abortFile'])
 const emit  = defineEmits(['close','confirm','formItemChange','fileUpload','abortFile'])
 
 
+const showPass = ref(false)
+
 const fileMessage = ref({})
 const fileMessage = ref({})
 const formData = ref({})
 const formData = ref({})
 const formRef = ref()
 const formRef = ref()

+ 1 - 1
src/layout/components/header.vue

@@ -16,7 +16,7 @@
     <div  class="head_content_right">
     <div  class="head_content_right">
       <el-dropdown trigger="click" @command="UserCommand" placement="bottom-end">
       <el-dropdown trigger="click" @command="UserCommand" placement="bottom-end">
         <span class="userName">
         <span class="userName">
-          {{userInfo?.schoolName}}
+          {{userInfo?.username}}
           <el-icon class="el-icon--right">
           <el-icon class="el-icon--right">
             <arrow-down />
             <arrow-down />
           </el-icon>
           </el-icon>

+ 10 - 1
src/utils/request.ts

@@ -39,7 +39,16 @@ service.interceptors.response.use(
         ElMessage.warning(res.msg)
         ElMessage.warning(res.msg)
       }
       }
     }
     }
-    
+
+    /**  401 响应 —— 除了登录页外,其他的都要重定向到登录  */
+    if (res.code === 401 && 
+        !window.location.hash.startsWith('#/phoneLogin') && 
+        !window.location.hash.startsWith('#/login') && 
+        window.location.hash !== '#/'){
+        // 跳转登录页
+        window.location.href = '/'
+    }
+
     /*
     /*
     if (res.code !== 200) {
     if (res.code !== 200) {
       ElMessage({
       ElMessage({

+ 8 - 11
src/views/highSeasCustomer/index.vue

@@ -8,7 +8,7 @@
                     </div>
                     </div>
                     <div class="content_right">
                     <div class="content_right">
                         <el-button class="button_refresh">批量导入</el-button>
                         <el-button class="button_refresh">批量导入</el-button>
-                        <el-button class="button_background" @click="OpenSchoolFormDialog">新增学校</el-button>
+                        <el-button class="button_background" @click="OpenSchoolFormDialog()">新增学校</el-button>
                     </div>
                     </div>
                 </div>
                 </div>
             </div>
             </div>
@@ -93,20 +93,17 @@ const schoolDefaultFormData = ref({})
 const OpenSchoolFormDialog = (row?:any)=>{
 const OpenSchoolFormDialog = (row?:any)=>{
     if(row){
     if(row){
         schoolTitle.value = '编辑学校'
         schoolTitle.value = '编辑学校'
+        schoolDefaultFormData.value = {
+            ...row,
+            provinceArea:{
+                province:row.province,
+                district:row.district,
+            },
+        }
     }else{
     }else{
         schoolTitle.value = '新增学校'
         schoolTitle.value = '新增学校'
     }
     }
-
-    console.log('当前行',row)
     schoolVisible.value = true
     schoolVisible.value = true
-    schoolDefaultFormData.value = {
-        ...row,
-        provinceArea:{
-            province:row.province,
-            district:row.district,
-        },
-        
-    }
 }
 }
 
 
 
 

+ 1 - 1
src/views/login/login.vue

@@ -73,7 +73,7 @@
 <script setup>
 <script setup>
 import { ref, onMounted, computed, watch, reactive } from 'vue'
 import { ref, onMounted, computed, watch, reactive } from 'vue'
 // import particles from 'particles.js'
 // import particles from 'particles.js'
-import { login,getUserInfo,replaceGraphValidateCodeApi} from '@/api/login.ts'
+import { login,replaceGraphValidateCodeApi} from '@/api/login.ts'
 
 
 import { ElMessage } from 'element-plus' // 
 import { ElMessage } from 'element-plus' // 
 import { useRouter } from 'vue-router'
 import { useRouter } from 'vue-router'

+ 9 - 2
src/views/login/phoneLogin.vue

@@ -333,7 +333,14 @@ const SubmitLogin = async () => {
         localStorage.removeItem('passWord')
         localStorage.removeItem('passWord')
         localStorage.setItem('rememberMe', 'false')
         localStorage.setItem('rememberMe', 'false')
       }
       }
-      router.push('/main')
+
+      let userInfoRes = await  getUserInfo()
+      console.log("获取用户信息返回",userInfoRes)
+      if (userInfoRes?.code === 200) {
+        // 存储用户信息到 localStorage 或 Pinia
+        localStorage.setItem('userInfo', JSON.stringify(userInfoRes.data))
+        router.push('/main')
+      }
     }
     }
   }).catch(err=>{
   }).catch(err=>{
     console.log('报错信息',err)
     console.log('报错信息',err)
@@ -349,7 +356,7 @@ onMounted(() => {
   //   InitParticles()
   //   InitParticles()
   let sendMsgInfoStorage = sessionStorage.getItem('sendMsgInfo')
   let sendMsgInfoStorage = sessionStorage.getItem('sendMsgInfo')
   if(!sendMsgInfoStorage){
   if(!sendMsgInfoStorage){
-    router.replace('/phone')
+    router.replace('/')
     return
     return
   } 
   } 
   sendMsgInfo.value = JSON.parse(sendMsgInfoStorage || '{}')
   sendMsgInfo.value = JSON.parse(sendMsgInfoStorage || '{}')

+ 19 - 3
src/views/userPrivilegeManagement/userManage/formDialog.ts

@@ -1,5 +1,18 @@
 import { ref } from "vue";
 import { ref } from "vue";
 
 
+// 手机号正则校验
+const phoneValidator = (rule: any, value: string, callback: any) => {
+  if (!value) {
+    return callback(new Error('请输入手机号'));
+  }
+  const reg = /^1[3-9]\d{9}$/;
+  if (!reg.test(value)) {
+    return callback(new Error('请输入正确的11位手机号'));
+  }
+  callback();
+};
+
+
 // 新增用户 表单项
 // 新增用户 表单项
 export const userFormItemList = ref([
 export const userFormItemList = ref([
   {
   {
@@ -25,8 +38,8 @@ export const userFormItemList = ref([
     label: '性别',
     label: '性别',
     type: 'radio',
     type: 'radio',
     selectList: [
     selectList: [
-      { label: '男', value: '0' },
-      { label: '女', value: '1' }
+      { label: '男', value: 0 },
+      { label: '女', value: 1 }
     ],
     ],
     rules: [{ required: true, message: '请选择性别', trigger: 'blur' }], 
     rules: [{ required: true, message: '请选择性别', trigger: 'blur' }], 
     custom: false,
     custom: false,
@@ -37,7 +50,10 @@ export const userFormItemList = ref([
     label: '手机号',
     label: '手机号',
     type: 'input',
     type: 'input',
     placeholder: '请输入手机号',
     placeholder: '请输入手机号',
-    rules: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
+    rules: [
+      // 手机号格式校验
+      { required: true, validator: phoneValidator, trigger: 'blur' }
+    ],
     custom: false,
     custom: false,
     style: {},
     style: {},
   },
   },

+ 95 - 42
src/views/userPrivilegeManagement/userManage/index.vue

@@ -29,18 +29,20 @@
                 <TableRowStatus :statusMsg="accountStatusMsg" :useStatus="row.status" />
                 <TableRowStatus :statusMsg="accountStatusMsg" :useStatus="row.status" />
             </template>
             </template>
 
 
+            <!-- 公海跟进 -->
             <template #publicFollowStatus="{row}">
             <template #publicFollowStatus="{row}">
                 <el-switch
                 <el-switch
                     :model-value="Boolean(row.publicFollowStatus)"
                     :model-value="Boolean(row.publicFollowStatus)"
-                    @change="(val)=>HandleCardSwitchOnOff({id:row.id,onOffVal:val})"
+                    @change="(val)=>HandleCardSwitchOnOff({id:row.id,onOffVal:val,type:'public'})"
                     style="--el-switch-on-color: #2e64fa; --el-switch-off-color: #bbbbbb"
                     style="--el-switch-on-color: #2e64fa; --el-switch-off-color: #bbbbbb"
                 />
                 />
             </template>
             </template>
 
 
+            <!-- 历史跟进 -->
             <template #historyFollowStatus="{row}">
             <template #historyFollowStatus="{row}">
                 <el-switch
                 <el-switch
                     :model-value="Boolean(row.historyFollowStatus)"
                     :model-value="Boolean(row.historyFollowStatus)"
-                    @change="(val)=>HandleCardSwitchOnOff({id:row.id,onOffVal:val})"
+                    @change="(val)=>HandleCardSwitchOnOff({id:row.id,onOffVal:val,type:'history'})"
                     style="--el-switch-on-color: #2e64fa; --el-switch-off-color: #bbbbbb"
                     style="--el-switch-on-color: #2e64fa; --el-switch-off-color: #bbbbbb"
                 />
                 />
             </template>
             </template>
@@ -49,14 +51,14 @@
                 <div class="table_row_option">
                 <div class="table_row_option">
                     <span class="option_button_editor" @click="OpenUserFormDialog(row)">编辑</span>
                     <span class="option_button_editor" @click="OpenUserFormDialog(row)">编辑</span>
                     <span class="option_button_editor" @click="OpenresetPasswordFormDialog(row)">重置密码</span>
                     <span class="option_button_editor" @click="OpenresetPasswordFormDialog(row)">重置密码</span>
-                    <span class="option_button_editor" @click="OpenForbiddenDialog(row,'forbidden')">禁用</span>
+                    <span class="option_button_editor" @click="OpenForbiddenDialog(row,'forbidden')">{{row.status === 1 ? '禁用' :  '启用' }}</span>
                     <span class="el_button_delete" @click="OpenForbiddenDialog(row,'delete')">删除</span>
                     <span class="el_button_delete" @click="OpenForbiddenDialog(row,'delete')">删除</span>
                 </div>
                 </div>
             </template>
             </template>
         </Table>
         </Table>
     </div>
     </div>
 
 
-    <!-- 新增用户 弹窗 -->
+    <!-- 新增/修改用户 弹窗 -->
     <FormDialog  
     <FormDialog  
         class="user_form_dialog"
         class="user_form_dialog"
         width="482px"
         width="482px"
@@ -121,7 +123,6 @@ import {
 } from '@/api/userManage'
 } from '@/api/userManage'
 
 
 import {genderNumToName, accountStatusMsg} from '@/components/dict'
 import {genderNumToName, accountStatusMsg} from '@/components/dict'
-import { historyFollowSearchList } from '@/views/myCustomer/myCustomerDetail/customerStatusOverview/searchBlock';
 import { ElMessage } from 'element-plus';
 import { ElMessage } from 'element-plus';
 
 
 /**
 /**
@@ -130,15 +131,42 @@ import { ElMessage } from 'element-plus';
 const currentPage = ref(1)
 const currentPage = ref(1)
 const pageSize = ref(20)
 const pageSize = ref(20)
 const totalNum = ref(0)
 const totalNum = ref(0)
-
 const userTableData = ref([])
 const userTableData = ref([])
-
-
 const searchParams = ref({
 const searchParams = ref({
     defaultUserType:1, // 默认展示的用户类型
     defaultUserType:1, // 默认展示的用户类型
     queryStr:"",
     queryStr:"",
 })
 })
 
 
+// 筛选不同的用户状态数据
+const HandleUserTypeChange = (val)=>{
+    searchParams.value.defaultUserType = val
+    GetUserList()
+}
+
+// 筛选模糊查询数据
+const HandleBlurSearch = (params,key)=>{
+    searchParams.value = {
+        ...searchParams.value,
+        ...params,
+    }
+    GetUserList()
+}
+
+// 获取 启用/禁用 用户
+const GetUserList = async()=>{
+    let params = {
+        queryStr: searchParams.value.queryStr,
+        "status": searchParams.value.defaultUserType,
+        pageNum: currentPage.value,
+        pageSize: pageSize.value
+    }
+    let res = await getUserListApi(params)
+    if(res?.code == 200){
+        userTableData.value = res.data.records
+        totalNum.value = res.data.total
+    }
+}
+
 /**
 /**
  * 2. 新增用户弹窗相关数据
  * 2. 新增用户弹窗相关数据
  */
  */
@@ -190,7 +218,6 @@ const HandleUserFormDialogConfirm = async (params)=>{
         historyFollowStatus:formData.historyFollowStatus ? 1 : 0,
         historyFollowStatus:formData.historyFollowStatus ? 1 : 0,
     }
     }
     let res = undefined
     let res = undefined
-
     try{
     try{
         if(formData.id){
         if(formData.id){
             // 修改
             // 修改
@@ -200,7 +227,6 @@ const HandleUserFormDialogConfirm = async (params)=>{
             res = await addUserApi(transferParams)
             res = await addUserApi(transferParams)
         }
         }
     }catch{}
     }catch{}
-
     if(res?.code == 200){
     if(res?.code == 200){
         ElMessage.success(res?.msg)
         ElMessage.success(res?.msg)
         CloseUserFormDialog()
         CloseUserFormDialog()
@@ -224,11 +250,25 @@ const OpenresetPasswordFormDialog = (row?:any)=>{
 // 关闭 重置密码弹窗
 // 关闭 重置密码弹窗
 const CloseResetPasswordFormDialog = ()=>{
 const CloseResetPasswordFormDialog = ()=>{
     resetPasswordFormDialogVisible.value = false
     resetPasswordFormDialogVisible.value = false
+    resetPasswordFormDialogSubmiting.value = false
     defaultResetPasswordFormData.value = {}
     defaultResetPasswordFormData.value = {}
 }
 }
 // 保存 重置密码弹窗
 // 保存 重置密码弹窗
-const HandleresetPasswordFormDialogConfirm = ()=>{
-    CloseResetPasswordFormDialog()
+const HandleresetPasswordFormDialogConfirm = async (params)=>{
+    resetPasswordFormDialogSubmiting.value = true
+    const { formData,formRef } = params
+    let transferParams = {
+        newPassword: formData.newPassword,
+        userId: formData.id
+    }
+    let res = await resetUserPasswordApi(transferParams)
+    if(res?.code == 200){
+        ElMessage.success(res.msg)
+        CloseResetPasswordFormDialog()
+        GetUserList()
+    }else{
+        resetPasswordFormDialogSubmiting.value = false
+    }
 }
 }
 
 
 /**
 /**
@@ -237,50 +277,63 @@ const HandleresetPasswordFormDialogConfirm = ()=>{
 const forbiddenDialogVisible = ref(false)
 const forbiddenDialogVisible = ref(false)
 const forbiddenDialogLoading = ref(false)
 const forbiddenDialogLoading = ref(false)
 const currentEditRow = ref()
 const currentEditRow = ref()
-const currentOperationType = ref('')
-const HandleForbiddenDialogClose = ()=>{
-    currentEditRow.value = undefined
-    forbiddenDialogVisible.value = false
-}
-const HandleForbiddenDialogConfirm = ()=>{
-    // 区分 禁用和删除
-    // currentOperationType.value
-    HandleForbiddenDialogClose()
-}
+const currentOperationType = ref('')  //  删除:delete | 禁用/启用 forbidden
+// 打开弹窗
 // type: delete | forbidden
 // type: delete | forbidden
 const OpenForbiddenDialog = (row,type)=>{
 const OpenForbiddenDialog = (row,type)=>{
     currentOperationType.value = type
     currentOperationType.value = type
     currentEditRow.value = row
     currentEditRow.value = row
     forbiddenDialogVisible.value = true
     forbiddenDialogVisible.value = true
 }
 }
-
-const HandleUserTypeChange = (val)=>{
-    searchParams.value.defaultUserType = val
-    GetUserList()
+// 关闭弹窗
+const HandleForbiddenDialogClose = ()=>{
+    currentEditRow.value = undefined
+    forbiddenDialogVisible.value = false
+    forbiddenDialogLoading.value = false
 }
 }
-
-const HandleBlurSearch = (params,key)=>{
-    searchParams.value = {
-        ...searchParams.value,
-        ...params,
+// 弹窗确认
+const HandleForbiddenDialogConfirm = async ()=>{
+    forbiddenDialogLoading.value = true
+    let res = undefined
+    try{
+        if(currentOperationType.value == 'delete'){
+            // 删除接口调用
+            res = await deleteUserApi(currentEditRow.value.id)
+        }else{
+            // 禁用接口调用
+            res = await openOrCloseUserAccountApi(currentEditRow.value.id)
+        }
+    }catch{}
+    if(res?.code == 200){
+        ElMessage.success(res?.msg)
+        HandleForbiddenDialogClose()
+        GetUserList()
+    }else{
+        forbiddenDialogLoading.value = false
     }
     }
-    GetUserList()
 }
 }
-// 获取 启用/禁用 用户
-const GetUserList = async()=>{
-    let params = {
-        queryStr: searchParams.value.queryStr,
-        "status": searchParams.value.defaultUserType,
-        pageNum: currentPage.value,
-        pageSize: pageSize.value
+
+/**
+ * 5. 公海跟进 / 历史跟进 操作控制
+ */
+const HandleCardSwitchOnOff = async (params)=>{
+    const { id, onOffVal, type } = params
+    let res = undefined
+    if(type == 'public'){
+       res = await openOrCloseUserFollowStatusApi(id,'publicFollow')
+    }else if(type == 'history'){
+       res = await openOrCloseUserFollowStatusApi(id,'historyFollow')
     }
     }
-    let res = await getUserListApi(params)
     if(res?.code == 200){
     if(res?.code == 200){
-        userTableData.value = res.data.records
-        totalNum.value = res.data.total
+        ElMessage.success(res?.msg)
+        GetUserList()
     }
     }
 }
 }
 
 
+
+/**
+ * 获取用户信息
+ */
 onMounted(()=>{
 onMounted(()=>{
     GetUserList()
     GetUserList()
 })
 })