马宇豪
2023-11-30 e312d5fcded7492d434d3bab48d31f0c3fc1dbfb
新增
已修改11个文件
已添加1个文件
406 ■■■■ 文件已修改
src/api/home/homePage.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/avator.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/styles/sidebar.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Navbar.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Register/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/components/details.vue 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/components/home.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/components/laws.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/components/loginForm.vue 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/components/notice.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/components/publish.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/homePage.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
    })
}
src/assets/images/avator.png
src/assets/styles/sidebar.scss
@@ -120,7 +120,7 @@
    }
    .main-container {
      margin-left: 54px;
      margin-left: 84px;
    }
    .sub-menu-title-noDropdown {
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>
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){
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>
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){
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;
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;
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;
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;
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>