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
+26 -21
View File
@@ -1,5 +1,5 @@
import { useState, useEffect } from "react";
import { useSearchParams, useNavigate, useLoaderData, useRouteLoaderData, useRevalidator } from "@remix-run/react";
import { useSearchParams, useNavigate, useLoaderData, useRevalidator } from "@remix-run/react";
import { ClientLoaderFunctionArgs, MetaFunction } from "@remix-run/react";
import { Table } from "~/components/ui/Table";
import { Card } from "~/components/ui/Card";
@@ -8,6 +8,7 @@ import { Pagination } from "~/components/ui/Pagination";
import { FilterPanel, FilterSelect, SearchFilter } from "~/components/ui/FilterPanel";
import { toastService } from "~/components/ui/Toast";
import { messageService } from "~/components/ui/MessageModal";
import { usePermission } from "~/hooks/usePermission";
import {
getEntryModules,
deleteEntryModule,
@@ -113,16 +114,12 @@ export default function EntryModulesList() {
const loaderData = useLoaderData<LoaderData>();
const { modules, total, error } = loaderData;
// 获取用户角色并判断权限
const rootData = useRouteLoaderData("root") as { userRole: string };
const userRole = rootData?.userRole || 'common';
const hasEditPermission = userRole.toLowerCase().includes('admin') || userRole.toLowerCase().includes('developer');
// 调试信息
useEffect(() => {
console.log('📋 [EntryModules] 用户角色:', userRole);
console.log('📋 [EntryModules] 是否有编辑权限:', hasEditPermission);
}, [userRole, hasEditPermission]);
// ✅ 使用权限 Hook
const { canCreate, canUpdate, canDelete, canView } = usePermission();
const canCreateModule = canCreate('entry_module');
const canUpdateModule = canUpdate('entry_module');
const canDeleteModule = canDelete('entry_module');
const canViewModule = canView('entry_module');
// 获取搜索参数
const name = searchParams.get('name') || '';
@@ -179,6 +176,12 @@ export default function EntryModulesList() {
// 处理删除入口模块
const handleDelete = async (id: number) => {
// ✅ 检查删除权限
if (!canDeleteModule) {
toastService.warning('您没有删除权限');
return;
}
messageService.show({
title: "确认删除",
message: "确定要删除该入口模块吗?此操作不可撤销。",
@@ -317,15 +320,16 @@ export default function EntryModulesList() {
width: '180px',
render: (_: any, record: EntryModule) => (
<div className="operations-cell">
<button
onClick={() => handleEdit(record.id!)}
className="operation-btn"
disabled={!hasEditPermission}
title={hasEditPermission ? "编辑入口模块" : "无权限"}
>
<i className="ri-edit-line"></i> {hasEditPermission ? '编辑' : '查看'}
</button>
{hasEditPermission && (
{ canViewModule &&
<button
onClick={() => handleEdit(record.id!)}
className="operation-btn"
title="查看/编辑入口模块"
>
<i className="ri-edit-line"></i> {canUpdateModule ? '编辑' : '查看'}
</button>
}
{canDeleteModule && (
<button
type="button"
className="operation-btn !text-[--color-error]"
@@ -350,7 +354,8 @@ export default function EntryModulesList() {
<h1 className="text-2xl font-bold text-gray-900"></h1>
<p className="text-sm text-gray-600 mt-1">Logo图片和适用地区设置</p>
</div>
{hasEditPermission && (
{/* ✅ 仅在有创建权限时显示新建按钮 */}
{canCreateModule && (
<Button
type="primary"
icon="ri-add-line"