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
+51 -11
View File
@@ -5,6 +5,7 @@ import { Card } from "~/components/ui/Card";
import { Button } from "~/components/ui/Button";
import { toastService } from "~/components/ui/Toast";
import { Modal } from "~/components/ui/Modal";
import { usePermission } from "~/hooks/usePermission";
import {
getEntryModuleById,
createEntryModule,
@@ -88,6 +89,15 @@ export default function EntryModuleNew() {
const id = searchParams.get('id');
const isEditMode = !!id;
// ✅ 使用权限 Hook
const { canCreate, canUpdate } = usePermission();
const canCreateModule = canCreate('entry_module');
const canUpdateModule = canUpdate('entry_module');
// ✅ 根据当前操作类型判断权限
const hasEditPermission = isEditMode ? canUpdateModule : canCreateModule;
const isReadOnly = !hasEditPermission;
// 表单状态
const [name, setName] = useState(module?.name || '');
const [description, setDescription] = useState(module?.description || '');
@@ -104,6 +114,17 @@ export default function EntryModuleNew() {
const fileInputRef = useRef<HTMLInputElement>(null);
// ✅ 页面加载时检查权限并提示(仅在只读模式下提示)
useEffect(() => {
if (isReadOnly) {
if (isEditMode) {
toastService.info('当前为查看模式,您没有编辑权限');
} else {
toastService.warning('您没有创建入口模块的权限');
}
}
}, [isReadOnly, isEditMode]);
// 处理loader加载数据的时候的错误
useEffect(() => {
if (error) {
@@ -208,6 +229,17 @@ export default function EntryModuleNew() {
// 处理表单提交
const handleSubmit = async () => {
// ✅ Runtime permission check
if (isEditMode && !canUpdateModule) {
toastService.warning('您没有修改权限,无法保存更改');
return;
}
if (!isEditMode && !canCreateModule) {
toastService.warning('您没有创建权限,无法新增入口模块');
return;
}
if (!validateForm()) return;
setIsSubmitting(true);
@@ -270,10 +302,10 @@ export default function EntryModuleNew() {
<div className="page-header">
<div>
<h1 className="text-2xl font-bold text-gray-900">
{isEditMode ? '编辑入口模块' : '新建入口模块'}
{isEditMode ? (isReadOnly ? '查看入口模块' : '编辑入口模块') : '新建入口模块'}
</h1>
<p className="text-sm text-gray-600 mt-1">
{isEditMode ? '修改入口模块信息' : '创建新的入口模块'}
{isEditMode ? (isReadOnly ? '查看入口模块信息' : '修改入口模块信息') : '创建新的入口模块'}
</p>
</div>
</div>
@@ -293,6 +325,7 @@ export default function EntryModuleNew() {
placeholder="请输入模块名称,如:合同管理"
maxLength={255}
className="w-full px-3 py-2 border border-gray-300 rounded-md"
disabled={isReadOnly}
/>
</div>
@@ -305,6 +338,7 @@ export default function EntryModuleNew() {
placeholder="请输入模块描述"
className="w-full px-3 py-2 border border-gray-300 rounded-md"
rows={4}
disabled={isReadOnly}
/>
</div>
@@ -317,6 +351,7 @@ export default function EntryModuleNew() {
type="default"
icon="ri-upload-line"
onClick={() => fileInputRef.current?.click()}
disabled={isReadOnly}
>
{logoPreview ? '更换图片' : '上传图片'}
</Button>
@@ -330,6 +365,7 @@ export default function EntryModuleNew() {
accept="image/*"
onChange={handleLogoChange}
className="hidden"
disabled={isReadOnly}
/>
{logoPreview && (
<div className="mt-3">
@@ -355,13 +391,14 @@ export default function EntryModuleNew() {
{AREA_OPTIONS.map(option => (
<label
key={option.value}
className="flex items-center space-x-2 cursor-pointer"
className={`flex items-center space-x-2 ${isReadOnly ? 'cursor-not-allowed' : 'cursor-pointer'}`}
>
<input
type="checkbox"
checked={selectedAreas.includes(option.value)}
onChange={() => handleAreaToggle(option.value)}
className="w-4 h-4 border-gray-300 rounded cursor-pointer"
disabled={isReadOnly}
/>
<span className="text-sm text-gray-700">{option.label}</span>
</label>
@@ -379,14 +416,17 @@ export default function EntryModuleNew() {
>
</Button>
<Button
type="primary"
onClick={handleSubmit}
loading={isSubmitting}
disabled={isSubmitting}
>
{isSubmitting ? '提交中...' : (isEditMode ? '保存' : '创建')}
</Button>
{/* ✅ 仅在有对应权限时显示保存/创建按钮 */}
{hasEditPermission && (
<Button
type="primary"
onClick={handleSubmit}
loading={isSubmitting}
disabled={isSubmitting}
>
{isSubmitting ? '提交中...' : (isEditMode ? '保存' : '创建')}
</Button>
)}
</div>
</Card>