chore: starter

This commit is contained in:
2026-01-29 18:44:04 +08:00
commit 9cda358a2e
91 changed files with 16946 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
/**
* DCS 配置相关类型和验证器
*/
import { z } from 'zod'
/**
* DCS 配置项类型
*/
export type DCSValueType = 'string' | 'number' | 'boolean' | 'array' | 'object'
/**
* DCS 配置项
*/
export interface DCSConfigItem {
key: string
value: unknown
type: DCSValueType
description?: string
required?: boolean
children?: DCSConfigItem[]
}
/**
* DCS 配置文件
*/
export interface DCSConfigFile {
name: string
path: string
version: string
description?: string
items: DCSConfigItem[]
createdAt: string
updatedAt: string
}
/**
* DCS 项目
*/
export interface DCSProject {
id: string
name: string
description?: string
configs: DCSConfigFile[]
createdAt: string
updatedAt: string
}
/**
* DCS 配置项验证器
*/
export const dcsConfigItemSchema: z.ZodType<DCSConfigItem> = z.lazy(() =>
z.object({
key: z.string().min(1, '配置键不能为空'),
value: z.unknown(),
type: z.enum(['string', 'number', 'boolean', 'array', 'object']),
description: z.string().optional(),
required: z.boolean().optional(),
children: z.array(dcsConfigItemSchema).optional(),
}),
)
/**
* DCS 配置文件验证器
*/
export const dcsConfigFileSchema = z.object({
name: z.string().min(1, '文件名不能为空'),
path: z.string().min(1, '文件路径不能为空'),
version: z.string().regex(/^\d+\.\d+\.\d+$/, '版本号格式应为 x.x.x'),
description: z.string().optional(),
items: z.array(dcsConfigItemSchema),
createdAt: z.string().datetime(),
updatedAt: z.string().datetime(),
})
/**
* DCS 项目验证器
*/
export const dcsProjectSchema = z.object({
id: z.string().uuid(),
name: z.string().min(1, '项目名不能为空'),
description: z.string().optional(),
configs: z.array(dcsConfigFileSchema),
createdAt: z.string().datetime(),
updatedAt: z.string().datetime(),
})
/**
* 验证 DCS 配置
*/
export function validateDCSConfig(data: unknown): DCSConfigFile {
return dcsConfigFileSchema.parse(data)
}
/**
* 安全验证 DCS 配置
*/
export function safeParseDCSConfig(data: unknown) {
return dcsConfigFileSchema.safeParse(data)
}

View File

@@ -0,0 +1,8 @@
/**
* @cslab-dcs/schema
* 数据模型和验证器统一导出
*/
export * from './dcs'
export * from './types'
export * from './validators'

View File

@@ -0,0 +1,82 @@
/**
* 通用类型定义
*/
/**
* API 响应结构
*/
export interface ApiResponse<T = unknown> {
code: number
message: string
data: T
success: boolean
}
/**
* 分页请求参数
*/
export interface PaginationParams {
page: number
pageSize: number
}
/**
* 分页响应结构
*/
export interface PaginatedData<T> {
list: T[]
total: number
page: number
pageSize: number
totalPages: number
}
/**
* 树形结构节点
*/
export interface TreeNode<T = unknown> {
id: string
label: string
children?: TreeNode<T>[]
data?: T
disabled?: boolean
isLeaf?: boolean
}
/**
* 键值对
*/
export interface KeyValue<T = string> {
key: string
value: T
}
/**
* 选项结构
*/
export interface SelectOption<T = string | number> {
label: string
value: T
disabled?: boolean
}
/**
* 用户信息
*/
export interface UserInfo {
id: string
username: string
nickname?: string
avatar?: string
email?: string
roles?: string[]
}
/**
* 应用状态
*/
export interface AppState {
theme: 'light' | 'dark' | 'system'
language: string
sidebarCollapsed: boolean
}

View File

@@ -0,0 +1,58 @@
/**
* Zod 验证器
*/
import { z } from 'zod'
/**
* 通用验证规则
*/
export const requiredString = z.string().min(1, '此字段为必填项')
export const optionalString = z.string().optional()
export const email = z.string().email('请输入有效的邮箱地址')
export const phone = z.string().regex(/^1[3-9]\d{9}$/, '请输入有效的手机号')
export const url = z.string().url('请输入有效的 URL')
export const positiveNumber = z.number().positive('请输入正数')
export const nonNegativeNumber = z.number().nonnegative('请输入非负数')
/**
* API 响应验证
*/
export const apiResponseSchema = z.object({
code: z.number(),
message: z.string(),
data: z.unknown(),
success: z.boolean(),
})
/**
* 分页参数验证
*/
export const paginationSchema = z.object({
page: z.number().int().min(1).default(1),
pageSize: z.number().int().min(1).max(100).default(20),
})
/**
* 用户信息验证
*/
export const userInfoSchema = z.object({
id: z.string(),
username: z.string().min(2, '用户名至少2个字符'),
nickname: z.string().optional(),
avatar: z.string().url().optional(),
email: z.string().email().optional(),
roles: z.array(z.string()).optional(),
})
/**
* 创建可选字段的 schema
*/
export function createPartialSchema<T extends z.ZodRawShape>(schema: z.ZodObject<T>) {
return schema.partial()
}
/**
* 重新导出 zod
*/
export { z }
export type { ZodError, ZodSchema, ZodType } from 'zod'