sdjakl 2 роки тому
батько
коміт
f7dab17469
53 змінених файлів з 2737 додано та 143 видалено
  1. 1 1
      .env.development
  2. 1 2
      .env.production
  3. 9 10
      components.d.ts
  4. 23 0
      env.d.ts
  5. 17 4
      package-lock.json
  6. 3 1
      package.json
  7. BIN
      public/footer1.png
  8. BIN
      public/gat.png
  9. BIN
      public/jiucuo.png
  10. BIN
      public/首页背景.png
  11. 76 0
      src/api/home.ts
  12. BIN
      src/assets/img/logo-all.png
  13. BIN
      src/assets/img/信用小图标.png
  14. BIN
      src/assets/img/小图标1.png
  15. BIN
      src/assets/img/小图标2.png
  16. BIN
      src/assets/img/小图标3.png
  17. BIN
      src/assets/img/小图标4.png
  18. BIN
      src/assets/img/首页背景.png
  19. 33 0
      src/components/FourDynamics.vue
  20. 48 0
      src/components/NewDynamics.vue
  21. 39 0
      src/components/SmallSearch.vue
  22. 48 3
      src/layout/component/FooterBlock.vue
  23. 163 52
      src/layout/component/HeadBlock.vue
  24. 5 3
      src/layout/index.vue
  25. 7 1
      src/main.ts
  26. 2 2
      src/router/index.ts
  27. 49 8
      src/router/route.ts
  28. 13 0
      src/stores/searchStore.ts
  29. 10 0
      src/utils/formatTime.ts
  30. 9 0
      src/utils/getFileExtension.ts
  31. 51 0
      src/utils/queryFieldMethod.ts
  32. 194 0
      src/utils/request.ts
  33. 0 3
      src/views/AboutView.vue
  34. 284 35
      src/views/HomeView/index.vue
  35. 62 3
      src/views/about/index.vue
  36. 5 0
      src/views/about/type/index.ts
  37. 39 0
      src/views/companyDetail/index.vue
  38. 28 0
      src/views/companyDetail/map/index.ts
  39. 41 0
      src/views/companyDetail/type/index.ts
  40. 84 0
      src/views/companyList/index.vue
  41. 85 0
      src/views/creditDynamics/creditDynamicsDetail/index.vue
  42. 181 3
      src/views/creditDynamics/index.vue
  43. 96 3
      src/views/creditEcaluationResults/index.vue
  44. 31 0
      src/views/creditEcaluationResults/type/index.ts
  45. 175 3
      src/views/creditServices/index.vue
  46. 36 0
      src/views/creditServices/type/index.ts
  47. 96 3
      src/views/creditWarning/index.vue
  48. 31 0
      src/views/creditWarning/type/index.ts
  49. 326 3
      src/views/creditWiseEnterprise/index.vue
  50. 49 0
      src/views/newsDetail/index.vue
  51. 188 0
      src/views/search/index.vue
  52. 90 0
      src/views/search/type/index.ts
  53. 9 0
      vite.config.ts

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 变量必须以 VITE_ 为前缀才能暴露给外部读取
 NODE_ENV = 'development'
 VITE_APP_BASE_API = '/api'
-VITE_APP_BASE_URL = 'http://192.168.110.235:8091'
+VITE_APP_BASE_URL = 'http://192.168.110.235:20002'
 VITE_APP_TITLE = '怀化高新区网站管理平台'

+ 1 - 2
.env.production

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

+ 9 - 10
components.d.ts

