08ea5fbe98
添加用户管理视图、API和状态管理文件
459 lines
11 KiB
TypeScript
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:5174',
|
|
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;
|