4 Commits

Author SHA1 Message Date
aixianling
95689baff9 feat(AppAccountConfigManage): 优化认证材料对话框样式和功能- 调整对话框宽度为 50vw,使界面更加响应式
- 为删除按钮添加 v-if 指令,仅在没有子节点时显示
- 为删除按钮添加 del 类,以应用特定样式
- 在 utils.js 中添加 $isEmpty函数,用于检查对象是否为空
2025-01-07 10:17:59 +08:00
aixianling
d39650eca5 feat(authList): 添加搜索功能并优化表格数据获取
- 移除了未使用的 AiSelect 组件导入
- 新增了 search 属性的监听器,实现深度监听- 当搜索条件变化时,自动重置页码并重新获取表格数据
2025-01-07 10:05:34 +08:00
aixianling
4f44f50db5 refactor(AppAccountManage): 优化账号删除功能
- 修改 handleDelete 方法,使其接收 row 参数
- 根据账号认证和配置状态,动态显示删除确认提示
- 提升用户体验,减少误操作风险
2025-01-07 10:04:23 +08:00
aixianling
27a2052241 feat(AppAccountManage): 重置密码功能并优化账号管理页面- 在操作列中添加重置密码按钮
- 优化表格列配置,提高可读性
- 调整表单字段名称,提高用户体验
- 移除不必要的密码输入框
2025-01-07 09:55:05 +08:00
4 changed files with 62 additions and 32 deletions

View File

