Explorar el Código

客户管理页面完成

wangtao hace 1 año
padre
commit
52a89b68fe

+ 3 - 0
index.html

@@ -5,6 +5,9 @@
     <meta charset="UTF-8" />
     <link rel="icon" type="image/svg+xml" href="/vite.svg" />
     <title>永天官网</title>
+    <meta name="keywords" content="">
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
     <!--preload-links-->
 </head>
 <body>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5188 - 1
package-lock.json


+ 1 - 0
package.json

@@ -16,6 +16,7 @@
     "dependencies": {
         "axios": "^1.6.7",
         "element-plus": "^2.5.6",
+        "jquery": "^3.7.1",
         "vue": "^3.4.19",
         "vue-i18n": "^9.9.0",
         "vue-router": "^4.0.13",

+ 3 - 0
src/App.vue

@@ -1,10 +1,13 @@
 <script setup lang="ts">
 import headerCommon  from '@/components/layout/header.vue'
 import footerCommon  from '@/components/layout/footer.vue'
+import feedFix from '@/components/layout/feedFix.vue'
+// import dialogCom from '@/components/layout/dialogCom.vue'
 </script>
 <template>
   <headerCommon />
   <router-view />
+  <feedFix />
   <footerCommon />
 </template>
 <style >

+ 1 - 3
src/api/index.ts

@@ -21,12 +21,10 @@ export function getMenu(params:any) {
 
 //获取页面内容
 export function getPageContent(params:any) {
-    console.log(444,params)
     return request({
         // url: 'http://gateway.usky.cn/prod-api/service-website/siteArticle/siteArticleList',
         url: 'http://172.16.120.165:13200/prod-api/service-website/siteArticle/siteArticleList',
         method: 'get',
         data: params,
     })
-}
-// http://gateway.usky.cn/prod-api/service-website/siteArticle/siteArticleList?categoryid=245&pageNum=1&pageSize=9&order=sortindex&articleid=&id=
+}

+ 2 - 2
src/assets/styles/common/home.css

@@ -304,7 +304,7 @@
 
 .video-section {
     overflow: hidden;
-    width: 100%;
+    width: 100vw;
     height: 100vh;
     background: black;
     position: relative;
@@ -354,7 +354,7 @@
     width: 60px;
     height: 60px;
     line-height: 40px;
-    /* background-image: url(../img/home/goDownArrow.png); */
+    background-image: url(@/assets/img/home/goDownArrow.png);
     background-repeat: no-repeat;
     background-position: 0 100%;
     position: absolute;

+ 24 - 10
src/assets/styles/common/style.css

@@ -2639,9 +2639,6 @@
             footer {
                 background-color: #2B2F42;
                 width: 100vw;
-                /* position: fixed; */
-                /* bottom: 0;
-                left: 0; */
             }
             
             @media (max-width: 575px) {
@@ -3226,7 +3223,7 @@
                 height: 49px;
                 line-height: 49px;
                 color: #fff;
-                background: url(../img/product/h1_bg.png) no-repeat;
+                background: url(@/assets/img/product/h1_bg.png) no-repeat;
                 position: absolute;
                 left: 0;
                 top: 35px;
@@ -4145,6 +4142,7 @@
                 background-position: center center;
                 background-repeat: no-repeat;
                 background-size: cover;
+                background: #ccc;
                 height: 600px
             }
             
@@ -6638,7 +6636,7 @@
                 width: 360px;
                 padding: 15px 15px;
                 color: #000;
-                background-image: url(../img/home/f_bg1.png);
+                background-image: url(@/assets/img/home/f_bg1.png);
                 background-size: 100% 100%;
             }
             
@@ -6738,13 +6736,9 @@
                 margin: 0 auto;
                 transform: translateX(40px);
                 filter: drop-shadow(#000 -40px 0px 0px);
+                transition: all 0s ease;
             }
             
-            .solutionTypeOne .img2 {
-                margin: 0 auto;
-                transform: translateX(0px);
-                filter: drop-shadow(#fff -40px 0px 0px);
-            }
             /* 选中 */
             
             .solutionTypeOne:hover,
@@ -6757,6 +6751,11 @@
             .solutionTypeOne.active p {
                 color: #fff;
             }
+            .solutionTypeOne:hover .img,
+            .solutionTypeOne.active .img {
+                transform: translateX(0px);
+                filter: drop-shadow(#fff -40px 0px 0px);
+            }
             
             @media(max-width:1200px) {
                 .solutionType .solutionTypeOne {
@@ -6803,4 +6802,19 @@
                     height: 48px;
                     line-height: 48px;
                 }
+            }
+
+
+
+
+
+            .pageContain{
+                width:100vw;
+            }
+            .solutionType{
+                width:100vw;
+                margin-top:0px !important;
+            }
+            .common-bradcrumb-section{
+                
             }

+ 0 - 38
src/components/HelloWorld.vue

@@ -1,38 +0,0 @@
-<script setup lang="ts">
-import { ref } from 'vue'
-
-defineProps<{ msg: string }>()
-
-const count = ref(0)
-</script>
-
-<template>
-  <h1>{{ msg }}</h1>
-
-  <div class="card">
-    <button type="button" @click="count++">count is {{ count }}</button>
-    <p>
-      Edit
-      <code>components/HelloWorld.vue</code> to test HMR
-    </p>
-  </div>
-
-  <p>
-    Check out
-    <a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
-      >create-vue</a
-    >, the official Vue + Vite starter
-  </p>
-  <p>
-    Install
-    <a href="https://github.com/vuejs/language-tools" target="_blank">Volar</a>
-    in your IDE for a better DX
-  </p>
-  <p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
-</template>
-
-<style scoped>
-.read-the-docs {
-  color: #888;
-}
-</style>

+ 34 - 0
src/components/layout/banner.vue

@@ -0,0 +1,34 @@
+<script setup lang="ts">
+import { ref, watch } from 'vue'
+import { useStore  } from 'vuex'
+import poster from '@/assets/img/banner/poster.jpg'
+const store = useStore()
+const modelType  =ref()
+const columnImage  =ref()
+const posterImg = ref(poster)//视频封面图
+watch(
+    () => store.state.menuList,
+    () => {
+        modelType.value = store.state.menuList[store.state.sub]?.modelType //图片或视频类型
+        columnImage.value =store.state.menuList[store.state.sub]?.imagePath//图片或视频地址
+    },
+    { deep: true, immediate: true }
+);
+
+</script>
+<template>
+        <div v-if="modelType==1"
+            style="width:100%;height:100%;background-size:cover;background-position:center center;background-repeat:no-repeat;"
+            v-bind:style="{backgroundImage:'url('+columnImage+')'}">
+        </div>
+
+        <video webkit-playsinline="webkit-playsinline" playsinline v-else id="videoPlay" autoplay loop muted preload="auto" :poster="posterImg"
+            style="width:100%;height:100%;object-fit:fill;" :src="columnImage">
+            <source type="video/mp4">
+        </video>
+</template>
+<style lang="scss">
+.common-bradcrumb-section{
+    width:100vw;
+}
+</style>

+ 352 - 0
src/components/layout/feedFix.vue

@@ -0,0 +1,352 @@
+<script setup lang="ts">
+import { useStore  } from 'vuex'
+// import $ from 'jquery'
+// $(window).on('scroll', function() {
+//     // Sticky Header
+//     var scroll = $(window).scrollTop();
+//     if (scroll < 110) {
+//         $('header.sticky-header').removeClass('sticky');
+//     } else {
+//         $('header.sticky-header').addClass('sticky');
+//     }
+
+//     //返回顶部按钮的显示与隐藏
+//     if (scroll > 700){
+//         $('#scroll-up').css({'visibility': 'visible','opacity':'1'});
+//     }else{
+//         $('#scroll-up').css({'visibility': 'hidden','opacity':'0'});
+//     }
+// })
+//返回顶部
+function scrollToTop() {
+    globalThis.scrollTo({
+        top: 0,
+        behavior: "smooth"
+    })
+}
+const store = useStore()
+// if(process.env.NODE_ENV == "development"){
+//     setTimeout(()=>{
+//     let seoTitle = store.state.menuList[store.state.sub]
+//     $('title').text(seoTitle?.categoryName);
+//     $('meta[name="description"]').attr('content', seoTitle?.metadescription);
+//     $('meta[name="keywords"]').attr('content', seoTitle?.metakeywords);
+// },500)
+
+// //视频上拉操作
+// $('.go_down').click(function () {
+//     $('html,body').animate({
+//         scrollTop: $(window).height()
+//     }, 700);
+// });
+// //移动端菜单操作
+// $.fn.meanmenu = function(e) {
+// var n = {
+//     meanMenuTarget: $(this),
+//     meanMenuContainer: 'body',
+//     meanMenuClose: '<span ></span ><span ></span ><span ></span >',
+//     meanMenuCloseSize: '18px',
+//     meanMenuOpen: '<span ></span ><span ></span ><span ></span >',
+//     meanRevealPosition: 'right',
+//     meanRevealPositionDistance: '0',
+//     meanRevealColour: '',
+//     meanScreenWidth: '480',
+//     meanNavPush: '',
+//     meanShowChildren: !0,
+//     meanExpandableChildren: !0,
+//     meanExpand: '+',
+//     meanContract: '-',
+//     meanRemoveAttrs: !1,
+//     onePage: !1,
+//     meanDisplay: 'block',
+//     removeElements: '',
+// };
+// e = $.extend(n, e);
+// var a = window.innerWidth || document.documentElement.clientWidth;
+// return this.each(function() {
+//     var n = e.meanMenuTarget,
+//         t = e.meanMenuContainer,
+//         r = e.meanMenuClose,
+//         i = e.meanMenuCloseSize,
+//         s = e.meanMenuOpen,
+//         u = e.meanRevealPosition,
+//         m = e.meanRevealPositionDistance,
+//         l = e.meanRevealColour,
+//         o = e.meanScreenWidth,
+//         c = e.meanNavPush,
+//         v = '.meanmenu-reveal',
+//         h = e.meanShowChildren,
+//         d = e.meanExpandableChildren,
+//         y = e.meanExpand,
+//         j = e.meanContract,
+//         Q = e.meanRemoveAttrs,
+//         f = e.onePage,
+//         g = e.meanDisplay,
+//         p = e.removeElements,
+//         C = !1;
+//     (navigator.userAgent.match(/iPhone/i) ||
+//         navigator.userAgent.match(/iPod/i) ||
+//         navigator.userAgent.match(/iPad/i) ||
+//         navigator.userAgent.match(/Android/i) ||
+//         navigator.userAgent.match(/Blackberry/i) ||
+//         navigator.userAgent.match(/windows Phone/i)) &&
+//     (C = !0),
+//     (navigator.userAgent.match(/MSIE 8/i) ||
+//         navigator.userAgent.match(/MSIE 7/i)) &&
+//     $('html').css('overflow-y', 'scroll');
+//     var w = '',
+//         x = function() {
+//             if ('center' === u) {
+//                 var e =
+//                     window.innerWidth ||
+//                     document.documentElement.clientWidth,
+//                     n = e / 2 - 22 + 'px';
+//                 (w = 'left:' + n + ';right:auto;'),
+//                 C
+//                     ?
+//                     $('.meanmenu-reveal').animate({
+//                         left: n,
+//                     }) :
+//                     $('.meanmenu-reveal').css('left', n);
+//             }
+//         },
+//         A = !1,
+//         E = !1;
+//     'right' === u && (w = 'right:' + m + ';left:auto;'),
+//         'left' === u && (w = 'left:' + m + ';right:auto;'),
+//         x();
+//     var M = '',
+//         W = function() {
+//             $('.mean-bar,.mean-push').remove(),
+//                 $(t).removeClass('mean-container'),
+//                 $(n).css('display', g),
+//                 (A = !1),
+//                 (E = !1),
+//                 $(p).removeClass('mean-remove');
+//         },
+//         b = function() {
+            
+//                 var e = 'background:' + l + ';color:' + l + ';' + w;
+//             if (o >= a) {
+//                 $(p).addClass('mean-remove'),
+//                     (E = !0),
+//                     $(t).addClass('mean-container'),
+//                     $('.mean-container').prepend(
+//                         '<div class="mean-bar"><a href="#nav" class="meanmenu-reveal" style="' +
+//                         e +
+//                         '">Show Navigation</a><nav class="mean-nav"></nav></div>'
+//                     );
+// $(v).html(s),
+
+//                     setTimeout(function(){
+//                 var r = $(n).html();
+//                 $('.mean-nav').html(r),
+//                     Q &&
+//                     $(
+//                         'nav.mean-nav ul, nav.mean-nav ul *'
+//                     ).each(function() {
+//                         $(this).is('.mean-remove') ?
+//                             $(this).attr(
+//                                 'class',
+//                                 'mean-remove'
+//                             ) :
+//                             $(this).removeAttr('class'),
+//                             $(this).removeAttr('id');
+//                     }),
+//                     $(n).before('<div class="mean-push" />'),
+//                     $('.mean-push').css('margin-top', c),
+//                     $(n).hide(),
+//                     $('.meanmenu-reveal').show(),
+                    
+//                     (M = $(v)),
+//                     $('.mean-nav ul').hide(),
+//                     h ?
+//                     d ?
+//                     ($('.mean-nav ul ul').each(
+//                             function() {
+//                                 $(this).children()
+//                                     .length &&
+//                                     $(this, 'li:first')
+//                                     .parent()
+//                                     .append(
+//                                         '<a class="mean-expand" href="#" style="font-size: ' +
+//                                         i +
+//                                         '">' +
+//                                         y +
+//                                         '</a>'
+//                                     );
+//                             }
+//                         ),
+//                         $('.mean-expand').on(
+//                             'click',
+//                             function(e) {
+//                                 e.preventDefault(),
+//                                     $(this).hasClass(
+//                                         'mean-clicked'
+//                                     ) ?
+//                                     ($(this).text(y),
+//                                         $(this)
+//                                         .prev('ul')
+//                                         .slideUp(
+//                                             300,
+//                                             function() {}
+//                                         )) :
+//                                     ($(this).text(j),
+//                                         $(this)
+//                                         .prev('ul')
+//                                         .slideDown(
+//                                             300,
+//                                             function() {}
+//                                         )),
+//                                     $(this).toggleClass(
+//                                         'mean-clicked'
+//                                     );
+//                             }
+//                         )) :
+//                     $('.mean-nav ul ul').show() :
+//                     $('.mean-nav ul ul').hide(),
+//                     $('.mean-nav ul li')
+//                     .last()
+//                     .addClass('mean-last'),
+//                     M.removeClass('meanclose'),
+//                     $(M).on('click',function(e) {
+//                         e.preventDefault(),
+//                             A === !1 ?
+//                             (M.css('text-align', 'center'),
+//                                 M.css('text-indent', '0'),
+//                                 M.css('font-size', i),
+//                                 $(
+//                                     '.mean-nav ul:first'
+//                                 ).slideDown(),
+//                                 (A = !0)) :
+//                             ($(
+//                                     '.mean-nav ul:first'
+//                                 ).slideUp(),
+//                                 (A = !1)),
+//                             M.toggleClass('meanclose'),
+//                             $(p).addClass('mean-remove');
+//                     }),
+//                     f &&
+//                     $('.mean-nav ul > li > a:first-child').on(
+//                         'click',
+//                         function() {
+//                             $('.mean-nav ul:first').slideUp(),
+//                                 (A = !1),
+//                                 $(M)
+//                                 .toggleClass('meanclose')
+//                                 .html(s);
+//                         }
+//                     );
+
+
+//                     },300)
+                
+                
+//             } else W();
+
+            
+            
+//         };
+//     C ||
+//         $(window).resize(function() {
+//             (a =
+//                 window.innerWidth ||
+//                 document.documentElement.clientWidth),
+//             a > o,
+//                 W(),
+//                 o >= a ? (b(), x()) : W();
+//         }),
+//         $(window).resize(function() {
+//             (a =
+//                 window.innerWidth ||
+//                 document.documentElement.clientWidth),
+//             C
+//                 ?
+//                 (x(), o >= a ? E === !1 && b() : W()) :
+//                 (W(), o >= a && (b(), x()));
+//         }),
+//         b();
+// });
+// };
+// var onitirDoc = {
+//     init: function() {
+//         this.mobileMenu();
+//         this.productGird();
+//     },
+
+//     // Mobile Menu
+//     mobileMenu: function() {
+//         $('.mainmenu-area .main-menu .menu-items').meanmenu({
+//             meanMenuContainer: '.mobile-menu',
+//             meanScreenWidth: '991',
+//             meanRevealPosition: 'right',
+//         });
+//     },
+
+//     // Porduct Grid
+//     productGird: function() {
+//         var grid = $('.grid-isotope');
+//         if (!grid.length) {
+//             return;
+//         }
+
+//         grid.isotope();
+
+//         $('.grid-filter ul').on('click', 'li', function() {
+//             var filterValue = $(this).attr('data-filter');
+//             grid.isotope({ filter: filterValue });
+//         });
+
+//         $('.grid-filter ul li').on('click', function(event) {
+//             $(this).siblings('.active').removeClass('active');
+//             $(this).addClass('active');
+//             event.preventDefault();
+//         });
+//     }
+// };
+// $(document).ready(function() {
+//         onitirDoc.init();
+// })
+// }
+
+</script>
+<template>
+<div class="feedBackBox">
+    <div class="contactOne">
+        <img src="@/assets/img/home/f_phone.png" alt="">
+        <ul class="contactInner">
+            <li style="font-size:25px;margin-bottom:5px">合作共赢</li>
+            <li>
+                <span>智&nbsp;  慧&nbsp;  消&nbsp;&nbsp;  防:</span>
+                <span>李先生 18621761642</span>
+            </li>
+            <li>
+                <span>人脸识别系统:</span>
+                <span>李先生 18621761642</span>
+            </li>
+            <li>
+                <span>弱 电 智 能 化:</span>
+                <span>李先生 13918571231</span>
+            </li>
+            <li>
+                <span>质量 监督投诉:</span>
+                <span>孙先生 17721169552</span>
+            </li>
+            <li style="margin-top:10px">其他智慧城市相关应用合作: 021-65376655</li>
+        </ul>
+    </div>
+    <div class="contactQr">
+        <!-- 二维码 -->
+        <img src="@/assets/img/home/f_code.png" alt="">
+        <div class="">
+            <img src="@/assets/img/qr_codeF1.png" alt="">
+        </div>
+    </div>
+    <div @click="scrollToTop" id="scroll-up" style="opacity:1">
+        <img src="@/assets/img/home/f_top.png" alt="">
+    </div>
+</div>
+</template>
+<style lang="scss" scoped>
+
+</style>

+ 2 - 8
src/components/layout/footer.vue

@@ -1,12 +1,6 @@
-<script lang="ts">
-import { defineComponent } from 'vue'
+<script setup lang="ts">
 import { useStore  } from 'vuex'
-export default defineComponent({
-    setup(){
-        const store = useStore()
-        return { store }
-    },
-})
+const store = useStore()
 </script>
 <template>
     <footer>

+ 62 - 16
src/components/layout/header.vue

@@ -1,22 +1,68 @@
-<script lang="ts">
-import { defineComponent, ref } from 'vue'
+<script setup lang="ts">
+import { ref } from 'vue'
 import { useStore  } from 'vuex'
-import { useRoute } from "vue-router";
-export default defineComponent({
-    setup(){
-        const store = useStore()
-        const route = useRoute()
-        const currentPagePath = ref(route.path)//当前页面路径
-        const pagePath = ref(route.path)//页面路径
-        const pathTemplateQuery = ref("")//页面模版复用参数
-        if(route.query && route.query.dup){
-            pathTemplateQuery.value = route.query.dup
+import { useRoute } from "vue-router"
+const store = useStore()
+const route = useRoute()
+const currentPagePath = ref(route.path)//当前页面路径
+const pathTemplateQuery = ref()//页面模版复用参数
+if(route.query && route.query.dup){
+    pathTemplateQuery.value = route.query.dup
+}
+console.log(11111)
+//获取菜单列表及当前页面内容
+store.dispatch('getMenuList').then(()=>{
+    const data = ref(store.state.menuList)
+    const paramsData = ref({}) //页面主题内容请求参数
+    console.log(3333)
+    let str 
+    if(currentPagePath.value.indexOf("_")){
+        console.log(currentPagePath.value)
+        str = currentPagePath.value.split("_")[0]
+    }
+    for(let i=0;i<data.value.length;i++){
+        if(currentPagePath.value == data.value[i].path || str == data.value[i].path){
+            console.log(5,data.value[i].path)
+            //模板 主页
+            if(!data.value[i].sname && !route.query?.categoryid){
+                console.log(1)
+                paramsData.value = {
+                    params:{
+                        categoryid: data.value[i].id,
+                        pageNum:1,
+                        pageSize:100,
+                        order:"sortindex",
+                    },
+                    index:currentPagePath.value,
+                    sub:i
+                }
+                if(data.value[i].path == "/cases"){
+                    paramsData.value.params.categoryid = data.value[i].children[0].id
+                }
+            }
+             //详情页(添加details识别参数)
+            //  console.log(route.query?.categoryid  && !route.query.dup)
+             if(route.query?.categoryid  && !route.query.dup){
+                paramsData.value = {
+                    params:{
+                        categoryid: route.query?.categoryid,
+                        pageNum:1,
+                        pageSize:1,
+                        order:"sortindex",
+                        articleid: route.query?.id,
+                        id: route.query?.id,
+                        details:true
+                    },
+                    index:currentPagePath.value,
+                    sub:i
+                }
+             }
+            //复用模板页
+           
         }
-        return { store,pagePath,pathTemplateQuery,currentPagePath }
-    },
+    }
+    store.dispatch('getPageData',paramsData.value)
 })
-
-
 </script>
 <template>
         <header class="header-absolute sticky-header">

+ 12 - 0
src/router/index.ts

@@ -1,5 +1,6 @@
 const index = () => import('@/views/index/index.vue')
 const cases = () => import('@/views/cases/index.vue')
+const cases_Read = () => import('@/views/cases/read.vue')
 const services = () => import('@/views/services/index.vue')
 const news = () => import('@/views/news/index.vue')
 const about = () => import('@/views/about/index.vue')
@@ -24,6 +25,17 @@ const routes = [
             keepAlive: false
         }
     },
+    {
+        path: "/cases_Read",
+        name: "案例详情页",
+        component: cases_Read,
+        meta: {
+            title: "",
+            keepAlive: false
+        }
+    },
+
+    
     {
         path: "/services",
         name: "产品服务",

+ 72 - 15
src/store/index.ts

@@ -8,11 +8,47 @@ import { getMenu, getPageContent } from '@/api/index'
 // export const key :IN
 export const store = createStore({
     state:{
-        count:1,
-        menuList:[],
-        pageContent:[],
-        currentPagePath:'',
-        sub:""
+        menuList:[],//菜单列表
+        pageContent:[],//页面主体内容(不包含banner)
+        recomMendation:[],//推荐内容
+        currentPagePath:'',//当前页名称
+        casesAcitveId:"",//客户案例类型切换活动id
+        sub:"",//当前页下标
+        // 公共弹框
+        centerDialogVisible: false,
+        dialogDataArray: [],
+        ruleForm: {
+        platName: '智慧安防',
+        consultName: '',
+        consultPhone: '',
+        mail: '',
+        company: '',
+        consultContent: "",
+        },
+        rules: {
+        platName: [{
+            required: true,
+            message: '请选择类型',
+            trigger: 'change'
+        }, ],
+        consultName: [{
+            required: true,
+            message: '请输入姓名',
+            trigger: 'blur'
+        }, ],
+        consultPhone: [{
+            required: true,
+            message: '请输入正确的电话号码',
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            trigger: 'change'
+        }],
+        mail: [{
+            required: false,
+            type: "email",
+            message: "请输入正确的邮箱地址",
+            trigger: 'blur'
+        }],
+        },
     },
     mutations:{
         setMenuList(state:any,data:any){
@@ -23,18 +59,24 @@ export const store = createStore({
             state.pageContent = data
             return state.pageContent
         },
-        setcurrentPagePathOrSub(state:any,data:object){
-            state.index = data.index
+        setCurrentPagePathOrSub(state:any,data:object){
+            state.currentPagePath = data.index
             state.sub = data.sub
             return  state.index,state.sub 
         },
+        setCasesAcitveId(state:any,data:object){
+            state.casesAcitveId = data
+            return  state.casesAcitveId
+        },
+        setRecomMendation(state:any,data:object){
+            state.recomMendation = data
+            return  state.recomMendation
+        }
+
+        
     },
     actions:{
-        fatchCount({commit,state},payload){
-            setTimeout(() => {
-                    commit('setCount',payload)
-            }, 3000);
-        },
+
         getMenuList({ commit }){
             return new Promise(resolve=>{
                 getMenu().then((res:any)=>{
@@ -71,15 +113,30 @@ export const store = createStore({
          */
         getPageData({ commit },data:any){
             return new Promise(resolve=>{
-                console.log(899,data)
+                //当前页
                 if(data.index || data.sub){
-                    commit('setcurrentPagePathOrSub',{index:data.index,sub:data.sub})
+                    commit('setCurrentPagePathOrSub',{index:data.index,sub:data.sub})
+                }
+                //cases页类型活动id
+                if(data.params?.categoryid && data.index == "/cases" ){
+                    commit('setCasesAcitveId',data.params.categoryid)
                 }
                 getPageContent(data.params).then((res:any)=>{
-                    console.log(1111,res)
                     commit('setPageData',res.data.records)
                     resolve(true)
                 })
+                //推荐列表查询
+                if(data.params.details){
+                    let params =  JSON.parse(JSON.stringify(data.params))
+                    delete params.articleid
+                    params.pageSize = 100
+                    delete params.id
+                    delete params.details
+                    getPageContent(params).then((res:any)=>{
+                        commit('setRecomMendation',res.data.records)
+                        resolve(true)
+                    })
+                }
             })
         },
     }

+ 0 - 1
src/utils/request.ts

@@ -50,7 +50,6 @@ service.interceptors.request.use((config: InternalAxiosRequestConfig) => {
     // 是否需要防止数据重复提交
     const isRepeatSubmit: boolean = (config.headers || {}).repeatSubmit === false
     // get请求映射params参数
-    console.log(456,config)
     if (config.method === 'get' && config.data) {
         
         let url: string = config.url + '?' + tansParams(config.data);

+ 90 - 9
src/views/cases/index.vue

@@ -1,15 +1,96 @@
-<script lang="ts">
-import { defineComponent, ref } from 'vue'
-export default defineComponent({
-    setup(){
-    },
-    asyncData({store, route}:any){
-        return store.dispatch('getMenuList') 
+<script setup lang="ts">
+import { ref } from 'vue'
+import { useStore  } from 'vuex'
+import { useRouter } from "vue-router";
+import banner from '@/components/layout/banner.vue'
+    const store = useStore()
+    const router = useRouter()
+    const columnTypes = ref([]) //类型
+    const requestParams = ref({})//active类型
+    setTimeout(()=>{
+        columnTypes.value = store.state.menuList[store.state.sub].children
+    },500)
+    const paramsData = ref({})
+    let oldCategoryId= ref()
+    //类型切换
+    function facilityClick(item:Object){
+        //防抖
+        if(item.id != oldCategoryId.value){
+            requestParams.value = item
+            paramsData.value = {
+                params:{
+                    categoryid: item.id,
+                    pageNum:1,
+                    pageSize:100,
+                    order:"sortindex",
+                },
+                index:store.state.currentPagePath,
+                sub:store.state.sub
+            }
+            oldCategoryId.value = item.id
+            store.dispatch('getPageData',paramsData.value)
+        }
+    }
+    //详情页
+    function details(item:Object){
+        router.push(
+            { 
+                path: `cases_Read` , 
+                query: { 
+                    categoryid: item.categoryid,
+                    id:item.id,
+                    isUrlId:1
+                } 
+            }
+        )
     }
-})
 </script>
 <template>
-       
+    <div class="pageContain">
+        <section class="common-bradcrumb-section">
+                <banner />
+            </section>
+            <section style="background:#F4F8FD" class="solutionType">
+                <div class="container pc" style="text-align:center">
+                    <div class="solutionTypeOne" v-for="(item,i) in columnTypes" :class="item.id == store.state.casesAcitveId ? 'active' : ''" @mouseover="facilityClick(item)"  :style="{'width':(1/columnTypes.length*100)+'%' }">
+                        <div style="width:40px;height:40px;;overflow:hidden;margin:0 auto" >
+                            <img class="img" :src="item.imagePath" alt=""  >
+                        </div>
+                        <p>{{item.categoryName}}</p>
+                    </div>
+                </div>
+                <div class="container mobile" style="text-align:center">
+                    <div class=" solutionTypeOne" v-for="(item,i) in columnTypes" :class="item.id == requestParams.categoryid ? 'active' : ''"
+                    v-on:mouseover="facilityClick(i, item)"  :style="{'width':(1.5/columnTypes.length*100)+'%' }">
+                        <div style="width:40px;height:40px;;overflow:hidden;margin:0 auto">
+                            <img class="img" :src="item.imagePath" alt="" >
+                        </div>
+                        <p>{{item.categoryName}}</p>
+                    </div>
+                </div>
+            </section>
+            <section class="solution-section lazyContainer">
+                <div v-for="(item,index) in store.state.pageContent" :key="item.id" :style="{background:(index % 2 == 1?'#F4F8FD':'#fff')}" style="padding:40px 0" >
+                    <div class="container"  @click="details(item)">
+                        <div  class="solutionItem" >
+                            <div class="solutionTitle text-left">
+                                {{item.title}}
+                            </div>
+                            <div class="row solutionInner">
+                                <div class="col-md-7">
+                                    <p v-html="item.lmtitle" class="text-left"></p>
+                                    <div class="pt-40 mb-20 text-left">{{item.zhaiyao}}</div>
+                                </div>
+                                <div class="col-md-5 text-center">
+                                    <img :src="item.image" alt="" :data-src="item.image">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </section>
+    </div>
+            
 </template>
 <style lang="scss" scoped>
 

+ 72 - 0
src/views/cases/read.vue

@@ -0,0 +1,72 @@
+<script setup lang="ts">
+    import { ref } from 'vue'
+    import { useStore  } from 'vuex'
+    import banner from '@/components/layout/banner.vue'
+        const store = useStore()
+        const columnTypes = ref([]) //类型
+        const requestParams = ref({})//active类型
+        setTimeout(()=>{
+            columnTypes.value = store.state.menuList[store.state.sub].children
+        },500)
+        const paramsData = ref({})
+        let oldCategoryId= ref()
+        //类型切换
+        function facilityClick(item:Object){
+            //防抖
+            if(item.id != oldCategoryId.value){
+                requestParams.value = item
+                paramsData.value = {
+                    params:{
+                        categoryid: item.id,
+                        pageNum:1,
+                        pageSize:100,
+                        order:"sortindex",
+                    },
+                    index:store.state.currentPagePath,
+                    sub:store.state.sub
+                }
+                oldCategoryId.value = item.id
+                store.dispatch('getPageData',paramsData.value)
+            }
+        }
+        //详情页
+        function oneInnerBox(item){
+    
+        }
+    </script>
+    <template>
+            <div class="pageContain">
+                <section class="common-bradcrumb-section" >
+                    <banner />
+                </section>
+                <section class="product-content-section pt-60">
+                    <div class="container" v-if="store.state.pageContent.length>0">
+                        <div class="row">
+                            <div class="col-lg-12 col-md-12 content">
+                                <div  class="read_content mb-60">
+                                    <div class="section-title text-center both-border mb-60 d-flex justify-content-between">
+                                        <span class="title-tag2 text-left" >{{store.state.pageContent[0].title}}</span>
+                                        <a href="javascript:history.back(-1)"><img src="@/assets/img/product/close.png" alt=""></a>
+                                    </div>
+                                    <div class="row">
+                                        <div class=" col-lg-12 col-md-12  " >
+                                            <div  v-html="store.state.pageContent[0].content" class="text-left"></div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div v-if="store.state.recomMendation.length>0">
+                                    <div class="title-tag2">相关推荐</div>
+                                    <div class="relNewBox container text-left ">
+                                        <a class="ustify-content-between d-flex relNewsList" :href="dup?'./read.html?dup='+dup+'&categoryid='+item.categoryid+'&id='+item.id+'&isUrlId=1':'./read.html?categoryid='+item.categoryid+'&id='+item.id+'&isUrlId=1'" v-for="item in store.state.recomMendation" :key="item.id">
+                                            <div><img width="18" height="18" src="@/assets/img/news/arrowT.svg"> {{item.title}} </div>
+                                            <div>{{ item.createdate }}</div>
+                                        </a>
+                                    </div>
+                                </div>
+        
+                            </div>
+                        </div>
+                    </div>
+                </section>
+            </div>
+</template>

+ 60 - 129
src/views/index/index.vue

@@ -1,142 +1,73 @@
-<script lang="ts">
-import { defineComponent, ref } from 'vue'
+
+<script setup lang="ts">
 import { useStore  } from 'vuex'
-import poster from '@/assets/img/banner/poster.jpg'
-export default defineComponent({
-    setup(){
-        const store = useStore()
-        console.log("modelType",store.state.menuList)
-        const modelType  =ref()
-        const columnImage  =ref()
-        setTimeout(()=>{
-            modelType.value = store.state.menuList[store.state.sub].modelType //图片或视频类型
-            columnImage.value =store.state.menuList[store.state.sub].imagePath//图片或视频地址
-        },100)
-        const posterImg = ref(poster)//视频封面图
-        return { store,  modelType, columnImage, posterImg }
-    },
-    asyncData({store, route}:any){
-        return store.dispatch('getMenuList').then(()=>{
-            let data = store.state.menuList
-            let paramsData = {}
-            for(let i=0;i<data.length;i++){
-                if(data[i].path == "/index" && !data[i].sname){
-                    paramsData = {
-                        params:{
-                            categoryid:data[i].id,
-                            pageNum:1,
-                            pageSize:100,
-                            order:"order",
-                        },
-                        index:"/index",
-                        sub:i
-                    }
-                    
-                }
-            }
-            store.dispatch('getPageData',paramsData,)
-        }) 
-    }
-})
+import banner from '@/components/layout/banner.vue'
+const store = useStore()
+// 首页箭头下拉
+function go_down(){
+    globalThis.scrollTo({
+        top: globalThis.innerHeight,
+        behavior: "smooth"
+    })
+}
 </script>
 <template>
-      <div class="appInner" :style="{'display':'block'}">
-
-<div>
-    <!-- LOADING START -->
-    <!-- <div v-if="loading" class="loadingBox">
-        <loading-com></loading-com>
-    </div> -->
-    <!-- LOADING END -->
-
-    <!-- FEEDBACK START -->
-    <!-- <feed-fix></feed-fix> -->
-    <!-- FEEDBACK END -->
-
-    <!-- DIALOG START-->
-    <!-- <dialog-com @data-event="handleChildEvent" :fatherdialogv="centerDialogVisible" :ruleform="ruleForm"
-        :fatherrules="rules" :fatherdialoga="dialogDataArray"></dialog-com> -->
-    <!-- DIALOG END -->
-</div>
-
-<div class="video-section">
-
-    <div v-if="modelType==1"
-        style="width:100%;height:100%;background-size:cover;background-position:center center;background-repeat:no-repeat;"
-        v-bind:style="{backgroundImage:'url('+columnImage+')'}"></div>
-
-    <video webkit-playsinline="webkit-playsinline" playsinline v-else id="videoPlay" autoplay loop muted preload="auto" :poster="posterImg"
-        style="width:100%;height:100%;object-fit:fill;" :src="columnImage">
-        <source type="video/mp4">
-    </video>
-
-    <div class="video-des">
-        <div class="des1">
-            <p class="animate__animated  animate__fadeInUp">公司成立<span class="num1">20年</span>,围绕行业细分,累计服务超过
-                <span class="num1">5000</span> 家企业,近<span class="num1"> 10万 </span>个用户</p>
-        </div>
-        <div class="des2 desCom animate__animated  animate__flipInX"
-            style="top:43%; left:0;width:100%;text-align:center">
-            <p>核心价值观</p>
-            <span>一起梦想,一起成长,一起分享</span>
-
-        </div>
-        <div class="des3 desCom animate__animated  animate__lightSpeedInLeft" style="top:65%; left:20%;">
-            <p>企业使命</p>
-            <span>用数字化手段助力客户融入数智时代</span>
-        </div>
-        <div class="des4 desCom animate__animated  animate__lightSpeedInRight" style="top:65%; right:25%;">
-            <p>企业愿景</p>
-            <span>成为智慧数字产业的领跑者</span>
-        </div>
-    </div>
-    <span class="go_down"></span>
-</div>
-
-<section v-if="store.state.pageContent.length>0" style="width:100vw;">
-
-
-
+    <div class="pageContain">
+        <div class="video-section">
+            <banner />
+            <div class="video-des">
+                <div class="des1">
+                    <p class="animate__animated  animate__fadeInUp">公司成立<span class="num1">20年</span>,围绕行业细分,累计服务超过
+                        <span class="num1">5000</span> 家企业,近<span class="num1"> 10万 </span>个用户</p>
+                </div>
+                <div class="des2 desCom animate__animated  animate__flipInX"
+                    style="top:43%; left:0;width:100%;text-align:center">
+                    <p>核心价值观</p>
+                    <span>一起梦想,一起成长,一起分享</span>
 
-    <!--====== WHYUS SECTION START ======-->
-    <div class="whyUs-section pt-60 pb-60" v-for="(arr,index) in store.state.pageContent"
-        :style="{background:(index % 2 == 1?'#F4F8FD':'#fff')}">
-        <div class="container">
-            <div class="section-title text-center both-border pb-20">
-                <span class="title-tag">{{arr.title}}</span>
-                <span class="mb-30">{{arr.zhaiyao}}</span>
-            </div>
-           
-            <div class="row aboutOnlyText" v-if="arr.image" 
-                :style="{padding:(index % 2 == 1?'40px 25px':' 40px 25px')}"
-                style="background-color: #ffff;    box-shadow: 0px 10px 20px 10px rgb(179 202 216 / 20%); align-items:center">
-                <div class="col-md-6  pr-40 aboutImg text-center ">
-                    <img :src="arr.image" alt="">
                 </div>
-                <div class="col-md-6" v-html="arr.content">
+                <div class="des3 desCom animate__animated  animate__lightSpeedInLeft" style="top:65%; left:20%;">
+                    <p>企业使命</p>
+                    <span>用数字化手段助力客户融入数智时代</span>
                 </div>
-            </div>
- 
-            <div class="aboutOnlyText row text-center" v-else :style="{padding:(index % 2 == 1?'':'0 ')}"
-                style="background-color: #ffff;">
-                <div class=" about-text-image" v-html="arr.content">
+                <div class="des4 desCom animate__animated  animate__lightSpeedInRight" style="top:65%; right:25%;">
+                    <p>企业愿景</p>
+                    <span>成为智慧数字产业的领跑者</span>
                 </div>
             </div>
-
+            <!-- 下拉 -->
+            <span class="go_down" @click="go_down"></span>
         </div>
-    </div>
-    <!--====== WHYUS SECTION END ======-->
+        <!-- 主体内容 -->
+        <section v-if="store.state.pageContent.length>0" style="width:100vw;">
+            <div class="whyUs-section pt-60 pb-60" v-for="(arr,index) in store.state.pageContent"
+                :style="{background:(index % 2 == 1?'#F4F8FD':'#fff')}">
+                <div class="container">
+                    <div class="section-title text-center both-border pb-20">
+                        <span class="title-tag">{{arr.title}}</span>
+                        <span class="mb-30">{{arr.zhaiyao}}</span>
+                    </div>
+                
+                    <div class="row aboutOnlyText" v-if="arr.image" 
+                        :style="{padding:(index % 2 == 1?'40px 25px':' 40px 25px')}"
+                        style="background-color: #ffff;    box-shadow: 0px 10px 20px 10px rgb(179 202 216 / 20%); align-items:center">
+                        <div class="col-md-6  pr-40 aboutImg text-center ">
+                            <img :src="arr.image" alt="">
+                        </div>
+                        <div class="col-md-6" v-html="arr.content">
+                        </div>
+                    </div>
+        
+                    <div class="aboutOnlyText row text-center" v-else :style="{padding:(index % 2 == 1?'':'0 ')}"
+                        style="background-color: #ffff;">
+                        <div class=" about-text-image" v-html="arr.content">
+                        </div>
+                    </div>
 
-</section>
-</div>
+                </div>
+            </div>
+        </section>
+    </div>
 </template>
 <style lang="scss" scoped>
-.video-section{
-    width:100vw;
-    height:100vh;
-    position: absolute;
-    top: 0;
-    left:0;
-    z-index: 1;
-}
 </style>

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio