From 8e38cc8536cfda9b6bda8548d63778cbf5f4d634 Mon Sep 17 00:00:00 2001
From: web <candymxq888@outlook.com>
Date: 星期六, 26 四月 2025 17:27:57 +0800
Subject: [PATCH] fix:添加个人中心和重置密码

---
 src/views/system/user/index.vue |  678 +++++++++++++++++++++++++++++---------------------------
 1 files changed, 352 insertions(+), 326 deletions(-)

diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 99c400e..4f87b0e 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -1,15 +1,15 @@
-    <!--
-    * @Author: Liuyi candymxq888@outlook.com
-    * @Date: 2024-08-06 16:17:39
- * @LastEditors: Liuyi candymxq888@outlook.com
- * @LastEditTime: 2024-10-23 15:51:47
-    * @FilePath: \water-qinghe-web\src\views\system\user\index.vue
-    * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-    -->
-    <template>
-        <div class="app-container">
-          <el-form :model="queryParams" ref="queryRef" :inline="true">
-              <el-form-item label="用户名称" prop="name">
+<!--
+* @Author: Liuyi candymxq888@outlook.com
+* @Date: 2024-08-06 16:17:39
+* @LastEditors: Liuyi candymxq888@outlook.com
+* @LastEditTime: 2024-10-23 15:51:47
+* @FilePath: \water-qinghe-web\src\views\system\user\index.vue
+* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryRef" :inline="true">
+            <el-form-item label="用户名称" prop="name">
                 <el-input
                     v-model="queryParams.name"
                     placeholder="请输入用户名称"
@@ -17,366 +17,392 @@
                     style="width: 200px"
                     @keyup.enter="handleQuery"
                 />
-              </el-form-item>
-              <el-form-item>
+            </el-form-item>
+            <el-form-item>
                 <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
                 <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-              </el-form-item>
-          </el-form>
-          <el-row :gutter="10" class="mb8">
-              <el-col :span="1.5">
+            </el-form-item>
+        </el-form>
+        <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
                 <el-button
                     type="primary"
                     plain
                     icon="Plus"
                     @click="handleAdd"
-                >新增</el-button>
-              </el-col>
-          </el-row>
-          <!--表格及分页-->
-          <el-table v-loading="loading" :data="tableData">
-              <el-table-column
+                >新增
+                </el-button>
+            </el-col>
+        </el-row>
+        <!--表格及分页-->
+        <el-table v-loading="loading" :data="tableData">
+            <el-table-column
                 v-for="(item, key, index) of tableHeader"
                 :prop="key.toString()"
                 :label="item"
                 :key="index"
                 align="center"
-              >
+            >
                 <template #default="scope">
                     <div v-if="key === 'userType'">
-                        {{userTypeList?.filter(fil => fil.dictValue == scope.row.userType.toString())[0].dictLabel}}
+                        {{ userTypeList?.filter(fil => fil.dictValue == scope.row.userType.toString())[0].dictLabel }}
                     </div>
                 </template>
             </el-table-column>
-              <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
                 <template #default="scope">
                     <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
-                    <el-button v-if="scope.row.userType == 3" link type="primary" icon="Edit" @click="handleRole(scope.row)">绑定角色</el-button>
+                    <el-button v-if="scope.row.userType == 3" link type="primary" icon="Edit"
+                               @click="handleRole(scope.row)">绑定角色
+                    </el-button>
+                    <el-button link type="primary" icon="reset" @click="handeReset(scope.row)">重置密码</el-button>
                     <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
                 </template>
