mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 07:03:53 +08:00
@@ -104,4 +104,21 @@ export default {
|
||||
})
|
||||
.send();
|
||||
},
|
||||
// 修改用户状态
|
||||
changeUserStatus(status, userIds, successCallback) {
|
||||
return RequestService.sendRequest()
|
||||
.url(`${getServiceUrl()}/admin/users/changeStatus/${status}`)
|
||||
.method('put')
|
||||
.data(userIds)
|
||||
.success((res) => {
|
||||
RequestService.clearRequestTime()
|
||||
successCallback(res);
|
||||
})
|
||||
.fail((err) => {
|
||||
console.error('修改用户状态失败:', err)
|
||||
RequestService.reAjaxFun(() => {
|
||||
this.changeUserStatus(status, userIds)
|
||||
})
|
||||
}).send()
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1,43 +1,44 @@
|
||||
<template>
|
||||
<form>
|
||||
<el-dialog :visible.sync="value" width="400px" center>
|
||||
<div style="margin: 0 10px 10px;display: flex;align-items: center;gap: 10px;font-weight: 700;font-size: 20px;text-align: left;color: #3d4566;">
|
||||
<div style="width: 40px;height: 40px;border-radius: 50%;background: #5778ff;display: flex;align-items: center;justify-content: center;">
|
||||
<img loading="lazy" src="@/assets/login/shield.png" alt="" style="width: 19px;height: 23px; filter: brightness(0) invert(1);" />
|
||||
<div
|
||||
style="margin: 0 10px 10px;display: flex;align-items: center;gap: 10px;font-weight: 700;font-size: 20px;text-align: left;color: #3d4566;">
|
||||
<div
|
||||
style="width: 40px;height: 40px;border-radius: 50%;background: #5778ff;display: flex;align-items: center;justify-content: center;">
|
||||
<img loading="lazy" src="@/assets/login/shield.png" alt=""
|
||||
style="width: 19px;height: 23px; filter: brightness(0) invert(1);" />
|
||||
</div>
|
||||
修改密码
|
||||
</div>
|
||||
<div style="height: 1px;background: #e8f0ff;"/>
|
||||
<div style="height: 1px;background: #e8f0ff;" />
|
||||
<div style="margin: 22px 15px;">
|
||||
<div style="font-weight: 400;font-size: 14px;text-align: left;color: #3d4566;">
|
||||
<div style="color: red;display: inline-block;">*</div>
|
||||
旧密码:
|
||||
</div>
|
||||
<div class="input-46" style="margin-top: 12px;">
|
||||
<el-input placeholder="请输入旧密码" v-model="oldPassword" type="password" show-password/>
|
||||
<el-input placeholder="请输入旧密码" v-model="oldPassword" type="password" show-password />
|
||||
</div>
|
||||
<div style="font-weight: 400;font-size: 14px;text-align: left;color: #3d4566;margin-top: 12px;">
|
||||
<div style="color: red;display: inline-block;">*</div>
|
||||
新密码:
|
||||
</div>
|
||||
<div class="input-46" style="margin-top: 12px;">
|
||||
<el-input placeholder="请输入新密码" v-model="newPassword" type="password" show-password/>
|
||||
<el-input placeholder="请输入新密码" v-model="newPassword" type="password" show-password />
|
||||
</div>
|
||||
<div style="font-weight: 400;font-size: 14px;text-align: left;color: #3d4566;margin-top: 12px;">
|
||||
<div style="color: red;display: inline-block;">*</div>
|
||||
确认新密码:
|
||||
</div>
|
||||
<div class="input-46" style="margin-top: 12px;">
|
||||
<el-input placeholder="请再次输入新密码" v-model="confirmNewPassword" type="password" show-password/>
|
||||
<el-input placeholder="请再次输入新密码" v-model="confirmNewPassword" type="password" show-password />
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex;margin: 15px 15px;gap: 7px;">
|
||||
<div class="dialog-btn" @click="confirm">
|
||||
确定
|
||||
</div>
|
||||
<div class="dialog-btn"
|
||||
style="background: #e6ebff;border: 1px solid #adbdff;color: #5778ff;"
|
||||
@click="cancel">
|
||||
<div class="dialog-btn" style="background: #e6ebff;border: 1px solid #adbdff;color: #5778ff;" @click="cancel">
|
||||
取消
|
||||
</div>
|
||||
</div>
|
||||
@@ -83,12 +84,15 @@ export default {
|
||||
// 修改后的接口调用
|
||||
userApi.changePassword(this.oldPassword, this.newPassword, (res) => {
|
||||
if (res.data.code === 0) {
|
||||
this.$message.success('密码修改成功,请重新登录');
|
||||
this.$message.success({
|
||||
message: '密码修改成功,请重新登录',
|
||||
showClose: true
|
||||
});
|
||||
this.logout().then(() => {
|
||||
this.$router.push('/login');
|
||||
this.$emit('update:visible', false);
|
||||
});
|
||||
}else{
|
||||
} else {
|
||||
this.$message.error(res.data.msg || '密码修改失败');
|
||||
}
|
||||
}, (err) => {
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
<!-- 右侧元素 -->
|
||||
<div class="header-right">
|
||||
<div class="search-container">
|
||||
<div class="search-container" v-if="$route.path === '/home'">
|
||||
<el-input v-model="search" placeholder="输入名称搜索.." class="custom-search-input"
|
||||
@keyup.enter.native="handleSearch">
|
||||
<i slot="suffix" class="el-icon-search search-icon" @click="handleSearch"></i>
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
<template>
|
||||
<el-dialog :visible.sync="visible" width="400px" center>
|
||||
<div style="margin: 0 10px 10px;display: flex;align-items: center;gap: 10px;font-weight: 700;font-size: 20px;text-align: left;color: #3d4566;">
|
||||
<div style="width: 40px;height: 40px;border-radius: 50%;background: #5778ff;display: flex;align-items: center;justify-content: center;">
|
||||
<img src="@/assets/login/shield.png" alt="" style="width: 19px;height: 23px; filter: brightness(0) invert(1);" />
|
||||
<div
|
||||
style="margin: 0 10px 10px;display: flex;align-items: center;gap: 10px;font-weight: 700;font-size: 20px;text-align: left;color: #3d4566;">
|
||||
<div
|
||||
style="width: 40px;height: 40px;border-radius: 50%;background: #5778ff;display: flex;align-items: center;justify-content: center;">
|
||||
<img src="@/assets/login/shield.png" alt=""
|
||||
style="width: 19px;height: 23px; filter: brightness(0) invert(1);" />
|
||||
</div>
|
||||
用户新密码
|
||||
</div>
|
||||
@@ -13,27 +16,15 @@
|
||||
用户新密码:
|
||||
</div>
|
||||
<div class="input-46" style="margin-top: 12px;">
|
||||
<el-input
|
||||
v-model="password"
|
||||
type="text"
|
||||
:readonly="true"
|
||||
style="font-weight: bold; color: #333;"
|
||||
/>
|
||||
<el-input v-model="password" type="text" :readonly="true" style="font-weight: bold; color: #333;" />
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex;margin: 15px 15px;gap: 7px;">
|
||||
<div
|
||||
class="dialog-btn"
|
||||
style="background: #e6ebff;border: 1px solid #adbdff;color: #5778ff;"
|
||||
@click="closeDialog"
|
||||
>
|
||||
<div class="dialog-btn" style="background: #e6ebff;border: 1px solid #adbdff;color: #5778ff;"
|
||||
@click="closeDialog">
|
||||
关闭
|
||||
</div>
|
||||
<div
|
||||
class="dialog-btn"
|
||||
style="background: #5778ff;color: white;"
|
||||
@click="copyPassword"
|
||||
>
|
||||
<div class="dialog-btn" style="background: #5778ff;color: white;" @click="copyPassword">
|
||||
复制密码
|
||||
</div>
|
||||
</div>
|
||||
@@ -53,7 +44,10 @@ export default {
|
||||
},
|
||||
copyPassword() {
|
||||
navigator.clipboard.writeText(this.password)
|
||||
this.$message.success('密码已复制')
|
||||
this.$message.success({
|
||||
message: '密码已复制',
|
||||
showClose: true
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
<div class="batch-actions">
|
||||
<el-button size="mini" @click="selectAll" style="width: 75px; background: #606ff3">{{ isAllSelected ?
|
||||
'取消全选' : '全选'
|
||||
}}</el-button>
|
||||
}}</el-button>
|
||||
<el-button size="mini" type="danger" icon="el-icon-delete" @click="batchDelete">
|
||||
删除
|
||||
</el-button>
|
||||
@@ -239,10 +239,16 @@ export default {
|
||||
|
||||
Promise.all(deletePromises).then(results => {
|
||||
if (results.every(Boolean)) {
|
||||
this.$message.success('批量删除成功')
|
||||
this.$message.success({
|
||||
message: '批量删除成功',
|
||||
showClose: true
|
||||
})
|
||||
this.loadData()
|
||||
} else {
|
||||
this.$message.error('部分删除失败')
|
||||
this.$message.error({
|
||||
message: '部分删除失败',
|
||||
showClose: true
|
||||
})
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
@@ -269,10 +275,16 @@ export default {
|
||||
model.id,
|
||||
({ data }) => {
|
||||
if (data.code === 0) {
|
||||
this.$message.success('删除成功')
|
||||
this.$message.success({
|
||||
message: '删除成功',
|
||||
showClose: true
|
||||
})
|
||||
this.loadData()
|
||||
} else {
|
||||
this.$message.error(data.msg || '删除失败')
|
||||
this.$message.error({
|
||||
message: data.msg || '删除失败',
|
||||
showClose: true
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
@@ -325,10 +337,16 @@ export default {
|
||||
|
||||
Api.model.addModel(params, ({ data }) => {
|
||||
if (data.code === 0) {
|
||||
this.$message.success('新增成功');
|
||||
this.$message.success({
|
||||
message: '新增成功',
|
||||
showClose: true
|
||||
});
|
||||
this.loadData();
|
||||
} else {
|
||||
this.$message.error(data.msg || '新增失败');
|
||||
this.$message.error({
|
||||
message: data.msg || '新增失败',
|
||||
showClose: true
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
@@ -21,14 +21,19 @@
|
||||
<el-table-column label="用户Id" prop="userid" align="center"></el-table-column>
|
||||
<el-table-column label="手机号码" prop="mobile" align="center"></el-table-column>
|
||||
<el-table-column label="设备数量" prop="deviceCount" align="center"></el-table-column>
|
||||
<el-table-column label="状态" prop="status" align="center"></el-table-column>
|
||||
<el-table-column label="状态" prop="status" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.status === 1" type="success">正常</el-tag>
|
||||
<el-tag v-else type="danger">禁用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="text" @click="resetPassword(scope.row)">重置密码</el-button>
|
||||
<el-button size="mini" type="text" v-if="scope.row.status === '正常'"
|
||||
@click="disableUser(scope.row)">禁用账户</el-button>
|
||||
<el-button size="mini" type="text" v-if="scope.row.status === '禁用'"
|
||||
@click="restoreUser(scope.row)">恢复账号</el-button>
|
||||
<el-button size="mini" type="text" v-if="scope.row.status === 1"
|
||||
@click="handleChangeStatus(scope.row, 0)">禁用账户</el-button>
|
||||
<el-button size="mini" type="text" v-if="scope.row.status === 0"
|
||||
@click="handleChangeStatus(scope.row, 1)">恢复账号</el-button>
|
||||
<el-button size="mini" type="text" @click="deleteUser(scope.row)">删除用户</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -49,7 +54,6 @@
|
||||
<button class="pagination-btn" :disabled="currentPage === 1" @click="goPrev">
|
||||
上一页
|
||||
</button>
|
||||
|
||||
<button v-for="page in visiblePages" :key="page" class="pagination-btn"
|
||||
:class="{ active: page === currentPage }" @click="goToPage(page)">
|
||||
{{ page }}
|
||||
@@ -120,10 +124,7 @@ export default {
|
||||
},
|
||||
({ data }) => {
|
||||
if (data.code === 0) {
|
||||
this.userList = data.data.list.map((user) => ({
|
||||
...user,
|
||||
status: user.status === "1" ? "正常" : "禁用",
|
||||
}));
|
||||
this.userList = data.data.list
|
||||
this.total = data.data.total;
|
||||
}
|
||||
}
|
||||
@@ -175,9 +176,15 @@ export default {
|
||||
const failCount = results.length - successCount;
|
||||
|
||||
if (failCount === 0) {
|
||||
this.$message.success(`成功删除${successCount}个用户`);
|
||||
this.$message.success({
|
||||
message: `成功删除${successCount}个用户`,
|
||||
showClose: true
|
||||
});
|
||||
} else if (successCount === 0) {
|
||||
this.$message.error(`删除失败,请重试`);
|
||||
this.$message.error({
|
||||
message: '删除失败,请重试',
|
||||
showClose: true
|
||||
});
|
||||
} else {
|
||||
this.$message.warning(
|
||||
`成功删除${successCount}个用户,${failCount}个删除失败`
|
||||
@@ -201,16 +208,15 @@ export default {
|
||||
this.$message.warning("请先选择需要启用的用户");
|
||||
return;
|
||||
}
|
||||
selectedUsers.forEach((user) => {
|
||||
user.status = "正常";
|
||||
});
|
||||
this.$message.success("启用操作成功");
|
||||
this.handleChangeStatus(selectedUsers, 1);
|
||||
},
|
||||
batchDisable() {
|
||||
this.userList.forEach((user) => {
|
||||
user.status = "禁用";
|
||||
});
|
||||
this.$message.success("状态已更新为禁用");
|
||||
const selectedUsers = this.$refs.userTable.selection;
|
||||
if (selectedUsers.length === 0) {
|
||||
this.$message.warning("请先选择需要禁用的用户");
|
||||
return;
|
||||
}
|
||||
this.handleChangeStatus(selectedUsers, 0);
|
||||
},
|
||||
resetPassword(row) {
|
||||
this.$confirm("重置后将会生成新密码,是否继续?", "提示", {
|
||||
@@ -221,17 +227,14 @@ export default {
|
||||
if (data.code === 0) {
|
||||
this.currentPassword = data.data;
|
||||
this.showViewPassword = true;
|
||||
this.$message.success("密码已重置,请通知用户使用新密码登录");
|
||||
this.$message.success({
|
||||
message: "密码已重置,请通知用户使用新密码登录",
|
||||
showClose: true
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
disableUser(row) {
|
||||
row.status = "禁用";
|
||||
},
|
||||
restoreUser(row) {
|
||||
row.status = "正常";
|
||||
},
|
||||
deleteUser(row) {
|
||||
this.$confirm("确定要删除该用户吗?", "警告", {
|
||||
confirmButtonText: "确定",
|
||||
@@ -241,10 +244,16 @@ export default {
|
||||
.then(() => {
|
||||
Api.admin.deleteUser(row.userid, ({ data }) => {
|
||||
if (data.code === 0) {
|
||||
this.$message.success("删除成功");
|
||||
this.$message.success({
|
||||
message: "删除成功",
|
||||
showClose: true
|
||||
});
|
||||
this.fetchUsers();
|
||||
} else {
|
||||
this.$message.error(data.msg || "删除失败");
|
||||
this.$message.error({
|
||||
message: data.msg || "删除失败",
|
||||
showClose: true
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
@@ -276,6 +285,41 @@ export default {
|
||||
this.currentPage = page;
|
||||
this.fetchUsers();
|
||||
},
|
||||
handleChangeStatus(row, status) {
|
||||
// 处理单个用户或用户数组
|
||||
const users = Array.isArray(row) ? row : [row];
|
||||
const confirmText = status === 0 ? '禁用' : '启用';
|
||||
const userCount = users.length;
|
||||
|
||||
this.$confirm(`确定要${confirmText}选中的${userCount}个用户吗?`, '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
const userIds = users.map(user => Number(user.userid));
|
||||
if (userIds.some(id => isNaN(id))) {
|
||||
this.$message.error('存在无效的用户ID');
|
||||
return;
|
||||
}
|
||||
|
||||
Api.user.changeUserStatus(status, userIds, ({ data }) => {
|
||||
if (data.code === 0) {
|
||||
this.$message.success({
|
||||
message: `成功${confirmText}${userCount}个用户`,
|
||||
showClose: true
|
||||
});
|
||||
this.fetchUsers(); // 刷新用户列表
|
||||
} else {
|
||||
this.$message.error({
|
||||
message: '操作失败,请重试',
|
||||
showClose: true
|
||||
});
|
||||
}
|
||||
});
|
||||
}).catch(() => {
|
||||
// 用户取消操作
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -148,9 +148,15 @@ export default {
|
||||
};
|
||||
Api.agent.updateAgentConfig(this.$route.query.agentId, configData, ({ data }) => {
|
||||
if (data.code === 0) {
|
||||
this.$message.success('配置保存成功');
|
||||
this.$message.success({
|
||||
message: '配置保存成功',
|
||||
showClose: true
|
||||
});
|
||||
} else {
|
||||
this.$message.error(data.msg || '配置保存失败');
|
||||
this.$message.error({
|
||||
message: data.msg || '配置保存失败',
|
||||
showClose: true
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -178,7 +184,10 @@ export default {
|
||||
intentModelId: "",
|
||||
}
|
||||
}
|
||||
this.$message.success('配置已重置')
|
||||
this.$message.success({
|
||||
message: '配置已重置',
|
||||
showClose: true
|
||||
})
|
||||
}).catch(() => {
|
||||
})
|
||||
},
|
||||
@@ -196,9 +205,15 @@ export default {
|
||||
this.loadingTemplate = true;
|
||||
try {
|
||||
this.applyTemplateData(template);
|
||||
this.$message.success(`「${template.agentName}」模板已应用`);
|
||||
this.$message.success({
|
||||
message: `「${template.agentName}」模板已应用`,
|
||||
showClose: true
|
||||
});
|
||||
} catch (error) {
|
||||
this.$message.error('应用模板失败');
|
||||
this.$message.error({
|
||||
message: '应用模板失败',
|
||||
showClose: true
|
||||
});
|
||||
console.error('应用模板失败:', error);
|
||||
} finally {
|
||||
this.loadingTemplate = false;
|
||||
|
||||
Reference in New Issue
Block a user