From 4eb71775167ae903aea17bb410c6201e872daf66 Mon Sep 17 00:00:00 2001
From: tony.cheng <chengmingwei_1984122@126.com>
Date: Thu, 05 Feb 2026 16:35:50 +0800
Subject: [PATCH] feat: 优化类案推荐功能 - 相似度分级、分页加载、详情字段扩展及法条显示优化
---
web-app/src/components/tools/LawSearchContent.jsx | 56 +++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 45 insertions(+), 11 deletions(-)
diff --git a/web-app/src/components/tools/LawSearchContent.jsx b/web-app/src/components/tools/LawSearchContent.jsx
index 24c9420..e69c760 100644
--- a/web-app/src/components/tools/LawSearchContent.jsx
+++ b/web-app/src/components/tools/LawSearchContent.jsx
@@ -1,6 +1,7 @@
import React, { useState } from 'react';
-import { Input, DatePicker, Button, Pagination, Spin } from 'antd';
+import { Input, DatePicker, Button, Pagination, Spin, Modal } from 'antd';
import { SearchOutlined, RedoOutlined } from '@ant-design/icons';
+import LawDetailContent from './LawDetailContent';
import './LawSearchContent.css';
// Mock数据 - 按原型格式
@@ -100,6 +101,8 @@
const [activeId, setActiveId] = useState('law-001');
const [filters, setFilters] = useState(filterConfig);
const [currentPage, setCurrentPage] = useState(1);
+ const [detailVisible, setDetailVisible] = useState(false);
+ const [selectedLawId, setSelectedLawId] = useState(null);
const pageSize = 10;
const total = 256;
@@ -117,7 +120,7 @@
};
const toggleFilter = (category, index) => {
- setFilters(prev => {
+ setFilters((prev) => {
const newFilters = { ...prev };
newFilters[category] = [...prev[category]];
newFilters[category][index] = {
@@ -126,6 +129,16 @@
};
return newFilters;
});
+ };
+
+ const handleLawItemClick = (lawId) => {
+ if (activeId === lawId) {
+ // 如果已经是激活状态,再次点击弹出详情
+ setSelectedLawId(lawId);
+ setDetailVisible(true);
+ } else {
+ setActiveId(lawId);
+ }
};
return (
@@ -182,7 +195,9 @@
<div className={`law-search-filter-checkbox ${item.checked ? 'checked' : ''}`}>
{item.checked && <i className="fas fa-check"></i>}
</div>
- <span>{item.label} ({item.count})</span>
+ <span>
+ {item.label} ({item.count})
+ </span>
</div>
))}
</div>
@@ -193,15 +208,13 @@
<h3 className="law-search-filter-title">制定机关</h3>
<div className="law-search-filter-list">
{filters.org.map((item, index) => (
- <div
- key={index}
- className="law-search-filter-item"
- onClick={() => toggleFilter('org', index)}
- >
+ <div key={index} className="law-search-filter-item" onClick={() => toggleFilter('org', index)}>
<div className={`law-search-filter-checkbox ${item.checked ? 'checked' : ''}`}>
{item.checked && <i className="fas fa-check"></i>}
</div>
- <span>{item.label} ({item.count})</span>
+ <span>
+ {item.label} ({item.count})
+ </span>
</div>
))}
</div>
@@ -220,7 +233,9 @@
<div className={`law-search-filter-checkbox ${item.checked ? 'checked' : ''}`}>
{item.checked && <i className="fas fa-check"></i>}
</div>
- <span>{item.label} ({item.count})</span>
+ <span>
+ {item.label} ({item.count})
+ </span>
</div>
))}
</div>
@@ -241,7 +256,7 @@
<div
key={law.id}
className={`law-search-law-item ${activeId === law.id ? 'active' : ''}`}
- onClick={() => setActiveId(law.id)}
+ onClick={() => handleLawItemClick(law.id)}
>
<h3 className="law-search-law-title">{law.lawName}</h3>
<div className="law-search-law-meta">
@@ -295,6 +310,25 @@
/>
</div>
</div>
+
+ {/* 详情弹窗 */}
+ <Modal
+ title={
+ <div style={{ fontSize: '1.2rem', fontWeight: 600 }}>
+ <i className="fas fa-book" style={{ marginRight: 10, color: '#1a6fb8' }}></i>
+ 法律条文详情
+ </div>
+ }
+ visible={detailVisible}
+ onCancel={() => setDetailVisible(false)}
+ footer={null}
+ width={1000}
+ bodyStyle={{ padding: 0, height: '80vh', overflow: 'hidden' }}
+ centered
+ destroyOnClose
+ >
+ <LawDetailContent lawId={selectedLawId} />
+ </Modal>
</div>
);
};
--
Gitblit v1.8.0