-              </el-table-column>
-            </el-table>
-            <pagination
-              :total="pageParam.total"
-              v-model:page="pageParam.page"
-              v-model:limit="pageParam.limit"
-              :page-sizes="[10,20,30]"
-              @pagination="getList"
-            />
-          <!-- 添加或修改对话框 -->
-          <el-dialog :title="title" v-model="open" append-to-body center>
-              <el-form class="form-box"  ref="userRef" :model="form" :rules="rules">
-                      <el-form-item label="用户名" prop="userName">
-                          <el-input :disabled ="!!form.id" v-model="form.userName" placeholder="请输入用户名称"/>
-                      </el-form-item>
-                      <el-form-item v-if="!form.id" label="密码" prop="password">
-                          <el-input v-model="form.password" placeholder="请输入密码" />
-                      </el-form-item>
-                        <el-form-item label="昵称" prop="nickName">
-                          <el-input v-model="form.nickName" placeholder="请输入昵称" />
-                      </el-form-item>
-                      <el-form-item label="用户类型"  prop="userType">
-                            <el-select v-model="form.userType" placeholder="请选择用户类型">
-                                <el-option 
-                                v-for="(item,index) in userTypeList"
-                                :label="item.dictLabel"
-                                :value="item.dictValue"
-                                :key="index"
-                                ></el-option>
-                            </el-select>
-                      </el-form-item>
-                        <el-form-item label="联系邮箱" prop="email">
-                          <el-input v-model="form.email" placeholder="请输入邮箱地址" />
-                      </el-form-item>
-                        <el-form-item label="联系方式" prop="contact">
-                          <el-input v-model="form.contact" placeholder="请输入联系方式" />
-                      </el-form-item>
-                      <el-form-item v-if="!form.id">
-                          <br>
-                      </el-form-item>
-                        <el-form-item label="上传头像" prop="">
-                            <upload-icons @uploadData="uploadData" :imageList="form.headImg" :limit="1"></upload-icons>
-                      </el-form-item>
-                  <el-form-item></el-form-item>
-              </el-form>
-              <template #footer>
+            </el-table-column>
+        </el-table>
+        <pagination
+            :total="pageParam.total"
+            v-model:page="pageParam.page"
+            v-model:limit="pageParam.limit"
+            :page-sizes="[10,20,30]"
+            @pagination="getList"
+        />
+        <!-- 添加或修改对话框 -->
+        <el-dialog :title="title" v-model="open" append-to-body center>
+            <el-form class="form-box" ref="userRef" :model="form" :rules="rules">
+                <el-form-item label="用户名" prop="userName">
+                    <el-input :disabled="!!form.id" v-model="form.userName" placeholder="请输入用户名称"/>
+                </el-form-item>
+                <el-form-item v-if="!form.id" label="密码" prop="password">
+                    <el-input v-model="form.password" placeholder="请输入密码"/>
+                </el-form-item>
+                <el-form-item label="昵称" prop="nickName">
+                    <el-input v-model="form.nickName" placeholder="请输入昵称"/>
+                </el-form-item>
+                <el-form-item label="用户类型" prop="userType">
+                    <el-select v-model="form.userType" placeholder="请选择用户类型">
+                        <el-option
+                            v-for="(item,index) in userTypeList"
+                            :label="item.dictLabel"
+                            :value="item.dictValue"
+                            :key="index"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="联系邮箱" prop="email">
+                    <el-input v-model="form.email" placeholder="请输入邮箱地址"/>
+                </el-form-item>
+                <el-form-item label="联系方式" prop="contact">
+                    <el-input v-model="form.contact" placeholder="请输入联系方式"/>
+                </el-form-item>
+                <el-form-item />
+                <el-form-item label="上传头像" prop="">
+                    <upload-icons @uploadData="uploadData" :imageList="form.headImg" :limit="1"></upload-icons>
+                </el-form-item>
+                <el-form-item></el-form-item>
+            </el-form>
+            <template #footer>
                 <div class="dialog-footer">
                     <el-button type="primary" @click="submitForm">确 定</el-button>
                     <el-button @click="cancel">取 消</el-button>
                 </div>
-              </template>
-          </el-dialog>
-          
-            <!-- 角色设置弹窗 -->
-            <el-dialog
-                v-model="open1"
-                title="角色绑定"
-                align-center
-                center
-                width="300"
-                >
-                <div class="bandCheck">
-                    <el-checkbox-group v-model="roleCheckedList">
-                        <el-checkbox v-for="(item,index) in roleSelectList" :key="index" :label="item.name" :value="item.id" size ="large" />
-                    </el-checkbox-group>
-                </div>
-                <div class="handleBtn">
-                    <el-button @click="open1 = false">取消</el-button>
-                    <el-button type="primary" @click="bandListConfirm">确认</el-button>
-                </div>
-            </el-dialog>
-        </div>
-    </template>
-    
-    <script setup>
-    import  user from "@/api/system/user";
-    import  role from "@/api/system/role";
-    import  { sysDictData } from "@/api/system/dict";
-    import setPostParams from "@/utils/searchParams.js";
-    const { proxy } = getCurrentInstance();
-    const imgBaseUrl = import.meta.env.VITE_APP_IMG_BASEURL //图片前缀
-    
-    /**
-     * 搜索相关
-     */
-    /** 搜索按钮操作 */
-    function handleQuery() {
-      getList({keywords:queryParams.value.name,page:1})
-    }
-    
-    /** 重置按钮操作 */
-    function resetQuery() {
-      proxy.resetForm("queryRef");
-      handleQuery();
-    }
+            </template>
+        </el-dialog>
 
