Commit 640f1611 by 李宁

1

1 parent d3641432
......@@ -2,7 +2,10 @@
"permissions": {
"allow": [
"Bash(grep -E \"\\.(js|vue|html)$\")",
"Bash(npm install axios)"
"Bash(npm install axios)",
"Bash(tree src/)",
"Bash(npm run build)",
"Bash(npm run build-only)"
],
"deny": [],
"ask": []
......
......@@ -13,6 +13,11 @@ const handleLogin = (username: string, role: 'admin' | 'viewer') => {
isLoggedIn.value = true
}
if(isLoggedIn){
let name = JSON.parse(localStorage.getItem('pcUserInfo')).nickname||''
handleLogin( name, 'admin')
}
// 登出处理
const handleLogout = () => {
localStorage.removeItem('pcUserInfo')
......
import request from '../../request'
/**
* 查询人员列表
*/
export function queryAllPerson(data) {
return request({
url: '/compass/api/personnel/list',
data,
})
}
/**
* 添加人员
* 查询角色列表
*/
export function addNewPerson(data) {
let url = '/compass/api/personnel/create'
if(data.id){
url = '/compass/api/personnel/update'
}
export function queryRoleList(data) {
return request({
url: url,
url: '/crm/getRoleList',
method: 'GET',
data,
})
}
/**
* 删除人员
*/
export function deletePerson(data) {
return request({
url: '/compass/api/personnel/delete',
data,
})
}
/**
* 批量导入工维人员
* 创建和修改角色
*/
export function importGwPerson(data) {
return request({
url: '/compass/api/personnel/import-maintenance-preview',
data,
})
}
export function createOrUpdateRole(data) {
let url = '/crm/createRole'
if(data.roleId){
url = '/crm/updateRole'
}
/**
* 批量导入营销人员
*/
export function importYxPerson(data) {
return request({
url: '/compass/api/marketing/import-preview',
url,
data,
})
}
......@@ -18,7 +18,7 @@ service.interceptors.request.use(
if (localStorage.pcUserInfo) {
let userInfo = JSON.parse(localStorage.pcUserInfo);
config.headers["x-access-token"] = userInfo.token
config.headers["token"] = userInfo.token
}
return config;
......
......@@ -20,7 +20,7 @@
<nav class="flex-1 py-6 px-3 overflow-hidden">
<div class="space-y-6">
<!-- 业务管理菜单 -->
<div class="space-y-1">
<div class="space-y-1" v-if="businessMenuItems.length>0">
<div v-if="!isSidebarCollapsed" class="px-4 mb-2">
<p class="text-xs text-neutral-500 uppercase tracking-wide">业务管理</p>
</div>
......@@ -64,7 +64,7 @@
</div>
<!-- 系统管理菜单 -->
<div class="space-y-1">
<div class="space-y-1" v-if="systemMenuItems.length>0">
<div v-if="!isSidebarCollapsed" class="px-4 mb-2">
<p class="text-xs text-neutral-500 uppercase tracking-wide">系统管理</p>
</div>
......@@ -298,12 +298,23 @@ import platformLogoImg from '@/assets/8a3322d5ba8c2ae3592af24d73566a63828a3a27.p
import OrderMonitoring from './OrderMonitoring.vue'
import OrderDetail from './OrderDetail.vue'
import BusinessRulesManagement from './BusinessRulesManagement.vue'
import RoleManagement from './RoleManagement.vue'
import UserManagement from './UserManagement.vue'
import RoleManagement, { type Permission } from './RoleManagement.vue'
import UserManagement, { type User as UserType } from './UserManagement.vue'
import RoleIcon from './icons/RoleIcon.vue'
const platformLogo = ref(platformLogoImg)
// 本地Role类型定义,确保permissions字段是必需的
interface Role {
id: string
name: string
description?: string
level: '地市级' | '区县级' | '一线人员'
permissions: string[]
status: '启用' | '禁用'
createTime?: string
}
interface DesktopMainProps {
currentUser: { username: string; role: 'admin' | 'viewer' } | null;
}
......@@ -317,16 +328,60 @@ const activeMenu = ref<string>('orders') // 当前激活的菜单
const activeView = ref<string>('orders') // 当前显示的视图
const selectedOrderId = ref<string | null>(null) // 当前查看的订单ID
const userInfo = ref(localStorage.getItem('pcUserInfo')?JSON.parse(localStorage.getItem('pcUserInfo')):{})
// 菜单配置
const businessMenuItems = [
{ id: 'orders', label: '登记订单管理', icon: LayoutDashboard },
{ id: 'business', label: '业务酬金管理', icon: DollarSign }
]
// const businessMenuItems = [
// { id: 'orders', label: '登记订单管理', icon: LayoutDashboard },
// { id: 'business', label: '业务酬金管理', icon: DollarSign }
// ]
const businessMenuItems = computed(() => {
let va = userInfo.value
if(va.functions){
let arr = va.functions.filter(item=>{return item.id==1})
if(arr.length>0 && arr[0].children){
let barr = []
arr[0].children.forEach(item=>{
if(item.id == 2){
barr.push({ id: 'orders', label: '登记订单管理', icon: LayoutDashboard })
}
if(item.id == 8){
barr.push({ id: 'business', label: '业务酬金管理', icon: DollarSign })
}
})
const systemMenuItems = [
{ id: 'roles', label: '角色管理', icon: RoleIcon },
{ id: 'users', label: '账号管理', icon: Users }
]
return barr
}
}
return []
})
// const systemMenuItems = [
// { id: 'roles', label: '角色管理', icon: RoleIcon },
// { id: 'users', label: '账号管理', icon: Users }
// ]
const systemMenuItems = computed(() => {
let va = userInfo.value
if(va.functions){
let arr = va.functions.filter(item=>{return item.id==14})
if(arr.length>0 && arr[0].children){
let barr = []
arr[0].children.forEach(item=>{
if(item.id == 15){
barr.push({ id: 'roles', label: '角色管理', icon: RoleIcon })
}
if(item.id == 19){
barr.push({ id: 'users', label: '账号管理', icon: Users })
}
})
return barr
}
}
return []
})
const menuMap: Record<string, string> = {
orders: '登记订单管理',
......@@ -343,7 +398,7 @@ const currentMenuTitle = computed(() => {
})
// 业务规则数据
const businessRules = ref([
const businessRules = ref<BusinessRule[]>([
{
id: 'BIZ001',
businessCode: 'B5G001',
......@@ -383,28 +438,28 @@ const businessRules = ref([
const orders = ref([])
// 存储从 OrderMonitoring 组件获取的订单数据
const allOrders = ref([])
const allOrders = ref([] as any[])
// 类型定义
interface Role {
interface BusinessRule {
id: string
name: string
description?: string
level: '地市级' | '区县级' | '一线人员'
permissionIds: string[]
status: '启用' | '禁用'
createTime?: string
businessCode: string
businessName: string
estimatedReward: number
status: "生效中" | "已停用"
createTime: string
}
interface Permission {
interface Organization {
id: string
name: string
code: string
description?: string
type: "地市" | "区县" | "客户经理团队"
parentId?: string
children?: Permission[]
children?: Organization[]
}
// 角色管理数据
const roles = ref<Role[]>([
{
......@@ -412,7 +467,7 @@ const roles = ref<Role[]>([
name: '区县全权管理员',
description: '拥有区县级别的所有管理权限,可以管理订单、用户和业务规则',
level: '区县级',
permissionIds: [
permissions: [
'order',
'order:view',
'order:complete',
......@@ -431,7 +486,7 @@ const roles = ref<Role[]>([
'system:account:view',
'system:account:create',
'system:account:edit'
],
] as string[],
status: '启用',
createTime: '2025-10-20 09:00:00'
},
......@@ -440,7 +495,7 @@ const roles = ref<Role[]>([
name: '订单管理员',
description: '负责订单的日常管理和处理',
level: '一线人员',
permissionIds: ['order', 'order:view', 'order:complete', 'order:reward', 'order:approve'],
permissions: ['order', 'order:view', 'order:complete', 'order:reward', 'order:approve'] as string[],
status: '启用',
createTime: '2025-10-20 09:30:00'
},
......@@ -449,18 +504,18 @@ const roles = ref<Role[]>([
name: '业务酬金管理员',
description: '负责业务酬金的配置和维护',
level: '区县级',
permissionIds: ['business', 'business:view', 'business:create', 'business:edit'],
permissions: ['business', 'business:view', 'business:create', 'business:edit'] as string[],
status: '启用',
createTime: '2025-10-20 10:00:00'
}
])
// 权限数据
const permissions = ref<Permission[]>(JSON.parse(localStorage.getItem('pcUserInfo')).functions)
const permissions = ref<Permission[]>(JSON.parse(localStorage.getItem('pcUserInfo') || '{}').functions || [])
// 根据订单ID获取订单详情
const getOrderById = (orderId: string) => {
return allOrders.value.find(order => order.id === orderId)
return allOrders.value.find((order: any) => order.id === orderId)
}
// 方法
......@@ -526,7 +581,7 @@ const handleBreadcrumbClick = (level: string) => {
}
// 业务规则管理方法
const handleAddBusinessRule = (ruleData: Omit<any, 'id' | 'createTime'>) => {
const handleAddBusinessRule = (ruleData: Omit<BusinessRule, 'id' | 'createTime'>) => {
const newRule = {
id: `BIZ${String(businessRules.value.length + 1).padStart(3, '0')}`,
...ruleData,
......@@ -543,20 +598,14 @@ const handleAddBusinessRule = (ruleData: Omit<any, 'id' | 'createTime'>) => {
console.log('新增业务规则:', newRule)
}
const handleUpdateBusinessRule = (ruleId: string, updates: any) => {
const handleUpdateBusinessRule = (ruleId: string, updates: Partial<BusinessRule>) => {
const ruleIndex = businessRules.value.findIndex(rule => rule.id === ruleId)
if (ruleIndex !== -1) {
const existingRule = businessRules.value[ruleIndex]
businessRules.value[ruleIndex] = {
...businessRules.value[ruleIndex],
...updates,
updateTime: new Date().toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
})
}
...existingRule,
...updates
} as BusinessRule
ElMessage.success('业务规则更新成功')
console.log('更新业务规则:', ruleId, updates)
}
......@@ -565,19 +614,15 @@ const handleUpdateBusinessRule = (ruleId: string, updates: any) => {
const handleToggleBusinessRuleStatus = (ruleId: string) => {
const ruleIndex = businessRules.value.findIndex(rule => rule.id === ruleId)
if (ruleIndex !== -1) {
const currentStatus = businessRules.value[ruleIndex].status
const rule = businessRules.value[ruleIndex]
if (rule) {
const currentStatus = rule.status
const newStatus = currentStatus === '生效中' ? '已停用' : '生效中'
businessRules.value[ruleIndex].status = newStatus
businessRules.value[ruleIndex].updateTime = new Date().toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
})
rule.status = newStatus
ElMessage.success(`业务规则已${newStatus === '生效中' ? '启用' : '停用'}`)
console.log('切换业务规则状态:', ruleId, newStatus)
}
}
}
const handleDeleteBusinessRule = (ruleId: string) => {
......@@ -590,10 +635,11 @@ const handleDeleteBusinessRule = (ruleId: string) => {
}
// 角色管理方法
const handleAddRole = (roleData: Omit<Role, 'id' | 'createTime'>) => {
const newRole = {
const handleAddRole = (roleData: any) => {
const newRole: Role = {
id: `role-${Date.now()}`,
...roleData,
permissions: roleData.permissions || roleData.permissionIds || [],
createTime: new Date().toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
......@@ -607,16 +653,23 @@ const handleAddRole = (roleData: Omit<Role, 'id' | 'createTime'>) => {
console.log('新增角色:', newRole)
}
const handleUpdateRole = (roleId: string, updates: Partial<Role>) => {
const handleUpdateRole = (roleId: string, updates: any) => {
const roleIndex = roles.value.findIndex(role => role.id === roleId)
if (roleIndex !== -1) {
roles.value[roleIndex] = { ...roles.value[roleIndex], ...updates }
const existingRole = roles.value[roleIndex]
if (existingRole) {
roles.value[roleIndex] = {
...existingRole,
...updates,
permissions: updates.permissions || updates.permissionIds || existingRole.permissions
} as Role
console.log('更新角色:', roleId, updates)
}
}
}
// 组织架构数据
const organizations = ref([
const organizations = ref<Organization[]>([
{
id: 'org-001',
name: '杭州市移动',
......@@ -672,7 +725,7 @@ const organizations = ref([
const currentUserId = ref('user-001')
// 用户数据
const users = ref([
const users = ref<UserType[]>([
{
id: 'user-001',
username: 'admin',
......@@ -724,9 +777,10 @@ const users = ref([
])
// 用户管理方法
const handleAddUser = (userData: any) => {
const handleAddUser = (userData: Omit<UserType, 'id' | 'createTime' | 'creatorId'>) => {
const newUser = {
id: `user-${Date.now()}`,
creatorId: props.currentUser?.username || 'system',
...userData,
createTime: new Date().toLocaleString('zh-CN', {
year: 'numeric',
......@@ -736,15 +790,19 @@ const handleAddUser = (userData: any) => {
minute: '2-digit',
second: '2-digit'
})
}
} as UserType
users.value.push(newUser)
console.log('新增用户:', newUser)
}
const handleUpdateUser = (userId: string, updates: any) => {
const handleUpdateUser = (userId: string, updates: Partial<UserType>) => {
const userIndex = users.value.findIndex(user => user.id === userId)
if (userIndex !== -1) {
users.value[userIndex] = { ...users.value[userIndex], ...updates }
const existingUser = users.value[userIndex]
users.value[userIndex] = {
...existingUser,
...updates
} as UserType
console.log('更新用户:', userId, updates)
}
}
......
......@@ -222,7 +222,7 @@ const generateCaptcha = async () => {
}
// 倒计时逻辑
let countdownTimer: NodeJS.Timeout | null = null
let countdownTimer: number | null = null
const startCountdown = () => {
countdown.value = 60
......
......@@ -143,7 +143,7 @@ const props = withDefaults(defineProps<Props>(), {
roleId: '',
roles: () => [],
expandedIds: () => new Set(),
accountType: ''
accountType: undefined
})
const emit = defineEmits<{
......
<template>
<div class="space-y-1">
<div
:class="`permission-tree-node flex items-center gap-2 p-2 rounded ${level > 0 ? 'ml-6' : ''}`"
>
:class="`permission-tree-node flex items-center gap-2 p-2 rounded ${level > 0 ? 'ml-6' : ''}`">
<!-- 展开/收起按钮 -->
<button
v-if="hasChildren"
......@@ -27,18 +26,18 @@
<div class="flex-1">
<div class="flex items-center gap-2">
<span class="text-neutral-900">{{ permission.name }}</span>
<el-tag
<!-- <el-tag
type="info"
effect="plain"
size="small"
class="text-xs"
>
{{ permission.code }}
</el-tag>
</el-tag> -->
</div>
<p v-if="permission.description" class="text-xs text-neutral-500 mt-1">
<!-- <p v-if="permission.description" class="text-xs text-neutral-500 mt-1">
{{ permission.description }}
</p>
</p> -->
</div>
</div>
......
......@@ -23,44 +23,28 @@
:data="filteredRoles"
style="width: 100%"
:header-cell-style="{ backgroundColor: '#f3f4f6', color: '#374151', fontWeight: '500', borderBottom: '1px solid #e5e7eb' }"
:row-style="{ borderBottom: '1px solid rgb(243 244 246)' }"
>
<el-table-column prop="name" label="角色名称" min-width="120">
<template #default="{ row }">
<span class="text-neutral-900">{{ row.name }}</span>
</template>
</el-table-column>
<el-table-column prop="permissionIds" label="权限数量" min-width="100">
:row-style="{ borderBottom: '1px solid rgb(243 244 246)' }">
<el-table-column prop="roleName" label="角色名称" min-width="120">
<template #default="{ row }">
<el-tag
type="info"
effect="plain"
size="small"
class="bg-neutral-50"
>
{{ row.permissionIds.length }} 个权限
</el-tag>
<span class="text-neutral-900">{{ row.roleName }}</span>
</template>
</el-table-column>
<el-table-column prop="status" label="状态" min-width="80">
<template #default="{ row }">
<el-tag
:type="row.status === '启用' ? 'success' : 'info'"
:type="row.status == 1 ? 'success' : 'info'"
effect="plain"
size="small"
>
{{ row.status }}
{{ row.status==1?'启用':'停用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" min-width="150">
<template #default="{ row }">
<span class="text-neutral-600">{{ row.createTime || '-' }}</span>
<span class="text-neutral-600">{{ $utils.detailTime(row.createTime)}}</span>
</template>
</el-table-column>
......@@ -191,11 +175,32 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue'
import { ref,onMounted, computed, watch ,getCurrentInstance} from 'vue'
import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import PermissionTreeNode from './PermissionTreeNode.vue'
const { $api,$utils } = getCurrentInstance()!.appContext.config.globalProperties
onMounted(() => {
// 初始化数据
handleFilter()
})
const handleFilter = async () => {
try {
const response = await $api.queryRoleList({});
if (response.c === 0) {
filteredRoles.value = response.d
ElMessage.success('查询成功');
} else {
ElMessage.error(response.msg || '查询失败');
}
} catch (error) {
ElMessage.error('查询失败: ' + error.message);
}
}
// 类型定义
export interface Permission {
id: string
......@@ -211,7 +216,8 @@ export interface Role {
name: string
description?: string
level: RoleLevel
permissionIds: string[]
permissionIds?: string[]
permissions?: string[]
status: RoleStatus
createTime?: string
}
......@@ -242,6 +248,7 @@ const roleName = ref('')
const roleDescription = ref('')
const selectedPermissions = ref<string[]>([])
const roleLevel = ref<'地市级' | '区县级' | '一线人员'>('区县级')
const roleStatusEnabled = ref(true)
// 权限树展开状态
......@@ -254,9 +261,12 @@ const topLevelPermissions = computed(() =>
props.permissions.filter(p => !p.parentId)
)
const filteredRoles = computed(() =>
props.roles.filter(role => role.name !== '地市主管理员')
)
const filteredRoles = ref([])
// 获取角色的权限ID列表,兼容不同的字段名
const getRolePermissionIds = (role: Role): string[] => {
return role.permissionIds || role.permissions || []
}
......@@ -278,7 +288,7 @@ const handleOpenEditDialog = (role: Role) => {
roleName.value = role.name
roleDescription.value = role.description || ''
selectedPermissions.value = [...role.permissionIds]
selectedPermissions.value = [...getRolePermissionIds(role)]
roleStatusEnabled.value = role.status === '启用'
expandedPermissions.value = new Set(props.permissions.filter(p => !p.parentId).map(p => p.id))
isDialogOpen.value = true
......@@ -299,7 +309,7 @@ const handleSave = () => {
const roleData = {
name: roleName.value.trim(),
description: roleDescription.value.trim(),
level: roleLevel.value,
permissionIds: selectedPermissions.value,
status: roleStatus.value
}
......
......@@ -336,7 +336,7 @@ import { Plus, Building2, Search } from 'lucide-vue-next'
import OrganizationTree from './OrganizationTree.vue'
// 类型定义
interface User {
export interface User {
id: string
username: string
realName: string
......@@ -378,7 +378,7 @@ interface UserManagementProps {
const props = defineProps<UserManagementProps>()
const emit = defineEmits<{
addUser: [user: Omit<User, 'id' | 'createTime'>]
addUser: [user: Omit<User, 'id' | 'createTime' | 'creatorId'>]
updateUser: [id: string, updates: Partial<User>]
}>()
......@@ -398,7 +398,7 @@ const formData = ref({
realName: '',
phone: '',
accountType: '',
accountType: '一线人员' as '地市级' | '区县级' | '一线人员',
organizationId: '',
roleId: '',
isActive: true
......@@ -502,7 +502,7 @@ const handleOpenAddDialog = () => {
realName: '',
phone: '',
accountType: '',
accountType: '一线人员' as '地市级' | '区县级' | '一线人员',
organizationId: '',
roleId: '',
isActive: true
......@@ -517,7 +517,7 @@ const handleOpenEditDialog = (user: User) => {
realName: user.realName,
phone: user.phone || '',
accountType: user.accountType || '',
accountType: user.accountType || '一线人员',
organizationId: user.organizationId,
roleId: user.roleId,
isActive: user.status === '正常'
......
......@@ -13,8 +13,11 @@ import App from './App.vue'
import router from './router'
// 引入 API 接口和工具方法
// @ts-ignore
import api from './assets/js/api/interface/index.js'
// @ts-ignore
import stores from './assets/js/stores/index.js'
// @ts-ignore
import commonUtils from './assets/js/const/common.js'
const app = createApp(App)
......
<template>
<div class="min-h-screen bg-gray-50 p-6">
<div class="max-w-7xl mx-auto">
<h1 class="text-2xl font-bold text-gray-900 mb-6">角色管理测试页面</h1>
<RoleManagement
:roles="roles"
:permissions="permissions"
@add-role="handleAddRole"
@update-role="handleUpdateRole"
/>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import RoleManagement, { type Role, type Permission } from '@/components/RoleManagement.vue'
import { ElMessage } from 'element-plus'
// 测试数据
const roles = ref<Role[]>([
{
id: 'role-001',
name: '区县全权管理员',
description: '拥有区县级别的所有管理权限,可以管理订单、用户和业务规则',
level: '区县级',
permissions: [
'order',
'order:view',
'order:complete',
'order:reward',
'order:approve',
'business',
'business:view',
'business:create',
'business:edit',
'system',
'system:role',
'system:role:view',
'system:role:create',
'system:role:edit',
'system:account',
'system:account:view',
'system:account:create',
'system:account:edit'
],
status: '启用',
createTime: '2025-10-20 09:00:00'
},
{
id: 'role-002',
name: '订单管理员',
description: '负责订单的日常管理和处理',
level: '一线人员',
permissions: ['order', 'order:view', 'order:complete', 'order:reward', 'order:approve'],
status: '启用',
createTime: '2025-10-20 09:30:00'
},
{
id: 'role-003',
name: '业务规则管理员',
description: '负责业务规则的配置和维护',
level: '区县级',
permissions: ['business', 'business:view', 'business:create', 'business:edit'],
status: '启用',
createTime: '2025-10-20 10:00:00'
}
])
const permissions = ref<Permission[]>([
{
id: 'order',
name: '订单管理',
code: 'order',
description: '订单相关的所有权限',
children: [
{
id: 'order:view',
name: '查看订单',
code: 'order:view',
description: '查看订单列表和详情',
parentId: 'order'
},
{
id: 'order:complete',
name: '填写办结信息',
code: 'order:complete',
description: '填写CRM订单编号和办理备注',
parentId: 'order'
},
{
id: 'order:reward',
name: '填写酬金金额',
code: 'order:reward',
description: '填写和修改实际发放酬金',
parentId: 'order'
},
{
id: 'order:approve',
name: '审核',
code: 'order:approve',
description: '审核通过或驳回订单',
parentId: 'order'
}
]
},
{
id: 'business',
name: '业务规则管理',
code: 'business',
description: '业务规则相关权限',
children: [
{
id: 'business:view',
name: '查看业务规则',
code: 'business:view',
description: '查看业务规则列表',
parentId: 'business'
},
{
id: 'business:create',
name: '创建业务规则',
code: 'business:create',
description: '创建新的业务规则',
parentId: 'business'
},
{
id: 'business:edit',
name: '编辑业务规则',
code: 'business:edit',
description: '修改和停用业务规则',
parentId: 'business'
}
]
},
{
id: 'system',
name: '系统管理',
code: 'system',
description: '系统管理相关权限',
children: [
{
id: 'system:role',
name: '角色管理',
code: 'system:role',
description: '角色管理相关权限',
parentId: 'system',
children: [
{
id: 'system:role:view',
name: '查看角色',
code: 'system:role:view',
description: '查看角色列表',
parentId: 'system:role'
},
{
id: 'system:role:create',
name: '创建角色',
code: 'system:role:create',
description: '创建新角色',
parentId: 'system:role'
},
{
id: 'system:role:edit',
name: '编辑角色',
code: 'system:role:edit',
description: '编辑角色信息和权限',
parentId: 'system:role'
}
]
},
{
id: 'system:account',
name: '账号管理',
code: 'system:account',
description: '账号管理相关权限',
parentId: 'system',
children: [
{
id: 'system:account:view',
name: '查看账号',
code: 'system:account:view',
description: '查看账号列表',
parentId: 'system:account'
},
{
id: 'system:account:create',
name: '创建账号',
code: 'system:account:create',
description: '创建新账号',
parentId: 'system:account'
},
{
id: 'system:account:edit',
name: '编辑账号',
code: 'system:account:edit',
description: '编辑账号信息',
parentId: 'system:account'
}
]
}
]
}
])
// 事件处理
const handleAddRole = (roleData: Omit<Role, 'id' | 'createTime'>) => {
const newRole: Role = {
id: `role-${Date.now()}`,
...roleData,
permissions: roleData.permissionIds || roleData.permissions || [],
createTime: new Date().toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
})
}
roles.value.push(newRole)
ElMessage.success('角色创建成功')
console.log('新增角色:', newRole)
}
const handleUpdateRole = (roleId: string, updates: Partial<Role>) => {
const roleIndex = roles.value.findIndex(role => role.id === roleId)
if (roleIndex !== -1) {
roles.value[roleIndex] = { ...roles.value[roleIndex], ...updates } as Role
ElMessage.success('角色更新成功')
console.log('更新角色:', roleId, updates)
}
}
</script>
<style scoped>
/* 测试页面样式 */
</style>
......@@ -10,6 +10,7 @@ export default defineConfig({
vue(),
// vueDevTools(),
],
base: './',
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!