diff --git a/components.d.ts b/components.d.ts index ea02460..0c5feb4 100644 --- a/components.d.ts +++ b/components.d.ts @@ -26,6 +26,7 @@ declare module 'vue' { ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElInput: typeof import('element-plus/es')['ElInput'] + ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElOption: typeof import('element-plus/es')['ElOption'] @@ -46,12 +47,17 @@ declare module 'vue' { RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] TyBreadcrumb: typeof import('./src/components/ty-breadcrumb.vue')['default'] + TyCrud: typeof import('./src/components/ty-crud.vue')['default'] TyFooter: typeof import('./src/components/ty-footer.vue')['default'] + TyFormDialog: typeof import('./src/components/ty-form-dialog.vue')['default'] TyHeader: typeof import('./src/components/ty-header.vue')['default'] TyMixbar: typeof import('./src/components/ty-mixbar.vue')['default'] + TySchemaForm: typeof import('./src/components/ty-schema-form.vue')['default'] + TySearchForm: typeof import('./src/components/ty-search-form.vue')['default'] TySetting: typeof import('./src/components/ty-setting.vue')['default'] TySettingPanel: typeof import('./src/components/ty-setting-panel.vue')['default'] TySidebar: typeof import('./src/components/ty-sidebar.vue')['default'] + TyTable: typeof import('./src/components/ty-table.vue')['default'] TyTabs: typeof import('./src/components/ty-tabs.vue')['default'] } export interface GlobalDirectives { @@ -75,6 +81,7 @@ declare global { const ElForm: typeof import('element-plus/es')['ElForm'] const ElFormItem: typeof import('element-plus/es')['ElFormItem'] const ElInput: typeof import('element-plus/es')['ElInput'] + const ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] const ElMenu: typeof import('element-plus/es')['ElMenu'] const ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] const ElOption: typeof import('element-plus/es')['ElOption'] @@ -95,11 +102,16 @@ declare global { const RouterLink: typeof import('vue-router')['RouterLink'] const RouterView: typeof import('vue-router')['RouterView'] const TyBreadcrumb: typeof import('./src/components/ty-breadcrumb.vue')['default'] + const TyCrud: typeof import('./src/components/ty-crud.vue')['default'] const TyFooter: typeof import('./src/components/ty-footer.vue')['default'] + const TyFormDialog: typeof import('./src/components/ty-form-dialog.vue')['default'] const TyHeader: typeof import('./src/components/ty-header.vue')['default'] const TyMixbar: typeof import('./src/components/ty-mixbar.vue')['default'] + const TySchemaForm: typeof import('./src/components/ty-schema-form.vue')['default'] + const TySearchForm: typeof import('./src/components/ty-search-form.vue')['default'] const TySetting: typeof import('./src/components/ty-setting.vue')['default'] const TySettingPanel: typeof import('./src/components/ty-setting-panel.vue')['default'] const TySidebar: typeof import('./src/components/ty-sidebar.vue')['default'] + const TyTable: typeof import('./src/components/ty-table.vue')['default'] const TyTabs: typeof import('./src/components/ty-tabs.vue')['default'] } \ No newline at end of file diff --git a/src/components/ty-crud.vue b/src/components/ty-crud.vue new file mode 100644 index 0000000..149ce19 --- /dev/null +++ b/src/components/ty-crud.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/src/components/ty-form-dialog.vue b/src/components/ty-form-dialog.vue new file mode 100644 index 0000000..6e7df61 --- /dev/null +++ b/src/components/ty-form-dialog.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/ty-schema-form.vue b/src/components/ty-schema-form.vue new file mode 100644 index 0000000..166af46 --- /dev/null +++ b/src/components/ty-schema-form.vue @@ -0,0 +1,135 @@ + + + diff --git a/src/components/ty-search-form.vue b/src/components/ty-search-form.vue new file mode 100644 index 0000000..e3e0cd6 --- /dev/null +++ b/src/components/ty-search-form.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/ty-table.vue b/src/components/ty-table.vue new file mode 100644 index 0000000..848ef8a --- /dev/null +++ b/src/components/ty-table.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/pages/system/user/index.vue b/src/pages/system/user/index.vue index 8e288fd..acfd335 100644 --- a/src/pages/system/user/index.vue +++ b/src/pages/system/user/index.vue @@ -1,295 +1,196 @@ - - diff --git a/src/types/crud.ts b/src/types/crud.ts new file mode 100644 index 0000000..0b057b1 --- /dev/null +++ b/src/types/crud.ts @@ -0,0 +1,66 @@ +/** JSON Schema 表单 + 表格列的共享类型。 */ + +export type JsonType = 'string' | 'integer' | 'number' | 'boolean' | 'object' | 'array' + +/** JSON Schema 属性(表单字段描述)。 */ +export interface JsonSchemaProperty { + type?: JsonType + /** 显示标题。 */ + title?: string + description?: string + /** 格式化:password/email/textarea 等。 */ + format?: 'password' | 'email' | 'textarea' | 'date' | 'datetime' + /** 枚举值(渲染为下拉)。 */ + enum?: (string | number | boolean)[] + /** 枚举显示名(与 enum 一一对应)。 */ + enumNames?: string[] + default?: unknown + /** 只读(禁用编辑)。 */ + readOnly?: boolean + /** 仅在指定模式下显示(如 password 仅 create)。缺省表示所有模式都显示。 */ + showOn?: ('create' | 'edit')[] + minLength?: number + maxLength?: number + minimum?: number + maximum?: number + placeholder?: string +} + +/** JSON Schema 对象(表单 schema)。 */ +export interface JsonSchema { + type: 'object' + properties: Record + required?: string[] +} + +export type TagType = 'success' | 'info' | 'warning' | 'danger' | 'primary' + +/** 表格列配置。 */ +export interface TableColumn { + prop: string + label: string + width?: number | string + minWidth?: number | string + align?: 'left' | 'center' | 'right' + /** 渲染类型:text(默认)/tag(状态标签)/datetime(毫秒时间戳)。 */ + type?: 'text' | 'tag' | 'datetime' + /** type=tag 时的值→{label,type} 映射。 */ + tagMap?: Record + /** 自定义格式化。 */ + formatter?: (value: unknown, row: Record) => string +} + +/** 分页结果。 */ +export interface PageResult { + list: T[] + total: number + page: number + pageSize: number +} + +/** 分页查询参数。 */ +export interface PageQuery { + page: number + pageSize: number + [key: string]: unknown +} diff --git a/stats.html b/stats.html index aff1e11..9a604f6 100644 --- a/stats.html +++ b/stats.html @@ -4930,7 +4930,7 @@ var drawChart = (function (exports) {