nahida 1 рік тому
батько
коміт
b5673e0ba5
62 змінених файлів з 1542 додано та 446 видалено
  1. 1 1
      .env.development
  2. 1 1
      .env.production
  3. 8 0
      components.d.ts
  4. 12 0
      env.d.ts
  5. 1 1
      index.html
  6. BIN
      public/bg1.jpg
  7. BIN
      public/bg2.jpg
  8. BIN
      public/favicon.ico
  9. BIN
      public/static/bg10.jpg
  10. BIN
      public/static/bg11.jpg
  11. BIN
      public/static/bg12.jpg
  12. BIN
      public/static/bg13.jpg
  13. BIN
      public/static/bg14.jpg
  14. BIN
      public/static/bg15.jpg
  15. BIN
      public/static/bg16.jpg
  16. BIN
      public/static/bg3.jpg
  17. BIN
      public/static/bg4.jpg
  18. BIN
      public/static/bg5.jpg
  19. BIN
      public/static/bg6.jpg
  20. BIN
      public/static/bg7.jpg
  21. BIN
      public/static/bg8.jpg
  22. BIN
      public/static/bg9.jpg
  23. BIN
      public/static/icon1.png
  24. BIN
      public/static/icon2.png
  25. BIN
      public/static/icon3.png
  26. BIN
      public/static/icon4.png
  27. BIN
      public/static/img1.png
  28. BIN
      public/static/img2.png
  29. 70 13
      src/api/home.ts
  30. 41 0
      src/components/CompanyDetailSmallBox.vue
  31. 103 0
      src/components/Link1.vue
  32. 105 0
      src/components/Link2.vue
  33. 60 0
      src/components/Map/dialogMap.ts
  34. 21 4
      src/components/NewDynamics.vue
  35. 117 0
      src/components/base/BaseContainer.vue
  36. 7 7
      src/layout/component/HeadBlock.vue
  37. 18 2
      src/router/route.ts
  38. 33 1
      src/utils/queryFieldMethod.ts
  39. 1 0
      src/utils/request.ts
  40. 145 172
      src/views/HomeView/index.vue
  41. 2 2
      src/views/about/index.vue
  42. 11 4
      src/views/companyDetail/index.vue
  43. 9 7
      src/views/companyDetail/map/index.ts
  44. 14 0
      src/views/companyDetail/type/index.ts
  45. 38 4
      src/views/companyList/index.vue
  46. 193 0
      src/views/complaint/index.vue
  47. 46 0
      src/views/complaint/type/index.ts
  48. 24 7
      src/views/creditDynamics/creditDynamicsDetail/index.vue
  49. 27 26
      src/views/creditDynamics/index.vue
  50. 0 11
      src/views/creditEcaluationResults/index.vue
  51. 1 1
      src/views/creditEcaluationResults/type/index.ts
  52. 8 2
      src/views/creditServices/index.vue
  53. 4 2
      src/views/creditServices/type/index.ts
  54. 84 160
      src/views/creditWiseEnterprise/index.vue
  55. 150 0
      src/views/message/index.vue
  56. 30 0
      src/views/message/type/index.ts
  57. 26 2
      src/views/newsDetail/index.vue
  58. 3 14
      src/views/search/index.vue
  59. 2 2
      src/views/search/type/index.ts
  60. 42 0
      vite.config.ts.timestamp-1719194089327-c0a87f2c9dee3.mjs
  61. 42 0
      vite.config.ts.timestamp-1719292139679-76c7244f4266c.mjs
  62. 42 0
      vite.config.ts.timestamp-1719454476541-c25d3d094e865.mjs

+ 1 - 1
.env.development

@@ -2,4 +2,4 @@
 NODE_ENV = 'development'
 VITE_APP_BASE_API = '/api'
 VITE_APP_BASE_URL = 'http://192.168.110.235:20002'
-VITE_APP_TITLE = '怀化高新区网站管理平台'
+VITE_APP_TITLE = '怀化高新区企业信用分级分类网'

+ 1 - 1
.env.production

@@ -1,4 +1,4 @@
 # 变量必须以 VITE_ 为前缀才能暴露给外部读取
 NODE_ENV = 'production'
 VITE_APP_BASE_URL = 'http://42.48.99.5:20002'
-VITE_APP_TITLE = '怀化高新区网站管理平台'
+VITE_APP_TITLE = '怀化高新区企业信用分级分类网'

+ 8 - 0
components.d.ts