@@ -8,23 +8,22 @@ export {}
 declare module 'vue' {
   export interface GlobalComponents {
     ElButton: typeof import('element-plus/es')['ElButton']
-    ElCol: typeof import('element-plus/es')['ElCol']
+    ElCarousel: typeof import('element-plus/es')['ElCarousel']
+    ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
+    ElForm: typeof import('element-plus/es')['ElForm']
+    ElFormItem: typeof import('element-plus/es')['ElFormItem']
     ElInput: typeof import('element-plus/es')['ElInput']
-    ElMenu: typeof import('element-plus/es')['ElMenu']
-    ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
-    ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
-    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
-    ElRow: typeof import('element-plus/es')['ElRow']
-    ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
-    ElTabPane: typeof import('element-plus/es')['ElTabPane']
-    ElTabs: typeof import('element-plus/es')['ElTabs']
-    ElText: typeof import('element-plus/es')['ElText']
+    ElPagination: typeof import('element-plus/es')['ElPagination']
+    ElUpload: typeof import('element-plus/es')['ElUpload']
+    FourDynamics: typeof import('./src/components/FourDynamics.vue')['default']
     IconCommunity: typeof import('./src/components/icons/IconCommunity.vue')['default']
     IconDocumentation: typeof import('./src/components/icons/IconDocumentation.vue')['default']
     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']
+    NewDynamics: typeof import('./src/components/NewDynamics.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
+    SmallSearch: typeof import('./src/components/SmallSearch.vue')['default']
   }
 }

+ 23 - 0
env.d.ts

@@ -1 +1,24 @@
 /// <reference types="vite/client" />
+
+declare interface AxiosResponse {
+  code: number,
+  msg: string
+}
+
+declare interface FileType {
+  fid: number
+  fileName: string,
+  fileOriginalName: string,
+  fileSize: number
+  fileUrl:string,
+  id:number,
+  moduleName: string
+
+}
+
+declare interface pageAxiosResponse {
+  pageNo: number,
+  pageSize: number,
+  totalPage:number,
+  totalSize: number
+}

+ 17 - 4
package-lock.json

@@ -12,6 +12,7 @@
         "animate.css": "^4.1.1",
         "axios": "^1.7.2",
         "element-plus": "^2.7.3",
+        "file-saver": "^2.0.5",
         "pinia": "^2.1.7",
         "vue": "^3.4.21",
         "vue-router": "^4.3.0"
@@ -19,6 +20,7 @@
       "devDependencies": {
         "@rushstack/eslint-patch": "^1.8.0",
         "@tsconfig/node20": "^20.1.4",
+        "@types/file-saver": "^2.0.7",
         "@types/node": "^20.12.5",
         "@vitejs/plugin-vue": "^5.0.4",
         "@vitejs/plugin-vue-jsx": "^3.1.0",
@@ -29,7 +31,7 @@
         "eslint-plugin-vue": "^9.23.0",
         "npm-run-all2": "^6.1.2",
         "prettier": "^3.2.5",
-        "sass": "^1.77.3",
+        "sass": "^1.77.5",
         "typescript": "~5.4.0",
         "unocss": "^0.60.3",
         "unplugin-auto-import": "^0.17.6",
@@ -1612,6 +1614,12 @@
       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
       "dev": true
     },
+    "node_modules/@types/file-saver": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.7.tgz",
+      "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==",
+      "dev": true
+    },
     "node_modules/@types/lodash": {
       "version": "4.17.4",
       "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.4.tgz",
@@ -3515,6 +3523,11 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
+    "node_modules/file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
     "node_modules/fill-range": {
       "version": "7.1.1",
       "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
@@ -4854,9 +4867,9 @@
       }
     },
     "node_modules/sass": {
-      "version": "1.77.3",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.3.tgz",
-      "integrity": "sha512-WJHo+jmFp0dwRuymPmIovuxHaBntcCyja5hCB0yYY9wWrViEp4kF5Cdai98P72v6FzroPuABqu+ddLMbQWmwzA==",
+      "version": "1.77.5",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.5.tgz",
+      "integrity": "sha512-oDfX1mukIlxacPdQqNb6mV2tVCrnE+P3nVYioy72V5tlk56CPNcO4TCuFcaCRKKfJ1M3lH95CleRS+dVKL2qMg==",
       "dev": true,
       "dependencies": {
         "chokidar": ">=3.0.0 <4.0.0",

+ 3 - 1
package.json

@@ -17,6 +17,7 @@
     "animate.css": "^4.1.1",
     "axios": "^1.7.2",
     "element-plus": "^2.7.3",
+    "file-saver": "^2.0.5",
     "pinia": "^2.1.7",
     "vue": "^3.4.21",
     "vue-router": "^4.3.0"
@@ -24,6 +25,7 @@
   "devDependencies": {
     "@rushstack/eslint-patch": "^1.8.0",
     "@tsconfig/node20": "^20.1.4",
+    "@types/file-saver": "^2.0.7",
     "@types/node": "^20.12.5",
     "@vitejs/plugin-vue": "^5.0.4",
     "@vitejs/plugin-vue-jsx": "^3.1.0",
@@ -34,7 +36,7 @@
     "eslint-plugin-vue": "^9.23.0",
     "npm-run-all2": "^6.1.2",
     "prettier": "^3.2.5",
-    "sass": "^1.77.3",
+    "sass": "^1.77.5",
     "typescript": "~5.4.0",
     "unocss": "^0.60.3",
     "unplugin-auto-import": "^0.17.6",

BIN
public/footer1.png


BIN
public/gat.png


BIN
public/jiucuo.png


BIN
public/首页背景.png


+ 76 - 0
src/api/home.ts

@@ -0,0 +1,76 @@
+import request from '@/utils/request'
+
+export interface NewsData {
+  content: string,
+  date: string,
+  id:number,
+  title: string,
+  specialColumn:string,
+  files:FileType[],
+  createBy:string,
+  updateTime:string,
+  dataSource:string
+}
+
+export interface NewsResponseData extends AxiosResponse{
+  data:NewsData[]
+}
+export interface NewsResponseDataById extends AxiosResponse{
+  data:NewsData
+}
+enum API {
+  GET_NEWS_URL = '/crmNewsRelease/getList',
+  GET_NEWS_BY_ID_URL = '/crmNewsRelease/getById/',
+  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'
+}
+
+export const getNews = (params:object)=>{
+  return request<any,NewsResponseData>({
+    url:API.GET_NEWS_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})=>{
+  return request<any,any>({
+    url:API.GET_ADMINISTRATIVE_LICENSING,
+    method:'get',
+    params
+  })
+}
+export const get2 = (params={pageNum:1,pageSize:10})=>{
+  return request<any,any>({
+    url:API.GET_ADMINISTRATIVE_PENALTY,
+    method:'get',
+    params
+  })
+}
+export const get3 = (params={pageNum:1,pageSize:10})=>{
+  return request<any,any>({
+    url:API.GET_CREDIT_REDLIST_INFO,
+    method:'get',
+    params
+  })
+}
+export const get4 = (params={pageNum:1,pageSize:10})=>{
+  return request<any,any>({
+    url:API.GET_C_D_COMPANY,
+    method:'get',
+    params:{
+      pageNum:1,
+      pageSize:10,
+      unifiedSocialCreditCode:'',
+      condition:'C,D'
+    }
+  })
+}

BIN
src/assets/img/logo-all.png


BIN
src/assets/img/信用小图标.png


BIN
src/assets/img/小图标1.png


BIN
src/assets/img/小图标2.png


BIN
src/assets/img/小图标3.png


BIN
src/assets/img/小图标4.png


BIN
src/assets/img/首页背景.png


+ 33 - 0
src/components/FourDynamics.vue

@@ -0,0 +1,33 @@
+<script setup lang="ts">
+import { useRouter } from 'vue-router'
+
+const router = useRouter()
+const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  router.push({
+    path:'/creditDynamicsDetail',
+    query:{
+      dickMapKey,
+      dickMapValue
+    }
+  });
+}
+</script>
+
+<template>
+  <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>
+</template>
+
+<style scoped>
+
+</style>

+ 48 - 0
src/components/NewDynamics.vue

@@ -0,0 +1,48 @@
+<script setup lang="ts">
+import { ref } from 'vue'
+import { getNews, type NewsData } from '@/api/home'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { useRouter } from 'vue-router'
+
+const creditDynamics = ref<NewsData[]>([])
+const router = useRouter()
+const init = async ()=>{
+  //获取信用动态 数据
+  const res3 = await getNews(queryFieldMethod('special_column','credit_dynamics'))
+  if(res3.code == 200){
+    creditDynamics.value = res3.data.slice(0,5);
+  }
+}
+const toDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+init()
+</script>
+
+<template>
+  <div class="mt-15px bg-white mt-15px">
+    <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 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>
+        <div class="text-#ff9900 text-13px cursor-pointer text-right mr-10px mt-5px" @click="toDetail(item.id)">查看更多></div>
+      </div>
+      <div class="h-1px bg-gray"></div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+
+</style>

+ 39 - 0
src/components/SmallSearch.vue

@@ -0,0 +1,39 @@
+<script setup lang="ts">
+import { useRouter } from 'vue-router'
+
+const router = useRouter();
+import {ref} from 'vue';
+const toSearch = ()=>{
+  router.push({
+    path:'/search',
+    query:{
+      searchModule:'2',
+      value:smallInput.value
+    }
+  })
+}
+const smallInput = ref<string>('');
+</script>
+
+<template>
+  <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="relative mb-15px">
+      <input class="w-266px h-31px bg-#f3f3f3 m-14px mt-30px mb-30px" placeholder="请输入站内文章关键字" v-model="smallInput" />
+      <button class="absolute right-13px top-30px h-31px" @click="toSearch">
+        <svg t="1718242035057" class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="19" height="19">
+          <path
+            d="M469.333333 85.333333a384 384 0 0 1 300.032 623.658667l139.306667 139.349333a42.666667 42.666667 0 1 1-60.330667 60.330667l-139.349333-139.306667A384 384 0 1 1 469.333333 85.333333z m0 85.333334a298.666667 298.666667 0 1 0 0 597.333333 298.666667 298.666667 0 0 0 0-597.333333z"
+            fill="#000000" p-id="1555"></path>
+        </svg>
+      </button>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+
+</style>

+ 48 - 3
src/layout/component/FooterBlock.vue

@@ -1,5 +1,50 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+const toOtherLink = (index:number) => {
+  if(index == 1){
+    window.open('https://gxq.huaihua.gov.cn/gxq/c115221/map2022.shtml')
+  }else if(index == 2){
+    window.open('https://beian.miit.gov.cn/#/Integrated/index')
+  }else if(index == 3){
+    window.open('http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=43120202000051')
+  }else if(index == 4){
+    window.open('https://zfwzgl.www.gov.cn/exposure/jiucuo.html?site_code=4312000019&url=https%3A%2F%2Fgxq.huaihua.gov.cn%2F')
+  }else if(index == 5){
+    window.open('https://bszs.conac.cn/sitename?method=show&id=2CF7A688A99228FCE053022819ACCEC6')
+  }
+}
+</script>
 
-<template>dd</template>
+<template>
+  <div class="footerContainer w-100% h-260px">
+    <div class="w-1202px ml-a mr-a flex">
+      <div class="w-50% line-height-32px text-gray pt-40px text-14px">
+        <div class="text-white text-16px cursor-pointer hover:op-70" @click="toOtherLink(1)">网站地图</div>
+        <div>主办单位:怀化高新技术产业开发区</div>
+        <div>政府网站标识码:4312000019</div>
+        <div><span class="cursor-pointer hover:op-70" @click="toOtherLink(2)">备案号:湘ICP备11003356号-1</span> <img src="/public/gat.png" /><span class="cursor-pointer hover:op-70" @click="toOtherLink(3)">湘公网安备 43120202000051号</span></div>
+      </div>
+      <div class="w-50% flex">
+        <div class="mt-40px p-30px pb-10px mb-50px line-height-32px text-gray bg-black bg-opacity-10 text-12px">
+          <div class="text-20px text-white">联系方式</div>
+          <div>地址:怀化市中方县中方镇</div>
+          <div>邮编:418000</div>
+          <div>联系电话:0745-2837366</div>
+        </div>
+        <div class="flex m-20px mt-50px p-30px pb-10px mb-50px line-height-40px text-gray bg-black bg-opacity-10">
+          <div class="w-100% h-100% mt-45px">
+            <img src="/public/jiucuo.png" @click="toOtherLink(4)" class="cursor-pointer hover:op-70">
+          </div>
+          <div class="w-100% h-100% mt-35px">
+            <img src="/public/footer1.png" @click="toOtherLink(5)" class="cursor-pointer hover:op-70">
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
 
-<style scoped></style>
+<style scoped>
+.footerContainer{
+  background-color: #36404d;
+}
+</style>

+ 163 - 52
src/layout/component/HeadBlock.vue

@@ -1,98 +1,212 @@
 <script setup lang="ts">
-import { ref } from 'vue'
+import { ref, watch } from 'vue'
 import { Search } from '@element-plus/icons-vue'
 // import type { TabsInstance } from 'element-plus'
 
 import { useRoute, useRouter } from 'vue-router'
+import { getNews, type NewsData, type NewsResponseData } from '@/api/home'
+import { getFileExtension } from '@/utils/getFileExtension'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { useSearchStore } from '@/stores/searchStore'
+
+const searchStore = useSearchStore();
+
 const input3 = ref('')
+const firstNewsList = ref<NewsData[]>();
 const tabs = ref([
-  { title: '信用信息', placeholder: '请输入主体名称' },
+  { title: '企业名称', placeholder: '请输入企业名称' },
   { title: '统一社会信用代码', placeholder: '请输入统一社会信用代码' },
-  { title: '站内文章', placeholder: '请输入站内文章关键字' },
-]);
+  { title: '站内文章', placeholder: '请输入站内文章关键字' }
+])
+const isHome = ref<boolean>(false);
 
 const route: any = useRoute()
 const router: any = useRouter()
-
+const BASE_URL = import.meta.env.VITE_APP_BASE_URL;
+const homeImgUrl = ref<string>('');
 
 const munTabs = ref([
-  { title: '首页', route:'home'},
-  { title: '信用动态', route:'creditDynamics' },
-  { title: '信用慧企', route:'creditWiseEnterprise' },
-  { title: '信用评价结果', route:'creditEcaluationResults' },
-  { title: '信用警示', route:'creditWarning' },
-  { title: '信用服务', route:'creditServices' },
-  { title: '通知公告', route:'about' },
-]);
-const activeTab = ref(0); // 默认激活第一个tab  
-const activeMun = ref(0); // 默认激活第一个tab  
-
-const placeholder = ref('请输入主体名称');
+  { title: '首页', route: 'home' },
+  { title: '信用动态', route: 'creditDynamics' },
+  { title: '信用慧企', route: 'creditWiseEnterprise' },
+  { title: '信用红榜', route: 'creditEcaluationResults' },
+  { title: '信用警示', route: 'creditWarning' },
+  { title: '企业自主上报', route: 'creditServices' },
+  { title: '通知公告', route: 'about' }
+])
+const checkIndex = ()=>{
+  const filter = munTabs.value.find(item=> item.title == route.meta.title );
+  let index =null;
+  if(filter){
+    index = munTabs.value.indexOf(filter)
+  }
+  return index;
+}
+const activeTab = ref(0)
+const activeMun = ref(checkIndex())
+const staticNews = ref<NewsData>();
+watch(() => route.meta.title,()=>{
+  activeMun.value = checkIndex();
+})
+const placeholder = ref('请输入企业名称')
 // const tabPosition = ref<TabsInstance['tabPosition']>('left')
 const setActiveTab = (index: any, value: any) => {
-  activeTab.value = index;
-  placeholder.value = value.placeholder;
-  console.log(index, value);
-};
-const munActiveTab = (index: any,tab:any) => {
-  console.log(index, tab);
-  
-  activeMun.value = index;
+  if(!index){
+    activeTab.value = 0
+  }else {
+    activeTab.value = index
+  }
+  if(!value){
+    placeholder.value = '请输入企业名称'
+  }else {
+    placeholder.value = value?.placeholder
+  }
+}
+setActiveTab(route.query.searchModule,tabs.value[route.query.searchModule])
+const munActiveTab = (index: any, tab: any) => {
+  activeMun.value = index
   router.push({
-      path: tab.route,
-      query: {}
-    });
+    path: tab.route,
+    query: {}
+  })
+}
+const toSearch = (searchModule:number,value:string)=>{
+  router.push({
+    path:'/search',
+    query:{
+      searchModule,
+      value
+    }
+  })
+}
+const toDetail = (id:number|undefined)=>{
+  if(!id){
+    return;
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+const getData =async ()=>{
+  const res:NewsResponseData = await getNews(queryFieldMethod('special_column','big_news'));
+  // console.log(res)
+  if(res.code == 200){
+    firstNewsList.value = res.data;
+  }
+  const res1:NewsResponseData = await getNews(queryFieldMethod('special_column','static_news'))
+  if(res1.code == 200){
+    staticNews.value = res1.data[0];
+  }
+  // const find = res.data.find(item=>{
+  //   return item.files.find(q=>{
+  //     return getFileExtension(q.fileOriginalName) == 'png'||getFileExtension(q.fileOriginalName) == 'jpg'
+  //   })
+  // })
+  // if(find){
+  //   firstNews.value = find;
+  // }else {
+  //   firstNews.value = res.data[0];
+  // }
+  // homeImgUrl.value = BASE_URL + firstNews.value?.files.find(item=>{
+  //   return getFileExtension(item.fileOriginalName) == 'png'||getFileExtension(item.fileOriginalName) == 'jpg'
+  // })?.fileUrl
+  // console.log(homeImgUrl)
+  // console.log(firstNews.value)
 };
-
+const computeImgUrl = (files:FileType[])=>{
+  return BASE_URL + files.filter(item=>{
+    return getFileExtension(item.fileUrl) == 'png'||getFileExtension(item.fileUrl) == 'jpg'
+  })?.[0]?.fileUrl
+}
+const init = ()=>{
+  getData()
+  if(route.query.value){
+    input3.value = route.query.value;
+  }
+}
+const toManager = ()=>{
+  window.open('http://42.48.99.5:81/')
+}
+init()
 
 </script>
 
 <template>
-  <div class="headContainer w100vw">
+  <div class="headContainer w100vw" style="background:url('/首页背景.png')">
     <!-- 标题部分登录跳转 -->
     <div class="headTitle">
-      <text>欢迎来到怀化市高新区企业信用信息分级分类平台</text>
+      <text>欢迎来到怀化高新区企业信用信息分级分类网</text>
       <div>
-        <el-button type="primary">登录</el-button>
+        <el-button type="primary" @click="toManager">登录</el-button>
       </div>
     </div>
     <!-- 头部功能及其显示内容 -->
     <div class="headModule">
-      <div>
-        <H1>怀化市高新区企业信用信息分级分类平台</H1>
-        <H3>www.aabbccd.com</H3>
+      <div class="h-238px">
+        <h1>怀化高新区企业信用信息分级分类网</h1>
+<!--        <h3>www.aabbccd.com</h3>-->
       </div>
       <div class="headSearch">
         <!-- 搜索上方tab切换选择 -->
         <div class="headSTab">
-          <div v-for="(tab, index) in tabs" :key="index" class="tab" :class="{ active: activeTab === index }"
-            @click="setActiveTab(index, tab)">
+          <div v-for="(tab, index) in tabs" :key="index" class="tab" :class="{ active: activeTab == index }"
+               @click="setActiveTab(index, tab)">
             {{ tab.title }}
           </div>
         </div>
         <!-- 搜索框位置 -->
         <div>
-          <el-input v-model="input3" style="width: 337px;height:33px" :placeholder=placeholder class="input-with-select">
+          <el-input v-model="input3" style="width: 337px;height:33px" :placeholder=placeholder
+                    class="input-with-select">
             <template #append>
-              <el-button :icon="Search" />
+              <el-button :icon="Search" @click="toSearch(activeTab,input3)" />
             </template>
           </el-input>
         </div>
       </div>
     </div>
     <div class="D" style="display:flex;justify-content:center">
-      <div style="width:100%;position: absolute;
-    bottom: 0;
-    display: flex;
-    justify-content: center;
-    background:rgba(255,255,255,.22);
-    height:46px">
-        <div class="headMune">
+      <div style="width:100%;
+        bottom: 0;
+        display: flex;
+        justify-content: center;
+        background:rgba(255,255,255,.22);
+        height:46px"
+      >
+        <div class="headMune bg-opacity-22">
           <div v-for="(tab, index) in munTabs" :key="index" class="tab" :class="{ activeMun: activeMun === index }"
-            @click="munActiveTab(index,tab)">
-            {{ tab.title }}</div>
+               @click="munActiveTab(index,tab)">
+            {{ tab.title }}
+          </div>
+        </div>
+      </div>
+    </div>
+    <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>
       </div>
+      <div class="w-912px ml-auto mr-auto  mt-20px pb-54px ">
+        <el-carousel :interval="5000" arrow="always">
+          <el-carousel-item v-for="item in firstNewsList" :key="item">
+            <div class="flex">
+              <div class="w-562px h-288px">
+                <img class="w-100% h-100%" :src="computeImgUrl(item.files)" />
+              </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" v-html="item.content"></div>
+                <div class="color-006eff cursor-pointer text-right" @click="toDetail(item.id)" >了解更多 ></div>
+              </div>
+            </div>
+          </el-carousel-item>
+        </el-carousel>
+      </div>
     </div>
   </div>
 </template>
@@ -101,11 +215,9 @@ const munActiveTab = (index: any,tab:any) => {
 $boxWidth: 1200px;
 
 .headContainer {
-  background-image: url("../../assets/img/back.png");
   background-size: 100% 100%;
-  height: 238px;
   position: relative;
-
+  //background-image: url(src/assets/img/首页背景.png);
   .headTitle {
     margin: 0 40px;
     height: 40px;
@@ -162,7 +274,6 @@ $boxWidth: 1200px;
 
   .headMune {
     width: 100%;
-    position: absolute;
     bottom: 0;
     width: $boxWidth;
     display: flex;

+ 5 - 3
src/layout/index.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import HeadBlock from '@/layout/component/HeadBlock.vue'
-// import FooterBlock from '@/layout/component/FooterBlock.vue'
+import FooterBlock from '@/layout/component/FooterBlock.vue'
 </script>
 
 <template>
@@ -8,7 +8,9 @@ import HeadBlock from '@/layout/component/HeadBlock.vue'
   <transition enter-active-class="animate__animated animate__fadeIn" mode="out-in">
     <RouterView />
   </transition>
-  <!-- <FooterBlock /> -->
+   <FooterBlock />
 </template>
 
-<style scoped></style>
+<style scoped>
+
+</style>

+ 7 - 1
src/main.ts

@@ -6,9 +6,11 @@ import ElementPlus from 'element-plus'
 import 'element-plus/dist/index.css'
 import App from './App.vue'
 import router from './router'
+import zhCn from 'element-plus/es/locale/lang/zh-cn'
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 import 'virtual:uno.css'
 
+
 import 'animate.css'
 
 const app = createApp(App)
@@ -16,9 +18,13 @@ const app = createApp(App)
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
   app.component(key, component)
 }
+const title = import.meta.env.VITE_APP_TITLE
+document.title = title;
 
 app.use(createPinia())
 app.use(router)
-app.use(ElementPlus)
+app.use(ElementPlus, {
+  locale: zhCn,
+})
 
 app.mount('#app')

+ 2 - 2
src/router/index.ts

@@ -1,8 +1,8 @@
-import { createRouter, createWebHistory } from 'vue-router'
+import { createRouter, createWebHashHistory } from 'vue-router'
 import { routes } from '@/router/route'
 
 const router = createRouter({
-  history: createWebHistory(import.meta.env.BASE_URL),
+  history: createWebHashHistory(import.meta.env.BASE_URL),
   routes
 })
 

+ 49 - 8
src/router/route.ts

@@ -1,5 +1,6 @@
 import type { RouteRecordRaw } from 'vue-router'
 import Layout from '@/layout/index.vue'
+
 export const routes: RouteRecordRaw[] = [
   {
     path: '/',
@@ -15,48 +16,88 @@ export const routes: RouteRecordRaw[] = [
         meta: {
           title: '首页'
         }
-      },{
+      }, {
         path: '/creditDynamics',
         name: 'creditDynamics',
         component: () => import('@/views/creditDynamics/index.vue'),
         meta: {
           title: '信用动态'
         }
-      },{
+      }, {
         path: '/creditWiseEnterprise',
         name: 'creditWiseEnterprise',
         component: () => import('@/views/creditWiseEnterprise/index.vue'),
         meta: {
           title: '信用慧企'
         }
-      },{
+      }, {
         path: '/creditEcaluationResults',
         name: 'creditEcaluationResults',
         component: () => import('@/views/creditEcaluationResults/index.vue'),
         meta: {
-          title: '信用评价结果'
+          title: '信用红榜'
         }
-      },{
+      }, {
         path: '/creditWarning',
         name: 'creditWarning',
         component: () => import('@/views/creditWarning/index.vue'),
         meta: {
           title: '信用警示'
         }
-      },{
+      }, {
         path: '/creditServices',
         name: 'creditServices',
         component: () => import('@/views/creditServices/index.vue'),
         meta: {
-          title: '信用服务'
+          title: '企业自主上报'
         }
-      },{
+      }, {
         path: '/about',
         name: 'about',
         component: () => import('@/views/about/index.vue'),
         meta: {
           title: '通知公告'
         }
+      },
+      {
+        path: '/creditDynamicsDetail',
+        name: 'creditDynamicsDetail',
+        component: () => import('@/views/creditDynamics/creditDynamicsDetail/index.vue'),
+        meta: {
+          title: '信用动态详情'
+        }
+      },
+      {
+        path:'/search',
+        name:'search',
+        component:()=>import('@/views/search/index.vue'),
+        meta:{
+          title:'搜索'
+        }
+      },
+      {
+        path:'/newsDetail',
+        name:'newsDetail',
+        component:()=>import('@/views/newsDetail/index.vue'),
+        meta:{
+          title:'新闻详情'
+        }
+      },
+      {
+        path:'companyDetail',
+        name:'companyDetail',
+        component:()=>import('@/views/companyDetail/index.vue'),
+        meta:{
+          title:'企业详情'
+        }
+      },
+      {
+        path:'companyList',
+        name:'companyList',
+        component:()=>import('@/views/companyList/index.vue'),
+        meta:{
+          title:'企业列表'
+        }
       }
     ]
   }

+ 13 - 0
src/stores/searchStore.ts

@@ -0,0 +1,13 @@
+import { ref, computed } from 'vue'
+import { defineStore } from 'pinia'
+
+export const useSearchStore = defineStore('searchStore', () => {
+  const searchModule = ref<number|null|string>(0);
+  const value = ref<string|null>('');
+  const searchData = ()=>{
+    console.log(searchModule,value);
+  }
+
+
+  return { searchModule, value, searchData }
+})

+ 10 - 0
src/utils/formatTime.ts

@@ -0,0 +1,10 @@
+export function formatTime(isoDateString:string|undefined) {
+  if(!isoDateString){
+    return '';
+  }
+  const date = new Date(isoDateString);
+  const year = date.getFullYear();
+  const month = ("0" + (date.getMonth() + 1)).slice(-2); // getMonth returns 0-11, so we add 1
+  const day = ("0" + date.getDate()).slice(-2);
+  return year + "/" + month + "/" + day;
+}

+ 9 - 0
src/utils/getFileExtension.ts

@@ -0,0 +1,9 @@
+export function getFileExtension(filename: string): string {
+  const dotIndex:number = filename.lastIndexOf('.');
+
+  if (dotIndex === -1 || dotIndex === 0) {
+    return '';
+  }
+
+  return filename.slice(dotIndex + 1);
+}

+ 51 - 0
src/utils/queryFieldMethod.ts

@@ -0,0 +1,51 @@
+export const queryFieldMethod = (columnName:string,queryStr:string)=>{
+  const conditionJsonWhole:any[] = [];
+  if(queryStr != ''){
+    if(queryStr == null) queryStr = '';
+    conditionJsonWhole.push({
+      column:columnName,
+      type:'eq',
+      value:queryStr
+    });
+  }
+
+  const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
+  return ({
+    conditionJson:s
+  })
+}
+
+export const queryLikeFieldMethod = (columnName:string,queryStr:string,pageNum:number,pageSize:number)=>{
+  const conditionJsonWhole:any[] = [];
+  if(queryStr != ''){
+    if(queryStr == null) queryStr = '';
+    conditionJsonWhole.push({
+      column:columnName,
+      type:'like',
+      value:queryStr
+    });
+  }
+
+  const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
+  return ({
+    conditionJson:s,
+    pageNum,
+    pageSize
+  })
+}
+export const queryLikeFieldMethod2 = (columnName:string,queryStr:string)=>{
+  const conditionJsonWhole:any[] = [];
+  if(queryStr != ''){
+    if(queryStr == null) queryStr = '';
+    conditionJsonWhole.push({
+      column:columnName,
+      type:'like',
+      value:queryStr
+    });
+  }
+
+  const s = encodeURIComponent(JSON.stringify(conditionJsonWhole));
+  return ({
+    conditionJson:s
+  })
+}

+ 194 - 0
src/utils/request.ts

@@ -0,0 +1,194 @@
+import axios from 'axios'
+import {
+  ElNotification,
+  ElMessageBox,
+  ElMessage,
+  ElLoading
+} from 'element-plus'
+// import { saveAs } from 'file-saver'
+
+let downloadLoadingInstance
+// 是否显示重新登录
+export const isRelogin = { show: false }
+
+axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+// 创建axios实例
+const service = axios.create({
+  // axios中请求配置有baseURL选项,表示请求URL公共部分
+  baseURL: import.meta.env.VITE_APP_BASE_URL,
+  // 超时
+  timeout: 60000
+})
+
+// request拦截器
+service.interceptors.request.use(
+  (config) => {
+    // 是否需要设置 token
+    // const isToken = (config.headers || {}).isToken === false
+    // 是否需要防止数据重复提交
+    // const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
+    // if (getToken() && !isToken) {
+    //   config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
+    // }
+    // get请求映射params参数
+    // if (config.method === 'get' && config.params) {
+    //   let url = config.url + '?' + tansParams(config.params)
+    //   url = url.slice(0, -1)
+    //   config.params = {}
+    //   config.url = url
+    // }
+    // if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
+    //   const requestObj = {
+    //     url: config.url,
+    //     data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
+    //     time: new Date().getTime()
+    //   }
+    //   const sessionObj = cache.session.getJSON('sessionObj')
+    //   if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
+    //     cache.session.setJSON('sessionObj', requestObj)
+    //   } else {
+    //     const s_url = sessionObj.url;                // 请求地址
+    //     const s_data = sessionObj.data;              // 请求数据
+    //     const s_time = sessionObj.time;              // 请求时间
+    //     const interval = 1000;                       // 间隔时间(ms),小于此时间视为重复提交
+    //     if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
+    //       const message = '数据正在处理,请勿重复提交';
+    //       console.warn(`[${s_url}]: ` + message)
+    //       return Promise.reject(new Error(message))
+    //     } else {
+    //       cache.session.setJSON('sessionObj', requestObj)
+    //     }
+    //   }
+    // }
+    return config
+  },
+  (error) => {
+    console.log(error)
+    Promise.reject(error)
+  }
+)
+
+// 响应拦截器
+service.interceptors.response.use(
+  (res) => {
+    // console.log(res.data.data)
+    // 未设置状态码则默认成功状态
+    const code = res.data.code || 200
+    // 获取错误信息
+    // const msg = errorCode[code] || res.data.msg || errorCode['default']
+    const msg = res.data.msg
+    // 二进制数据则直接返回
+    if (
+      res.request.responseType === 'blob' ||
+      res.request.responseType === 'arraybuffer'
+    ) {
+      return res.data
+    }
+    if (code === 401) {
+      if (!isRelogin.show) {
+        isRelogin.show = true
+        ElMessageBox.confirm(
+          '登录状态已过期,您可以继续留在该页面,或者重新登录',
+          '系统提示',
+          {
+            confirmButtonText: '重新登录',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }
+        )
+          .then(() => {
+            isRelogin.show = false
+            // store.dispatch('LogOut').then(() => {
+            //   location.href = '/index'
+            // })
+          })
+          .catch(() => {
+            isRelogin.show = false
+          })
+      }
+      return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+    } else if (code === 500) {
+      ElMessage({
+        message: msg,
+        type: 'error'
+      })
+      return Promise.reject(new Error(msg))
+    } else if (code !== 200) {
+      ElNotification.error({
+        title: msg
+      })
+      return Promise.reject('error')
+    } else {
+      return Promise.resolve(res.data)
+    }
+  },
+  (error) => {
+    console.log('err' + error)
+    let { message } = error
+    if (message == 'Network Error') {
+      message = '后端接口连接异常'
+    } else if (message.includes('timeout')) {
+      message = '系统接口请求超时'
+    } else if (message.includes('Request failed with status code')) {
+      message = '系统接口' + message.substr(message.length - 3) + '异常'
+    }
+    ElMessage({
+      message: message,
+      type: 'error',
+      duration: 5 * 1000
+    })
+    return Promise.reject(error)
+  }
+)
+
+export async function downloadFile(url:string, fileName:string) {
+  try {
+    const response = await axios.get(url, { responseType: 'blob' }); // 设置响应类型为blob
+    const urlForDownload = window.URL.createObjectURL(new Blob([response.data]));
+    const link = document.createElement('a');
+    link.href = urlForDownload;
+    link.download = fileName; // 指定下载的文件名
+    document.body.appendChild(link);
+    link.click();
+    window.URL.revokeObjectURL(urlForDownload);
+    link.remove(); // 移除创建的a标签
+  } catch (error) {
+    console.error('下载文件时出错:', error);
+  }
+}
+
+// excel下载方法 --- charset=utf-8
+// export function downloadExcel(url, params, filename) {
+//   downloadLoadingInstance = ElLoading.service({
+//     text: '正在下载数据,请稍候',
+//     background: 'rgba(0, 0, 0, 0.7)'
+//   })
+//   return service
+//     .post(url, params, {
+//       headers: { 'Content-Type': 'application/json; charset=utf-8' },
+//       responseType: 'blob'
+//     })
+//     .then(async (data) => {
+//       const BLOB = new Blob([data]) // Blob 对象表示一个不可变、原始数据的类文件对象(File 接口都是基于Blob)
+//       const fileReader = new FileReader() // FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件的内容
+//       fileReader.readAsDataURL(BLOB) // 开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容
+//       fileReader.onload = (event) => {
+//         // 处理load事件。该事件在读取操作完成时触发
+//         // 新建个下载的a标签,完成后移除。
+//         const a = document.createElement('a')
+//         a.download = filename
+//         a.href = event.target.result
+//         document.body.appendChild(a)
+//         a.click()
+//         document.body.removeChild(a)
+//       }
+//       downloadLoadingInstance.close()
+//     })
+//     .catch((r) => {
+//       console.error(r)
+//       ElMessage.error('下载文件出现错误,请联系管理员!')
+//       downloadLoadingInstance.close()
+//     })
+// }
+
+export default service

+ 0 - 3
src/views/AboutView.vue

@@ -1,3 +0,0 @@
-<template>首页</template>
-
-<style></style>

+ 284 - 35
src/views/HomeView/index.vue

@@ -1,44 +1,293 @@
-<script setup lang="ts"></script>
+<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 { getFileExtension } from '@/utils/getFileExtension'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { formatTime } from '../../utils/formatTime'
+
+let router = useRouter()
+
+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#")
+  }
+}
+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 creditDynamics = ref<NewsData[]>([])
+const dickMapAll = ref<Map<string,string>>(new Map());
+const data1 = ref();
+const data2 = ref();
+const data3 = ref();
+const data4 = ref();
+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 res3 = await getNews(queryFieldMethod('special_column',dickMap.get('信用动态')))
+  if(res3.code == 200){
+    creditDynamics.value = res3.data.slice(0,5);
+  }
+  //获取行政许可 数据
+  const res4 = await get1({pageNum:1,pageSize:4})
+  data1.value = res4.records.slice(0,4);
+  //获取行政处罚 数据
+  const res5 = await get2({pageNum:1,pageSize:4})
+  data2.value = res5.records.slice(0,4);
+  //获取守信红名单 数据
+  const res6 = await get3({pageNum:1,pageSize:4})
+  data3.value = res6.records.slice(0,4);
+  //获取失信黑名单 数据
+  const res7 = await get4({pageNum:1,pageSize:4})
+  data4.value = res7.data.result.slice(0,4);
+}
+const toCompanyList = (n:number)=>{
+  router.push({
+    path:'/companyList',
+    query:{
+      n
+    }
+  })
+
+}
+const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  console.log(dickMapKey)
+  router.push({
+    path:'/creditDynamicsDetail',
+    query:{
+      dickMapKey,
+      dickMapValue
+    }
+  });
+}
+init()
+</script>
 
 <template>
-    <div class="homeBox">
-        <div class="HBHeader">
-            <div>热点新闻一这是标题比萨卷凯撒沙拉碗就是啊</div>
-            <div>热点新闻一这是标题比萨卷凯撒沙拉碗就是热点新闻一这是标题比萨卷凯撒沙拉碗就是啊热点新闻一这是标题比萨</div>
+    <div class="homeContainer">
+      <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>
         </div>
-
-        <div class="imgTemplate"></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>
+        </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="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>
+          <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>
+        </div>
+        <div class="w-451px 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>
+          <div class="h-2px bg-blue"></div>
+          <div class="p-10px flex justify-between" v-for="(item,index) in data2" :key="index">
+            <div>{{item.administrativePartyName}}</div>
+            {{item.penaltyDecisionDate.split('T')[0]}}
+          </div>
+        </div>
+        <div class="w-451px 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>
+          <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>
+        </div>
+        <div class="w-451px 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(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>{{item.enterpriseName}}</div>
+            </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>
+      <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>
+      <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 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>
+          </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 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="/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>
+      <div class="h-20px "></div>
     </div>
 </template>
 
 <style scoped lang="scss">
-.homeBox {
-    border: 1px solid red;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    flex-direction: column;
-
-    .HBHeader {
-        width: 1200px;
-        border: 1px solid red;
-        height: 100px;
-
-        div:nth-chile(1) {
-            font-size: 24px;
-            color: #000000;
-            line-height: 0px;
-            letter-spacing: 50px;
-            text-align: left;
-            font-style: normal;
-            text-transform: none;
-        }
-    }
-
-    .imgTemplate {
-        border: 1px solid red;
-        height: 288px;
-        width: 1200px;
-    }
+.homeContainer{
+  background-color: #ecf0f9;
 }
 </style>

+ 62 - 3
src/views/about/index.vue

@@ -1,7 +1,66 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import SmallSearch from '@/components/SmallSearch.vue'
+import FourDynamics from '@/components/FourDynamics.vue'
+import NewDynamics from '@/components/NewDynamics.vue'
+import { getNews, type NewsData } from '@/api/home'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import {ref} from 'vue'
+import { formatTime } from '@/utils/formatTime'
+import { useRouter } from 'vue-router'
+const aboutList = ref<NewsData[]>([])
+const router = useRouter()
+const init = async ()=>{
+  const res = await getNews(queryFieldMethod('special_column','notification_announcement'))
+  if(res.code == 200){
+    aboutList.value = res.data
+    console.log(aboutList.value)
+  }
+}
+const toDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+init();
+
+</script>
 
 <template>
-    <div>通知公告</div>
+  <div class="aboutContainer">
+    <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">
+      你所在的位置:<span class="cursor-pointer">首页</span> > <span class="color-#006eff">通知公告</span>
+    </div>
+    <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 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>
+          <div class="flex justify-between">
+            <div class="mt-15px text-#858585 text-13px">
+              <div class="text-13px">{{formatTime(item.date)}}</div>
+            </div>
+          </div>
+          <div class="h-1px bg-#e9e9e9 mt-24px mb-24px"></div>
+        </div>
+      </div>
+      <div class="w-294px">
+        <small-search />
+        <four-dynamics />
+        <new-dynamics />
+      </div>
+    </div>
+  </div>
 </template>
 
-<style scoped></style>
+<style scoped>
+.aboutContainer {
+  background-color: #ecf0f9;
+}
+</style>

+ 5 - 0
src/views/about/type/index.ts

@@ -0,0 +1,5 @@
+import type { NewsData } from '@/api/home'
+
+export interface aboutResponse extends AxiosResponse{
+  data:NewsData[]
+}

+ 39 - 0
src/views/companyDetail/index.vue

@@ -0,0 +1,39 @@
+<script setup lang="ts">
+import { useRoute, useRouter } from 'vue-router'
+import { getCompanyDetailById } from '@/views/companyDetail/type'
+import { companyDetailMap } from '@/views/companyDetail/map'
+import { ref } from 'vue'
+
+const router = useRouter()
+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)
+  companyDetailMap.forEach((value,key)=>{
+    showCurrentCompanyDetail.value.set(value,res.data[key]);
+  })
+}
+init()
+</script>
+
+<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>
+   </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">
+      <div class="w-30% p-20px border-solid border-1px border-#e5e5e5">{{item[0]}}</div>
+      <div class="w-70% p-20px border-solid border-1px border-#e5e5e5">{{item[1]}}</div>
+    </div>
+   </div>
+ </div>
+</template>
+
+<style scoped>
+.companyDetailContainer{
+  background-color: #ecf0f9;
+}
+</style>

