From e312d5fcded7492d434d3bab48d31f0c3fc1dbfb Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期四, 30 十一月 2023 15:44:19 +0800 Subject: [PATCH] 新增 --- src/layout/components/Register/index.vue | 5 src/views/components/notice.vue | 16 + src/api/home/homePage.js | 27 +++ src/views/homePage.vue | 42 ++--- src/assets/images/avator.png | 0 src/assets/styles/sidebar.scss | 2 src/layout/components/Navbar.vue | 3 src/views/components/loginForm.vue | 29 ++-- src/views/components/laws.vue | 18 + src/views/components/details.vue | 226 ++++++++++++++++++++++++++++++- src/views/components/home.vue | 18 +- src/views/components/publish.vue | 20 +- 12 files changed, 324 insertions(+), 82 deletions(-) diff --git a/src/api/home/homePage.js b/src/api/home/homePage.js index eba3b5d..4a7e564 100644 --- a/src/api/home/homePage.js +++ b/src/api/home/homePage.js @@ -9,6 +9,15 @@ }) } +// 获取详情 +export function getNoticeDetails(params) { + return request({ + url: '/system/notice/getNoticeById', + method: 'get', + params: params + }) +} + // 获取分页 export function getLaws(params) { return request({ @@ -18,6 +27,15 @@ }) } +// 获取详情 +export function getLawsDetails(params) { + return request({ + url: '/system/law/getLawById', + method: 'get', + params: params + }) +} + // 获取分页 export function getPublish(params) { return request({ @@ -25,4 +43,13 @@ method: 'get', params: params }) +} + +// 获取详情 +export function getPublishDetails(params) { + return request({ + url: '/system/agency/getAgencyById', + method: 'get', + params: params + }) } \ No newline at end of file diff --git a/src/assets/images/avator.png b/src/assets/images/avator.png new file mode 100644 index 0000000..cfa804c --- /dev/null +++ b/src/assets/images/avator.png Binary files differ diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss index b6cdd17..62cafc1 100644 --- a/src/assets/styles/sidebar.scss +++ b/src/assets/styles/sidebar.scss @@ -120,7 +120,7 @@ } .main-container { - margin-left: 54px; + margin-left: 84px; } .sub-menu-title-noDropdown { diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 4bc452f..7f3f305 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -25,7 +25,8 @@ <div class="avatar-container"> <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click"> <div class="avatar-wrapper"> - <img :src="userStore.avatar" class="user-avatar" /> +<!-- <img :src="userStore.avatar" class="user-avatar" />--> + <img src="../../assets/images/avator.png" class="user-avatar" /> <el-icon><caret-bottom /></el-icon> </div> <template #dropdown> diff --git a/src/layout/components/Register/index.vue b/src/layout/components/Register/index.vue index a7eae8c..9732e21 100644 --- a/src/layout/components/Register/index.vue +++ b/src/layout/components/Register/index.vue @@ -179,12 +179,12 @@ </el-col> <el-col :span="8"> <el-form-item prop="agency.business" label="申请的法定安全评价业务范围"> - <el-select v-model="registerForm.agency.business" placeholder="请选择业务范围" size="large" style="width: 100%"> + <el-select v-model="registerForm.agency.business" placeholder="请选择业务范围" multiple size="large" style="width: 100%"> <el-option v-for="item in state.busList" :key="item.id" :label="item.label" - :value="item.label" + :value="item.id" /> </el-select> </el-form-item> @@ -516,6 +516,7 @@ loading.value = true; const {confirmPassword, ...data} = registerForm.value data.password = Base64.encode(data.password) + data.agency.business = data.agency.business.join(',') delete data.agency.area register(data).then(res => { if(res.code == 200){ diff --git a/src/views/components/details.vue b/src/views/components/details.vue index b2eb8c9..985fbe8 100644 --- a/src/views/components/details.vue +++ b/src/views/components/details.vue @@ -6,34 +6,95 @@ <Location /> </el-icon> <span>我的位置:</span> + <el-breadcrumb :separator-icon="ArrowRight"> + <el-breadcrumb-item><a href="#" @click="back">{{ state.firstClass }}</a></el-breadcrumb-item> + <el-breadcrumb-item>查看详情</el-breadcrumb-item> + </el-breadcrumb> </div> - <el-breadcrumb :separator-icon="ArrowRight"> - <el-breadcrumb-item>{{ state.firstClass }}</el-breadcrumb-item> - <el-breadcrumb-item>{{state.firstClass}}</el-breadcrumb-item> - </el-breadcrumb> + <div> + <el-button plain @click="back">返回上级</el-button> + </div> </div> - <div class="main"> - + <div class="main" v-if="state.firstClass == '通知公告'"> + <div class="title">{{state.content.title}}</div> + <el-divider border-style="dashed"/> + <div class="time">更新时间:{{state.content.updateTime?state.content.updateTime:state.content.createTime}}</div> + <div v-html="state.content.content"></div> + </div> + <div class="main" v-if="state.firstClass == '法律法规'"> + <div class="title">{{state.content.title}}</div> + <div class="sub-title">{{state.content.subTitle}}</div> + <div class="info"><span>法律法规类别:{{state.content.lawType}}</span><span>颁布机构:{{state.content.pubAgency}}</span><span>颁布日期:{{state.content.pubDate}}</span></div> + <el-divider border-style="dashed"/> + <div class="time">更新时间:{{state.content.updateTime?state.content.updateTime:state.content.createTime}}</div> + <div v-html="state.content.content"></div> + </div> + <div class="main" v-if="state.firstClass == '机构公示'"> + <div class="title">{{state.content.name}}</div> + <el-divider border-style="dashed"/> + <div class="time">更新时间:{{state.content.updateTime?state.content.updateTime:state.content.createTime}}</div> + <el-row> + <el-col :span="4">所在地区:</el-col> + <el-col :span="8">{{state.content.province}}<span v-if="state.content.province&&state.content.city">/</span>{{state.content.city}}<span v-if="state.content.city&&state.content.district">/</span>{{state.content.district}}</el-col> + <el-col :span="4">详细地址:</el-col> + <el-col :span="8">{{state.content.address}}</el-col> + </el-row> + <el-row> + <el-col :span="4">社会信用代码:</el-col> + <el-col :span="8">{{state.content.creditCode}}</el-col> + <el-col :span="4">资质证书编号:</el-col> + <el-col :span="8">{{state.content.certNumber}}</el-col> + </el-row> + <el-row> + <el-col :span="4">发证日期:</el-col> + <el-col :span="8">{{state.content.issueDate}}</el-col> + <el-col :span="4">有效日期:</el-col> + <el-col :span="8">{{state.content.validDate}}</el-col> + </el-row> + <el-row> + <el-col :span="4">办公场所面积:</el-col> + <el-col :span="8">{{state.content.workArea}}㎡</el-col> + <el-col :span="4">档案室面积:</el-col> + <el-col :span="8">{{state.content.archiveArea}}㎡</el-col> + </el-row> + <el-row> + <el-col :span="4">法定代表人:</el-col> + <el-col :span="8">{{state.content.legalPerson}}</el-col> + <el-col :span="4">法人电话:</el-col> + <el-col :span="8">{{state.content.legalPhone}}</el-col> + </el-row> + <el-row> + <el-col :span="4">机构负责人:</el-col> + <el-col :span="8">{{state.content.manager}}</el-col> + <el-col :span="4">负责人电话:</el-col> + <el-col :span="8">{{state.content.managerPhone}}</el-col> + </el-row> + <el-row> + <el-col :span="4">业务范围:</el-col> + <el-col :span="20">{{state.content.business}}</el-col> + </el-row> </div> </div> </template> <script setup> -import {onMounted, ref, reactive, watch, onUnmounted, defineExpose} from "vue" +import {onMounted, ref, reactive, watch, onUnmounted, defineExpose, defineEmits} from "vue" import { ArrowRight } from '@element-plus/icons-vue' import {ElMessage} from "element-plus"; +import {getLawsDetails, getNoticeDetails, getPublishDetails} from "../../api/home/homePage"; +import { getDict } from "@/api/login" const route = useRoute() const router = useRouter() const redirect = ref(undefined); const state = reactive({ - firstClass: '第一级菜单' + firstClass: '', + content: {}, + busList: [] }) - - - +const emit = defineEmits(['backJump']) onMounted(()=>{ - + getBusiness() }) onUnmounted(()=>{ @@ -44,9 +105,76 @@ redirect.value = newRoute.query && newRoute.query.redirect; }, { immediate: true }); +const openDetail = async (type,id)=>{ + state.content = {} + state.firstClass = type + if(type == '通知公告'){ + const res = await getNoticeDetails({noticeId: id}) + if(res.code == 200){ + state.content = res.data + if(state.content.updateTime){state.content.updateTime.substring(0.,16)} + state.content.createTime = state.content.createTime.substring(0.,16) + }else{ + ElMessage.warning(res.message) + } + } + if(type == '法律法规'){ + const res = await getLawsDetails({lawId: id}) + if(res.code == 200){ + state.content = res.data + if(state.content.updateTime){state.content.updateTime.substring(0.,16)} + state.content.createTime = state.content.createTime.substring(0.,16) + }else{ + ElMessage.warning(res.message) + } + } + if(type == '机构公示'){ + const res = await getPublishDetails({agencyId: id}) + if(res.code == 200){ + state.content = res.data + if(state.content.updateTime){state.content.updateTime.substring(0.,16)} + state.content.createTime = state.content.createTime.substring(0.,16) + state.content.issueDate = state.content.issueDate.substring(0,10) + state.content.validDate = state.content.validDate.substring(0,10) + state.content.business = getName(state.content.business) + }else{ + ElMessage.warning(res.message) + } + } +} + + +const back = ()=>{ + if(state.firstClass == '通知公告'){ + emit('backJump',2) + } + if(state.firstClass == '法律法规'){ + emit('backJump',3) + } + if(state.firstClass == '机构公示'){ + emit('backJump',4) + } +} + +const getBusiness = async ()=>{ + const res = await getDict({dictType: 'sys_business_scope'}) + if(res.code == 200){ + state.busList = res.data + }else{ + ElMessage.warning(res.message) + } +} + +const getName = (str)=>{ + const arr = str.split(',') + const newArr = arr.map((item)=>{ + return state.busList.find(i=>i.id == Number(item))?.label + }) + return newArr.join(',') +} defineExpose({ - + openDetail }) </script> @@ -58,13 +186,85 @@ flex-direction: column; align-items: center; margin-top: 170px; + .header{ + width: 1200px; + height: 60px; + margin: 20px 0 0; + padding: 0 15px; + border-radius: 4px; + background: #f5f5f5; display: flex; align-items: center; + justify-content: space-between; &>div{ display: flex; align-items: center; } } + .main{ + width: 1200px; + border-radius: 4px; + box-shadow: 1px 1px 3px rgba(0,0,0,.04); + padding: 20px 15px 40px; + background: #fff; + max-height: calc(100vh - 330px); + overflow-y: auto; + + .title{ + font-size: 1.8rem; + color: #333; + font-weight: bolder; + text-align: center; + } + .sub-title{ + font-size: 1.6rem; + color: #333; + text-align: center; + margin: 10px 0; + } + .info{ + display: flex; + align-items: center; + justify-content: space-around; + text-align: center; + font-size: 15px; + color: #666; + } + .time{ + display: flex; + align-items: center; + justify-content: space-around; + text-align: center; + font-size: 15px; + color: #666; + margin-bottom: 15px; + } + + .el-row{ + border: 1px solid #e6e6e6; + border-bottom: none; + font-size: 18px; + color: #333; + font-weight: 600; + font-family: "PingFang SC"; + + &:last-of-type{ + border-bottom: 1px solid #e6e6e6; + } + .el-col{ + padding: 15px; + border-right: 1px solid #e6e6e6; + + &:last-of-type{ + border-right: none; + } + } + .el-col-4{ + color: #666; + font-weight: normal; + } + } + } } </style> diff --git a/src/views/components/home.vue b/src/views/components/home.vue index 71677fd..20f96d0 100644 --- a/src/views/components/home.vue +++ b/src/views/components/home.vue @@ -10,11 +10,11 @@ <el-button plain @click="toMore(2)">查看更多</el-button> </div> <div class="list"> - <div v-for="item in state.noticeList"> + <div v-for="item in state.noticeList" @click="openDetails('通知公告',item.id)"> <div><img src="src/assets/images/notice.png"></div> <div> <div>{{item.title}}</div> - <span>{{item.updateTime}}</span> + <span>{{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}</span> </div> </div> </div> @@ -28,11 +28,11 @@ <el-button plain @click="toMore(3)">查看更多</el-button> </div> <div class="list"> - <div v-for="item in state.lawsList"> + <div v-for="item in state.lawsList" @click="openDetails('法律法规',item.id)"> <div><img src="src/assets/images/laws.png"></div> <div> <div>{{item.title}}</div> - <span>{{item.updateTime}}</span> + <span>{{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}</span> </div> </div> </div> @@ -46,11 +46,11 @@ <el-button plain @click="toMore(4)">查看更多</el-button> </div> <div class="list"> - <div v-for="item in state.pubList"> + <div v-for="item in state.pubList" @click="openDetails('机构公示',item.id)"> <div><img src="src/assets/images/section.png"></div> <div> <div>{{item.name}}</div> - <span>{{item.updateTime}}</span> + <span>{{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}</span> </div> </div> </div> @@ -94,7 +94,7 @@ lawsList: [], pubList: [] }) -const emit = defineEmits(["toMore"]) +const emit = defineEmits(['toMore','openDetails']) const redirect = ref(undefined); onMounted(()=>{ @@ -115,6 +115,10 @@ emit('toMore',num) } +const openDetails = (type,id)=>{ + emit('openDetails',type,id) +} + const getNoticeList = async ()=>{ const res = await getNotice({title: '', content: '', pageNum: 1, pageSize: 5}) if(res.code == 200){ diff --git a/src/views/components/laws.vue b/src/views/components/laws.vue index ab6ef7d..caf54c1 100644 --- a/src/views/components/laws.vue +++ b/src/views/components/laws.vue @@ -11,17 +11,17 @@ <el-button type="primary" :icon="Refresh" class="resetBtn">重置</el-button> </div> <div class="list"> - <div v-for="item in state.dataList"> + <div v-for="item in state.dataList" @click="openDetails('法律法规',item.id)"> <div> <div><img src="src/assets/images/article.png"></div> <div>{{item.title}}</div> </div> <span> - {{item.updateTime}} + {{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}} </span> </div> </div> - <div class="pag-container"> + <div class="pag-container" v-if="state.total&&state.total>0"> <el-pagination v-model:current-page="state.querys.pageNum" v-model:page-size="state.querys.pageSize" @@ -37,12 +37,12 @@ </template> <script setup> -import {onMounted, ref, reactive, watch, onUnmounted, defineExpose} from "vue" +import {onMounted, ref, reactive, watch, onUnmounted, defineExpose, defineEmits} from "vue" import { getLaws } from '@/api/home/homePage' import useUserStore from '@/store/modules/user' import { Search, Refresh } from '@element-plus/icons-vue' import {ElMessage} from "element-plus"; - +const emit = defineEmits(['openDetails']) const route = useRoute() const router = useRouter() @@ -88,6 +88,10 @@ const handleCurrentChange = (val) => { state.querys.pageNum = val getData() +} + +const openDetails = (type,id)=>{ + emit('openDetails',type,id) } defineExpose({ @@ -142,6 +146,8 @@ .list{ padding: 15px 0; + max-height: calc(100vh - 402px); + overflow-y: auto; &>div{ display: flex; @@ -171,7 +177,7 @@ } } div:last-of-type{ - width: 1000px; + width: 900px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; diff --git a/src/views/components/loginForm.vue b/src/views/components/loginForm.vue index 02bc9cc..7ca1476 100644 --- a/src/views/components/loginForm.vue +++ b/src/views/components/loginForm.vue @@ -134,22 +134,21 @@ // 调用action的登录方法 loginForm.value.password = Base64.encode(loginForm.value.password) userStore.login(loginForm.value).then(() => { - const query = route.query; - const otherQueryParams = Object.keys(query).reduce((acc, cur) => { - if (cur !== "redirect") { - acc[cur] = query[cur]; + // const query = route.query; + // const otherQueryParams = Object.keys(query).reduce((acc, cur) => { + // if (cur !== "redirect") { + // acc[cur] = query[cur]; + // } + // return acc; + // }, {}); + const userInfo = JSON.parse(Cookies.get('userInfo')) + if(userInfo.identity === 0) { + sidebarRouters.value = menu.adminMenu + Cookies.set('routers',JSON.stringify(sidebarRouters.value)) } - return acc; - }, {}); - const userInfo = JSON.parse(Cookies.get('userInfo')) - if(userInfo.identity === 0) { - sidebarRouters.value = menu.adminMenu - Cookies.set('routers',JSON.stringify(sidebarRouters.value)) - } - console.log("sidebarRouters.value",sidebarRouters.value) - router.push({ - path: sidebarRouters.value[0].path - }) + router.push({ + path: sidebarRouters.value[0].path + }) // router.push({ path: redirect.value || "/", query: otherQueryParams }); }).catch(() => { loading.value = false; diff --git a/src/views/components/notice.vue b/src/views/components/notice.vue index d70ef98..7aa8f3c 100644 --- a/src/views/components/notice.vue +++ b/src/views/components/notice.vue @@ -2,17 +2,17 @@ <div class="container"> <div class="main-content"> <div class="list"> - <div v-for="item in state.dataList"> + <div v-for="item in state.dataList" @click="openDetails('通知公告',item.id)"> <div> <div><img src="src/assets/images/article.png"></div> <div>{{item.title}}</div> </div> <span> - {{item.updateTime}} + {{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}} </span> </div> </div> - <div class="pag-container"> + <div class="pag-container" v-if="state.total&&state.total>0"> <el-pagination v-model:current-page="state.querys.pageNum" v-model:page-size="state.querys.pageSize" @@ -28,11 +28,11 @@ </template> <script setup> -import {onMounted, ref, reactive, watch, onUnmounted, defineExpose} from "vue" +import {onMounted, ref, reactive, watch, onUnmounted, defineExpose, defineEmits} from "vue" import { getNotice } from '@/api/home/homePage' import useUserStore from '@/store/modules/user' import {ElMessage} from "element-plus"; - +const emit = defineEmits(['openDetails']) const route = useRoute() const router = useRouter() @@ -78,6 +78,10 @@ }else{ ElMessage.warning(res.message) } +} + +const openDetails = (type,id)=>{ + emit('openDetails',type,id) } defineExpose({ @@ -135,7 +139,7 @@ } } div:last-of-type{ - width: 1000px; + width: 900px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; diff --git a/src/views/components/publish.vue b/src/views/components/publish.vue index 3ed921c..dc9f3f2 100644 --- a/src/views/components/publish.vue +++ b/src/views/components/publish.vue @@ -23,17 +23,17 @@ <el-button type="primary" :icon="Refresh" class="resetBtn">重置</el-button> </div> <div class="list"> - <div v-for="item in state.dataList"> + <div v-for="item in state.dataList" @click="openDetails('机构公示',item.id)"> <div> <div><img src="src/assets/images/article.png"></div> - <div>{{item.title}}</div> + <div>{{item.name}}</div> </div> <span> - {{item.updateTime}} + {{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}} </span> </div> </div> - <div class="pag-container"> + <div class="pag-container" v-if="state.total&&state.total>0"> <el-pagination v-model:current-page="state.querys.pageNum" v-model:page-size="state.querys.pageSize" @@ -49,11 +49,11 @@ </template> <script setup> -import {onMounted, ref, reactive, watch, onUnmounted, defineExpose} from "vue" +import {onMounted, ref, reactive, watch, onUnmounted, defineExpose, defineEmits} from "vue" import { getPublish } from '@/api/home/homePage' import { Search, Refresh } from '@element-plus/icons-vue' import {ElMessage} from "element-plus"; - +const emit = defineEmits(['openDetails']) const route = useRoute() const router = useRouter() @@ -100,6 +100,10 @@ const handleCurrentChange = (val) => { state.querys.pageNum = val getData() +} + +const openDetails = (type,id)=>{ + emit('openDetails',type,id) } defineExpose({ @@ -154,6 +158,8 @@ .list{ padding: 15px 0; + max-height: calc(100vh - 402px); + overflow-y: auto; &>div{ display: flex; @@ -183,7 +189,7 @@ } } div:last-of-type{ - width: 1000px; + width: 900px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; diff --git a/src/views/homePage.vue b/src/views/homePage.vue index f76cacb..ae5bf05 100644 --- a/src/views/homePage.vue +++ b/src/views/homePage.vue @@ -34,16 +34,16 @@ </div> <div :class="state.activeMenu == 4?'active': ''" @click="changeTab(4)"> <List style="width: 1em; height: 1em; margin-right: 8px" /> - <div>信息公示</div> + <div>机构公示</div> </div> </div> </div> <div class="content"> - <Home v-if="state.activeMenu==1" ref="homeRef" @toMore="changeTab"/> - <Notice v-if="state.activeMenu==2" ref="noticeRef"/> - <Laws v-if="state.activeMenu==3" ref="lawsRef"/> - <Publish v-if="state.activeMenu==4" ref="publishRef"/> - <Details ref="detailsRef"></Details> + <Home v-if="state.activeMenu==1" ref="homeRef" @toMore="changeTab" @openDetails="openDetails"/> + <Notice v-if="state.activeMenu==2" ref="noticeRef" @openDetails="openDetails"/> + <Laws v-if="state.activeMenu==3" ref="lawsRef" @openDetails="openDetails"/> + <Publish v-if="state.activeMenu==4" ref="publishRef" @openDetails="openDetails"/> + <Details v-if="state.activeMenu==0" ref="detailsRef" @backJump="changeTab"></Details> </div> </div> <!-- 底部 --> @@ -60,8 +60,8 @@ import Notice from './components/notice' import Laws from './components/laws' import Publish from './components/publish' -import Details from './components/details' - +import Details from './components/details.vue' +const { proxy } = getCurrentInstance() const route = useRoute() const router = useRouter() // 时间格式化 @@ -79,7 +79,7 @@ const noticeRef = ref(null) const lawsRef = ref(null) const publishRef = ref(null) - +const detailsRef = ref(null) const state = reactive({ activeMenu: 1, date: '', @@ -130,21 +130,15 @@ const changeTab=(num)=>{ state.activeMenu = num - console.log(state.activeMenu) - // if(num == 1){ - // homeRef.value.getNoticeList() - // homeRef.value.getLawsList() - // homeRef.value.getPubList() - // } - // if(num == 2){ - // noticeRef.value.getData() - // } - // if(num == 3){ - // lawsRef.value.getData() - // } - // if(num == 4){ - // publishRef.value.getData() - // } +} + +const openDetails=(type,id)=>{ + state.activeMenu = 0 + nextTick(() => { + proxy.$refs.detailsRef.openDetail(type,id) + }) + // detailsRef.value.openDetail(type,id) + } </script> -- Gitblit v1.9.2