@@ -7,13 +7,19 @@ export {}
 /* prettier-ignore */
 declare module 'vue' {
   export interface GlobalComponents {
+    BaseContainer: typeof import('./src/components/base/BaseContainer.vue')['default']
+    CompanyDetailSmallBox: typeof import('./src/components/CompanyDetailSmallBox.vue')['default']
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCarousel: typeof import('element-plus/es')['ElCarousel']
     ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
+    ElDialog: typeof import('element-plus/es')['ElDialog']
     ElForm: typeof import('element-plus/es')['ElForm']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
+    ElIcon: typeof import('element-plus/es')['ElIcon']
     ElInput: typeof import('element-plus/es')['ElInput']
+    ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
+    ElSelect: typeof import('element-plus/es')['ElSelect']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     FourDynamics: typeof import('./src/components/FourDynamics.vue')['default']
     IconCommunity: typeof import('./src/components/icons/IconCommunity.vue')['default']
@@ -21,6 +27,8 @@ declare module 'vue' {
     IconEcosystem: typeof import('./src/components/icons/IconEcosystem.vue')['default']
     IconSupport: typeof import('./src/components/icons/IconSupport.vue')['default']
     IconTooling: typeof import('./src/components/icons/IconTooling.vue')['default']
+    Link1: typeof import('./src/components/Link1.vue')['default']
+    Link2: typeof import('./src/components/Link2.vue')['default']
     NewDynamics: typeof import('./src/components/NewDynamics.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']

+ 12 - 0
env.d.ts

@@ -21,4 +21,16 @@ declare interface pageAxiosResponse {
   pageSize: number,
   totalPage:number,
   totalSize: number
+}
+
+declare interface PageResponse{
+  countId:any,
+  current:number,
+  maxLimit:any,
+  optimizeCountSql: boolean,
+  orders:any,
+  pages: number,
+  searchCount: boolean,
+  size:number,
+  total: number
 }

+ 1 - 1
index.html

@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<html lang="en">
+<html lang="zh-CN">
   <head>
     <meta charset="UTF-8">
     <link rel="icon" href="/favicon.ico">

BIN
public/bg1.jpg


BIN
public/bg2.jpg


BIN
public/favicon.ico


BIN
public/static/bg10.jpg


BIN
public/static/bg11.jpg


BIN
public/static/bg12.jpg


BIN
public/static/bg13.jpg


BIN
public/static/bg14.jpg


BIN
public/static/bg15.jpg


BIN
public/static/bg16.jpg


BIN
public/static/bg3.jpg


BIN
public/static/bg4.jpg


BIN
public/static/bg5.jpg


BIN
public/static/bg6.jpg


BIN
public/static/bg7.jpg


BIN
public/static/bg8.jpg


BIN
public/static/bg9.jpg


BIN
public/static/icon1.png


BIN
public/static/icon2.png


BIN
public/static/icon3.png


BIN
public/static/icon4.png


BIN
public/static/img1.png


BIN
public/static/img2.png


+ 70 - 13
src/api/home.ts

@@ -18,14 +18,19 @@ export interface NewsResponseData extends AxiosResponse{
 export interface NewsResponseDataById extends AxiosResponse{
   data:NewsData
 }
+export interface PageNewsResponseData extends PageResponse{
+  records:NewsData[]
+}
 enum API {
   GET_NEWS_URL = '/crmNewsRelease/getList',
   GET_NEWS_BY_ID_URL = '/crmNewsRelease/getById/',
+  GET_NEWS_BY_PAGE_URL = '/crmNewsRelease/findByPage',
   GET_DICK_URL = '/system/dict/data/type/',
   GET_ADMINISTRATIVE_LICENSING = '/crmAdministrativeLicense/findByPage',
   GET_ADMINISTRATIVE_PENALTY = '/crmAdministrativePenalty/findByPage',
   GET_CREDIT_REDLIST_INFO = '/crmCreditRedlistInfo/findByPage',
-  GET_C_D_COMPANY = '/crmHighTechZoneEnterprises/getCreditScoreList'
+  GET_C_D_COMPANY = '/crmHighTechZoneEnterprises/getCreditScoreList',
+  GET_DISHONEST_EXECUTOR = '/crmDishonestExecutor/findByPage'
 }
 
 export const getNews = (params:object)=>{
@@ -35,42 +40,94 @@ export const getNews = (params:object)=>{
     params
   })
 }
+export const getNewsByPage = (params:object)=>{
+  return request<any,PageNewsResponseData>({
+    url:API.GET_NEWS_BY_PAGE_URL,
+    method:'get',
+    params
+  })
+}
 export const getNewsById = (id:number)=>{
   return request.get<any,NewsResponseDataById>(API.GET_NEWS_BY_ID_URL+ id);
 }
 export const getDick = ()=>{
   return request.get<any,any>(API.GET_DICK_URL+'news_type');
 }
-export const get1 = (params={pageNum:1,pageSize:10})=>{
+export const get1 = (params={pageNum:1,pageSize:100},unifiedSocialCreditCode:string = '')=>{
+  const conditionJsonWhole:any[] = [];
+  conditionJsonWhole.push({
+    column:'unified_social_credit_code',
+    type:'like',
+    value:unifiedSocialCreditCode
+  });
+  const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
   return request<any,any>({
     url:API.GET_ADMINISTRATIVE_LICENSING,
     method:'get',
-    params
+    params:{
+      ...params,
+      conditionJson:s
+    }
   })
 }
-export const get2 = (params={pageNum:1,pageSize:10})=>{
+export const get2 = (params={pageNum:1,pageSize:100},unifiedSocialCreditCode:string = '')=>{
+  const conditionJsonWhole:any[] = [];
+  conditionJsonWhole.push({
+    column:'unified_social_credit_code',
+    type:'like',
+    value:unifiedSocialCreditCode
+  });
+  const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
   return request<any,any>({
     url:API.GET_ADMINISTRATIVE_PENALTY,
     method:'get',
-    params
+    params:{
+      ...params,
+      conditionJson:s
+    }
   })
 }
-export const get3 = (params={pageNum:1,pageSize:10})=>{
+export const get3 = (params={pageNum:1,pageSize:100},unifiedSocialCreditCode:string = '')=>{
+  const conditionJsonWhole:any[] = [];
+  conditionJsonWhole.push({
+    column:'unified_social_credit_code',
+    type:'like',
+    value:unifiedSocialCreditCode
+  });
+  const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
   return request<any,any>({
     url:API.GET_CREDIT_REDLIST_INFO,
     method:'get',
-    params
+    params:{
+      ...params,
+      conditionJson:s
+    }
   })
 }
-export const get4 = (params={pageNum:1,pageSize:10})=>{
+export const get4 = (params={pageNum:1,pageSize:100},unifiedSocialCreditCode:string = '')=>{
+  const conditionJsonWhole:any[] = [];
+  conditionJsonWhole.push({
+    column:'unified_social_credit_code',
+    type:'like',
+    value:unifiedSocialCreditCode
+  });
+  const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
   return request<any,any>({
-    url:API.GET_C_D_COMPANY,
+    url:API.GET_DISHONEST_EXECUTOR,
     method:'get',
     params:{
-      pageNum:1,
-      pageSize:10,
-      unifiedSocialCreditCode:'',
-      condition:'C,D'
+      ...params,
+      conditionJson:s
     }
   })
+  // return request<any,any>({
+  //   url:API.GET_C_D_COMPANY,
+  //   method:'get',
+  //   params:{
+  //     pageNum:1,
+  //     pageSize:10,
+  //     unifiedSocialCreditCode:'',
+  //     condition:'C,D'
+  //   }
+  // })
 }

+ 41 - 0
src/components/CompanyDetailSmallBox.vue

@@ -0,0 +1,41 @@
+<script setup lang="ts">
+
+import BaseContainer from '@/components/base/BaseContainer.vue'
+import { onBeforeUnmount, ref, watch } from 'vue'
+interface Props{
+  item:any,
+  getItemDetailMethod:Function,
+}
+const emits = defineEmits('closeDialog')
+const dialogVisible = ref(true);
+const props = defineProps<Props>();
+const currentShowData = ref();
+watch(() => props.item,async () => {
+  if(props.item == null) return;
+  const res = await props.getItemDetailMethod.apply(this,[{pageNum:1,pageSize:100},props.item.unifiedSocialCreditCode]);
+  currentShowData.value = res;
+})
+const ia = ()=>{
+  console.log('初始化');
+}
+const ca = ()=>{
+  console.log('确认');
+}
+const oa = ()=>{
+  console.log('打开窗口');
+}
+const closeDialog = ()=>{
+  currentShowData.value = []
+  emits('closeDialog')
+}
+
+
+</script>
+
+<template>
+  <BaseContainer @closeDialog = "closeDialog" :isShow="dialogVisible" :showData="currentShowData" :initAction="ia" :confirmAction="ca" :openAction="oa" />
+</template>
+
+<style scoped>
+
+</style>

+ 103 - 0
src/components/Link1.vue

@@ -0,0 +1,103 @@
+<script setup lang="ts">
+
+import { formatTime } from '@/utils/formatTime'
+import { ref } from 'vue'
+import { getNews, type NewsData } from '@/api/home'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { useRouter } from 'vue-router'
+
+const router = useRouter();
+
+const financialData = ref<NewsData[]>([])
+const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  router.push({
+    path:'/creditDynamicsDetail',
+    query:{
+      dickMapKey,
+      dickMapValue
+    }
+  });
+}
+const toDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+const toLink = (index:number)=>{
+  if(index == 1){
+    window.open("http://hntzxm.fgw.hunan.gov.cn/home")
+  }else if(index == 2){
+    window.open("http://220.168.30.70:28889/portal_v2.jsp")
+  }else if(index == 3){
+    window.open("https://222.244.103.250:8181/pmp/a/login;jsessionid=fa168d5f90a3ed7b76a9bd5f2442#")
+  }else if(index == 4){
+    window.open("http://kjgl.kjt.hunan.gov.cn/egrantweb/")
+  }else if(index == 5){
+    window.open("https://zwfw-new.hunan.gov.cn/hnzwfw/1/186/187/index.htm")
+  }
+}
+const init =async ()=>{
+  const res1 = await getNews(queryFieldMethod('special_column','financial_need'))
+  if(res1.code == 200){
+    financialData.value = res1.data.slice(0,5);
+  }
+}
+init()
+</script>
+
+<template>
+  <div>
+    <div class="w-912px bg-white ml-a mr-a text-16px pt-12px mb-10px line-height-44px border-dashed border-#e5e5e5 border-b-5px">
+      <div class="w-240px border-solid border-#00306e border-b-5px relative">
+        <img class="w-21px h-21px m-3px " src="/src/assets/img/信用小图标.png" />
+        <span class="color-#003aac text-16px">政府项目资金需求发布及链接</span>
+        <span class="absolute right--650px top-10px cursor-pointer text-#959595" @click="knowMore('financial_need','政府项目资金需求')">查看更多 ></span>
+      </div>
+      <div v-for="(item,index) in financialData" :key="index">
+        <div class="flex justify-between">
+          <div class="ml-20px cursor-pointer" @click="toDetail(item.id)">{{item.title}}</div>
+          <div class="color-gray mr-20px text-14px">
+            <span>数据来源:{{item.dataSource}}</span>
+            <span>|</span>
+            <span>{{formatTime(item.date)}}</span>
+          </div>
+        </div>
+        <div class="h-1px bg-gray"></div>
+      </div>
+    </div>
+    <div>
+      <div class="w-912px ml-auto mr-auto flex flex-wrap justify-between bg-white">
+        <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(1)">
+          <img class="w-100% h-100%" src="/static/bg8.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省发改委项目审批</div>
+        </div>
+        <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(2)">
+          <img class="w-100% h-100%" src="/static/bg9.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省财政厅项目资金管理</div>
+        </div>
+        <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(3)">
+          <img class="w-100% h-100%" src="/static/bg10.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省工信厅项目管理</div>
+        </div>
+        <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(4)">
+          <img class="w-100% h-100%" src="/static/bg11.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">科技厅</div>
+        </div>
+        <div class="w-174px h-116px relative cursor-pointer" @click="toLink(5)">
+          <img class="w-100% h-100%" src="/static/bg12.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">人社厅</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+
+</style>

+ 105 - 0
src/components/Link2.vue

@@ -0,0 +1,105 @@
+<script setup lang="ts">
+
+import { formatTime } from '@/utils/formatTime'
+import { getNews, type NewsData } from '@/api/home'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+const router = useRouter();
+const financingLoans = ref<NewsData[]>([])
+const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  router.push({
+    path:'/creditDynamicsDetail',
+    query:{
+      dickMapKey,
+      dickMapValue
+    }
+  });
+}
+const toDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+const toOrtherLink = (index:number)=>{
+  if(index == 1){
+    window.open("https://credit.fgw.hunan.gov.cn/xyd/feature")
+  }else if(index == 2){
+    window.open("https://smecmd.digital.hnchasing.com/main/cms/static/html/loan.html")
+  }else if(index == 3){
+    window.open("https://credit.fgw.hunan.gov.cn/xyd/financeMarketDetail?id=414&isShow=ck")
+  }else if(index == 4){
+    window.open('https://credit.fgw.hunan.gov.cn/xyd/financeMarketDetail?id=26&isShow=ck')
+  }else if(index == 5){
+    window.open('http://www.hntpe.com/onlineweb/blRisk/index?menuId=101086');
+  }
+}
+const init =async ()=>{
+  const res1 = await getNews(queryFieldMethod('special_column','financial_need'))
+  if(res1.code == 200){
+    financingLoans.value = res1.data.slice(0,5);
+  }
+  const res2 = await getNews(queryFieldMethod('special_column','financing_loans'))
+  if(res2.code == 200){
+    financingLoans.value = res2.data.slice(0,5);
+  }
+}
+init()
+</script>
+
+<template>
+  <div>
+    <div class="w-912px bg-white ml-a mr-a text-16px mt-12px mb-10px line-height-44px border-dashed border-#e5e5e5 border-b-5px">
+      <div class="w-240px border-solid border-#00306e border-b-5px relative">
+        <img class="w-21px h-21px m-3px " src="/src/assets/img/信用小图标.png" />
+        <span class="color-#003aac text-16px">园区企业融资贷款</span>
+        <span class="absolute right--650px top-10px cursor-pointer text-#959595" @click="knowMore('financing_loans','园区企业融资贷款')">查看更多 ></span>
+      </div>
+      <div v-for="(item,index) in financingLoans" :key="index">
+        <div class="flex justify-between">
+          <div class="ml-20px cursor-pointer" @click="toDetail(item.id)">{{item.title}}</div>
+          <div class="color-gray mr-20px text-14px">
+            <span>数据来源:{{item.dataSource}}</span>
+            <span>|</span>
+            <span>{{formatTime(item.date)}}</span>
+          </div>
+        </div>
+        <div class="h-1px bg-gray"></div>
+      </div>
+    </div>
+    <div>
+      <div class="w-912px ml-auto mr-auto flex flex-wrap justify-between bg-white">
+        <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(1)">
+          <img class="w-100% h-100%" src="/static/bg3.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">制造业中长期贷款</div>
+        </div>
+        <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(2)">
+          <img class="w-100% h-100%" src="/static/bg4.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">潇湘财银贷</div>
+        </div>
+        <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(3)">
+          <img class="w-100% h-100%" src="/static/bg5.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">农业银行流水贷</div>
+        </div>
+        <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(4)">
+          <img class="w-100% h-100%" src="/static/bg6.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南银行流水贷</div>
+        </div>
+        <div class="w-174px h-116px relative cursor-pointer" @click="toOrtherLink(5)">
+          <img class="w-100% h-100%" src="/static/bg7.jpg" />
+          <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">科技贷</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+
+</style>

+ 60 - 0
src/components/Map/dialogMap.ts

@@ -0,0 +1,60 @@
+export const dialogMap = new Map();
+dialogMap.set('id', '编号')
+  .set('entryTime', '录入时间')
+  .set('subjectName', '主体名称')
+  .set('redListReason', '红名单理由')
+  .set('lawsAndRegulations', '法律法规依据')
+  .set('statisticsDepartment', '统计部门')
+  .set('statisticsTime', '统计时间')
+  .set('administrativeLicenseDecisionDocName', '准予行政许可决定书')
+  .set('administrativeLicenseDecisionDocNumber', '行政许可决定书编号')
+  .set('administrativePartyType', '行政相对人类别')
+  .set('currentStatus', '当前状态')
+  .set('legalRepresentative', '法定代表人')
+  .set('legalRepresentativeIdNumber', '法定代表人证件号码')
+  .set('legalRepresentativeIdOtherTypeDesc', '法定代表人其他证件类型描述')
+  .set('legalRepresentativeIdType', '法定代表人证件类型')
+  .set('licenseCertificateName', '许可证证书名称')
+  .set('licenseContent', '许可内容')
+  .set('licenseDecisionDate', '许可决定日期')
+  .set('licenseNumber', '许可证编号')
+  .set('licenseType', '许可证类型')
+  .set('licenseTypeExplain', '许可证类型说明')
+  .set('licensingAuthority', '发证机关')
+  .set('licensingAuthorityUnifiedSocialCreditCode', '发证机关统一社会信用代码')
+  .set('remarks', '备注')
+  .set('validFrom', '有效起始日期')
+  .set('validUntil', '有效截至日期')
+  .set('administrativePartyName', '行政相对人名称')
+  .set('administrativePenaltyDecisionDocName', '行政处罚决定书名称')
+  .set('administrativePenaltyDecisionDocNumber', '行政处罚决定书编号')
+  .set('businessRegistrationNumber', '工商注册号')
+  .set('confiscationAmount', '没收金额')
+  .set('fineAmount', '罚款金额')
+  .set('idOtherTypeDesc', '其他证件类型描述')
+  .set('idType', '证件类型')
+  .set('illegalActType', '违法行为类型')
+  .set('illegalFacts', '违法事实')
+  .set('penaltyAuthority', '处罚机关')
+  .set('penaltyAuthorityUnifiedSocialCreditCode', '处罚机关统一社会信用代码')
+  .set('penaltyBasis', '处罚依据')
+  .set('penaltyContent', '处罚内容')
+  .set('penaltyDecisionDate', '处罚决定日期')
+  .set('penaltyType', '处罚类型')
+  .set('penaltyTypeExplain', '处罚类型说明')
+  .set('penaltyValidityPeriod', '处罚有效期')
+  .set('suspentionRevocationLicenseNameNumber', '暂扣吊销许可证名称及编号')
+  .set('unifiedSocialCreditCode', '统一社会信用代码')
+  .set('enterpriseName', '企业名称')
+  .set('unifiedSocialCreditCode', '统一社会信用代码')
+  .set('industryCode', '行业代码')
+  .set('executorName', '执行人名称')
+  .set('caseNumber', '案件编号')
+  .set('enforcementCourt', '执行法院')
+  .set('province', '省份')
+  .set('basisUnit', '依据单位')
+  .set('basisDocumentNumber', '依据文书编号')
+  .set('filingTime', '立案时间')
+  .set('legalObligation', '法定履行义务')
+  .set('performanceStatus', '履行状态')
+  .set('dishonestBehavior', '失信行为');

+ 21 - 4
src/components/NewDynamics.vue

@@ -2,17 +2,33 @@
 import { ref } from 'vue'
 import { getNews, type NewsData } from '@/api/home'
 import { queryFieldMethod } from '@/utils/queryFieldMethod'
-import { useRouter } from 'vue-router'
+import { useRoute, useRouter } from 'vue-router'
 
+const props = defineProps({
+  limit:{
+    type:Number,
+    default:5
+  }
+});
 const creditDynamics = ref<NewsData[]>([])
 const router = useRouter()
+const route = useRoute()
 const init = async ()=>{
   //获取信用动态 数据
   const res3 = await getNews(queryFieldMethod('special_column','credit_dynamics'))
   if(res3.code == 200){
-    creditDynamics.value = res3.data.slice(0,5);
+    creditDynamics.value = res3.data.slice(0,props.limit);
   }
 }
+const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  router.push({
+    path:'/creditDynamicsDetail',
+    query:{
+      dickMapKey,
+      dickMapValue
+    }
+  });
+}
 const toDetail = (id:number|undefined)=>{
   if(!id){
     return
@@ -28,11 +44,12 @@ init()
 </script>
 
 <template>
-  <div class="mt-15px bg-white mt-15px">
-    <div class="w-117px border-solid border-#003aac border-b-3px h-32px">
+  <div class="mt-15px bg-white mt-15px min-h-480px relative">
+    <div class="ml-10px w-117px border-solid border-#003aac border-b-3px h-32px">
       <img src="/src/assets/img/小图标1.png" />
       <span class="text-#003aac text-16px font-bold ">最新动态</span>
     </div>
+    <div v-if="route.query.dickMapValue != '最新动态'" class="absolute right-10px top-15px cursor-pointer text-16px text-#006eff" @click="knowMore('credit_dynamics','最新动态')">查看更多></div>
     <div v-for="(item,index) in creditDynamics" :key="index">
       <div class="mt-20px mb-20px">
         <div class="w-266px mr-auto ml-auto line-clamp-2 bold text-13px">{{item.title}}</div>

+ 117 - 0
src/components/base/BaseContainer.vue

@@ -0,0 +1,117 @@
+<script setup lang="ts">import { inject, onMounted, ref, watch } from 'vue'
+import { dialogMap } from '@/components/Map/dialogMap'
+
+interface Props {
+  initAction: Function;
+  confirmAction:Function;
+  openAction:Function;
+  showData:any;
+}
+const isShow = inject('isShow')
+const name = inject('name')
+const props = defineProps<Props>();
+const dialogOverflowVisible = ref<boolean>(isShow as boolean);
+const emits = defineEmits(['closeDialog'])
+const handleClick = (confirm: boolean) => {
+  // 直接调用props.action,并传递dialogOverflowVisible和一个布尔值
+  if(confirm){
+    props.confirmAction.apply(this);
+    dialogOverflowVisible.value = false;
+  }else {
+    dialogOverflowVisible.value = false;
+  }
+};
+const data = ref([])
+watch(() => props.showData, (newValue) => {
+  if(newValue.records){
+    // console.log('这是records类型的详情')
+    // console.log(newValue.records)
+    newValue.records.forEach(item=>{
+      const map = new Map()
+      for (let itemKey in item) {
+        if(itemKey == 'id') continue;
+        if(dialogMap.get(itemKey) == '录入时间'){
+          map.set(dialogMap.get(itemKey),item[itemKey].split('T')[0])
+          continue;
+        }
+        if(dialogMap.get(itemKey) == '统计时间'){
+          map.set(dialogMap.get(itemKey),item[itemKey].split('T')[0])
+          continue;
+        }
+        map.set(dialogMap.get(itemKey),item[itemKey])
+      }
+      data.value.push(map);
+    })
+
+  }
+})
+const clearData = ()=>{
+  emits('closeDialog')
+  data.value = []
+}
+onMounted(()=>{
+  props.initAction.apply()
+})
+</script>
+
+<template>
+  <el-dialog
+    v-model="dialogOverflowVisible"
+    :title="name"
+    width="800"
+    draggable
+    overflow
+    destroy-on-close
+    center
+    @open="props.openAction.apply()"
+    @close="clearData"
+  >
+    <div>
+      <div v-for="(item,index) in data" :key="index" class="h-300px overflow-auto mt-20px">
+        <div v-for="(k,i) in item" :key="i" class="flex border-solid border-2 border-gray p-10px">
+          <div class="w-20%">
+            {{k[0]}}:
+          </div>
+          <div class="w-80%">
+            {{k[1]}}
+          </div>
+        </div>
+      </div>
+    </div>
+    <template #footer>
+      <div class="dialog-footer">
+        <!-- 传递dialogOverflowVisible和false给handleClick -->
+        <el-button @click="handleClick(false)">关闭</el-button>
+        <!-- 传递dialogOverflowVisible和true给handleClick -->
+        <el-button type="primary" @click="handleClick(true)">
+          确认
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<style scoped>
+::-webkit-scrollbar {
+  width: 8px;
+}
+
+::-webkit-scrollbar-track {
+  background-color: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+  background-color: rgba(0, 0, 0, 0.2);
+  border-radius: 4px;
+  border: 1px solid rgba(0, 0, 0, 0.5);
+  background-clip: content-box;
+}
+
+::-webkit-scrollbar-thumb:hover {
+  background-color: rgba(0, 0, 0, 0.4);
+}
+
+::-webkit-scrollbar-button {
+  display: none;
+}
+</style>

+ 7 - 7
src/layout/component/HeadBlock.vue

@@ -28,11 +28,11 @@ const homeImgUrl = ref<string>('');
 const munTabs = ref([
   { title: '首页', route: 'home' },
   { title: '信用动态', route: 'creditDynamics' },
-  { title: '信用企', route: 'creditWiseEnterprise' },
+  { title: '信用企', route: 'creditWiseEnterprise' },
   { title: '信用红榜', route: 'creditEcaluationResults' },
   { title: '信用警示', route: 'creditWarning' },
   { title: '企业自主上报', route: 'creditServices' },
-  { title: '通知公告', route: 'about' }
+  { title: '园区通知公告', route: 'about' }
 ])
 const checkIndex = ()=>{
   const filter = munTabs.value.find(item=> item.title == route.meta.title );
@@ -135,10 +135,10 @@ init()
 </script>
 
 <template>
-  <div class="headContainer w100vw" style="background:url('/首页背景.png')">
+  <div class="headContainer w-99vw" style="background:url('/首页背景.png')">
     <!-- 标题部分登录跳转 -->
     <div class="headTitle">
-      <text>欢迎来到怀化高新区企业信用信息分级分类网</text>
+      <text>欢迎来到怀化高新区企业信用分级分类网</text>
       <div>
         <el-button type="primary" @click="toManager">登录</el-button>
       </div>
@@ -146,7 +146,7 @@ init()
     <!-- 头部功能及其显示内容 -->
     <div class="headModule">
       <div class="h-238px">
-        <h1>怀化高新区企业信用信息分级分类网</h1>
+        <h1>怀化高新区企业信用分级分类网</h1>
 <!--        <h3>www.aabbccd.com</h3>-->
       </div>
       <div class="headSearch">
@@ -187,8 +187,8 @@ init()
     <div v-if="route.meta.title == '首页'">
       <div class="h-100px" >
         <div class="w-912px ml-auto mr-auto text-center mt-21px mb-20px bg-white bg-opacity-90 h-102px cursor-pointer" @click="toDetail(staticNews?.id)">
-          <div class="text-24px font-600 color-black line-height-24px pt-21px pb-10px">{{staticNews?.title}}</div>
-          <div class="mb-17px" v-html="staticNews?.content"></div>
+          <div class="text-26px font-600 color-black line-height-60px pt-21px pb-10px">{{staticNews?.title}}</div>
+          <div class="mb-17px " ></div>
         </div>
       </div>
       <div class="w-912px ml-auto mr-auto  mt-20px pb-54px ">

+ 18 - 2
src/router/route.ts

@@ -28,7 +28,7 @@ export const routes: RouteRecordRaw[] = [
         name: 'creditWiseEnterprise',
         component: () => import('@/views/creditWiseEnterprise/index.vue'),
         meta: {
-          title: '信用企'
+          title: '信用企'
         }
       }, {
         path: '/creditEcaluationResults',
@@ -56,7 +56,7 @@ export const routes: RouteRecordRaw[] = [
         name: 'about',
         component: () => import('@/views/about/index.vue'),
         meta: {
-          title: '通知公告'
+          title: '园区通知公告'
         }
       },
       {
@@ -98,6 +98,22 @@ export const routes: RouteRecordRaw[] = [
         meta:{
           title:'企业列表'
         }
+      },
+      {
+        path:'/complaint',
+        name:'complaint',
+        component:()=>import('@/views/complaint/index.vue'),
+        meta:{
+          title:'投诉'
+        }
+      },
+      {
+        path:'/message',
+        name:'message',
+        component:()=>import('@/views/message/index.vue'),
+        meta:{
+          title:'留言'
+        }
       }
     ]
   }

+ 33 - 1
src/utils/queryFieldMethod.ts

@@ -7,6 +7,10 @@ export const queryFieldMethod = (columnName:string,queryStr:string)=>{
       type:'eq',
       value:queryStr
     });
+    conditionJsonWhole.push({
+      column:'date',
+      type:'orderByDesc'
+    });
   }
 
   const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
@@ -15,7 +19,7 @@ export const queryFieldMethod = (columnName:string,queryStr:string)=>{
   })
 }
 
-export const queryLikeFieldMethod = (columnName:string,queryStr:string,pageNum:number,pageSize:number)=>{
+export const queryLikeFieldMethod = (columnName:string,queryStr:string,pageNum:number,pageSize:number,needOrder:boolean = true)=>{
   const conditionJsonWhole:any[] = [];
   if(queryStr != ''){
     if(queryStr == null) queryStr = '';
@@ -24,6 +28,34 @@ export const queryLikeFieldMethod = (columnName:string,queryStr:string,pageNum:n
       type:'like',
       value:queryStr
     });
+    if(needOrder){
+      conditionJsonWhole.push({
+        column:'date',
+        type:'orderByDesc'
+      });
+    }
+  }
+
+  const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
+  return ({
+    conditionJson:s,
+    pageNum,
+    pageSize
+  })
+}
+export const queryEqFieldMethod = (columnName:string,queryStr:string,pageNum:number,pageSize:number)=>{
+  const conditionJsonWhole:any[] = [];
+  if(queryStr != ''){
+    if(queryStr == null) queryStr = '';
+    conditionJsonWhole.push({
+      column:columnName,
+      type:'eq',
+      value:queryStr
+    });
+    conditionJsonWhole.push({
+      column:'date',
+      type:'orderByDesc'
+    });
   }
 
   const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));

+ 1 - 0
src/utils/request.ts

@@ -154,6 +154,7 @@ export async function downloadFile(url:string, fileName:string) {
     link.remove(); // 移除创建的a标签
   } catch (error) {
     console.error('下载文件时出错:', error);
+    ElMessage.error('下载文件时出错');
   }
 }
 

+ 145 - 172
src/views/HomeView/index.vue

@@ -1,10 +1,13 @@
 <script setup lang="ts">
 import { useRouter } from 'vue-router'
 import { get1, get2, get3, get4, getDick, getNews, type NewsData, type NewsResponseData } from '@/api/home'
-import { ref } from 'vue'
+import { provide, ref } from 'vue'
 import { getFileExtension } from '@/utils/getFileExtension'
 import { queryFieldMethod } from '@/utils/queryFieldMethod'
 import { formatTime } from '../../utils/formatTime'
+import CompanyDetailSmallBox from '@/components/CompanyDetailSmallBox.vue'
+import Link1 from '@/components/Link1.vue'
+import Link2 from '@/components/Link2.vue'
 
 let router = useRouter()
 
@@ -19,40 +22,21 @@ const toDetail = (id:number|undefined)=>{
     }
   })
 }