+ 28 - 0
src/views/companyDetail/map/index.ts

@@ -0,0 +1,28 @@
+export const companyDetailMap = new Map<string,string>();
+// 添加键值对到映射中
+companyDetailMap.set('address', '注册地址');
+companyDetailMap.set('approvalTime', '批准时间');
+companyDetailMap.set('businessPeriod', '营业期限');
+companyDetailMap.set('businessScope', '经营范围');
+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('industryCode', '行业代码');
+companyDetailMap.set('legalRepresentative', '法定代表人');
+companyDetailMap.set('legalRepresentativeId', '法定代表人身份证号');
+companyDetailMap.set('paidInCapital', '实收资本');
+companyDetailMap.set('postalCode', '邮政编码');
+companyDetailMap.set('registerNumber', '注册号');
+companyDetailMap.set('registeredCapital', '注册资本');
+companyDetailMap.set('registrationAuthority', '注册机关');
+companyDetailMap.set('registrationCategory', '注册类别');
+companyDetailMap.set('status', '经营状态');
+companyDetailMap.set('supervisoryAuthority', '监管机构');
+companyDetailMap.set('unifiedSocialCreditCode', '统一社会信用代码');
+
+console.log(companyDetailMap);

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

@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+enum API{
+  GET_COMPANY_DETAIL_BY_ID = '/crmBusinessLicenseInformation/getById/',
+}
+
+export interface companyDetailDataType{
+  address: string;
+  approvalTime: string;
+  businessPeriod: string;
+  businessScope: string;
+  cancellationTime: string;
+  contactName: string;
+  contactPhone: string;
+  enterpriseName: string;
+  enterprisePhone: string;
+  enterpriseType: string;
+  establishmentDate: string;
+  id: number;
+  industryCode: string;
+  legalRepresentative: string;
+  legalRepresentativeId: string;
+  paidInCapital: string;
+  postalCode: string;
+  registerNumber: string;
+  registeredCapital: string;
+  registrationAuthority: string;
+  registrationCategory: string;
+  status: string;
+  supervisoryAuthority: string;
+  unifiedSocialCreditCode: string;
+  [key: string]: any
+}
+
+export interface companyDetailRes extends AxiosResponse{
+  data: companyDetailDataType;
+}
+
+export const getCompanyDetailById = (id:string)=> {
+  return request.get<any,companyDetailRes>(API.GET_COMPANY_DETAIL_BY_ID+id);
+}

