项目初始化

This commit is contained in:
2026-03-18 17:19:03 +08:00
commit ac6079b9ff
602 changed files with 58291 additions and 0 deletions

519
web/types/table.d.ts vendored Normal file
View File

@@ -0,0 +1,519 @@
import type {
ButtonProps,
ButtonType,
ColProps,
ElTooltipProps,
FormInstance,
ImageProps,
PopconfirmProps,
SwitchProps,
TableColumnCtx,
TagProps,
} from 'element-plus'
import type { Component, ComponentPublicInstance } from 'vue'
import Icon from '/@/components/icon/index.vue'
import Table from '/@/components/table/index.vue'
declare global {
interface BaTable {
/**
* 表格数据,通过 baTable.getData 获取
* 刷新数据可使用 baTable.onTableHeaderAction('refresh', { event: 'custom' })
*/
data?: TableRow[]
/**
* 表格列定义
*/
column: TableColumn[]
/**
* 获取表格数据时的过滤条件(含公共搜索、快速搜索、分页、排序等数据)
* 公共搜索数据可使用 baTable.setComSearchData 和 baTable.getComSearchData 进行管理
*/
filter?: {
page?: number
limit?: number
order?: string
quickSearch?: string
search?: ComSearchData[]
[key: string]: any
}
/**
* 不需要双击编辑的字段type=selection 的列为 undefined
* 禁用全部列的双击编辑,可使用 ['all']
*/
dblClickNotEditColumn?: (string | undefined)[]
/**
* 表格扩展数据,随意定义,以便一些自定义数据可以随 baTable 实例传递
*/
extend?: anyObj
// 表格 ref通常在 页面 onMounted 时赋值,可选的
ref?: InstanceType<typeof Table> | null
// 表格对应数据表的主键字段
pk?: string
// 路由 remark后台菜单规则备注信息
remark?: string | null
// 表格加载状态
loading?: boolean
// 当前选中行
selection?: TableRow[]
// 数据总量
total?: number
// 默认排序字段和排序方式
defaultOrder?: { prop: string; order: string }
// 拖动排序限位字段,例如拖动行 pid=1那么拖动目的行 pid 也需要为 1
dragSortLimitField?: string
// 接受 url 的 query 参数并自动触发公共搜索
acceptQuery?: boolean
// 显示公共搜索
showComSearch?: boolean
// 是否展开所有子项,树状表格专用属性
expandAll?: boolean
// 当前表格所在页面的路由 path
routePath?: string
}
interface BaTableForm {
/**
* 当前表单项数据
*/
items?: anyObj
/**
* 当前操作标识:Add=添加,Edit=编辑
*/
operate?: string
/**
* 添加表单字段默认值,打开表单时会使用 cloneDeep 赋值给 this.form.items 对象
*/
defaultItems?: anyObj
/**
* 表单扩展数据,可随意定义,以便一些自定义数据可以随 baTable 实例传递
*/
extend?: anyObj
// 表单 ref实例化表格时通常无需传递
ref?: FormInstance | undefined
// 表单项 label 的宽度
labelWidth?: number
// 被操作数据ID支持批量编辑:add=[0],edit=[1,2,n]
operateIds?: string[]
// 提交按钮状态
submitLoading?: boolean
// 表单加载状态
loading?: boolean
}
/**
* BaTable 前置处理函数(前置埋点)
*/
interface BaTableBefore {
/**
* 获取表格数据前的钩子(返回 false 可取消原操作)
*/
getData?: () => boolean | void
/**
* 删除前的钩子(返回 false 可取消原操作)
* @param object.ids 被删除数据的主键集合
*/
postDel?: ({ ids }: { ids: string[] }) => boolean | void
/**
* 获取被编辑行数据前的钩子(返回 false 可取消原操作)
* @param object.id 被编辑行主键
*/
getEditData?: ({ id }: { id: string }) => boolean | void
/**
* 双击表格具体操作执行前钩子(返回 false 可取消原操作)
* @param object.row 被双击行数据
* @param object.column 被双击列数据
*/
onTableDblclick?: ({ row, column }: { row: TableRow; column: TableColumn }) => boolean | void
/**
* 表单切换前钩子(返回 false 可取消默认行为)
* @param object.operate 当前操作标识:Add=添加,Edit=编辑
* @param object.operateIds 被操作的行 ID 集合
*/
toggleForm?: ({ operate, operateIds }: { operate: string; operateIds: string[] }) => boolean | void
/**
* 表单提交前钩子(返回 false 可取消原操作)
* @param object.formEl 表单组件ref
* @param object.operate 当前操作标识:Add=添加,Edit=编辑
* @param object.items 表单数据
*/
onSubmit?: ({ formEl, operate, items }: { formEl?: FormInstance | null; operate: string; items: anyObj }) => boolean | void
/**
* 表格内事件响应前钩子(返回 false 可取消原操作)
* @param object.event 事件名称
* @param object.data 事件携带的数据
*/
onTableAction?: ({ event, data }: { event: BaTableActionEventName; data: anyObj }) => boolean | void
/**
* 表格顶部菜单事件响应前钩子(返回 false 可取消原操作)
* @param object.event 事件名称
* @param object.data 事件携带的数据
*/
onTableHeaderAction?: ({ event, data }: { event: BaTableHeaderActionEventName; data: anyObj }) => boolean | void
/**
* 表格初始化前钩子
*/
mount?: () => boolean | void
/** getData 的别名 */
getIndex?: () => boolean | void
/** getEditData 的别名 */
requestEdit?: ({ id }: { id: string }) => boolean | void
// 可自定义其他钩子
[key: string]: Function | undefined
}
/**
* BaTable 后置处理函数(后置埋点)
*/
interface BaTableAfter {
/**
* 请求到表格数据后钩子
* 此时 baTable.table.data 已赋值
* @param object.res 请求完整响应
*/
getData?: ({ res }: { res: ApiResponse }) => void
/**
* 删除请求后钩子
* @param object.res 请求完整响应
*/
postDel?: ({ res }: { res: ApiResponse }) => void
/**
* 获取到编辑行数据后钩子
* 此时 baTable.form.items 已赋值
* @param object.res 请求完整响应
*/
getEditData?: ({ res }: { res: ApiResponse }) => void
/**
* 双击单元格操作执行后钩子
* @param object.row 当前行数据
* @param object.column 当前列数据
*/
onTableDblclick?: ({ row, column }: { row: TableRow; column: TableColumn }) => void
/**
* 表单切换后钩子
* @param object.operate 当前操作标识:Add=添加,Edit=编辑
* @param object.operateIds 被操作的 ID 集合
*/
toggleForm?: ({ operate, operateIds }: { operate: string; operateIds: string[] }) => void
/**
* 表单提交后钩子
* @param object.res 请求完整响应
*/
onSubmit?: ({ res }: { res: ApiResponse }) => void
/**
* 表格内事件响应后钩子
* @param object.event 事件名称
* @param object.data 事件携带的数据
*/
onTableAction?: ({ event, data }: { event: BaTableActionEventName; data: anyObj }) => void
/**
* 表格顶部菜单事件响应后钩子
* @param object.event 事件名称
* @param object.data 事件携带的数据
*/
onTableHeaderAction?: ({ event, data }: { event: BaTableHeaderActionEventName; data: anyObj }) => void
/** getData 的别名 */
getIndex?: ({ res }: { res: ApiResponse }) => void
/** getEditData 的别名 */
requestEdit?: ({ res }: { res: ApiResponse }) => void
// 可自定义其他钩子
[key: string]: Function | undefined
}
/**
* baTable 表格内事件名称
* selection-change=选中项改变,page-size-change=每页数量改变,current-page-change=翻页,sort-change=排序,edit=编辑,delete=删除,field-change=单元格值改变,com-search=公共搜索
*/
type BaTableActionEventName =
| 'selection-change'
| 'page-size-change'
| 'current-page-change'
| 'sort-change'
| 'edit'
| 'delete'
| 'field-change'
| 'com-search'
/**
* baTable 表格头部事件名称
* refresh=刷新,add=添加,edit=编辑,delete=删除,quick-search=快速查询,unfold=折叠/展开,change-show-column=调整列显示状态
*/
type BaTableHeaderActionEventName = 'refresh' | 'add' | 'edit' | 'delete' | 'quick-search' | 'unfold' | 'change-show-column'
/**
* 表格公共搜索数据
*/
interface ComSearch {
/** 表单项数据 */
form: anyObj
/** 字段搜索配置搜索操作符operator、字段渲染方式render等 */
fieldData: Map<string, any>
}
/**
* 表格列
*/
interface TableColumn extends Partial<TableColumnCtx<TableRow>> {
// 是否于表格显示此列
show?: boolean
// 渲染器组件名,即 \src\components\table\fieldRender\ 中的组件之一,也可以查看 TableRenderer 类型定义
render?: TableRenderer
// 值替换数据(字典数据),同时用于单元格渲染时和作为公共搜索下拉框数据,格式如:{ open: '开', close: '关', disable: '已禁用' }
replaceValue?: Record<string, any>
// render=slot 时slot 的名称
slotName?: string
// render=customRender 时,要渲染的组件或已注册组件名称的字符串
customRender?: string | Component
// render=customTemplate 时,自定义渲染 html应谨慎使用请返回 html 内容,务必确保返回内容是 xss 安全的
customTemplate?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => string
// 渲染前对字段值的预处理函数(对 el-table 的 formatter 扩展)
formatter?: (row: TableRow, column: TableColumnCtx<TableRow>, cellValue: any, index: number) => any
/**
* 自定义单元格渲染属性(比如单元格渲染器内部的 tag、button 组件的属性,设计上不仅是组件属性,也可以自定义其他渲染相关属性)
* 直接定义对应组件的属性 object或使用一个函数返回组件属性 object
*/
customRenderAttr?: {
tag?: TableContextDataFun<TagProps>
icon?: TableContextDataFun<InstanceType<typeof Icon>['$props']>
image?: TableContextDataFun<ImageProps>
switch?: TableContextDataFun<SwitchProps>
tooltip?: TableContextDataFun<ElTooltipProps>
[key: string]: any
}
// render=tag 时el-tag 组件的 effect
effect?: TagProps['effect']
// render=tag 时el-tag 组件的 size
size?: TagProps['size']
// render=url 时,链接的打开方式
target?: '_blank' | '_self'
// render=datetime 时,时间日期的格式化方式,字母可以自由组合:y=年,m=月,d=日,h=时,M=分,s=秒默认yyyy-mm-dd hh:MM:ss
timeFormat?: string
// render=buttons 时,操作按钮数组
buttons?: OptButton[]
/**
* 单元格渲染器需要的其他任意自定义数据
* 1. render=tag 时,可单独指定每个不同的值 tag 的 type 属性 { open: 'success', close: 'info', disable: 'danger' }
*/
custom?: any
// 默认值(单元格值为 undefined,null,'' 时取默认值,仅使用了 render 时有效)
default?: any
// 是否允许动态控制字段是否显示,默认为 true
enableColumnDisplayControl?: boolean
// 单元格渲染组件的 key默认将根据列配置等属性自动生成此 key 值改变时单元格将自动重新渲染)
getRenderKey?: (row: TableRow, field: TableColumn, column: TableColumnCtx<TableRow>, index: number) => string
// 公共搜索操作符,默认值为 = ,值为 false 禁用此字段公共搜索,支持的操作符见下类型定义
operator?: boolean | OperatorStr
// 公共搜索框的 placeholder
operatorPlaceholder?: string | string[]
// 公共搜索渲染方式render=tag|switch 时公共搜索也会渲染为下拉,数字会渲染为范围筛选,时间渲染为时间选择器等
comSearchRender?: 'string' | 'remoteSelect' | 'select' | 'time' | 'date' | 'datetime' | 'customRender' | 'slot'
// 公共搜索自定义组件/函数渲染
comSearchCustomRender?: string | Component
// 公共搜索自定义渲染为 slot 时slot 的名称
comSearchSlotName?: string
// 公共搜索自定义渲染时,外层 el-col 的属性(仅 customRender、slot 支持)
comSearchColAttr?: Partial<ColProps>
// 公共搜索是否显示字段的 label
comSearchShowLabel?: boolean
// 公共搜索输入组件的扩展属性
comSearchInputAttr?: anyObj
// 公共搜索渲染为远程下拉时,远程下拉组件的必要属性
remote?: {
pk?: string
field?: string
params?: anyObj
multiple?: boolean
remoteUrl: string
}
// 使用了 render 属性时,渲染前对字段值的预处理方法(即将废弃,请使用兼容 el-table 的 formatter 函数代替)
renderFormatter?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => any
// 渲染为 url 时的点击事件(即将废弃,请使用 el-table 的 @cell-click 或单元格自定义渲染代替)
click?: (row: TableRow, field: TableColumn, value: any, column: TableColumnCtx<TableRow>, index: number) => any
}
/**
* 表格右侧操作按钮
*/
interface OptButton {
/**
* 渲染方式:tipButton=带tip的按钮,confirmButton=带确认框的按钮,moveButton=移动按钮,basicButton=普通按钮
*/
render: 'tipButton' | 'confirmButton' | 'moveButton' | 'basicButton'
/**
* 按钮名称将作为触发表格内事件onTableAction时的事件名
*/
name: string
/**
* 鼠标 hover 时的提示
* 可使用多语言翻译 key比如 user.group
*/
title?: string
/**
* 直接在按钮内显示的文字title 有值时可为空
* 可使用多语言翻译 key比如 user.group
*/
text?: string
/**
* 自定义按钮的点击事件
* @param row 当前行数据
* @param field 当前列数据
*/
click?: (row: TableRow, field: TableColumn) => void
/**
* 按钮是否显示请返回布尔值比如display: auth('add')
* @param row 当前行数据
* @param field 当前列数据
*/
display?: (row: TableRow, field: TableColumn) => boolean
/**
* 按钮是否禁用(请返回布尔值)
* @param row 当前行数据
* @param field 当前列数据
*/
disabled?: (row: TableRow, field: TableColumn) => boolean
/**
* 按钮是否正在加载中(请返回布尔值)
* @param row 当前行数据
* @param field 当前列数据
*/
loading?: (row: TableRow, field: TableColumn) => boolean
/**
* 自定义 el-button 的其他属性(格式为属性 object 或一个返回属性 object 的函数)
*/
attr?: TableContextDataFun<ButtonProps>
// 按钮 class
class?: string
// 按钮 type
type: ButtonType
// 按钮 icon 的名称
icon: string
// 确认按钮的气泡确认框的属性el-popconfirm 的属性,格式为属性 object 或一个返回属性 object 的函数)
popconfirm?: TableContextDataFun<PopconfirmProps>
// 是否禁用 title 提示,此值通常由系统动态调整以确保提示的显示效果
disabledTip?: boolean
}
/**
* 表格行
*/
interface TableRow extends anyObj {
children?: TableRow[]
}
/**
* 表头支持的按钮
*/
type HeaderOptButton = 'refresh' | 'add' | 'edit' | 'delete' | 'unfold' | 'comSearch' | 'quickSearch' | 'columnDisplay'
/**
* 公共搜索操作符支持的值
*/
type OperatorStr =
| 'eq' // 等于,默认值
| 'ne' // 不等于
| 'gt' // 大于
| 'egt' // 大于等于
| 'lt' // 小于
| 'elt' // 小于等于
| 'LIKE'
| 'NOT LIKE'
| 'IN'
| 'NOT IN'
| 'RANGE' // 范围,将生成两个输入框,可以输入最小值和最大值
| 'NOT RANGE'
| 'NULL' // 是否为NULL将生成单个复选框
| 'NOT NULL'
| 'FIND_IN_SET'
// 不推荐使用的,因为部分符号不利于网络传输
| '='
| '<>'
| '>'
| '>='
| '<'
| '<='
/**
* 公共搜索事件返回的 Data
*/
interface ComSearchData {
field: string
val: string | string[] | number | number[]
operator: string
render?: string
}
interface ElTreeData {
label: string
children?: ElTreeData[]
}
/**
* 表格上下文数据
*/
interface TableContextData {
row?: TableRow
field?: TableColumn
cellValue?: any
column?: TableColumnCtx<TableRow>
index?: number
}
/**
* 接受表格上下文数据的任意属性计算函数
*/
type TableContextDataFun<T> = Partial<T> | ((context: TableContextData) => Partial<T>)
interface TableRenderPublicInstance extends ComponentPublicInstance {
$attrs: {
renderValue: any
renderRow: TableRow
renderField: TableColumn
renderColumn: TableColumnCtx<TableRow>
renderIndex: number
}
}
}