feat(类型系统): 新增项目类型定义和常量

- 新增 API 响应类型定义(src/types/api.ts)
- 新增用户认证相关类型(src/types/auth.ts)
- 新增用户信息类型(src/types/user.ts)
- 新增全局常量定义(src/constants/)
- 更新项目设置配置
This commit is contained in:
gaoziman 2025-11-18 20:44:43 +08:00
parent 3ea18a417d
commit f312be1aa8
5 changed files with 537 additions and 1 deletions

71
src/constants/index.ts Normal file
View File

@ -0,0 +1,71 @@
/**
*
* @description 使
*/
// ==================== API 响应码常量 ====================
/** 成功响应码 */
export const SUCCESS_CODE = 0;
/** 失败响应码 */
export const ERROR_CODE = 1;
/** 未认证(需要登录) */
export const UNAUTHORIZED_CODE = 401;
/** 无权限 */
export const FORBIDDEN_CODE = 403;
/** 资源不存在 */
export const NOT_FOUND_CODE = 404;
/** 服务器错误 */
export const SERVER_ERROR_CODE = 500;
// ==================== 本地存储 Key 常量 ====================
/** Token 存储 Key */
export const TOKEN_KEY = 'token';
/** 用户信息存储 Key */
export const USERINFO_KEY = 'userInfo';
/** 用户登录状态 Key */
export const USER_STATUS_KEY = 'userStatus';
/** 用户角色 Key */
export const USER_ROLE_KEY = 'userRole';
/** 语言设置 Key与现有项目保持一致 */
export const LANG_KEY = 'arco-lang';
/** 主题设置 Key与现有项目保持一致 */
export const THEME_KEY = 'arco-theme';
// ==================== 用户角色常量 ====================
/** 管理员角色 */
export const ROLE_ADMIN = 'ADMIN';
/** 普通用户角色 */
export const ROLE_USER = 'USER';
// ==================== 用户状态常量 ====================
/** 用户状态 - 禁用 */
export const USER_STATUS_DISABLED = 0;
/** 用户状态 - 启用 */
export const USER_STATUS_ENABLED = 1;
// ==================== 默认分页配置 ====================
/** 默认页码 */
export const DEFAULT_PAGE = 1;
/** 默认每页条数 */
export const DEFAULT_PAGE_SIZE = 10;
/** 每页条数选项 */
export const PAGE_SIZE_OPTIONS = [10, 20, 50, 100];

View File

@ -3,6 +3,6 @@
"navbar": true,
"menu": true,
"footer": false,
"themeColor": "#4834D4",
"themeColor": "#005cb8",
"menuWidth": 220
}

111
src/types/api.ts Normal file
View File

@ -0,0 +1,111 @@
/**
* API
* @description API
*/
// ==================== 通用响应类型 ====================
/**
*
* @template T -
*/
export interface R<T = any> {
/** 响应码:'0'-成功,'1'-失败,其他-业务错误码(兼容后端返回字符串或数字) */
code: string | number;
/** 响应消息 */
msg: string;
/** 响应数据 */
data: T;
/** 时间戳 */
timestamp?: number;
}
/**
*
* @template T -
*/
export interface PageResp<T = any> {
/** 数据列表 */
list: T[];
/** 总记录数 */
total: number;
/** 每页条数 */
size?: number;
/** 当前页码 */
current?: number;
/** 总页数 */
pages?: number;
}
// ==================== 分页查询参数 ====================
/**
*
*/
export interface PageQuery {
/** 当前页码(从 1 开始)*/
current?: number;
/** 每页条数 */
size?: number;
/** 排序字段,格式:字段名,排序方向createTime,desc */
sort?: string;
}
// ==================== HTTP 错误响应 ====================
/**
* HTTP
*/
export interface HttpError {
/** HTTP 状态码 */
status: number;
/** 错误消息 */
message: string;
/** 错误详情 */
error?: any;
}
// ==================== 请求配置扩展 ====================
/**
*
*/
export interface RequestConfig {
/** 是否显示加载提示 */
showLoading?: boolean;
/** 是否显示成功提示 */
showSuccessMsg?: boolean;
/** 是否显示错误提示 */
showErrorMsg?: boolean;
/** 自定义成功提示消息 */
successMsg?: string;
/** 自定义错误提示消息 */
errorMsg?: string;
/** 是否需要认证(默认 true */
requireAuth?: boolean;
}
// ==================== 类型守卫函数 ====================
/**
*
* @param response -
* @returns
*/
export function isSuccessResponse<T>(response: R<T>): boolean {
return response.code == 0; // 使用宽松相等,兼容字符串和数字
}
/**
*
* @param data -
* @returns
*/
export function isPageResponse<T>(data: any): data is PageResp<T> {
return (
data !== null &&
typeof data === 'object' &&
Array.isArray(data.list) &&
typeof data.total === 'number'
);
}

140
src/types/auth.ts Normal file
View File