+ 84 - 0
src/views/companyList/index.vue

@@ -0,0 +1,84 @@
+<script setup lang="ts">
+import { type LocationQueryValue, useRoute } from 'vue-router'
+import { get1, get2, get3, get4 } from '@/api/home'
+import {ref} from 'vue'
+const route = useRoute()
+const k:any = route.query.n
+const currentShowList = ref<any>([]);
+function removeDuplicatesById(arr:any, key:any) {
+  return arr.reduce((accumulator:any, current:any) => {
+    if (!accumulator.some((item:any) => item[key] === current[key])) {
+      accumulator.push(current);
+    }
+    return accumulator;
+  }, []);
+}
+const getData =async ()=>{
+  if(k == 1){
+    console.log(1)
+    const res1 = await get1({pageNum:1,pageSize:1000});
+    const bo = removeDuplicatesById(res1.records, 'administrativePartyName')
+    const result = bo.map((item:any)=>{
+      return ({
+        name: item.administrativePartyName,
+        time: item.licenseDecisionDate,
+      })
+    })
+    currentShowList.value = result;
+  }else if(k == 2){
+    const res2 = await get2({pageNum:1,pageSize:1000});
+    const bo = removeDuplicatesById(res2.records, 'administrativePartyName')
+    const result = bo.map((item:any)=>{
+      return ({
+        name: item.administrativePartyName,
+        time: item.penaltyDecisionDate.split('T')[0],
+      })
+    })
+    currentShowList.value = result;
+  }else if(k == 3){
+    const res3 = await get3({pageNum:1,pageSize:1000});
+    const bo = removeDuplicatesById(res3.records, 'subjectName')
+    const result = bo.map((item:any)=>{
+      return ({
+        name: item.subjectName,
+        time: item.statisticsTime.split('T')[0],
+      })
+    })
+    currentShowList.value = result;
+  }else if(k == 4){
+    const res4:any = await get4({pageNum:1,pageSize:1000});
+    const bo = removeDuplicatesById(res4.data.result, 'enterpriseName')
+    console.log(bo)
+    const result = bo.map((item:any)=>{
+      return ({
+        name: item.enterpriseName
+      })
+    })
+    currentShowList.value = result;
+  }
+}
+const init = () => {
+  getData();
+}
+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 class="text-20px p-20px flex justify-between">
+          <div>{{item.name}}</div>
+          <div class="text-gray text-20px">{{item.time}}</div>
+        </div>
+        <div class="h-1px bg-gray"></div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.conpanyListContainer{
+  background-color: #ecf0f9;
+}
+</style>

