diff --git a/code/fms/FMS新系统核心表结构设计.md b/code/fms/FMS新系统核心表结构设计.md
index 6d5d41fa..dfe5002f 100644
--- a/code/fms/FMS新系统核心表结构设计.md
+++ b/code/fms/FMS新系统核心表结构设计.md
@@ -273,31 +273,29 @@ create index ix_s_menu_route
## 8. 权限
-> 权限直接授予用户,不引入角色继承。`s_power.b_id` 是内部主键,`s_power.b_code` 是稳定且全局唯一的业务键;字段授权使用独立的字段访问策略表。
+> 权限直接授予用户,不引入角色继承。`s_power.b_id` 是权限编码本身(业务键即主键),格式 `类型.对象[.能力]`,例如 `menu.cw_fee`、`module.cw_fee`、`action.cw_fee.audit`;完整规范见《字段权限与用户个性化设计.md》「权限编码规范」。字段授权使用独立的字段访问策略表。
```sql
create table dbo.s_power (
- b_id bigint not null,
- b_code varchar(300) not null,
+ b_id varchar(100) not null, -- 权限编码即主键:menu.cw_fee / module.cw_fee / action.cw_fee.audit
b_name nvarchar(200) not null,
b_i18n varchar(150) null,
- b_power_type varchar(20) not null, -- menu/page/report/module/action
- b_resource_id varchar(128) not null,
- b_owner_type varchar(20) null, -- action owner type
- b_owner_id varchar(128) null, -- action owner id
- b_capability varchar(30) not null, -- access/execute/read/create/update/delete/export
+ b_power_type varchar(20) not null, -- page/menu/module/action/report
+ b_owner_type varchar(20) not null, -- 归属对象类型:page/menu/module/report;action 时为所属模块或页面
+ b_owner_id varchar(50) not null, -- 归属对象编码:菜单/模块/页面/报表编码
+ b_capability varchar(30) null, -- action 的操作或动作编码:create/update/delete/export/audit...;入口类为 null
+ b_operation varchar(30) null, -- 兼容列:access/execute,由 b_power_type 派生
b_canuse tinyint not null default 1,
b_xh int not null default 0,
- primary key (b_id),
- unique (b_code)
+ primary key (b_id)
);
-create index ix_s_power_resource
- on dbo.s_power (b_power_type, b_owner_type, b_owner_id, b_resource_id, b_canuse);
+create index ix_s_power_owner
+ on dbo.s_power (b_power_type, b_owner_type, b_owner_id, b_capability, b_canuse);
create table dbo.s_user_power (
b_user_id varchar(50) not null,
- b_power_id bigint not null,
+ b_power_id varchar(100) not null, -- s_power.b_id,即权限编码
b_canuse tinyint not null default 1,
b_updatedatetime datetime2 null,
primary key (b_user_id, b_power_id)
@@ -345,18 +343,17 @@ create index ix_s_user_data_scope_module
权限点约定:
-- `menu/access`:菜单或页面入口访问权限;
-- `module/read|create|update|delete|export`:模块级数据操作权限;
-- `action/execute`:菜单或页面中的按钮、动作权限;
+- `page.<页面编码>` / `menu.<菜单编码>` / `report.<报表编码>`:入口访问权限,报表列表中的每个报表可作为一个资源;
+- `module.<模块编码>`:模块访问(≈ read,能否查看该模块数据);
+- `action.<模块编码>.<操作或动作>`:数据操作(`create` / `update` / `delete` / `export`)与业务动作(`audit` / `settle` 等)统一为动作权限;
- `s_user_field_permission`:字段 `hidden/view/edit` 访问级别,以及独立的查询/导出能力;
-- `page/access`、`report/access`:独立页面或报表访问权限,报表列表中的每个报表可作为一个资源;
-- `b_power_type` 和 `b_capability` 是可扩展编码,新增资源类型不新增权限表,但需要补充权限定义和前端/后端校验规则。
-- 动作业务键必须包含所属资源命名空间,例如 `action.module.cw_fee.audit.execute`,不得使用裸 `action.audit`。
+- `b_power_type` 和 `b_capability` 是可扩展编码,新增资源类型不新增权限表,但需要补充权限定义和前端/后端校验规则;
+- 动作必须带所属模块命名空间,例如 `action.cw_fee.audit`,不得使用裸 `action.audit`;**动作归属模块而非菜单**,避免同一个动作在不同菜单下被重复配置。
权限计算约定:
-- 入口权限默认拒绝:`menu/access`、`page/access`、`report/access` 和 `action/execute` 必须存在有效的 `s_user_power` 授权记录;停用的权限点或授权记录不生效;
-- 模块操作权限默认放行:`module/read|create|update|delete|export` 没有用户授权记录时视为允许;`s_power` 权限点或用户授权记录存在 `b_canuse = 0` 时视为明确禁用;
+- 入口权限默认拒绝:`page.*`、`menu.*`、`report.*` 与 `action.*` 必须存在有效的 `s_user_power` 授权记录;停用的权限点或授权记录不生效;
+- 模块操作 `action.<模块编码>.<操作>` 在没有授权记录时**默认放行还是默认拒绝尚未最终确定**,见《字段权限与用户个性化设计.md》「待确认事项」第 1 条;`s_power` 权限点或用户授权记录存在 `b_canuse = 0` 时视为明确禁用;
- 字段没有有效用户策略记录时不增加限制,按 `s_field`、`s_field_view`、`s_field_edit`、`s_field_query` 等模块默认配置执行;有效的 `s_user_field_permission` 只能收紧权限;`hidden` 表示不可见,`view` 表示可见只读,`edit` 表示可见可编辑;
- `hidden` 字段不可查询、不可导出;`b_allow_query` / `b_allow_export` 不能突破字段访问级别;
- 模块数据操作权限与数据范围同时生效:先判断操作权限,再按 `s_user_data_scope` 限制数据行;数据范围没有配置时视为 `all`;
diff --git a/code/fms/demo.html b/code/fms/demo.html
index bdb0151c..5c8ba71c 100644
--- a/code/fms/demo.html
+++ b/code/fms/demo.html
@@ -1,857 +1,129 @@
-
-
-FMS 权限中心 · 一屏授权
-
-
-
+
+
+ FMS 权限中心 · 功能实例授权
+
+
+
-
+
-
-
-
-
-
-
F
-
-
FMS 权限中心
-
一客户一库 · 权限点自动生成
-
-
-
-
-
-
-
IT
-
+
-
-
+
+
+ 授权对象
+
+ 未授权 = 拒绝 · 功能权限独立生效
+
-
-
-
-
授权对象
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
全部模块概览
-
{{ curUser.name }} · 点模块名进入详细配置
-
-
-
-
- | 模块 |
- 入口 |
- 已授权动作 |
- 数据范围 |
-
-
-
-
- |
- {{ m.name }}
- {{ m.id }}
- |
-
-
- |
-
- 未授权(默认拒绝)
-
- {{ a }}
-
- |
-
- {{ scopeName(scopeOf(m.id)) }}
- |
-
-
-
-
-
-
-
-
-
-
{{ selName }}
-
{{ state.selected }}
-
-
page 节点
-
{{ curUser.name }} · 全部默认拒绝,勾选即授权
-
-
-
-
-
入口
-
-
{{ hasEntry(state.selected) ? '已开通' : '未开通' }}
-
{{ entryCode }}
-
-
-
-
-
页面节点只配入口,具体操作在下属模块上配置
-
-
-
-
数据范围
-
-
未配置视为全部数据
-
-
-
-
-
敏感字段
-
-
该模块没有标记敏感字段,无需配置字段权限
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
IT ADMINISTRATION
-
资源配置(客户不可见)
-
IT 定义「能分配什么」。客户只做分配,不碰元数据,也不能新建业务动作(动作需要后端代码)。
-
-
-
-
-
权限点(自动生成)
{{ powerCodes.length }}
-
-
-
-
-
-
-
-
模块与敏感字段标记
-
只有标为敏感的字段才进入客户授权界面,其余字段不占配置量
-
-
-
-
-
- | 模块 |
- 字段 |
- 敏感 |
-
-
-
-
-
- | {{ i === 0 ? m.name : '' }} |
-
- {{ f.l }}
- {{ f.n }}
- |
-
-
- |
-
-
-
-
-
+ {{ module }}
字段策略:跟随模块默认
数据范围:全部数据
该功能不直接读取业务数据
-
-
-
-
-
权限点清单
-
随元数据自动生成,只增不删、不覆盖已有配置
-
-
-
-
-
-
-
-
-
- | 权限点编码 |
- 名称 |
- 默认 |
-
-
-
-
- | {{ p.code }} |
- {{ p.name }} |
- 拒绝 |
-
-
-
-
-
- 业务动作(如 module.cw_fee.audit)由开发注册代码后生成,客户界面只能勾选、不能新建。
-
-
+
-
+
-
-
-
-
- 已选 {{ state.picked.length }} 人
-
-
-
-
-
- 有 {{ diffList.length }} 项未保存变更
-
-
-
-
-
-
-
-
-
-
-
-
保存前确认
-
共 {{ diffList.length }} 项变更,保存后立即生效
-
-
-
-
-
-
-
- | 用户 |
- 类别 |
- 对象 |
- 变更前 |
- 变更后 |
-
-
-
-
- | {{ d.user }} |
- {{ d.type }} |
- {{ d.target }} |
- {{ d.from }} |
- {{ d.to }} |
-
-
-
-
-
-
-
-
-
-
-
-
{{ toastMsg }}
-
-
-
-
-
+
IT CONFIGURATION
功能实例与权限生成
技术人员维护业务功能、公共模板和模块依赖,客户只负责授权。
功能实例
{{ features.length }}
权限点
{{ allPowers.length }}
| 功能 | 类型 | 公共模板 | 使用模块 | 功能权限 |
|---|
{{ feature.name }} {{ feature.code }} | {{ typeName(feature.type) }} | {{ feature.template }} | {{ module }}无 | {{ powersFor(feature).length }} |
技术配置详情
{{ configFeature.code }}
功能名称
{{ configFeature.name }}
模板
{{ configFeature.template }}
自动生成权限
{{ power.code }}{{ capabilityName(power.capability) }}
+
+
+