|
@@ -1,73 +1,95 @@
|
|
|
import store from '@/store';
|
|
import store from '@/store';
|
|
|
import vue from 'vue';
|
|
import vue from 'vue';
|
|
|
-const userId = store.state.user.info.userId;
|
|
|
|
|
-const userName = store.state.user.info.name;
|
|
|
|
|
|
|
+const userId = store.state.user?.info?.userId;
|
|
|
|
|
|
|
|
|
|
+/** 避免 undefined == undefined 被误判为同一用户。 */
|
|
|
|
|
+function sameUser(a, b) {
|
|
|
|
|
+ return a != null && b != null && String(a) === String(b);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 当前用户是否为该行(文档/文件夹)的创建人。 */
|
|
|
export function isCreateUserId(row) {
|
|
export function isCreateUserId(row) {
|
|
|
- if (vue.prototype.$hasPermission('fm:doc:viewAll')) {
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
- return userId == row?.createUserId;
|
|
|
|
|
|
|
+ return sameUser(row?.createUserId, userId);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 当前用户是否为指定 ID,用于回收站按删除人判断。 */
|
|
|
|
|
+export function isCurrentUser(id) {
|
|
|
|
|
+ return sameUser(id, userId);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 与后端 FmAuthorityHelper 完全同口径的可写判定:
|
|
|
|
|
+ * 创建人 + userAuthority 名单内 visible!='0' 的用户可写;
|
|
|
|
|
+ * 未设置权限(空数组)时其他人只读。
|
|
|
|
|
+ */
|
|
|
|
|
+export function canEdit(row) {
|
|
|
|
|
+ if (!row) return false;
|
|
|
|
|
+ if (isCreateUserId(row)) return true;
|
|
|
|
|
+ const list = row.userAuthority;
|
|
|
|
|
+ if (!Array.isArray(list) || list.length === 0) return false;
|
|
|
|
|
+ const item = list.find((x) => sameUser(x?.id, userId));
|
|
|
|
|
+ return !!item && item?.visible != '0';
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 与后端 isVisible 同口径:空权限全员可见,设置权限后收敛到名单。 */
|
|
|
|
|
+export function canRead(row) {
|
|
|
|
|
+ if (!row) return false;
|
|
|
|
|
+ if (isCreateUserId(row)) return true;
|
|
|
|
|
+ const list = row.userAuthority;
|
|
|
|
|
+ if (!Array.isArray(list) || list.length === 0) return true;
|
|
|
|
|
+ return canEdit(row);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 「全部查看浏览权限」只用于查全部与读操作,不再放行任何写操作。 */
|
|
|
|
|
+export function canViewAll() {
|
|
|
|
|
+ return vue.prototype.$hasPermission('fm:doc:viewAll');
|
|
|
}
|
|
}
|
|
|
|
|
+// 写操作权限位:统一按「创建人 + 已设置权限的用户」判定,与后端文档级鉴权一致。
|
|
|
|
|
+// 前端权限面板里细分的 revise/del/checkOut 等勾选位不再决定能否写,避免前端放行、后端拒绝。
|
|
|
|
|
+const WRITE_POWERS = [
|
|
|
|
|
+ 'revise',
|
|
|
|
|
+ 'del',
|
|
|
|
|
+ 'checkEnter',
|
|
|
|
|
+ 'checkOut',
|
|
|
|
|
+ 'archive',
|
|
|
|
|
+ 'cancelArchive',
|
|
|
|
|
+ 'release',
|
|
|
|
|
+ 'abolish',
|
|
|
|
|
+ 'edit'
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
export function isPower(data = {}, power, selection = []) {
|
|
export function isPower(data = {}, power, selection = []) {
|
|
|
- if (!data.id && selection.length == 0) {
|
|
|
|
|
|
|
+ const list = selection || [];
|
|
|
|
|
+ if (!data?.id && list.length == 0) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
- if (
|
|
|
|
|
- //文件查看浏览权限
|
|
|
|
|
- vue.prototype.$hasPermission('fm:doc:viewAll')
|
|
|
|
|
- ) {
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- if (power == 'add' && data.userAuthority.length == 0) {
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
- if (power == 'checkEnter' && data?.checkOutUserId != userId) {
|
|
|
|
|
- //检入特殊处理
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ // 在目录下新建子项:沿用产品既有逻辑,未设置权限的目录开放新增;
|
|
|
|
|
+ // 显式设置过权限的目录仅创建人 + 名单内用户可新增。
|
|
|
|
|
+ if (power == 'add') {
|
|
|
|
|
+ if (isCreateUserId(data)) return true;
|
|
|
|
|
+ const auth = data?.userAuthority;
|
|
|
|
|
+ if (!Array.isArray(auth) || auth.length === 0) return true;
|
|
|
|
|
+ return canEdit(data);
|
|
|
}
|
|
}
|
|
|
- if (selection.length > 0) {
|
|
|
|
|
- //多选情况处理
|
|
|
|
|
- let _isPower = true;
|
|
|
|
|
- let userAuthorityS = [];
|
|
|
|
|
- let createUserIdS = selection
|
|
|
|
|
- .map((item) => item.createUserId)
|
|
|
|
|
- .filter((createUserId) => createUserId == userId);
|
|
|
|
|
- if (createUserIdS.length == selection.length || userName == 'admin') {
|
|
|
|
|
- //创建人/admin所有权限
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- selection.forEach((val) => {
|
|
|
|
|
- const powerObj = val.userAuthority.find((item) => item.id == userId);
|
|
|
|
|
- if (powerObj) {
|
|
|
|
|
- userAuthorityS.push(powerObj);
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ // 检入额外要求当前用户就是检出人
|
|
|
|
|
+ const checkEnterOk = (row) =>
|
|
|
|
|
+ power != 'checkEnter' || sameUser(row?.checkOutUserId, userId);
|
|
|
|
|
|
|
|
- if (userAuthorityS.length == 0) {
|
|
|
|
|
- _isPower = false;
|
|
|
|
|
- }
|
|
|
|
|
- userAuthorityS.forEach((item) => {
|
|
|
|
|
- if (item[power] != '1') {
|
|
|
|
|
- _isPower = false;
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- return _isPower;
|
|
|
|
|
|
|
+ if (list.length > 0) {
|
|
|
|
|
+ return list.every((row) =>
|
|
|
|
|
+ WRITE_POWERS.includes(power)
|
|
|
|
|
+ ? checkEnterOk(row) && canEdit(row)
|
|
|
|
|
+ : canViewAll() || canRead(row)
|
|
|
|
|
+ );
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (data.createUserId == userId || userName == 'admin') {
|
|
|
|
|
- //创建人/admin所有权限
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
- if (!power) {
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
- const powerObj = data.userAuthority?.find((item) => item.id == userId);
|
|
|
|
|
- if (powerObj) {
|
|
|
|
|
- return powerObj[power] == '1';
|
|
|
|
|
|
|
+ if (WRITE_POWERS.includes(power)) {
|
|
|
|
|
+ return checkEnterOk(data) && canEdit(data);
|
|
|
}
|
|
}
|
|
|
|
|
+ // 查看 / 浏览 / 下载等读操作:全员可见的文档放行,受限文档按名单
|
|
|
|
|
+ return canViewAll() || canRead(data);
|
|
|
}
|
|
}
|
|
|
export function isCheckOut(data = {}) {
|
|
export function isCheckOut(data = {}) {
|
|
|
//检出判断
|
|
//检出判断
|