feat: 1. 本地化思源黑体的字体包并优先使用。

2. 添加权限映射表和全局查看权限的hook,便于路由控制不同权限按钮显示/隐藏。
3. 删除评查点分组的部分旧api方法。
4. 对接评查点分组接口,文档类型接口, 提示词管理接口, 入口模块管理的接口。
5. 优化角色权限管理的接口,完善不用地区的访问权限认证。
6. 优化主页交叉评查和设置的入口样式和布局。
7. 优化评查点分组,评查规则的功能权限校验。
This commit is contained in:
2025-11-29 10:37:35 +08:00
parent 61facf5d71
commit 30e100ef3e
29 changed files with 2527 additions and 2126 deletions
+61 -18
View File
@@ -1,10 +1,11 @@
import { redirect, type ActionFunctionArgs, type LoaderFunctionArgs, type MetaFunction } from "@remix-run/node";
import { useLoaderData, useActionData, useNavigation, Form, useRouteLoaderData } from "@remix-run/react";
import { useLoaderData, useActionData, useNavigation, Form } from "@remix-run/react";
import { useEffect, useState, useRef } from "react";
import { Button } from "~/components/ui/Button";
import { Card } from "~/components/ui/Card";
import { toastService } from "~/components/ui/Toast";
import { usePermission } from "~/hooks/usePermission";
import ruleGroupsNewStyles from "~/styles/pages/rule-groups_new.css?url";
import {
getEvaluationPointGroups,
@@ -246,16 +247,19 @@ export default function RuleGroupNew() {
const actionData = useActionData<typeof action>();
const navigation = useNavigation();
const isSubmitting = navigation.state === "submitting";
const rootData = useRouteLoaderData("root") as { userRole: string };
const userRole = rootData?.userRole || 'common';
// 判断表单是否为只读模式(只有包含'provin'的用户才有编辑权限)
const hasEditPermission = userRole.toLowerCase().includes('provin');
const isReadOnly = !hasEditPermission;
// ✅ Use permission Hook
const { canCreate, canUpdate } = usePermission();
const canCreateGroup = canCreate('evaluation_group');
const canUpdateGroup = canUpdate('evaluation_group');
// 解构数据
const { group, parentGroups, isEdit, error } = data;
// ✅ 根据当前操作类型判断权限
const hasEditPermission = isEdit ? canUpdateGroup : canCreateGroup;
const isReadOnly = !hasEditPermission;
// 表单状态管理 - 使用受控组件
const [formValues, setFormValues] = useState<{
groupType: "primary" | "secondary";
@@ -299,13 +303,29 @@ export default function RuleGroupNew() {
parentId: false
});
// ✅ 页面加载时检查权限并提示(仅在只读模式下提示)
// useEffect(() => {
// console.log("权限",canCreateGroup,canUpdateGroup)
// if (isReadOnly) {
// if (isEdit) {
// toastService.info('当前为查看模式,您没有编辑权限');
// } else {
// toastService.warning('您没有创建分组的权限');
// }
// }
// }, [isReadOnly, isEdit]);
// 从 actionData 初始化表单错误
useEffect(() => {
if (actionData?.errors) {
setFormErrors(actionData.errors);
// ✅ 如果有通用错误,使用 toast 显示
if (actionData.errors.general) {
toastService.error(actionData.errors.general);
}
}
}, [actionData]);
// 根据加载的组数据初始化表单
useEffect(() => {
if (group) {
@@ -452,31 +472,53 @@ export default function RuleGroupNew() {
// 处理表单提交前验证
const handleBeforeSubmit = (e: React.FormEvent) => {
// ✅ Runtime permission check
if (isEdit && !canUpdateGroup) {
e.preventDefault();
toastService.warning('您没有修改权限,无法保存更改');
return;
}
if (!isEdit && !canCreateGroup) {
e.preventDefault();
toastService.warning('您没有创建权限,无法新增分组');
return;
}
// 如果是只读模式,阻止提交
if (isReadOnly) {
e.preventDefault();
toastService.info('当前为只读模式,无法提交');
return;
}
// 标记所有字段为已触摸
setTouchedFields({
name: true,
code: true,
parentId: true
});
// 验证所有字段
const errors = {
name: validateField('name', formValues.name),
code: validateField('code', formValues.code),
parentId: validateField('parentId', formValues.parentId)
};
setFormErrors(errors);
// 如果有错误,阻止提交
if (errors.name || errors.code || (formValues.groupType === "secondary" && errors.parentId)) {
// 如果有错误,阻止提交并提示
const hasErrors = errors.name || errors.code || (formValues.groupType === "secondary" && errors.parentId);
if (hasErrors) {
e.preventDefault();
// ✅ 收集所有错误信息并提示
const errorMessages = [];
if (errors.name) errorMessages.push(errors.name);
if (errors.code) errorMessages.push(errors.code);
if (errors.parentId) errorMessages.push(errors.parentId);
toastService.error(`表单验证失败:${errorMessages[0]}`);
}
};
@@ -502,16 +544,17 @@ export default function RuleGroupNew() {
<p className="page-subtitle"></p>
</div>
<div className="header-actions">
<Button
type="default"
<Button
type="default"
to="/rule-groups"
className="mr-3"
>
<i className="ri-arrow-left-line"></i>
</Button>
{!isReadOnly && (
<Button
type="primary"
{/* ✅ 仅在有对应权限时显示保存按钮 */}
{hasEditPermission && (
<Button
type="primary"
form="group-form"
disabled={isSubmitting}
>