sksmas-plugin-el-vue3
用于 Maximo(玄冥资产管理系统)数据接口的 element-plus 扩展组件库(vue3版,由 sks-plugin-el-erp-vue3 移植)
179
| Install | |
|---|---|
npm install sksmas-plugin-el-vue3 |
|
| Latest Version: | 3.0.0 |
| Vue: | 3 |
| License: | MIT |
| Last Updated: | Sep 29, 2026 |
| Links: | npm |
Maintainer: shoukaiseki
sksmas-plugin-el-vue3
用于 Maximo(玄冥资产管理系统)数据接口的 element-plus 扩展组件库(Vue3 版),由 sks-plugin-el-erp-vue3 派生并全量改名为 SksMas*。
- 版本:3.0.0
- 定位:Maximo 数据接口(REST / JSON)前端 UI 组件库
- 宿主框架:Vue 3 + Element Plus(若依 RuoYi-Vue3 适配版 sks-eam-vue3-typescript)
- 相对
sks-plugin-el-erp-vue3的差异:- 全部组件、工具函数、文件名由
Sks/sks改名为SksMas/sksMas/sksmas - 新增 Maximo 日期时间支持:
lib/sksmas-date.js+SksMasDate/SksMasTime/SksMasDateTime,timeZone默认GMT+8
- 全部组件、工具函数、文件名由
依赖说明
peerDependencies(由宿主项目提供):
| 依赖 | 版本 |
|---|---|
| vue | ^3.2.0 |
| element-plus | ^2.0.0 |
| @element-plus/icons-vue | ^2.0.0 |
dependencies:
| 依赖 | 版本 | 用途 |
|---|---|---|
| sortablejs | 1.15.0 | SksMasTable 列拖拽排序 |
| clipboard | ^2.0.11 | 复制到剪贴板 |
| mathjs | ^11.3.3 | 精确数值计算(sksmas-number-math) |
接入方式(源码级 alias 引入)
本库不发布 npm 包,以独立仓库形式被宿主项目通过 vite alias 源码级编译(当前宿主:e:/gitwork/sks-maximo-solon/sks-eam-vue3-typescript)。
vite.config.ts 配置
import path from 'path'
export default {
resolve: {
alias: [
// 插件库源码位于宿主项目外,裸导入无法向上解析到宿主 node_modules,
// 需显式指向宿主依赖
{ find: 'mathjs', replacement: path.resolve(__dirname, './node_modules/mathjs') },
{ find: 'clipboard', replacement: path.resolve(__dirname, './node_modules/clipboard') },
{ find: 'sortablejs', replacement: path.resolve(__dirname, './node_modules/sortablejs') },
// 子模块源码引入(正则需排在主入口之前)
{ find: /^sksmas-plugin-el-vue3\/lib\/(.*)/, replacement: 'E:/gitwork/sksmas-plugin-el-vue3/lib/$1' },
// 主入口
{ find: 'sksmas-plugin-el-vue3', replacement: 'E:/gitwork/sksmas-plugin-el-vue3/index.js' }
]
},
server: {
fs: {
// 允许访问项目外的插件库源码
allow: [path.resolve(__dirname, './'), 'E:/gitwork/sksmas-plugin-el-vue3']
}
}
}
注册插件
// main.ts(在 ElementPlus 之后、mount 之前)
import request, { download } from '@/utils/request'
import SksMasPluginElVue3 from 'sksmas-plugin-el-vue3'
app.use(SksMasPluginElVue3, { request })
install(app, opts) 会:
- 全局注册全部组件(
app.component(component.name, component)) - 挂载全局属性到
app.config.globalProperties:sksMasUtils— 常用工具函数集合sksMasDateUtils— Maximo 日期时间工具集合(lib/sksmas-date.js)sksMasConfig— 配置与默认 requestresetForm/clearFormValidate— 表单重置$SKSMAS_PLUGIN_EL_ERP—{ request }(宿主传入的 axios 实例)
页面命名导入
import { newSksMasTable, newSksMasDialogInfo, newTableColumn, newTableColumnList } from 'sksmas-plugin-el-vue3'
import { initListVueVirtualUUID, mergeFromObject } from 'sksmas-plugin-el-vue3/lib/core'
主入口同时提供 default 导出(含 install 与全部组件)与命名导出(工具函数 + 组件)。
组件列表
| 组件 | 说明 |
|---|---|
| SksMasTable | 核心列表组件:动态列、表头 QBE 过滤行、列排序、显示属性名、更多列配置 |
| SksMasCacheTable | 带缓存的表格 |
| SksMasPagination | 分页 |
| SksMasRightToolbar | 右侧工具栏(刷新/隐藏搜索/显示所有列/显示属性名) |
| SksMasButton | 按钮封装 |
| SksMasButtonTooltip | 带提示的按钮 |
| SksMasCheckbox | 复选框封装 |
| SksMasDate | Maximo DATE(MaxType=3)日期选择,值 yyyy-MM-dd |
| SksMasTime | Maximo TIME(MaxType=5)时间选择,值 HH:mm:ss |
| SksMasDateTime | Maximo DATETIME(MaxType=4)日期时间选择,值 yyyy-MM-dd'T'HH:mm:ssXXX,带 timeZone |
| SksMasDateYmdRange | 年月日范围选择(可输出 DATE 或 DATETIME 两种格式) |
| SksMasStatusSelect | 状态选择 |
| SksMasDictLabelTag | 字典值标签展示 |
| SksMasImageUseImgUrl | 图片 URL 展示 |
| SksMasHtmlMessagePromptDialog | HTML 消息提示对话框 |
| SksMasDialog | 增强对话框:最大化/全屏切换、标题栏拖拽,支持全局与单独配置(默认开启) |
| SksMasTableQueryFormEl | 列表过滤表单 |
| SksMasTablePropTable | 列配置表格(更多列设置弹窗) |
| SksMasSelectSingleByLookupController | Lookup 单选下拉 |
| SksMasSelectMultipleByLookupController | Lookup 多选下拉 |
| SksMasRadioSingleByLookupController | Lookup 单选 |
| SksMasSelectMultipleToBitValue | 多选转位标志值 |
| SksMasFilterParamInput | 过滤参数输入框 |
| SksMasFilterParamDateRange | 过滤参数日期范围 |
| SksMasFilterParamDictSelect | 过滤参数字典选择 |
Maximo 日期时间(核心新增能力)
Maximo 三种日期类型与 JSON 值格式
| MaxType | 类型码 | Maximo JSON 值 | 说明 |
|---|---|---|---|
| DATE | 3 | 2026-05-16 |
MXFormat.dateToSQLString |
| DATETIME | 4 | 2026-05-16T05:48:25+08:00 |
ConversionUtil.dateToString;开启 mxe.int.enabledatemillis=1 时带 .SSS |
| TIME | 5 | 05:48:25 |
MXFormat.timeToSQLString |
组件用法
<!-- 用法一:v-model -->
<SksMasDate v-model="form.planDate" />
<SksMasTime v-model="form.startTime" />
<SksMasDateTime v-model="form.createdDate" />
<!-- 用法二:formData + propName(值直接写入表单对象,并支持 clearValidate 联动) -->
<el-form ref="form" :model="form" :rules="rules">
<el-form-item prop="planDate" label="计划日期">
<SksMasDate :formData="form" propName="planDate" @clearValidate="clearFormValidate" />
</el-form-item>
<el-form-item prop="createdDate" label="创建时间">
<SksMasDateTime :formData="form" propName="createdDate"
timeZone="GMT+8" millis
@clearValidate="clearFormValidate" />
</el-form-item>
</el-form>
<!-- 日期范围:输出到两个字段;maxType="DATETIME" 时起点 00:00:00、终点 23:59:59 -->
<SksMasDateYmdRange :formData="form"
startTimePropName="startDate"
endTimePropName="endDate"
maxType="DATETIME" />
组件 props:
| prop | 类型 | 默认 | 说明 |
|---|---|---|---|
modelValue |
String/Number/Date | — | v-model 绑定值(Maximo 原数据格式) |
formData |
Object | — | 表单对象,与 propName 配合 |
propName |
String | — | 字段名,支持 a.b.c 路径 |
timeZone |
String | GMT+8 |
时区,支持 GMT+8 / +08:00 / Asia/Shanghai |
format |
String | 按类型 | 显示格式(dayjs token,如 YYYY-MM-DD HH:mm:ss) |
valueFormat |
String | 同 format | 控件内部值格式,一般无需修改 |
placeholder |
String | 按类型 | 占位提示 |
clearable / disabled |
Boolean | true / false |
可清空 / 禁用 |
appendTime |
String | — | 日期补齐时间,如 " 23:59:59"(首个字符为空格) |
millis |
Boolean | false |
DATETIME 是否输出毫秒 |
emitClearValidate |
Boolean | true |
值变化后是否触发 clearValidate |
refDate |
String/Number/Date | 今天 | 仅 SksMasTime:纯时间解析的基准日期 |
lib/sksmas-date.js 工具方法
| 方法 | 说明 |
|---|---|
parseTimeZoneOffset(tz) |
解析 GMT+8 / +08:00 / Asia/Shanghai 为分钟偏移(GMT+8 → 480) |
formatOffset(minutes) |
分钟偏移 → +08:00 |
parseToUtcMillis(value, {timeZone, refDate}) |
Maximo 值 → UTC 毫秒(值自带偏移时以值自带偏移为准) |
getParts(value, timeZone) |
取指定时区下的年月日时分秒字段 |
nowInTimeZone(timeZone) |
取该时区下的"现在" |
formatDate(value, fmt, {timeZone}) |
按 token 格式化,同时支持 dayjs 大写与 Java 小写 token,支持单引号字面量 |
toMaxDate / toMaxTime / toMaxDateTime |
生成 Maximo 原数据值 |
toMaxValue(value, maxType, opts) |
按 MaxType 码生成 Maximo 原数据值 |
formatByMaxType(value, maxType, opts) |
按 MaxType 码格式化显示 |
maxValueToElValue / elValueToMaxValue |
Maximo 值与控件值互转 |
toMaxTypeCode('DATETIME') / isDateTimeMaxType(code) |
类型名/类型码转换 |
isValidDateValue / compareDateValue |
有效性校验 / 比较 |
convertTimeZone(value, tz) |
换时区显示 |
toMaxDayBoundary(value, {type:'start'|'end'}) |
当天 00:00:00 / 23:59:59 |
import { toMaxDateTime, parseTimeZoneOffset, MAX_TYPE } from 'sksmas-plugin-el-vue3/lib/sksmas-date'
// 或使用全局属性
this.sksMasDateUtils.toMaxDateTime(Date.now(), { timeZone: 'GMT+8' })
// => '2026-05-16T05:48:25+08:00'
所有换算均通过 UTC 计算,结果与浏览器本地时区无关。
lib 工具模块
| 模块 | 说明 |
|---|---|
| lib/core.js | 核心工具:mergeFromObject、deepCopy、UUID/vueVirtualUUID、位标志转换、字符串/数组判断等 |
| lib/sksmas-date.js | Maximo 日期时间解析/时区换算/格式化(DATE/TIME/DATETIME) |
| lib/sksmas-model-utils.js | newSksMasTable / newSksMasDialogInfo / newTableColumn(List) 模型工厂 |
| lib/sksmas-page.js | sksMasPageMixin 页面混入 |
| lib/sksmas-app-utils.js | addOrUpdateRow / deleteRow / rowStyleElTable 等表格行操作 |
| lib/sksmas-number-math.js | 基于 mathjs 的精确数值运算(multiply/divide/sum/subtractNullIsZero 等) |
| lib/sksmas-number-utils.js | negateNumber / absNumber / numberIsZeroOrNull 等 |
| lib/modal.js | msgSuccess / msgError / msgInfo / msgLoading(基于 ElMessage) |
| lib/ref.js | resetForm 表单重置 |
| lib/clipboard.js | 复制到剪贴板 |
| lib/validate.js | isExternal 等校验 |
| lib/sksmasConfig.js | sksMasConfig 与默认 request |
| lib/sksmas-mock-utils.js | simulateFilterByQueryParams 前端模拟过滤 |
| lib/style/sksmas-main.css | 全局样式 |
Vue2 → Vue3 移植要点
移植时统一执行的语法转换(新增/修改组件时请保持一致):
| Vue2 写法 | Vue3 写法 |
|---|---|
slot="name" |
#name(v-slot) |
slot-scope="scope" |
#default="scope" |
:visible.sync / .sync |
v-model / v-model:xx |
el-icon-xxx 类名图标 |
@element-plus/icons-vue 组件 |
beforeDestroy |
beforeUnmount |
this.$set(obj, k, v) |
直接赋值 obj[k] = v |
this.$on / $off / $emit 总线 |
移除(改用 props/emit 或 mitt) |
this.$confirm / this.$message |
ElMessageBox.confirm / ElMessage |
valueFormat="yyyy-MM-dd" |
value-format="YYYY-MM-DD"(dayjs 格式) |
@keyup.enter.native |
@keyup.enter |
el-radio-button label="x" |
value="x" |
el-button type="text" |
el-button link type="primary" |
JSX renderHeader |
el-table-column 的 #header 插槽模板 |
Vue.use(plugin) |
app.use(plugin),install 签名改为 (app, opts) |
SksMasTable 扩展能力(本次移植新增)
- 表头 QBE 过滤行:
headerFilterEnable: true时每列表头下方显示过滤输入框,回车/清除触发qbeFilter事件(值存于mainTable.qbe[prop]) - 列排序:
@sort-change→sortChange事件{column, prop, order} - 显示属性名:
showTablePropName开关在表头以 tag 展示属性名(prop) - 事件:
refresh、sortChange、qbeFilter
目录结构
sksmas-plugin-el-vue3/
├── index.js # 主入口:install + default 导出 + 命名导出
├── lib/
│ ├── core.js # 核心工具
│ ├── sksmas-date.js # Maximo 日期时间工具(DATE/TIME/DATETIME)
│ ├── sksmas-model-utils.js # 模型工厂
│ ├── ui/ # 组件(每组件一个目录 + index.js 子入口)
│ │ ├── sksmas-table/src/SksMasTable.vue
│ │ ├── sksmas-date/src/main.vue # SksMasDate
│ │ ├── sksmas-date/src/sksmas-date-core.js # 三个日期组件共享逻辑
│ │ ├── sksmas-time/src/main.vue # SksMasTime
│ │ ├── sksmas-date-time/src/main.vue # SksMasDateTime
│ │ ├── sksmas-date-ymd-range/index.vue # SksMasDateYmdRange
│ │ └── ...
│ └── style/sksmas-main.css
├── tools/ # 自检脚本(不参与打包)
├── rollup.test.config.mjs # 编译验证配置
├── docs/ # vuepress 文档
└── package.json # name=sksmas-plugin-el-vue3 version=3.0.0
自检(npm test)
npm install # 首次需要安装依赖
npm test # 一键自检:7 项全部通过
npm test 依次执行(可用 npm run test:date / npm run test:build 单独跑):
| 步骤 | 说明 |
|---|---|
| 日期工具单测 | lib/sksmas-date.js 的时区/解析/格式化(58 项) |
| 组件核心换算单测 | sksmas-date-core.js 的 Maximo 值 ↔ 控件值往返(49 项) |
| 组件实例逻辑单测 | mock 实例调用 handleChangeValue/initCurrentValue,校验表单写入与事件(43 项) |
| 语法校验 | 全部 .js 与 .vue 内嵌 <script> 的 ESM 语法(84 块) |
| 导入可解析性 | 130 处相对导入均可解析 |
| 导入大小写一致性 | 防止 Windows 下大小写不敏感的路径在 Linux 构建时失败 |
| rollup 编译验证 | 用 @vue/compiler-sfc 编译主入口与全部子模块(不依赖 esbuild) |
编译验证使用 rollup 而非 vite:vite 依赖 esbuild,而 esbuild 需要 spawn 子进程,在受限环境中会被拒绝。
注意事项
- 插件库源码在宿主项目之外,vite 必须配置
server.fs.allow,否则开发服务器拒绝加载 - 插件库内部的裸导入(mathjs/clipboard/sortablejs)需在宿主 alias 中显式指向宿主 node_modules
- 子入口
lib/ui/*/index.js中导入 .vue 文件必须带.vue扩展名(Vite 不做无扩展名解析) - 组件 name 必须保留(全局注册与 keep-alive 依赖),如
SksMasTable、SksMasRightToolbar
附:原 Vue2 版发布流程(存档)
以下内容适用于原 Vue2 版
sks-plugin-el-erp的 npm 发布,Vue3 版当前采用源码级 alias 引入,无需发布。
# 发布前配置
npm login --registry=https://registry.npmjs.org
# 发布正式版
npm publish
# 发布测试版(package.json version 如 1.0.4-beta.2)
npm publish --tag beta1 --registry=https://registry.npmjs.org
# 安装测试版
npm install sks-plugin-el-erp@beta1
撤销发布包千万不要使用:即使撤销了发布的包,发包时也不能再和被撤销的包名称与版本重复。
scss 编译成 css
将 package-sass221102.json 中的依赖复制到 package.json 安装后执行:
npm run css:build
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 3.0.0 | ^3.2.0 | MIT |