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