wc24
|
fef886de87
|
0.9.0: 按后端给的 sheet 表建/读工作簿(多 sheet)
配 shrimp-server v0.9.0:export 返回 { sheet 名: 行数组 },这边逐 key 建 sheet;
导入把工作簿里所有 sheet 都发回后端(旧版只读第一张、其余静默丢弃),哪张怎么用
由模块的 import 决定。sheet 名按 Excel 限制截断/替换,否则 book_append_sheet 直接抛。
v0.9.0
|
2026-08-21 20:06:14 +08:00 |
|
wc24
|
16d8c6b9ed
|
exports: ./style 加 types 条件,消掉 noUncheckedSideEffectImports 下的 TS2307
v0.8.6
|
2026-08-14 16:19:12 +08:00 |
|
wc24
|
b22f3713c3
|
README: 补 optimizeDeps.include —— 零模块壳时 element-plus 从未被预打包会白屏
v0.8.5
|
2026-08-14 15:55:36 +08:00 |
|
wc24
|
6bd334a937
|
业务模块不再需要消费侧薄壳:内置 module/_default.vue 兜底
后端 moduleInfo 已经声明了字段、筛选、可用事件,ShrimpTable 要的只有一个
moduleKey,而 registerRoute 本来就把它当 props 传下去——「后端声明了模块,
前端就该渲染出来」是本包消费的契约,缺一个四行的壳不该让菜单点不开。
resolveVue 未命中时改为回落到 module/_default.vue,不再 warn+丢路由。
消费侧的 module/<key>.vue 仍按后缀优先命中,_default 本身也可被覆盖,纯增量。
顺带把 xlsx 补进 peerDependencies:ShrimpTable 是静态 import 它的,
漏装则 vite 直接起不来,而模板里一直没写。
v0.8.4
|
2026-08-14 14:41:44 +08:00 |
|
wc24
|
4b6f260227
|
docs: 内置字段类型照 fields/ 目录重列——删掉不存在的 json,补上 array/object,点明未注册类型是静默回落
v0.8.3
|
2026-08-11 16:57:43 +08:00 |
|
wc24
|
00c2211271
|
0.8.2 顶栏改走 resolveVue,撤掉 headerWidgets
headerWidgets 是往 userbar 里插组件的口子:VueAdmin 收一个组件数组、userbar 用
v-for 渲染。它绕开了本包唯一的覆盖机制(sources 路径后缀),等于给同一件事开了
第二条路——而且是条窄路,只能往那一处塞,插进去的东西也没法参与 userbar 自身的
布局与样式。
撤掉它,同时把真问题补上:userbar 之前根本不可覆盖(layout.vue 静态 import),
消费侧就算按约定放了 shrimp/components/userbar.vue 也会被静默忽略——这才是当初
需要 headerWidgets 的原因。现在 userbar 走 resolveVue,整条顶栏都能换。
代价:想改顶栏得整份重写内置那 92 行,不能只插一个部件。这是有意的,覆盖颗粒度
本来就停在入口级(README 那张表),不为单个部件开代理。
README 同步:补上 userbar 这一行,并写明表外路径会被静默忽略、不报错。
v0.8.2
|
2026-08-11 12:18:48 +08:00 |
|
wc24
|
2ce6fd6d2f
|
0.8.1: 布局不再依赖消费侧给挂载点加 class="aminui"
.aminui-wrapper 补 height:100%。#app 本来就有 height:100%(app.scss 开头),
但它是块级容器,wrapper 的 flex:1 在块级父容器里空转,布局塌成内容高度——
侧边栏比页面矮一截,还跟着表格异步加载忽长忽短。不报错、页面照常打开,
所以接入方发现不了,只会当成 CSS 小毛病。
父级确实是 .aminui 时 flex:1 1 0% 接管尺寸,这行等价不冲突,存量消费侧不受影响。
已验证:atf-admin 删掉 index.html 上的 class="aminui" 后,
project / point / requirement 三个页面侧边栏高度均为 851(此前缺类时 634)。
v0.8.1
|
2026-08-10 19:55:52 +08:00 |
|
wc24
|
603e33d17f
|
0.8.0: 契约副本刷齐并改为自动同步;未注册字段类型不再静默回落
契约副本(src/IShrimpType.ts)此前漂了一整代:停在旧的 json 类型,
缺 object / array / IFieldConfig.fields / IFieldConfig.item / parse / IPageResult.refs。
而本包自己的组件早就在读这些字段——FieldArray 读 field.item、FieldObject 读 fields、
FieldRelation 与 ShrimpTable 读 refs。等于组件在用、类型说没有。
接入方照这份副本理解 shrimp 能渲染什么,只会得出"结构化数据只有 json"的结论。
现在由 shrimp-server 的 postbuild 单向覆盖过来(它是契约真身),
本仓库另提供 npm run check:contract / sync:contract 手动比对与同步。
注释头不参与同步,它声明的是"我是副本",与契约正文是两回事。
VueAdmin.getFieldComponent:未注册类型仍回落成 string(类型词汇表是开放的,
消费侧放个 Field<X>.vue 就能扩,改成严格校验会当场打死 theseus 的 gesture/goodsList
和 hand 的 dropList/matterPointDropList),但按类型去重告警一次,
打印出现位置、已注册类型和两条修法。上面那个 json 就是这么静默活下来的。
resolveVue:内置组件表为空时报"本包没被 vite 正常转换、消费侧缺 optimizeDeps.exclude",
不再报"找不到 layout.vue"把人引去查文件路径。
README 重写成可照抄的接入模板 + 出错对照表 + "那几行为什么不能删"。
版本与 shrimp-server 归一到 0.8.0,删掉 @syncedFrom 这条手维护的版本标记。
v0.8.0
|
2026-08-10 19:48:57 +08:00 |
|
lbin
|
b7042c8387
|
操作栏 宽度
|
2026-07-23 19:11:08 +08:00 |
|
lbin
|
bed4d4dc4a
|
add: bar components
|
2026-07-10 15:11:42 +08:00 |
|
wc24
|
ab312fb24f
|
chore: bump 0.7.10(与 shrimp-server 版本归一)
v0.7.10
|
2026-06-30 17:47:10 +08:00 |
|
wc24
|
546d95c926
|
fix(filter): 单独清空按钮改禁用态切换,常驻不显隐(避免布局闪动)
v0.7.9
|
2026-06-30 17:34:59 +08:00 |
|
wc24
|
6b0a6118e0
|
feat(filter): 筛选抽屉每个字段可单独清空
每行加 CircleClose 清空按钮(有值才出现),只摘掉该 key、其余条件不动。
比依赖各字段组件自身 clearable 更通用(range/relation/必填字段筛选时也能清)。
v0.7.8
|
2026-06-30 17:30:16 +08:00 |
|
wc24
|
09ad43007a
|
feat(tab): 类型可清空(clearable=!required)+ 空状态
FieldTab: 类型 select 非必填可清空 → type=null、整个 tab 置空、分支消失。去掉 innerValue/
initValue/onMounted 那套强制默认(空状态由 isEmpty 配 required 决定)。配合后端递归 isEmpty。
v0.7.6
|
2026-06-30 16:52:09 +08:00 |
|
wc24
|
e789f8a1f7
|
feat(filter): filterableFields 递归收集嵌套 filterable,key=点路径
ShrimpTable 把 filterableFields 从'顶层 filter'改成'递归收集 object/tab 嵌套叶子',
生成 key=点路径的合成字段。抽屉/buildFilter/URL 同步全按 field.key 走即可,无需改。
版本与 shrimp-server 对齐 0.7.5。
v0.7.5
|
2026-06-30 16:01:23 +08:00 |
|
wc24
|
d906603ce3
|
fix(add): array/object 字段新增初值用 []/{}(原落成 '')
handleAdd 里 array/object 类型字段未特判,初值落到 '';虽 FieldArray/FieldObject 能容错,
但语义错。补 array→[]、object→{}。版本与 shrimp-server 对齐 0.7.1。
v0.7.1
|
2026-06-30 14:06:42 +08:00 |
|
wc24
|
c49663e16e
|
feat!: object/array 字段组件 + 去掉 FieldJson + 版本统一 0.7.0
- 新增 FieldObject.vue(嵌套字段组,display/edit 递归渲染)、FieldArray.vue
(元素列表,增删 + 每项递归渲染 item;第一版从简:无排序拖拽)。靠 glob 自动注册成 object/array。
- 删 FieldJson.vue(json 类型退场,object 取代)。
- 版本与 shrimp-server 统一为 0.7.0。
v0.7.0
|
2026-06-29 22:25:59 +08:00 |
|
wc24
|
c44f2a159e
|
feat(export): 前端生成 xlsx 前把对象/数组单元格 JSON 序列化
后端 export 改为只发原始对象后,前端在 json_to_sheet 前通用地 stringify 非标量单元格
(覆盖 tab 等),避免 [object Object];import 时由后端 reqFilter 还原。
v0.3.10
|
2026-06-29 21:47:10 +08:00 |
|
wc24
|
35abfd831c
|
feat(tab): 显示搬前端,递归渲染子字段组件(替代后端 _label 串)
FieldTab.display 不再吃 displayLabel 字符串,改为渲染选中分支的子字段(各自 display 组件):
relation 子→查 refs 出可点名、number→数字、嵌套 tab→再递归。配 shrimp-server v0.6.9
的 refs 下钻,嵌套关联名自动有。ShrimpTable displayLabel 绑定去掉 tab。
v0.3.9
|
2026-06-29 21:30:48 +08:00 |
|
wc24
|
3b0887b126
|
fix(edit): 清空字段能真正提交(undefined→null,避免 JSON 丢键)
清空 relation/select 时 el-* 常 emit undefined,进 submitData 后 JSON.stringify 丢键 →
后端收不到、看似'提交无效'。修:
- handleSave 编辑 diff 把值归一成 null(??null),清空 → null → 提交 → 后端置空
- FieldRelation 清空归一成 null(单)/[](多),避免 ObjectId 存 '' cast 报错
v0.3.8
|
2026-06-29 21:17:38 +08:00 |
|
wc24
|
bba08dadcc
|
feat(fields): 可选字段(非 required)编辑态可清空,统一 :clearable=!required
之前 Select/Relation 编辑态根本没 clearable(可选也删不掉),String/Textarea/Date 又恒清。
现统一 String/Textarea/Select/Relation/Date 的 edit 控件 clearable=!required:可选给清空、必填不给。
Relation 清空归一成 null(el-select 单选清空发 '',ObjectId 存 '' 会 cast 报错)。
已知例外:Number 用 el-input-number 无 clearable 属性,只能手动清空输入框、无按钮。
v0.3.7
|
2026-06-29 21:11:58 +08:00 |
|
wc24
|
701ed957ef
|
feat(role): 跳转带的 ?filter={_id} 在角色列表里自动选中那条
role 是自定义 master-detail 页(非 ShrimpTable、不做服务端过滤),原 onMounted 默认选第一个,
无视 relation 跳转带的 _id。现全量加载后按 URL filter._id 客户端选中目标角色,解析不出走默认。
v0.3.6
|
2026-06-29 21:00:07 +08:00 |
|
wc24
|
0b75f8c6f2
|
fix(filter): 用户搜索/改筛选时清掉 relation 跳转的隐形 _id pin
跳转用 ?filter={_id} 锁单条,但 _id 不在筛选抽屉里、且抽屉 confirm 会把它原样带回,
导致用户再搜索/筛选时被看不见的 _id 一直 AND 着、结果莫名为空。
onSearch + handleFilterConfirm 现在都剥掉 _id(重置本就清空)。
v0.3.5
|
2026-06-29 20:54:19 +08:00 |
|
wc24
|
417318921c
|
fix(menu): 菜单高亮用 $route.path 而非 fullPath
default-active 原绑 $route.fullPath(含 query),地址栏带 ?filter=… 时与菜单项
index('/'+name,纯路径)对不上 → 菜单不高亮/不跟随切换。改用 $route.path。
layout(桌面) + sideM(移动) 两处同改。
v0.3.4
|
2026-06-29 20:48:58 +08:00 |
|
wc24
|
f7ef29a928
|
feat(relation): 显示名可点 → 跳目标模块并过滤到该 _id(单行)
- VueAdmin: 记录 moduleKey→IRouteInfo(moduleRoutes),加 routeForModule(判已注册+非子模块)
- FieldRelation.display: 目标可达时名字渲成链接,点击 router.push 到目标模块
+ ?filter={_id},落成过滤到单条的列表(框架无详情页,单项查看即此形态)
- 子模块目标/无权限目标不可点(routeForModule 返回 undefined)
v0.3.3
|
2026-06-29 20:38:21 +08:00 |
|
wc24
|
f7ee862e0f
|
feat(relation): 显示改查 refs 字典(替代逐行 _label)
配合 shrimp-server v0.6.7:list 响应带回 refs。
- ShrimpTable: 取 res.refs 并 provide('shrimpRefs')
- FieldRelation.display: inject refs,按 id 查名(单/多选),去掉 displayLabel 依赖
- ShrimpTable displayLabel 绑定去掉 relation(tab/textarea 仍走 _label)
relation 顶层显示行为不变,只是换了供给方式。
v0.3.2
|
2026-06-29 20:19:56 +08:00 |
|
wc24
|
8ac1427015
|
feat(tab): 表格列显示后端 stringify 文本(displayLabel=${key}_label)
配合 shrimp-server v0.6.3:tab 字段本体端到端是对象(编辑回显正常),
表格展示改用后端算好的 ${key}_label 字符串,与 relation/textarea 的 _label 约定一致。
FieldTab.display 优先渲染 displayLabel,无则回退旧的对象标签逻辑。
v0.3.1
|
2026-06-29 15:47:29 +08:00 |
|
wc24
|
ebe5937fb6
|
docs(README): 覆盖颗粒度限定到 3 个入口 + 加 login 覆盖示例
- 删掉 "components/* 都可覆盖" 的误导清单(框架内 peer 引用是硬编码静态 import)
- 明确 3 类入口: router targets / module routes / field registry
- 加完整可跑的 login.vue 覆盖例子
v0.3.0
|
2026-05-25 18:03:42 +08:00 |
|
wc24
|
de18412010
|
fix(v0.3.0): 框架内 peer 引用回退静态 import + 修 FieldRelativeTime 路径
- 覆盖颗粒度只在 3 个入口: router targets / module routes / field registry
- 框架内 .vue 之间互相引用全部硬编码静态 import,resolveVue/defineAsyncComponent 退出 .vue 文件
- 修 components/fields/FieldRelativeTime.vue 的 ../VueAdmin → ../../VueAdmin (移动后未跟改)
|
2026-05-25 17:33:44 +08:00 |
|
wc24
|
2b33bca681
|
v0.3.0: 单 sources 入口 + 路径后缀覆盖约定
破坏性重构。框架对外只暴露一个 `sources` glob 入口,消费侧任何 .vue
都按文件路径后缀匹配同后缀覆盖:
- shrimp/components/<name>.vue 同后缀覆盖框架内置(login/layout/topbar/ShrimpTable/...)
- shrimp/components/fields/Field<X>.vue 注册类型 <x>(首字母小写)
- shrimp/module/<key>.vue 业务模块
变更:
- 删除 customFields / moduleSources / overrideField / registerField 旧入口
- 删除 fieldOverrides Map,字段表纯靠 glob 扫描注册
- 框架内 .vue 对可覆盖 peer 改用 defineAsyncComponent(resolveVue(...))
(login → ShrimpLangSwitch / layout → sideM/navMenu/topbar/userbar/logo /
ShrimpTable → ShrimpEditDrawer/ShrimpFilterDrawer/...)
- views/ 全部并入 components/,App.vue 上提到 src/ 根
- LangSwitch → ShrimpLangSwitch,PowerTree → ShrimpPowerTree
- module/FieldRelativeTime.vue → components/fields/FieldRelativeTime.vue
- module/user.vue 改用 #column-updatedAt slot 替代旧的 overrideField
字段类型约定从 'field' + Name 改为 lowercase-first(FieldString → 'string'),
内置和消费侧统一。
|
2026-05-25 15:05:16 +08:00 |
|
wc24
|
ac57de97cb
|
fix(i18n): correct t:prefixed strings to ILabel objects for translation
v0.2.4
|
2026-05-24 22:50:59 +08:00 |
|
wc24
|
0b8f873a4c
|
fix(ShrimpEditDrawer): i18n fieldRequired translation with label param
v0.2.3
|
2026-05-24 22:32:32 +08:00 |
|
wc24
|
d580fc53b9
|
chore: bump version to 0.2.2 & sync locales
v0.2.2
|
2026-05-24 21:11:03 +08:00 |
|
wc24
|
9746be581d
|
v0.2.1: i18n messages 改成深合并
initI18n 之前用 spread 浅合并:
{ ...zh_cn, ...(extra['zh-cn'] || {}) }
业务侧只要定义同名一级键(如 'user'),框架自带 user.* 全部被覆盖,
表现是控制台 [intlify] Not found 'user.operationLog' / 'user.xxx' 之类。
改成递归 deepMerge,框架 locale 在底,业务侧叠在上,同 leaf key 业务覆盖框架。
v0.2.1
|
2026-05-23 22:48:10 +08:00 |
|
wc24
|
f210ce4582
|
v0.2.0: 解耦 shrimp-server,内置 IShrimpType 契约副本
- 拷 shrimp-server/src/IShrimpType.ts 到 src/IShrimpType.ts,头改 @syncedFrom shrimp-server contract 1.0.0
- 全部内部 import 'shrimp-server/types' → 本地 './IShrimpType'(各文件按相对路径)
- src/index.ts 加上类型契约的 re-export(ShrimpCode/ShrimpError/枚举/全部 interface),消费侧从 'shrimp-admin' 一处拿到
- 删 dependencies.shrimp-server,前端 bundle 不再牵 mongoose/express
为什么不直接 import 'shrimp-server':
shrimp-server v0.6.0 收单入口后,入口含 mongoose/express,前端会被 vite 牵进 bundle。
契约副本 + 版本号对照是低频改动场景的更干净选择。
v0.2.0
|
2026-05-23 22:29:42 +08:00 |
|
wc24
|
4cb3bb8d75
|
feat: shrimp-admin v0.1.0 — 从 hand-admin 抽离的框架前端
Shrimp 框架前端 — 一种消费 ShrimpServer + ShrimpTable 契约的经典 Vue3 +
Element Plus 实现。不是框架本身,只是按 shrimp-server 约定写的一份参考解法。
包含:
- ShrimpClient + VueAdmin(factory:createShrimpAdmin)
- 5 个 Shrimp* 组件 + 10 个内置 Field*.vue + PowerTree + LangSwitch
- 4 个内置模块:user / role / operationLog / FieldRelativeTime
- 完整后台壳 views(layout/login/sideM/topbar/userbar/navMenu/App/404/logo)
- composables/useTableUrlSync, locales(zh-cn/en 框架默认), style 全套
API 改造:
- createShrimpAdmin({ config, moduleSources, customFields, locales }) factory
- vueAdmin 改为 Proxy 单例,createShrimpAdmin 调用前访问会抛错
- import.meta.glob 业务字段/模块由消费侧传入(vite 静态扫描机制限制)
- 框架默认 locales 与消费侧 locales 在 i18n 初始化时合并
源码 ship 不打包,消费侧靠 vite 直接吃 .ts/.vue。
v0.1.0
|
2026-05-23 21:01:33 +08:00 |
|
wc24
|
b4ee2e4b43
|
Initial commit
|
2026-05-23 20:22:55 +08:00 |
|