@ -0,0 +1,140 @@
/**
*
* @description
*/
// ==================== 登录相关 ====================
/**
*
*/
export interface LoginReq {
/** 账号(用户名/邮箱/手机号) */
account: string;
/** 密码 */
password: string;
}
/**
*
*/
export interface LoginResp {
/** 访问令牌(需存储并在后续请求中携带) */
token: string;
/** 用户ID */
userId: number;
/** 用户名 */
username: string;
/** 昵称 */
nickname: string;
/** 角色ADMIN-管理员, USER-普通用户) */
role: string;
/** 头像地址 */
avatar?: string;
}
// ==================== 注册相关 ====================
/**
*
*/
export interface RegisterReq {
/** 用户名4-20位字母、数字或下划线 */
username: string;
/** 密码8-20位包含大小写字母和数字 */
password: string;
/** 确认密码 */
confirmPassword: string;
/** 邮箱 */
email: string;
/** 手机号11位 */
phone: string;
/** 昵称 */
nickname: string;
}
// ==================== 用户信息相关 ====================
/**
*
*/
export interface UserInfoResp {
/** 用户ID */
id: number;
/** 用户名 */
username: string;
/** 昵称 */
nickname: string;
/** 角色ADMIN-管理员, USER-普通用户) */
role: string;
/** 邮箱 */
email?: string;
/** 手机号 */
phone?: string;
/** 头像地址 */
avatar?: string;
/** 状态0-禁用, 1-启用) */
status: number;
/** 创建时间 */
createTime?: string;
}
// ==================== 本地存储的用户信息 ====================
/**
* localStorage
*/
export interface LocalUserInfo {
/** 用户ID */
userId: number;
/** 用户名 */
username: string;
/** 昵称 */
nickname: string;
/** 角色 */
role: string;
/** 头像地址 */
avatar?: string;
}
// ==================== 用户角色枚举 ====================
/**
*
*/
export enum UserRole {
/** 管理员 */
ADMIN = 'ADMIN',
/** 普通用户 */
USER = 'USER',
}
/**
*
*/
export enum UserStatus {
/** 禁用 */
DISABLED = 0,
/** 启用 */
ENABLED = 1,
}
// ==================== 类型守卫函数 ====================
/**
*
* @param role -
* @returns
*/
export function isAdmin(role: string): boolean {
return role === UserRole.ADMIN;
}
/**
*
* @param status -
* @returns
*/
export function isUserEnabled(status: number): boolean {
return status === UserStatus.ENABLED;
}

214
src/types/user.ts Normal file
View File

@ -0,0 +1,214 @@
/**
*
* @description CRUD
*/
import type { PageQuery } from './api';
// ==================== 用户查询参数 ====================
/**
*
*/
export interface UserQuery extends PageQuery {
/** 用户名(模糊搜索) */
username?: string;
/** 角色 */
role?: string;
/** 昵称(模糊搜索) */
nickname?: string;
/** 邮箱 */
email?: string;
/** 手机号 */
phone?: string;
/** 状态0-禁用, 1-启用) */
status?: number;
}
// ==================== 用户响应数据 ====================
/**
*
*/
export interface UserResp {
/** 用户ID */
id: number;
/** 用户名 */
username: string;
/** 角色ADMIN-管理员, USER-普通用户) */
role: string;
/** 邮箱 */
email?: string;
/** 手机号 */
phone?: string;
/** 昵称 */
nickname: string;
/** 头像地址 */
avatar?: string;
/** 状态0-禁用, 1-启用) */
status: number;
/** 创建人ID */
createUser?: number;
/** 创建人名称 */
createUserString?: string;
/** 创建时间 */
createTime?: string;
/** 更新时间 */
updateTime?: string;
}
// ==================== 用户请求参数 ====================
/**
* /
*/
export interface UserReq {
/** 用户名4-20位字母、数字或下划线 */
username: string;
/** 角色ADMIN 或 USER */
role: string;
/** 密码8-20位包含大小写字母和数字- 可选,更新时不传则不修改密码 */
password?: string;
/** 邮箱 */
email?: string;
/** 手机号11位 */
phone?: string;
/** 昵称 */
nickname: string;
/** 头像地址 */
avatar?: string;
/** 状态0-禁用, 1-启用) */
status?: number;
}
// ==================== 批量操作参数 ====================
/**
*
*/
export interface BatchDeleteReq {
/** 用户ID列表 */
ids: number[];
}
/**
*
*/
export interface ResetPasswordReq {
/** 用户ID */
userId: number;
/** 新密码 */
newPassword: string;
}
/**
*
*/
export interface UpdateProfileReq {
/** 昵称 */
nickname?: string;
/** 邮箱 */
email?: string;
/** 手机号 */
phone?: string;
/** 头像地址 */
avatar?: string;
}
// ==================== 表单数据类型 ====================
/**
*
*/
export interface UserFormData {
/** 用户ID编辑时使用 */
id?: number;
/** 用户名 */
username: string;
/** 角色 */
role: string;
/** 密码(创建时必填,更新时可选) */
password?: string;
/** 确认密码(创建时必填,更新时可选) */
confirmPassword?: string;
/** 邮箱 */
email?: string;
/** 手机号 */
phone?: string;
/** 昵称 */
nickname: string;
/** 头像地址 */
avatar?: string;
/** 状态 */
status?: number;
}
// ==================== 用户列表筛选条件 ====================
/**
*
*/
export interface UserFilterForm {
/** 用户名 */
username?: string;
/** 角色 */
role?: string;
/** 昵称 */
nickname?: string;
/** 状态 */
status?: number;
/** 创建时间范围 */
createTimeRange?: [string, string];
}
// ==================== 工具函数 ====================
/**
*
* @param user -
* @returns
*/
export function userRespToFormData(user: UserResp): UserFormData {
return {
id: user.id,
username: user.username,
role: user.role,
email: user.email,
phone: user.phone,
nickname: user.nickname,
avatar: user.avatar,
status: user.status,
};
}
/**
*
* @param formData -
* @returns
*/
export function formDataToUserReq(formData: UserFormData): UserReq {
const req: UserReq = {
username: formData.username,
role: formData.role,
nickname: formData.nickname,
};
// 可选字段
if (formData.password) {
req.password = formData.password;
}
if (formData.email) {
req.email = formData.email;
}
if (formData.phone) {
req.phone = formData.phone;
}
if (formData.avatar) {
req.avatar = formData.avatar;
}
if (formData.status !== undefined) {
req.status = formData.status;
}
return req;
}