From 98f178150784e6bc13a04a888041f731c3c83d25 Mon Sep 17 00:00:00 2001 From: lishenfeng Date: Tue, 3 Feb 2026 17:54:52 +0800 Subject: [PATCH] =?UTF-8?q?feat():=20=E5=BC=BA=E5=8C=96=E6=B3=95=E6=B2=BB?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/images/card/resperson.png | Bin 0 -> 20320 bytes src/components/ant_override.less | 7 + src/service/apiurl.js | 10 + src/utils/tools.js | 15 +- .../ModalComponents/VideoList/index.js | 68 ++-- .../ImplementResponsibility/index.js | 212 ++++++++++ .../ImplementResponsibility/index.less | 173 +++++++++ .../components/StrengthenRuleOfLaw/index.js | 362 ++++++++++++++++++ .../components/StrengthenRuleOfLaw/index.less | 148 +++++++ .../Home/components/Business/SiZhi/index.js | 6 +- src/views/Home/components/UI/PdfView/index.js | 2 +- .../Home/components/UI/YearSelect/index.js | 6 +- .../Home/components/UI/YearSelect/index.less | 8 + 13 files changed, 986 insertions(+), 31 deletions(-) create mode 100644 src/assets/images/card/resperson.png create mode 100644 src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.js create mode 100644 src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.less create mode 100644 src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.js create mode 100644 src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.less diff --git a/src/assets/images/card/resperson.png b/src/assets/images/card/resperson.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0060273109a2ba1321c52b468571e63d468a3a GIT binary patch literal 20320 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 DJ72IS literal 0 HcmV?d00001 diff --git a/src/components/ant_override.less b/src/components/ant_override.less index eab0edf..3e43860 100644 --- a/src/components/ant_override.less +++ b/src/components/ant_override.less @@ -337,6 +337,13 @@ input:-webkit-autofill:active { color: #fff; } } + .ant-picker-cell-disabled { + pointer-events: none; + .ant-picker-cell-inner { + color: rgba(255, 255, 255, 0.25) !important; + background-color: rgba(255, 255, 255, 0.1) !important; + } + } // Footer/Ranges .ant-picker-footer { diff --git a/src/service/apiurl.js b/src/service/apiurl.js index c847038..58ec3cd 100644 --- a/src/service/apiurl.js +++ b/src/service/apiurl.js @@ -71,6 +71,16 @@ const apiurl = { manageInfo: service + '/screen/mechanisms/equipment', managePic: service + '/screen/manageHouseImg/get', wzPage:service + '/rescue/goods/page/query' + }, + qhfz: { + lawPage: service + '/SzRuleByLaw/page', + systemPage: service + '/SzRegulatoryFramework/page', + caseSta:service + '/szCase/statistics/1' + }, + zrz: { + respPerson: service + '/screen/responsibility/getPerson', + floodPerson: service + '/screen/responsibility/getFxPerson', + train:service + '/screen/responsibility/getTraining' } } } diff --git a/src/utils/tools.js b/src/utils/tools.js index e17cbf1..55be9a6 100644 --- a/src/utils/tools.js +++ b/src/utils/tools.js @@ -3,7 +3,7 @@ import centerOfMass from '@turf/center-of-mass'; import bbox from '@turf/bbox'; import turfLength from '@turf/length'; import along from '@turf/along'; - +import { config } from '@/config'; const class2type = {}; const { toString } = class2type; 'Boolean Number String Function Array Date RegExp Object Error'.split(' ').forEach((name) => { @@ -596,4 +596,17 @@ export const myFiltrate = (data,params)=>{ return query.substring(iStart); return query.substring(iStart, iEnd); +} + +export const download = (url) => { + let downloadLink = document.createElement("a"); + // downloadLink.href = `${process.env.REACT_APP_API_URL}/gunshiApp/ss/personnelPlan/file/download/${params}`; + downloadLink.href = config.ip +url; + // downloadLink.download = `${params.fileName}`; + downloadLink.style.display = "none"; + // 将链接添加到页面中 + document.body.appendChild(downloadLink); + + // 模拟点击事件,开始下载 + downloadLink.click(); } \ No newline at end of file diff --git a/src/views/Home/components/Business/SiQuan/components/ModalComponents/VideoList/index.js b/src/views/Home/components/Business/SiQuan/components/ModalComponents/VideoList/index.js index 683d2cf..25aa698 100644 --- a/src/views/Home/components/Business/SiQuan/components/ModalComponents/VideoList/index.js +++ b/src/views/Home/components/Business/SiQuan/components/ModalComponents/VideoList/index.js @@ -6,6 +6,7 @@ import { treeList, srcData, videoList, ysyToken } from './http' import VideoControler from "@/components/VideoCom/VideoControler" import { httppost } from "@/utils/request" import apiurl from "@/service/apiurl" +import { Spin } from "antd" const VideoList = () => { @@ -15,6 +16,7 @@ const VideoList = () => { const [size, setSize] = useState(1) const [treeListData, setTreeData] = useState([]) const [selectList, setSelectList] = useState() + const [loading, setLoading] = useState(true) const selectedKeys = async (list, node) => { console.log(node, 'node'); @@ -74,18 +76,24 @@ const VideoList = () => { } const getTreeData = async () => { - const res = await treeList() - const res1 = await videoList() - const arr = res1.data.filter(item => item.menuId).map((item, index) => { - item.parentId = item.menuId - item.id = 999 + index - item.isLeaf = true - // item.icon= - return item - }) - const arr1 = [...arr, ...res.data] - console.log("before", arr1); - setTreeData(buildTree(arr1)) + try { + const res = await treeList() + const res1 = await videoList() + const arr = res1.data.filter(item => item.menuId).map((item, index) => { + item.parentId = item.menuId + item.id = 999 + index + item.isLeaf = true + // item.icon= + return item + }) + const arr1 = [...arr, ...res.data] + console.log("before", arr1); + setTreeData(buildTree(arr1)) + } catch (error) { + console.error(error) + } finally { + setLoading(false) + } } function buildTree(data, parentId = "0") { const tree = []; @@ -137,20 +145,28 @@ const VideoList = () => { }, []) return (
-
- - { - selectList && selectList.type == 1 ? -
- -
- : null - } -
-
+ {loading ? ( +
+ +
+ ) : ( + <> +
+ + { + selectList && selectList.type == 1 ? +
+ +
+ : null + } +
+
+ + )}
) } diff --git a/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.js b/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.js new file mode 100644 index 0000000..9b16992 --- /dev/null +++ b/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.js @@ -0,0 +1,212 @@ +import React, { useState,useEffect } from 'react'; +import { Image } from 'antd'; +import arrowIcon from '@/assets/images/card/arrow.png'; +import selectedBg from '@/assets/images/modal/selected.png'; +import resperson from '@/assets/images/card/resperson.png'; +import smallCard from '@/assets/images/card/smallCard.png'; +import qys from '@/assets/images/business/qys.png'; +import PdfView from '@/views/Home/components/UI/PdfView'; +import apiurl from '@/service/apiurl'; +import { httpget } from '@/utils/request'; +import { download } from '@/utils/tools'; +import './index.less'; + +const ImplementResponsibility = () => { + const types = { + 1:"行政责任人", + 2:"主管部门责任人", + 3:"管理单位责任人", + 4:"巡查责任人", + 5:"技术责任人", + } + const [activeTab, setActiveTab] = useState('dam'); // 'dam' or 'flood' + const [pdfInfo, setPdfInfo] = useState({ visible: false, title: '', fileId: '' }); + const [imagePreview, setImagePreview] = useState({ visible: false, src: '' }); + const [respData, setRespData] = useState([]) + const [floodData, setFloodData] = useState([]) + const [trainData, setTrainData] = useState({}) + const [trainFileData, setTrainFileData] = useState({}) + + // 获取大坝安全责任人 + const getRespData = async () => { + try { + const { code, data } = await httpget(apiurl.sz.zrz.respPerson) + if (code == 200 && data.length > 0) { + const list = data.map(item => ({name:item.name,phone:item.contactInfo,role:types[item.type]})) + setRespData(list) + } + } catch (error) { + console.log(error); + } + } +// 获取防汛安全责任人 + const getFloodData = async () => { + try { + const { code, data } = await httpget(apiurl.sz.zrz.floodPerson) + if (code == 200 && data.length > 0) { + const list = data.map(item => ({name:item.name,phone:item.contactInfo,role:types[item.type]})) + setFloodData(list) + } + } catch (error) { + console.log(error); + } + } + + // 获取岗位培训 + const getTrainData = async () => { + try { + const { code, data } = await httpget(apiurl.sz.zrz.train) + if (code == 200) { + setTrainData(data) + setTrainFileData(data?.latestPersonnelPlan?.files[0]) + } + } catch (error) { + console.log(error); + } + } + const {trainingCount,hasTraining,hasNoTraining,totalTraining,latestPersonnelPlan} = trainData||{} + const trainingStats = [ + { label: '培训计划', value: trainingCount??'-' }, + { label: '已开展', value: hasTraining??'-' }, + { label: '未开展', value: hasNoTraining??'-' }, + { label: '参训总人次', value: totalTraining??'-' } + ]; + + const handleTrainingClick = () => { + if (!trainFileData || !trainFileData.fileName) return; + + const fileName = trainFileData.fileName; + const fileId = trainFileData.fileId; + const extension = fileName.split('.').pop().toLowerCase(); + const downloadUrl = `/gunshiApp/ss/personnelPlan/file/download/${fileId}`; + + if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(extension)) { + setImagePreview({ + visible: true, + src: downloadUrl + }); + } else if (extension === 'pdf') { + setPdfInfo({ + visible: true, + title: fileName, + fileId: fileId + }); + } else { + download(downloadUrl) + // window.location.href = downloadUrl; + } + }; + + const currentPersonList = activeTab === 'dam' ? respData : floodData; + + useEffect(() => { + if (activeTab === 'dam') { + getRespData() + } else { + getFloodData() + } + }, [activeTab]) + + useEffect(() => { + getTrainData() + }, []) + + + return ( +
+ {/* Top Tabs */} +
+
setActiveTab('dam')} + style={activeTab === 'dam' ? { backgroundImage: `url(${selectedBg})` } : {}} + > + 大坝安全责任人 +
+
setActiveTab('flood')} + style={activeTab === 'flood' ? { backgroundImage: `url(${selectedBg})` } : {}} + > + 防汛 “三个责任人” +
+
+ + {/* Person List */} +
+ {currentPersonList.map((person, index) => ( +
+ avatar + {person.name} + {person.phone} +
+ {person.role} +
+
+ ))} +
+ + {/* Job Training Section */} +
+
+ arrow + 岗位培训 +
+
+ + {/* Training Stats */} +
+ {trainingStats.map((stat, index) => ( +
+ {stat.value} + icon + {stat.label} +
+ ))} +
+ + {/* Latest Training Content */} +
+ 最新培训内容: +
+ {trainFileData.fileName?.replace(/\.[^/.]+$/, '')} +
+
+ + {/* PDF Viewer */} + {pdfInfo.visible && ( + setPdfInfo({ ...pdfInfo, visible: false })} + title={pdfInfo.title} + fileId={pdfInfo.fileId} + url="/gunshiApp/ss/personnelPlan/file/download/" + /> + )} + + {/* Image Preview */} +
+ { + setImagePreview({ ...imagePreview, visible: value }); + }, + }} + /> +
+
+ ); +}; + +export default ImplementResponsibility; diff --git a/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.less b/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.less new file mode 100644 index 0000000..2f02202 --- /dev/null +++ b/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.less @@ -0,0 +1,173 @@ +.implement-responsibility { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + box-sizing: border-box; + + .tabs-container { + display: flex; + justify-content: space-around; + margin-bottom: 10px; + + .tab-item { + flex: 1; + text-align: center; + padding: 3px 0; + font-size: 14px; + color: rgba(255, 255, 255, 0.6); + cursor: pointer; + background-size: 100% 100%; + background-repeat: no-repeat; + transition: all 0.3s; + + &.active { + color: #fff; + text-shadow: 0 0 10px #00a0e9; + } + + &:hover { + color: #fff; + } + } + } + + .person-list { + display: flex; + justify-content: space-between; + padding: 0 10px; + margin-bottom: 10px; + + .person-item { + display: flex; + flex-direction: column; + align-items: center; + width: 30%; + + .avatar { + width: 40px; + height: 45px; + margin-bottom: 5px; + } + + .name { + font-size: 14px; + color: #fff; + margin-bottom: 2px; + } + + .phone { + font-size: 14px; + color: #fff; + margin-bottom: 5px; + } + + .role-label { + width: 100%; + height: 24px; + line-height: 24px; + text-align: center; + color: #fff; + font-size: 14px; + background-size: 100% 100%; + background-repeat: no-repeat; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + } + + .section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; + + .title-wrapper { + display: flex; + align-items: center; + + .arrow-icon { + width: 20px; + height: 18px; + margin-right: 8px; + object-fit: contain; + } + + span { + font-size: 14px; + color: #fff; + text-shadow: 0 0 5px rgba(0, 160, 233, 0.5); + } + } + } + + .training-stats { + display: flex; + justify-content: space-between; + padding: 0 10px; + margin-bottom: 15px; + + .stat-item { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + + .stat-value { + font-size: 18px; + color: #00eaff; + font-weight: bold; + margin-bottom: -5px; + z-index: 1; + } + + .stat-icon { + width: 100px; + height: 60px; + margin-bottom: 5px; + } + + .stat-label { + font-size: 14px; + color: rgba(255, 255, 255); + } + } + } + + .latest-training { + display: flex; + align-items: center; + padding: 0 10px; + margin-top: auto; + margin-bottom: 10px; + background-size: 100% 100%; + background-repeat: no-repeat; + .label { + font-size: 14px; + color: #fff; + margin-right: 10px; + white-space: nowrap; + } + + .value-box { + flex: 1; + height: 30px; + line-height: 30px; + padding: 0 10px; + color: #00eaff; + font-size: 14px; + + cursor: pointer; + text-decoration: underline; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + &:hover { + color: #fff; + } + } + } +} diff --git a/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.js b/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.js new file mode 100644 index 0000000..395c1da --- /dev/null +++ b/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.js @@ -0,0 +1,362 @@ +import React, { useState,useEffect } from 'react'; +import ReactEcharts from 'echarts-for-react'; +import arrowIcon from '@/assets/images/card/arrow.png'; +import selectedBg from '@/assets/images/modal/selected.png'; +import YearSelect from '@/views/Home/components/UI/YearSelect'; +import PdfView from '@/views/Home/components/UI/PdfView'; +import { FileTextOutlined } from '@ant-design/icons'; +import apiurl from '@/service/apiurl'; +import { httppost, httpget } from '@/utils/request'; +import { Empty } from 'antd'; +import './index.less'; +import moment from 'moment'; + +const StrengthenRuleOfLaw = () => { + const params = { + pageSo:{ pageSize: 9999, pageNumber: 1 } + } + const [activeTab, setActiveTab] = useState('laws'); + const [lawData, setLawData] = useState([]); + const [systemData, setSystemData] = useState([]); + const [year, setYear] = useState(moment().format('YYYY')); + const [pdfInfo, setPdfInfo] = useState({ visible: false, title: '', fileId: '' }); + + // 获取法律法规文件 + const lawsFiles = async () => { + try { + const { code, data } = await httppost(apiurl.sz.qhfz.lawPage, params) + if (code == 200) { + const list = data?.records.map(item => { + if (item?.files?.length === 0) { + return [] + } + return { name: item?.files[0]?.fileName?.replace(/\.pdf$/i, ''), fileId: item?.files[0]?.fileId } + }).flat() + setLawData(list) + } + } catch (error) { + console.log(error); + } + } + + // 获取系统文件 + const systemFiles = async () => { + try { + const { code, data } = await httppost(apiurl.sz.qhfz.systemPage, params) + if (code == 200) { + const list = data?.records.map(item => { + if (item?.files?.length === 0) { + return [] + } + return { name: item?.files[0]?.fileName?.replace(/\.pdf$/i, ''), fileId: item?.files[0]?.fileId } + }).flat() + + setSystemData(list) + } + } catch (error) { + console.log(error); + } + } + + const [chartData, setChartData] = useState([]); + const [selectedPieItem, setSelectedPieItem] = useState(null); + const [startAngle, setStartAngle] = useState(90); + + const typeMapping = { + 0: { name: '违建', color: '#1890ff' }, + 1: { name: '毁林垦荒', color: '#00eaff' }, + 2: { name: '筑坝拦汊', color: '#3155fb' }, + 3: { name: '填占库容', color: '#bcebf7' }, + 4: { name: '违法取水', color: '#00d085' }, + 5: { name: '其他', color: '#1890ff' }, + }; + + // 获取水政执法数据 0:违建,1:毀林垦荒,2:筑坝拦汊,3:填占库容,4:违法取水,5:其他 + const caseList = async (params) => { + try { + const { code, data } = await httppost(apiurl.sz.qhfz.caseSta, params) + if (code == 200) { + if (!data || data.length === 0) { + setChartData([]); + return; + } + + const newChartData = data.map(item => { + const typeInfo = typeMapping[item.type] || { name: '未知', color: '#ccc' }; + return { + name: typeInfo.name, + value: item.count, + color: typeInfo.color + }; + }); + setChartData(newChartData); + } + } catch (error) { + console.log(error); + } + } + + const total = chartData.reduce((acc, cur) => acc + cur.value, 0); + + const getOption = () => { + let centerName = '案件总数'; + let centerValue = total; + let centerPercent = '100%'; + + if (selectedPieItem) { + centerName = selectedPieItem.name; + centerValue = selectedPieItem.value; + centerPercent = selectedPieItem.percent; + } else if (chartData.length === 1) { + centerName = chartData[0].name; + } + + return { + tooltip: { + trigger: 'item', + formatter: '{b}: {c} ({d}%)' + }, + series: [ + { + name: '水政执法-外圈', + type: 'pie', + radius: ['48%', '82%'], + center: ['34%', '50%'], + startAngle: startAngle, + avoidLabelOverlap: false, + label: { + show: true, + position: 'inside', + formatter: '{b}', + color: '#fff', + fontSize: 10 + }, + itemStyle: { + opacity: 0.4 + }, + data: chartData.map(item => ({ + value: item.value, + name: item.name, + itemStyle: { color: item.color } + })) + }, + { + name: '水政执法-内圈', + type: 'pie', + radius: ['50%', '56%'], + center: ['34%', '50%'], + startAngle: startAngle, + avoidLabelOverlap: false, + label: { + show: true, + position: 'center', + formatter: () => `{name|${centerName}}\n{value|${centerValue}}\n{percent|${centerPercent}}`, + rich: { + name: { + fontSize: 12, + color: 'rgba(255,255,255,0.6)', + lineHeight: 16 + }, + value: { + fontSize: 14, + color: '#fff', + fontWeight: 'bold', + lineHeight: 20 + }, + percent: { + fontSize: 12, + color: '#fff', + lineHeight: 16 + } + } + }, + emphasis: { + label: { + show: true, + fontSize: '14', + fontWeight: 'bold' + } + }, + labelLine: { + show: false + }, + data: chartData.map(item => ({ + value: item.value, + name: item.name, + itemStyle: { color: item.color } + })) + } + ] + }}; + + const onChartClick = (params) => { + if (params.componentType !== 'series') return; + + const { name, value, dataIndex } = params; + + // Toggle selection + if (selectedPieItem && selectedPieItem.name === name) { + setSelectedPieItem(null); + setStartAngle(90); + return; + } + + let sumBefore = 0; + for (let i = 0; i < dataIndex; i++) { + sumBefore += chartData[i].value; + } + + const offset = (sumBefore + value / 2) / total * 360; + const newStartAngle = 90 + offset; + + setStartAngle(newStartAngle); + setSelectedPieItem({ + name, + value, + percent: ((value / total) * 100).toFixed(0) + '%' + }); + }; + + const handleItemClick = (item) => { + setPdfInfo({ + visible: true, + title: item.name, + fileId: item.fileId + }); + }; + + useEffect(() => { + if (chartData && chartData.length > 0) { + const totalVal = chartData.reduce((acc, cur) => acc + cur.value, 0); + const firstItem = chartData[0]; + const value = firstItem.value; + + const offset = (value / 2) / totalVal * 360; + const newStartAngle = 90 + offset; + + setStartAngle(newStartAngle); + setSelectedPieItem({ + name: firstItem.name, + value: value, + percent: ((value / totalVal) * 100).toFixed(0) + '%' + }); + } else { + setSelectedPieItem(null); + setStartAngle(90); + } + }, [chartData]); + + useEffect(() => { + if (activeTab == 'laws') { + lawsFiles() + } else { + systemFiles() + } + }, [activeTab]) + useEffect(() => { + if (year) { + const params = { + stm: moment(year).format('YYYY-01-01 00:00:00'), + etm: moment(year).format('YYYY-12-31 23:59:59'), + } + caseList(params) + } + }, [year]) + return ( +
+ {/* Top Tabs */} +
+
setActiveTab('laws')} + style={activeTab === 'laws' ? { backgroundImage: `url(${selectedBg})` } : {}} + > + 法律法规 +
+
setActiveTab('system')} + style={activeTab === 'system' ? { backgroundImage: `url(${selectedBg})` } : {}} + > + 制度管理 +
+
+ + {/* List Content */} +
+ {(activeTab === 'laws' ? lawData : systemData).length > 0 ? ( + (activeTab === 'laws' ? lawData : systemData).map((item, index) => ( +
handleItemClick(item)}> +
+ +
+ {item.name} +
+ )) + ) : ( +
+ 暂无数据} /> +
+ )} +
+ + {/* Water Administration Law Enforcement */} +
+
+
+ arrow + 水政执法 +
+ +
+ +
+ {chartData.length > 0 ? ( + <> +
+ +
+
+ {chartData.map((item, index) => ( +
+ + {item.name} + {item.value} +
+ ))} +
+ + ) : ( +
+ 暂无数据} /> +
+ )} +
+
+ + {/* PDF Viewer */} + {pdfInfo.visible && ( + setPdfInfo({ ...pdfInfo, visible: false })} + title={pdfInfo.title} + fileId={pdfInfo.fileId} + url="/gunshiApp/ss/projectEvents/file/download/" + /> + )} +
+ ); +}; + +export default StrengthenRuleOfLaw; diff --git a/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.less b/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.less new file mode 100644 index 0000000..17e01c9 --- /dev/null +++ b/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.less @@ -0,0 +1,148 @@ +.strengthen-rule-of-law { + width: 100%; + height: 100%; + color: #fff; + display: flex; + flex-direction: column; + + .tabs-container { + display: flex; + justify-content: space-between; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + + .tab-item { + flex: 1; + text-align: center; + padding: 3px 0; + font-size: 14px; + color: rgba(255, 255, 255, 0.6); + cursor: pointer; + background-size: 100% 100%; + background-repeat: no-repeat; + transition: all 0.3s; + + &.active { + color: #fff; + text-shadow: 0 0 10px #00a0e9; + } + + &:hover { + color: #fff; + } + } + } + + .list-content { + flex: 1; + overflow-y: auto; + margin-bottom: 15px; + max-height: 120px; /* Limit height to show scroll if needed, though items are few */ + + .list-item { + display: flex; + align-items: center; + padding: 8px 0; + cursor: pointer; + transition: background-color 0.3s; + + &:hover { + background-color: rgba(255, 255, 255, 0.05); + .text { + color: #00a0e9; + text-decoration: underline; + } + } + + .icon-wrapper { + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + margin-right: 10px; + background: rgba(24, 144, 255, 0.1); + border-radius: 4px; + } + + .text { + font-size: 14px; + color: rgba(255, 255, 255, 0.9); + } + } + } + + .enforcement-section { + flex: 1; + display: flex; + flex-direction: column; + + .section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; + + .title-wrapper { + display: flex; + align-items: center; + + .arrow-icon { + width: 20px; + height: 18px; + margin-right: 8px; + object-fit: contain; + } + + span { + font-size: 14px; + color: #fff; + text-shadow: 0 0 5px rgba(0, 160, 233, 0.5); + } + } + } + + .chart-legend-container { + flex: 1; + display: flex; + align-items: center; + + .chart-wrapper { + flex: 1; + height: 100%; + min-height: 140px; + } + + .legend-wrapper { + width: 140px; + display: flex; + flex-direction: column; + justify-content: center; + padding-left: 10px; + + .legend-item { + display: flex; + align-items: center; + margin-bottom: 6px; + font-size: 12px; + + .color-dot { + width: 8px; + height: 8px; + margin-right: 8px; + border-radius: 2px; + } + + .name { + flex: 1; + color: rgba(255, 255, 255, 0.8); + } + + .value { + color: #fff; + font-weight: bold; + } + } + } + } + } +} diff --git a/src/views/Home/components/Business/SiZhi/index.js b/src/views/Home/components/Business/SiZhi/index.js index 2a391ce..5802b82 100644 --- a/src/views/Home/components/Business/SiZhi/index.js +++ b/src/views/Home/components/Business/SiZhi/index.js @@ -2,6 +2,8 @@ import React, { useState, useEffect } from 'react'; import CommonCard from '../../UI/CommonCard'; import PerfectSystem from './components/PerfectSystem'; import SoundMechanism from './components/SoundMechanism'; +import StrengthenRuleOfLaw from './components/StrengthenRuleOfLaw'; +import ImplementResponsibility from './components/ImplementResponsibility'; import { httppost } from '@/utils/request'; import apiurl from '@/service/apiurl'; import './index.less'; @@ -36,10 +38,10 @@ const SiZhi = () => {
-
内容填充区域
+
-
内容填充区域
+
diff --git a/src/views/Home/components/UI/PdfView/index.js b/src/views/Home/components/UI/PdfView/index.js index d17ba7d..4c98805 100644 --- a/src/views/Home/components/UI/PdfView/index.js +++ b/src/views/Home/components/UI/PdfView/index.js @@ -7,7 +7,7 @@ const PdfView = ({ visible, title, onClose, url, fileId }) => { return ( { onChange(dateString); } }; + const disabledDate = (current) => { + return current && current > moment().endOf('day'); +}; return (