Browse Source

refactor(i18n): 优化国际化相关代码和翻译内容

重构活动状态显示逻辑,使用统一方法处理状态文本
添加并完善中英文翻译内容,包括权限管理和语言翻译模块
修复正则表达式中的转义字符问题
更新角色权限和语言翻译界面的国际化处理
milestone-20251209-多语言二期^2
zhangrenyuan 1 month ago
parent
commit
35db67394f
  1. 132
      src/components/locales/lang/en.js
  2. 138
      src/components/locales/lang/zh-CN.js
  3. 14
      src/views/activityManage/activity.vue
  4. 120
      src/views/language/languageTranslate.vue
  5. 120
      src/views/permissions/rolePermission.vue
  6. 271
      src/views/permissions/userPermission.vue

132
src/components/locales/lang/en.js

@ -7,6 +7,8 @@ export default {
common: {
// Filters
name: 'Name',
account: 'OA Account',
accountPlaceholder: 'Please enter OA account',
jwcode: 'Homily ID',
jwcodePlaceholder: 'Please enter Homily ID',
activityName: 'Activity',
@ -19,6 +21,10 @@ export default {
refundTypePlaceholder: 'Select refund type',
market: 'Region',
marketPlaceholder: 'Select region',
position: 'Position',
positionPlaceholder: 'Select position',
roleName: 'Role Name',
roleNamePlaceholder: 'Please enter role name',
consumePlatform: 'Consumption Platform',
consumePlatformPlaceholder: 'Select consumption platform',
rechargePlatform: 'Recharge Platform',
@ -41,18 +47,32 @@ export default {
// Buttons
search: 'Query',
searchLabel: 'Search',
searchPlaceholder: 'Enter keywords',
searchButton: 'Search',
exportExcel: 'Export Excel',
viewExportList: 'View Export List',
reset: 'Reset',
edit: 'Edit',
editPermission: 'Edit Permission',
resetPassword: 'Reset Password',
delete: 'Delete',
pass: 'Approve',
reject: 'Reject',
cancel: 'Cancel',
confirm: 'Confirm',
submit: 'Submit',
add: 'Add',
addUser: 'Add User',
addRole: 'Add Role',
save: 'Save',
saving: 'Saving...',
addActivity: 'Add Activity',
addReceive: 'Add Receive',
confirmRecharge: 'Confirm Recharge',
batchImport: 'Batch Import',
import: 'Import',
uploadHint: 'Drag file here or click to upload',
// Buttons - Date
today: 'Today',
@ -79,15 +99,35 @@ export default {
// Dialog Titles
will: 'Will ',
deleteRecord: 'Delete Record!',
deleteTranslationRecord: 'Delete this translation record',
deleteActivityRecord: 'Delete this activity record',
noData: 'No data'
,
all: 'All'
},
// Permission module
permission: {
warning: 'Warning',
user: 'this user',
changeRoleConfirmContent1: 'Confirm role change?<br>You are changing the role of [',
changeRoleConfirmContent2: '] from [',
changeRoleConfirmContent3: '] to [',
changeRoleConfirmContent4: ']<br>After the change, the user’s permissions will be updated to the new role configuration, including data access and functional operations. Please confirm carefully.',
changeRoleSuccessContent1: 'User ',
changeRoleSuccessContent2: ' role has been changed to [',
roleRegionNote: 'This region setting has no practical effect; it is only for branch managers to view roles by region.'
},
// Message Group
elmessage: {
// Common
addSuccess: 'Added successfully',
submitFailed: 'Submission failed',
searchSuccess: 'Search completed',
requestFailed: 'Request failed',
inNetworkError: 'Network error, please try again',
prompt: 'Prompt',
jwcodeError: 'Invalid Homily ID',
addFailedUnknown: 'Add failed due to an unknown error',
addFailed: 'Add failed. Please check your network or contact the administrator',
@ -155,6 +195,40 @@ export default {
rechargeFormatError: 'Recharge method format error. Please contact the administrator',
getRechargeError: 'Failed to obtain recharge methods. Please try again later',
deleteSuccess: 'Deleted successfully',
success: 'Success',
confirmDeleteUser: 'Are you sure you want to delete this user?',
resetPasswordConfirm: 'Confirm reset for this account password?',
resetPasswordDefault: 'After reset, the password will be: 123456. Please notify the user to change it.',
checkAccountFormat: 'Please check OA account format',
deviceLimitReached: 'Device count has reached the limit',
noParentRoleMarket: 'The selected parent role has no associated region',
roleAddSuccess: 'Role {roleName} added successfully',
enableSuccess: 'Enabled successfully',
disableSuccess: 'Disabled successfully',
inputRoleName: 'Please enter role name',
roleNameLengthLimit: 'Role name length should be 2–20 characters',
selectPermissionList: 'Please select permission list',
inputAccount: 'Please enter OA account',
onlyDigits: 'Must be digits',
lengthLimit20: 'Length must not exceed 20 characters',
inputUserName: 'Please enter user name',
inputPosition: 'Please enter position',
inputAtLeastOneMachineCode: 'Please enter at least one machine code',
roleNameDuplicate: 'Role name already exists',
resetPasswordSuccess: 'Password reset successful',
resetPasswordFailed: 'Password reset failed',
noPermissionResetMarket: 'You do not have permission to modify passwords for users in the {market} region',
// Import & Upload
importSuccess: 'Import successful',
importFailed: 'Import failed',
importFailedNetworkOrFormat: 'Import failed. Please check your network or file format',
onlyExcelAllowed: 'Only Excel files are allowed',
fileTooLarge5MB: 'File size cannot exceed 5MB',
fileSelectSuccess: 'File selected successfully',
uploadLimitOne: 'You can upload only one file',
selectFileFirst: 'Please select a file first',
// Plain text validation
onlyPlainText: 'Only plain text is supported; HTML is not allowed',
// Export
exportSuccess: 'Export successful',
@ -173,9 +247,24 @@ export default {
// Common List Fields
common_list: {
id: 'No.',
originalChinese: 'Original Chinese',
english: 'English',
thai: 'Thai',
chineseTraditional: 'Traditional Chinese',
malay: 'Malay',
vietnamese: 'Vietnamese',
translated: 'Translated',
untranslated: 'Untranslated',
account: 'OA Account',
name: 'Name',
jwcode: 'Homily ID',
market: 'Region',
position: 'Position',
roleName: 'Role Name',
rolePermission: 'Role Permission',
departmentPermission: 'Department Permission',
parentRole: 'Parent Role',
permissionScope: 'Permission Scope',
sumGold: 'Total Coins',
payPlatform: 'Platform',
type: 'Update Type',
@ -211,6 +300,16 @@ export default {
consumeTime: 'Consumption Time',
refundTime: 'Refund Time',
updateTime: 'Update Time',
activityStatus: {
notStarted: 'Not Started',
inProgress: 'In Progress',
ended: 'Ended',
},
operation: 'Operation',
configTime: 'Configuration Time',
status: 'Status',
enable: 'Enable',
disable: 'Disable',
},
// Common Export Fields
@ -227,6 +326,39 @@ export default {
// Add Form Fields
common_add: {
jwcode: 'Homily ID',
addUserPermission: 'Add User Permission',
editUserPermission: 'Edit User Permission',
account: 'OA Account',
accountPlaceholder: 'Please enter OA account',
userName: 'User Name',
userNamePlaceholder: 'Please enter user name',
roleName: 'Role Name',
roleNamePlaceholder: 'Please select role name',
parentRole: 'Parent Role',
noParentRole: 'No Parent Role',
permissionList: 'Permission List',
machineCode: 'Machine Code',
machineCodePlaceholder: 'Please enter machine code',
remark: 'Remark',
addRole: 'Add Role',
editRole: 'Edit Role',
permissionDetails: 'Permission Details',
channelName: 'Channel Name',
channelPlaceholder: 'Please select channel',
originalChinese: 'Original Chinese',
originalChinesePlaceholder: 'Enter original Chinese',
english: 'English',
englishPlaceholder: 'Enter English',
thai: 'Thai',
thaiPlaceholder: 'Enter Thai',
chineseTraditional: 'Traditional Chinese',
chineseTraditionalPlaceholder: 'Enter Traditional Chinese',
malay: 'Malay',
malayPlaceholder: 'Enter Malay',
vietnamese: 'Vietnamese',
vietnamesePlaceholder: 'Enter Vietnamese',
addTranslation: 'Add Translation',
editTranslation: 'Edit Translation',
activity: 'Activity',
activityPlaceholder: 'Please enter activity name',
businessBelong: 'Performance Belonging',

138
src/components/locales/lang/zh-CN.js

@ -15,12 +15,18 @@ export default {
activityNameChoose: "请选择活动方式",
goodsName: "商品名称",
goodsNamePlaceholder: "请输入商品名称",
account: "OA号",
accountPlaceholder: "请输入OA号",
payModel: "支付方式",
payModelPlaceholder: "请选择支付方式",
refundType: "退款类型",
refundTypePlaceholder: "请选择退款类型",
market: "所属地区",
marketPlaceholder: "请选择所属地区",
position: "职位名称",
positionPlaceholder: "请选择职位名称",
roleName: "角色名称",
roleNamePlaceholder: "请输入角色名称",
refundCurrency: "退款币种",
refundCurrencyPlaceholder: "请选择退款币种",
refundMethod: "退款途径",
@ -70,12 +76,18 @@ export default {
endTime: "结束时间",
// 按钮组
search: "查询",
searchLabel: "搜索",
searchPlaceholder: "请输入搜索内容",
searchButton: "查询",
exportExcel: "导出Excel",
viewExportList: "查看导出列表",
reset: "重置",
audit: "审核",
refund: "退款",
edit: "编辑",
editPermission: "修改权限",
resetPassword: "重置密码",
delete: "删除",
withdraw: "撤回",
pass: "通过",
close: "关闭",
@ -83,10 +95,18 @@ export default {
cancel: "取消",
confirm: "确认",
submit: "提交",
add: "添加",
addUser: "新增用户",
addRole: "新增角色",
save: "保存",
saving: "保存中...",
addActivity: "新增活动",
modify: "修改",
addReceive: "添加收款",
confirmRecharge: "确认充值",
batchImport: "批量导入",
import: "导入",
uploadHint: "将文件拖到此处,或点击上传",
pendingFee: "待填写手续费",
viewRejectReason: "查看驳回理由",
// 按钮组-日期
@ -127,19 +147,38 @@ export default {
// 对话框标题
will: "将要",
deleteRecord: "删除该翻译记录!",
deleteTranslationRecord: "删除该翻译记录",
deleteActivityRecord: "删除该活动数据",
willRefundOrder: "将要对该订单退款!",
willRecallOrder: "将要撤回该订单!",
// 市场
markets: {
headquarter: "总部",
headquarters: "总部",
}
,
noData: "暂无数据"
,
all: "全部"
},
// 权限模块
permission: {
warning: "警告",
user: "该用户",
changeRoleConfirmContent1: "确认修改权限角色?<br>您正在将【",
changeRoleConfirmContent2: "】的权限角色从【",
changeRoleConfirmContent3: "】修改为【",
changeRoleConfirmContent4: "】<br>变更后,该用户的可操作权限将同步更新为新角色配置,涉及数据访问、功能操作等权限变化,请谨慎确认。",
changeRoleSuccessContent1: "用户",
changeRoleSuccessContent2: "的权限角色已更改为【",
roleRegionNote: "此地区无实际意义,仅用于各分部负责人查看其地区角色"
},
// 提示信息组
elmessage: {
// 通用
addSuccess: "添加成功", // 大写是添加成功,小写是新增
addsuccess: "新增成功",
prompt: "提示",
editSuccess: "编辑成功",
withdrawSuccess: "撤回成功",
dataException: "数据异常",
@ -154,6 +193,7 @@ export default {
customerSuccess: "客户信息查询成功",
customerNotExist: "客户不存在",
addFailedUnknown: "添加失败,未知错误",
addUserPermissionFailed: "添加用户权限失败",
addFailed: "添加失败,请检查网络连接或联系管理员",
queryFailed: "查询失败,请检查网络连接或精网号是否正确",
refundTypeError: "退款类型数据格式错误,请联系管理员",
@ -164,6 +204,42 @@ export default {
inNetworkError: "网络异常,请重试",
adminInfoLoadFailed: "管理员信息加载异常,请稍后重试",
deleteSuccess: "删除成功",
success: "成功",
confirmDeleteUser: "确定将此用户删除吗?",
resetPasswordConfirm: "确认重置该账号密码?",
resetPasswordDefault: "重置后密码为: 123456,请通知用户及时修改",
checkAccountFormat: "请检查OA号格式",
deviceLimitReached: "设备数量已达上限",
noParentRoleMarket: "该上级角色无归属地区",
roleAddSuccess: "角色{roleName}添加成功",
enableSuccess: "启用成功",
disableSuccess: "禁用成功",
inputRoleName: "请输入角色名称",
roleNameLengthLimit: "角色名称长度应在2-20个字符之间",
selectPermissionList: "请选择权限列表",
inputAccount: "请输入OA号",
onlyDigits: "必须为数字",
lengthLimit20: "长度不能超过20位",
inputUserName: "请输入用户名",
inputPosition: "请输入职位",
inputAtLeastOneMachineCode: "请至少输入一个机器码",
roleNameDuplicate: "角色名重复",
resetPasswordSuccess: "重置密码成功",
resetPasswordFailed: "重置密码失败",
noPermissionResetMarket1: "您没有修改",
noPermissionResetMarket2: "地区的用户密码的权限",
selectRoleName: "请选择角色名称",
// 导入与上传
importSuccess: "导入成功",
importFailed: "导入失败",
importFailedNetworkOrFormat: "导入失败,请检查网络或文件格式",
onlyExcelAllowed: "只能上传Excel文件",
fileTooLarge5MB: "文件大小不能超过5MB",
fileSelectSuccess: "文件选择成功",
uploadLimitOne: "最多只能上传一个文件",
selectFileFirst: "请先选择要导入的文件",
// 纯文本校验
onlyPlainText: "译文仅支持纯文本,不支持HTML标签",
// 校验精网号,充值等输入
checkInputContent: "请检查输入内容",
permanentAndFreeNoZero: "永久金币和免费金币不能同时为0",
@ -291,14 +367,30 @@ export default {
// 权限
noPermissionText: "您暂无该页面操作权限,请联系管理员",
permissionPrompt: "权限提示",
noRoleAssigned: "暂未分配角色",
unknownRole: "未知角色",
},
// 通用列表字段组
common_list: {
id: "序号",
originalChinese: "原始中文",
english: "英文",
thai: "泰文",
chineseTraditional: "繁体中文",
malay: "马来文",
vietnamese: "越南文",
translated: "已翻译",
untranslated: "未翻译",
account: "OA号",
name: "姓名",
jwcode: "精网号",
market: "所属地区",
position: "职位",
roleName: "角色名称",
departmentPermission: "部门权限",
parentRole: "上级角色",
permissionScope: "权限范围",
gift: "礼物",
sumGold: "金币总数",
payPlatform: "平台信息",
@ -387,6 +479,16 @@ export default {
payVoucher: "支付凭证",
refund: "退款",
normal: "正常",
activityStatus: {
notStarted: "未开始",
inProgress: "进行中",
ended: "已结束"
},
operation: "操作",
configTime: "配置时间",
status: "状态",
enable: "启用",
disable: "禁用",
},
// 通用导出字段组
common_export: {
@ -403,6 +505,40 @@ export default {
common_add: {
jwcode: "精网号",
jwcodePlaceholder: "请输入精网号",
originalChinese: "原始中文",
originalChinesePlaceholder: "请输入原始中文",
english: "英文",
englishPlaceholder: "请输入英文",
thai: "泰文",
thaiPlaceholder: "请输入泰文",
chineseTraditional: "繁体中文",
chineseTraditionalPlaceholder: "请输入繁体中文",
malay: "马来文",
malayPlaceholder: "请输入马来文",
vietnamese: "越南文",
vietnamesePlaceholder: "请输入越南文",
addTranslation: "新增翻译",
editTranslation: "编辑翻译",
// 用户与角色管理
addUserPermission: "新增用户权限",
editUserPermission: "编辑用户权限",
account: "OA号",
accountPlaceholder: "请输入OA号",
userName: "用户名",
userNamePlaceholder: "请输入用户名",
roleName: "角色名称",
roleNamePlaceholder: "请选择角色名称",
parentRole: "上级角色",
noParentRole: "无上级角色",
permissionList: "权限列表",
machineCode: "机器码",
machineCodePlaceholder: "请输入机器码",
remark: "备注",
addRole: "新增角色",
editRole: "编辑角色",
permissionDetails: "权限详情",
channelName: "频道名称",
channelPlaceholder: "请选择频道",
customerName: "客户姓名",
customerNamePlaceholder: "请输入客户姓名",
rejectReason: "驳回理由",

14
src/views/activityManage/activity.vue

@ -59,10 +59,7 @@
</el-table-column>
<el-table-column prop="status" :label="t('common_list.status')" width="150px">
<template #default="scope">
{{ scope.row.status === '0' ? '未开始' :
scope.row.status === '1' ? '进行中' :
scope.row.status === '2' ? '已结束' : scope.row.status
}}
{{ getActivityStatusText(scope.row.status) }}
</template>
</el-table-column>
<el-table-column prop="creatorName" :label="t('common_list.creator')" width="150px" />
@ -167,8 +164,15 @@ import _ from 'lodash'
import { useI18n } from 'vue-i18n';
const {t} = useI18n();
const getActivityStatusText = (status) => {
if (status === '0') return t('common_list.activityStatus.notStarted')
if (status === '1') return t('common_list.activityStatus.inProgress')
if (status === '2') return t('common_list.activityStatus.ended')
return status
}
//
const activityNameReg = /^[\u4e00-\u9fa5a-zA-Z0-9,。!?、;:“”()‘’《》【】{}——~,.!?:;'--()""\[\]_&+=]+$/;
const activityNameReg = /^[\\u4e00-\\u9fa5a-zA-Z0-9,。!?、;:“”()‘’《》【】{}——~,.!?:;'--()\"\"\\[\\]_&+=]+$/;
// --
const tableData = ref([])
const pagination = ref({

120
src/views/language/languageTranslate.vue

@ -3,13 +3,13 @@
<el-card class="card1" style="margin-bottom: 1vh;">
<div class="condition">
<div class="condition-item">
<el-text size="large">搜索</el-text>
<el-input v-model="searchForm.chineseSimplified" style="width: 12vw" placeholder="请输入原文内容" clearable />
<el-text size="large">{{ t('common.searchLabel') }}</el-text>
<el-input v-model="searchForm.chineseSimplified" style="width: 12vw" :placeholder="t('common.searchPlaceholder')" clearable />
</div>
<!-- 移除语言状态筛选 -->
<div class="btn">
<el-button type="primary" @click="search">搜索</el-button>
<el-button type="success" @click="reset">重置</el-button>
<el-button type="primary" @click="search">{{ t('common.searchButton') }}</el-button>
<el-button type="success" @click="reset">{{ t('common.reset') }}</el-button>
</div>
</div>
</el-card>
@ -17,20 +17,20 @@
<el-card class="card2">
<!-- 功能按钮区域 -->
<div class="add-item">
<el-button type="success" @click="handleAdd">添加</el-button>
<el-button type="success" @click="handleAdd">{{ t('common.add') }}</el-button>
<!-- 后续需求 -->
<el-button class="add-item-export" @click="handleBatchImport">批量导入</el-button>
<el-button class="add-item-export" @click="handleBatchImport">{{ t('common.batchImport') }}</el-button>
</div>
<div>
<el-table :data="tableData" style="width: 82vw;height:72vh;" :row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<el-table-column type="index" :label="t('common_list.id')" width="80px" fixed="left">
<template #default="scope">
<span>{{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}</span>
</template>
</el-table-column>
<el-table-column prop="chineseSimplified" label="原文(中文)" width="180px">
<el-table-column prop="chineseSimplified" :label="t('common_list.originalChinese')" width="180px">
<template #default="scope">
<el-tooltip :content="scope.row.chineseSimplified" placement="top"
v-if="scope.row.chineseSimplified && scope.row.chineseSimplified.length > 20">
@ -40,7 +40,7 @@
</template>
</el-table-column>
<el-table-column prop="english" label="英文" width="200px" header-align="center">
<el-table-column prop="english" :label="t('common_list.english')" width="200px" header-align="center">
<template #default="scope">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="flex: 1;">
@ -52,13 +52,13 @@
</div>
<el-tag :type="scope.row.english ? 'success' : 'info'" size="small"
style="margin-left: 8px;">
{{ scope.row.english ? '已翻译' : '未翻译' }}
{{ scope.row.english ? t('common_list.translated') : t('common_list.untranslated') }}
</el-tag>
</div>
</template>
</el-table-column>
<el-table-column prop="thai" label="泰语" width="200px" header-align="center">
<el-table-column prop="thai" :label="t('common_list.thai')" width="200px" header-align="center">
<template #default="scope">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="flex: 1;">
@ -69,13 +69,13 @@
<span v-else>{{ scope.row.thai }}</span>
</div>
<el-tag :type="scope.row.thai ? 'success' : 'info'" size="small" style="margin-left: 8px;">
{{ scope.row.thai ? '已翻译' : '未翻译' }}
{{ scope.row.thai ? t('common_list.translated') : t('common_list.untranslated') }}
</el-tag>
</div>
</template>
</el-table-column>
<el-table-column prop="chineseTraditional" label="繁体中文" width="180px" header-align="center">
<el-table-column prop="chineseTraditional" :label="t('common_list.chineseTraditional')" width="180px" header-align="center">
<template #default="scope">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="flex: 1;">
@ -87,13 +87,13 @@
</div>
<el-tag :type="scope.row.chineseTraditional ? 'success' : 'info'" size="small"
style="margin-left: 8px;">
{{ scope.row.chineseTraditional ? '已翻译' : '未翻译' }}
{{ scope.row.chineseTraditional ? t('common_list.translated') : t('common_list.untranslated') }}
</el-tag>
</div>
</template>
</el-table-column>
<el-table-column prop="malay" label="马来语" width="200px" header-align="center">
<el-table-column prop="malay" :label="t('common_list.malay')" width="200px" header-align="center">
<template #default="scope">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="flex: 1;">
@ -104,13 +104,13 @@
<span v-else>{{ scope.row.malay }}</span>
</div>
<el-tag :type="scope.row.malay ? 'success' : 'info'" size="small" style="margin-left: 8px;">
{{ scope.row.malay ? '已翻译' : '未翻译' }}
{{ scope.row.malay ? t('common_list.translated') : t('common_list.untranslated') }}
</el-tag>
</div>
</template>
</el-table-column>
<el-table-column prop="vietnamese" label="越南语" width="200px" header-align="center">
<el-table-column prop="vietnamese" :label="t('common_list.vietnamese')" width="200px" header-align="center">
<template #default="scope">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="flex: 1;">
@ -122,24 +122,24 @@
</div>
<el-tag :type="scope.row.vietnamese ? 'success' : 'info'" size="small"
style="margin-left: 8px;">
{{ scope.row.vietnamese ? '已翻译' : '未翻译' }}
{{ scope.row.vietnamese ? t('common_list.translated') : t('common_list.untranslated') }}
</el-tag>
</div>
</template>
</el-table-column>
<!-- 移除状态列 -->
<el-table-column prop="configTime" label="配置时间" width="180px" header-align="center">
<el-table-column prop="configTime" :label="t('common_list.configTime')" width="180px" header-align="center">
<template #default="scope">
{{ moment(scope.row.configTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="operation" label="操作" width="155px" fixed="right" header-align="center">
<el-table-column prop="operation" :label="t('common_list.operation')" width="155px" fixed="right" header-align="center">
<template #default="scope">
<div style="display:flex; justify-content:center; ">
<el-button type="primary" text @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="danger" text @click="handleDelete(scope.row)">删除</el-button>
<el-button type="primary" text @click="handleEdit(scope.row)">{{ t('common.edit') }}</el-button>
<el-button type="danger" text @click="handleDelete(scope.row)">{{ t('common.delete') }}</el-button>
</div>
</template>
</el-table-column>
@ -159,54 +159,54 @@
@cancel="handleDeleteCancel" @close="handleDeleteClose" />
<!-- 编辑对话框 -->
<el-dialog v-model="showEditDialog" :title="editForm.id ? '编辑翻译' : '新增翻译'" width="30vw" draggable
<el-dialog v-model="showEditDialog" :title="editForm.id ? t('common_add.editTranslation') : t('common_add.addTranslation')" width="30vw" draggable
:close-on-click-modal="false" style="background-color: rgb(243,250,254);">
<el-form :model="editForm" label-width="120px">
<el-form-item label="原文(中文):">
<el-input v-model="editForm.chineseSimplified" placeholder="请输入原文内容" show-word-limit />
<el-form :model="editForm" label-width="155px">
<el-form-item :label="t('common_add.originalChinese') + ':'">
<el-input v-model="editForm.chineseSimplified" :placeholder="t('common_add.originalChinesePlaceholder')" show-word-limit />
</el-form-item>
<el-form-item label="英文:">
<el-input v-model="editForm.english" placeholder="请输入英文翻译" show-word-limit />
<el-form-item :label="t('common_add.english') + ':'">
<el-input v-model="editForm.english" :placeholder="t('common_add.englishPlaceholder')" show-word-limit />
</el-form-item>
<el-form-item label="泰语:">
<el-input v-model="editForm.thai" placeholder="请输入泰语翻译" show-word-limit />
<el-form-item :label="t('common_add.thai') + ':'">
<el-input v-model="editForm.thai" :placeholder="t('common_add.thaiPlaceholder')" show-word-limit />
</el-form-item>
<el-form-item label="繁体中文:">
<el-input v-model="editForm.chineseTraditional" placeholder="请输入繁体中文翻译" show-word-limit />
<el-form-item :label="t('common_add.chineseTraditional') + ':'">
<el-input v-model="editForm.chineseTraditional" :placeholder="t('common_add.chineseTraditionalPlaceholder')" show-word-limit />
</el-form-item>
<el-form-item label="马来语:">
<el-input v-model="editForm.malay" placeholder="请输入马来语翻译" show-word-limit />
<el-form-item :label="t('common_add.malay') + ':'">
<el-input v-model="editForm.malay" :placeholder="t('common_add.malayPlaceholder')" show-word-limit />
</el-form-item>
<el-form-item label="越南语:">
<el-input v-model="editForm.vietnamese" placeholder="请输入越南语翻译" show-word-limit />
<el-form-item :label="t('common_add.vietnamese') + ':'">
<el-input v-model="editForm.vietnamese" :placeholder="t('common_add.vietnamesePlaceholder')" show-word-limit />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="showEditDialog = false">取消</el-button>
<el-button @click="showEditDialog = false">{{ t('common.cancel') }}</el-button>
<el-button type="primary" :loading="saveLoading" @click="handleSave">
{{ saveLoading ? '保存中...' : '保存' }}
{{ saveLoading ? t('common.saving') : t('common.save') }}
</el-button>
</template>
</el-dialog>
<!-- 批量导入对话框 -->
<el-dialog v-model="showImportDialog" title="导入" width="40vw" draggable>
<el-dialog v-model="showImportDialog" :title="t('common.import')" width="40vw" draggable>
<el-upload class="upload-demo" drag action="#" :auto-upload="false" :on-change="handleFileChange" limit="1"
:on-exceed="handleExceed">
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__text">{{ t('common.uploadHint') }}</div>
</el-upload>
<template #footer>
<el-button @click="showImportDialog = false">取消</el-button>
<el-button type="primary" :loading="importLoading" @click="handleImport">导入</el-button>
<el-button @click="showImportDialog = false">{{ t('common.cancel') }}</el-button>
<el-button type="primary" :loading="importLoading" @click="handleImport">{{ t('common.import') }}</el-button>
</template>
</el-dialog>
</template>
@ -307,7 +307,7 @@ const getTranslationList = async () => {
}
} catch (error) {
console.error('获取翻译列表失败:', error)
ElMessage.error('获取数据失败')
ElMessage.error(t('elmessage.requestFailed'))
}
}
@ -352,7 +352,7 @@ const getMenuTree = async function () {
} catch (error) {
console.error('菜单数据请求失败:', error)
// return { code: 500, msg: '' }
ElMessage.error('网络异常')
ElMessage.error(t('elmessage.inNetworkError'))
adminStore.clearState()
}
// console.log('1')
@ -367,7 +367,7 @@ const handleSave = async () => {
const fields = ['english', 'thai', 'chineseTraditional', 'malay', 'vietnamese']
for (const field of fields) {
if (editForm.value[field] && /<[^>]*>/.test(editForm.value[field])) {
ElMessage.error('译文仅支持纯文本,不支持HTML标签')
ElMessage.error(t('elmessage.onlyPlainText'))
saveLoading.value = false //
return
}
@ -384,7 +384,7 @@ const handleSave = async () => {
await getMenuTree()
if (res.code === 200) {
ElMessage.success(editForm.value.id ? '编辑成功' : '添加成功')
ElMessage.success(editForm.value.id ? t('elmessage.editSuccess') : t('elmessage.addSuccess'))
showEditDialog.value = false
// getTranslationList()
@ -394,14 +394,14 @@ const handleSave = async () => {
}, 500)
} else if (res.code === 0) {
//
ElMessage.error(res.msg || '操作失败')
ElMessage.error(res.msg || t('elmessage.operationFailed'))
} else {
//
ElMessage.error(res.msg || '操作失败')
ElMessage.error(res.msg || t('elmessage.operationFailed'))
}
} catch (error) {
console.error('保存失败:', error)
ElMessage.error('保存失败')
ElMessage.error(t('elmessage.submitFailed'))
} finally {
//
saveLoading.value = false
@ -425,7 +425,7 @@ const handleDeleteConfirm = async () => {
//
await getMenuTree()
if (res.code === 200) {
ElMessage.success('删除成功')
ElMessage.success(t('elmessage.deleteSuccess'))
// getTranslationList()
//
setTimeout(() => {
@ -434,7 +434,7 @@ const handleDeleteConfirm = async () => {
}
} catch (error) {
console.error('删除失败:', error)
ElMessage.error('删除失败')
ElMessage.error(t('elmessage.operationFailed'))
} finally {
showDeleteDialog.value = false
currentDeleteRow.value = null
@ -465,28 +465,28 @@ const handleFileChange = (file) => {
//
if (file.raw.type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' &&
file.raw.type !== 'application/vnd.ms-excel') {
ElMessage.error('只能上传Excel文件')
ElMessage.error(t('elmessage.onlyExcelAllowed'))
return
}
// 5MB
if (file.raw.size > 5 * 1024 * 1024) {
ElMessage.error('文件大小不能超过5MB')
ElMessage.error(t('elmessage.fileTooLarge5MB'))
return
}
//
uploadFile.value = file.raw
ElMessage.success('文件选择成功')
ElMessage.success(t('elmessage.fileSelectSuccess'))
}
//
const handleExceed = (files, fileList) => {
ElMessage.warning('最多只能上传一个文件');
ElMessage.warning(t('elmessage.uploadLimitOne'));
};
//
const handleImport = async () => {
if (!uploadFile.value) {
ElMessage.warning('请先选择要导入的文件')
ElMessage.warning(t('elmessage.selectFileFirst'))
return
}
@ -506,7 +506,7 @@ const handleImport = async () => {
})
if (res.code === 200) {
ElMessage.success(`导入成功`)
ElMessage.success(t('elmessage.importSuccess'))
//
await getMenuTree()
//
@ -518,11 +518,11 @@ const handleImport = async () => {
//
uploadFile.value = null
} else {
ElMessage.error(res.msg || '导入失败')
ElMessage.error(res.msg || t('elmessage.importFailed'))
}
} catch (error) {
console.error('导入失败:', error)
ElMessage.error('导入失败,请检查网络或文件格式')
ElMessage.error(t('elmessage.importFailedNetworkOrFormat'))
} finally {
importLoading.value = false
}
@ -624,4 +624,4 @@ onMounted(() => {
width: 100%;
height: 180px;
}
</style>
</style>

120
src/views/permissions/rolePermission.vue

@ -11,9 +11,11 @@ const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
import { tr } from 'element-plus/es/locales.mjs'
import { useI18n } from 'vue-i18n'
// ref
const Ref = ref(null)
const { t } = useI18n()
const roleData = ref([])
const roleTotal = ref(100)
const treeRef = ref(null)
@ -37,10 +39,10 @@ const addRole = ref({
market: ''
})
const addRoleMarket = ref([])
const channelList = ref(['全部'])
const channelList = ref([t('common.all')])
const getRoleList = async function (val) {
if (!findMenuById(menuTree.value, permissionMapping.view_role_information)) {
ElMessage.error('无此权限')
ElMessage.error(t('elmessage.noPermissionText'))
return
}
try {
@ -173,7 +175,7 @@ function processTreeData(data) {
const handleAddRole = async function () {
if (!findMenuById(menuTree.value, permissionMapping.add_role_information)) {
ElMessage.error('无此权限')
ElMessage.error(t('elmessage.noPermissionText'))
return
}
try {
@ -182,7 +184,7 @@ const handleAddRole = async function () {
if (valid) {
resolve(); //
} else {
reject(new Error('请检查并完善表单信息')); //
reject(new Error(t('elmessage.checkFormInfo'))); //
}
});
});
@ -203,7 +205,7 @@ const handleAddRole = async function () {
}
})
if (res.code === 200) {
ElMessage.success('角色' + addRole.value.roleName + '添加成功')
ElMessage.success(t('elmessage.roleAddSuccess', { roleName: addRole.value.roleName }))
console.log('成功了,看看addRole', addRole.value)
console.log('提交的权限ID列表:', finalCheckedKeys)
closePermissionAddVisible()
@ -262,7 +264,7 @@ const getLists = async function () {
addRole.value.market = ''
}
} else {
ElMessage.error('该上级角色无归属地区')
ElMessage.error(t('elmessage.noParentRoleMarket'))
console.log('该上级角色无归属地区')
}
@ -417,7 +419,7 @@ const showMenuTree = (treeData, roleName) => {
Rolecheckedkeys.value = collectIds(treeData)
console.log('Rolecheckedkeys', Rolecheckedkeys.value)
currentRoleName.value = roleName || '权限详情'
currentRoleName.value = roleName || t('common_add.permissionDetails')
menuTreeVisible.value = true;
}
@ -525,7 +527,7 @@ const permissionEditRoleInit = async function (row) {
//
const permissionEditRole = async function () {
if (!findMenuById(menuTree.value, permissionMapping.edit_role_information)) {
ElMessage.error('无此权限')
ElMessage.error(t('elmessage.noPermission'))
return
}
try {
@ -534,7 +536,7 @@ const permissionEditRole = async function () {
if (valid) {
resolve();
} else {
reject(new Error('请检查并完善表单信息'));
reject(new Error(t('elmessage.checkFormInfo')));
}
});
});
@ -562,13 +564,13 @@ const permissionEditRole = async function () {
console.log('提交的权限ID列表:', finalCheckedKeys);
permissionEditRoleVisible.value = false;
getRoleList();
ElMessage.success('编辑角色成功');
ElMessage.success(t('elmessage.editSuccess'));
} else if (res.code === 0) {
console.log('角色名重复', permissionEditRoleObj.value);
ElMessage.error('角色名重复');
ElMessage.error(t('elmessage.roleNameDuplicate'));
} else {
console.log('编辑角色失败', res);
ElMessage.error('编辑角色失败');
ElMessage.error(t('elmessage.editFailed'));
}
} catch (error) {
console.log('编辑角色失败', error);
@ -602,22 +604,22 @@ const selectParentNodesForSubmit = (treeData, nodeId, checkedKeys) => {
const Rolerules = reactive({
roleName: [
{ required: true, message: '请输入角色名称', trigger: 'blur' },
{ min: 2, max: 20, message: '角色名称长度应在2-20个字符之间', trigger: 'blur' }
{ required: true, message: t('elmessage.inputRoleName'), trigger: 'blur' },
{ min: 2, max: 20, message: t('elmessage.roleNameLengthLimit'), trigger: 'blur' }
],
market: [
{ required: true, message: '请选择归属地区', trigger: 'change' }
{ required: true, message: t('elmessage.selectMarket'), trigger: 'change' }
],
checkedKeys: [
{
required: true,
message: '请选择权限列表',
message: t('elmessage.selectPermissionList'),
trigger: 'change', //
validator: (rule, value, callback) => {
if (value && value.length > 0) {
callback(); //
} else {
callback(new Error('请选择权限列表')); //
callback(new Error(t('elmessage.selectPermissionList'))); //
}
}
}
@ -642,11 +644,11 @@ onMounted(async function () {
<div>
<el-card class="card1" style="margin-bottom: 1vh;">
<div style="display: flex;">
<el-text size="large">角色名称</el-text>
<el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable />
<el-text size="large">{{ t('common.roleName') }}</el-text>
<el-input v-model="role.name" style="width: 240px" :placeholder="t('common.roleNamePlaceholder')" clearable />
<div style="margin-left: auto;">
<el-button type="primary" @click="searchRole()" :disabled="!canLook" v-if="canLook">查询</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="searchRole()" :disabled="!canLook" v-if="canLook">{{ t('common.search') }}</el-button>
<el-button type="success" @click="reset()">{{ t('common.reset') }}</el-button>
</div>
</div>
</el-card>
@ -654,13 +656,13 @@ onMounted(async function () {
<el-card class="card2">
<div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()" :disabled="!canAdd"
v-if="canAdd">新增角色
v-if="canAdd">{{ t('common.addRole') }}
</el-button>
</div>
<div>
<el-table :data="roleData" style="width: 82vw;height:71.3vh" show-overflow-tooltip
:row-style="{ height: '56px' }">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<el-table-column type="index" :label="t('common_list.id')" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getRoleObj.pageNum - 1) * getRoleObj.pageSize
@ -668,24 +670,24 @@ onMounted(async function () {
</template>
</el-table-column>
<el-table-column prop="roleName" label="角色名称" />
<el-table-column prop="fatherName" label="上级角色">
<el-table-column prop="roleName" :label="t('common_list.roleName')" />
<el-table-column prop="fatherName" :label="t('common_list.parentRole')">
<template #default="scope">
{{ scope.row.fatherName || '-' }}
</template>
</el-table-column>
<el-table-column label="权限范围" show-overflow-tooltip>
<el-table-column :label="t('common_list.permissionScope')" show-overflow-tooltip>
<template #default="scope">
<div class="permission-cell" @click="showMenuTree(scope.row.tree, scope.row.roleName)">
{{ formatPermissions(scope.row.tree) }}
</div>
</template>
</el-table-column>
<el-table-column prop="operation" label="操作" width="200px">
<el-table-column prop="operation" :label="t('common_list.operation')" width="200px">
<template #default="scope">
<el-button type="warning" text @click="permissionEditRoleInit(scope.row)"
:disabled="(scope.row.id === 2) || (scope.row.id === 1) || !canEdit" v-if="canEdit">
编辑
{{ t('common.edit') }}
</el-button>
</template>
</el-table-column>
@ -701,37 +703,37 @@ onMounted(async function () {
</div>
<!-- 角色菜单树展示 -->
<el-dialog v-model="menuTreeVisible" :title='`权限详情:${currentRoleName}`' width="600px">
<el-dialog v-model="menuTreeVisible" :title="`${t('common_add.permissionDetails')}:${currentRoleName}`" width="600px">
<el-tree :data="currentRoleMenuTree" node-key="id" :props="{ label: 'menuName', children: 'children' }"
show-checkbox check-strictly :expand-on-click-node="false"
:default-expanded-keys="currentRoleMenuTree.map(item => item.id)" :default-checked-keys="Rolecheckedkeys" />
<template #footer>
<el-button @click="menuTreeVisible = false" type="primary">关闭</el-button>
<el-button @click="menuTreeVisible = false" type="primary">{{ t('common.close') }}</el-button>
</template>
</el-dialog>
<!-- 新增角色 -->
<el-dialog v-model="permissionAddVisible" title="新增角色" width="800px" :close-on-click-modal="false"
<el-dialog v-model="permissionAddVisible" :title="t('common_add.addRole')" width="800px" :close-on-click-modal="false"
@close="handleDialogClose">
<template #footer>
<el-form ref="Ref" :rules="Rolerules" :model="addRole" label-width="auto"
style="max-width: 600px; align-items: center">
<el-form-item prop="roleName" label="角色名称:" required>
<el-input v-model="addRole.roleName" placeholder="请输入角色名称" style="width: 220px" />
<el-form-item prop="roleName" :label="t('common_add.roleName') + ':'" required>
<el-input v-model="addRole.roleName" :placeholder="t('common_add.roleNamePlaceholder')" style="width: 220px" />
</el-form-item>
<el-form-item prop="parentName" label="上级角色:">
<el-select v-model="addRole.parentId" placeholder="请选择上级角色" style="width: 220px" @change="getLists" clearable>
<el-form-item prop="parentName" :label="t('common_add.parentRole') + ':'">
<el-select v-model="addRole.parentId" :placeholder="t('common_add.parentRole')" style="width: 220px" @change="getLists" clearable>
<el-option v-for="item in permissionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="market" label="归属地区:" required>
<el-select v-model="addRole.market" placeholder="请选择归属地区" style="width: 220px" clearable>
<el-form-item prop="market" :label="t('common.market') + ':'" required>
<el-select v-model="addRole.market" :placeholder="t('common.marketPlaceholder')" style="width: 220px" clearable>
<el-option v-for="item in addRoleMarket" :key="item" :label="item" :value="item" />
</el-select>
<text>(此地区无实际意义仅用于各分部负责人查看其地区角色)</text>
<text>{{ t('permission.roleRegionNote') || '' }}</text>
</el-form-item>
<el-form-item prop="checkedKeys" label="权限列表:" required>
<el-form-item prop="checkedKeys" :label="t('common_add.permissionList') + ':'" required>
<el-tree v-if="data.length > 0" :data="data" show-checkbox node-key="id"
:props="{ label: 'menuName', children: 'children' }" :checked-keys="addRole.checkedKeys"
:check-strictly="false" @check="handleCheckChange">
@ -740,44 +742,44 @@ onMounted(async function () {
</template>
</el-tree>
<div v-else style="display: flex; align-items: center; gap: 8px;">
<span style="color: #999;">暂无数据</span>
<span style="color: #999;">{{ t('common.noData') }}</span>
</div>
</el-form-item>
<el-form-item v-show="ifHasChannel" label="频道名称:" required>
<el-select v-model="addRole.channel" placeholder="请选择频道" style="width: 220px" filterable clearable>
<el-form-item v-show="ifHasChannel" :label="t('common_add.channelName') + ':'" required>
<el-select v-model="addRole.channel" :placeholder="t('common_add.channelPlaceholder')" style="width: 220px" filterable clearable>
<el-option v-for="item in channelList" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
</el-form>
<div>
<el-button @click="closePermissionAddVisible()">取消</el-button>
<el-button @click="closePermissionAddVisible()">{{ t('common.cancel') }}</el-button>
<el-button type="primary" @click="throttledHandleAddRole">
提交
{{ t('common.submit') }}
</el-button>
</div>
</template>
</el-dialog>
<!-- 編輯角色彈窗 -->
<el-dialog v-model="permissionEditRoleVisible" title="编辑角色" width="800px" :close-on-click-modal="false">
<el-dialog v-model="permissionEditRoleVisible" :title="t('common_add.editRole')" width="800px" :close-on-click-modal="false">
<template #footer>
<el-form ref="Ref" :rules="Rolerules" :model="permissionEditRoleObj" label-width="auto"
style="max-width: 600px; align-items: center">
<el-form-item prop="roleName" label="角色名称:" required>
<el-input v-model="permissionEditRoleObj.roleName" placeholder="请输入角色名称" style="width: 220px" />
<el-form-item prop="roleName" :label="t('common_add.roleName') + ':'" required>
<el-input v-model="permissionEditRoleObj.roleName" :placeholder="t('common_add.roleNamePlaceholder')" style="width: 220px" />
</el-form-item>
<el-form-item prop="parentName" label="上级角色:">
<el-input v-model="permissionEditRoleObj.parentName" placeholder="无上级角色" disabled style="width: 220px">
<el-form-item prop="parentName" :label="t('common_add.parentRole') + ':'">
<el-input v-model="permissionEditRoleObj.parentName" :placeholder="t('common_add.noParentRole')" disabled style="width: 220px">
<el-option v-for="item in permissionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-input>
</el-form-item>
<el-form-item prop="market" label="归属地区" required>
<el-input v-model="permissionEditRoleObj.market" placeholder="请输入归属地区" style="width: 220px" disabled />
<text>(此地区无实际意义仅用于各分部负责人查看其地区角色)</text>
<el-form-item prop="market" :label="t('common.market')" required>
<el-input v-model="permissionEditRoleObj.market" :placeholder="t('common.marketPlaceholder')" style="width: 220px" disabled />
<text>{{ t('permission.roleRegionNote') || '' }}</text>
</el-form-item>
<el-form-item prop="checkedKeys" label="权限列表:" required>
<el-form-item prop="checkedKeys" :label="t('common_add.permissionList') + ':'" required>
<el-tree v-if="data.length > 0" :data="data" show-checkbox node-key="id" ref="treeRef"
:props="{ label: 'menuName', children: 'children' }"
:default-checked-keys="permissionEditRoleObj.checkedKeys" :check-strictly="false"
@ -788,21 +790,21 @@ onMounted(async function () {
</template>
</el-tree>
<div v-else style="display: flex; align-items: center; gap: 8px;">
<span style="color: #999;">暂无数据</span>
<span style="color: #999;">{{ t('common.noData') }}</span>
</div>
</el-form-item>
<el-form-item v-show="ifHasChannel" label="频道名称:" required>
<el-select v-model="permissionEditRoleObj.channel" placeholder="请选择频道" style="width: 220px" clearable>
<el-form-item v-show="ifHasChannel" :label="t('common_add.channelName') + ':'" required>
<el-select v-model="permissionEditRoleObj.channel" :placeholder="t('common_add.channelPlaceholder')" style="width: 220px" clearable>
<el-option v-for="item in channelList" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
</el-form>
<div>
<el-button @click="permissionEditRoleVisible = false">取消</el-button>
<el-button @click="permissionEditRoleVisible = false">{{ t('common.cancel') }}</el-button>
<el-button type="primary" @click="permissionEditRole">
提交
{{ t('common.submit') }}
</el-button>
</div>
</template>
@ -855,4 +857,4 @@ onMounted(async function () {
color: #409eff;
/* 蓝色文字,提示可点击 */
}
</style>
</style>

271
src/views/permissions/userPermission.vue

@ -8,9 +8,11 @@ import API from '@/util/http'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import { useI18n } from 'vue-i18n'
import BackGroundSvg from '@/assets/SvgIcons/promptBackground.svg'
const { t } = useI18n()
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
@ -50,34 +52,34 @@ const showStatusConfirm = (row, targetStatus) => {
//
const addUserRules = {
account: [
{ required: true, message: '请输入OA号', trigger: 'blur' },
{ pattern: /^\d+$/, message: 'OA号必须为数字', trigger: 'blur' },
{ max: 20, message: '长度不能超过20位', trigger: 'blur' }
{ required: true, message: t('elmessage.inputAccount'), trigger: 'blur' },
{ pattern: /^\d+$/, message: t('elmessage.onlyDigits'), trigger: 'blur' },
{ max: 20, message: t('elmessage.lengthLimit20'), trigger: 'blur' }
],
name: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ max: 20, message: '长度不能超过20位', trigger: 'blur' }
{ required: true, message: t('elmessage.inputUserName'), trigger: 'blur' },
{ max: 20, message: t('elmessage.lengthLimit20'), trigger: 'blur' }
],
market: [
{ required: true, message: '请选择所属地区', trigger: 'change' }
{ required: true, message: t('elmessage.selectMarket'), trigger: 'change' }
],
permission: [
{ required: true, message: '请选择角色名称', trigger: 'change' }
{ required: true, message: t('elmessage.selectRoleName'), trigger: 'change' }
],
postiton: [
{ required: true, message: '请输入职位', trigger: 'blur' },
{ max: 20, message: '长度不能超过20位', trigger: 'blur' }
{ required: true, message: t('elmessage.inputPosition'), trigger: 'blur' },
{ max: 20, message: t('elmessage.lengthLimit20'), trigger: 'blur' }
],
machineIds: [
{
required: true,
message: '请至少输入一个机器码',
message: t('elmessage.inputAtLeastOneMachineCode'),
trigger: 'change',
validator: (rule, value, callback) => {
//
const hasValid = value.some(item => item.trim() !== '');
if (!hasValid) {
callback(new Error('请至少输入一个机器码'));
callback(new Error(t('elmessage.inputAtLeastOneMachineCode')));
} else {
callback();
}
@ -117,14 +119,14 @@ const permissionEditObj = ref({
})
const addMachineIdInput = function () {
if (addAdmin.value.machineIds.length >= 2) {
ElMessage.warning('设备数量已达上限')
ElMessage.warning(t('elmessage.deviceLimitReached'))
return
}
addAdmin.value.machineIds.push('')
}
const UseraddMachineIdInput = function () {
if (permissionEditObj.value.machineIds.length >= 2) {
ElMessage.warning('设备数量已达上限')
ElMessage.warning(t('elmessage.deviceLimitReached'))
return
}
permissionEditObj.value.machineIds.push('')
@ -149,7 +151,7 @@ const getPermission = async function (val) {
//
if (!numberRegex.test(admin.value.account)) {
ElMessage.error('请检查OA号格式')
ElMessage.error(t('elmessage.checkAccountFormat'))
//
return
}
@ -272,7 +274,7 @@ const userAddInit = function () {
//
const permissionAdd = async function () {
if (!canLook) {
ElMessage.error('无此权限')
ElMessage.error(t('elmessage.noPermissionText'))
return
}
try {
@ -281,7 +283,7 @@ const permissionAdd = async function () {
if (valid) {
resolve(); //
} else {
reject(new Error('请检查并完善表单信息')); //
reject(new Error(t('elmessage.checkFormInfo'))); //
}
});
});
@ -307,7 +309,7 @@ const permissionAdd = async function () {
console.log(addAdmin.value)
if (result.code === 200) {
ElMessage.success('添加成功')
ElMessage.success(t('elmessage.addSuccess'))
} else {
ElMessage.error(result.msg)
}
@ -319,7 +321,7 @@ const permissionAdd = async function () {
} catch (error) {
console.log('新增用户权限失败', error)
ElMessage.error('新增用户权限失败')
ElMessage.error(t('elmessage.addUserPermissionFailed'))
}
}
// ref
@ -441,19 +443,19 @@ const getUserLists = async function (selectedRoleId) {
permissionEditObj.value.parentName = '';
permissionEditObj.value.checkedKeys = [];
parentRoleTip.value = '';
const parentRes = await request({
url: '/role/selectFather',
data: { id: selectedRoleId } // ID
});
const parentId = parentRes.data.fatherId;
const parentName = parentRes.data.parentName;
permissionEditObj.value.parentId = parentId;
permissionEditObj.value.parentName = parentName;
if (parentId == null) {
//
parentRoleTip.value = '该角色无上级角色';
}
const parentRes = await request({
url: '/role/selectFather',
data: { id: selectedRoleId } // ID
});
const parentId = parentRes.data.fatherId;
const parentName = parentRes.data.parentName;
permissionEditObj.value.parentId = parentId;
permissionEditObj.value.parentName = parentName;
if (parentId == null) {
//
parentRoleTip.value = t('common_add.noParentRole');
}
let roleId = permissionEditObj.value.roleId
// if (permissionEditObj.value.parentId === null || permissionEditObj.value.parentId === undefined) {
@ -476,22 +478,22 @@ const getUserLists = async function (selectedRoleId) {
//
const editAdminRules = {
market: [
{ required: true, message: '请选择所属地区', trigger: 'change' }
{ required: true, message: t('elmessage.selectMarket'), trigger: 'change' }
],
postiton: [
{ required: true, message: '请输入职位', trigger: ['blur', 'change'] },
{ max: 20, message: '长度不能超过20位', trigger: ['blur', 'change'] }
{ required: true, message: t('elmessage.inputPosition'), trigger: ['blur', 'change'] },
{ max: 20, message: t('elmessage.lengthLimit20'), trigger: ['blur', 'change'] }
],
machineIds: [
{
required: true,
message: '请至少输入一个机器码',
message: t('elmessage.inputAtLeastOneMachineCode'),
trigger: 'change',
validator: (rule, value, callback) => {
//
const hasValid = value.some(item => item.trim() !== '');
if (!hasValid) {
callback(new Error('请至少输入一个机器码'));
callback(new Error(t('elmessage.inputAtLeastOneMachineCode')));
} else {
callback();
}
@ -502,33 +504,34 @@ const editAdminRules = {
//
const permissionEdit = async function () {
if (!canEdit) {
ElMessage.error('无此权限')
ElMessage.error(t('elmessage.noPermissionText'))
return
}
let { adminName: userName, roleName: oldRole, roleId: newRoleId } = permissionEditObj.value;
if (oldRole == null) {
oldRole = '暂未分配角色'
oldRole = t('elmessage.noRoleAssigned')
}
const newRole = permissionList.value.find(item => item.value === newRoleId)?.label || '未知角色';
const newRole = permissionList.value.find(item => item.value === newRoleId)?.label || t('elmessage.unknownRole');
const confirmContent = `${t('permission.changeRoleConfirmContent1')}${userName}${t('permission.changeRoleConfirmContent2')}${oldRole}${t('permission.changeRoleConfirmContent3')}${newRole}${t('permission.changeRoleConfirmContent4')}`
try {
await new Promise((resolve, reject) => {
Ref.value.validate((valid) => {
if (valid) {
resolve(); //
} else {
reject(new Error('请检查并完善表单信息')); //
reject(new Error(t('elmessage.checkFormInfo'))); //
}
});
});
await ElMessageBox.confirm(
`确认修改权限角色?<br>您正在将【${userName}】的权限角色从【${oldRole}】修改为【${newRole}】<br>变更后,该用户的可操作权限将同步更新为新角色配置,涉及数据访问、功能操作等权限变化,请谨慎确认。`,
'警告',
confirmContent,
t('permission.warning'),
{
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonText: t('common.confirm'),
cancelButtonText: t('common.cancel'),
type: "warning",
lockScroll: false,
dangerouslyUseHTMLString: true // HTML
dangerouslyUseHTMLString: true
}
)
const result = await request({
@ -548,11 +551,11 @@ const permissionEdit = async function () {
console.log('编辑最后提交数据', permissionEditObj.value);
if (result.code === 200) {
await ElMessageBox.alert(
`用户${userName}的权限角色已更改为【${newRole}`,
'成功',
`${t('permission.changeRoleSuccessContent1')}${userName}${t('permission.changeRoleSuccessContent2')}${newRole}`,
t('elmessage.success'),
{
confirmButtonText: '确定',
type: 'success' // success
confirmButtonText: t('common.confirm'),
type: 'success'
}
);
getPermission();
@ -563,7 +566,7 @@ const permissionEdit = async function () {
} catch (error) {
console.log('编辑用户权限失败', error)
ElMessage.error('编辑用户权限失败')
ElMessage.error(t('elmessage.editFailed') || t('elmessage.operationFailed'))
}
}
@ -578,7 +581,7 @@ const del = function (row) {
//
const delConfirm = async function () {
if (!canDel) {
ElMessage.error('无此权限')
ElMessage.error(t('elmessage.noPermissionText'))
return
}
try {
@ -589,18 +592,18 @@ const delConfirm = async function () {
console.log('看看删除对象', delObj.value)
console.log('请求成功1', result)
ElMessage.success('删除权限成功')
ElMessage.success(t('elmessage.deleteSuccess'))
delObj.value = {}
getPermission()
} catch (error) {
console.log('删除权限失败', error)
ElMessage.error('删除权限失败')
ElMessage.error(t('elmessage.operationFailed'))
}
}
//
const editStatus = async function (row) {
if (!change) {
ElMessage.error('无此权限')
ElMessage.error(t('elmessage.noPermissionText'))
return
}
const { id, account, targetStatus, ...restRow } = currentStatusRow.value
@ -622,7 +625,7 @@ const editStatus = async function (row) {
console.log('请求成功2', result)
if (result.code === 200) {
ElMessage.success(
permissionEditObj.value.adminStatus === 1 ? '启用成功' : '禁用成功'
permissionEditObj.value.adminStatus === 1 ? t('elmessage.enableSuccess') : t('elmessage.disableSuccess')
)
statusLoading.value[id] = false
}
@ -681,11 +684,11 @@ const handleMarketChangeAddUser = (value) => {
.filter(Boolean);
//
const hasHeadquarters = selectedMarkets.includes('总部');
const hasHeadquarters = selectedMarkets.includes(t('common.markets.headquarters'));
if (hasHeadquarters) {
//
addAdmin.value.market = ['总部'];
addAdmin.value.market = [t('common.markets.headquarters')];
} else {
//
addAdmin.value.market = selectedMarkets;
@ -705,11 +708,11 @@ const handleMarketChangeEditUser = (value) => {
.filter(Boolean);
//
const hasHeadquarters = selectedMarkets.includes('总部');
const hasHeadquarters = selectedMarkets.includes(t('common.markets.headquarters'));
if (hasHeadquarters) {
//
permissionEditObj.value.market = ['总部'];
permissionEditObj.value.market = [t('common.markets.headquarters')];
} else {
//
permissionEditObj.value.market = selectedMarkets;
@ -793,7 +796,7 @@ const resetPassword = function (row) {
//
const confirmResetPassword = async function () {
if (!canEdit) {
ElMessage.error('无此权限')
ElMessage.error(t('elmessage.noPermission'))
return
}
console.log('adminData', adminData.value)
@ -827,20 +830,20 @@ const confirmResetPassword = async function () {
});
if (result.code === 200) { // 使
ElMessage.success('重置密码成功');
ElMessage.success(t('elmessage.resetPasswordSuccess'));
resetConfirmVisible.value = false; //
await getPermission()
} else {
ElMessage.error(result.message || '重置密码失败');
ElMessage.error(result.message || t('elmessage.resetPasswordFailed'));
}
} catch (error) {
ElMessage.error('重置密码失败');
ElMessage.error(t('elmessage.resetPasswordFailed'));
console.error('请求错误:', error);
}
} else {
// console.log("",adminData.value.markets)
ElMessage.error('您没有修改' + currentRow.value.market + '地区的用户密码的权限');
ElMessage.error(t('elmessage.noPermissionResetMarket1') + currentRow.value.market + t('elmessage.noPermissionResetMarket2'));
resetConfirmVisible.value = false; //
}
@ -918,25 +921,25 @@ onMounted(async function () {
<el-card class="card1" style="margin-bottom: 1vh;">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">OA号</el-text>
<el-input v-model="admin.account" style="width: 240px" placeholder="请输入OA号" clearable />
<el-text class="mx-1" size="large">{{ t('common.account') }}</el-text>
<el-input v-model="admin.account" style="width: 240px" :placeholder="t('common.accountPlaceholder')" clearable />
</div>
<div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader v-model="admin.market" :options="marketsTree" placeholder="请选择所属地区" clearable style="width:180px"
<el-text class="mx-1" size="large">{{ t('common.market') }}</el-text>
<el-cascader v-model="admin.market" :options="marketsTree" :placeholder="t('common.marketPlaceholder')" clearable style="width:180px"
@change="handleMarketChange" />
</div>
<div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">职位名称</el-text>
<el-select v-model="admin.postiton" placeholder="请选择职位名称" style="width: 240px" clearable>
<el-text class="mx-1" size="large">{{ t('common.position') }}</el-text>
<el-select v-model="admin.postiton" :placeholder="t('common.positionPlaceholder')" style="width: 240px" clearable>
<el-option v-for="item in postiton" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="head-card-btn">
<el-button type="primary" @click="search()" v-if="canLook">查询</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()" v-if="canLook">{{ t('common.search') }}</el-button>
<el-button type="success" @click="reset()">{{ t('common.reset') }}</el-button>
</div>
</div>
</el-card>
@ -944,14 +947,14 @@ onMounted(async function () {
<!-- 展示表单 -->
<div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" :disabled="!canAdd" v-if="canAdd"
@click="userAddInit()">新增用户
@click="userAddInit()">{{ t('common.addUser') }}
</el-button>
</div>
<div>
<el-table :data="tableData" style="width: 82vw;height:71.3vh" show-overflow-tooltip
>
<el-table-column type="index" label="序号" width="100px" fixed="left">
<el-table-column type="index" :label="t('common_list.id')" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
@ -959,39 +962,39 @@ onMounted(async function () {
</template>
</el-table-column>
<el-table-column prop="account" label="OA号" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="market" label="所属地区" />
<el-table-column prop="postiton" label="职位" />
<el-table-column prop="roleName" label="部门权限">
<el-table-column prop="account" :label="t('common_list.account')" />
<el-table-column prop="name" :label="t('common_list.name')" />
<el-table-column prop="market" :label="t('common_list.market')" />
<el-table-column prop="postiton" :label="t('common_list.position')" />
<el-table-column prop="roleName" :label="t('common_list.departmentPermission')">
</el-table-column>
<el-table-column prop="remark" label="备注" />
<el-table-column prop="operation" label="操作" width="280px">
<el-table-column prop="remark" :label="t('common_list.remark')" />
<el-table-column prop="operation" :label="t('common_list.operation')" align="center" width="380px">
<template #default="scope">
<el-button type="warning" text :disabled="!canReset" @click="resetPassword(scope.row)" v-if="canReset">
重置密码
{{ t('common.resetPassword') }}
</el-button>
<el-button type="primary" text @click="permissionEditInit(scope.row)" v-if="canEdit"
:disabled="!canEdit || scope.row.adminStatus === 0 || scope.row.account === adminData.account">
修改权限
{{ t('common.editPermission') }}
</el-button>
<el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm">
<el-popconfirm :title="t('elmessage.confirmDeleteUser')" @confirm="delConfirm">
<template #reference>
<el-button type="danger" text @click="del(scope.row)" v-if="canDel"
:disabled="!canDel || scope.row.adminStatus === 0 || scope.row.account === adminData.account">
删除
{{ t('common.delete') }}
</el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button size="small" @click="cancel">{{ t('common.cancel') }}</el-button>
<el-button type="primary" size="small" @click="confirm">
确定
{{ t('common.confirm') }}
</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
<el-table-column prop="adminStatus" label="状态">
<el-table-column prop="adminStatus" :label="t('common_list.status')">
<template #default="scope">
<el-switch :model-value="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
v-if="change"
@ -999,7 +1002,7 @@ onMounted(async function () {
@change="(targetStatus) => showStatusConfirm(scope.row, targetStatus)" style="
--el-switch-on-color: #13ce66;
--el-switch-off-color: #ff4949;
" active-text="启用" inactive-text="禁用" inline-prompt />
" :active-text="t('common_list.enable')" :inactive-text="t('common_list.disable')" inline-prompt />
</template>
</el-table-column>
</el-table>
@ -1013,106 +1016,106 @@ onMounted(async function () {
</div>
<!-- 新增用户权限 -->
<el-dialog v-model="userAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false"
<el-dialog v-model="userAddVisible" :title="t('common_add.addUserPermission')" width="800px" :close-on-click-modal="false"
@close="handleDialogClose">
<template #footer>
<el-form ref="Ref" :rules="addUserRules" :model="addAdmin" label-width="auto"
style="max-width: 600px; align-items: center">
<el-form-item prop="account" label="OA号:" required clearable>
<el-input v-model="addAdmin.account" placeholder="请输入OA号" style="width: 220px" />
<el-form-item prop="account" :label="t('common_add.account') + ':'" required clearable>
<el-input v-model="addAdmin.account" :placeholder="t('common_add.accountPlaceholder')" style="width: 220px" />
</el-form-item>
<el-form-item prop="name" label="用户名:" required clearable>
<el-input v-model="addAdmin.name" placeholder="请输入用户名" style="width: 220px" />
<el-form-item prop="name" :label="t('common_add.userName') + ':'" required clearable>
<el-input v-model="addAdmin.name" :placeholder="t('common_add.userNamePlaceholder')" style="width: 220px" />
</el-form-item>
<el-form-item prop="market" label="所属地区:" required clearable>
<el-cascader v-model="addAdmin.market" :options="marketsTree" placeholder="请选择所属地区" clearable collapse-tags
<el-form-item prop="market" :label="t('common.market') + ':'" required clearable>
<el-cascader v-model="addAdmin.market" :options="marketsTree" :placeholder="t('common.marketPlaceholder')" clearable collapse-tags
collapse-tags-tooltip style="width:220px" @change="handleMarketChangeAddUser" :max-collapse-tags="2"
:props="addUserProps" />
</el-form-item>
<el-form-item prop="permission" label="角色名称:" required>
<el-select v-model="addAdmin.permission" placeholder="请选择角色名称" style="width: 220px" clearable>
<el-form-item prop="permission" :label="t('common_add.roleName') + ':'" required>
<el-select v-model="addAdmin.permission" :placeholder="t('common_add.roleNamePlaceholder')" style="width: 220px" clearable>
<el-option v-for="item in permissionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="postiton" label="职位:" required>
<el-input v-model="addAdmin.postiton" placeholder="请输入职位" style="width: 220px" clearable />
<el-form-item prop="postiton" :label="t('common.position') + ':'" required>
<el-input v-model="addAdmin.postiton" :placeholder="t('common.positionPlaceholder')" style="width: 220px" clearable />
</el-form-item>
<el-form-item prop="machineIds" label="机器码:" required>
<el-form-item prop="machineIds" :label="t('common_add.machineCode') + ':'" required>
<div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
<!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in addAdmin.machineIds" :key="index">
<el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
<el-input v-model="addAdmin.machineIds[index]" :placeholder="t('common_add.machineCodePlaceholder')"
style="width: 220px; margin-right: 10px;" />
</div>
<el-button type="primary" @click="addMachineIdInput">添加</el-button>
<el-button type="primary" @click="addMachineIdInput">{{ t('common.add') }}</el-button>
</div>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-form-item prop="remark" :label="t('common_add.remark')">
<el-input v-model="addAdmin.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit
type="textarea" />
</el-form-item>
</el-form>
<div>
<el-button @click="closeUserAddVisible()">取消</el-button>
<el-button @click="closeUserAddVisible()">{{ t('common.cancel') }}</el-button>
<el-button type="primary" @click="throttledPermissionAdd()">
提交
{{ t('common.submit') }}
</el-button>
</div>
</template>
</el-dialog>
<!-- 这是编辑用户权限弹窗 -->
<el-dialog v-model="userEditVisible" title="编辑用户权限" width="800px" :close-on-click-modal="false">
<el-dialog v-model="userEditVisible" :title="t('common_add.editUserPermission')" width="800px" :close-on-click-modal="false">
<el-form ref="Ref" :rules="editAdminRules" :model="permissionEditObj" label-width="auto"
style="max-width: 600px; align-items: center">
<el-form-item prop="account" label="用户账号:" clearable>
<el-input v-model="permissionEditObj.account" placeholder="请输入OA号" style="width: 220px" disabled />
<el-form-item prop="account" :label="t('common.account') + ':'" clearable>
<el-input v-model="permissionEditObj.account" :placeholder="t('common.accountPlaceholder')" style="width: 220px" disabled />
</el-form-item>
<el-form-item prop="name" label="用户名称:">
<el-input v-model="permissionEditObj.adminName" placeholder="请输入用户名" style="width: 220px" disabled />
<el-form-item prop="name" :label="t('common_add.userName') + ':'">
<el-input v-model="permissionEditObj.adminName" :placeholder="t('common_add.userNamePlaceholder')" style="width: 220px" disabled />
</el-form-item>
<el-form-item prop="market" label="所属地区:" clearable>
<el-cascader v-model="permissionEditObj.market" :options="marketsTree" placeholder="请选择所属地区" clearable
<el-form-item prop="market" :label="t('common.market') + ':'" clearable>
<el-cascader v-model="permissionEditObj.market" :options="marketsTree" :placeholder="t('common.marketPlaceholder')" clearable
collapse-tags collapse-tags-tooltip style="width:220px" @change="handleMarketChangeEditUser"
:max-collapse-tags="2" :props="editUserProps" />
</el-form-item>
<el-form-item prop="postiton" label="职位:">
<el-input v-model="permissionEditObj.postiton" placeholder="请输入职位" style="width: 220px" clearable />
<el-form-item prop="postiton" :label="t('common.position') + ':'">
<el-input v-model="permissionEditObj.postiton" :placeholder="t('common.positionPlaceholder')" style="width: 220px" clearable />
</el-form-item>
<el-form-item prop="roleName" label="角色名称:">
<el-select v-model="permissionEditObj.roleId" placeholder="请选择角色" style="width: 220px" @change="getUserLists">
<el-form-item prop="roleName" :label="t('common_add.roleName') + ':'">
<el-select v-model="permissionEditObj.roleId" :placeholder="t('common_add.roleNamePlaceholder')" style="width: 220px" @change="getUserLists">
<el-option v-for="item in permissionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="parentName" label="上级角色:">
<el-select v-model="permissionEditObj.parentId" placeholder="无上级角色" :disabled="!!parentRoleTip"
<el-form-item prop="parentName" :label="t('common_add.parentRole') + ':'">
<el-select v-model="permissionEditObj.parentId" :placeholder="t('common_add.noParentRole')" :disabled="!!parentRoleTip"
style="width: 220px">
<el-option v-if="parentRoleTip" :key="0" :label="parentRoleTip" :value="null" disabled />
<el-option v-else v-for="item in permissionList" :key="item.value" :label="item.label" disabled
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="permissionSelect" label="权限列表:">
<el-form-item prop="permissionSelect" :label="t('common_add.permissionList') + ':'">
<el-tree v-if="data.length > 0" :data="data" :disabled="true" show-checkbox node-key="id"
:props="{ label: 'menuName', children: 'children' }" :default-checked-keys="permissionEditObj.checkedKeys">
</el-tree>
<div v-else style="display: flex; align-items: center; gap: 8px;">
<span style="color: #999;">暂无数据</span>
<span style="color: #999;">{{ t('common.noData') }}</span>
</div>
</el-form-item>
<el-form-item prop="machineIds" label="机器码:">
<el-form-item prop="machineIds" :label="t('common_add.machineCode') + ':'">
<div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
<!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in permissionEditObj.machineIds" :key="index">
<el-input v-model="permissionEditObj.machineIds[index]" placeholder=""
style="width: 220px; margin-right: 10px;" />
</div>
<el-button type="primary" @click="UseraddMachineIdInput">添加</el-button>
<el-button type="primary" @click="UseraddMachineIdInput">{{ t('common.add') }}</el-button>
</div>
</el-form-item>
</el-form>
@ -1120,9 +1123,9 @@ onMounted(async function () {
</div>
<template #footer>
<div>
<el-button @click="closeUserEditVisible()">取消</el-button>
<el-button @click="closeUserEditVisible()">{{ t('common.cancel') }}</el-button>
<el-button type="primary" @click="throttledPermissionEdit">
提交
{{ t('common.submit') }}
</el-button>
</div>
</template>
@ -1138,15 +1141,15 @@ onMounted(async function () {
</el-icon>
</el-col>
<el-col :span="20">
<h3>提示</h3>
<p class="dialog-title">确认重置该账号密码</p>
<p class="dialog-desc">重置后密码为: 123456请通知用户及时修改</p>
<h3>{{ t('elmessage.prompt') }}</h3>
<p class="dialog-title">{{ t('elmessage.resetPasswordConfirm') }}</p>
<p class="dialog-desc">{{ t('elmessage.resetPasswordDefault') }}</p>
</el-col>
</el-row>
<template #footer>
<div style="display: flex; justify-content: center; gap: 30px">
<el-button @click="cancelResetPassword">取消</el-button>
<el-button type="primary" @click="confirmResetPassword">确定</el-button>
<el-button @click="cancelResetPassword">{{ t('common.cancel') }}</el-button>
<el-button type="primary" @click="confirmResetPassword">{{ t('common.confirm') }}</el-button>
</div>
</template>
</el-dialog>
@ -1159,7 +1162,7 @@ onMounted(async function () {
}"
@close="() => { if (currentStatusRow) currentStatusRow.adminStatus = currentStatusRow.adminStatus === 1 ? 0 : 1 }">
<div class="status-confirm-content">
将要{{ currentStatusRow?.adminStatus === 1 ? '禁用' : '启用' }}该用户
{{ t('common.will') }}{{ currentStatusRow?.adminStatus === 1 ? t('common_list.disable') : t('common_list.enable') }}{{ t('permission.user') }}
<br>
</div>
<template #footer>
@ -1168,13 +1171,13 @@ onMounted(async function () {
currentStatusRow.adminStatus = currentStatusRow.adminStatus === 1 ? 0 : 1
ackVisible = false
}">
取消
{{ t('common.cancel') }}
</el-button>
<el-button round size="large" type="primary" @click="() => {
editStatus(currentStatusRow)
ackVisible = false
}">
确认
{{ t('common.confirm') }}
</el-button>
</div>
</template>
@ -1241,4 +1244,4 @@ onMounted(async function () {
margin-bottom: 30px;
font-size: 48px;
}
</style>
</style>
Loading…
Cancel
Save