+ 85 - 0
src/views/creditDynamics/creditDynamicsDetail/index.vue

@@ -0,0 +1,85 @@
+<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 { ElMessage } from 'element-plus'
+import NewDynamics from '@/components/NewDynamics.vue'
+import SmallSearch from '@/components/SmallSearch.vue'
+import FourDynamics from '@/components/FourDynamics.vue'
+
+const route = useRoute()
+const router = useRouter()
+const creditDynamicsList = ref<NewsData[]>([]);
+const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  router.push({
+    path:'/creditDynamicsDetail',
+    query:{
+      dickMapKey,
+      dickMapValue
+    }
+  });
+}
+watch(()=>route.query.dickMapKey,()=>{
+  getData();
+})
+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;
+  }else {
+    ElMessage({
+      message:res.msg,
+      type:'error'
+    })
+  }
+}
+const init = async ()=>{
+  await getData()
+  const res5 = await getNews(queryFieldMethod('special_column','credit_dynamics'));
+  if (res5.code == 200){
+    creditDynamicsList.value = res5.data;
+  }
+}
+const toDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+init();
+</script>
+
+<template>
+  <div class="warnningContainer">
+    <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">
+      你所在的位置:<span class="cursor-pointer" @click="$router.push('/home')" >首页</span> > <span class="cursor-pointer" @click="$router.push('/creditDynamics')">信用动态</span>> > <span class="color-#006eff">{{$route.query.dickMapValue?$route.query.dickMapValue:'详情'}}</span>
+    </div>
+    <div class="w-912px ml-auto mr-auto flex">
+      <div class="w-603px bg-white bg-opacity-90 mr-15px">
+        <div class="p-20px pl-24px pr-24px cursor-pointer " v-for="(item,index) in dataList" :key="index" @click="toDetail(item.id)">
+          <div class="text-16px text-#000000 bold ">{{ item.title }}</div>
+          <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>
+      <div class="w-294px bg-opacity-90">
+        <small-search />
+        <four-dynamics />
+        <new-dynamics />
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.warnningContainer {
+  background-color: #ecf0f9;
+}
+</style>

+ 181 - 3
src/views/creditDynamics/index.vue

@@ -1,5 +1,183 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { useRouter } from 'vue-router'
+import { ref } from 'vue'
+import { getDick, getNews, type NewsData, type NewsResponseData } from '@/api/home'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { formatTime } from '@/utils/formatTime'
+import { getFileExtension } from '@/utils/getFileExtension'
+import NewDynamics from '@/components/NewDynamics.vue'
 
-<template>信用动态</template>
+const router = useRouter();
+const dickMapAll = ref<Map<string,string>>(new Map());
 
-<style scoped></style>
+const toNewsDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+const BASE_URL = import.meta.env.VITE_APP_BASE_URL
+const bigNewsData = ref<NewsData[]>();
+const inDynamicsData = ref<NewsData[]>([]);
+const outDynamicsData = ref<NewsData[]>([]);
+const currentCityDynamicsData = ref<NewsData[]>([]);
+const parkDynamicsData = ref<NewsData[]>([]);
+const creditDynamicsList = ref<NewsData[]>([]);
+const init = async ()=>{
+  const {data} = await getDick()
+  dickMapAll.value = data.reduce((acc: Map<string, string>, cur: { dictLabel: string, dictValue: string }) => {
+    const key = cur.dictLabel;
+    acc.set(key, cur.dictValue);
+    return acc;
+  }, new Map())
+  const res:NewsResponseData = await getNews(queryFieldMethod('special_column','big_news'))
+  if(res.code === 200){
+    bigNewsData.value = res.data;
+    console.log(bigNewsData.value)
+  }
+  const res1 = await getNews(queryFieldMethod('special_column','provincialDynamics'))
+  if(res1.code === 200){
+    inDynamicsData.value = res1.data.slice(0,3);
+  }
+  const res2 = await getNews(queryFieldMethod('special_column','outsideProvincialDynamics'))
+  if(res2.code === 200){
+    outDynamicsData.value = res2.data.slice(0,3);
+  }
+  const res3 = await getNews(queryFieldMethod('special_column','currentCityDynamics'));
+  if(res3.code === 200){
+    currentCityDynamicsData.value = res3.data.slice(0,3);
+  }
+  const res4 = await getNews(queryFieldMethod('special_column','parkDynamics'));
+  if(res4.code === 200){
+    parkDynamicsData.value = res4.data.slice(0,3);
+  }
+  const res5 = await getNews(queryFieldMethod('special_column','credit_dynamics'));
+  if (res5.code == 200){
+    creditDynamicsList.value = res5.data;
+  }
+}
+const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  router.push({
+    path:'/creditDynamicsDetail',
+    query:{
+      dickMapKey,
+      dickMapValue
+    }
+  });
+}
+const computeImgUrl = (files:FileType[])=>{
+  return BASE_URL + files.filter(item=>{
+    return getFileExtension(item.fileUrl) == 'png'||getFileExtension(item.fileUrl) == 'jpg'
+  })?.[0]?.fileUrl
+}
+init()
+</script>
+
+<template>
+  <div class="creditDynamicsContainer">
+    <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">
+      你所在的位置:<span class="cursor-pointer"  @click="$router.push('/home')" >首页</span> > <span class="color-#006eff">信用动态</span>
+    </div>
+    <div class="w-912px ml-auto mr-auto mt-20px pb-54px ">
+      <el-carousel :interval="5000" arrow="always">
+        <el-carousel-item v-for="(item,index) in bigNewsData" :key="index">
+          <div class="flex">
+            <div class="w-562px h-288px">
+              <img class="w-100% h-100%" :src="computeImgUrl(item.files)">
+            </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="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>
+              </div>
+            </div>
+          </div>
+        </el-carousel-item>
+      </el-carousel>
+    </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-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>
+          </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" />
+          </div>
+          <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>
+        </div>
+        <div class="w-294px 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>
+          </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" />
+          </div>
+          <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>
+        </div>
+        <div class="w-294px 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>
+            <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="w-266px mr-auto ml-auto h-138px m-9px pb-20px">
+            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
+          </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>
+        </div>
+        <div class="w-294px 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>
+            <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="w-266px mr-auto ml-auto h-138px m-9px pb-20px">
+            <img class="w-100% h-100%" src="/src/assets/img/首页背景.png" />
+          </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>
+        </div>
+      </div>
+      <div class="w-294px bg-white bg-opacity-90 ml-15px rounded-10px">
+        <NewDynamics />
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.creditDynamicsContainer{
+  background-color: #ecf0f9;
+}
+</style>

