Commit ff20fbee by York

初版完成

parent e9938e34
import request from "@/utils/request"; import request from "@/utils/request";
// 轮播图
export function getBanner(query) {
return request({
url: "/exam/setup/list",
method: "get",
params: query,
});
}
// http://192.168.19.142:9002/cms/category/list?categoryFlag=tyshlwyjzhhjbzx // http://192.168.19.142:9002/cms/category/list?categoryFlag=tyshlwyjzhhjbzx
export function getTab(data) { export function getTab(data) {
return request({ return request({
...@@ -16,6 +8,14 @@ export function getTab(data) { ...@@ -16,6 +8,14 @@ export function getTab(data) {
params: data, params: data,
}); });
} }
//获取友情链接
export function getLink(data) {
return request({
url: "/cms/websitelink/list",
method: "post",
params: data,
});
}
// // 查询考试设置详细 // // 查询考试设置详细
// export function getSetup(id) { // export function getSetup(id) {
......
...@@ -3,8 +3,8 @@ import request from "@/utils/request"; ...@@ -3,8 +3,8 @@ import request from "@/utils/request";
// 热点留言列表 // 热点留言列表
export function getHotList(data) { export function getHotList(data) {
return request({ return request({
url: "/cms/content/list", url: "/cms/leavemessage/list",
method: "get", method: "post",
data: data, data: data,
}); });
} }
...@@ -12,8 +12,8 @@ export function getHotList(data) { ...@@ -12,8 +12,8 @@ export function getHotList(data) {
// 最新回复列表 // 最新回复列表
export function getRecoverList(data) { export function getRecoverList(data) {
return request({ return request({
url: "/cms/content/list", url: "/cms/leavemessage/replyList",
method: "get", method: "post",
data: data, data: data,
}); });
} }
...@@ -21,18 +21,17 @@ export function getRecoverList(data) { ...@@ -21,18 +21,17 @@ export function getRecoverList(data) {
// 我要留言 // 我要留言
export function getWantMessage(data) { export function getWantMessage(data) {
return request({ return request({
url: "/cms/content/list", url: "/cms/leavemessage/saveEntity",
method: "post", method: "post",
data: data, data: data,
}); });
} }
// 留言详情 // 留言详情
export function getMessageDetail(data) { export function getMessageDetail(id) {
return request({ return request({
url: "/cms/content/list", url: "/cms/leavemessage/get?id=" + id,
method: "get", method: "get",
data: data,
}); });
} }
......
...@@ -156,17 +156,21 @@ function iMessageClick() { ...@@ -156,17 +156,21 @@ function iMessageClick() {
} }
function handleSearch() { function handleSearch() {
if (searchQuery.value) { router.push({
router.push({ path: "/wm/messagelist",
path: "/wm/search", query: { keywords: searchQuery.value },
query: { searchQuery: searchQuery.value }, });
}); // if (searchQuery.value) {
} else { // router.push({
ElMessage({ // path: "/wm/search",
message: "请输入搜索内容", // query: { searchQuery: searchQuery.value },
type: "warning", // });
}); // } else {
} // ElMessage({
// message: "请输入搜索内容",
// type: "warning",
// });
// }
} }
</script> </script>
<style scoped> <style scoped>
......
import { createRouter, createWebHistory } from "vue-router"; import { createRouter, createWebHashHistory } from "vue-router";
// 首页新闻 // 首页新闻
import NewsLayout from "../layout/news.vue"; import NewsLayout from "../layout/news.vue";
...@@ -32,7 +32,7 @@ import IMessage from "../views/wm/imessage/IMessage.vue"; ...@@ -32,7 +32,7 @@ import IMessage from "../views/wm/imessage/IMessage.vue";
import WmSearchList from "../views/wm/search/WmSearchList.vue"; import WmSearchList from "../views/wm/search/WmSearchList.vue";
const router = createRouter({ const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL), history: createWebHashHistory(import.meta.env.BASE_URL),
routes: [ routes: [
{ {
path: "/", path: "/",
......
let baseImageUrl; let baseImageUrl;
if (process.env.NODE_ENV === "development") { if (process.env.NODE_ENV === "development") {
// baseImageUrl = (path) => `${window.location.origin}${path}`;
baseImageUrl = (path) => "http://192.168.19.142:9002" + path; baseImageUrl = (path) => "http://192.168.19.142:9002" + path;
// console.log(baseImageUrl);
} else { } else {
baseImageUrl = (path) => path; baseImageUrl = (path) => "http://yjzh.sxyztech.cn" + path;
} }
export { baseImageUrl };
export { baseImageUrl };
// 栏目属性 // 栏目属性
export const HLW_YJZH_JBZX = "tyshlwyjzhhjbzx"; //太原市互联网应急指挥和举报中心 export const HLW_YJZH_JBZX = "tyshlwyjzhhjbzx"; //太原市互联网应急指挥和举报中心
export const HLW_LH_PYPT = "sxhlwlhpypt"; //山西互联网联合辟谣平台 export const HLW_LH_PYPT = "sxhlwlhpypt"; //山西互联网联合辟谣平台
......
...@@ -264,7 +264,7 @@ ...@@ -264,7 +264,7 @@
<a <a
v-for="(link, index) in friendLinks" v-for="(link, index) in friendLinks"
:key="index" :key="index"
:href="link.url" :href="link.webLinkUrl"
target="_blank" target="_blank"
class="text-gray-600 hover:text-blue-600 text-center" class="text-gray-600 hover:text-blue-600 text-center"
> >
...@@ -292,8 +292,9 @@ import "swiper/css"; ...@@ -292,8 +292,9 @@ import "swiper/css";
import "swiper/css/pagination"; import "swiper/css/pagination";
import "swiper/css/autoplay"; import "swiper/css/autoplay";
import "swiper/css/navigation"; import "swiper/css/navigation";
import { getBanner } from "@/api/home/home"; import { getLink } from "@/api/home/home";
import { getNewsList } from "@/api/home/news/list"; import { getNewsList } from "@/api/home/news/list";
import { import {
baseImageUrl, baseImageUrl,
rdxw, rdxw,
...@@ -329,10 +330,6 @@ const tyNews = ref([]); ...@@ -329,10 +330,6 @@ const tyNews = ref([]);
const hotNews = ref([]); const hotNews = ref([]);
const authoritativeNews = ref([]); const authoritativeNews = ref([]);
const rumourNews = ref([]); const rumourNews = ref([]);
//获取轮播图数据
getBanner().then((response) => {
console.log(response);
});
getTyNewsList(5, 1); getTyNewsList(5, 1);
...@@ -481,6 +478,17 @@ function getLbtList(pageSize: number, pageNo: number) { ...@@ -481,6 +478,17 @@ function getLbtList(pageSize: number, pageNo: number) {
}); });
} }
getLinkLists();
//获取首页轮播图
function getLinkLists() {
getLink().then((response) => {
const data = response.data;
const rowsList = data.rows;
friendLinks.value = rowsList;
});
}
const friendLinks = ref([]);
const slides = ref([]); const slides = ref([]);
const quickEntries = [ const quickEntries = [
...@@ -514,14 +522,14 @@ const quickEntries = [ ...@@ -514,14 +522,14 @@ const quickEntries = [
// }, // },
// ]; // ];
const friendLinks = [ // const friendLinks = [
{ name: "太原市人民政府", url: "https://www.taiyuan.gov.cn" }, // { name: "太原市人民政府", url: "https://www.taiyuan.gov.cn" },
{ name: "山西省网信办", url: "http://www.casx.gov.cn" }, // { name: "山西省网信办", url: "http://www.casx.gov.cn" },
{ name: "太原日报", url: "http://www.tynews.com.cn" }, // { name: "太原日报", url: "http://www.tynews.com.cn" },
{ name: "山西新闻网", url: "https://www.sxgov.cn" }, // { name: "山西新闻网", url: "https://www.sxgov.cn" },
{ name: "太原广播电视台", url: "https://www.sxtygdy.com" }, // { name: "太原广播电视台", url: "https://www.sxtygdy.com" },
{ name: "太原市公安局", url: "https://gaj.taiyuan.gov.cn" }, // { name: "太原市公安局", url: "https://gaj.taiyuan.gov.cn" },
]; // ];
</script> </script>
<style scoped> <style scoped>
.swiper { .swiper {
......
...@@ -17,20 +17,25 @@ ...@@ -17,20 +17,25 @@
</div> </div>
<div class="space-y-3"> <div class="space-y-3">
<div <div
v-for="(item, index) in hotTopics" v-for="(item, index) in hotList"
:key="index" :key="index"
class="p-4 bg-white rounded-lg hover:shadow-md transition-shadow border-l-4 border-red-500" class="p-4 bg-white rounded-lg hover:shadow-md transition-shadow border-l-4 border-red-500"
@click="messageClick(item)" @click="messageClick(item.id)"
> >
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<span class="text-gray-400 text-sm">{{ item.date }}</span> <div class="flex items-center text-sm text-gray-500">
<span>{{ item.contentDatetime }}</span>
<span class="mx-5">留言人:{{ item.name }}</span>
</div>
<el-tag <el-tag
size="small" size="small"
:type="item.status === '已回复' ? 'success' : 'warning'" :type="item.replyStatus === '1' ? 'success' : 'warning'"
> >
{{ item.status }} {{ item.replyStatus === "1" ? "已回复" : "未回复" }}
</el-tag> </el-tag>
</div> </div>
<h4 class="text-gray-900 font-medium mt-3">{{ item.title }}</h4>
<p class="mt-2 text-gray-700">{{ item.content }}</p> <p class="mt-2 text-gray-700">{{ item.content }}</p>
</div> </div>
</div> </div>
...@@ -50,7 +55,7 @@ ...@@ -50,7 +55,7 @@
</div> </div>
<div class="space-y-3"> <div class="space-y-3">
<div <div
v-for="(item, index) in replies" v-for="(item, index) in recoverList"
:key="index" :key="index"
class="p-4 bg-white rounded-lg hover:shadow-md transition-shadow border-l-4 border-blue-500" class="p-4 bg-white rounded-lg hover:shadow-md transition-shadow border-l-4 border-blue-500"
@click="recoverClick(item.id)" @click="recoverClick(item.id)"
...@@ -59,7 +64,13 @@ ...@@ -59,7 +64,13 @@
<div class="flex-1"> <div class="flex-1">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<h4 class="text-gray-900 font-medium">{{ item.title }}</h4> <h4 class="text-gray-900 font-medium">{{ item.title }}</h4>
<span class="text-gray-500 text-sm">{{ item.date }}</span> <!-- <span class="text-gray-500 text-sm">{{
item.contentDatetime
}}</span> -->
<div class="flex items-center text-sm text-gray-500">
<span>{{ item.contentDatetime }}</span>
<span class="mx-5">留言人:{{ item.name }}</span>
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -163,7 +174,6 @@ const replies = ref([ ...@@ -163,7 +174,6 @@ const replies = ref([
// path: "/wm/messagelist", // path: "/wm/messagelist",
// }); // });
// } // }
const hotList = ref([]); const hotList = ref([]);
const recoverList = ref([]); const recoverList = ref([]);
...@@ -207,7 +217,7 @@ function messageClick(id: number) { ...@@ -207,7 +217,7 @@ function messageClick(id: number) {
} }
function recoverClick(id: number) { function recoverClick(id: number) {
router.push({ router.push({
path: "/wm/recoverdetail", path: "/wm/messagedetail",
query: { query: {
pathType: "-1", pathType: "-1",
id: id, id: id,
......
...@@ -11,31 +11,34 @@ ...@@ -11,31 +11,34 @@
<!-- 主要内容卡片 --> <!-- 主要内容卡片 -->
<div class="rounded-lg bg-white p-6 shadow-sm"> <div class="rounded-lg bg-white p-6 shadow-sm">
<!-- 标题区域 --> <!-- 标题区域 -->
<div class="mb-6"> <div class="mb-3">
<h1 class="mb-4 text-xl font-medium text-gray-900"> <h1 class="mb-2 text-xl font-medium text-gray-900">
东湖新区排水管网改造工程环境污染问题 {{ detail.title }}
</h1> </h1>
<div class="flex items-center space-x-4 text-sm text-gray-500"> <div class="flex items-center space-x-4 text-sm text-gray-500">
<span <!-- <span
class="inline-flex items-center rounded-md bg-blue-50 px-2 py-1 text-xs font-medium text-blue-700" class="inline-flex items-center rounded-md bg-blue-50 px-2 py-1 text-xs font-medium text-green-600"
>
{{ detail.replyStatus == "1" ? "已回复" : "未回复" }}
</span> -->
<el-tag
size="small"
class="inline-flex items-center rounded-md bg-blue-50 px-2 py-1 text-xs font-medium text-green-600"
:type="detail.replyStatus === '1' ? 'success' : 'warning'"
> >
已回复 {{ detail.replyStatus === "1" ? "已回复" : "未回复" }}
</span> </el-tag>
<span>留言人: 李**</span>
<span>时间: 2024年1月15日 09:23</span> <span>留言人: {{ detail.name }}</span>
<span>时间: {{ detail.contentDatetime }}</span>
</div> </div>
</div> </div>
<!-- 问题描述 --> <!-- 问题描述 -->
<div class="mb-6"> <div class="mb-6">
<p class="text-gray-600"> <div class="space-y-4 text-gray-600" v-html="detail.content"></div>
施工扬尘污染问题严重影响了周边居民的正常生活,希望相关部门能够重视此事。主要存在以下问题:
<br />施工现场未按要求设置防尘设施 <br />运输车辆未做好防尘措施
<br />现场积尘较多,未及时清理
<br />建议加强监管力度,落实各项防尘措施,保障居民生活环境。
</p>
<!-- 附件区域 --> <!-- 附件区域 -->
<div <!-- <div
v-if="attachments.length > 0" v-if="attachments.length > 0"
class="mt-1 border-t border-gray-200 pt-3" class="mt-1 border-t border-gray-200 pt-3"
> >
...@@ -49,7 +52,7 @@ ...@@ -49,7 +52,7 @@
class="group flex cursor-pointer items-center rounded-md p-1 hover:bg-gray-50" class="group flex cursor-pointer items-center rounded-md p-1 hover:bg-gray-50"
@click="handlePreview(file)" @click="handlePreview(file)"
> >
<el-icon class="mr-2 text-gray-400" color="blue"> <el-icon class="mr-2 text-gray-400" color="gray">
<Document <Document
v-if=" v-if="
file.type === 'pdf' || file.type === 'pdf' ||
...@@ -71,7 +74,7 @@ ...@@ -71,7 +74,7 @@
}}</span> }}</span>
</div> </div>
</div> </div>
</div> </div> -->
</div> </div>
<!-- 预览弹窗 --> <!-- 预览弹窗 -->
<el-dialog <el-dialog
...@@ -118,20 +121,9 @@ ...@@ -118,20 +121,9 @@
</el-dialog> </el-dialog>
<!-- 官方回复 --> <!-- 官方回复 -->
<div class="rounded-lg bg-gray-50 p-5"> <div class="rounded-lg bg-gray-50 p-5" v-if="detail.reply != null">
<h2 class="mb-4 text-lg font-medium text-red-500">官方回复:</h2> <h2 class="mb-4 text-lg font-medium text-red-500">官方回复:</h2>
<div class="space-y-4 text-gray-600"> <div class="space-y-4 text-gray-600" v-html="detail.reply"></div>
<p>
网友您好!收到您的投诉后,我局高度重视,立即组织相关部门进行实地调查和处理。经查:
<br />1.
关于城东新区排水管网改造工程施工现场扬尘污染问题,我局已要求施工单位立即采取以下整改措施:
<br />增设雾炮机和喷淋设备,加强施工现场降尘
<br />对裸露土地进行苫盖,设置防尘网
<br />增加洒水车频次,保持路面湿润 <br />2.
目前整改措施已全部落实到位,扬尘污染问题得到有效控制。后续我局将继续加强监管,确保施工期间不发生扬尘污染问题。
<br />感谢您对我们工作的监督,我们将持续改进服务质量。
</p>
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -170,8 +162,12 @@ const breadcrumbItems2 = ref([ ...@@ -170,8 +162,12 @@ const breadcrumbItems2 = ref([
{ title: "详情", path: "" }, { title: "详情", path: "" },
]); ]);
const detail = ref({});
// 获取留言详情 // 获取留言详情
getMessageDetail(route.query.id).then((res) => {}); getMessageDetail(route.query.id).then((res) => {
detail.value = res.data;
});
interface FileItem { interface FileItem {
name: string; name: string;
......
<!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 --> <!-- 代码已包含 CSS:使用 TailwindCSS , 安装 TailwindCSS 后方可看到布局样式效果 -->
<template> <template>
<div class="w-[1440px] mx-auto px-4"> <div class="w-[1440px] mx-auto px-4">
<!-- 面包屑导航 --> <!-- 面包屑导航 -->
<div class="flex items-center justify-between py-2 border-b mb-5"> <div class="flex items-center justify-between py-2 border-b mb-5">
<bread-crumb :breadcrumbItems="breadcrumbItems" /> <bread-crumb :breadcrumbItems="breadcrumbItems" />
<!-- 搜索框 --> <!-- 搜索框 -->
<div class="relative"> <div class="relative">
<input <input
type="text" type="text"
v-model="searchText" v-model="searchText"
placeholder="搜索留言" placeholder="搜索留言"
class="w-[300px] h-8 pl-4 pr-10 rounded-lg border-none bg-white shadow-sm focus:ring-2 focus:ring-blue-500 text-sm" class="w-[300px] h-8 pl-4 pr-10 rounded-lg border-none bg-white shadow-sm focus:ring-2 focus:ring-blue-500 text-sm"
/> @keyup.enter="handleSearch"
<el-icon />
class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" <el-icon class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400"
><Search ><Search
/></el-icon> /></el-icon>
</div>
</div> </div>
<!-- 留言列表 --> </div>
<div class="space-y-4"> <!-- 留言列表 -->
<div <div class="space-y-4">
v-for="(item, index) in messageList" <div
:key="index" v-for="(item, index) in hotList"
class="bg-white rounded-lg shadow-sm p-6 transition-all duration-300 hover:shadow-lg hover:scale-[1.01] cursor-pointer" :key="index"
@click="clickList(item.id)" class="bg-white rounded-lg shadow-sm p-6 transition-all duration-300 hover:shadow-lg hover:scale-[1.01] cursor-pointer"
> @click="clickList(item.id)"
<h2 class="text-lg font-medium text-gray-900 mb-3"> >
{{ item.title }} <!-- <h2 class="text-lg font-medium text-gray-900 mb-3">
</h2> {{ item.title }}
<p class="text-gray-600 mb-4 leading-relaxed">{{ item.content }}</p> </h2> -->
<div class="flex items-center text-sm text-gray-500">
<span>{{ item.date }}</span> <div class="flex justify-between items-start mb-1">
<span class="mx-2">留言人:{{ item.author }}</span> <h3 class="text-lg font-medium text-gray-900">{{ item.title }}</h3>
</div> <span
:class="[
'px-3 py-1 rounded-full text-sm',
item.replyStatus === '1'
? 'bg-green-50 text-green-600'
: 'bg-orange-50 text-orange-600',
]"
>{{ item.replyStatus === "1" ? "已回复" : "未回复" }}</span
>
</div>
<p class="text-gray-600 mb-4 leading-relaxed">{{ item.content }}</p>
<div class="flex items-center text-sm text-gray-500">
<span>{{ item.contentDatetime }}</span>
<span class="mx-5">留言人:{{ item.name }}</span>
</div> </div>
</div> </div>
<!-- 分页 -->
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div> </div>
<!-- 分页 -->
<div class="flex justify-center mt-8">
<el-pagination
v-model:current-page="pageNo"
v-model:page-size="pageSize"
background
:total="total"
:page-sizes="[10, 20, 30, 40]"
layout="prev, pager, next"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from "vue"; import { ref, watch } from "vue";
import { useRouter } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { Search, ArrowRight } from "@element-plus/icons-vue"; import { Search, ArrowRight } from "@element-plus/icons-vue";
import BreadCrumb from "@/components/breadcrumb/BreadCrumb.vue"; import BreadCrumb from "@/components/breadcrumb/BreadCrumb.vue";
import { getHotList } from "@/api/wm/wm"; import { getHotList } from "@/api/wm/wm";
import { onMounted } from "vue";
const router = useRouter(); const router = useRouter();
const searchText = ref(""); const route = useRoute();
const searchText = ref();
const pageNo = ref(1); const pageNo = ref(1);
const pageSize = ref(10); const pageSize = ref(10);
const hotList = ref([]); const hotList = ref([]);
...@@ -76,11 +92,35 @@ const handleCurrentChange = (val: number) => { ...@@ -76,11 +92,35 @@ const handleCurrentChange = (val: number) => {
getList(pageSize.value, pageNo.value); getList(pageSize.value, pageNo.value);
}; };
getList(pageSize.value, pageNo.value); function handleSearch() {
getList(10, 1);
}
onMounted(() => {
if (route.query.keywords) {
searchText.value = route.query.keywords;
console.log(route.query.keywords);
}
getList(pageSize.value, pageNo.value);
});
// watch route.query.keywords
watch(
() => route.query.keywords,
(newVal) => {
searchText.value = newVal;
getList(pageSize.value, pageNo.value);
}
);
//获取新闻热点列表 //获取新闻热点列表
function getList(pageSize: number, pageNo: number) { function getList(pageSize: number, pageNo: number) {
// if (route.query.keywords) {
// searchText.value = route.query.keywords;
// console.log(route.query.keywords);
// }
const datas = { const datas = {
title: searchText.value,
pageSize: pageSize, pageSize: pageSize,
pageNo: pageNo, pageNo: pageNo,
}; };
...@@ -96,36 +136,6 @@ const breadcrumbItems = ref([ ...@@ -96,36 +136,6 @@ const breadcrumbItems = ref([
{ title: "留言列表" }, { title: "留言列表" },
]); ]);
const messageList = ref([
{
title: "反映某建筑公司拖欠农民工工资问题",
content:
"太原市建筑工人反映某建筑公司拖欠其与工友共计 50 余人约 156 万元工资。经劳动监察部门介入调查,目前该公司已全额支付拖欠资金,并按规定支付赔偿金。",
date: "2024-12-27 09:41",
author: "张先生",
},
{
title: "某快递公司拖欠快递员工资及社保问题",
content:
"市民李师傅反映某快递公司拖欠员工工资 3 个月,且未缴纳社会保险。经调查核实并约谈该公司负责人,该公司已补发全部工资并补缴社保,承诺今后按时发放工资。",
date: "2024-12-02 12:24",
author: "李先生",
},
{
title: "反映某餐饮企业克扣服务员工资问题",
content:
"服务员投诉某连锁餐饮企业以各种理由克扣工资。经查实,该企业存在违规罚款、未按约定发放绩效工资等问题。目前已责令整改,并补发被克扣工资。",
date: "2024-12-12 09:02",
author: "张女士",
},
{
title: "某科技公司拖欠开发人员工资及年终奖",
content:
"工程师等 12 名技术人员投诉某科技公司拖欠 2023 年 11-12 月工资及年终奖共计 89 万元。经多方协调,该公司已筹措资金完成全部支付。",
date: "2024-12-11 15:00",
author: "王先生",
},
]);
function clickList(id: number) { function clickList(id: number) {
router.push({ router.push({
path: "/wm/messagedetail", path: "/wm/messagedetail",
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
<!-- 面包屑导航 --> <!-- 面包屑导航 -->
<div class="flex items-center justify-between py-2 border-b mb-5"> <div class="flex items-center justify-between py-2 border-b mb-5">
<bread-crumb :breadcrumbItems="breadcrumbItems" /> <bread-crumb :breadcrumbItems="breadcrumbItems" />
<!-- 搜索框 --> <!-- 搜索框 -->
<div class="relative"> <div class="relative">
<input <input
...@@ -14,6 +13,7 @@ ...@@ -14,6 +13,7 @@
v-model="searchText" v-model="searchText"
placeholder="搜索回复" placeholder="搜索回复"
class="w-[300px] h-8 pl-4 pr-10 rounded-lg border-none bg-white shadow-sm focus:ring-2 focus:ring-blue-500 text-sm" class="w-[300px] h-8 pl-4 pr-10 rounded-lg border-none bg-white shadow-sm focus:ring-2 focus:ring-blue-500 text-sm"
@keyup.enter="handleSearch"
/> />
<el-icon <el-icon
class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400"
...@@ -24,25 +24,31 @@ ...@@ -24,25 +24,31 @@
<!-- 回复列表 --> <!-- 回复列表 -->
<div> <div>
<div <div
v-for="(item, index) in displayItems" v-for="(item, index) in recoverList"
:key="index" :key="index"
class="bg-white rounded-lg p-6 mb-4 shadow-sm hover:shadow-md transition-shadow" class="bg-white rounded-lg p-6 mb-4 shadow-sm hover:shadow-md transition-shadow"
@click="clickList(item.id)" @click="clickList(item.id)"
> >
<div class="flex justify-between items-start mb-3"> <div class="flex justify-between items-start mb-1">
<h3 class="text-lg font-medium text-gray-900">{{ item.title }}</h3> <h3 class="text-lg font-medium text-gray-900">{{ item.title }}</h3>
<span <span
:class="[ :class="[
'px-3 py-1 rounded-full text-sm', 'px-3 py-1 rounded-full text-sm',
item.status === '已处理' item.replyStatus === '1'
? 'bg-green-50 text-green-600' ? 'bg-green-50 text-green-600'
: 'bg-orange-50 text-orange-600', : 'bg-orange-50 text-orange-600',
]" ]"
>{{ item.status }}</span >{{ item.replyStatus === "1" ? "已回复" : "未回复" }}</span
> >
</div> </div>
<p class="text-gray-600 mb-4">{{ item.content }}</p>
<div class="text-sm text-gray-400">{{ item.time }}</div> <!-- <p class="text-gray-600 mb-4">{{ item.content }}</p>
<div class="text-sm text-gray-400">{{ item.contentDatetime }}</div> -->
<div class="flex items-center text-sm text-gray-500">
<span>{{ item.contentDatetime }}</span>
<span class="mx-5">留言人:{{ item.name }}</span>
</div>
<p class="mt-2 text-gray-700">{{ item.content }}</p>
</div> </div>
</div> </div>
...@@ -89,9 +95,13 @@ const handleCurrentChange = (val: number) => { ...@@ -89,9 +95,13 @@ const handleCurrentChange = (val: number) => {
getList(pageSize.value, pageNo.value); getList(pageSize.value, pageNo.value);
function handleSearch() {
getList(10, 1);
}
//获取新闻热点列表 //获取新闻热点列表
function getList(pageSize: number, pageNo: number) { function getList(pageSize: number, pageNo: number) {
const datas = { const datas = {
title: searchText.value,
pageSize: pageSize, pageSize: pageSize,
pageNo: pageNo, pageNo: pageNo,
}; };
...@@ -107,58 +117,9 @@ const breadcrumbItems = ref([ ...@@ -107,58 +117,9 @@ const breadcrumbItems = ref([
{ title: "回复列表" }, { title: "回复列表" },
]); ]);
const allItems = [
{
title: "关于东湖公园设施改善的回复",
content:
"感谢您的建议。我局已安排相关部门实地考察,将在东湖公园增设 25 组休闲椅和 10 处遮阳凉亭,预计本月内完工。",
time: "2024-12-27 09:41",
status: "已处理",
},
{
title: "关于龙泉山交通问题的回复",
content:
"关于龙泉山拥堵问题,我们已制定改善方案:1. 优化信号灯配时;2. 增设潮汐车道;3. 加强交通疏导。预计一周内见效。",
time: "2024-12-02 12:24",
status: "已处理",
},
{
title: "关于金融大厦停车问题的回复",
content:
"金融大厦地下停车场扩建工程已列入今年重点项目,将新增车位 600 个,预计 6 月完工。",
time: "2024-12-02 12:24",
status: "已处理",
},
{
title: "关于市民广场交通设施的回复",
content:
"我们将对市民广场周边道路进行优化:1. 新增人行天桥;2. 扩建非机动车道;3. 增设智能红绿灯。预计两周内完成。",
time: "2024-12-02 12:24",
status: "未处理",
},
{
title: "关于青山湖环境整治的回复",
content:
"青山湖环境整治工程已启动,包括水质净化、垃圾清理、绿化提升等多项工作,预计三个月内完成。",
time: "2024-12-02 12:24",
status: "未处理",
},
];
const totalItems = computed(() => allItems.length);
const displayItems = computed(() => {
const start = (pageNo.value - 1) * pageSize.value;
const filtered = allItems.filter(
(item) =>
item.title.includes(searchText.value) ||
item.content.includes(searchText.value)
);
return filtered.slice(start, start + pageSize.value);
});
function clickList(id: number) { function clickList(id: number) {
router.push({ router.push({
path: "/wm/recoverdetail", path: "/wm/messagedetail",
query: { query: {
title: "回复列表", title: "回复列表",
pathType: "/wm/recoverlist", pathType: "/wm/recoverlist",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment