广州市综治平台前端
xusd
2025-06-07 ee685c9f350ec9241107d4e8a05799768a0bce9a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import React, { useEffect, useState } from 'react';
import NewPage from '@/components/NewPage';
import { Divider, Button, Spin } from '@arco-design/web-react';
import { useParams } from 'react-router-dom';
import * as $$ from '@/utils/utility';
import { useNavigate } from 'react-router-dom';
import '../index.less';
 
//获取详细数据
function getDetailData(data) {
  return $$.ax.request({ url: 'lawOriginalInfo/getById', type: 'get', data, service: 'know' });
}
 
export default function KnowDetail() {
  const { id, keyword } = useParams(); // 获取URL中的id参数
  const navigate = useNavigate();
  const [data, setData] = useState({});
  const [loading, setLoading] = useState(false);//数据请求
 
  useEffect(() => {
    getData(id)
  }, []);
 
  //获取数据
  const getData = async (id) => {
    setLoading(true)
    const res = await getDetailData({ id });
    if (res.type) {
      setData(res.data)
      setLoading(false)
    }
  }
 
  //命中词条高亮
  const handleText = (text) => {
    // 如果没有关键字,则直接渲染文本
    if (!keyword || !text) {
      return <span>{text}</span>;
    }
 
    // 使用正则表达式查找所有匹配的关键字(不区分大小写)
    const regex = new RegExp(`(${keyword})`, 'gi');
 
    // 使用一个数组来存储片段
    const parts = [];
    let lastIndex = 0;
    let match;
 
    // 遍历所有匹配项,并将文本拆分为片段
    while ((match = regex.exec(text)) !== null) {
      // 添加非匹配文本到片段数组
      if (match.index > lastIndex) {
        parts.push(text.slice(lastIndex, match.index));
      }
      // 添加匹配文本(带有高亮样式)到片段数组
      parts.push(
        <span style={{ color: '#1A6FB8', fontWeight: '600' }}>
          {match[0]}
        </span>
      );
      lastIndex = regex.lastIndex;
    }
 
    // 添加剩余的文本(如果有)
    if (lastIndex < text.length) {
      parts.push(text.slice(lastIndex));
    }
 
    // 返回包含所有片段的 JSX 元素
    return parts;
  }
 
  return (
    <NewPage pageHead={{ breadcrumbData: [{ title: '工作台' }, { title: '知识库' }], title: '知识库' }}>
      <div className='knowPage'>
        <Spin loading={loading} style={{ width: '100%', height: '100%' }}>
          <div className='detailTitle'>{data.title}</div>
          <Divider />
          <div className='detailContent'>
            <div className='detailItem1'><div>时效性:</div><span>{data.validityName || '-'}</span></div>
            <div className='detailItem'><div>公布日期:</div><span>{$$.dateFormat(data.publishTime)}</span></div>
            <div className='detailItem'><div>制定机关:</div><span>{data.authorityName || '-'}</span></div>
            <div className='detailItem1'><div>法律效力位阶:</div><span>{data.lawNatureName || '-'}</span></div>
            <div className='detailItem'><div>实施日期:</div><span>{$$.dateFormat(data.implementationTime)}</span></div>
          </div>
          <pre>
            {handleText(data.provisionText)}
          </pre>
          <div style={{ height: '60px' }}></div>
        </Spin>
      </div>
      <div className='dataSync-excel'>
        <Button type='secondary' onClick={() => navigate(-1)}>返回上级页面</Button>
      </div>
    </NewPage>
  )
}