+ 96 - 3
src/views/creditEcaluationResults/index.vue

@@ -1,5 +1,98 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { ref } from 'vue'
+import { type CompanyData, type CompanyListData, getCompanyList } from '@/views/creditEcaluationResults/type'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { getNews, type NewsData } from '@/api/home'
+import { useRouter } from 'vue-router'
+import NewDynamics from '@/components/NewDynamics.vue'
+import SmallSearch from '@/components/SmallSearch.vue'
 
-<template>信用评价结果</template>
+const companyList = ref<CompanyData[]>();
+const pageSize = ref<number>(10);
+const currentPage = ref<number>(1);
+const total = ref<number>(0);
+let router = useRouter()
+const getCompany = async (currentPage:number, pageSize:number)=>{
+  const res = await getCompanyList(currentPage,pageSize);
+  if(res.code == 200){
+    companyList.value = res.data.result;
+    console.log(companyList.value)
+    total.value = res.data.totalSize;
+  }
+}
+const handleChange = ()=>{
+  getCompany(currentPage.value, pageSize.value)
+}
+const creditDynamics = ref<NewsData[]>([])
 
-<style scoped></style>
+const init = async ()=>{
+  await getCompany(currentPage.value, pageSize.value)
+  //获取信用动态 数据
+  const res3 = await getNews(queryFieldMethod('special_column','credit_dynamics'))
+  if(res3.code == 200){
+    creditDynamics.value = res3.data;
+  }
+}
+const toDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+init()
+</script>
+
+<template>
+  <div class="resContainer">
+    <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 ml-auto mr-auto flex">
+      <div class="w-603px bg-white bg-opacity-90 mr-15px h-750px">
+<!--        <div class="p-20px pl-24px pr-24px">-->
+<!--          <div class="text-16px text-#000000 bold ">文本企业</div>-->
+<!--          <div class="mt-8px line-height-23px text-13px text-#464646 line-clamp-4">文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本</div>-->
+<!--          <div class="mt-20px h-1px bg-#e9e9e9"></div>-->
+<!--        </div>-->
+        <div class="flex justify-around border-solid border-#e9e9e9 border-b-1px text-18px line-height-28px bg-[#fbfbfbff]">
+          <div class="w-65% text-center border-solid border-#e9e9e9 border-1px">企业名称</div>
+          <div class="w-35% text-center border-solid border-#e9e9e9 border-1px">企业信用评价等级</div>
+        </div>
+        <div class="flex justify-around border-solid border-#e9e9e9 border-b-1px text-18px line-height-60px" v-for="(item,index) in companyList" :key="index">
+          <div class="w-65% pl-20px border-solid border-#e9e9e9 border-b-1px">
+            <div class="border-solid border-#e9e9e9 border-b-1px line-clamp-1">{{ item.enterpriseName }}</div>
+          </div>
+          <div class="w-35% text-center border-solid border-#e9e9e9 border-b-1px">
+            <div class="text-center border-solid border-#e9e9e9 border-b-1px">{{item.grade}}</div>
+          </div>
+        </div>
+        <div class="ml-120px mt-20px">
+          <div class="example-pagination-block">
+            <el-pagination
+              layout="prev, pager, next, total"
+              v-model:pageSize = pageSize
+              v-model:currentPage = currentPage
+              :total="total"
+              @change = handleChange
+            />
+          </div>
+        </div>
+      </div>
+      <div class="w-294px bg-opacity-90">
+        <small-search />
+        <new-dynamics />
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.resContainer {
+  background-color: #ecf0f9;
+}
+</style>

+ 31 - 0
src/views/creditEcaluationResults/type/index.ts

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+enum API {
+  GET_COMPANY_LIST = '/crmHighTechZoneEnterprises/getCreditScoreList'
+}
+
+export interface CompanyData{
+  enterpriseName: string,
+  grade: string,
+  sortMark: number,
+  total:number,
+  unifiedSocialCreditCode: string
+}
+
+export interface CompanyListData extends pageAxiosResponse{
+  result:CompanyData[];
+}
+export interface CompanyListDataType extends AxiosResponse{
+  data:CompanyListData;
+}
+
+export const getCompanyList = (pageNum:number, pageSize:number, unifiedSocialCreditCode:string = '')=>{
+  return request.get<any,CompanyListDataType>(API.GET_COMPANY_LIST,{
+    params:{
+      pageNum,
+      pageSize,
+      unifiedSocialCreditCode,
+      condition:"A,AA,AAA"
+    }
+  });
+};

+ 175 - 3
src/views/creditServices/index.vue

@@ -1,5 +1,177 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
 
-<template>信用服务</template>
+import { ref , reactive} from 'vue'
+import { ElMessage, type FormInstance, type FormProps, type FormRules } from 'element-plus'
+import { delImgById, saveSelfReport } from '@/views/creditServices/type'
+import SmallSearch from '@/components/SmallSearch.vue'
+import NewDynamics from '@/components/NewDynamics.vue'
+import { downloadFile } from '@/utils/request'
 
-<style scoped></style>
+const labelPosition = ref<FormProps['labelPosition']>('left')
+const selfReportRef = ref<FormInstance>();
+const uploadFilesList = ref<any>([]);
+const selfReportForm = ref({
+  contactInformation: '',
+  contacts: '',
+  enterpriseName: '',
+  unifiedSocialCreditCode:'',
+  complainantIdNumber:'',
+  files:uploadFilesList.value
+})
+const rules = reactive<FormRules<typeof  selfReportForm.value>>({
+  contactInformation: [
+    { required: true, message: '请输入联系电话', trigger: 'blur' },
+    { min: 11, max: 11, message: '请输入正确的联系电话', trigger: 'blur' }
+  ],
+  contacts: [
+    { required: true, message: '请输入联系人', trigger: 'blur' },
+    { min: 2, max: 10, message: '请输入正确的联系人', trigger: 'blur' }
+  ],
+  enterpriseName: [
+    { required: true, message: '请输入企业名称', trigger: 'blur' }
+  ],
+  complainantIdNumber:[
+    { required: true,validator:(rule: any, value: any, callback: any)=>{
+        if (value == '') {
+          callback(new Error('请输入身份证'))
+        }
+        if (!/^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\d{3}(\d|X|x)$/.test(value)) {
+          callback(new Error('请输入正确的身份证'))
+        }
+        callback()
+      }, trigger: 'blur' }
+  ],
+  unifiedSocialCreditCode: [
+    { required: true,validator:(rule: any, value: any, callback: any)=>{
+        if (value == '') {
+          callback(new Error('请输入统一社会信用代码'))
+        }
+        if (!/^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/.test(value)) {
+          callback(new Error('请输入正确的统一社会信用代码'))
+        }
+        callback()
+      }, trigger: 'blur' }
+  ]
+})
+const submitReportForm = ()=>{
+  selfReportRef.value?.validate( async (valid) => {
+    if (valid) {
+      const res = await saveSelfReport(selfReportForm.value);
+      if(res.code == 200){
+        ElMessage.success(res.msg);
+        canSelfReport.value = false;
+        reset()
+      }
+    }
+  })
+}
+const reset = ()=>{
+  selfReportRef.value?.resetFields();
+  uploadFilesList.value = [];
+  fileList.value = [];
+  canSelfReport.value = true;
+}
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: '',
+  // 是否禁用上传
+  isUploading: false,
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + '/commonFile/uploadFile',
+})
+const handleRemove = async (uploadFile:any) => {
+  const res = await delImgById(uploadFile.response.data.id);
+  if(res.code == 200){
+    ElMessage.success('删除成功');
+    uploadFilesList.value = uploadFilesList.value.filter((item:any) => item.id != uploadFile.response.data.id);
+  }
+}
+
+const handleFileSuccess = (q:any)=>{
+  ElMessage.success('上传成功');
+  uploadFilesList.value.push(q.data);
+}
+const fileList = ref([]);
+const canSelfReport = ref<boolean>(true);
+const BASE_URL = import.meta.env.VITE_APP_BASE_URL;
+
+</script>
+
+<template>
+  <div class="serviceContainer">
+    <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">
+      你所在的位置:<span class="cursor-pointer">首页</span> > <span class="color-#006eff">企业自主上报</span>
+    </div>
+    <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>
+          <el-button class="float-right" @click="downloadFile(BASE_URL+'/owSelfReporting/downloadTemplateWord','企业自主上报模版.doc')" type="success">下载上报模版</el-button>
+          <div>企业自主上报信息</div>
+          <div>
+<!--            <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 style="margin: 20px" />
+            <el-form
+              :label-position="labelPosition"
+              label-width="auto"
+              :model="selfReportForm"
+              ref="selfReportRef"
+              style="max-width: 600px"
+              :rules="rules"
+            >
+              <el-form-item label="联系人" prop="contacts">
+                <el-input v-model="selfReportForm.contacts" />
+              </el-form-item>
+              <el-form-item label="联系方式" prop="contactInformation">
+                <el-input v-model="selfReportForm.contactInformation" />
+              </el-form-item>
+              <el-form-item label="身份证号" prop="complainantIdNumber">
+                <el-input v-model="selfReportForm.complainantIdNumber" />
+              </el-form-item>
+              <el-form-item label="企业名称" prop="enterpriseName">
+                <el-input v-model="selfReportForm.enterpriseName" />
+              </el-form-item>
+              <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
+                <el-input v-model="selfReportForm.unifiedSocialCreditCode" />
+              </el-form-item>
+              <el-upload
+                ref="uploadRef"
+                v-model:file-list="fileList"
+                :action="upload.url"
+                :on-remove="handleRemove"
+                :multiple="true"
+                accept=".doc, .docx, .png, .jpg, .pdf"
+                :on-success="handleFileSuccess"
+                :data="{moduleName:'上报模块'}"
+              >
+                <el-button type="primary">上传附件</el-button>
+                <template #tip>
+                  <div class="el-upload__tip">
+                    只能上传doc docx png jpg pdf文件
+                  </div>
+                </template>
+              </el-upload>
+              <el-button @click="submitReportForm" type="primary" :disabled="!canSelfReport">上报</el-button>
+              <el-button @click="reset">重置</el-button>
+            </el-form>
+          </div>
+        </div>
+      </div>
+      <div class="w-294px">
+        <SmallSearch />
+        <NewDynamics />
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.serviceContainer {
+  background-color: #ecf0f9;
+}
+</style>

+ 36 - 0
src/views/creditServices/type/index.ts

@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+
+enum API {
+  SAVE_SELF_REPORT = '/owSelfReporting/save',
+}
+export interface SelfReportResponseData{
+  contactInformation:string,
+  contacts:string,
+  enterpriseName:string,
+  unifiedSocialCreditCode:string,
+  files:any
+}
+export interface SelfReportResponse extends AxiosResponse{
+  data: SelfReportResponseData
+}
+
+export const saveSelfReport = (selfReportData:SelfReportResponseData)=>{
+  const {contactInformation,contacts,enterpriseName,unifiedSocialCreditCode,files} = selfReportData;
+  return request.post<any,SelfReportResponse>(API.SAVE_SELF_REPORT,{
+    contactInformation,
+    contacts,
+    enterpriseName,
+    unifiedSocialCreditCode,
+    files
+  })
+}
+
+//删除图片
+export const delImgById = (id:number) => {
+  return request.get<any,any>('/commonFile/deleteFileById',{
+    params:{
+      id
+    }
+  });
+}