-const toLink = (index:number)=>{
-  if(index == 1){
-    window.open("http://hntzxm.fgw.hunan.gov.cn/home")
-  }else if(index == 2){
-    window.open("http://220.168.30.70:28889/portal_v2.jsp")
-  }else if(index == 3){
-    window.open("https://222.244.103.250:8181/pmp/a/login;jsessionid=fa168d5f90a3ed7b76a9bd5f2442#")
-  }
-}
-const toOrtherLink = (index:number)=>{
-  if(index == 1){
-    window.open("https://credit.fgw.hunan.gov.cn/xyd/feature")
-  }else if(index == 2){
-    window.open("https://smecmd.hunanfae.com/main/cms/static/html/loan.html")
-  }else if(index == 3){
-    window.open("https://credit.fgw.hunan.gov.cn/xyd/financeMarketDetail?id=414&isShow=ck")
-  }else if(index == 4){
-    window.open('https://credit.fgw.hunan.gov.cn/xyd/financeMarketDetail?id=26&isShow=ck')
-  }
-}
 const toLink1 = ()=>{
   window.open("https://www.hhjrfw.com/")
 }
 const toLink2 = ()=>{
   window.open("https://credit.fgw.hunan.gov.cn/xyd/provincialIndex")
 }
-const financialData = ref<NewsData[]>([])
-const financingLoans = ref<NewsData[]>([])
+// const financialData = ref<NewsData[]>([])
+// const financingLoans = ref<NewsData[]>([])
 const creditDynamics = ref<NewsData[]>([])
 const dickMapAll = ref<Map<string,string>>(new Map());
 const data1 = ref();
 const data2 = ref();
 const data3 = ref();
 const data4 = ref();
