Ver código fonte

Merge branch 'master' of http://gitlab.smartai.com/zhupei/smartai2dian0

zhupei@smartai.com 1 ano atrás
pai
commit
a25ad9155e

+ 46 - 6
public/i18n/lang-en.json

@@ -267,8 +267,24 @@
     "reset": "Reset",
     "refresh": "Refresh",
     "density": "Density",
+    "success": "Success",
     "delete_confirm": "Are you sure you want to delete this data?",
-
+    "bread_crumb": {
+      "用户": "User",
+      "用户组": "User Group",
+      "机构": "Organization",
+      "资源": "Resource",
+      "角色": "Role"
+    },
+    "table_size": {
+      "mini": "Mini",
+      "small": "Small",
+      "medium": "Medium",
+      "large": "Large"
+    },
+    "max_length_30": "Maximum length is 30",
+    "select_placeholder": "Please select...",
+    "input_placeholder": "Please enter",
     "role": {
       "name": "Role",
       "add": "Add Role",
@@ -286,7 +302,10 @@
       "menuFunctions": "Menu Functions",
       "roleMenuPermissions": "Role Menu Permissions",
       "organization": "Organization",
-      "roleDepartments": "Role Departments"
+      "roleDepartments": "Role Departments",
+      "serial_number": "Serial Number",
+      "status": "Status",
+      "action": "Action"
     },
     "account": {
       "new_user": "New User",
@@ -307,7 +326,10 @@
       "phone": "Phone",
       "email": "Email",
       "password": "Password",
-      "roles": "Roles"
+      "roles": "Roles",
+      "reset_password_success": "The user's password has been reset to 000000",
+      "delete_success": "Deletion Successful",
+      "dept_config_success": "Department Configuration Successful"
     },
     "org": {
       "tree_title": "Organization",
@@ -320,7 +342,11 @@
       "phone": "Phone",
       "address": "Address",
       "save": "Save",
-      "reset": "Reset"
+      "reset": "Reset",
+      "delete_success": "Deletion Successful",
+      "org_name_required": "Organization Name is required",
+      "leader_required": "Leader is required",
+      "phone_required": "Phone is required"
     },
     "resource": {
       "tree_title": "Resource",
@@ -338,7 +364,16 @@
       "menuType": "Resource Type",
       "description": "Description",
       "perms": "Resource Permission Character",
-      "component": "Component Address"
+      "component": "Component Address",
+      "resource_name_required": "Resource Name is required",
+      "address_required": "Resource Address is required",
+      "menu_type": "Resource Type",
+      "menu_type_required": "Resource Type is required",
+      "perms_required": "Resource Permission Character is required",
+      "component_required": "Component Address is required",
+      "page": "Page",
+      "menu": "Menu",
+      "button": "Button"
     },
     "group": {
       "name": "User Group",
@@ -363,7 +398,11 @@
       "permission_title": "Permission Configuration",
       "knowledge_feature": "Knowledge Base Features:",
       "agent_feature": "Agent Features:",
-      "all_permissions": "All Permissions"
+      "all_permissions": "All Permissions",
+      "permission_config_success": "Permission Configuration Successful",
+      "delete_success": "Deletion Successful",
+      "member_management_success": "Member Management Successful",
+      "group_name_required": "Group Name is required"
     }
   },
   "conversation": {
@@ -387,6 +426,7 @@
     "file_upload_message": "Upload",
     "input_message": "Enter your question",
     "input_placholder_v0": "Enter text content",
+    "input_placholder_v1": "Enter “/” to use Smart intelligent dialogue to solve your problem",
     "input_placholder": "",
     "input_confirm": "Confirm",
 

+ 55 - 13
public/i18n/lang-zh.json

@@ -260,7 +260,26 @@
     "reset": "重置",
     "refresh": "刷新",
     "density": "密度",
+    "success": "成功",
+    "close": "关闭",
+    "status_switch_success": "状态切换成功",
     "delete_confirm": "确定删除该条数据吗?",
+    "bread_crumb": {
+      "用户": "用户",
+      "用户组": "用户组",
+      "机构": "机构",
+      "资源": "资源",
+      "角色": "角色"
+    },
+    "table_size": {
+      "mini": "迷你",
+      "small": "偏小",
+      "medium": "中等",
+      "large": "偏大"
+    },
+    "max_length_30": "最大长度30",
+    "select_placeholder": "请选择...",
+    "input_placeholder": "请输入",
     "role": {
       "name": "角色",
       "add": "新建角色",
@@ -269,7 +288,6 @@
       "deptEdit": "部门配置",
       "delete": "删除",
       "confirmDelete": "确定删除该条数据吗?",
-
       "roleName": "角色名称",
       "remark": "备注",
       "roleNameRequired": "角色名称必填",
@@ -278,16 +296,22 @@
       "menuFunctions": "菜单功能",
       "roleMenuPermissions": "角色菜单权限",
       "organization": "机构",
-      "roleDepartments": "角色所属部门"
+      "roleDepartments": "角色所属部门",
+      "serial_number": "序号",
+      "status": "状态",
+      "action": "操作"
     },
 
     "account": {
       "new_user": "新建用户",
       "reset_password": "重置密码",
+      "reset_password_success": "该用户密码重置为000000",
       "edit": "编辑",
       "view_permission": "查看权限",
       "dept_config": "部门配置",
+      "dept_config_success": "部门配置成功",
       "delete": "删除",
+      "delete_success": "删除成功",
       "user_permission": "用户权限",
       "menu_function": "菜单功能",
       "knowledge_base": "知识库",
@@ -300,12 +324,16 @@
       "phone": "手机号",
       "email": "邮箱",
       "password": "密码",
-      "roles": "角色"
+      "roles": "角色",
+      "all": "全部",
+      "org": "机构",
+      "user": "个人"
     },
     "org": {
       "tree_title": "机构",
       "details": "详情",
-      "add": "新增",
+      "delete": "删除",
+      "delete_success": "删除成功",
       "parent_org": "上级机构",
       "status": "机构状态",
       "org_name": "机构名称",
@@ -313,12 +341,16 @@
       "phone": "联系电话",
       "address": "机构地址",
       "save": "保存",
-      "reset": "重置"
+      "reset": "重置",
+
+      "org_name_required": "机构名称必填",
+      "leader_required": "联系人必填",
+      "phone_required": "联系电话必填"
     },
     "resource": {
       "tree_title": "资源",
       "details": "详情",
-      "add": "新增",
+
       "parent_org": "上级资源",
       "status": "资源状态",
       "resource_name": "资源名称",
@@ -331,23 +363,33 @@
       "menuType": "资源类型",
       "description": "提示词",
       "perms": "资源控制权限字符",
-      "component": "组件地址"
+      "component": "组件地址",
+
+      "resource_name_required": "资源名称必填",
+      "address_required": "资源地址必填",
+      "menu_type": "资源类型",
+      "menu_type_required": "资源类型必填",
+      "perms_required": "资源控制权限字符必填",
+      "component_required": "组件地址必填",
+      "page": "页面",
+      "menu": "菜单",
+      "button": "按钮"
     },
     "group": {
       "name": "用户组",
       "create_user_group": "新建用户组",
-      "delete": "删除",
-      "edit": "编辑",
-      "member_management": "成员管理",
       "permission_management": "权限管理",
+      "permission_config_success": "权限配置成功",
+      "delete_success": "删除成功",
+      "member_management_success": "成员管理成功",
+      "group_name": "组名称",
+      "group_name_required": "组名称必填",
+      "description": "描述",
       "modal_title_edit": "编辑",
       "modal_title_add": "新增",
       "serial_number": "序号",
-      "groupName": "组名称",
-      "description": "描述",
       "status": "状态",
       "action": "操作",
-
       "member_title": "权限配置",
       "search_placeholder": "请输入用户名搜索",
       "optional_members": "可选成员",

+ 5 - 5
src/modules/permission/account/ViewPermission.vue

@@ -3,7 +3,7 @@
     width="50%"
     v-model:visible="visible"
     :title="$t('permission.account.user_permission')"
-    okText="关闭"
+    :okText="$t('permission.close')"
     hide-cancel="true"
     @ok="handleOk"
     @cancel="handleOk"
@@ -14,7 +14,7 @@
           <div><icon-menu size="18" />{{ $t('permission.account.menu_function') }}:</div>
           <a-radio-group v-model="menu_active_type" type="button" size="small">
             <a-radio v-for="(item, index) in radio_list" :key="item.value" :value="item.value">{{
-              item.title
+              $t(item.title)
             }}</a-radio>
           </a-radio-group>
         </div>
@@ -70,9 +70,9 @@ const { visible, menu_permissions_list, knowledge_permissions_list, dialog_permi
 const emit = defineEmits(['close']);
 const menu_active_type = ref('all');
 const radio_list = [
-  { title: '全部', value: 'all' },
-  { title: '机构', value: 'org' },
-  { title: '个人', value: 'user' }
+  { title: 'permission.account.all', value: 'all' },
+  { title: 'permission.account.org', value: 'org' },
+  { title: 'permission.account.user', value: 'user' }
 ];
 
 const menu_permissions_list_computed = computed(() => {

+ 69 - 22
src/modules/permission/account/index.vue

@@ -85,7 +85,7 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted } from 'vue';
+import { ref, reactive, onMounted, watch } from 'vue';
 import { useRouter } from 'vue-router';
 import { Message } from '@arco-design/web-vue';
 import DataTable from '../../../views/permission/DataTable.vue';
@@ -109,7 +109,10 @@ import {
 } from '../../../apis/permission/account';
 import { asycData } from '../../../apis/login.js';
 import { QueryAllRoleList, QueryDeptTree } from '../../../apis/permission/common';
+import { useI18n } from 'vue-i18n';
+
 const router = useRouter();
+const { t, locale } = useI18n();
 
 const keywords = ref('');
 // 表格相关
@@ -117,11 +120,17 @@ const accountForm = ref(null);
 const delete_visible = ref(false);
 const table_data = ref([]);
 const table_columns = ref([
-  { title: '序号', width: 80, fixed: 'left', slotName: 'index' },
-  { title: '用户名', dataIndex: 'userName', fixed: 'left', width: 100, titleSlotName: 'userName' },
-  { title: '姓名', dataIndex: 'loginName', width: 100, titleSlotName: 'loginName' },
+  { title: t('permission.group.serial_number'), width: 130, fixed: 'left', slotName: 'index' },
+  {
+    title: t('permission.account.username'),
+    dataIndex: 'userName',
+    fixed: 'left',
+    width: 100,
+    titleSlotName: 'userName'
+  },
+  { title: t('permission.account.name'), dataIndex: 'loginName', width: 100, titleSlotName: 'loginName' },
   {
-    title: '角色',
+    title: t('permission.account.roles'),
     dataIndex: 'roleName',
     width: 300,
     ellipsis: true,
@@ -129,17 +138,17 @@ const table_columns = ref([
     titleSlotName: 'roleName'
   },
   {
-    title: '所属部门',
+    title: t('permission.account.user_department'),
     dataIndex: 'deptName',
     width: 400,
     ellipsis: true,
     tooltip: { position: 'top' },
     titleSlotName: 'deptName'
   },
-  { title: '手机号', dataIndex: 'phone', width: 150, titleSlotName: 'phone' },
-  { title: '邮箱', dataIndex: 'email', width: 250, titleSlotName: 'email' },
-  { title: '状态', dataIndex: 'status', width: 100, slotName: 'status' },
-  { title: '操作', dataIndex: 'operation', width: 350, fixed: 'right', slotName: 'operationSlot' }
+  { title: t('permission.account.phone'), dataIndex: 'phone', width: 150, titleSlotName: 'phone' },
+  { title: t('permission.account.email'), dataIndex: 'email', width: 250, titleSlotName: 'email' },
+  { title: t('permission.group.status'), dataIndex: 'status', width: 100, slotName: 'status' },
+  { title: t('permission.group.action'), dataIndex: 'operation', fixed: 'right', slotName: 'operationSlot' }
 ]);
 const pagination_props = ref({
   total: 10,
@@ -154,7 +163,7 @@ const edit_visible = ref(false);
 const is_edit_mode = ref(false);
 const edit_form = reactive({
   userName: '',
-  userName: '',
+  loginName: '',
   phone: '',
   email: '',
   pwd: '',
@@ -250,8 +259,7 @@ const statusChange = async (record) => {
   const { code } = await UserStatusSwitch(params);
   if (code === 200) {
     Message.success({
-      title: '成功',
-      content: '状态切换成功'
+      content: t('permission.status_switch_success')
     });
   }
 };
@@ -260,8 +268,7 @@ const handleResetPassword = async (record) => {
   const { code } = await ResetPassword(record.userId);
   if (code === 200) {
     Message.success({
-      title: '重置密码',
-      content: '该用户密码重置为000000'
+      content: t('permission.account.reset_password_success')
     });
   }
 };
@@ -328,8 +335,7 @@ const handleDeptConfigSave = async (checked_keys) => {
   const { code } = await UpdateUserDept(data);
   if (code === 200) {
     Message.success({
-      title: '部门配置',
-      content: '部门配置成功'
+      content: t('permission.account.dept_config_success')
     });
     getUserList();
   }
@@ -339,8 +345,7 @@ const handleDelete = async (userId) => {
   const { code } = await DeleteUser(userId);
   if (code === 200) {
     Message.success({
-      title: '删除用户',
-      content: '删除成功'
+      content: t('permission.account.delete_success')
     });
     getUserList();
   }
@@ -360,10 +365,9 @@ const modalSave = async () => {
           data: { userFlag }
         } = await apiCall(data);
         if (code === 200) {
-          const action = is_edit_mode.value ? '编辑' : '新增';
+          const action = is_edit_mode.value ? t('permission.edit') : t('permission.add');
           Message.success({
-            title: `${action}用户`,
-            content: `${action}成功`
+            content: `${action}${t('permission.success')}`
           });
 
           // 如果是新增用户,同步数据
@@ -418,6 +422,49 @@ const deleteModalOk = () => {
   delete_visible.value = false;
 };
 
+// 监听语言变化
+watch(
+  () => locale.value,
+  () => {
+    table_columns.value = [
+      { title: t('permission.group.serial_number'), width: 130, fixed: 'left', slotName: 'index' },
+      {
+        title: t('permission.account.username'),
+        dataIndex: 'userName',
+        fixed: 'left',
+        width: 100,
+        titleSlotName: 'userName'
+      },
+      { title: t('permission.account.name'), dataIndex: 'loginName', width: 100, titleSlotName: 'loginName' },
+      {
+        title: t('permission.account.roles'),
+        dataIndex: 'roleName',
+        width: 300,
+        ellipsis: true,
+        tooltip: { position: 'top' },
+        titleSlotName: 'roleName'
+      },
+      {
+        title: t('permission.account.user_department'),
+        dataIndex: 'deptName',
+        width: 400,
+        ellipsis: true,
+        tooltip: { position: 'top' },
+        titleSlotName: 'deptName'
+      },
+      { title: t('permission.account.phone'), dataIndex: 'phone', width: 150, titleSlotName: 'phone' },
+      { title: t('permission.account.email'), dataIndex: 'email', width: 250, titleSlotName: 'email' },
+      { title: t('permission.group.status'), dataIndex: 'status', width: 100, slotName: 'status' },
+      {
+        title: t('permission.group.action'),
+        dataIndex: 'operation',
+        fixed: 'right',
+        slotName: 'operationSlot'
+      }
+    ];
+  }
+);
+
 onMounted(() => {
   if (hasPermission('system:user:list')) {
     getUserList();

+ 6 - 2
src/modules/permission/group/GroupForm.vue

@@ -2,14 +2,18 @@
   <a-form ref="groupFormRef" :model="edit_form" auto-label-width>
     <a-row :gutter="24">
       <a-col :span="22">
-        <a-form-item field="groupName" label="组名称" :rules="[{ required: true, message: '组名称必填' }]">
+        <a-form-item
+          :field="'groupName'"
+          :label="$t('permission.group.group_name')"
+          :rules="[{ required: true, message: $t('permission.group.group_name_required') }]"
+        >
           <a-input v-model="edit_form.groupName" />
         </a-form-item>
       </a-col>
     </a-row>
     <a-row :gutter="24">
       <a-col :span="22">
-        <a-form-item field="description" label="描述">
+        <a-form-item :field="'description'" :label="$t('permission.group.description')">
           <a-textarea v-model="edit_form.description" />
         </a-form-item>
       </a-col>

+ 31 - 17
src/modules/permission/group/index.vue

@@ -45,7 +45,7 @@
             @click="handleDeleteModal(record.groupId)"
             type="text"
             status="warning"
-            >{{ $t('permission.group.delete') }}</a-button
+            >{{ $t('permission.delete') }}</a-button
           >
         </div>
       </template>
@@ -86,7 +86,7 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted } from 'vue';
+import { ref, reactive, onMounted, watch } from 'vue';
 import { useRouter } from 'vue-router';
 import { Message } from '@arco-design/web-vue';
 import DataTable from '../../../views/permission/DataTable.vue';
@@ -111,7 +111,7 @@ import {
 import { QueryAllKnowledgeList, QueryAllDialogList } from '../../../apis/permission/common';
 
 const router = useRouter();
-const { t } = useI18n();
+const { t, locale } = useI18n();
 
 const keywords = ref('');
 // 表格相关
@@ -119,11 +119,11 @@ const groupForm = ref(null);
 const delete_visible = ref(false);
 const table_data = ref([]);
 const table_columns = ref([
-  { title: t('permission.group.serial_number'), width: 80, slotName: 'index' },
-  { title: t('permission.group.groupName'), dataIndex: 'groupName', width: 150, titleSlotName: 'groupName' },
+  { title: t('permission.group.serial_number'), width: 130, slotName: 'index' },
+  { title: t('permission.group.group_name'), dataIndex: 'groupName', width: 150, titleSlotName: 'groupName' },
   { title: t('permission.group.description'), dataIndex: 'description', tooltip: true, titleSlotName: 'description' },
   { title: t('permission.group.status'), dataIndex: 'status', slotName: 'status' },
-  { title: t('permission.group.action'), dataIndex: 'operation', width: 300, fixed: 'right', slotName: 'operationSlot' }
+  { title: t('permission.group.action'), dataIndex: 'operation', slotName: 'operationSlot' }
 ]);
 const pagination_props = ref({
   total: 10,
@@ -205,8 +205,7 @@ const statusChange = async (record) => {
   const { code } = await GroupStatusSwitch(params);
   if (code === 200) {
     Message.success({
-      title: '成功',
-      content: '状态切换成功'
+      content: t('permission.status_switch_success')
     });
   }
 };
@@ -252,8 +251,7 @@ const membertConfigModalSave = async (selectedMemberList) => {
   const { code } = await SaveGroupUsers(data);
   if (code === 200) {
     Message.success({
-      title: '成员管理',
-      content: '成员修改成功'
+      content: t('permission.group.member_management_success')
     });
     membert_config_visible.value = false;
     getGroupList();
@@ -289,8 +287,7 @@ const handlePermissionConfigSave = async ({ checkedKeys }) => {
   const { code } = await ConfigGroupResource(data);
   if (code === 200) {
     Message.success({
-      title: '权限配置',
-      content: '权限配置成功'
+      content: t('permission.group.permission_config_success')
     });
     getGroupList();
   }
@@ -301,8 +298,7 @@ const handleDelete = async (groupId) => {
   const { code } = await DeleteGroup(groupId);
   if (code === 200) {
     Message.success({
-      title: '删除用户',
-      content: '删除成功'
+      content: t('permission.group.delete_success')
     });
     getGroupList();
   }
@@ -321,10 +317,9 @@ const modalSave = async () => {
         const { code } = await apiCall(data);
 
         if (code === 200) {
-          const action = is_edit_mode.value ? '编辑' : '新增';
+          const action = is_edit_mode.value ? t('permission.edit') : t('permission.add');
           Message.success({
-            title: `${action}用户`,
-            content: `${action}成功`
+            content: `${action}${t('permission.success')}`
           });
           getGroupList();
         }
@@ -367,6 +362,25 @@ const deleteModalOk = () => {
   delete_visible.value = false;
 };
 
+// 监听语言变化
+watch(
+  () => locale.value,
+  () => {
+    table_columns.value = [
+      { title: t('permission.group.serial_number'), width: 130, slotName: 'index' },
+      { title: t('permission.group.group_name'), dataIndex: 'groupName', width: 150, titleSlotName: 'groupName' },
+      {
+        title: t('permission.group.description'),
+        dataIndex: 'description',
+        tooltip: true,
+        titleSlotName: 'description'
+      },
+      { title: t('permission.group.status'), dataIndex: 'status', slotName: 'status' },
+      { title: t('permission.group.action'), dataIndex: 'operation', slotName: 'operationSlot' }
+    ];
+  }
+);
+
 onMounted(() => {
   if (hasPermission('system:group:list')) {
     getGroupList();

+ 6 - 10
src/modules/permission/org/OrgForm.vue

@@ -15,8 +15,8 @@
       field="deptName"
       :label="$t('permission.org.org_name')"
       :rules="[
-        { required: true, message: '机构名称必填' },
-        { maxLength: 50, message: '长度不超过50' }
+        { required: true, message: $t('permission.org.org_name_required') },
+        { maxLength: 30, message: $t('permission.max_length_30') }
       ]"
     >
       <a-input v-model="org_form.deptName" />
@@ -25,8 +25,8 @@
       field="leader"
       :label="$t('permission.org.leader')"
       :rules="[
-        { required: true, message: '联系人必填' },
-        { maxLength: 50, message: '长度不超过50' }
+        { required: true, message: $t('permission.org.leader_required') },
+        { maxLength: 30, message: $t('permission.max_length_30') }
       ]"
     >
       <a-input v-model="org_form.leader" />
@@ -34,14 +34,11 @@
     <a-form-item
       field="phone"
       :label="$t('permission.org.phone')"
-      :rules="[
-        { required: true, message: '联系电话必填' },
-        { maxLength: 50, message: '长度不超过50' }
-      ]"
+      :rules="[{ required: true, message: $t('permission.org.phone_required') }, { maxLength: 20 }]"
     >
       <a-input v-model="org_form.phone" />
     </a-form-item>
-    <a-form-item field="address" :label="$t('permission.org.address')">
+    <a-form-item field="address" :label="$t('permission.address')">
       <a-input v-model="org_form.address" />
     </a-form-item>
     <a-form-item>
@@ -54,7 +51,6 @@
 
 <script setup>
 import { toRefs } from 'vue';
-
 const emit = defineEmits(['statusChange']);
 
 // 接收父组件传入的参数

+ 5 - 10
src/modules/permission/org/index.vue

@@ -39,7 +39,7 @@
       :visible.sync="org_visible"
       @ok="resourceFromSave"
       @cancel="resourceFromCancel"
-      :title="$t('permission.org.add')"
+      :title="$t('permission.add')"
     >
       <OrgForm ref="orgForm" :org_form="org_form"></OrgForm>
     </Modal>
@@ -130,8 +130,7 @@ const onDeleteBtnClick = async ({ deptId }) => {
   const { code } = await DeleteDept(deptId);
   if (code === 200) {
     Message.success({
-      title: '删除',
-      content: '删除成功'
+      content: t('permission.org.delete_success')
     });
   }
   getDeptTree();
@@ -145,13 +144,11 @@ const resourceFromStatusChange = async (status) => {
   const { code, msg } = await UpdateDeptStatus(data);
   if (code === 200) {
     Message.success({
-      title: '状态更新',
-      content: '状态更新成功'
+      content: t('permission.status_switch_success')
     });
     getDeptTree();
   } else {
     Message.error({
-      title: '状态更新',
       content: msg
     });
     org_form.status = '1';
@@ -171,10 +168,9 @@ const resourceFromSave = async () => {
         const { code } = await apiCall(data);
 
         if (code === 200) {
-          const action = is_edit_mode.value ? '编辑' : '新增';
+          const action = is_edit_mode.value ? t('permission.edit') : t('permission.add');
           Message.success({
-            title: `${action}用户`,
-            content: `${action}成功`
+            content: `${action}${t('permission.success')}`
           });
 
           getDeptTree();
@@ -255,7 +251,6 @@ onMounted(() => {
 .left {
   width: 30%;
   height: 100%;
-  background-color: #fff;
 }
 
 .right {

+ 4 - 9
src/modules/permission/resource/IconPicker.vue

@@ -5,7 +5,7 @@
         <component :is="modelValue" />
 
         <template #content>
-          <a-scrollbar style="height:60vh;width: 45vw;overflow-y: auto;">
+          <a-scrollbar style="height: 60vh; width: 45vw; overflow-y: auto">
             <div class="icons-grid">
               <div v-for="(iconName, index) in iconsList" :key="index" @click="selectIcon(iconName)" class="icon-item">
                 <component :is="iconName" />
@@ -26,8 +26,8 @@ import arcoIconList from './arcoIcon.json';
 const props = defineProps({
   modelValue: {
     type: String,
-    default: '',
-  },
+    default: ''
+  }
 });
 const { modelValue } = toRefs(props);
 
@@ -37,15 +37,10 @@ const iconsList = arcoIconList.iconsList || [];
 
 const selectIcon = (iconName) => {
   emit('update:modelValue', iconName);
-}
-
+};
 </script>
 
 <style scoped>
-.icon-selector {
-  /* 添加样式 */
-}
-
 svg {
   font-size: 28px;
 }

+ 42 - 36
src/modules/permission/resource/ResourceForm.vue

@@ -15,8 +15,8 @@
       field="menuName"
       :label="$t('permission.resource.resource_name')"
       :rules="[
-        { required: true, message: '资源名称必填' },
-        { maxLength: 50, message: '长度不超过50' }
+        { required: true, message: $t('permission.resource.resource_name_required') },
+        { maxLength: 30, message: $t('permission.max_length_30') }
       ]"
     >
       <a-input v-model="resource_form.menuName" />
@@ -25,8 +25,8 @@
       field="path"
       :label="$t('permission.resource.address')"
       :rules="[
-        { required: true, message: '资源地址必填' },
-        { maxLength: 50, message: '长度不超过50' }
+        { required: true, message: $t('permission.resource.address_required') },
+        { maxLength: 30, message: $t('permission.max_length_30') }
       ]"
     >
       <a-input v-model="resource_form.path" />
@@ -36,26 +36,26 @@
     </a-form-item>
     <a-form-item
       field="menuType"
-      :label="$t('permission.resource.menuType')"
-      :rules="[{ required: true, message: '资源类型必填' }]"
+      :label="$t('permission.resource.menu_type')"
+      :rules="[{ required: true, message: $t('permission.resource.menu_type_required') }]"
     >
       <a-select
         v-model="resource_form.menuType"
         :options="options"
         :field-names="fieldNames"
         :style="{ width: '320px' }"
-        placeholder="请选择"
+        :placeholder="$t('permission.select_placeholder')"
       />
     </a-form-item>
     <a-form-item field="description" :label="$t('permission.resource.description')">
-      <a-input v-model="resource_form.description" placeholder="请输入提示词" />
+      <a-input v-model="resource_form.description" :placeholder="$t('permission.input_placeholder')" />
     </a-form-item>
     <a-form-item
       field="perms"
       :label="$t('permission.resource.perms')"
       :rules="[
-        { required: true, message: '资源控制权限字符必填' },
-        { maxLength: 50, message: '长度不超过50' }
+        { required: true, message: $t('permission.resource.perms_required') },
+        { maxLength: 30, message: $t('permission.max_length_30') }
       ]"
     >
       <a-input v-model="resource_form.perms" />
@@ -65,8 +65,8 @@
       :label="$t('permission.resource.component')"
       style="align: start"
       :rules="[
-        { required: true, message: '组件地址必填' },
-        { maxLength: 50, message: '长度不超过50' }
+        { required: true, message: $t('permission.resource.component_required') },
+        { maxLength: 30, message: $t('permission.max_length_30') }
       ]"
     >
       <a-input v-model="resource_form.component" />
@@ -80,14 +80,13 @@
 </template>
 
 <script setup>
-import { ref, toRefs } from 'vue';
+import { toRefs, watch, ref } from 'vue';
 import IconPicker from './IconPicker.vue';
-
-const fileList = ref([]);
-const imageUrls = ref([]);
-
+import { useI18n } from 'vue-i18n';
 const emit = defineEmits(['statusChange']);
 
+const { t, locale } = useI18n();
+
 // 接收父组件传入的参数
 const props = defineProps({
   resource_form: {
@@ -110,39 +109,46 @@ const props = defineProps({
   }
 });
 
-const options = [
+const options = ref([
   {
     value: '3',
-    label: '页面'
+    label: t('permission.resource.page')
   },
   {
     value: '0',
-    label: '菜单'
+    label: t('permission.resource.menu')
   },
   {
     value: '1',
-    label: '按钮'
+    label: t('permission.resource.button')
   }
-];
+]);
 
 // 将 props 解构
 const { resource_form } = toRefs(props);
 
-const updateFileList = (newFileList) => {
-  fileList.value = newFileList;
-};
-
-const handleSuccess = (urls) => {
-  uploadUrl.value = urls;
-
-  const urlsArr = urls.map((url) => {
-    return httpUrl + url;
-  });
-  imageUrls.value = urlsArr; // 拿到上传的图片地址
-};
 const statusChange = (status) => {
   emit('statusChange', status);
 };
-</script>
 
-<style lang="css" scoped></style>
+// 监听语言变化
+watch(
+  () => locale.value,
+  () => {
+    options.value = [
+      {
+        value: '3',
+        label: t('permission.resource.page')
+      },
+      {
+        value: '0',
+        label: t('permission.resource.menu')
+      },
+      {
+        value: '1',
+        label: t('permission.resource.button')
+      }
+    ];
+  }
+);
+</script>

+ 4 - 7
src/modules/permission/resource/index.vue

@@ -142,8 +142,7 @@ const onDeleteBtnClick = async ({ menuId }) => {
   const { code } = await DeleteResource(menuId);
   if (code === 200) {
     Message.success({
-      title: '删除',
-      content: '删除成功'
+      content: t('permission.org.delete_success')
     });
   }
   getResourceTree();
@@ -156,8 +155,7 @@ const resourceFromStatusChange = async (status) => {
   const { code } = await UpdateResourceStatus(data);
   if (code === 200) {
     Message.success({
-      title: '状态更新',
-      content: '状态更新成功'
+      content: t('permission.status_switch_success')
     });
     getResourceTree();
   }
@@ -176,10 +174,9 @@ const resourceFromSave = async () => {
         const { code } = await apiCall(data);
 
         if (code === 200) {
-          const action = is_edit_mode.value ? '编辑' : '新增';
+          const action = is_edit_mode.value ? t('permission.edit') : t('permission.add');
           Message.success({
-            title: `${action}用户`,
-            content: `${action}成功`
+            content: `${action}${t('permission.success')}`
           });
 
           getResourceTree();

+ 27 - 5
src/modules/permission/role/index.vue

@@ -81,9 +81,10 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, h } from 'vue';
+import { ref, reactive, onMounted, watch } from 'vue';
 import { useRouter } from 'vue-router';
 import { Message } from '@arco-design/web-vue';
+import { useI18n } from 'vue-i18n';
 import DataTable from '../../../views/permission/DataTable.vue';
 import Action from '../../../views/permission/Action.vue';
 import Modal from '../../../views/permission/Modal.vue';
@@ -98,16 +99,18 @@ import { QueryDeptTree } from '../../../apis/permission/common';
 
 const router = useRouter();
 
+const { t, locale } = useI18n();
+
 const keywords = ref('');
 // 表格相关
 const roleForm = ref(null);
 const delete_visible = ref(false);
 const table_data = ref([]);
 const table_columns = ref([
-  { title: '序号', width: 80, slotName: 'index' },
-  { title: '角色名', dataIndex: 'roleName', width: 600, titleSlotName: 'roleName' },
-  { title: '状态', dataIndex: 'status', slotName: 'status' },
-  { title: '操作', dataIndex: 'operation', width: 300, fixed: 'right', slotName: 'operationSlot' }
+  { title: t('permission.role.serial_number'), width: 130, slotName: 'index' },
+  { title: t('permission.role.roleName'), dataIndex: 'roleName', width: 600, titleSlotName: 'roleName' },
+  { title: t('permission.role.status'), dataIndex: 'status', slotName: 'status' },
+  { title: t('permission.role.action'), dataIndex: 'operation', width: 500, fixed: 'right', slotName: 'operationSlot' }
 ]);
 const pagination_props = ref({
   total: 10,
@@ -328,6 +331,25 @@ const deleteModalOk = () => {
   delete_visible.value = false;
 };
 
+// 监听语言变化
+watch(
+  () => locale.value,
+  () => {
+    table_columns.value = [
+      { title: t('permission.role.serial_number'), width: 130, slotName: 'index' },
+      { title: t('permission.role.roleName'), dataIndex: 'roleName', width: 600, titleSlotName: 'roleName' },
+      { title: t('permission.role.status'), dataIndex: 'status', slotName: 'status' },
+      {
+        title: t('permission.role.action'),
+        dataIndex: 'operation',
+        width: 500,
+        fixed: 'right',
+        slotName: 'operationSlot'
+      }
+    ];
+  }
+);
+
 onMounted(() => {
   if (hasPermission('system:role:list')) {
     gerRoleList();

+ 2 - 2
src/views/common/BreadCrumbMenu.vue

@@ -1,8 +1,8 @@
 <template>
   <a-breadcrumb class="breadcrumb">
     <a-breadcrumb-item><icon-apps /></a-breadcrumb-item>
-    <a-breadcrumb-item>权限管理</a-breadcrumb-item>
-    <a-breadcrumb-item>{{ current_label }}</a-breadcrumb-item>
+    <a-breadcrumb-item>{{ $t('header.权限管理') }}</a-breadcrumb-item>
+    <a-breadcrumb-item>{{ $t(`permission.bread_crumb.${current_label}`) }}</a-breadcrumb-item>
   </a-breadcrumb>
 </template>
 

+ 5 - 7
src/views/permission/Action.vue

@@ -49,7 +49,7 @@
               :value="item.value"
               :class="{ active: item.value === size }"
             >
-              <span>{{ item.name }}</span>
+              <span>{{ $t(item.name) }}</span>
             </a-doption>
           </template>
         </a-dropdown>
@@ -75,19 +75,19 @@ const input_value = ref('');
 const size = ref('medium');
 const density_list = [
   {
-    name: '迷你',
+    name: 'permission.table_size.mini',
     value: 'mini'
   },
   {
-    name: '偏小',
+    name: 'permission.table_size.small',
     value: 'small'
   },
   {
-    name: '中等',
+    name: 'permission.table_size.medium',
     value: 'medium'
   },
   {
-    name: '偏大',
+    name: 'permission.table_size.large',
     value: 'large'
   }
 ];
@@ -114,14 +114,12 @@ const sizeChange = (val) => {
 
 <style lang="css" scoped>
 .table-page-search-wrapper {
-  background-color: #fff;
   padding-top: 10px;
   display: flex;
   justify-content: space-between;
   align-items: center;
   margin-bottom: 20px;
   padding-bottom: 10px;
-  border-bottom: 1px solid #e8e8e8;
 }
 
 .search-wrapper {

+ 7 - 2
src/views/permission/TreeParts.vue

@@ -24,9 +24,13 @@
       @select="nodeClick"
     >
       <template #extra="nodeData">
-        <IconPlus class="icon-plus" @click="() => onAddBtnClick(nodeData)" />
+        <IconPlus v-if="add_permission" class="icon-plus" @click="() => onAddBtnClick(nodeData)" />
 
-        <IconDelete v-if="nodeData.parentId" @click="handleDeleteModal(nodeData)" class="icon-delete" />
+        <IconDelete
+          v-if="delete_permission && nodeData.parentId"
+          @click="handleDeleteModal(nodeData)"
+          class="icon-delete"
+        />
       </template>
     </a-tree>
   </a-card>
@@ -106,6 +110,7 @@ watch(
 <style lang="css" scoped>
 .tree-card {
   width: 100%;
+  height: 100%;
   overflow-y: auto;
 }