+ 96 - 3
src/views/creditWarning/index.vue

@@ -1,5 +1,98 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { ref } from 'vue'
+import { type CompanyData, type CompanyListData, getCompanyList } from '@/views/creditWarning/type'
+import { queryFieldMethod } from '@/utils/queryFieldMethod'
+import { getNews, type NewsData } from '@/api/home'
+import { useRouter } from 'vue-router'
+import SmallSearch from '@/components/SmallSearch.vue'
+import NewDynamics from '@/components/NewDynamics.vue'
 
-<template>信用警示</template>
+const companyList = ref<CompanyData[]>();
+const pageSize = ref<number>(10);
+const currentPage = ref<number>(1);
+const total = ref<number>(0);
+let router = useRouter()
+const getCompany = async (currentPage:number, pageSize:number)=>{
+  const res = await getCompanyList(currentPage,pageSize);
+  if(res.code == 200){
+    companyList.value = res.data.result;
+    console.log(companyList.value)
+    total.value = res.data.totalSize;
+  }
+}
+const handleChange = ()=>{
+  getCompany(currentPage.value, pageSize.value)
+}
+const creditDynamics = ref<NewsData[]>([])
 
-<style scoped></style>
+const init = async ()=>{
+  await getCompany(currentPage.value, pageSize.value)
+  //获取信用动态 数据
+  const res3 = await getNews(queryFieldMethod('special_column','credit_dynamics'))
+  if(res3.code == 200){
+    creditDynamics.value = res3.data;
+  }
+}
+const toDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+init()
+</script>
+
+<template>
+  <div class="resContainer">
+    <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 ml-auto mr-auto flex">
+      <div class="w-603px bg-white bg-opacity-90 mr-15px h-750px">
+        <!--        <div class="p-20px pl-24px pr-24px">-->
+        <!--          <div class="text-16px text-#000000 bold ">文本企业</div>-->
+        <!--          <div class="mt-8px line-height-23px text-13px text-#464646 line-clamp-4">文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本</div>-->
+        <!--          <div class="mt-20px h-1px bg-#e9e9e9"></div>-->
+        <!--        </div>-->
+        <div class="flex justify-around border-solid border-#e9e9e9 border-b-1px text-18px line-height-28px bg-[#fbfbfbff]">
+          <div class="w-65% text-center border-solid border-#e9e9e9 border-1px">企业名称</div>
+          <div class="w-35% text-center border-solid border-#e9e9e9 border-1px">企业信用评价等级</div>
+        </div>
+        <div class="flex justify-around border-solid border-#e9e9e9 border-b-1px text-18px line-height-60px" v-for="(item,index) in companyList" :key="index">
+          <div class="w-65% pl-20px border-solid border-#e9e9e9 border-b-1px">
+            <div class="border-solid border-#e9e9e9 border-b-1px line-clamp-1">{{ item.enterpriseName }}</div>
+          </div>
+          <div class="w-35% text-center border-solid border-#e9e9e9 border-b-1px">
+            <div class="text-center border-solid border-#e9e9e9 border-b-1px">{{item.grade}}</div>
+          </div>
+        </div>
+        <div class="ml-120px mt-20px">
+          <div class="example-pagination-block">
+            <el-pagination
+              layout="prev, pager, next, total"
+              v-model:pageSize = pageSize
+              v-model:currentPage = currentPage
+              :total="total"
+              @change = handleChange
+            />
+          </div>
+        </div>
+      </div>
+      <div class="w-294px bg-opacity-90">
+        <small-search />
+        <new-dynamics />
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.resContainer {
+  background-color: #ecf0f9;
+}
+</style>

+ 31 - 0
src/views/creditWarning/type/index.ts

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+enum API {
+  GET_COMPANY_LIST = '/crmHighTechZoneEnterprises/getCreditScoreList'
+}
+
+export interface CompanyData{
+  enterpriseName: string,
+  grade: string,
+  sortMark: number,
+  total:number,
+  unifiedSocialCreditCode: string
+}
+
+export interface CompanyListData extends pageAxiosResponse{
+  result:CompanyData[];
+}
+export interface CompanyListDataType extends AxiosResponse{
+  data:CompanyListData;
+}
+
+export const getCompanyList = (pageNum:number, pageSize:number, unifiedSocialCreditCode:string = '',condition:string = 'C,D')=>{
+  return request.get<any,CompanyListDataType>(API.GET_COMPANY_LIST,{
+    params:{
+      pageNum,
+      pageSize,
+      unifiedSocialCreditCode,
+      condition
+    }
+  });
+};

+ 326 - 3
src/views/creditWiseEnterprise/index.vue

@@ -1,5 +1,328 @@
-<script setup lang="ts"></script>
+<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[]>([])
 
-<template>信用慧企</template>
+let router = useRouter()
 
-<style scoped></style>
+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();
+</script>
+
+<template>
+  <div class="wiseEnterpriseContainer">
+    <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>
+<!--    <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>-->
+<!--          <div class="text-16px">文本政策</div>-->
+<!--          <div class="text-13px line-height-23x text-#464646 line-clamp-4 mt-8px">-->
+<!--            文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策-->
+<!--          </div>-->
+<!--          <div class="flex justify-between">-->
+<!--            <div class="flex mt-15px">-->
+<!--              <div class="text-13px rounded-5 p-3px border-solid border-1px border-#ff9900 color-#ff9900 ">文本服务-->
+<!--              </div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--            </div>-->
+<!--            <div class="mt-15px text-#858585 text-13px">-->
+<!--              <div class="text-13px">文本|9999/99/99</div>-->
+<!--            </div>-->
+<!--          </div>-->
+<!--          <div class="h-1px bg-#e9e9e9 mt-24px mb-24px"></div>-->
+<!--        </div>-->
+<!--        <div>-->
+<!--          <div class="text-16px">文本政策</div>-->
+<!--          <div class="text-13px line-height-23x text-#464646 line-clamp-4 mt-8px">-->
+<!--            文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策-->
+<!--          </div>-->
+<!--          <div class="flex justify-between">-->
+<!--            <div class="flex mt-15px">-->
+<!--              <div class="text-13px rounded-5 p-3px border-solid border-1px border-#ff9900 color-#ff9900 ">文本服务-->
+<!--              </div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--            </div>-->
+<!--            <div class="mt-15px text-#858585 text-13px">-->
+<!--              <div class="text-13px">文本|9999/99/99</div>-->
+<!--            </div>-->
+<!--          </div>-->
+<!--          <div class="h-1px bg-#e9e9e9 mt-24px mb-24px"></div>-->
+<!--        </div>-->
+<!--        <div>-->
+<!--          <div class="text-16px">文本政策</div>-->
+<!--          <div class="text-13px line-height-23x text-#464646 line-clamp-4 mt-8px">-->
+<!--            文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策-->
+<!--          </div>-->
+<!--          <div class="flex justify-between">-->
+<!--            <div class="flex mt-15px">-->
+<!--              <div class="text-13px rounded-5 p-3px border-solid border-1px border-#ff9900 color-#ff9900 ">文本服务-->
+<!--              </div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--            </div>-->
+<!--            <div class="mt-15px text-#858585 text-13px">-->
+<!--              <div class="text-13px">文本|9999/99/99</div>-->
+<!--            </div>-->
+<!--          </div>-->
+<!--          <div class="h-1px bg-#e9e9e9 mt-24px mb-24px"></div>-->
+<!--        </div>-->
+<!--        <div>-->
+<!--          <div class="text-16px">文本政策</div>-->
+<!--          <div class="text-13px line-height-23x text-#464646 line-clamp-4 mt-8px">-->
+<!--            文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策文本政策-->
+<!--          </div>-->
+<!--          <div class="flex justify-between">-->
+<!--            <div class="flex mt-15px">-->
+<!--              <div class="text-13px rounded-5 p-3px border-solid border-1px border-#ff9900 color-#ff9900 ">文本服务-->
+<!--              </div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+<!--            </div>-->
+<!--            <div class="mt-15px text-#858585 text-13px">-->
+<!--              <div class="text-13px">文本|9999/99/99</div>-->
+<!--            </div>-->
+<!--          </div>-->
+<!--          <div class="h-1px bg-#e9e9e9 mt-24px mb-24px"></div>-->
+<!--        </div>-->
+<!--      </div>-->
+<!--      <div class="w-294px">-->
+<!--        <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="relative mb-15px">-->
+<!--            <input class="w-266px h-31px bg-#f3f3f3 m-14px mt-30px mb-30px" placeholder="请输入关键字" />-->
+<!--            <button class="absolute right-13px top-31px">-->
+<!--              <svg t="1718242035057" class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="19" height="19">-->
+<!--                <path-->
+<!--                  d="M469.333333 85.333333a384 384 0 0 1 300.032 623.658667l139.306667 139.349333a42.666667 42.666667 0 1 1-60.330667 60.330667l-139.349333-139.306667A384 384 0 1 1 469.333333 85.333333z m0 85.333334a298.666667 298.666667 0 1 0 0 597.333333 298.666667 298.666667 0 0 0 0-597.333333z"-->
+<!--                  fill="#000000" p-id="1555"></path>-->
+<!--              </svg>-->
+<!--            </button>-->
+<!--          </div>-->
+<!--        </div>-->
+<!--        <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">文本</div>-->
+<!--            <div class="m-10px text-12px color-#030303 w-118px h-52px line-height-52px bg-#ecf4ff text-center">文本</div>-->
+<!--            <div class="m-10px text-12px color-#030303 w-118px h-52px line-height-52px bg-#cce2ff text-center">文本</div>-->
+<!--            <div class="m-10px text-12px color-#030303 w-118px h-52px line-height-52px bg-#ecf4ff text-center">文本</div>-->
+<!--          </div>-->
+<!--        </div>-->
+<!--        <div class="bg-white mt-15px">-->
+<!--          <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>-->
+<!--            <div class="mt-20px mb-20px">-->
+<!--              <div class="w-266px mr-auto ml-auto line-clamp-2 bold text-13px">文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本</div>-->
+<!--              <div class="text-#ff9900 text-13px cursor-pointer text-right mt-5px">查看更多></div>-->
+<!--            </div>-->
+<!--            <div class="h-1px bg-gray"></div>-->
+<!--          </div>-->
+<!--          <div>-->
+<!--            <div class="mt-20px mb-20px">-->
+<!--              <div class="w-266px mr-auto ml-auto line-clamp-2 bold text-13px">文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本</div>-->
+<!--              <div class="text-#ff9900 text-13px cursor-pointer text-right mt-5px">查看更多></div>-->
+<!--            </div>-->
+<!--            <div class="h-1px bg-gray"></div>-->
+<!--          </div>-->
+<!--          <div>-->
+<!--            <div class="mt-20px mb-20px">-->
+<!--              <div class="w-266px mr-auto ml-auto line-clamp-2 bold text-13px">文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本</div>-->
+<!--              <div class="text-#ff9900 text-13px cursor-pointer text-right mt-5px">查看更多></div>-->
+<!--            </div>-->
+<!--            <div class="h-1px bg-gray"></div>-->
+<!--          </div>-->
+<!--          <div>-->
+<!--            <div class="mt-20px mb-20px">-->
+<!--              <div class="w-266px mr-auto ml-auto line-clamp-2 bold text-13px">文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本</div>-->
+<!--              <div class="text-#ff9900 text-13px cursor-pointer text-right mt-5px">查看更多></div>-->
+<!--            </div>-->
+<!--            <div class="h-1px bg-gray"></div>-->
+<!--          </div>-->
+<!--          <div>-->
+<!--            <div class="mt-20px mb-20px">-->
+<!--              <div class="w-266px mr-auto ml-auto line-clamp-2 bold text-13px">文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本</div>-->
+<!--              <div class="text-#ff9900 text-13px cursor-pointer text-right mt-5px">查看更多></div>-->
+<!--            </div>-->
+<!--            <div class="h-1px bg-gray"></div>-->
+<!--          </div>-->
+<!--        </div>-->
+<!--      </div>-->
+<!--    </div>-->
+  </div>
+</template>
+
+<style scoped>
+.wiseEnterpriseContainer {
+  background-color: #ecf0f9;
+}
+</style>

