# baoyu-workbench-patterns — auth permission

### 待办按用户隔离

```javascript
var TODO_KEY='bior_sw_'+USER;  // bior_sw_zhaoyunhao / bior_sw_zhangliya
```

## 渐变色统计卡片 + hover动效（2026-07-12）

替代扁平统计卡，使用CSS过渡动画提升视觉层次：

```css
.stat-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(105px,1fr));gap:8px}
.stat-cards .sc{background:var(--card);padding:10px 12px;border-radius:8px;border-left:3px solid;box-shadow:var(--shadow);transition:transform .15s,box-shadow .15s}
.stat-cards .sc:hover{transform:translateY(-1px);box-shadow:0 2px 8px rgba(0,0,0,.1)}
.sc-blue{border-left-color:#3b82f6}.sc-green{border-left-color:#0d904f}.sc-orange{border-left-color:#e37400}.sc-red{border-left-color:#e94560}
```

**聚焦发光**（input/button focus/transition）：
```css
.search-bar input:focus{border-color:var(--pri);box-shadow:0 0 0 3px rgba(26,115,232,.1)}
.todo-input button:hover{background:#1557b0}
```

**表头渐变**：
```css
th{background:linear-gradient(180deg,#f8f9fa,#f1f3f4)}
.panel-header{background:linear-gradient(135deg,#1a1a2e,#16213e)}
```

## 批注动态注入模式（2026-07-12）

不修改HTML模板，通过劫持原渲染函数动态追加textarea列。避免 `patch` 工具的转义问题。

```javascript
var origFilterList=filterList;
filterList=function(){
  origFilterList();
  document.querySelectorAll('#listBody tr').forEach(function(tr){
    var td=document.createElement('td');
    var ta=document.createElement('textarea');
    ta.onblur=function(){saveAnnot(this);};
    td.onclick=function(e){e.stopPropagation();};  // 阻止行点击
    tr.appendChild(td);
  });
};
```

## 客诉数据整合模式（2026-07-25 更新）

从 `mcp_complaints.json` 加载客诉明细，在销售工作台客诉Tab中展示含飞书详情页直链的客诉表。


### 客诉权限隔离（双重过滤）→ `references/complaints-isolation.md`

非管理员客诉需双重过滤：先按 `area`（区域），再按 `operator`/`creator`（操作人）。`USER_AREA_MAP` 必须同时包含简称和全称 key。

## KPI 看板 admin 下钻销售员模式（2026-09）

admin 在「🎯 KPI 看板 · 全公司」下钻到任意销售员（22 在职），走 getKPI 个人分支复用，数据 JSON 已备好、无需新数据。


### Tab 权限过滤

```javascript
function renderNav() {
  var u = state.user || {}, tabs = u.tabs || {};
  var visible = TABS.filter(function(t) {
    if (u.role === 'admin') return true;
    if (t.id === 'dashboard' && !tabs.dashboard) return false;
    return true;
  });
  // render visible tabs only
}
```


### 数据权限过滤

```javascript
function getFilteredCustomers() {
  var custs = state.data.customers || [];
  var role = state.user.role, name = state.user.name, dept = state.user.dept;
  if (role === 'admin') return custs;
  if (role === 'manager') return custs.filter(function(c) { return c.dept === dept; });
  return custs.filter(function(c) { return c.salesperson === name; });
}
```


### 权限管理页面

管理员通过 `admin.html` 配置用户角色+Tab权限，输出 JSON 后由 Agent 写入 CloudBase `user_roles` 集合。详见 `references/permission-admin-page.md`。


### 权限过滤：creatorEmail 精确匹配（2026-07-29 升级）

`creatorEmail` 比部门映射更可靠——覆盖率 100%，无需手动维护映射表：

```javascript
// 非管理员：按 creatorEmail 精确匹配
if (!isAdminUser() && state.user && state.user.email) {
  orders = orders.filter(function(o) { return o.creatorEmail === state.user.email; });
}
```
