TermiNexus
|
90b20f3c94
|
feat(Talk): 群支持最多 10 个管理员,改群名收紧到群主/管理员
成员角色新增 2=管理员(MAX_GROUP_ADMINS=10);新增 POST API/Talk/Conversation/Member/Role 设置/取消管理员(仅群主或 Talk 管理员,不能变更群主);会话列表返回 IsGroupAdmin/MyRole/AdminCount/CanManage 与成员 MemberRole;RenameConversation 增加 IsTalkAdmin 参数并把群聊改名权限收紧到群主/群管理员;Entry 下发 GroupAdminLimit。
|
2026-10-13 16:07:52 +08:00 |
|
TermiNexus
|
aa56281493
|
feat(订阅式软件提供): 按包名详情接口在 README 为空时合成默认 Markdown
新增 _DefaultReadme:由包名、说明、安装命令、依赖表与版本历史合成 README;仅 PackageByNameView(官网数据源)使用,配置页读到的仍是作者原文,避免合成内容被回写。
|
2026-10-07 20:16:08 +08:00 |
|
TermiNexus
|
4bd5697cff
|
feat(订阅式软件提供): 包详情支持依赖列表与 README,打通产品官网数据链路
GVSDServiceServer:VenomPackage 增 Dependencies(JSON)/Readme(Text) 与迁移 0002,新增按包名取详情接口 /api/venom/project/<包名>/,定制页配置新增依赖编辑器与 README 编辑。
gvsds:新增 /API/Venom/Project/<包名> 公开只读接口,按 PublicSiteHost 反查产品并回源提供者;SubscriptionGroup 增 PublicSiteHost 字段(迁移 0055)。
Main.py:venom 子域加 SPA fallback,/project/<包名>/ 回退 index.html。
|
2026-10-07 19:35:46 +08:00 |
|
TermiNexus
|
edecc6435a
|
feat(订阅式软件提供): 远端入口 URL 带内容版本号,免除浏览器旧副本
- ProxyEntryURL 追加 ?v=<SHA256前16位>:内容一变 URL 就变,浏览器/中间缓存旧副本自动作废,提供者重建后无需强制刷新
- 重新声明定制页时清缓存并立即回源预热,使版本号自第一刻起即为新值(返回体新增 WarmError 供排查)
|
2026-10-07 18:05:23 +08:00 |
|
TermiNexus
|
6165df5d78
|
fix(订阅式软件提供): 远端资源改 no-cache 条件校验,且 ETag 按 RFC7232 弱比较
- 浏览器侧 max-age=24h 会把旧产物挡住一天,提供者重建后被浏览器旧副本劫持;改为 no-cache + ETag:每次校验、未变 304,回源仍受主服务 24h TTL 限制
- 实测响应 ETag 被网关降为弱校验(W/ 前缀),严格相等匹配拿不到 304;改为归一化(去 W/ 与引号)后按弱比较命中,实测 304
|
2026-10-07 17:59:59 +08:00 |
|
TermiNexus
|
f812413de5
|
feat(GVSDServiceServer): 新增 Venom 一键重建+重新声明脚本
- rebuild-venom.ps1:npm run build 后自动调 /api/sub/declare-page/,主服务器登记入口同时清空该产品资源缓存,重建产物立即生效(无需等 24h)
- 声明端点支持请求体传 ApiKey/Secret(缺省回落环境变量),便于脚本按次传凭据
|
2026-10-07 17:48:14 +08:00 |
|
TermiNexus
|
8d98abe231
|
feat(订阅式软件提供): 提供者重新声明定制页即失效该产品资源缓存
入口 URL 通常不含内容版本号,24h TTL 内主服务不会回源,重建后的产物要等过期才生效;改为 SetGroupRemotePage 时清空该产品缓存(PurgeRemoteAssets),下次请求立即回源并按 SHA256 只换来真正变化的文件
|
2026-10-07 17:44:29 +08:00 |
|
TermiNexus
|
3e642ca119
|
fix(Venom): 修复 API base 被 Vite 编译成静态资源查找导致请求 undefined 路径
Vite 会把 new URL(动态拼接串, import.meta.url) 编译为 Object.assign({})[key] 资源表查找,运行时取到 undefined(请求变成 .../venom/undefined/packages/);改为正则 + 字符串拼接自行推导同源 RemoteApi 基址
|
2026-10-07 17:39:12 +08:00 |
|
TermiNexus
|
89274ea2bd
|
fix(订阅式软件提供): 远端资源浏览器侧缓存与主服务统一为 24h
Cache-Control 由 max-age=3600 改为 max-age=86400(复用 REMOTE_ASSET_TTL_SECONDS),保留 ETag 条件请求
|
2026-10-07 17:31:09 +08:00 |
|
TermiNexus
|
37413722af
|
refactor(GVSDServiceServer): 移除子服务器 CORS,改由主服务同源代理
- 资源与接口统一经主服务 RemoteAsset/RemoteApi 代理,浏览器不直连子服务器,跨源放行不再需要
- 删除 apps/venom/middleware.py 与其 MIDDLEWARE 注册;VenomRemoteEntryView 去掉 Access-Control-Allow-Origin
|
2026-10-07 17:27:47 +08:00 |
|
TermiNexus
|
eecb4f66e9
|
feat(订阅式软件提供): 主服务缓存代理提供者子服务器资源,浏览器不再直连
- 新增 SubscriptionRemoteAsset 缓存表(迁移 0054):内容落库,TTL 24h,过期回源按 SHA256 判断变更,回源失败降级用旧缓存
- 新增 GET /API/Subscription/RemoteAsset/<GroupUUID>/<Path>(带 ETag/条件请求)与 ANY /API/Subscription/RemoteApi/<GroupUUID>/<Path> 实时接口透传(不缓存、不转发 Cookie)
- ListMySubscriptions 下发的 RemoteEntry 改写为主服务同源代理 URL;venom_ui API base 随之走 RemoteApi 透传
|
2026-10-07 17:22:48 +08:00 |
|
TermiNexus
|
8beb280aad
|
style(Venom): 优化包管理器定制页 UI
- 新增品牌/概览区(软件包数、版本发布数)与工具条,列表改用卡片 + 包头像/说明双行单元格
- 配置视图改为 包信息头 + 配置/发布双栏卡片 + 发布历史卡片,表单改 label 顶置
- 全部配色走 Element Plus CSS 变量,自动适配宿主明/暗主题;引入 @element-plus/icons-vue
|
2026-10-05 18:24:37 +08:00 |
|
TermiNexus
|
993d142bdd
|
fix(订阅式软件提供): venom_ui 产物内联 process.env.NODE_ENV,修复远端加载 process is not defined
lib 模式不自动替换 NODE_ENV,浏览器原生 import 时报错;build.define 强制按 production 常量内联
|
2026-10-05 18:14:52 +08:00 |
|
TermiNexus
|
c50f3f0a55
|
feat(订阅式软件提供): GVSDServiceServer 新增 Venom 包管理器与远端页面子工程
- apps/venom: VenomPackage/VenomPackageRelease 模型 + 0001 迁移,提供包列表/新建(包名全局唯一)/详情/配置保存/发布历史接口,并放行跨源 CORS
- venom_ui: Vite+Vue SFC 子工程,单文件 ES module 产物,支持 mount/unmount 微应用契约,页面含包列表、新建、配置页、发布历史
- sub_server: VenomRemoteEntryView 改由 venom_ui 构建产物托管;remote_pages 占位模块改为 mount/unmount
|
2026-10-05 17:45:33 +08:00 |
|
TermiNexus
|
b078f8e9fe
|
feat(订阅式软件提供): 产品定制页远端入口 + 我的订阅 + GVSDServiceServer
订阅组新增 RemoteEntry/RemoteModule(0053 迁移);新增 Provider/Page/Save(提供者用 ApiKey+密钥换取令牌后声明定制页)与 MySubscriptions(按当前用户查已订阅产品,含定制页入口)接口;清单新增「我的订阅」菜单与 subscriber 虚拟职务;新增提供者子服务器 GVSDServiceServer(仿 ATestCServer:MSYNC 桥接 + 托管 Venom 定制页远端组件 + 用订阅凭据声明定制页)。
|
2026-10-05 17:00:05 +08:00 |
|
TermiNexus
|
2c8dd45206
|
feat(订阅式软件提供): 产品级 API Key/密钥与订阅成员
新增 SubscriptionApiCredential(每产品一对 ApiKey+密钥,密钥仅存 bcrypt 哈希,激活/重置时明文仅返回一次)与 SubscriptionMember(以「部门-员工键」记录订阅,写入时校验部门必须归属该产品消费者公司);manager 增加凭据激活/查看/重置/校验与访问令牌签发、成员列表/批量保存/删除;views/urls 增加管理端凭据与成员接口,以及提供者子服务器 Token(免登录换令牌)与 Ping(Bearer 鉴权);新增 permissions 提供者令牌认证与权限。
|
2026-10-05 11:29:04 +08:00 |
|
TermiNexus
|
229cf2fe92
|
chore: 更新完成提示 toast 文案(订阅允许同公司双身份)
|
2026-10-05 11:04:39 +08:00 |
|
TermiNexus
|
a647508214
|
feat(gerp): 订阅允许同一家公司同时作为提供者与消费者
- SaveGroup / SaveAppParties 去掉两方交集校验(唯一键按 PartyType 区分,同一公司可落两行)
- 保留「同一身份下不可重复出现」校验
- 同步更新 models 文档说明
|
2026-10-05 11:03:13 +08:00 |
|
TermiNexus
|
91eccf6198
|
fix(main): 单实例控制端口默认值避开 Windows 保留端口段
57321 落在 Windows 保留端口段 57269-57368(Hyper-V/WSL/Docker 动态保留),即使无任何进程监听 bind 也会失败(WinError 10013 权限禁止),报错看起来像「端口被占用」。
- 默认端口改为 45731(静态区、非保留段,本机实测 ControlServer.TryBind() 通过)
- 报错文案补充保留段排查提示(netsh int ipv4 show excludedportrange protocol=tcp)
|
2026-10-04 19:46:39 +08:00 |
|
TermiNexus
|
1ac76006c6
|
fix(gerp): 部门详情页修改成员误报「不属于当前公司」
_ResolveDeptEmployee 的跨公司校验未按公司隔离开关生效:管理员(admin:super/admin:tenant)本就关闭公司隔离,当「当前角色公司 ≠ 目标部门所属公司」时(如同一用户切到默认角色后浏览其它公司的部门,PUT /API/FormAPI/Modify/UserRoleDepartment/<pk> 恒返回 400)。
- 改为仅在 self.company_scope=True(非管理员)时校验,与批量调整职务等处的既有写法一致
|
2026-10-02 23:44:38 +08:00 |
|
TermiNexus
|
f060fb14f1
|
fix(gerp): 订阅应用职务门禁改挂既有业务职务,撤回误建的字典项
提供方/消费方是公司级、组内身份,不应建成租户级通用部门/职务。
- 清单 VirtualPositions 改为 业务主管/订单专员/业务经理/产品专员(各可见三个菜单)
- 移除 PositionTemplates(不再声明通用部门与职务模板)
- 数据侧已删除误建的通用部门「订阅」与其下三个职务,并重新自动绑定
|
2026-10-02 23:26:35 +08:00 |
|
TermiNexus
|
02bb7b3852
|
feat(gerp): 订阅应用新增应用级订阅方与业务虚拟职务
- 新增 SubscriptionAppParty(应用级提供者/消费者公司,作为初始化引用)+ 迁移 0051
- 新增接口 GET /API/Subscription/AppParties、POST /API/Subscription/AppParty/Save
- 清单新增 RequirePositionBinding、菜单「软件管理」(/subscription/software)、3 个业务虚拟职务(软件提供方/软件消费方/订阅管理员)与「订阅」职务模板
|
2026-10-02 23:12:27 +08:00 |
|
TermiNexus
|
e60200b334
|
feat(gerp): 新增「订阅式软件提供」应用
订阅组 = 一个产品,为产品指定一家或多家提供者公司/消费者公司;可选公司范围 = 当前管理员可管理的全部公司(跨租户管理员可选任意租户)。
- 新增 subscription 子应用:models/manager/views/urls/manifest
- SubscriptionGroup / SubscriptionGroupCompany(PartyType 1提供者/0消费者)
- 校验:产品名必填且同租户唯一、提供者/消费者各至少一家、同一产品内不可双重身份、越权公司拒绝
- 新增迁移 0050_subscription
- urls 挂载 API/Subscription/;app_manifests 登记父菜单「订阅式软件提供」
- 修复 CompanyRows 中 UUIDObj/bytes 键不匹配导致公司名为空
- 修复 SaveGroup 的 AllowedCompanyUUIDs 未归一(UUIDObj 无 hex)
|
2026-10-02 21:36:10 +08:00 |
|
TermiNexus
|
b6f0d67e42
|
chore: 更新完成提示 toast 文案(修复密码校验恒判失败)
|
2026-10-02 16:38:08 +08:00 |
|
TermiNexus
|
a1ec417a3d
|
chore: 更新完成提示 toast 文案(修复 SDK VerifyPassword 形参遮蔽)
|
2026-10-02 16:32:05 +08:00 |
|
TermiNexus
|
96578b91ad
|
chore: 更新完成提示 toast 文案(用户详情页身份证解锁)
|
2026-10-02 16:29:54 +08:00 |
|
TermiNexus
|
8325fb0567
|
chore(ehrm): Chndos 改名 Chindows(账号 + 档案昵称)
- 系统账号 UserName:Chndos -> Chindows(唯一登录名,后续须用 Chindows 登录)
- 该员工档案(b2f7e978-90db-4d33-8ea4-74a897bd34b8)的网络常用昵称同步改为 Chindows
- 导入脚本 ROW_USER 的第19行映射同步改为 Chindows(否则问卷行19 解析不到账号)
|
2026-10-02 16:05:27 +08:00 |
|
TermiNexus
|
b0074c8a8e
|
chore: 更新完成提示 toast 文案(Chndos 档案已补)
|
2026-10-02 15:58:14 +08:00 |
|
TermiNexus
|
2ca1d11b8a
|
chore(ehrm): 档案导入补 Chndos(问卷行19)映射
- 问卷新增行19(MikuGan / 王浩然),对应系统账号 Chndos,补进 ROW_USER 映射
- 已跑 --write:新建 1 份档案(银河锋锐·工程部),其余行已有档案自动跳过,库内档案 17 → 18
|
2026-10-02 15:58:14 +08:00 |
|
TermiNexus
|
9b78bec805
|
chore: 更新完成提示 toast 文案(身份证表单锁提示 + Markstollr8651 档案)
|
2026-10-02 14:19:13 +08:00 |
|
TermiNexus
|
4d6c778894
|
chore(ehrm): 档案导入补 Markstollr8651(问卷行18)映射
- 问卷新增行18(Markstollr8651 / 裴雨辰),补进 ROW_USER 映射
- 已跑 --write:新建 1 份档案(银河锋锐·测试部),其余行因已有档案自动跳过,库内档案 16 → 17
|
2026-10-02 14:19:12 +08:00 |
|
TermiNexus
|
39faae5efa
|
chore: 更新完成提示 toast 文案(员工档案身份证二次密码解锁)
|
2026-10-02 14:13:54 +08:00 |
|
TermiNexus
|
632881b5c5
|
feat(ehrm): 员工档案新增身份证号列(加密存库 + 二次密码解锁查看)
- EmployeeProfile 新增 IdCard 列,落库前用 payment 的 XOR+base64 加密(迁移 0049)
- 新增 idcard_access:解锁态按登录用户存 10 分钟 cache(切换他人档案同样有效)
- FormAPI 读路径:未解锁时身份证一律抹空(完全隐藏);写路径加密,空值不覆盖已存证号
- 新增 /API/Ehrm/UnlockIdCard 与 /API/Ehrm/IdCardStatus(复用 AuthManager.VerifyUserPassword)
|
2026-10-02 14:13:26 +08:00 |
|
TermiNexus
|
f3920a35ca
|
chore: 更新完成提示 toast 文案(部门员工抽屉)
|
2026-10-02 12:56:16 +08:00 |
|
TermiNexus
|
2f7bf3ea65
|
chore: 更新完成提示 toast 文案(两仓 push 完成)
|
2026-10-01 23:38:21 +08:00 |
|
TermiNexus
|
2a8922ebc7
|
chore: 更新完成提示 toast 文案(注销 4 个账号及其关联)
|
2026-10-01 23:30:58 +08:00 |
|
TermiNexus
|
0509cc2517
|
chore: 更新完成提示 toast 文案(银河锋锐缺 eHRM 档案名单)
|
2026-10-01 23:22:24 +08:00 |
|
TermiNexus
|
82ddddce00
|
chore: 更新完成提示 toast 文案(工作组卡片角色数/用户数)
|
2026-10-01 23:18:11 +08:00 |
|
TermiNexus
|
fbae55f017
|
chore: 更新完成提示 toast 文案(员工卡片角色数/用户数)
|
2026-10-01 23:16:32 +08:00 |
|
TermiNexus
|
07e44eefc6
|
feat(gerp): 员工列表支持按需统计去重用户数
部门详情「部门员工」与公司详情「员工」卡片标题需要显示「角色数:x/用户数:y」。
get_table 新增 WithUserCount 参数:带该参数时额外统计去重用户数(UserRole 直接按
UserUUID 去重;UserRoleDepartment/UserRoleWorkgroup 只存 UserRoleUUID 且非外键,
需回查 UserRole 后再去重)。默认不统计,避免给所有列表加一次查询。
Get/List 响应新增 _FormListResponse:仅在请求了计数时改为 {list, total, user_count}
对象结构 —— 前端 axios 拦截器只透传 data,计数挂在 data 之外读不到;不带该参数时
仍返回原有的数组结构,既有调用方行为不变。
|
2026-10-01 23:15:50 +08:00 |
|
TermiNexus
|
d92797eb31
|
chore: 更新完成提示 toast 文案(三仓推送同步)
|
2026-10-01 22:23:28 +08:00 |
|
TermiNexus
|
22d4c0cfab
|
chore: 更新完成提示 toast 文案(Main.py 热重载修复与单实例改造)
|
2026-10-01 21:16:35 +08:00 |
|
TermiNexus
|
5a8d29d31a
|
fix(Main): 修复热重载卡死事件循环并改造为单实例
--reload 改为纯通知指令:只通过 127.0.0.1:57321 控制端口通知既有实例重启,
本进程立即退出;找不到实例也直接退出,不再新开服务器抢占 80/443。
根因修复:monkey.patch_all() 把 threading 一并打补丁,导致 watchdog 的
Observer 变成 gevent 协程,其阻塞的 ReadDirectoryChangesW 不让出 hub,
整个事件循环被卡死(端口在监听却不再 accept)。改为轮询 .py 的 mtime/size,
并从 requirements.txt 移除 watchdog。
另修两处启动隐患:预置 WSGI SERVER_NAME 跳过 gevent 对 0.0.0.0 的反向 DNS
(实测 1.3s 起,期间服务器不 started);WaitForPortFree 用裸 bind 探测端口,
避免 SO_REUSEADDR 造成的"假绑定→静默停服"。
|
2026-10-01 21:16:12 +08:00 |
|
TermiNexus
|
45a710783b
|
chore: 更新完成提示文案
|
2026-10-01 20:27:18 +08:00 |
|
TermiNexus
|
a3e28011e4
|
feat(tools): 新增 eHRM 档案导入脚本 ImportEhrmProfiles
把「成员信息.xlsx」入组问卷按字段口径写入 EmployeeProfile / EmployeeContact:内置行号→账号映射与问卷→eHRM 的字段换算(年龄区间桶、政治面貌/学历/行业归一、其它志愿工作、设备与备注、联系方式类型),默认 dry-run,--write 时事务内写库;已建档员工自动跳过,可反复执行,后续问卷新增行只需补 ROW_USER 一行。
|
2026-10-01 20:27:10 +08:00 |
|
TermiNexus
|
748d27b76d
|
chore: 更新完成提示文案
|
2026-10-01 20:22:37 +08:00 |
|
TermiNexus
|
19b9360d57
|
feat(gerp): 联系方式新增 Github/电报 类型,设备选项新增「平板」
成员问卷里联系方式有 Github、电报两类,设备有平板;CONTACT_TYPE_OPTIONS 补 8=Github / 9=电报(EmployeeContact.ContactType 为 SmallInteger,无需迁移),Devices 的 tags 选项补「平板」,并同步模型注释。列定义由后端下发,前端无需改动。
|
2026-10-01 20:22:28 +08:00 |
|
TermiNexus
|
c55ea4cf0a
|
chore: 更新完成提示文案
|
2026-10-01 20:05:32 +08:00 |
|
TermiNexus
|
5b20e1b053
|
chore: 更新完成提示文案
|
2026-10-01 20:03:26 +08:00 |
|
TermiNexus
|
07803791a0
|
chore: 更新完成提示文案
|
2026-10-01 20:02:00 +08:00 |
|