@@ -100,7 +100,7 @@ export default {
</template> </template>
</el-table-column> </el-table-column>
</ai-table> </ai-table>
<ai-dialog v-model="dialog" title="认证材料" width="500px" @close="userId=''" <ai-dialog v-model="dialog" title="认证材料" width="50vw" @close="userId=''"
@open="getTreeData" customFooter> @open="getTreeData" customFooter>
<el-button class="mar-b8" type="primary" @click="createNode(treeData)">新增根节点</el-button> <el-button class="mar-b8" type="primary" @click="createNode(treeData)">新增根节点</el-button>
<el-tree :data="treeData" :props="{label:'name'}" default-expand-all> <el-tree :data="treeData" :props="{label:'name'}" default-expand-all>
@@ -108,7 +108,7 @@ export default {
<div class="flex" style="width: 100%"> <div class="flex" style="width: 100%">
<span class="fill" v-text="node.label"/> <span class="fill" v-text="node.label"/>
<el-button size="mini" type="text" @click="createNode(data)">增加子节点</el-button> <el-button size="mini" type="text" @click="createNode(data)">增加子节点</el-button>
<el-button size="mini" type="text" @click="handleDelete(data)">删除</el-button> <el-button size="mini" type="text" @click="handleDelete(data)" v-if="$isEmpty(data.children)" class="del">删除</el-button>
</div> </div>
</template> </template>
</el-tree> </el-tree>
@@ -120,5 +120,9 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.AppAccountConfigManage { .AppAccountConfigManage {
height: 100%; height: 100%;
.el-button .del {
color: #f46;
}
} }
</style> </style>

View File

@@ -22,12 +22,13 @@
<div>{{ row.name }}</div> <div>{{ row.name }}</div>
</el-row> </el-row>
</el-table-column> </el-table-column>
<el-table-column slot="options" align="center" label="操作" fixed="right" width="180px"> <el-table-column slot="options" align="center" label="操作" fixed="right" width="220px">
<template slot-scope="{ row }"> <template slot-scope="{ row }">
<div class="table-options"> <div class="table-options">
<el-button type="text" @click="changeEnable(row)">{{ row.status == 1 ? '禁用' : '启用' }}</el-button> <el-button type="text" @click="changeEnable(row)">{{ row.status == 1 ? '禁用' : '启用' }}</el-button>
<el-button type="text" @click="appAllot(row)">编辑</el-button> <el-button type="text" @click="appAllot(row)">编辑</el-button>
<el-button type="text" @click="handleDelete(row.id)">删除</el-button> <el-button type="text" @click="resetPassword(row.id)">重置密码</el-button>
<el-button type="text" @click="handleDelete(row)">删除</el-button>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@@ -40,12 +41,12 @@
<el-form-item required label="行政区划" prop="areaId"> <el-form-item required label="行政区划" prop="areaId">
<ai-area-get v-model.trim="dialogForm.areaId" placeholder="请选择" :instance="instance"/> <ai-area-get v-model.trim="dialogForm.areaId" placeholder="请选择" :instance="instance"/>
</el-form-item> </el-form-item>
<el-form-item required label="账户" prop="username"> <el-form-item required label="账户" prop="userName">
<el-input v-model.trim="dialogForm.username" placeholder="请输入..." clearable :maxLength="15"/> <el-input v-model.trim="dialogForm.userName" placeholder="请输入..." clearable :maxLength="15"/>
</el-form-item>
<el-form-item required label="账号密码" prop="password" v-if="!isEdit" :rules="[{ required: true, message: '请输入密码' }]">
<el-input v-model.trim="dialogForm.password" placeholder="请输入密码" clearable :minlength="6"/>
</el-form-item> </el-form-item>
<!-- <el-form-item required label="账号密码" prop="password" v-if="!isEdit" :rules="[{ required: true, message: '请输入密码' }]">-->
<!-- <el-input v-model.trim="dialogForm.password" placeholder="请输入密码" clearable :minlength="6"/>-->
<!-- </el-form-item>-->
<el-form-item required label="角色" prop="roleId"> <el-form-item required label="角色" prop="roleId">
<el-select placeholder="请选择角色" :value="dialogForm.roleId" filterable v-model="dialogForm.roleId" clearable> <el-select placeholder="请选择角色" :value="dialogForm.roleId" filterable v-model="dialogForm.roleId" clearable>
<el-option v-for="(op, i) in accountRoles" :key="i" :label="op.name" :value="op.id"/> <el-option v-for="(op, i) in accountRoles" :key="i" :label="op.name" :value="op.id"/>
@@ -91,19 +92,18 @@ export default {
colConfigs() { colConfigs() {
return [ return [
// {type: 'selection', align: 'center'}, // {type: 'selection', align: 'center'},
{label: "账号", slot: "username"}, {label: "账号", prop: "userName"},
{label: "姓名", slot: "name"}, {label: "姓名", slot: "name"},
{label: "联系方式", prop: "phone", align: 'center'}, {label: "联系方式", prop: "phone", align: 'center'},
{label: "角色", prop: "roleName", align: 'center'}, {label: "角色", prop: "roleName", align: 'center'},
{label: "状态", prop: "status", align: 'center', dict: "enable"}, {label: "状态", prop: "status", align: 'center', dict: "enable"},
{label: "认证状态", prop: "authStatus", align: 'center', dict: "authStatus"}, {label: "认证状态", prop: "authStatus", align: 'center', dict: "authStatus"},
{label: "配置状态", prop: "configStatus", align: 'center', dict: "configStatus"}, {label: "配置状态", prop: "configStatus", align: 'center', dict: "configStatus"},
{slot: "options"}
] ]
}, },
rules() { rules() {
return { return {
username: [{required: true, message: "请输入账号"}], userName: [{required: true, message: "请输入账号"}],
name: [{required: true, message: "请输入姓名"}], name: [{required: true, message: "请输入姓名"}],
password: [{required: true, message: '请输入密码'}], password: [{required: true, message: '请输入密码'}],
areaId: [{required: true, message: "请选择行政区划"}], areaId: [{required: true, message: "请选择行政区划"}],
@@ -193,8 +193,13 @@ export default {
} }
}) })
}, },
handleDelete(ids) { handleDelete(row) {
this.$confirm("是否要删除该账号?").then(() => { const {id: ids, authStatus, configStatus} = row
let text = "是否要删除该账号?"
if (authStatus == 1) {
text = configStatus == 1 ? "该账户已经认证,是否确认删除该账户?" : "该账户已经认证及配置,是否确认删除该账户?"
}
this.$confirm(text).then(() => {
this.instance.post("/admin/user/del", null, { this.instance.post("/admin/user/del", null, {
params: {ids} params: {ids}
}).then(res => { }).then(res => {
@@ -215,6 +220,16 @@ export default {
} }
}) })
}) })
},
resetPassword(id) {
this.$confirm("是否要重置密码?").then(() => {
this.instance.post("/api/user/resetPwd", null, {params: {id}}).then(res => {
if (res?.code == 0) {
this.$message.success("重置成功!")
this.getTableData()
}
})
})
} }
}, },
created() { created() {

View File

@@ -1,7 +1,4 @@
<script> <script>
import AiSelect from "dui/packages/basic/AiSelect.vue";
const columns = [ const columns = [
{label: "序号", type: "index"}, {label: "序号", type: "index"},
{label: "账号", prop: "userName"}, {label: "账号", prop: "userName"},
@@ -13,7 +10,6 @@ const columns = [
] ]
export default { export default {
name: "authList", name: "authList",
components: {AiSelect},
props: { props: {
instance: Function, instance: Function,
dict: Object, dict: Object,
@@ -29,6 +25,15 @@ export default {
form: {} form: {}
} }
}, },
watch: {
search: {
deep: true,
handler() {
this.page.pageNum = 1
this.getTableData()
}
}
},
methods: { methods: {
getTableData() { getTableData() {
this.instance.post("/api/user/auth/page", null, { this.instance.post("/api/user/auth/page", null, {

View File

@@ -15,12 +15,12 @@ import $reg from "./regular"
*/ */
const addChild = (parent, pending, config) => { const addChild = (parent, pending, config) => {
let conf = { let conf = {
key: 'id', key: 'id',
parent: 'parentId', parent: 'parentId',
children: 'children', children: 'children',
...config ...config
}, },
doBeforeCount = pending.length doBeforeCount = pending.length
for (let i = pending.length - 1; i >= 0; i--) { for (let i = pending.length - 1; i >= 0; i--) {
let e = pending[i] let e = pending[i]
if (e[conf.parent] == parent[conf.key]) { if (e[conf.parent] == parent[conf.key]) {
@@ -58,7 +58,7 @@ const $decimalCalc = (...arr) => {
return ('' + e).length - index return ('' + e).length - index
}) })
let maxDecimal = Math.max(...decimalLengthes), let maxDecimal = Math.max(...decimalLengthes),
precision = Math.pow(10, maxDecimal) precision = Math.pow(10, maxDecimal)
// 计算 // 计算
let intArr = arr.map(e => (Number(e) || 0) * precision) let intArr = arr.map(e => (Number(e) || 0) * precision)
// 返回计算值 // 返回计算值
@@ -86,10 +86,10 @@ const $colorUtils = {
if (color.length == 4) { if (color.length == 4) {
// 检测诸如#FFF简写格式 // 检测诸如#FFF简写格式
color = color =
'#' + '#' +
color.charAt(1).repeat(2) + color.charAt(1).repeat(2) +
color.charAt(2).repeat(2) + color.charAt(2).repeat(2) +
color.charAt(3).repeat(2) color.charAt(3).repeat(2)
} }
hex = parseInt(color.slice(1), 16) hex = parseInt(color.slice(1), 16)
} }
@@ -170,8 +170,8 @@ export default {
}, },
$dateFormat: (time, format) => { $dateFormat: (time, format) => {
return $moment(time) return $moment(time)
.format(format || 'YYYY-MM-DD') .format(format || 'YYYY-MM-DD')
.replace('Invalid Date', '') .replace('Invalid Date', '')
}, },
$copy, $copy,
$download: (url, name) => { $download: (url, name) => {
@@ -190,7 +190,7 @@ export default {
$arr2tree: (list, config = {}) => { $arr2tree: (list, config = {}) => {
let result = [] let result = []
const {key = 'id', parent = 'parentId', children = 'children'} = config, itemMap = {}, const {key = 'id', parent = 'parentId', children = 'children'} = config, itemMap = {},
ids = list?.map(e => `#${e[key]}#`)?.toString() ids = list?.map(e => `#${e[key]}#`)?.toString()
for (const e of list) { for (const e of list) {
const id = e[key], pid = e[parent] const id = e[key], pid = e[parent]
itemMap[id] = {...e, [children]: [itemMap[id]?.[children]].flat().filter(Boolean)} itemMap[id] = {...e, [children]: [itemMap[id]?.[children]].flat().filter(Boolean)}
@@ -230,5 +230,11 @@ export default {
} }
return max return max
} else return 0 } else return 0
},
$isEmpty(obj) {
if (obj === null || obj === undefined) return true;
if (typeof obj === 'string' && obj.trim() === '') return true;
if (Array.isArray(obj) && obj.length === 0) return true;
return typeof obj === 'object' && Object.keys(obj).length === 0;
} }
} }