Files
张翔 08ea5fbe98 feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
2026-03-28 14:37:29 +08:00

459 lines
11 KiB
TypeScript

export const SELECTORS = {
LOGIN: {
USERNAME_INPUT: 'input[placeholder="请输入用户名"]',
PASSWORD_INPUT: 'input[placeholder="请输入密码"]',
LOGIN_BUTTON: 'button[type="submit"]',
REMEMBER_ME_CHECKBOX: 'input[type="checkbox"]',
FORGOT_PASSWORD_LINK: 'text=忘记密码',
REGISTER_LINK: 'text=注册账号',
ERROR_MESSAGE: '.ant-message-error',
SUCCESS_MESSAGE: '.ant-message-success',
LOGIN_FORM: '.login-form'
},
HEADER: {
USER_MENU: '.user-menu',
LOGOUT_BUTTON: 'text=退出登录',
USER_INFO: '.user-info',
NOTIFICATION: '.notification',
SETTINGS: '.settings'
},
MENU: {
SIDEBAR: '.sidebar',
MENU_ITEM: '.menu-item',
SUBMENU: '.submenu',
ACTIVE_MENU: '.menu-item.active',
MENU_TOGGLE: '.menu-toggle'
},
DASHBOARD: {
STATISTICS_CARD: '.statistics-card',
CHART: '.chart',
TABLE: '.dashboard-table',
FILTER: '.filter',
SEARCH: '.search'
},
TABLE: {
CONTAINER: '.table-container',
HEADER: 'thead',
BODY: 'tbody',
ROW: 'tr',
CELL: 'td',
CHECKBOX: 'input[type="checkbox"]',
PAGINATION: '.pagination',
SEARCH: '.table-search input',
EXPORT: '.export-button',
SORT: 'th.sortable'
},
FORM: {
CONTAINER: '.form-container',
INPUT: 'input[type="text"], input[type="email"], input[type="password"], input[type="number"]',
SELECT: 'select',
CHECKBOX: 'input[type="checkbox"]',
RADIO: 'input[type="radio"]',
TEXTAREA: 'textarea',
DATE_PICKER: 'input[type="date"]',
TIME_PICKER: 'input[type="time"]',
FILE_INPUT: 'input[type="file"]',
SUBMIT_BUTTON: 'button[type="submit"], .submit-button',
CANCEL_BUTTON: 'button[type="button"], .cancel-button',
RESET_BUTTON: '.reset-button',
ERROR_MESSAGE: '.error-message',
VALIDATION_MESSAGE: '.validation-message'
},
MODAL: {
CONTAINER: '.modal, .ant-modal',
TITLE: '.modal-title, .ant-modal-title',
CONTENT: '.modal-content, .ant-modal-body',
FOOTER: '.modal-footer, .ant-modal-footer',
CLOSE_BUTTON: '.close-button, .ant-modal-close',
CONFIRM_BUTTON: '.confirm-button, .ant-btn-primary',
CANCEL_BUTTON: '.cancel-button, .ant-btn-default'
},
TOAST: {
SUCCESS: '.ant-message-success',
ERROR: '.ant-message-error',
WARNING: '.ant-message-warning',
INFO: '.ant-message-info',
LOADING: '.ant-message-loading'
},
LOADING: {
SPINNER: '.ant-spin, .loading-spinner',
OVERLAY: '.loading-overlay',
PROGRESS_BAR: '.progress-bar'
},
NAVIGATION: {
BREADCRUMB: '.breadcrumb',
TABS: '.tabs',
TAB_ITEM: '.tab-item',
ACTIVE_TAB: '.tab-item.active',
BACK_BUTTON: '.back-button',
FORWARD_BUTTON: '.forward-button'
},
USER_MANAGEMENT: {
USER_LIST: '.user-list',
USER_CARD: '.user-card',
USER_AVATAR: '.user-avatar',
USER_NAME: '.user-name',
USER_EMAIL: '.user-email',
USER_STATUS: '.user-status',
USER_ROLE: '.user-role',
ADD_USER_BUTTON: '.add-user-button',
EDIT_USER_BUTTON: '.edit-user-button',
DELETE_USER_BUTTON: '.delete-user-button',
USER_SEARCH: '.user-search'
},
ROLE_MANAGEMENT: {
ROLE_LIST: '.role-list',
ROLE_NAME: '.role-name',
ROLE_DESCRIPTION: '.role-description',
ROLE_PERMISSIONS: '.role-permissions',
ADD_ROLE_BUTTON: '.add-role-button',
EDIT_ROLE_BUTTON: '.edit-role-button',
DELETE_ROLE_BUTTON: '.delete-role-button',
PERMISSION_CHECKBOX: '.permission-checkbox'
},
PERMISSION_MANAGEMENT: {
PERMISSION_LIST: '.permission-list',
PERMISSION_NAME: '.permission-name',
PERMISSION_CODE: '.permission-code',
PERMISSION_TYPE: '.permission-type',
PERMISSION_RESOURCE: '.permission-resource',
ADD_PERMISSION_BUTTON: '.add-permission-button',
EDIT_PERMISSION_BUTTON: '.edit-permission-button',
DELETE_PERMISSION_BUTTON: '.delete-permission-button'
},
SETTINGS: {
SETTINGS_PAGE: '.settings-page',
SETTINGS_SECTION: '.settings-section',
SETTINGS_ITEM: '.settings-item',
SAVE_BUTTON: '.save-button',
RESET_BUTTON: '.reset-button'
}
} as const;
export const TIMEOUTS = {
SHORT: 5000,
MEDIUM: 10000,
LONG: 30000,
VERY_LONG: 60000,
NETWORK_IDLE: 30000,
ELEMENT_VISIBLE: 10000,
ELEMENT_HIDDEN: 10000,
NAVIGATION: 30000,
PAGE_LOAD: 30000,
API_REQUEST: 30000,
ANIMATION: 1000
} as const;
export const MESSAGES = {
LOGIN: {
SUCCESS: '登录成功',
INVALID_CREDENTIALS: '用户名或密码错误',
ACCOUNT_LOCKED: '账号已被锁定',
ACCOUNT_DISABLED: '账号已被禁用',
SESSION_EXPIRED: '会话已过期,请重新登录',
NETWORK_ERROR: '网络错误,请稍后重试'
},
LOGOUT: {
SUCCESS: '退出登录成功',
ERROR: '退出登录失败'
},
VALIDATION: {
REQUIRED: '此字段为必填项',
INVALID_EMAIL: '邮箱格式不正确',
INVALID_PHONE: '手机号格式不正确',
INVALID_PASSWORD: '密码格式不正确',
PASSWORD_MISMATCH: '两次输入的密码不一致',
MIN_LENGTH: '输入长度不能少于 {min} 个字符',
MAX_LENGTH: '输入长度不能超过 {max} 个字符',
INVALID_NUMBER: '请输入有效的数字',
INVALID_DATE: '日期格式不正确'
},
OPERATION: {
SUCCESS: '操作成功',
FAILED: '操作失败',
CONFIRM_DELETE: '确定要删除吗?',
CONFIRM_SAVE: '确定要保存吗?',
CONFIRM_CANCEL: '确定要取消吗?',
UNSAVED_CHANGES: '您有未保存的更改,确定要离开吗?'
},
NETWORK: {
REQUEST_FAILED: '请求失败',
TIMEOUT: '请求超时',
SERVER_ERROR: '服务器错误',
NETWORK_ERROR: '网络错误',
UNAUTHORIZED: '未授权,请先登录',
FORBIDDEN: '无权限访问',
NOT_FOUND: '资源不存在'
},
UPLOAD: {
SUCCESS: '上传成功',
FAILED: '上传失败',
INVALID_FILE_TYPE: '文件类型不支持',
FILE_TOO_LARGE: '文件大小超出限制',
UPLOADING: '上传中...'
},
DOWNLOAD: {
SUCCESS: '下载成功',
FAILED: '下载失败',
PREPARING: '准备下载...'
}
} as const;
export const ROLES = {
ADMIN: 'admin',
USER: 'user',
GUEST: 'guest',
SUPER_ADMIN: 'super_admin',
MODERATOR: 'moderator'
} as const;
export const PERMISSIONS = {
DASHBOARD: {
VIEW: 'dashboard:view',
EDIT: 'dashboard:edit',
DELETE: 'dashboard:delete'
},
USER: {
VIEW: 'user:view',
CREATE: 'user:create',
EDIT: 'user:edit',
DELETE: 'user:delete',
EXPORT: 'user:export'
},
ROLE: {
VIEW: 'role:view',
CREATE: 'role:create',
EDIT: 'role:edit',
DELETE: 'role:delete',
ASSIGN_PERMISSIONS: 'role:assign_permissions'
},
PERMISSION: {
VIEW: 'permission:view',
CREATE: 'permission:create',
EDIT: 'permission:edit',
DELETE: 'permission:delete'
},
SETTINGS: {
VIEW: 'settings:view',
EDIT: 'settings:edit',
SYSTEM: 'settings:system',
PROFILE: 'settings:profile'
}
} as const;
export const STATUS = {
ACTIVE: 'active',
INACTIVE: 'inactive',
PENDING: 'pending',
LOCKED: 'locked',
DELETED: 'deleted',
SUSPENDED: 'suspended'
} as const;
export const HTTP_STATUS = {
OK: 200,
CREATED: 201,
NO_CONTENT: 204,
BAD_REQUEST: 400,
UNAUTHORIZED: 401,
FORBIDDEN: 403,
NOT_FOUND: 404,
METHOD_NOT_ALLOWED: 405,
CONFLICT: 409,
UNPROCESSABLE_ENTITY: 422,
INTERNAL_SERVER_ERROR: 500,
NOT_IMPLEMENTED: 501,
BAD_GATEWAY: 502,
SERVICE_UNAVAILABLE: 503,
GATEWAY_TIMEOUT: 504
} as const;
export const TEST_DATA = {
USERS: {
ADMIN: {
username: 'admin',
password: 'Admin@123',
email: 'admin@example.com',
phone: '13800138000',
realName: '管理员'
},
USER: {
username: 'testuser',
password: 'User@123',
email: 'user@example.com',
phone: '13900139000',
realName: '测试用户'
},
INVALID: {
username: 'invalid',
password: 'invalid'
}
},
ROLES: {
ADMIN: {
name: '管理员',
code: 'admin',
description: '系统管理员角色'
},
USER: {
name: '普通用户',
code: 'user',
description: '普通用户角色'
}
},
PERMISSIONS: [
{
name: '查看仪表盘',
code: 'dashboard:view',
type: 'menu',
resource: '/dashboard'
},
{
name: '查看用户',
code: 'user:view',
type: 'menu',
resource: '/user'
},
{
name: '创建用户',
code: 'user:create',
type: 'button',
resource: '/user/create'
},
{
name: '编辑用户',
code: 'user:edit',
type: 'button',
resource: '/user/edit'
},
{
name: '删除用户',
code: 'user:delete',
type: 'button',
resource: '/user/delete'
}
]
} as const;
export const API_ENDPOINTS = {
AUTH: {
LOGIN: '/sys/auth/login',
LOGOUT: '/sys/auth/logout',
REFRESH_TOKEN: '/sys/auth/refresh',
GET_USER_INFO: '/sys/auth/userinfo'
},
USER: {
LIST: '/sys/user/list',
DETAIL: '/sys/user/detail',
CREATE: '/sys/user/create',
UPDATE: '/sys/user/update',
DELETE: '/sys/user/delete',
EXPORT: '/sys/user/export'
},
ROLE: {
LIST: '/sys/role/list',
DETAIL: '/sys/role/detail',
CREATE: '/sys/role/create',
UPDATE: '/sys/role/update',
DELETE: '/sys/role/delete',
ASSIGN_PERMISSIONS: '/sys/role/assign-permissions'
},
PERMISSION: {
LIST: '/sys/permission/list',
DETAIL: '/sys/permission/detail',
CREATE: '/sys/permission/create',
UPDATE: '/sys/permission/update',
DELETE: '/sys/permission/delete'
},
MENU: {
LIST: '/sys/menu/list',
TREE: '/sys/menu/tree',
CREATE: '/sys/menu/create',
UPDATE: '/sys/menu/update',
DELETE: '/sys/menu/delete'
}
} as const;
export const ENVIRONMENTS = {
LOCAL: {
name: 'local',
baseURL: 'http://localhost:5173',
mockEnabled: true,
mockMode: 'full' as const
},
DEV: {
name: 'dev',
baseURL: 'https://dev.example.com',
mockEnabled: false,
mockMode: 'none' as const
},
TEST: {
name: 'test',
baseURL: 'https://test.example.com',
mockEnabled: true,
mockMode: 'partial' as const
},
PROD: {
name: 'prod',
baseURL: 'https://prod.example.com',
mockEnabled: false,
mockMode: 'none' as const
}
} as const;
export const SCREENSHOT_CONFIG = {
DIR: 'test-results/screenshots',
ON_FAILURE: true,
ON_SUCCESS: false,
FULL_PAGE: false,
RETRY_COUNT: 3
} as const;
export const REPORT_CONFIG = {
DIR: 'test-results/reports',
JSON: true,
HTML: true,
ALLURE: true,
INCLUDE_SCREENSHOTS: true,
INCLUDE_LOGS: true,
INCLUDE_VIDEO: true
} as const;
export const MOCK_CONFIG = {
ENABLED: true,
MODE: 'full' as const,
DELAY: 0,
LOG_CALLS: true,
VALIDATE_RESPONSES: true,
DATA_SOURCE: 'memory' as const
} as const;