+ 49 - 0
src/views/newsDetail/index.vue

@@ -0,0 +1,49 @@
+<script setup lang="ts">
+import { useRoute } from 'vue-router'
+import { getDick, getNewsById, type NewsData, type NewsResponseData } from '@/api/home'
+import {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));
+  if(res.code == 200){
+    newsData.value = res.data;
+  }
+}
+const BASE_URL = import.meta.env.VITE_APP_BASE_URL;
+const newsData = ref<NewsData>();
+getData()
+</script>
+
+<template>
+  <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="min-h-500px">
+    <div class="w-912px ml-a mr-a text-24px color-black bold text-center mb-30px">
+      {{newsData?.title}}
+    </div>
+    <div class="w-912px ml-a mr-a h-1px bg-gray"></div>
+    <div class="w-912px ml-a mr-a text-14px mt-10px flex justify-between">
+      <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="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">
+        <!--      <a :href="`${BASE_URL}${item.fileUrl}`" :download="item.fileOriginalName">{{ item.fileOriginalName }}</a>-->
+        <div >
+          <span class="text-blue underline hover:text-red cursor-pointer" @click="downloadFile(`${BASE_URL}${item.fileUrl}`,item.fileOriginalName)">{{item.fileOriginalName}}</span>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.custom-font{
+  font-family: 等线;
+}
+</style>

+ 188 - 0
src/views/search/index.vue

@@ -0,0 +1,188 @@
+<script setup lang="ts">
+import { useRoute, useRouter } from 'vue-router'
+import { onBeforeUnmount, watch } from 'vue'
+import {
+  getSearchDataResult,
+  type NewsDataResult,
+  type SearchDataList,
+  type SearchDataResult
+} from '@/views/search/type'
+import {ref} from 'vue'
+import { useSearchStore } from '@/stores/searchStore'
+import SmallSearch from '@/components/SmallSearch.vue'
+import NewDynamics from '@/components/NewDynamics.vue'
+const searchStore = useSearchStore();
+
+const router = useRouter()
+const route = useRoute()
+const lock = ref(false);
+const searchResult = ref<any>();
+const pageNum = ref(1);
+const pageSize = ref(10);
+const total = ref(0);
+const chartData = ref<any>();
+const searchData = async ()=>{
+  // console.log(lock.value)
+  if (lock.value) {
+    console.log('搜索操作已经在进行中,忽略重复触发');
+    return;
+  }
+  try {
+    lock.value = true;
+    const res = await getSearchDataResult(pageNum.value,pageSize.value,route.query.searchModule as string,route.query.value as string);
+    if(res && route.query.searchModule != '2'){
+      total.value = res.total;
+      searchResult.value = res.records;
+    }
+    if(res && route.query.searchModule == '2'){
+      total.value = res.total;
+      chartData.value = res.records;
+    }
+
+  } catch (e) {
+    console.error('获取搜索数据时发生错误:', e);
+  } finally {
+    lock.value = false;
+  }
+}
+let timer = setInterval(()=>{
+  lock.value = false;
+},1000)
+onBeforeUnmount(()=>{
+  clearInterval(timer)
+})
+const setSearchModule = ()=>{
+  // searchStore.searchModule = route.query.searchModule;
+  searchData()
+}
+const setSearchValue = ()=>{
+  // searchStore.value = route.query.value;
+  searchData()
+}
+const init = ()=>{
+  searchData()
+}
+const handleChange = ()=>{
+  searchData()
+}
+const toNewsDetail = (id:number|undefined)=>{
+  if(!id){
+    return
+  }
+  router.push({
+    path:'/newsDetail',
+    query:{
+      id
+    }
+  })
+}
+const toCompanyDetail = (id:number|undefined)=>{
+  router.push({
+    path:'/companyDetail',
+    query:{
+      id
+    }
+  })
+}
+const knowMore = (dickMapKey:string|undefined,dickMapValue:string|undefined)=>{
+  router.push({
+    path:'/creditDynamicsDetail',
+    query:{
+      dickMapKey,
+      dickMapValue
+    }
+  });
+}
+
+init()
+watch(()=>route.query.searchModule,setSearchModule,{immediate:true})
+watch(()=>route.query.value,setSearchValue,{immediate:true})
+</script>
+
+<template>
+  <div class="aboutContainer">
+    <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">
+      你所在的位置:<span class="cursor-pointer">首页</span> > <span class="color-#006eff">搜索</span>
+    </div>
+    <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">
+      <div><span v-if="route.query.value">你当前搜索的关键词是:</span> <span class="color-#ff9900">{{route.query.value}}</span>一共有:<span class="color-#ff9900">{{total}}</span>条数据</div>
+    </div>
+<!--    <div class="w-912px ml-auto mr-auto pt-20px mb-20px text-14px">-->
+<!--      <div class="relative">-->
+<!--        排序: <span class="color-#006eff">时间</span>-->
+<!--        <div class="absolute left-55px top-10px">-->
+<!--          <svg xmlns="http://www.w3.org/2000/svg" width="6" height="6" viewBox="0 0 24 24">-->
+<!--            <polygon points="12,0 24,24 0,24" fill="#006eff"/>-->
+<!--          </svg>-->
+<!--        </div>-->
+<!--      </div>-->
+<!--    </div>-->
+    <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  v-if="route.query.searchModule != '2'">
+          <div v-for="(item,index) in searchResult" :key="index" @click="toCompanyDetail(item.id)" class="cursor-pointer">
+            <div class="text-16px">{{item.enterpriseName}}</div>
+            <div class="text-13px h-30px line-height-30px text-#464646 line-clamp-1 mt-8px">
+              统一社会信用代码:{{item.unifiedSocialCreditCode}}
+            </div>
+            <!--          <div class="flex justify-between">-->
+            <!--            <div class="flex mt-15px">-->
+            <!--              <div class="text-13px rounded-5 p-3px border-solid border-1px border-#ff9900 color-#ff9900 ">文本服务-->
+            <!--              </div>-->
+            <!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+            <!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+            <!--              <div class="text-13px rounded-5 p-3px ">文本服务</div>-->
+            <!--            </div>-->
+            <!--            <div class="mt-15px text-#858585 text-13px">-->
+            <!--              <div class="text-13px">文本|9999/99/99</div>-->
+            <!--            </div>-->
+            <!--          </div>-->
+            <div class="h-1px bg-#e9e9e9 mt-10px mb-24px"></div>
+          </div>
+        </div>
+        <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>
+            <div class="h-1px bg-#e9e9e9 mt-10px mb-24px"></div>
+          </div>
+        </div>
+        <div class="ml-120px mt-20px">
+          <div class="example-pagination-block">
+            <el-pagination
+              layout="prev, pager, next, total"
+              v-model:pageSize = pageSize
+              v-model:currentPage = pageNum
+              :total="total"
+              @change = handleChange
+            />
+          </div>
+        </div>
+      </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>
+        <NewDynamics />
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.aboutContainer {
+  background-color: #ecf0f9;
+}
+</style>

+ 90 - 0
src/views/search/type/index.ts

@@ -0,0 +1,90 @@
+import request from '@/utils/request'
+import { queryLikeFieldMethod, queryLikeFieldMethod2 } from '@/utils/queryFieldMethod'
+import type { NewsData } from '@/api/home'
+
+enum API {
+  SEARCH_URL = '/crmBusinessLicenseInformation/findByPage',
+  NEWS_URL = '/crmNewsRelease/findByPage',
+}
+
+export interface SearchDataResult {
+  countId: number,
+  current: number,
+  maxLimit: any,
+  optimizeCountSql: boolean,
+  orders: any,
+  pages: number,
+  records:SearchDataList,
+  searchCount: boolean,
+  size: number,
+  total:number
+}
+export interface SearchData {
+  address: string;
+  approvalTime: string;
+  businessPeriod: string;
+  businessScope: string;
+  cancellationTime: string;
+  contactName: string;
+  contactPhone: string;
+  enterpriseName: string;
+  enterprisePhone: string;
+  enterpriseType: string;
+  establishmentDate: string;
+  id: number;
+  industryCode: string;
+  legalRepresentative: string;
+  legalRepresentativeId: string;
+  paidInCapital: string;
+  postalCode: string;
+  registerNumber: string;
+  registeredCapital: string;
+  registrationAuthority: string;
+  registrationCategory: string;
+  status: string;
+  supervisoryAuthority: string;
+  unifiedSocialCreditCode: string;
+}
+export interface NewsDataResult {
+  countId: number,
+  current: number,
+  maxLimit: any,
+  optimizeCountSql: boolean,
+  orders: any,
+  pages: number,
+  records:SearchDataList,
+  searchCount: boolean,
+  size: number,
+  total:number
+}
+
+export type SearchDataList = NewsData[];
+
+export const getSearchDataResult = (pageNum:number,pageSize:number,searchModule:string,searchValue:string)=>{
+  if(searchModule == '0'){
+    return request<any,SearchDataResult>({
+      url:API.SEARCH_URL,
+      method:'get',
+      params:queryLikeFieldMethod('enterprise_name',searchValue,pageNum,pageSize)
+    });
+  }else if(searchModule == '1'){
+    return request<any,SearchDataResult>({
+      url:API.SEARCH_URL,
+      method:'get',
+      params:queryLikeFieldMethod('unified_social_credit_code',searchValue,pageNum,pageSize)
+    });
+  }else if(searchModule == '2'){
+    return request<any,NewsDataResult>({
+      url:API.NEWS_URL,
+      method:'get',
+      params:queryLikeFieldMethod('title',searchValue,pageNum,pageSize)
+    });
+  }else {
+    // return request<any,SearchDataResult>({
+    //   url:API.SEARCH_URL,
+    //   method:'get',
+    //   params:queryLikeFieldMethod('enterpriseName',searchValue,pageNum,pageSize)
+    // });
+  }
+  console.log(searchValue)
+}

+ 9 - 0
vite.config.ts

@@ -27,5 +27,14 @@ export default defineConfig({
     alias: {
       '@': fileURLToPath(new URL('./src', import.meta.url))
     }
+  },
+  server:{
+    proxy:{
+      '/api':{
+        target:'http://192.168.110.235:20002',
+        changeOrigin:true,
+        rewrite:path=>path.replace(/^\/api/,'')
+      }
+    }
   }
 })