+const companyDetailIsShow = ref(false);
 const init =async ()=>{
   const {data} = await getDick()
   const dickMap = data.reduce((acc:Map<string,string>, cur:{dictLabel:string,dictValue:string}) => {
@@ -63,32 +47,32 @@ const init =async ()=>{
   dickMapAll.value = dickMap
   console.log(dickMap)
   //获取政府项目资金需求 数据
-  const res1 = await getNews(queryFieldMethod('special_column',dickMap.get('政府项目资金需求')))
-  if(res1.code == 200){
-    financialData.value = res1.data.slice(0,5);
-  }
+  // const res1 = await getNews(queryFieldMethod('special_column',dickMap.get('政府项目资金需求')))
+  // if(res1.code == 200){
+  //   financialData.value = res1.data.slice(0,5);
+  // }
   //获取园区企业融资贷款 数据
-  const res2 = await getNews(queryFieldMethod('special_column',dickMap.get('园区企业融资贷款')))
-  if(res2.code == 200){
-    financingLoans.value = res2.data.slice(0,5);
-  }
-  //获取信用动态 数据
-  const res3 = await getNews(queryFieldMethod('special_column',dickMap.get('信用动态')))
+  // const res2 = await getNews(queryFieldMethod('special_column',dickMap.get('园区企业融资贷款')))
+  // if(res2.code == 200){
+  //   financingLoans.value = res2.data.slice(0,5);
+  // }
+  //获取通知公告数据
+  const res3 = await getNews(queryFieldMethod('special_column',dickMap.get('通知公告')))
   if(res3.code == 200){
-    creditDynamics.value = res3.data.slice(0,5);
+    creditDynamics.value = res3.data;
   }
   //获取行政许可 数据
-  const res4 = await get1({pageNum:1,pageSize:4})
-  data1.value = res4.records.slice(0,4);
+  const res4 = await get1({pageNum:1,pageSize:6})
+  data1.value = res4.records.slice(0,6);
   //获取行政处罚 数据
-  const res5 = await get2({pageNum:1,pageSize:4})
-  data2.value = res5.records.slice(0,4);
+  const res5 = await get2({pageNum:1,pageSize:6})
+  data2.value = res5.records.slice(0,6);
   //获取守信红名单 数据
-  const res6 = await get3({pageNum:1,pageSize:4})
-  data3.value = res6.records.slice(0,4);
+  const res6 = await get3({pageNum:1,pageSize:6})
+  data3.value = res6.records.slice(0,6);
   //获取失信黑名单 数据
-  const res7 = await get4({pageNum:1,pageSize:4})
-  data4.value = res7.data.result.slice(0,4);
+  const res7 = await get4({pageNum:1,pageSize:6})
+  data4.value = res7.records.slice(0,6);
 }
 const toCompanyList = (n:number)=>{
   router.push({
@@ -99,190 +83,156 @@ const toCompanyList = (n:number)=>{
   })
 
 }
-const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
-  console.log(dickMapKey)
-  router.push({
-    path:'/creditDynamicsDetail',
-    query:{
-      dickMapKey,
-      dickMapValue
-    }
-  });
+const dialogName = ref('')
+const showConpanyDetail = (item:any,method:Function,name:string)=>{
+  toCompanyDetailItem.value = item;
+  toCompanyDetailItemMethod.value = method;
+  dialogName.value = name
+  companyDetailIsShow.value = true
+}
+const toCompanyDetailItem = ref();
+const toCompanyDetailItemMethod = ref();
+const closeDialog = ()=>{
+  toCompanyDetailItem.value = null;
+}
+
+provide('isShow',companyDetailIsShow)
+provide('name',dialogName)
+const complaint = ()=>{
+  router.push('/complaint')
+}
+const leaveMessage = ()=>{
+  router.push('/message')
 }
 init()
 </script>
 
 <template>
-    <div class="homeContainer">
+    <div class="homeContainer relative">
+<!--      <div class="fixed right-0px top-10vh w-200px h-500px bg-white flex flex-col">-->
+<!--        <div class="w-100% h-50% bg-gray cursor-pointer" @click="leaveMessage">-->
+<!--          留言-->
+<!--        </div>-->
+<!--        <div class="w-100% h-50% bg-red cursor-pointer" @click="complaint">-->
+<!--          投诉信息-->
+<!--        </div>-->
+<!--      </div>-->
       <div class="w-100px h-25px"></div>
-      <div class="w-912px ml-auto mr-auto mt-20px mb-20px bg-white">
-        <div class="w-912px text-16px mt-12px mb-10px line-height-44px border-dashed border-#e5e5e5 border-b-5px">
-          <div class="w-120px border-solid border-#00306e border-b-5px relative">
-            <img class="w-21px h-21px m-3px " src="/src/assets/img/信用小图标.png" />
-            <span class="color-#003aac text-16px">信用动态</span>
-            <span class="absolute right--775px top-3px cursor-pointer text-#959595" @click="knowMore(dickMapAll.get('信用动态'),'信用动态')">查看更多 ></span>
+      <div class="w-912px ml-a mr-a flex flex-wrap relative">
+        <div class="absolute left--185px top-0px w-170px h-210px bg-white" >
+          <div class="mt-20px text-blue text-20px font-bold text-center relative">
+            <div class="w-20px h-20px absolute left-23px top-1px"><img class="w-100% h-100%" src="/static/img1.png" /></div>
+            留言咨询
           </div>
+          <div class="bg-blue h-2px w-80% mr-a ml-a"></div>
+          <div class="p-10px pt-20px text-13px line-height-20px pb-50px">你可以通过本平台网站,向管委会和业务主管部门留言和咨询业务</div>
+          <div class="bg-blue text-center text-white w-80% mr-a ml-a line-height-30px h-30px rounded-10px cursor-pointer hover:op-70" @click="leaveMessage">进入</div>
         </div>
-        <div class="w-100%">
-          <div v-for="(item,index) in creditDynamics" :key="index" @click="toDetail(item.id)" class="cursor-pointer">
-            <div class="flex justify-between">
-              <div class="mt-24px ml-24px color-black flex">
-                <div class="text-16px mr-10px">{{item.title}}</div>
-                <!--                <div class="text-13px rounded-5 p-3px border-solid border-1px border-#ff9900 color-#ff9900 ">文本服务</div>-->
-              </div>
-              <div class="color-#858585 text-13px pt-23px mr-24px">{{item.dataSource}}|{{formatTime(item.date)}}</div>
-            </div>
-            <div class="mt-13px w-864px ml-auto mr-auto line-clamp-3 text-13px line-height-23px" v-html="item.content"></div>
-            <div class="h-1px bg-#e9e9e9 mt-20px"></div>
+        <div class="absolute right--185px top-0px w-170px h-210px bg-white" >
+          <div class="mt-20px text-blue text-20px font-bold text-center relative">
+            <div class="w-20px h-20px absolute left-8px top-0px"><img class="w-100% h-100%" src="/static/img2.png" /></div>
+            &nbsp;&nbsp;失信违约投诉
           </div>
+          <div class="bg-blue h-2px w-90% mr-a ml-a"></div>
+          <div class="p-10px pt-20px text-13px line-height-20px pb-30px">你可以通过本平台的网站对失信违约行为予以投诉,您的个人信息将予以严格保密</div>
+          <div class="bg-blue text-center text-white w-80% mr-a ml-a line-height-30px h-30px rounded-10px cursor-pointer hover:op-70" @click="complaint">进入</div>
         </div>
-      </div>
-      <div class="w-912px ml-a mr-a flex flex-wrap">
-        <div class="w-451px bg-white mb-20px mr-10px">
+        <div class="w-451px h-256px bg-white mb-20px mr-10px">
           <div class="h-4px bg-blue"></div>
           <div class=" flex justify-between">
-            <div class="text-26px h-34px line-height-34px">行政许可</div>
-            <div class="text-13px h-20px line-height-30px cursor-pointer" @click="toCompanyList(1)">查看更多 >></div>
+            <div class="flex">
+              <div class="w-30px h-30px"><img class="w-100% h-100%" src="/static/icon1.png" /></div>
+              <div class="text-26px h-34px line-height-34px text-[#ff0000ff] font-550">守信红名单</div>
+            </div>
+            <div class="text-13px h-20px line-height-30px cursor-pointer" @click="toCompanyList(3)">查看更多 >></div>
           </div>
           <div class="h-2px bg-blue"></div>
-          <div class="p-10px flex justify-between" v-for="(item,index) in data1" :key="index">
-            <div>{{item.administrativePartyName}}</div>
-            <div>{{item.licenseDecisionDate}}</div>
+          <div class="p-10px flex justify-between cursor-pointer" v-for="(item,index) in data3" :key="index" @click="showConpanyDetail(item,get3,'守信红名单')">
+            <div>{{ item.subjectName }}</div>
+            <div>{{item.statisticsTime.split('T')[0]}}</div>
           </div>
         </div>
-        <div class="w-451px bg-white mb-20px">
+        <div class="w-451px h-256px bg-white mb-20px">
           <div class="h-4px bg-blue"></div>
           <div class=" flex justify-between">
-            <div class="text-26px h-34px line-height-34px">行政处罚</div>
-            <div class="text-13px h-20px line-height-30px cursor-pointer" @click="toCompanyList(2)">查看更多 >></div>
+            <div class="flex">
+              <div class="w-30px h-30px"><img class="w-100% h-100%" src="/static/icon3.png" /></div>
+              <div class="text-26px h-34px line-height-34px text-[#ff0000ff] font-550">行政许可</div>
+            </div>
+            <div class="text-13px h-20px line-height-30px cursor-pointer" @click="toCompanyList(1)">查看更多 >></div>
           </div>
           <div class="h-2px bg-blue"></div>
-          <div class="p-10px flex justify-between" v-for="(item,index) in data2" :key="index">
+          <div class="p-10px flex justify-between cursor-pointer" v-for="(item,index) in data1" :key="index" @click="showConpanyDetail(item,get1,'行政许可')">
             <div>{{item.administrativePartyName}}</div>
-            {{item.penaltyDecisionDate.split('T')[0]}}
+            <div>{{item.licenseDecisionDate}}</div>
           </div>
         </div>
-        <div class="w-451px bg-white mb-20px mr-10px">
+        <div class="w-451px h-256px bg-white mb-20px mr-10px">
           <div class="h-4px bg-blue"></div>
           <div class=" flex justify-between">
-            <div class="text-26px h-34px line-height-34px">守信红名单</div>
-            <div class="text-13px h-20px line-height-30px cursor-pointer" @click="toCompanyList(3)">查看更多 >></div>
+            <div class="flex">
+              <div class="w-30px h-30px"><img class="w-100% h-100%" src="/static/icon4.png" /></div>
+              <div class="text-26px h-34px line-height-34px text-[#000000ff] font-550">行政处罚</div>
+            </div>
+            <div class="text-13px h-20px line-height-30px cursor-pointer" @click="toCompanyList(2)">查看更多 >></div>
           </div>
           <div class="h-2px bg-blue"></div>
-          <div class="p-10px flex justify-between" v-for="(item,index) in data3" :key="index">
-            <div>{{ item.subjectName }}</div>
-            <div>{{item.statisticsTime.split('T')[0]}}</div>
+          <div class="p-10px flex justify-between cursor-pointer" v-for="(item,index) in data2" :key="index" @click="showConpanyDetail(item,get2,'行政处罚')">
+            <div>{{item.administrativePartyName}}</div>
+            {{item.penaltyDecisionDate.split('T')[0]}}
           </div>
         </div>
-        <div class="w-451px bg-white mb-20px">
+
+        <div class="w-451px h-256px bg-white mb-20px">
           <div class="h-4px bg-blue"></div>
           <div class=" flex justify-between">
-            <div class="text-26px h-34px line-height-34px">失信黑名单</div>
+            <div class="flex">
+              <div class="w-30px h-30px"><img class="w-100% h-100%" src="/static/icon2.png" /></div>
+              <div class="text-26px h-34px line-height-34px text-[#000000ff] font-550">信用警示名单</div>
+            </div>
             <div class="text-13px h-20px line-height-30px cursor-pointer" @click="toCompanyList(4)" v-if="data4 != 0">查看更多 >></div>
           </div>
           <div class="h-2px bg-blue"></div>
           <div>
-            <div class="p-10px flex justify-between" v-for="(item,index) in data4" :key="index">
+            <div class="p-10px flex justify-between cursor-pointer" v-for="(item,index) in data4" :key="index" @click="showConpanyDetail(item,get4,'行政处罚')">
               <div>{{item.enterpriseName}}</div>
+              {{item.filingTime.split('T')[0]}}
             </div>
           </div>
         </div>
       </div>
-      <div class="w-912px h-100px mr-a ml-a bg-white mt-10px bg-cover text-50px blod text-center line-height-90px cursor-pointer mb-25px hover:scale-120 duration-200" @click="toLink2">
+      <div style="background-image:url(/bg1.jpg);" class="w-912px h-100px mr-a ml-a text-white  bg-white mt-10px bg-cover text-50px blod text-center line-height-90px cursor-pointer mb-25px hover:scale-120 duration-200" @click="toLink2">
         湖南省企业融资综合信用服务平台
       </div>
-      <div class="w-912px h-100px mr-a ml-a bg-white mt-10px bg-cover text-50px blod text-center line-height-90px cursor-pointer mb-25px hover:scale-120 duration-200" @click="toLink1">
+      <div style="background-image:url(/bg2.jpg);" class="w-912px h-100px mr-a ml-a  text-white bg-white mt-10px bg-cover text-50px blod text-center line-height-90px cursor-pointer mb-25px hover:scale-120 duration-200" @click="toLink1">
         怀化市综合金融服务平台
       </div>
-      <div>
-        <div class="w-912px bg-white ml-a mr-a text-16px pt-12px mb-10px line-height-44px border-dashed border-#e5e5e5 border-b-5px">
-          <div class="w-240px border-solid border-#00306e border-b-5px relative">
+      <Link1></Link1>
+      <Link2></Link2>
+      <div class="w-912px ml-auto mr-auto mt-20px mb-20px bg-white">
+        <div class="w-912px text-16px mt-12px mb-10px line-height-44px border-dashed border-#e5e5e5 border-b-5px">
+          <div class="w-140px border-solid border-#00306e border-b-5px relative">
             <img class="w-21px h-21px m-3px " src="/src/assets/img/信用小图标.png" />
-            <span class="color-#003aac text-16px">政府项目资金需求发布及链接</span>
-            <span class="absolute right--650px top-10px cursor-pointer text-#959595" @click="knowMore(dickMapAll.get('政府项目资金需求'),'政府项目资金需求')">查看更多 ></span>
-          </div>
-          <div v-for="(item,index) in financialData" :key="index">
-            <div class="flex justify-between">
-              <div class="ml-20px cursor-pointer" @click="toDetail(item.id)">{{item.title}}</div>
-              <div class="color-gray mr-20px text-14px">
-                <span>数据来源:{{item.dataSource}}</span>
-                <span>|</span>
-                <span>{{formatTime(item.date)}}</span>
-              </div>
-            </div>
-            <div class="h-1px bg-gray"></div>
-          </div>
-        </div>
-        <div>
-          <div class="w-912px ml-auto mr-auto flex flex-wrap justify-between bg-white">
-            <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(1)">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省发改委项目审批</div>
-            </div>
-            <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(2)">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省财政厅项目资金管理</div>
-            </div>
-            <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(3)">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省工信厅项目管理</div>
-            </div>
-            <div class="w-174px h-116px mr-10px relative">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">待开发</div>
-            </div>
-            <div class="w-174px h-116px relative">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">待开发</div>
-            </div>
+            <span class="color-#003aac text-16px">园区动态通告</span>
+            <span class="absolute right--775px top-3px cursor-pointer text-#959595" @click="$router.push('/about')">查看更多 ></span>
           </div>
         </div>
-      </div>
-      <div>
-        <div class="w-912px bg-white ml-a mr-a text-16px mt-12px mb-10px line-height-44px border-dashed border-#e5e5e5 border-b-5px">
-          <div class="w-240px border-solid border-#00306e border-b-5px relative">
-            <img class="w-21px h-21px m-3px " src="/src/assets/img/信用小图标.png" />
-            <span class="color-#003aac text-16px">园区企业融资贷款</span>
-            <span class="absolute right--650px top-10px cursor-pointer text-#959595" @click="knowMore(dickMapAll.get('园区企业融资贷款'),'园区企业融资贷款')">查看更多 ></span>
-          </div>
-          <div v-for="(item,index) in financingLoans" :key="index">
+        <div class="w-100% overflow-auto h-500px">
+          <div v-for="(item,index) in creditDynamics" :key="index" @click="toDetail(item.id)" class="cursor-pointer">
             <div class="flex justify-between">
-              <div class="ml-20px cursor-pointer" @click="toDetail(item.id)">{{item.title}}</div>
-              <div class="color-gray mr-20px text-14px">
-                <span>数据来源:{{item.dataSource}}</span>
-                <span>|</span>
-                <span>{{formatTime(item.date)}}</span>
+              <div class="mt-24px ml-24px color-black flex">
+                <div class="text-16px mr-10px">{{item.title}}</div>
+                <!--                <div class="text-13px rounded-5 p-3px border-solid border-1px border-#ff9900 color-#ff9900 ">文本服务</div>-->
               </div>
+              <div class="color-#858585 text-13px pt-23px mr-24px">{{item.dataSource}}|{{formatTime(item.date)}}</div>
             </div>
-            <div class="h-1px bg-gray"></div>
-          </div>
-        </div>
-        <div>
-          <div class="w-912px ml-auto mr-auto flex flex-wrap justify-between bg-white">
-            <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(1)">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">制造业中长期贷款</div>
-            </div>
-            <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(2)">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">潇湘财银贷</div>
-            </div>
-            <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(3)">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">农业银行流水贷</div>
-            </div>
-            <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(4)">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南银行流水贷</div>
-            </div>
-            <div class="w-174px h-116px relative cursor-pointer" @click="toOrtherLink(5)">
-              <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-              <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">待开发</div>
-            </div>
+            <div class="mt-13px w-864px ml-auto mr-auto line-clamp-3 text-13px line-height-23px" v-html="item.content"></div>
+            <div class="h-1px bg-#e9e9e9 mt-20px"></div>
           </div>
         </div>
       </div>
       <div class="h-20px "></div>
+      <company-detail-small-box @closeDialog="closeDialog" :item="toCompanyDetailItem" :getItemDetailMethod="toCompanyDetailItemMethod" />
     </div>
 </template>
 
@@ -290,4 +240,27 @@ init()
 .homeContainer{
   background-color: #ecf0f9;
 }
+::-webkit-scrollbar {
+  width: 8px;
+}
+
+::-webkit-scrollbar-track {
+  background-color: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+  background-color: rgba(0, 0, 0, 0.2);
+  border-radius: 4px;
+  border: 1px solid rgba(0, 0, 0, 0.5);
+  background-clip: content-box;
+}
+
+::-webkit-scrollbar-thumb:hover {
+  background-color: rgba(0, 0, 0, 0.4);
+}
+
+::-webkit-scrollbar-button {
+  display: none;
+}
+
 </style>

+ 2 - 2
src/views/about/index.vue

@@ -13,7 +13,7 @@ const init = async ()=>{
   const res = await getNews(queryFieldMethod('special_column','notification_announcement'))
   if(res.code == 200){
     aboutList.value = res.data
-    console.log(aboutList.value)
+    // console.log(aboutList.value)
   }
 }
 const toDetail = (id:number|undefined)=>{
@@ -40,7 +40,7 @@ init();
       <div class="w-603px pl-24px pr-24px pt-30px text-black bg-white">
         <div v-for="(item,index) in aboutList" :key="index" @click="toDetail(item.id)" class="cursor-pointer">
           <div class="text-16px">{{item.title}}</div>
-          <div class="text-13px line-height-23x text-#464646 line-clamp-4 mt-8px" v-html="item.content">
+          <div class="text-12px line-height-20px text-#464646 line-clamp-4 mt-8px " v-html="item.content">
           </div>
           <div class="flex justify-between">
             <div class="mt-15px text-#858585 text-13px">

+ 11 - 4
src/views/companyDetail/index.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import { useRoute, useRouter } from 'vue-router'
-import { getCompanyDetailById } from '@/views/companyDetail/type'
+import { getCompanyByUniCode, getCompanyDetailById } from '@/views/companyDetail/type'
 import { companyDetailMap } from '@/views/companyDetail/map'
 import { ref } from 'vue'
 
@@ -9,11 +9,18 @@ const route = useRoute()
 const showCurrentCompanyDetail = ref<Map<string,string>>(new Map());
 const init =async ()=>{
   const res = await getCompanyDetailById(route.query.id as string);
-  console.log(res.data)
-  console.log(companyDetailMap)
+  const res2 = await getCompanyByUniCode(res.data.unifiedSocialCreditCode);
+  console.log(res.data,1232131221321)
+  // console.log(companyDetailMap)
+  res.data.legalRepresentativeId = res.data.legalRepresentativeId.replace(/(\d{4})\d{10}(\d{4})/, "$1******$2");
+  res.data.contactPhone = res.data.contactPhone.replace(/(\d{3})\d{4}(\d{4})/, "$1******$2");
+  res.data.enterprisePhone = res.data.enterprisePhone.length === 11 ? res.data.enterprisePhone.replace(/(\d{3})\d{4}(\d{4})/, "$1******$2") : res.data.enterprisePhone;
+  res.data.score = res2.data.result[0].total;
+  res.data.grade = res2.data.result[0].grade;
   companyDetailMap.forEach((value,key)=>{
     showCurrentCompanyDetail.value.set(value,res.data[key]);
   })
+
 }
 init()
 </script>
@@ -21,7 +28,7 @@ init()
 <template>
  <div class="companyDetailContainer">
    <div class="w-912px ml-auto mr-auto pt-20px pb-20px text-14px">
-     你所在的位置:<span class="cursor-pointer" @click="router.push('/home')">首页</span> > <span class="color-#006eff">公司详情</span>
+     你所在的位置:<span class="cursor-pointer" @click="router.push('/home')">首页</span> > <span class="color-#006eff">详细信息</span>
    </div>
    <div class="grid grid-cols-2 gap-x-10px w-912px ml-a mr-a bg-white">
     <div v-for="(item,index) in showCurrentCompanyDetail" :key="index" class="flex">

+ 9 - 7
src/views/companyDetail/map/index.ts

@@ -1,20 +1,21 @@
 export const companyDetailMap = new Map<string,string>();
 // 添加键值对到映射中
+companyDetailMap.set('enterpriseName', '企业名称');
+companyDetailMap.set('unifiedSocialCreditCode', '统一社会信用代码');
+companyDetailMap.set('legalRepresentative', '法定代表人');
+companyDetailMap.set('legalRepresentativeId', '法定代表人身份证号');
 companyDetailMap.set('address', '注册地址');
 companyDetailMap.set('approvalTime', '批准时间');
 companyDetailMap.set('businessPeriod', '营业期限');
 companyDetailMap.set('businessScope', '经营范围');
-companyDetailMap.set('cancellationTime', '注销时间');
+// companyDetailMap.set('cancellationTime', '注销时间');
 companyDetailMap.set('contactName', '联系人姓名');
 companyDetailMap.set('contactPhone', '联系电话');
-companyDetailMap.set('enterpriseName', '企业名称');
 companyDetailMap.set('enterprisePhone', '企业电话');
 companyDetailMap.set('enterpriseType', '企业类型');
 companyDetailMap.set('establishmentDate', '成立日期');
-companyDetailMap.set('id', '企业ID');
+// companyDetailMap.set('id', '企业ID');
 companyDetailMap.set('industryCode', '行业代码');
-companyDetailMap.set('legalRepresentative', '法定代表人');
-companyDetailMap.set('legalRepresentativeId', '法定代表人身份证号');
 companyDetailMap.set('paidInCapital', '实收资本');
 companyDetailMap.set('postalCode', '邮政编码');
 companyDetailMap.set('registerNumber', '注册号');
@@ -23,6 +24,7 @@ companyDetailMap.set('registrationAuthority', '注册机关');
 companyDetailMap.set('registrationCategory', '注册类别');
 companyDetailMap.set('status', '经营状态');
 companyDetailMap.set('supervisoryAuthority', '监管机构');
-companyDetailMap.set('unifiedSocialCreditCode', '统一社会信用代码');
+companyDetailMap.set('score', '得分');
+companyDetailMap.set('grade', '信用等级');
 
-console.log(companyDetailMap);
+// console.log(companyDetailMap);

+ 14 - 0
src/views/companyDetail/type/index.ts

@@ -1,7 +1,9 @@
 import request from '@/utils/request'
+import type { CompanyListDataType } from '@/views/creditEcaluationResults/type'
 
 enum API{
   GET_COMPANY_DETAIL_BY_ID = '/crmBusinessLicenseInformation/getById/',
+  GET_COMPANY_DETAIL = '/crmHighTechZoneEnterprises/getCreditScoreList'
 }
 
 export interface companyDetailDataType{
@@ -29,6 +31,8 @@ export interface companyDetailDataType{
   status: string;
   supervisoryAuthority: string;
   unifiedSocialCreditCode: string;
+  score?: number;
+  grade?: string;
   [key: string]: any
 }
 
@@ -38,4 +42,14 @@ export interface companyDetailRes extends AxiosResponse{
 
 export const getCompanyDetailById = (id:string)=> {
   return request.get<any,companyDetailRes>(API.GET_COMPANY_DETAIL_BY_ID+id);
+}
+
+export const getCompanyByUniCode = (unicode:string)=>{
+  return request.get<any,CompanyListDataType>(API.GET_COMPANY_DETAIL,{
+    params:{
+      pageNum:1,
+      pageSize:1,
+      unifiedSocialCreditCode:unicode
+    }
+  });
 }

+ 38 - 4
src/views/companyList/index.vue

@@ -1,7 +1,8 @@
 <script setup lang="ts">
 import { type LocationQueryValue, useRoute } from 'vue-router'
 import { get1, get2, get3, get4 } from '@/api/home'
-import {ref} from 'vue'
+import { provide, ref } from 'vue'
+import CompanyDetailSmallBox from '@/components/CompanyDetailSmallBox.vue'
 const route = useRoute()
 const k:any = route.query.n
 const currentShowList = ref<any>([]);
@@ -22,6 +23,7 @@ const getData =async ()=>{
       return ({
         name: item.administrativePartyName,
         time: item.licenseDecisionDate,
+        unifiedSocialCreditCode:item.unifiedSocialCreditCode
       })
     })
     currentShowList.value = result;
@@ -32,6 +34,7 @@ const getData =async ()=>{
       return ({
         name: item.administrativePartyName,
         time: item.penaltyDecisionDate.split('T')[0],
+        unifiedSocialCreditCode:item.unifiedSocialCreditCode
       })
     })
     currentShowList.value = result;
@@ -42,16 +45,19 @@ const getData =async ()=>{
       return ({
         name: item.subjectName,
         time: item.statisticsTime.split('T')[0],
+        unifiedSocialCreditCode:item.unifiedSocialCreditCode
       })
     })
     currentShowList.value = result;
   }else if(k == 4){
     const res4:any = await get4({pageNum:1,pageSize:1000});
-    const bo = removeDuplicatesById(res4.data.result, 'enterpriseName')
+    const bo = removeDuplicatesById(res4.records, 'enterpriseName')
     console.log(bo)
     const result = bo.map((item:any)=>{
       return ({
-        name: item.enterpriseName
+        name: item.enterpriseName,
+        time:item.filingTime.split('T')[0],
+        unifiedSocialCreditCode:item.unifiedSocialCreditCode
       })
     })
     currentShowList.value = result;
@@ -60,13 +66,40 @@ const getData =async ()=>{
 const init = () => {
   getData();
 }
+const showConpanyDetail = (item:any)=>{
+  if(k == 1){
+    toCompanyDetailItemMethod.value = get1;
+    dialogName.value = '行政许可'
+  }else if(k == 2){
+    toCompanyDetailItemMethod.value = get2;
+    dialogName.value = '行政处罚'
+  }else if(k == 3){
+    toCompanyDetailItemMethod.value = get3;
+    dialogName.value = '守信红名单'
+  }else if(k == 4){
+    toCompanyDetailItemMethod.value = get4;
+    dialogName.value = '失信企业'
+  }
+  toCompanyDetailItem.value = item;
+
+  companyDetailIsShow.value = true
+}
+const companyDetailIsShow = ref(false);
+const toCompanyDetailItem = ref();
+const toCompanyDetailItemMethod = ref();
+const closeDialog = ()=>{
+  toCompanyDetailItem.value = null;
+}
+const dialogName = ref('')
+provide('isShow',companyDetailIsShow)
+provide('name',dialogName)
 init();
 </script>
 
 <template>
   <div class="conpanyListContainer pt-20px">
     <div class="w-912px bg-white mr-a ml-a pt-20px border-solid border-1px border-color-#e6e6e6 rounded-10px">
-      <div v-for="(item,index) in currentShowList" :key="index">
+      <div v-for="(item,index) in currentShowList" :key="index" @click="showConpanyDetail(item)" class="cursor-pointer">
         <div class="text-20px p-20px flex justify-between">
           <div>{{item.name}}</div>
           <div class="text-gray text-20px">{{item.time}}</div>
@@ -74,6 +107,7 @@ init();
         <div class="h-1px bg-gray"></div>
       </div>
     </div>
+    <company-detail-small-box @closeDialog="closeDialog" :item="toCompanyDetailItem" :getItemDetailMethod="toCompanyDetailItemMethod" />
   </div>
 </template>
 

+ 193 - 0
src/views/complaint/index.vue

@@ -0,0 +1,193 @@
+<script setup lang="ts">
+import { reactive, ref, toRaw } from 'vue'
+import { ElMessage, type FormProps, type UploadFile, type FormRules, type FormInstance } from 'element-plus'
+import { type complaintData, delFileById, getDict, saveComplaint } from '@/views/complaint/type'
+
+const labelPosition = ref<FormProps['labelPosition']>('right')
+const fileList = ref([])
+const complaintFormRef = ref<FormInstance>();
+const dickArr = ref<any>([]);
+const dickMap = new Map();
+const complaintForm = reactive<complaintData>({
+  name: '',
+  phone: '',
+  remark: '',
+  title: '',
+  type: '',
+  content:'',
+  unifiedSocialCreditCode:'',
+  enterpriseName:'',
+  files:[],
+  card:''
+})
+const upload = reactive<any>({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: '',
+  // 是否禁用上传
+  isUploading: false,
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_URL + '/commonFile/uploadFile',
+})
+const handleRemove =async (file:any)=>{
+  const res = await delFileById(file.response.data.id);
+  if(res.code == 200){
+    ElMessage.success('删除成功')
+    complaintForm.files = complaintForm.files.filter(item=>item.id != file.response.data.id)
+  }
+}
+const handleSuccess = (res:any)=>{
+  complaintForm.files.push(res.data)
+  if(res.code == 200){
+    ElMessage.success('上传成功')
+  }
+}
+const uploadComplaint = (formEl: FormInstance | undefined)=>{
+  if (!formEl) return
+  formEl.validate(async (valid) => {
+    if (valid) {
+      const res = await saveComplaint(toRaw(complaintForm));
+      if(res.code == 200){
+        ElMessage.success(res.msg)
+        complaintFormRef.value?.resetFields()
+      }
+    }
+  })
+}
+const rules = reactive<FormRules>({
+  type: [
+    { required: true, message: '请选择投诉类型', trigger: 'change' },
+  ],
+  title:[
+    { required: true, message: '请输入投诉标题', trigger: 'blur' }
+  ],
+  name: [
+    { required: true, message: '请输入姓名', trigger: 'blur' },
+    { min: 2, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' },
+  ],
+  enterpriseName:[
+    { required: true, message: '请输入企业名称', trigger: 'blur' }
+  ],
+  unifiedSocialCreditCode:[
+    { required: true, message: '请输入统一社会信用代码', trigger: 'blur' },
+    { min: 15, max: 18, message: '长度在 15-18 个字符', trigger: 'blur' },
+  ],
+  content:[
+    { required: true, message: '请输入投诉内容', trigger: 'blur' }
+  ],
+  card:[
+    { required: true, message: '请输入身份证号', trigger: 'blur' },
+    {
+      pattern: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,
+      message: '请输入正确的身份证号',
+      trigger: 'blur',
+    },
+  ],
+  phone: [
+    { required: true, message: '请输入手机号', trigger: 'blur' },
+    {
+      pattern: /^1[3-9]\d{9}$/,
+      message: '请输入正确的手机号',
+      trigger: 'blur',
+    },
+  ],
+})
+const resetForm = (formEl: FormInstance | undefined)=>{
+  if (!formEl) return
+  formEl.resetFields()
+}
+const init =async ()=>{
+  let res = await getDict('crm_complaint_category');
+  dickArr.value = res.data;
+  dickArr.value.forEach((item:any)=>{
+    let k = item.dictValue;
+    let v = item.dictLabel;
+    dickMap.set(k,v)
+  })
+}
+init();
+
+</script>
+
+<template>
+  <div class="complaintContainer pb-30px">
+    <div class="w-912px mr-a ml-a">
+<!--      <el-radio-group v-model="labelPosition" aria-label="label position">-->
+<!--        <el-radio-button value="left">Left</el-radio-button>-->
+<!--        <el-radio-button value="right">Right</el-radio-button>-->
+<!--        <el-radio-button value="top">Top</el-radio-button>-->
+<!--      </el-radio-group>-->
+      <div class="text-30px text-black line-height-30px font-weight-bold text-center">提交投诉</div>
+      <div style="margin: 20px" />
+      <el-form
+        :label-position="labelPosition"
+        label-width="auto"
+        :model="complaintForm"
+        style="max-width: 912px"
+        :rules="rules"
+        ref="complaintFormRef"
+      >
+        <el-form-item label="投诉类型" prop="type">
+          <!--          <el-input v-model="form.type" placeholder="请输入投诉类型" />-->
+          <el-select v-model="complaintForm.type" placeholder="请输入投诉类型">
+            <el-option
+              v-for="dict in dickArr"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="标题" prop="title">
+          <el-input v-model="complaintForm.title" />
+        </el-form-item>
+        <el-form-item label="姓名" prop="name">
+          <el-input v-model="complaintForm.name" />
+        </el-form-item>
+        <el-form-item label="联系电话" prop="phone">
+          <el-input v-model="complaintForm.phone" />
+        </el-form-item>
+        <el-form-item label="身份证号" prop="card">
+          <el-input v-model="complaintForm.card" />
+        </el-form-item>
+        <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
+          <el-input v-model="complaintForm.unifiedSocialCreditCode" />
+        </el-form-item>
+        <el-form-item label="企业名称" prop="enterpriseName">
+          <el-input v-model="complaintForm.enterpriseName" />
+        </el-form-item>
+        <el-form-item label="内容" prop="content">
+          <el-input v-model="complaintForm.content" type="textarea" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="complaintForm.remark" />
+        </el-form-item>
+        <el-form-item label="图片文件" prop="files">
+          <el-upload
+            ref="uploadRef"
+            v-model:file-list="fileList"
+            :action="upload.url"
+            list-type="picture-card"
+            :multiple="true"
+            accept=".jpg, .png"
+            :on-remove="handleRemove"
+            :on-success="handleSuccess"
+            :headers="upload.headers"
+            :data="{moduleName:'投诉模块'}"
+          >
+            <el-icon><Plus /></el-icon>
+          </el-upload>
+
+
+        </el-form-item>
+        <el-button type="primary" @click="uploadComplaint(complaintFormRef)">提交投诉</el-button>
+        <el-button @click="resetForm(complaintFormRef)">重置</el-button>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+
+</style>

+ 46 - 0
src/views/complaint/type/index.ts

@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+enum API {
+  SAVE_COMPLAINT = '/crmComplain/save',
+  DELETE_BY_ID_FILE = '/commonFile/deleteFileById'
+}
+
+export interface complaintData {
+  "name": string,
+  "phone": string,
+  "remark": string,
+  "title": string,
+  "type": string,
+  "content":string,
+  card:string,
+  files:FileType[],
+  unifiedSocialCreditCode:string,
+  enterpriseName:string
+}
+
+export const saveComplaint = (data:complaintData)=> {
+  return request<any,any>({
+    url:API.SAVE_COMPLAINT,
+    method:'post',
+    data
+  })
+}
+
+export const delFileById = (id:string)=>{
+  return request<any,any>({
+    url:API.DELETE_BY_ID_FILE,
+    method:'get',
+    params:{
+      id
+    }
+  })
+}
+
+//拿到字典信息
+export const getDict = (dick:string) => {
+  return request.get('/system/dict/data/type/'+dick,{
+    params:{
+      dick
+    }
+  })
+}

+ 24 - 7
src/views/creditDynamics/creditDynamicsDetail/index.vue

@@ -1,8 +1,8 @@
 <script setup lang="ts">
 import { useRoute, useRouter } from 'vue-router'
-import { ref, watch } from 'vue'
-import { getNews, type NewsData } from '@/api/home'
-import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { onMounted, ref, watch } from 'vue'
+import { getNews, getNewsByPage, type NewsData } from '@/api/home'
+import { queryEqFieldMethod, queryFieldMethod, queryLikeFieldMethod } from '@/utils/queryFieldMethod'
 import { ElMessage } from 'element-plus'
 import NewDynamics from '@/components/NewDynamics.vue'
 import SmallSearch from '@/components/SmallSearch.vue'
@@ -11,6 +11,9 @@ import FourDynamics from '@/components/FourDynamics.vue'
 const route = useRoute()
 const router = useRouter()
 const creditDynamicsList = ref<NewsData[]>([]);
+const currentPage = ref(1);
+const pageSize = ref(10);
+const total = ref(0);
 const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
   router.push({
     path:'/creditDynamicsDetail',
@@ -25,12 +28,13 @@ watch(()=>route.query.dickMapKey,()=>{
 })
 const dataList = ref<NewsData[]>();
 const getData =async ()=>{
-  const res =await getNews(queryFieldMethod('special_column',route.query.dickMapKey as string));
-  if(res.code == 200){
-    dataList.value = res.data;
+  const res =await getNewsByPage(queryEqFieldMethod('special_column',route.query.dickMapKey as string,currentPage.value,pageSize.value));
+  if(res){
+    dataList.value = res.records;
+    total.value = res.total;
   }else {
     ElMessage({
-      message:res.msg,
+      message:'数据出现错误',
       type:'error'
     })
   }
@@ -53,6 +57,9 @@ const toDetail = (id:number|undefined)=>{
     }
   })
 }
+  window.scroll({
+    top: 0,
+  })
 init();
 </script>
 
@@ -68,6 +75,16 @@ init();
           <div class="mt-8px line-height-23px text-13px text-#464646 line-clamp-4" v-html="item.content"></div>
           <div class="mt-20px h-1px bg-#e9e9e9"></div>
         </div>
+        <div class="pl-100px pb-30px">
+          <el-pagination
+            layout="prev, pager, next"
+            background
+            :total="total"
+            v-model:current-page="currentPage"
+            v-model:page-size="pageSize"
+            @change="getData"
+          />
+        </div>
       </div>
       <div class="w-294px bg-opacity-90">
         <small-search />

+ 27 - 26
src/views/creditDynamics/index.vue

@@ -38,7 +38,7 @@ const init = async ()=>{
   const res:NewsResponseData = await getNews(queryFieldMethod('special_column','big_news'))
   if(res.code === 200){
     bigNewsData.value = res.data;
-    console.log(bigNewsData.value)
+    // console.log(bigNewsData.value)
   }
   const res1 = await getNews(queryFieldMethod('special_column','provincialDynamics'))
   if(res1.code === 200){
@@ -62,6 +62,7 @@ const init = async ()=>{
   }
 }
 const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  console.log(dickMapKey)
   router.push({
     path:'/creditDynamicsDetail',
     query:{
@@ -92,7 +93,7 @@ init()
             </div>
             <div class="w-350px h-288px p-22px bg-white bg-opacity-90">
               <div class="w-302px h-44px mb-12px bold text-22px line-height-22px line-clamp-2">{{item.title}}</div>
-              <div class="w-302px h-156px mb-17px line-clamp-6 line-height-23px overflow-hidden text-13px">{{item.content}}</div>
+              <div class="w-302px h-156px mb-17px line-clamp-6 line-height-23px overflow-hidden text-13px" v-html="item.content"></div>
               <div class="flex justify-between">
                 <div class="text-left text-#858585 text-13px" >{{formatTime(item.date)}}</div>
                 <div class="color-006eff cursor-pointer" @click="toNewsDetail(item.id)">了解更多 ></div>
@@ -104,39 +105,39 @@ init()
     </div>
     <div class="w-912px ml-auto mr-auto flex">
       <div class="w-603px flex flex-wrap">
-        <div class="w-294px bg-white rounded-10px mr-15px mb-15px p-10px">
+        <div class="w-294px h-480px bg-white rounded-10px mr-15px mb-15px p-10px">
           <div class="w-117px border-solid border-#003aac border-b-3px h-32px relative">
-            <img src="/src/assets/img/小图标1.png" />
-            <span class="text-#003aac text-16px font-bold ">省内动态</span>
-            <span class="absolute right--150px top-10px text-#006eff text-14px cursor-pointer" @click="knowMore(dickMapAll.get('省内动态'),'省内动态')">查看更多> </span>
+            <img src="/src/assets/img/小图标2.png" />
+            <span class="text-#003aac text-16px font-bold ">全国动态</span>
+            <span class="absolute right--150px top-10px text-#006eff text-14px cursor-pointer" @click="knowMore(dickMapAll.get('省外动态'),'省外动态')">查看更多> </span>
           </div>
-          <div class="mt-25px mb-20px line-clamp-1">聚焦省内</div>
+          <div class="mt-25px mb-20px line-clamp-1">聚焦全国动态</div>
           <div class="w-266px mr-auto ml-auto h-138px m-9px pb-20px">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
+            <img class="w-100% h-100%" src="/static/bg14.jpg" />
           </div>
-          <div v-for="(item,index) in inDynamicsData" :key="index" @click="toNewsDetail(item.id)" class="cursor-pointer">
+          <div v-for="(item,index) in outDynamicsData" :key="index" @click="toNewsDetail(item.id)" class="cursor-pointer">
             <div class="w-100% h-1px bg-#e9e9e9"></div>
             <div class="w-266px line-clamp-1 text-13px mt-20px">{{item.title}}</div>
-            <div class="text-left text-#858585 text-13px mt-9px mb-13px" >{{item.createBy}}|{{formatTime(item.date)}}</div>
+            <div class="text-left text-#858585 text-13px mt-9px mb-13px" >{{item.dataSource}}|{{formatTime(item.date)}}</div>
           </div>
         </div>
-        <div class="w-294px bg-white rounded-10px mb-15px p-10px">
+        <div class="w-294px h-480px bg-white rounded-10px mb-15px p-10px">
           <div class="w-117px border-solid border-#003aac border-b-3px h-32px relative">
-            <img src="/src/assets/img/小图标2.png" />
-            <span class="text-#003aac text-16px font-bold ">省动态</span>
-            <span class="absolute right--150px top-10px text-#006eff text-14px cursor-pointer" @click="knowMore(dickMapAll.get('省外动态'),'省外动态')">查看更多> </span>
+            <img src="/src/assets/img/小图标1.png" />
+            <span class="text-#003aac text-16px font-bold ">省动态</span>
+            <span class="absolute right--150px top-10px text-#006eff text-14px cursor-pointer" @click="knowMore(dickMapAll.get('省内动态'),'省内动态')">查看更多> </span>
           </div>
-          <div class="mt-25px mb-20px line-clamp-1">聚焦省外动态</div>
+          <div class="mt-25px mb-20px line-clamp-1">聚焦省</div>
           <div class="w-266px mr-auto ml-auto h-138px m-9px pb-20px">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
+            <img class="w-100% h-100%" src="/static/bg13.jpg" />
           </div>
-          <div v-for="(item,index) in outDynamicsData" :key="index" @click="toNewsDetail(item.id)" class="cursor-pointer">
+          <div v-for="(item,index) in inDynamicsData" :key="index" @click="toNewsDetail(item.id)" class="cursor-pointer">
             <div class="w-100% h-1px bg-#e9e9e9"></div>
             <div class="w-266px line-clamp-1 text-13px mt-20px">{{item.title}}</div>
-            <div class="text-left text-#858585 text-13px mt-9px mb-13px" >{{item.createBy}}|{{formatTime(item.date)}}</div>
+            <div class="text-left text-#858585 text-13px mt-9px mb-13px" >{{item.dataSource}}|{{formatTime(item.date)}}</div>
           </div>
         </div>
-        <div class="w-294px bg-white rounded-10px mr-15px mb-15px p-10px">
+        <div class="w-294px h-480px bg-white rounded-10px mr-15px mb-15px p-10px">
           <div class="w-117px border-solid border-#003aac border-b-3px h-32px relative">
             <img src="/src/assets/img/小图标3.png" />
             <span class="text-#003aac text-16px font-bold ">本市动态</span>
@@ -144,15 +145,15 @@ init()
           </div>
           <div class="mt-25px mb-20px line-clamp-1">聚焦本市动态</div>
           <div class="w-266px mr-auto ml-auto h-138px m-9px pb-20px">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
+            <img class="w-100% h-100%" src="/static/bg15.jpg" />
           </div>
           <div v-for="(item,index) in currentCityDynamicsData" :key="index" @click="toNewsDetail(item.id)" class="cursor-pointer">
             <div class="w-100% h-1px bg-#e9e9e9"></div>
             <div class="w-266px line-clamp-1 text-13px mt-20px">{{item.title}}</div>
-            <div class="text-left text-#858585 text-13px mt-9px mb-13px" >{{item.createBy}}|{{formatTime(item.date)}}</div>
+            <div class="text-left text-#858585 text-13px mt-9px mb-13px" >{{item.dataSource}}|{{formatTime(item.date)}}</div>
           </div>
         </div>
-        <div class="w-294px bg-white rounded-10px mb-15px p-10px">
+        <div class="w-294px h-480px bg-white rounded-10px mb-15px p-10px">
           <div class="w-117px border-solid border-#003aac border-b-3px h-32px relative">
             <img src="/src/assets/img/小图标4.png" />
             <span class="text-#003aac text-16px font-bold ">园区动态</span>
@@ -160,17 +161,17 @@ init()
           </div>
           <div class="mt-25px mb-20px line-clamp-1">聚焦园区动态</div>
           <div class="w-266px mr-auto ml-auto h-138px m-9px pb-20px">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
+            <img class="w-100% h-100%" src="/static/bg16.jpg" />
           </div>
           <div v-for="(item,index) in parkDynamicsData" :key="index" @click="toNewsDetail(item.id)" class="cursor-pointer">
             <div class="w-100% h-1px bg-#e9e9e9"></div>
             <div class="w-266px line-clamp-1 text-13px mt-20px">{{item.title}}</div>
-            <div class="text-left text-#858585 text-13px mt-9px mb-13px" >{{item.createBy}}|{{formatTime(item.date)}}</div>
+            <div class="text-left text-#858585 text-13px mt-9px mb-13px" >{{item.dataSource}}|{{formatTime(item.date)}}</div>
           </div>
         </div>
       </div>
-      <div class="w-294px bg-white bg-opacity-90 ml-15px rounded-10px">
-        <NewDynamics />
+      <div class="w-294px min-h-480px bg-white bg-opacity-90 ml-15px rounded-10px">
+        <NewDynamics :limit="11" />
       </div>
     </div>
   </div>

+ 0 - 11
src/views/creditEcaluationResults/index.vue

@@ -33,17 +33,6 @@ const init = async ()=>{
     creditDynamics.value = res3.data;
   }
 }
-const toDetail = (id:number|undefined)=>{
-  if(!id){
-    return
-  }
-  router.push({
-    path:'/newsDetail',
-    query:{
-      id
-    }
-  })
-}
 init()
 </script>
 

+ 1 - 1
src/views/creditEcaluationResults/type/index.ts

@@ -25,7 +25,7 @@ export const getCompanyList = (pageNum:number, pageSize:number, unifiedSocialCre
       pageNum,
       pageSize,
       unifiedSocialCreditCode,
-      condition:"A,AA,AAA"
+      condition:"AA,AAA"
     }
   });
 };

+ 8 - 2
src/views/creditServices/index.vue

@@ -6,6 +6,9 @@ import { delImgById, saveSelfReport } from '@/views/creditServices/type'
 import SmallSearch from '@/components/SmallSearch.vue'
 import NewDynamics from '@/components/NewDynamics.vue'
 import { downloadFile } from '@/utils/request'
+import { useRouter } from 'vue-router'
+
+const router = useRouter()
 
 const labelPosition = ref<FormProps['labelPosition']>('left')
 const selfReportRef = ref<FormInstance>();
@@ -58,7 +61,10 @@ const submitReportForm = ()=>{
     if (valid) {
       const res = await saveSelfReport(selfReportForm.value);
       if(res.code == 200){
-        ElMessage.success(res.msg);
+        ElMessage.success(res.msg+"即将返回首页");
+        setTimeout(()=>{
+          router.push('/home')
+        },2000)
         canSelfReport.value = false;
         reset()
       }
@@ -79,7 +85,7 @@ const upload = reactive({
   // 是否禁用上传
   isUploading: false,
   // 上传的地址
-  url: import.meta.env.VITE_APP_BASE_API + '/commonFile/uploadFile',
+  url: import.meta.env.VITE_APP_BASE_URL + '/commonFile/uploadFile',
 })
 const handleRemove = async (uploadFile:any) => {
   const res = await delImgById(uploadFile.response.data.id);

+ 4 - 2
src/views/creditServices/type/index.ts

@@ -9,17 +9,19 @@ export interface SelfReportResponseData{
   contacts:string,
   enterpriseName:string,
   unifiedSocialCreditCode:string,
-  files:any
+  complainantIdNumber:string,
+  files:FileType[]
 }
 export interface SelfReportResponse extends AxiosResponse{
   data: SelfReportResponseData
 }
 
 export const saveSelfReport = (selfReportData:SelfReportResponseData)=>{
-  const {contactInformation,contacts,enterpriseName,unifiedSocialCreditCode,files} = selfReportData;
+  const {contactInformation,contacts,complainantIdNumber,enterpriseName,unifiedSocialCreditCode,files} = selfReportData;
   return request.post<any,SelfReportResponse>(API.SAVE_SELF_REPORT,{
     contactInformation,
     contacts,
+    complainantIdNumber,
     enterpriseName,
     unifiedSocialCreditCode,
     files

+ 84 - 160
src/views/creditWiseEnterprise/index.vue

@@ -1,172 +1,96 @@
 <script setup lang="ts">
-import { formatTime } from '@/utils/formatTime'
-import { getDick, getNews, type NewsData } from '@/api/home'
-import { queryFieldMethod } from '@/utils/queryFieldMethod'
-import { ref } from 'vue'
-import { useRouter } from 'vue-router'
-const financialData = ref<NewsData[]>([])
-const financingLoans = ref<NewsData[]>([])
-
-let router = useRouter()
-
-const toDetail = (id:number|undefined)=>{
-  if(!id){
-    return
-  }
-  router.push({
-    path:'/newsDetail',
-    query:{
-      id
-    }
-  })
-}
-const dickMapAll = ref<Map<string,string>>(new Map());
-const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
-  console.log(dickMapKey)
-  router.push({
-    path:'/creditDynamicsDetail',
-    query:{
-      dickMapKey,
-      dickMapValue
-    }
-  });
-}
-const init =async ()=>{
-  const {data} = await getDick()
-  const dickMap = data.reduce((acc:Map<string,string>, cur:{dictLabel:string,dictValue:string}) => {
-    const key = cur.dictLabel;
-    acc.set(key, cur.dictValue);
-    return acc;
-  },new Map())
-  dickMapAll.value = dickMap
-  console.log(dickMap)
-  //获取政府项目资金需求 数据
-  const res1 = await getNews(queryFieldMethod('special_column',dickMap.get('政府项目资金需求')))
-  if(res1.code == 200){
-    financialData.value = res1.data.slice(0,5);
-  }
-  //获取园区企业融资贷款 数据
-  const res2 = await getNews(queryFieldMethod('special_column',dickMap.get('园区企业融资贷款')))
-  if(res2.code == 200){
-    financingLoans.value = res2.data.slice(0,5);
-  }
-}
-const toLink = (index:number)=>{
-  if(index == 1){
-    window.open("http://hntzxm.fgw.hunan.gov.cn/home")
-  }else if(index == 2){
-    window.open("http://220.168.30.70:28889/portal_v2.jsp")
-  }else if(index == 3){
-    window.open("https://222.244.103.250:8181/pmp/a/login;jsessionid=fa168d5f90a3ed7b76a9bd5f2442#")
-  }
-}
-const toOrtherLink = (index:number)=>{
-  if(index == 1){
-    window.open("https://credit.fgw.hunan.gov.cn/xyd/feature")
-  }else if(index == 2){
-    window.open("https://smecmd.hunanfae.com/main/cms/static/html/loan.html")
-  }else if(index == 3){
-    window.open("https://credit.fgw.hunan.gov.cn/xyd/financeMarketDetail?id=414&isShow=ck")
-  }else if(index == 4){
-    window.open('https://credit.fgw.hunan.gov.cn/xyd/financeMarketDetail?id=26&isShow=ck')
-  }
-}
-const toLink1 = ()=>{
-  window.open("https://www.hhjrfw.com/")
-}
-const toLink2 = ()=>{
-  window.open("https://credit.fgw.hunan.gov.cn/xyd/provincialIndex")
-}
-init();
+// import { formatTime } from '@/utils/formatTime'
+// import { getDick, getNews, type NewsData } from '@/api/home'
+// import { queryFieldMethod } from '@/utils/queryFieldMethod'
+// import { ref } from 'vue'
+// import { useRouter } from 'vue-router'
+// import Link1 from '@/components/Link1.vue'
+// import Link2 from '@/components/Link2.vue'
+// const financialData = ref<NewsData[]>([])
+// const financingLoans = ref<NewsData[]>([])
+//
+// let router = useRouter()
+//
+// const toDetail = (id:number|undefined)=>{
+//   if(!id){
+//     return
+//   }
+//   router.push({
+//     path:'/newsDetail',
+//     query:{
+//       id
+//     }
+//   })
+// }
+// const dickMapAll = ref<Map<string,string>>(new Map());
+// const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+//   console.log(dickMapKey)
+//   router.push({
+//     path:'/creditDynamicsDetail',
+//     query:{
+//       dickMapKey,
+//       dickMapValue
+//     }
+//   });
+// }
+// const init =async ()=>{
+//   const {data} = await getDick()
+//   const dickMap = data.reduce((acc:Map<string,string>, cur:{dictLabel:string,dictValue:string}) => {
+//     const key = cur.dictLabel;
+//     acc.set(key, cur.dictValue);
+//     return acc;
+//   },new Map())
+//   dickMapAll.value = dickMap
+//   console.log(dickMap)
+//   //获取政府项目资金需求 数据
+//   const res1 = await getNews(queryFieldMethod('special_column',dickMap.get('政府项目资金需求')))
+//   if(res1.code == 200){
+//     financialData.value = res1.data.slice(0,5);
+//   }
+//   //获取园区企业融资贷款 数据
+//   const res2 = await getNews(queryFieldMethod('special_column',dickMap.get('园区企业融资贷款')))
+//   if(res2.code == 200){
+//     financingLoans.value = res2.data.slice(0,5);
+//   }
+// }
+// const toLink = (index:number)=>{
+//   if(index == 1){
+//     window.open("http://hntzxm.fgw.hunan.gov.cn/home")
+//   }else if(index == 2){
+//     window.open("http://220.168.30.70:28889/portal_v2.jsp")
+//   }else if(index == 3){
+//     window.open("https://222.244.103.250:8181/pmp/a/login;jsessionid=fa168d5f90a3ed7b76a9bd5f2442#")
+//   }
+// }
+// const toOrtherLink = (index:number)=>{
+//   if(index == 1){
+//     window.open("https://credit.fgw.hunan.gov.cn/xyd/feature")
+//   }else if(index == 2){
+//     window.open("https://smecmd.digital.hnchasing.com/main/cms/static/html/loan.html")
+//   }else if(index == 3){
+//     window.open("https://credit.fgw.hunan.gov.cn/xyd/financeMarketDetail?id=414&isShow=ck")
+//   }else if(index == 4){
+//     window.open('https://credit.fgw.hunan.gov.cn/xyd/financeMarketDetail?id=26&isShow=ck')
+//   }
+// }
+// const toLink1 = ()=>{
+//   window.open("https://www.hhjrfw.com/")
+// }
+// const toLink2 = ()=>{
+//   window.open("https://credit.fgw.hunan.gov.cn/xyd/provincialIndex")
+// }
+// init();
 </script>
 
 <template>
-  <div class="wiseEnterpriseContainer">
+  <div class="wiseEnterpriseContainer min-h-888px pb-20px">
     <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">
       你所在的位置:<span class="cursor-pointer" @click="$router.push('/')">首页</span> > <span class="color-#006eff">信用惠企</span>
     </div>
 <!--    <div class="w-912px h-100px mr-a ml-a bg-white mt-10px bg-cover text-50px blod text-center line-height-90px cursor-pointer mb-25px" @click="toLink2">湖南省企业融资综合信用服务平台</div>-->
 <!--    <div class="w-912px h-100px mr-a ml-a bg-white mt-10px bg-cover text-50px blod text-center line-height-90px cursor-pointer mb-25px" @click="toLink1">怀化市综合金融服务平台</div>-->
-    <div>
-      <div class="w-912px bg-white ml-a mr-a text-16px pt-12px mb-10px line-height-44px border-dashed border-#e5e5e5 border-b-5px">
-        <div class="w-240px border-solid border-#00306e border-b-5px relative">
-          <img class="w-21px h-21px m-3px " src="/src/assets/img/信用小图标.png" />
-          <span class="color-#003aac text-16px">政府项目资金需求发布及链接</span>
-          <span class="absolute right--650px top-10px cursor-pointer text-#959595" @click="knowMore(dickMapAll.get('政府项目资金需求'),'政府项目资金需求')">查看更多 ></span>
-        </div>
-        <div v-for="(item,index) in financialData" :key="index">
-          <div class="flex justify-between">
-            <div class="ml-20px cursor-pointer" @click="toDetail(item.id)">{{item.title}}</div>
-            <div class="color-gray mr-20px">{{formatTime(item.date)}}</div>
-          </div>
-          <div class="h-1px bg-gray"></div>
-        </div>
-      </div>
-      <div>
-        <div class="w-912px ml-auto mr-auto mt-20px flex flex-wrap justify-between bg-white">
-          <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(1)">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省发改委项目审批</div>
-          </div>
-          <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(2)">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省财政厅项目资金管理</div>
-          </div>
-          <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toLink(3)">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南省工信厅项目管理</div>
-          </div>
-          <div class="w-174px h-116px mr-10px relative">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">待开发</div>
-          </div>
-          <div class="w-174px h-116px relative">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">待开发</div>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <div class="w-912px bg-white ml-a mr-a text-16px mt-12px mb-10px line-height-44px border-dashed border-#e5e5e5 border-b-5px">
-        <div class="w-240px border-solid border-#00306e border-b-5px relative">
-          <img class="w-21px h-21px m-3px " src="/src/assets/img/信用小图标.png" />
-          <span class="color-#003aac text-16px">园区企业融资贷款</span>
-          <span class="absolute right--650px top-10px cursor-pointer text-#959595" @click="knowMore(dickMapAll.get('园区企业融资贷款'),'园区企业融资贷款')">查看更多 ></span>
-        </div>
-        <div v-for="(item,index) in financingLoans" :key="index">
-          <div class="flex justify-between">
-            <div class="ml-20px cursor-pointer" @click="toDetail(item.id)">{{item.title}}</div>
-            <div class="color-gray mr-20px">{{formatTime(item.date)}}</div>
-          </div>
-          <div class="h-1px bg-gray"></div>
-        </div>
-      </div>
-      <div>
-        <div class="w-912px ml-auto mr-auto mt-20px flex flex-wrap justify-between bg-white">
-          <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(1)">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">制造业中长期贷款</div>
-          </div>
-          <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(2)">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">潇湘财银贷</div>
-          </div>
-          <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(3)">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">农业银行流水贷</div>
-          </div>
-          <div class="w-174px h-116px mr-10px relative cursor-pointer" @click="toOrtherLink(4)">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">湖南银行流水贷</div>
-          </div>
-          <div class="w-174px h-116px relative cursor-pointer" @click="toOrtherLink(5)">
-            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
-            <div class="absolute bottom-0 text-center w-100% h-22px text-white text-14px pt-4px pb-4px bg-#00306e bg-opacity-72">待开发</div>
-          </div>
-        </div>
-      </div>
-    </div>
+    <Link1></Link1>
+    <Link2></Link2>
 <!--    <div class="flex justify-between w-912px mr-a ml-a">-->
 <!--      <div class="w-603px pl-24px pr-24px pt-30px text-black bg-white">-->
 <!--        <div>-->

+ 150 - 0
src/views/message/index.vue

@@ -0,0 +1,150 @@
+<script setup lang="ts">
+import { getDict, type messageData, saveMessage } from '@/views/message/type'
+import { reactive, ref, toRaw, watch } from 'vue'
+import { ElMessage, type FormInstance, type FormRules } from 'element-plus'
+import { saveComplaint } from '@/views/complaint/type'
+  const dickArr = ref<{dictValue:string,dictLabel:string}[]>([{dictLabel:'',dictValue:''}]);
+  const dickMap = ref();
+  const messageFormRef = ref();
+
+  const messageForm = reactive<messageData>({
+    card: '',
+    content: '',
+    enterpriseName: '',
+    name: '',
+    phone: '',
+    type: 'personal_message',
+    unifiedSocialCreditCode: ''
+  })
+  const unifiedSocialCreditCodeRuleValid = (rule: any, value: any, callback: any) => {
+    if(messageForm.type == 'personal_message') callback();
+    if (value == '') {
+      callback(new Error('请输入企业统一社会信用代码'))
+    }
+    if (value.length != 15 && value.length != 18) {
+      callback(new Error('请输入正确的企业统一社会信用代码'))
+    }
+    callback()
+  }
+const enterpriseNameRuleValid = (rule: any, value: any, callback: any) => {
+  if(messageForm.type == 'personal_message') callback();
+  if (value === '') {
+    callback(new Error('请输入企业名称'))
+  }
+  callback()
+}
+  const rules = reactive<FormRules<typeof messageForm>>({
+    type: [
+      { required: true, message: '请选择投诉类型', trigger: 'change' }
+    ],
+    name: [
+      { required: true, message: '请输入姓名', trigger: 'blur' }
+    ],
+    phone: [
+      { required: true, message: '请输入手机号码', trigger: 'blur' },
+      { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
+    ],
+    content: [
+      { required: true, message: '请输入投诉内容', trigger: 'blur' }
+    ],
+    card: [
+      { required: true, message: '请输入身份证号码', trigger: 'blur' },
+      { pattern: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, message: '请输入正确的身份证号码', trigger: 'blur' }
+    ],
+    unifiedSocialCreditCode: [
+      { required: true, message: '请输入企业统一社会信用代码', trigger: 'blur' },
+      { validator: unifiedSocialCreditCodeRuleValid, trigger: 'blur' }
+    ],
+    enterpriseName: [
+      { required: true, message: '请输入企业名称', trigger: 'blur' },
+      { validator: enterpriseNameRuleValid, trigger: 'blur' }
+    ]
+  })
+  const uploadMessage = (formEl:FormInstance | undefined)=>{
+    // console.log(messageForm)
+    // console.log(formEl)
+    if (!formEl) return
+    formEl.validate(async (valid) => {
+      if (valid) {
+        const res = await saveMessage(toRaw(messageForm));
+        if(res.code == 200){
+          ElMessage({
+            message: res.msg,
+            type: 'success'
+          })
+          formEl.resetFields()
+        }else {
+          ElMessage({
+            message: res.msg,
+            type: 'error'
+          })
+        }
+      }
+    })
+  }
+  const resetForm = (formEl: FormInstance | undefined)=>{
+    if (!formEl) return
+    formEl.resetFields()
+  }
+  const init =async ()=>{
+    let res = await getDict('message_type');
+    dickArr.value = res.data;
+    dickMap.value = dickArr.value.reduce((acc:any,cur:{dictValue:string,dictLabel:string})=>{
+      acc.set(cur.dictValue,cur.dictLabel);
+      return acc;
+    },new Map());
+  }
+  init();
+</script>
+
+<template>
+  <div class="messageContainer pb-30px">
+    <div class="w-912px ml-a mr-a">
+      <div class="text-30px text-black line-height-30px font-weight-bold text-center">向我们提交留言</div>
+      <div style="margin: 20px" />
+      <el-form
+        label-width="auto"
+        :model="messageForm"
+        style="max-width: 912px"
+        :rules="rules"
+        ref="messageFormRef"
+      >
+        <el-form-item label="投诉类型" prop="type">
+          <!--          <el-input v-model="form.type" placeholder="请输入投诉类型" />-->
+          <el-select v-model="messageForm.type" placeholder="请输入投诉类型" :default-first-option="true">
+            <el-option
+              v-for="dict in dickArr"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="姓名" prop="name">
+          <el-input v-model="messageForm.name" placeholder="请输入姓名" />
+        </el-form-item>
+        <el-form-item label="联系电话" prop="phone">
+          <el-input v-model="messageForm.phone" placeholder="请输入联系电话" />
+        </el-form-item>
+        <el-form-item label="身份证号" prop="card">
+          <el-input v-model="messageForm.card" placeholder="请输入身份证号" />
+        </el-form-item>
+        <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode" v-if="messageForm.type == 'company_message'" >
+          <el-input v-model="messageForm.unifiedSocialCreditCode" placeholder="请输入统一社会信用代码" />
+        </el-form-item>
+        <el-form-item label="企业名称" prop="enterpriseName" v-if="messageForm.type == 'company_message'">
+          <el-input v-model="messageForm.enterpriseName" placeholder="请输入企业名称" />
+        </el-form-item>
+        <el-form-item label="内容" prop="content">
+          <el-input v-model="messageForm.content" type="textarea" rows="8" placeholder="请输入留言内容" />
+        </el-form-item>
+        <el-button type="primary" @click="uploadMessage(messageFormRef)">提交投诉</el-button>
+        <el-button @click="resetForm(messageFormRef)">重置</el-button>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+
+</style>

+ 30 - 0
src/views/message/type/index.ts

@@ -0,0 +1,30 @@
+import request from '@/utils/request'
+
+
+enum API{
+  SAVE_MESSAGE = '/owLeavingMessage/save'
+}
+export interface messageData {
+  "card": string,
+  "content": string,
+  "enterpriseName": string,
+  "name": string,
+  "phone": string,
+  "type": string,
+  "unifiedSocialCreditCode": string,
+}
+export const saveMessage = (data:messageData)=> {
+  return request<any,any>({
+    url:API.SAVE_MESSAGE,
+    method:'post',
+    data
+  })
+}
+//拿到字典信息
+export const getDict = (dick) => {
+  return request.get('/system/dict/data/type/'+dick,{
+    params:{
+      dick
+    }
+  })
+}

+ 26 - 2
src/views/newsDetail/index.vue

@@ -1,18 +1,42 @@
 <script setup lang="ts">
 import { useRoute } from 'vue-router'
 import { getDick, getNewsById, type NewsData, type NewsResponseData } from '@/api/home'
-import {ref} from 'vue';
+import { onMounted, ref } from 'vue'
 import { formatTime } from '@/utils/formatTime'
 import { downloadFile } from '@/utils/request'
 const route = useRoute();
 const getData = async ()=>{
   const res = await getNewsById(Number(route.query.id));
+  let imgTemplateArr:string[] = [];
   if(res.code == 200){
+    if(res.data.files.length != 0) {
+      res.data.files.forEach(item => {
+        item.fileUrl;
+        imgTemplateArr.push(`<div style="width: 90%;margin: 0 auto"><img src="${BASE_URL}${item.fileUrl}" alt="" style="width: 100%;margin: 0 auto;"></div>`)
+      })
+    }
+    console.log(imgTemplateArr)
+    const position = res.data.content.indexOf('&zwnj;');
+    if(position != -1){
+      res.data.content = replacePlaceholders(res.data.content, imgTemplateArr)
+    }
     newsData.value = res.data;
   }
 }
+function replacePlaceholders(template:string, replacements:string[]) {
+  return template.split('&zwnj;').map((part, index) => {
+    return index < replacements.length ? part + replacements[index] : part;
+  }).join('');
+}
+
 const BASE_URL = import.meta.env.VITE_APP_BASE_URL;
 const newsData = ref<NewsData>();
+
+  window.scroll({
+    top: 0,
+    // left: 0,
+    // behavior: 'smooth' // 这个选项可以使滚动平滑进行
+  })
 getData()
 </script>
 
@@ -29,7 +53,7 @@ getData()
       <div>发布时间:{{formatTime(newsData?.date)}}</div>
       <div class="mr-20px">数据来源:{{newsData?.dataSource}}</div>
     </div>
-    <div class="custom-font w-912px ml-a mr-a text-18px mt-10px  line-height-34px " v-html="newsData?.content"></div>
+    <div class="custom-font w-912px ml-a mr-a text-18px mt-10px mb-50px line-height-34px " v-html="newsData?.content"></div>
     <div class="w-912px ml-a mr-a text-14px mt-10px" v-if="newsData?.files.length">
       <div>附件下载</div>
       <div v-for="(item,index) in newsData?.files" :key="index" class="line-height-40px">

+ 3 - 14
src/views/search/index.vue

@@ -11,6 +11,7 @@ import {ref} from 'vue'
 import { useSearchStore } from '@/stores/searchStore'
 import SmallSearch from '@/components/SmallSearch.vue'
 import NewDynamics from '@/components/NewDynamics.vue'
+import FourDynamics from '@/components/FourDynamics.vue'
 const searchStore = useSearchStore();
 
 const router = useRouter()
@@ -143,8 +144,7 @@ watch(()=>route.query.value,setSearchValue,{immediate:true})
         <div  v-if="route.query.searchModule == '2'">
           <div v-for="(item,index) in chartData" :key="index" class="cursor-pointer" @click="toNewsDetail(item.id)">
             <div class="text-16px">{{item.title}}</div>
-            <div class="text-13px h-30px line-height-30px text-#464646 line-clamp-1 mt-8px">
-              {{item.content}}
+            <div class="text-13px h-30px line-height-30px text-#464646 line-clamp-1 mt-8px" v-html="item.content">
             </div>
             <div class="h-1px bg-#e9e9e9 mt-10px mb-24px"></div>
           </div>
@@ -163,18 +163,7 @@ watch(()=>route.query.value,setSearchValue,{immediate:true})
       </div>
       <div class="w-294px">
         <SmallSearch />
-        <div class="bg-white">
-          <div class="w-117px border-solid border-#003aac border-b-3px h-32px">
-            <img src="/src/assets/img/小图标1.png" />
-            <span class="text-#003aac text-16px font-bold ">通知公告</span>
-          </div>
-          <div class="mt-20px ml-10px flex flex-wrap w-100%">
-            <div class="m-10px text-12px color-#030303 w-118px h-52px line-height-52px bg-#cce2ff text-center cursor-pointer" @click="knowMore('provincialDynamics','省内动态')">省内公告</div>
-            <div class="m-10px text-12px color-#030303 w-118px h-52px line-height-52px bg-#ecf4ff text-center cursor-pointer" @click="knowMore('outsideProvincialDynamics','省外动态')">省外公告</div>
-            <div class="m-10px text-12px color-#030303 w-118px h-52px line-height-52px bg-#cce2ff text-center cursor-pointer" @click="knowMore('currentCityDynamics','本市动态')">本市公告</div>
-            <div class="m-10px text-12px color-#030303 w-118px h-52px line-height-52px bg-#ecf4ff text-center cursor-pointer" @click="knowMore('parkDynamics','园区动态')">园区公告</div>
-          </div>
-        </div>
+        <FourDynamics />
         <NewDynamics />
       </div>
     </div>

+ 2 - 2
src/views/search/type/index.ts

@@ -65,13 +65,13 @@ export const getSearchDataResult = (pageNum:number,pageSize:number,searchModule:
     return request<any,SearchDataResult>({
       url:API.SEARCH_URL,
       method:'get',
-      params:queryLikeFieldMethod('enterprise_name',searchValue,pageNum,pageSize)
+      params:queryLikeFieldMethod('enterprise_name',searchValue,pageNum,pageSize,false)
     });
   }else if(searchModule == '1'){
     return request<any,SearchDataResult>({
       url:API.SEARCH_URL,
       method:'get',
-      params:queryLikeFieldMethod('unified_social_credit_code',searchValue,pageNum,pageSize)
+      params:queryLikeFieldMethod('unified_social_credit_code',searchValue,pageNum,pageSize,false)
     });
   }else if(searchModule == '2'){
     return request<any,NewsDataResult>({

Різницю між файлами не показано, бо вона завелика
+ 42 - 0
vite.config.ts.timestamp-1719194089327-c0a87f2c9dee3.mjs


Різницю між файлами не показано, бо вона завелика
+ 42 - 0
vite.config.ts.timestamp-1719292139679-76c7244f4266c.mjs


Різницю між файлами не показано, бо вона завелика
+ 42 - 0
vite.config.ts.timestamp-1719454476541-c25d3d094e865.mjs


Деякі файли не було показано, через те що забагато файлів було змінено