-    /**
-      *  Table表格权限数据列表相关
-      */
-    const pageParam = ref({
-        total:0,
-        limit:0,
-        page:0,
+        <!-- 角色设置弹窗 -->
+        <el-dialog
+            v-model="open1"
+            title="角色绑定"
+            align-center
+            center
+            width="300"
+        >
+            <div class="bandCheck">
+                <el-checkbox-group v-model="roleCheckedList">
+                    <el-checkbox v-for="(item,index) in roleSelectList" :key="index" :label="item.name" :value="item.id"
+                                 size="large"/>
+                </el-checkbox-group>
+            </div>
+            <div class="handleBtn">
+                <el-button @click="open1 = false">取消</el-button>
+                <el-button type="primary" @click="bandListConfirm">确认</el-button>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup>
+import user from "@/api/system/user";
+import role from "@/api/system/role";
+import {sysDictData} from "@/api/system/dict";
+import setPostParams from "@/utils/searchParams.js";
+
+const {proxy} = getCurrentInstance();
+const imgBaseUrl = import.meta.env.VITE_APP_IMG_BASEURL //图片前缀
+
+/**
+ * 搜索相关
+ */
+/** 搜索按钮操作 */
+function handleQuery() {
+    getList({keywords: queryParams.value.name, page: 1})
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+    proxy.resetForm("queryRef");
+    handleQuery();
+}
+
+/**
+ *  Table表格权限数据列表相关
+ */
+const pageParam = ref({
+    total: 0,
+    limit: 0,
+    page: 0,
+})
+const tableData = ref([]);
+let tableHeader = ref({
+    userName: '用户名称',
+    nickName: '昵称',
+    userType: '用户类型',
+    contact: '联系方式',
+    email: '邮箱地址',
+    createTimeView: '创建时间'
+})
+
+/** 获取列表 */
+async function getList(val) {
+    loading.value = true;
+
+    let postParam = setPostParams(val)
+    await user().search(postParam).then((res) => {
+        tableData.value = res.data.list
+        pageParam.value.total = res.data.total
+        pageParam.value.limit = res.data.limit
+        pageParam.value.page = res.data.page
     })
-    const tableData = ref([]);
-    let  tableHeader = ref({
-        userName: '用户名称',
-        nickName: '昵称',
-        userType:'用户类型',
-        contact:'联系方式',
-        email:'邮箱地址',
-        createTimeView:'创建时间'
-      })
-    /** 获取列表 */
-    async function getList(val) {
-          loading.value = true;
+    loading.value = false;
+}
 
-        let postParam = setPostParams(val)
-          await user().search(postParam).then((res) =>{
-            tableData.value = res.data.list
-            pageParam.value.total = res.data.total
-            pageParam.value.limit = res.data.limit
-            pageParam.value.page = res.data.page
+/** 新增按钮操作 */
+async function handleAdd() {
+    reset();
+    open.value = true;
+    title.value = "新增用户";
+}
+
+/** 修改按钮操作 */
+async function handleUpdate(row) {
+    reset();
+    form.value = Object.assign({}, row)
+    open.value = true;
+    title.value = "修改用户";
+}
+
+/** 重置密码 */
+function handeReset(row) {
+    proxy.$modal.confirm('是否确认重置"' + row.nickName + '"的密码?').then(function () {
+        return user().resetPwd(row.id).then(res => {
+            proxy.$modal.confirm(`重置密码成功,新密码为:${res.data}`);
         })
-        loading.value = false;
-    }
-    
-    /** 新增按钮操作 */
-    async function handleAdd() {
-      reset();
-      open.value = true;
-      title.value = "新增用户";
-    }
-    
-    /** 修改按钮操作 */
-    async function handleUpdate(row) {
-      reset();
-      form.value = Object.assign({},row)
-      open.value = true;
-      title.value = "修改用户";
-    }
+    })
+}
 
-    /** 删除按钮操作 */
-    function handleDelete(row) {
-      proxy.$modal.confirm('是否确认删除名称为"' + row.nickName + '"的数据项?').then(function() {
+/** 删除按钮操作 */
+function handleDelete(row) {
+    proxy.$modal.confirm('是否确认删除名称为"' + row.nickName + '"的数据项?').then(function () {
         return user().remove(row.id);
-      }).then(() => {
+    }).then(() => {
         getList();
         proxy.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
-    }
+    }).catch(() => {
+    });
+}
 
-    /**
-      *  新增/修改弹窗Form表单相关
-      */
-    const open = ref(false);
-    const loading = ref(false);
-    const title = ref("");
+/**
+ *  新增/修改弹窗Form表单相关
+ */
+const open = ref(false);
+const loading = ref(false);
+const title = ref("");
 
-    const data = reactive({
-    form:{},
+const data = reactive({
+    form: {},
     queryParams: {
         name: undefined,
     },
     rules: {
-        userName: [{ required: true, message: "请输入用户名称", trigger: "blur" }],
-        password: [{ required: true, message: "请输入密码", trigger: "blur" }],
-        nickName: [{ required: true, message: "请输入昵称", trigger: "blur" }],
-        userType: [{ required: true, message: "请选择用户类型", trigger: "blur" }],
-        contact: [{ required: true, message: "请输入联系方式", trigger: "blur" }],
-        email: [{ required: true, message: "请输入邮箱地址", trigger: "blur" }],
-        headImg: [{ required: true, message: "请上传用户头像", trigger: "blur" }],
+        userName: [{required: true, message: "请输入用户名称", trigger: "blur"}],
+        password: [{required: true, message: "请输入密码", trigger: "blur"}],
+        nickName: [{required: true, message: "请输入昵称", trigger: "blur"}],
+        userType: [{required: true, message: "请选择用户类型", trigger: "blur"}],
+        contact: [{required: true, message: "请输入联系方式", trigger: "blur"}],
+        email: [{required: true, message: "请输入邮箱地址", trigger: "blur"}],
+        headImg: [{required: true, message: "请上传用户头像", trigger: "blur"}],
     },
-    });
-    const { queryParams, form, rules } = toRefs(data);
+});
+const {queryParams, form, rules} = toRefs(data);
 
-    //上传文件,添加图片地址信息
-    const uploadData = (img) => {
-        form.value.headImg = imgBaseUrl + img.toString()
-    }
+//上传文件,添加图片地址信息
+const uploadData = (img) => {
+    form.value.headImg = imgBaseUrl + img.toString()
+}
 
-    //获取用户分类列表
-    const userTypeList = ref()
-    const getUserType = async() =>{
-      await sysDictData().searchType('user_type').then((res) =>{
-      userTypeList.value = res.data
-        })
-    }
-    /** 提交按钮 */
-    function submitForm() {
-      proxy.$refs["userRef"].validate(valid => {
+//获取用户分类列表
+const userTypeList = ref()
+const getUserType = async () => {
+    await sysDictData().searchType('user_type').then((res) => {
+        userTypeList.value = res.data
+    })
+}
+
+/** 提交按钮 */
+function submitForm() {
+    proxy.$refs["userRef"].validate(valid => {
         if (valid) {
-          if (form.value.id != undefined) {
-            user().modify(form.value).then(res => {
-              proxy.$modal.msgSuccess("修改成功");
-              open.value = false;
-              getList();
-            }).catch(() =>{
-                open.value = false;
-                proxy.$modal.msgError("修改失败");
-            });
-          } else {
-            user().create(form.value).then(res => {
-              proxy.$modal.msgSuccess("新增成功");
-              open.value = false;
-              getList();
-            }).catch(() =>{
-                open.value = false;
-                proxy.$modal.msgError("新增失败");
-            });
-          }
-        }
-      });
-    }
-
-    /** 取消按钮 */
-    function cancel() {
-      open.value = false;
-      reset();
-    }
-    
-    /** 表单重置 */
-    function reset() {
-      form.value = {
-            userName: '',
-            nickName: '',
-            headImg:undefined,
-            userType:undefined,
-            contact:'',
-            email:'',
-      };
-      proxy.resetForm("userRef");
-    }
-
-    /**
-      * 设置角色相关
-      */
-    
-    //获取用户角色列表
-    const open1 = ref(false)
-    const roleCheckedList = ref([])
-    const roleSelectList = ref()
-
-    //获取用户角色列表
-    const getUserRole = async() =>{
-      await role().search({limit:100,page:1}).then((res) =>{
-        roleSelectList.value = res.data.list
-        })
-    }
-    //绑定按钮
-    const userId = ref()
-    async function handleRole(row){
-      open1.value = true
-      userId.value = row.id
-      await getUserRole()
-      await getBandedRoleList(userId.value)
-    }
-    //获取已绑定角色列表
-    async function getBandedRoleList(id){
-      await user().getListRoleAdmin(id).then((res) =>{
-        if(res.code == 200){
-          let list = []
-         res.data.forEach((item) =>{
-          list.push(item.id)
-          })
-          roleCheckedList.value = list
-          console.log(123,res)
-        }
-      })
-    }
-    //绑定请求
-    async function bandListConfirm(){
-      let postParam = {
-        id:userId.value,
-        listRole:roleCheckedList.value
-      }
-      // console.log('roleCheckedList',roleCheckedList.value,id)
-      await user().setListRoleAdmin(postParam).then((res) =>{
-        if(res.code == 200){
-          proxy.$modal.msgSuccess("绑定成功");
-          open1.value = false;
-        }
-      })
-    }
-    getUserType()
-    getList();
-    </script>
-    <style lang="scss" scoped>
-    .table-headImg{
-        max-width: 100px;
-        height: 50px;
-    }
-    .el-dialog{
-        width:50vw;
-        .user-form{
-            display: flex;
-            flex-wrap: wrap;
-            justify-content:flex-start;
-            align-items: center;
-            margin: 20px auto;
-            width: 90%;
-            .el-form-item{
-                width: 45%;
+            if (form.value.id != undefined) {
+                user().modify(form.value).then(res => {
+                    proxy.$modal.msgSuccess("修改成功");
+                    open.value = false;
+                    getList();
+                }).catch(() => {
+                    open.value = false;
+                    proxy.$modal.msgError("修改失败");
+                });
+            } else {
+                user().create(form.value).then(res => {
+                    proxy.$modal.msgSuccess("新增成功");
+                    open.value = false;
+                    getList();
+                }).catch(() => {
+                    open.value = false;
+                    proxy.$modal.msgError("新增失败");
+                });
             }
         }
+    });
+}
+
+/** 取消按钮 */
+function cancel() {
+    open.value = false;
+    reset();
+}
+
+/** 表单重置 */
+function reset() {
+    form.value = {
+        userName: '',
+        nickName: '',
+        headImg: undefined,
+        userType: undefined,
+        contact: '',
+        email: '',
+    };
+    proxy.resetForm("userRef");
+}
+
+/**
+ * 设置角色相关
+ */
+
+    //获取用户角色列表
+const open1 = ref(false)
+const roleCheckedList = ref([])
+const roleSelectList = ref()
+
+//获取用户角色列表
+const getUserRole = async () => {
+    await role().search({limit: 100, page: 1}).then((res) => {
+        roleSelectList.value = res.data.list
+    })
+}
+//绑定按钮
+const userId = ref()
+
+async function handleRole(row) {
+    open1.value = true
+    userId.value = row.id
+    await getUserRole()
+    await getBandedRoleList(userId.value)
+}
+
+//获取已绑定角色列表
+async function getBandedRoleList(id) {
+    await user().getListRoleAdmin(id).then((res) => {
+        if (res.code == 200) {
+            let list = []
+            res.data.forEach((item) => {
+                list.push(item.id)
+            })
+            roleCheckedList.value = list
+            console.log(123, res)
+        }
+    })
+}
+
+//绑定请求
+async function bandListConfirm() {
+    let postParam = {
+        id: userId.value,
+        listRole: roleCheckedList.value
     }
-    .bandCheck{
-      width:100%;
-      /* background-color: beige; */
-      display: flex;
-      justify-content: center;
-      align-items: center;
-      margin-bottom:100px;
+    // console.log('roleCheckedList',roleCheckedList.value,id)
+    await user().setListRoleAdmin(postParam).then((res) => {
+        if (res.code == 200) {
+            proxy.$modal.msgSuccess("绑定成功");
+            open1.value = false;
+        }
+    })
+}
+
+getUserType()
+getList();
+</script>
+<style lang="scss" scoped>
+.table-headImg {
+    max-width: 100px;
+    height: 50px;
+}
+
+.el-dialog {
+    width: 50vw;
+
+    .user-form {
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: flex-start;
+        align-items: center;
+        margin: 20px auto;
+        width: 90%;
+
+        .el-form-item {
+            width: 45%;
+        }
     }
-    .handleBtn{
-      width:100%;
-      /* background-color: beige; */
-      display: flex;
-      justify-content: center;
-      align-items: center;
-      .el-button{
-        width:100px;
-      }
+}
+
+.bandCheck {
+    width: 100%;
+    /* background-color: beige; */
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin-bottom: 100px;
+}
+
+.handleBtn {
+    width: 100%;
+    /* background-color: beige; */
+    display: flex;
+    justify-content: center;
+    align-items: center;
+
+    .el-button {
+        width: 100px;
     }
-    </style>
+}
+</style>
     
\ No newline at end of file

--
Gitblit v1.9.3