|
|
|
@ -1,8 +1,8 @@ |
|
|
|
<template> |
|
|
|
<div class="law-query-page"> |
|
|
|
<!-- 顶部导航栏 --> |
|
|
|
<van-nav-bar title="法律查询" left-text="关闭" left-arrow @click-left="onClickLeft"> |
|
|
|
</van-nav-bar> |
|
|
|
<!-- <van-nav-bar title="法律查询" left-arrow @click-left="onClickLeft"> |
|
|
|
</van-nav-bar> --> |
|
|
|
|
|
|
|
<!-- 内容区域 --> |
|
|
|
<div class="content-area"> |
|
|
|
@ -11,63 +11,46 @@ |
|
|
|
<van-search |
|
|
|
v-model="searchKeyword" |
|
|
|
placeholder="请输入关键词搜索" |
|
|
|
show-action |
|
|
|
shape="round" |
|
|
|
@search="onSearch" |
|
|
|
> |
|
|
|
<template #action> |
|
|
|
<van-button size="small" type="primary" @click="onSearch">搜索</van-button> |
|
|
|
</template> |
|
|
|
</van-search> |
|
|
|
/> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 法律分类 --> |
|
|
|
<div class="category-section"> |
|
|
|
<div class="section-title">法律分类</div> |
|
|
|
<div class="category-grid"> |
|
|
|
<div |
|
|
|
class="category-item" |
|
|
|
v-for="(item, index) in categoryList" |
|
|
|
:key="index" |
|
|
|
@click="onCategoryClick(item)" |
|
|
|
<!-- 法律法规列表 --> |
|
|
|
<van-pull-refresh v-model="refreshing" @refresh="onRefresh"> |
|
|
|
<van-list |
|
|
|
v-model:loading="loading" |
|
|
|
:finished="finished" |
|
|
|
finished-text="没有更多了" |
|
|
|
@load="onLoad" |
|
|
|
:offset="50" |
|
|
|
> |
|
|
|
<div class="category-icon" :class="item.iconBg"> |
|
|
|
<img :src="item.icon" alt="" /> |
|
|
|
</div> |
|
|
|
<div class="category-name">{{ item.name }}</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 常用法律 --> |
|
|
|
<div class="law-section"> |
|
|
|
<div class="section-title">常用法律</div> |
|
|
|
<van-cell-group> |
|
|
|
<van-cell |
|
|
|
v-for="(law, index) in lawList" |
|
|
|
:key="index" |
|
|
|
:title="law.title" |
|
|
|
:label="law.desc" |
|
|
|
is-link |
|
|
|
@click="onLawClick(law)" |
|
|
|
/> |
|
|
|
</van-cell-group> |
|
|
|
</div> |
|
|
|
<van-empty v-if="finished && lawList.length === 0" description="暂无数据" /> |
|
|
|
|
|
|
|
<!-- 法律知识问答 --> |
|
|
|
<div class="qa-section"> |
|
|
|
<div class="section-title">法律知识问答</div> |
|
|
|
<div class="qa-list"> |
|
|
|
<div |
|
|
|
class="qa-item" |
|
|
|
v-for="(qa, index) in qaList" |
|
|
|
class="law-item" |
|
|
|
v-for="(item, index) in lawList" |
|
|
|
:key="index" |
|
|
|
@click="onQaClick(qa)" |
|
|
|
@click="onLawClick(item)" |
|
|
|
> |
|
|
|
<div class="qa-question">{{ qa.question }}</div> |
|
|
|
<div class="qa-answer">{{ qa.answer }}</div> |
|
|
|
<!-- 标题行 --> |
|
|
|
<div class="item-title-row"> |
|
|
|
<div class="item-title">{{ item.title }}</div> |
|
|
|
<span |
|
|
|
class="status-tag" |
|
|
|
:class="item.status === '有效' ? 'status--active' : 'status--pending'" |
|
|
|
>{{ item.status }}</span> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 元信息行 --> |
|
|
|
<div class="item-meta"> |
|
|
|
<span class="meta-text">公布日期: {{ item.publishDate }}</span> |
|
|
|
<span class="meta-text">施行日期: {{ item.implementDate }}</span> |
|
|
|
<span class="meta-text">{{ item.department }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</van-list> |
|
|
|
</van-pull-refresh> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 底部导航栏 --> |
|
|
|
@ -87,70 +70,82 @@ const router = useRouter(); |
|
|
|
// 搜索关键词 |
|
|
|
const searchKeyword = ref(''); |
|
|
|
|
|
|
|
// 法律分类列表 |
|
|
|
const categoryList = ref([ |
|
|
|
{ name: '宪法', icon: '', iconBg: 'icon-red' }, |
|
|
|
{ name: '民法', icon: '', iconBg: 'icon-blue' }, |
|
|
|
{ name: '刑法', icon: '', iconBg: 'icon-green' }, |
|
|
|
{ name: '行政法', icon: '', iconBg: 'icon-orange' }, |
|
|
|
{ name: '经济法', icon: '', iconBg: 'icon-purple' }, |
|
|
|
{ name: '劳动法', icon: '', iconBg: 'icon-yellow' }, |
|
|
|
{ name: '商法', icon: '', iconBg: 'icon-pink' }, |
|
|
|
{ name: '诉讼法', icon: '', iconBg: 'icon-cyan' }, |
|
|
|
]); |
|
|
|
|
|
|
|
// 常用法律列表 |
|
|
|
const lawList = ref([ |
|
|
|
{ title: '中华人民共和国宪法', desc: '国家根本大法' }, |
|
|
|
{ title: '中华人民共和国民法典', desc: '社会生活的百科全书' }, |
|
|
|
{ title: '中华人民共和国刑法', desc: '规定犯罪与刑罚' }, |
|
|
|
{ title: '中华人民共和国行政法', desc: '规范行政行为' }, |
|
|
|
{ title: '中华人民共和国劳动法', desc: '保护劳动者权益' }, |
|
|
|
]); |
|
|
|
|
|
|
|
// 法律知识问答列表 |
|
|
|
const qaList = ref([ |
|
|
|
{ |
|
|
|
question: '什么是行政处罚?', |
|
|
|
answer: '行政处罚是指行政机关依法对违反行政管理秩序的公民、法人或者其他组织,以减损权益或者增加义务的方式予以惩戒的行为。' |
|
|
|
}, |
|
|
|
{ |
|
|
|
question: '企业需要遵守哪些法律法规?', |
|
|
|
answer: '企业需要遵守公司法、劳动法、税法、环境保护法、安全生产法等相关法律法规。' |
|
|
|
}, |
|
|
|
{ |
|
|
|
question: '什么是行政复议?', |
|
|
|
answer: '行政复议是指公民、法人或者其他组织认为具体行政行为侵犯其合法权益,向行政机关提出行政复议申请,行政机关受理并作出决定的活动。' |
|
|
|
}, |
|
|
|
]); |
|
|
|
// 列表状态 |
|
|
|
const lawList = ref([]); |
|
|
|
const loading = ref(false); |
|
|
|
const finished = ref(false); |
|
|
|
const refreshing = ref(false); |
|
|
|
const pageNum = ref(1); |
|
|
|
const pageSize = ref(10); |
|
|
|
|
|
|
|
// 模拟数据(与截图一致) |
|
|
|
const mockData = [ |
|
|
|
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' }, |
|
|
|
{ title: '渔业行政处罚规定', status: '尚未生效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' }, |
|
|
|
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' }, |
|
|
|
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' }, |
|
|
|
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' }, |
|
|
|
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' }, |
|
|
|
]; |
|
|
|
|
|
|
|
// 加载数据 |
|
|
|
const fetchList = () => { |
|
|
|
// TODO: 替换为真实接口调用 |
|
|
|
// const params = { pageNum: pageNum.value, pageSize: pageSize.value, searchValue: searchKeyword.value }; |
|
|
|
|
|
|
|
// 模拟异步请求 |
|
|
|
setTimeout(() => { |
|
|
|
if (refreshing.value) { |
|
|
|
lawList.value = []; |
|
|
|
refreshing.value = false; |
|
|
|
} |
|
|
|
lawList.value = [...lawList.value, ...mockData]; |
|
|
|
// 模拟只有一页数据 |
|
|
|
finished.value = true; |
|
|
|
loading.value = false; |
|
|
|
}, 300); |
|
|
|
}; |
|
|
|
|
|
|
|
// 返回上一页 |
|
|
|
const onClickLeft = () => { |
|
|
|
router.back(); |
|
|
|
// 触底加载 |
|
|
|
const onLoad = () => { |
|
|
|
if (refreshing.value) return; |
|
|
|
fetchList(); |
|
|
|
}; |
|
|
|
|
|
|
|
// 搜索 |
|
|
|
const onSearch = () => { |
|
|
|
if (!searchKeyword.value.trim()) { |
|
|
|
showToast('请输入搜索关键词'); |
|
|
|
return; |
|
|
|
} |
|
|
|
showToast(`搜索:${searchKeyword.value}`); |
|
|
|
// 下拉刷新 |
|
|
|
const onRefresh = () => { |
|
|
|
pageNum.value = 1; |
|
|
|
lawList.value = []; |
|
|
|
finished.value = false; |
|
|
|
loading.value = true; |
|
|
|
fetchList(); |
|
|
|
}; |
|
|
|
|
|
|
|
// 点击分类 |
|
|
|
const onCategoryClick = (item) => { |
|
|
|
showToast(`选择分类:${item.name}`); |
|
|
|
// 搜索 |
|
|
|
const onSearch = () => { |
|
|
|
pageNum.value = 1; |
|
|
|
lawList.value = []; |
|
|
|
finished.value = false; |
|
|
|
loading.value = true; |
|
|
|
fetchList(); |
|
|
|
}; |
|
|
|
|
|
|
|
// 点击法律 |
|
|
|
const onLawClick = (law) => { |
|
|
|
showToast(`查看:${law.title}`); |
|
|
|
// 返回上一页 |
|
|
|
const onClickLeft = () => { |
|
|
|
router.back(); |
|
|
|
}; |
|
|
|
|
|
|
|
// 点击问答 |
|
|
|
const onQaClick = (qa) => { |
|
|
|
showToast('查看详情'); |
|
|
|
// 点击法律 — 跳转详情页 |
|
|
|
const onLawClick = (item) => { |
|
|
|
router.push({ |
|
|
|
path: '/enterprise/lawDetail', |
|
|
|
query: { |
|
|
|
title: item.title, |
|
|
|
publishDate: item.publishDate, |
|
|
|
implementDate: item.implementDate, |
|
|
|
department: item.department, |
|
|
|
}, |
|
|
|
}); |
|
|
|
}; |
|
|
|
</script> |
|
|
|
|
|
|
|
@ -165,8 +160,8 @@ const onQaClick = (qa) => { |
|
|
|
.content-area { |
|
|
|
flex: 1; |
|
|
|
overflow-y: auto; |
|
|
|
padding: 0.27rem; |
|
|
|
padding-bottom: 1.5rem; |
|
|
|
-webkit-overflow-scrolling: touch; |
|
|
|
padding: 0 0.27rem; |
|
|
|
} |
|
|
|
|
|
|
|
/* ===== 搜索区域 ===== */ |
|
|
|
@ -176,137 +171,88 @@ const onQaClick = (qa) => { |
|
|
|
padding: 0.2rem; |
|
|
|
margin-bottom: 0.27rem; |
|
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); |
|
|
|
} |
|
|
|
|
|
|
|
/* ===== 分类区域 ===== */ |
|
|
|
.category-section { |
|
|
|
background: #fff; |
|
|
|
border-radius: 0.2rem; |
|
|
|
padding: 0.3rem; |
|
|
|
margin-bottom: 0.27rem; |
|
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); |
|
|
|
} |
|
|
|
|
|
|
|
.section-title { |
|
|
|
font-size: 0.37rem; |
|
|
|
font-weight: 600; |
|
|
|
color: #333; |
|
|
|
margin-bottom: 0.25rem; |
|
|
|
padding-left: 0.1rem; |
|
|
|
} |
|
|
|
|
|
|
|
.category-grid { |
|
|
|
display: grid; |
|
|
|
grid-template-columns: repeat(4, 1fr); |
|
|
|
gap: 0.2rem; |
|
|
|
} |
|
|
|
|
|
|
|
.category-item { |
|
|
|
display: flex; |
|
|
|
flex-direction: column; |
|
|
|
align-items: center; |
|
|
|
padding: 0.25rem 0; |
|
|
|
} |
|
|
|
|
|
|
|
.category-icon { |
|
|
|
width: 1.2rem; |
|
|
|
height: 1.2rem; |
|
|
|
border-radius: 50%; |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
justify-content: center; |
|
|
|
margin-bottom: 0.15rem; |
|
|
|
background: #f0f0f0; |
|
|
|
:deep(.van-search) { |
|
|
|
padding: 0; |
|
|
|
} |
|
|
|
|
|
|
|
.category-icon img { |
|
|
|
width: 0.6rem; |
|
|
|
height: 0.6rem; |
|
|
|
:deep(.van-search__content) { |
|
|
|
background: #f2f3f5; |
|
|
|
border-radius: 0.5rem; |
|
|
|
} |
|
|
|
|
|
|
|
.icon-red { background: #ffebee; } |
|
|
|
.icon-blue { background: #e3f2fd; } |
|
|
|
.icon-green { background: #e8f5e9; } |
|
|
|
.icon-orange { background: #fff3e0; } |
|
|
|
.icon-purple { background: #f3e5f5; } |
|
|
|
.icon-yellow { background: #fffde7; } |
|
|
|
.icon-pink { background: #fce4ec; } |
|
|
|
.icon-cyan { background: #e0f7fa; } |
|
|
|
|
|
|
|
.category-name { |
|
|
|
font-size: 0.28rem; |
|
|
|
color: #666; |
|
|
|
text-align: center; |
|
|
|
} |
|
|
|
|
|
|
|
/* ===== 法律列表 ===== */ |
|
|
|
.law-section { |
|
|
|
/* ===== 列表项 ===== */ |
|
|
|
.law-item { |
|
|
|
background: #fff; |
|
|
|
border-radius: 0.2rem; |
|
|
|
padding: 0.3rem; |
|
|
|
padding: 0.35rem 0.3rem; |
|
|
|
margin-bottom: 0.27rem; |
|
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); |
|
|
|
} |
|
|
|
|
|
|
|
:deep(.van-cell) { |
|
|
|
font-size: 0.32rem; |
|
|
|
padding: 0.25rem 0; |
|
|
|
border-bottom: 1px solid #f5f5f5; |
|
|
|
|
|
|
|
&:last-child { |
|
|
|
border-bottom: none; |
|
|
|
} |
|
|
|
.item-title-row { |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
margin-bottom: 0.2rem; |
|
|
|
} |
|
|
|
|
|
|
|
:deep(.van-cell__title) { |
|
|
|
font-size: 0.34rem; |
|
|
|
color: #333; |
|
|
|
.item-title { |
|
|
|
flex: 1; |
|
|
|
font-size: 0.4rem; |
|
|
|
font-weight: bold; |
|
|
|
color: #1a1a1a; |
|
|
|
overflow: hidden; |
|
|
|
text-overflow: ellipsis; |
|
|
|
white-space: nowrap; |
|
|
|
} |
|
|
|
|
|
|
|
:deep(.van-cell__label) { |
|
|
|
font-size: 0.28rem; |
|
|
|
color: #999; |
|
|
|
/* ===== 状态标签 ===== */ |
|
|
|
.status-tag { |
|
|
|
flex-shrink: 0; |
|
|
|
font-size: 0.24rem; |
|
|
|
color: #fff; |
|
|
|
padding: 0.04rem 0.16rem; |
|
|
|
border-radius: 0.06rem; |
|
|
|
margin-left: 0.15rem; |
|
|
|
white-space: nowrap; |
|
|
|
} |
|
|
|
|
|
|
|
/* ===== 问答区域 ===== */ |
|
|
|
.qa-section { |
|
|
|
background: #fff; |
|
|
|
border-radius: 0.2rem; |
|
|
|
padding: 0.3rem; |
|
|
|
margin-bottom: 0.27rem; |
|
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); |
|
|
|
.status--active { |
|
|
|
background: #52c41a; |
|
|
|
} |
|
|
|
|
|
|
|
.qa-list { |
|
|
|
.qa-item { |
|
|
|
padding: 0.25rem 0; |
|
|
|
border-bottom: 1px solid #f5f5f5; |
|
|
|
|
|
|
|
&:last-child { |
|
|
|
border-bottom: none; |
|
|
|
} |
|
|
|
} |
|
|
|
.status--pending { |
|
|
|
background: #faad14; |
|
|
|
} |
|
|
|
|
|
|
|
.qa-question { |
|
|
|
font-size: 0.34rem; |
|
|
|
color: #333; |
|
|
|
font-weight: 500; |
|
|
|
margin-bottom: 0.1rem; |
|
|
|
/* ===== 元信息行 ===== */ |
|
|
|
.item-meta { |
|
|
|
display: flex; |
|
|
|
flex-wrap: wrap; |
|
|
|
align-items: center; |
|
|
|
gap: 0.2rem; |
|
|
|
} |
|
|
|
|
|
|
|
.qa-answer { |
|
|
|
.meta-text { |
|
|
|
font-size: 0.3rem; |
|
|
|
color: #999; |
|
|
|
line-height: 1.6; |
|
|
|
display: -webkit-box; |
|
|
|
-webkit-line-clamp: 2; |
|
|
|
-webkit-box-orient: vertical; |
|
|
|
overflow: hidden; |
|
|
|
} |
|
|
|
|
|
|
|
/* ===== 底部导航 ===== */ |
|
|
|
.footer_body { |
|
|
|
flex-shrink: 0; |
|
|
|
} |
|
|
|
|
|
|
|
/* ===== 空状态 ===== */ |
|
|
|
:deep(.van-empty) { |
|
|
|
padding-top: 1.5rem; |
|
|
|
} |
|
|
|
|
|
|
|
/* ===== 列表加载完成提示 ===== */ |
|
|
|
:deep(.van-list__finished-text) { |
|
|
|
font-size: 0.28rem; |
|
|
|
color: #c0c4cc; |
|
|
|
padding: 0.2rem 0; |
|
|
|
} |
|
|
|
</style> |
|
|
|
|