wangtao hace 1 año
padre
commit
75796d6303

+ 2 - 3
index.html

@@ -4,12 +4,11 @@
 <head>
     <meta charset="UTF-8" />
     <link rel="icon" type="image/svg+xml" href="/vite.svg" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Vite + Vue + TS</title>
+    <title>永天官网</title>
     <!--preload-links-->
 </head>
 <body>
-    <div id="app"><!--ssr-outlet--></div>
+    <div id="app" style="width:100%;padding:0;margin:0"><!--ssr-outlet--></div>
     <script type="module" src="/src/entry-client.ts"></script>
     <script>
         // window.__INITIAL_STATE__ = '<!--vuex-state-->' 

+ 4 - 2
server.js

@@ -5,6 +5,7 @@ import express from 'express'
 import serverStatic from 'serve-static'
 import { createServer as createViteServer } from 'vite'
 import ssrManifest from './dist/client/.vite/ssr-manifest.json' assert { type: "json" }
+import *  as PRODserver from './dist/server/entry-server.js'
 const isProd = process.env.NODE_ENV  === 'production'
 // const isProd = true
 const __dirname = path.dirname(fileURLToPath(import.meta.url))
@@ -35,6 +36,7 @@ async function createServer() {
         let html
         try {
             if(!isProd){
+                console.log("ssr:dev")
                  // 1. 读取 index.html
                 template = fs.readFileSync(
                     path.resolve(__dirname, 'index.html'),
@@ -48,7 +50,7 @@ async function createServer() {
                 // 3a. 加载服务器入口。vite.ssrLoadModule 将自动转换
                 //    你的 ESM 源码使之可以在 Node.js 中运行!无需打包
                 //    并提供类似 HMR 的根据情况随时失效。
-                render  = (await vite.ssrLoadModule('/src/entry-client.ts')).render
+                render  = (await vite.ssrLoadModule('/src/entry-server.ts')).render
                 // 3b. 从 Vite 5.1 版本开始,你可以试用实验性的 createViteRuntime
                 // API。
                 // 这个 API 完全支持热更新(HMR),其工作原理与 ssrLoadModule 相似
@@ -57,11 +59,11 @@ async function createServer() {
                 // const runtime = await vite.createViteRuntime(server)
                 // const { render } = await runtime.executeEntrypoint('/src/entry-server.ts')
             }else{
+                console.log("ssr:prod")
                 template = fs.readFileSync(
                     path.resolve(__dirname, 'dist/client/index.html'),
                     'utf-8',
                 )
-                import *  as PRODserver from './dist/server/entry-server.js'
                 render  = PRODserver.render
             }
             // 4. 渲染应用的 HTML。这假设 entry-server.js 导出的 `render`

+ 6 - 5
src/App.vue

@@ -1,18 +1,19 @@
 <script setup lang="ts">
+import headerCommon  from '@/components/layout/header.vue'
+import footerCommon  from '@/components/layout/footer.vue'
 </script>
 <template>
-  <router-link to="/home">home</router-link>
-    <router-view />
+  <headerCommon />
+  <router-view />
+  <footerCommon />
 </template>
 <style >
 @import "@/assets/styles/common/bootstrap.min.css";
+@import "@/assets/styles/common/element.css";
 @import "@/assets/styles/common/meanmenu.min.css";
 @import "@/assets/styles/common/default.css";
 @import "@/assets/styles/common/animation.css";
 @import "@/assets/styles/common/animate.min.css";
 @import "@/assets/styles/common/style.css";
 @import "@/assets/styles/common/home.css";
-a{
-  color:red !important
-}
 </style>

+ 0 - 1
src/aa.ts

@@ -1 +0,0 @@
-export var aa = "";

+ 17 - 3
src/api/index.ts

@@ -10,9 +10,23 @@ import request from '@/utils/request.ts'
 
 
 //获取菜单列表
-export function getMenu() {
+export function getMenu(params:any) {
     return request({
-        url: 'https://gateWay.usky.cn/prod-api/service-website/siteCategory/siteCategoryList',
-        method: 'get'
+        // url: 'https://gateWay.usky.cn/prod-api/service-website/siteCategory/siteCategoryList',
+        url: 'http://172.16.120.165:13200/prod-api/service-website/siteCategory/siteCategoryList',
+        method: 'get',
+        data: params,
     })
 }
+
+//获取页面内容
+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=

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5 - 0
src/assets/js/bootstrap.min.js


+ 354 - 0
src/assets/js/commonVue copy.js

@@ -0,0 +1,354 @@
+import footerCom from '/assets/js/component/footerCom.js'
+ import feedFix from '/assets/js/component/feedFix.js'
+ import dialogCom from '/assets/js/component/dialogCom.js'
+ import loadingCom from '/assets/js/component/loadingCom.js'
+ import headerCom from '/assets/js/component/headerCom.js'
+ 
+ 
+ app = new Vue({
+  el: '#app',
+  components: {
+    footerCom,
+    feedFix,
+    dialogCom,
+    loadingCom,
+    headerCom
+
+  },
+  data: {
+
+    //公共
+    id: null,
+    columnList: [],
+    requestParams: { //内容接口请求参数
+      categoryid: 0, //栏目id
+      pageNum: 1,
+      pageSize: 9,
+      order: 'sortindex',
+      articleid: 0,  //访问量统计
+      id: 0, //内容详情id
+    },
+    currentPath: '',
+    articalArray: [], //详情数组
+    articalArrayRelated: [], //相关推荐
+    columnTypes: [], //栏目类型
+    colL: 0,
+    modelType: 1,
+    columnImage: '', //栏目图片
+    footerBoolean:false, //底部延时加载(解决页面闪烁)
+
+    // 公共弹框
+    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'
+      }],
+    },
+
+
+    //首页
+    homeList: [],
+    status: false,
+
+    // 新闻
+    goPage: 1,
+    totalPageNum: 1,
+    totalPageSzie: 1,
+    loading: true,
+    categoryid: 0,
+  },
+
+  computed: {
+
+  },
+  created: function () {
+    this.requestParams.categoryid = this.getQuery('categoryid') ? this.getQuery('categoryid') : ''
+    this.requestParams.id = this.getQuery('id') ? this.getQuery('id') : ''
+    this.requestParams.articleid = this.getQuery('id') ? this.getQuery('id') : ''
+  },
+  mounted: function () {
+
+    this.getColumnData()
+  },
+  methods: {
+
+    //获取栏目数据
+    getColumnData() {
+      var _this = this;
+      if (!localStorage.getItem('storeColumnList') || window.location.pathname == '/') {
+        $.ajax({
+          type: 'get',
+          dataType: 'json',
+          url: window.FQDN2 + 'siteCategory/siteCategoryList',
+        }).done(function (res) {
+          _this.columnList = res.data;
+          let expires = Date.now() + 1000 * 60 * 30; //半小时过期时间
+          localStorage.setItem('storeColumnList', JSON.stringify({
+            data: _this.columnList,
+            expires
+          }));
+          _this.loading = false
+          _this.currentPath = window.location.pathname;
+          _this.handleColumnData()
+        })
+      } else {
+        this.loading = false;
+        this.handleColumnData()
+      }
+      setTimeout(function(){
+        _this.footerBoolean=true
+      },1000)
+    },
+
+
+    handleColumnData() {
+      this.currentPath = window.location.pathname;
+      this.columnList = JSON.parse(localStorage.getItem('storeColumnList')).data;
+
+      // 读取并检查是否过期
+      if (JSON.parse(localStorage.getItem('storeColumnList')).expires < Date.now()) {
+        localStorage.removeItem('storeColumnList');
+      } else {
+      }
+
+
+      var _this = this;
+
+      for (let i = 0; i < _this.columnList.length; i++) {
+
+        //栏目处理  
+
+        //进入首页
+        if (_this.columnList[i].sname == '/index.html' && (window.location.pathname == '/'||window.location.pathname == '')) {
+          getSeoCommon()
+
+          this.requestParams.categoryid = this.columnList[0].id
+          _this.modelType = _this.columnList[0].modelType;
+          _this.columnImage = _this.columnList[0].imagePath;
+          setTimeout(() => {
+            if (_this.modelType == 2) {
+              document.getElementById("videoPlay").src = _this.columnImage; //url为你需要播放的视频地址
+              document.getElementById("videoPlay").setAttribute('poster', '/assets/img/banner/111.png');
+            }
+          }, 100)
+          _this.getArticalData(_this.requestParams)
+        }
+
+        //进入其他栏目页
+        if ((_this.columnList[i].sname == window.location.pathname)) {
+          getSeoCommon()
+
+          _this.columnTypes = _this.columnList[i].children
+          _this.colL = _this.columnTypes.childten;
+          if (_this.columnList[i].children.length > 0) {
+            _this.requestParams.categoryid = (_this.getQuery('isUrlId') == 1) ? _this.getQuery('categoryid') : _this.columnTypes[0].id;
+          } else {
+                        var objData = _this.columnList.filter(obj => obj.sname == window.location.pathname);
+            _this.requestParams.categoryid = objData[0].id
+
+          }
+          _this.getArticalData(_this.requestParams)
+          _this.modelType = _this.columnList[i].modelType;
+          _this.columnImage = _this.columnList[i].imagePath;
+          setTimeout(() => {
+            if (_this.modelType == 2) {
+              document.getElementById("videoPlay").src = _this.columnImage; //url为你需要播放的视频地址
+              document.getElementById("videoPlay").setAttribute('poster', '/assets/img/banner/111.png');
+            }
+          }, 100)
+
+
+
+        } else {
+
+
+
+          // 进入详情页
+          if (_this.columnList[i].sname == '/product/' && window.location.pathname == '/product/read.html') {
+
+            getDetailCommon()
+            getSeoCommon()
+          }
+          if (_this.columnList[i].sname == '/solution/' && window.location.pathname == '/solution/read.html') {
+            getDetailCommon()
+            getSeoCommon()
+          }
+          if (_this.columnList[i].sname == '/news/' && window.location.pathname == '/news/read.html') {
+            getDetailCommon()
+            getSeoCommon()
+          }
+
+          function getDetailCommon() {
+            //获取内容详情
+            _this.getArticalData(_this.requestParams)
+            //获取详情相关数据
+            setTimeout(() => {
+              _this.requestParams.id = ''
+              _this.requestParams.articleid = ''
+              _this.getArticalData(_this.requestParams, 1)
+            }, 100)
+            _this.currentPath = _this.columnList[i].sname //产品详情时栏目高亮
+            _this.modelType = _this.columnList[i].modelType; //栏目图片获取
+            _this.columnImage = _this.columnList[i].imagePath; //栏目图片获取
+            setTimeout(() => {
+              if (_this.modelType == 2) {
+                document.getElementById("videoPlay").src = _this.columnImage; //url为你需要播放的视频地址
+                document.getElementById("videoPlay").setAttribute('poster', '/assets/img/banner/111.png');
+              }
+            }, 100)
+          }
+        }
+
+        function getSeoCommon() {
+          $('title').text(_this.columnList[i].categoryName);
+          $('meta[name="description"]').attr('content', _this.columnList[i].metadescription);
+          $('meta[name="keywords"]').attr('content', _this.columnList[i].metakeywords);
+        }
+
+
+
+        // 获取反馈弹框类型数据
+        if (_this.columnList[i].sname == '/solution/') {
+          _this.dialogDataArray = (_this.columnList[i].children)
+          _this.ruleForm.platName = _this.dialogDataArray[0].categoryName;
+        }
+      }
+    },
+
+    //获取内容
+    getArticalData(requestParams, type) {
+      var _this = this
+      if (window.location.pathname == '/news/') {
+        _this.requestParams.order = ''
+      }
+
+      $.ajax({
+        type: 'GET',
+        dataType: 'json',
+        url: window.FQDN2 + 'siteArticle/siteArticleList',
+        data: requestParams
+      }).done(function (res) {
+        var aa
+        var bb
+
+        if (type == 1) {
+          bb = res.data.records
+        } else {
+          aa = res.data.records;
+          _this.articalArray = aa;
+        }
+        if (bb) {
+          _this.articalArrayRelated = bb.filter(obj => obj.title != _this.articalArray[0].title);
+          // _this.articalArrayRelated = bb
+        }
+        // _this.loading = false;
+        _this.totalPageSzie = res.data.total
+        _this.totalPageNum = Math.ceil(res.data.total / res.data.size);
+      }).fail(function (err) {});
+    },
+
+    //类型点击
+    facilityClick(e, item) {
+      this.requestParams.categoryid = item.id
+      this.requestParams.pageNum = 1
+      this.getArticalData(this.requestParams)
+    },
+
+    //  分页
+    oneInnerBox: function (param) {
+      
+      window.location = "./read.html?categoryid=" + param.categoryid + "&id=" + param.id + "&isUrlId=1";
+    },
+    enterPage: function (res) {
+      if (this.goPage >= 1 && this.goPage <= this.totalPageNum) {
+        this.requestParams.pageNum = this.goPage
+        this.getArticalData(this.requestParams)
+      } else {
+        this.goPage = 1
+        alert('输入页数有误!')
+      }
+    },
+    currentChange: function (res) {
+      this.requestParams.pageNum = res
+      this.getArticalData(this.requestParams)
+    },
+
+    //申请试用
+    goApply: function () {
+      this.centerDialogVisible = true
+
+    },
+
+    //弹框显示隐藏(子组件向父组件传值)
+    handleChildEvent: function (value) {
+      this.centerDialogVisible = value; // 处理从子组件接收到的数据
+    },
+
+
+
+
+    // 排序
+    compare(property) {
+      return function (a, b) {
+        var value1 = a[property];
+        var value2 = b[property];
+        return value1 - value2;
+      }
+    },
+
+    // 获取路由参数
+    getQuery(name) {
+      var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+      var r = window.location.search.substr(1).match(reg);
+      if (r != null) return decodeURI(r[2]);
+      return null;
+    },
+
+    //获得年月日时分秒  //传入日期//例:2020-10-27T14:36:23
+    timeFormatSeconds(time) {
+      var d = time ? new Date(time) : new Date();
+      var year = d.getFullYear();
+      var month = d.getMonth() + 1;
+      var day = d.getDate();
+      var hours = d.getHours();
+      var min = d.getMinutes();
+      var seconds = d.getSeconds();
+
+      if (month < 10) month = '0' + month;
+      if (day < 10) day = '0' + day;
+      if (hours < 0) hours = '0' + hours;
+      if (min < 10) min = '0' + min;
+      if (seconds < 10) seconds = '0' + seconds;
+
+      return (year + '-' + month + '-' + day + ' ' + hours + ':' + min + ':' + seconds);
+    }
+  }
+});

+ 410 - 0
src/assets/js/commonVue.js

@@ -0,0 +1,410 @@
+import footerCom from '/assets/js/component/footerCom.js'
+import feedFix from '/assets/js/component/feedFix.js'
+import dialogCom from '/assets/js/component/dialogCom.js'
+import loadingCom from '/assets/js/component/loadingCom.js'
+import headerCom from '/assets/js/component/headerCom.js'
+
+const App = {
+
+  components: {
+    footerCom,
+    feedFix,
+    dialogCom,
+    loadingCom,
+    headerCom
+  },
+  data() {
+    return {
+      title: 'Hello Vue',
+      count: 0,
+      articalArray: [], //详情数组
+      //公共
+      id: null,
+      columnList: [],
+      requestParams: { //内容接口请求参数
+        categoryid: 0, //栏目id
+        pageNum: 1,
+        pageSize: 9,
+        order: 'sortindex',
+        articleid: 0, //访问量统计
+        id: 0, //内容详情id
+      },
+      dup: '',
+      currentPath: '',
+      articalArray: [], //详情数组
+      articalArrayRelated: [], //相关推荐
+      columnTypes: [], //栏目类型
+      colL: 0,
+      modelType: 1,
+      columnImage: '', //栏目图片
+      footerBoolean: false, //底部延时加载(解决页面闪烁)
+      contentBoolean: false, //中间延时加载(优化banner图片加载慢的问题)
+
+      // 公共弹框
+      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'
+        }],
+      },
+
+      //首页
+      homeList: [],
+      status: false,
+
+      // 新闻
+      goPage: 1,
+      totalPageNum: 1,
+      totalPageSzie: 1,
+      loading: true,
+      categoryid: 0,
+    }
+  },
+
+  computed: {
+  },
+  created: function () {
+    this.dup = this.getQuery('dup')
+    this.requestParams.categoryid = this.getQuery('categoryid') ? this.getQuery('categoryid') : ''
+    this.requestParams.id = this.getQuery('id') ? this.getQuery('id') : ''
+    this.requestParams.articleid = this.getQuery('id') ? this.getQuery('id') : ''
+  },
+  mounted: function () {
+    this.getColumnData()
+  },
+  methods: {
+
+    //获取栏目数据
+    getColumnData() {
+      var _this = this;
+      if (!localStorage.getItem('storeColumnList') || (window.location.pathname == '/' && !this.dup) || window.location.pathname == '/index.html') {
+        $.ajax({
+          type: 'get',
+          dataType: 'json',
+          url: window.FQDN2 + 'siteCategory/siteCategoryList',
+        }).done(function (res) {
+          _this.lazyFunc()
+          _this.columnList = res.data;
+          let expires = Date.now() + 1000 * 60 * 30; //半小时过期时间
+          localStorage.setItem('storeColumnList', JSON.stringify({
+            data: _this.columnList,
+            expires
+          }));
+          _this.loading = false
+          _this.handleColumnData()
+        })
+      } else {
+        this.loading = false;
+        this.handleColumnData()
+      }
+      setTimeout(function () {
+        _this.contentBoolean = true
+      }, 900)
+      setTimeout(function () {
+        _this.footerBoolean = true
+      }, 1000)
+    },
+
+
+    handleColumnData() {
+      if (window.location.pathname == '/' && !this.dup) { //if 首页模板
+        this.currentPath = '/template1/'
+      } else if (window.location.pathname == '/' && this.dup) { //if 首页复用模板
+        this.currentPath = '/template1/?dup=' + this.dup
+      } else if (window.location.href.indexOf("dup") > 0) { // if 非首页模板
+        this.currentPath = `${window.location.pathname}?dup=` + this.getQuery('dup')
+      } else { //非首页复用模板
+        this.currentPath = window.location.pathname;
+      }
+      this.columnList = JSON.parse(localStorage.getItem('storeColumnList')).data;
+      // 读取并检查是否过期
+      if (JSON.parse(localStorage.getItem('storeColumnList')).expires < Date.now()) {
+        localStorage.removeItem('storeColumnList');
+      } 
+
+      var _this = this;
+      for (let i = 0; i < _this.columnList.length; i++) {
+        // 获取反馈弹框类型数据
+        if (_this.columnList[i].categoryStyle == '2' && _this.columnList[i].sname == '') {
+          _this.dialogDataArray = (_this.columnList[i].children)
+          _this.ruleForm.platName = _this.dialogDataArray[0].categoryName;
+        }
+
+        //栏目处理  
+
+        //进入首页
+        if (_this.columnList[i].categoryStyle == '1' && (window.location.pathname == '/' || window.location.pathname == '' || window.location.pathname == '/index.html')) {
+          if ('/?dup=' + _this.columnList[i].sname == `${window.location.pathname}?dup=` + this.getQuery('dup')) {
+            console.log('首页复用模板')
+            getSeoCommon()
+            var objData = _this.columnList.filter(obj => obj.categoryStyle == 1 ? '/?dup=' + obj.sname == `${window.location.pathname}?dup=` + _this.getQuery('dup') : '');
+            _this.requestParams.categoryid = objData[0].id
+            _this.getArticalData(_this.requestParams)
+            _this.columnImage = _this.columnList[i].imagePath;
+            getBannerCommon()
+          }
+          if (window.location.href.indexOf("dup") == -1 && !_this.columnList[i].sname) {
+            console.log('首页模板')
+            getSeoCommon()
+            this.requestParams.categoryid = this.columnList[0].id
+            _this.getArticalData(_this.requestParams)
+            _this.columnImage = _this.columnList[0].imagePath;
+            getBannerCommon()
+          }
+        }
+
+        //进入其他栏目页
+        if (('/template' + _this.columnList[i].categoryStyle + '/' == window.location.pathname) || (_this.columnList[i].categoryStyle == window.location.pathname.replace('index.html', ''))) {
+          if (window.location.href.indexOf("dup") && ('/template' + _this.columnList[i].categoryStyle + '/?dup=' + _this.columnList[i].sname == `${window.location.pathname}?dup=` + this.getQuery('dup'))) {
+            if (_this.columnList[i].children.length > 0) {
+              _this.columnTypes = _this.columnList[i].children
+              _this.requestParams.categoryid = (_this.getQuery('isUrlId') == 1) ? _this.getQuery('categoryid') : _this.columnTypes[0].id;
+              _this.getArticalData(_this.requestParams)
+              _this.columnImage = _this.columnList[i].imagePath;
+            } else {
+              var objData = _this.columnList.filter(obj => '/template' + obj.categoryStyle + '/?dup=' + obj.sname == `${window.location.pathname}?dup=` + _this.getQuery('dup'));
+              _this.requestParams.categoryid = objData[0].id
+              _this.getArticalData(_this.requestParams)
+              _this.columnImage = _this.columnList[i].imagePath;
+            }
+            getSeoCommon()
+            getBannerCommon()
+          }
+          if (window.location.href.indexOf("dup") == -1 && !_this.columnList[i].sname && ('/template' + _this.columnList[i].categoryStyle + '/' == window.location.pathname)) {
+            if (_this.columnList[i].children.length > 0) {
+              _this.columnTypes = _this.columnList[i].children
+              _this.requestParams.categoryid = (_this.getQuery('isUrlId') == 1) ? _this.getQuery('categoryid') : _this.columnTypes[0].id;
+              _this.getArticalData(_this.requestParams)
+              _this.columnImage = _this.columnList[i].imagePath;
+            } else {
+              var objData = _this.columnList.filter(obj => '/template' + obj.categoryStyle + '/' == window.location.pathname.replace('index.html', ''));
+              _this.requestParams.categoryid = objData[0].id
+              _this.getArticalData(_this.requestParams)
+              _this.columnImage = _this.columnList[i].imagePath;
+            }
+           getSeoCommon()
+           getBannerCommon()
+          }
+        } else {
+          // 进入详情页
+          if ('/template' + _this.columnList[i].categoryStyle + '/read.html' == window.location.pathname) {
+            getDetailCommon()
+          }
+
+          function getDetailCommon() {
+            //获取内容详情
+            _this.getArticalData(_this.requestParams)
+            //获取详情相关数据
+            setTimeout(() => {
+              _this.requestParams.id = ''
+              _this.requestParams.articleid = ''
+              _this.getArticalData(_this.requestParams, 1)
+            }, 100)
+
+            //产品详情时栏目高亮
+            if (window.location.href.indexOf("dup") && ('/template' + _this.columnList[i].categoryStyle + '/read.html' + '?dup=' + _this.columnList[i].sname == `${window.location.pathname}?dup=` + _this.getQuery('dup'))) {
+              _this.currentPath = `/template${ _this.columnList[i].categoryStyle}/?dup=` + _this.getQuery('dup')
+              _this.columnImage = _this.columnList[i].imagePath; //栏目图片获取
+              getSeoCommon()
+              getBannerCommon()
+            }
+
+            if (window.location.href.indexOf("dup") == -1 && !_this.columnList[i].sname && ('/template' + _this.columnList[i].categoryStyle + '/read.html' == window.location.pathname)) {
+              _this.currentPath = `/template${ _this.columnList[i].categoryStyle}/`
+              _this.columnImage = _this.columnList[i].imagePath; //栏目图片获取
+              getSeoCommon()
+              getBannerCommon()
+            }
+          }
+        }
+
+        function getBannerCommon(){
+          _this.modelType = _this.columnList[i].modelType; //栏目图片获取
+          setTimeout(() => {
+            if (_this.modelType == 2) {
+              document.getElementById("videoPlay").src = _this.columnImage; //url为你需要播放的视频地址
+              if(!document.getElementById("videoPlay").getAttribute('poster')){
+                document.getElementById("videoPlay").setAttribute('poster', '/assets/img/banner/poster.jpg');
+              }
+            }
+          }, 100)
+        }
+
+        function getSeoCommon() {
+          $('title').text(_this.columnList[i].categoryName);
+          $('meta[name="description"]').attr('content', _this.columnList[i].metadescription);
+          $('meta[name="keywords"]').attr('content', _this.columnList[i].metakeywords);
+        }
+      }
+    },
+
+    //获取内容
+    getArticalData(requestParams, type) {
+      var _this = this
+      if (window.location.pathname == '/template4/') {
+        _this.requestParams.order = ''
+      }
+
+      $.ajax({
+        type: 'GET',
+        dataType: 'json',
+        url: window.FQDN2 + 'siteArticle/siteArticleList',
+        data: requestParams
+      }).done(function (res) {
+        _this.lazyFunc()
+        var aa
+        var bb
+
+        if (type == 1) {
+          bb = res.data.records
+        } else {
+          aa = res.data.records;
+          _this.articalArray = aa;
+        }
+        if (bb) {
+          _this.articalArrayRelated = bb.filter(obj => obj.title != _this.articalArray[0].title);
+        }
+        _this.totalPageSzie = res.data.total
+        _this.totalPageNum = Math.ceil(res.data.total / res.data.size);
+      }).fail(function (err) {});
+    },
+
+    //类型点击
+    facilityClick(e, item) {
+      this.requestParams.categoryid = item.id
+      this.requestParams.pageNum = 1
+      this.getArticalData(this.requestParams)
+    },
+
+    //  分页
+    oneInnerBox: function (param) {
+      var aa = this.getQuery('dup')
+      if (this.getQuery('dup')) {
+        window.location = "./read.html?dup=" + aa + "&categoryid=" + param.categoryid + "&id=" + param.id + "&isUrlId=1";
+      } else {
+        window.location = "./read.html?categoryid=" + param.categoryid + "&id=" + param.id + "&isUrlId=1";
+      }
+    },
+    enterPage: function (res) {
+      if (this.goPage >= 1 && this.goPage <= this.totalPageNum) {
+        this.requestParams.pageNum = this.goPage
+        this.getArticalData(this.requestParams)
+      } else {
+        this.goPage = 1
+        alert('输入页数有误!')
+      }
+    },
+    currentChange: function (res) {
+      this.requestParams.pageNum = res
+      this.getArticalData(this.requestParams)
+    },
+
+    //申请试用
+    goApply: function () {
+      this.centerDialogVisible = true
+    },
+
+    lazyFunc: function () {
+      setTimeout(function () {
+        // 1 获取全部图片的DOM节点
+        // 注意:querySelectorAll 值为伪数组利用扩展运算符转为真数组
+        const images = $('.lazyContainer img')
+        // 2 监听页面滚动事件
+        window.addEventListener('scroll', lazyLoad)
+        // 3 定义页面滚动的处理函数
+        function lazyLoad() {
+          for (let i = 0; i < images.length; i++) {
+            // isVisible是否该图片位于可视区域 返回true 或false
+            if (isVisible(images[i])) {
+              // 将元素的自定义属性 data-src 赋值给元素的 src 属性 
+              // dataset.src 此为元素的自定义属性 data-src
+              if (images[i].dataset.src) {
+                images[i].src = images[i].dataset.src // 等价于:img.setAttribute('src', img.getAttribute('data-src'))
+              }
+              // 防止重复被遍历 加载完之后 删除元素不再加载
+              images.splice(i, 1)
+              i--
+            }
+          }
+        }
+        lazyLoad()
+        // 4 可视区域判断函数
+        function isVisible(img) {
+          // 判断是否在可视区域
+          const imgRect = img.getBoundingClientRect() // getBoundingClientRect 获取图片的动态信息
+          return imgRect.bottom > 0 && imgRect.top < window.innerHeight && imgRect.right > 0 && imgRect.left < window.innerWidth
+        }
+      }, 100)
+    },
+
+    //弹框显示隐藏(子组件向父组件传值)
+    handleChildEvent: function (value) {
+      this.centerDialogVisible = value; // 处理从子组件接收到的数据
+    },
+
+    // 排序
+    compare(property) {
+      return function (a, b) {
+        var value1 = a[property];
+        var value2 = b[property];
+        return value1 - value2;
+      }
+    },
+
+    // 获取路由参数
+    getQuery(name) {
+      var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+      var r = window.location.search.substr(1).match(reg);
+      if (r != null) return decodeURI(r[2]);
+      return null;
+    },
+
+    //获得年月日时分秒  //传入日期//例:2020-10-27T14:36:23
+    timeFormatSeconds(time) {
+      var d = time ? new Date(time) : new Date();
+      var year = d.getFullYear();
+      var month = d.getMonth() + 1;
+      var day = d.getDate();
+      var hours = d.getHours();
+      var min = d.getMinutes();
+      var seconds = d.getSeconds();
+
+      if (month < 10) month = '0' + month;
+      if (day < 10) day = '0' + day;
+      if (hours < 0) hours = '0' + hours;
+      if (min < 10) min = '0' + min;
+      if (seconds < 10) seconds = '0' + seconds;
+
+      return (year + '-' + month + '-' + day + ' ' + hours + ':' + min + ':' + seconds);
+    }
+  }
+}
+Vue.createApp(App).use(ElementPlus).mount("#app");

+ 100 - 0
src/assets/js/component/dialogCom.js

@@ -0,0 +1,100 @@
+export default {
+  props: {
+    fatherdialogv: Boolean,
+    ruleform:Object,
+    fatherrules:Object,
+    fatherdialoga:Object,
+  },
+  template: `
+            <el-dialog title="项目咨询"   @close="closeDialog('ruleform')"
+                 v-model="fatherdialogv" width="700px" center class="feedBackDialog" :lock-scroll="false">
+                <el-form :model="ruleform" :rules="fatherrules" ref="ruleform" label-width="80px" class="demo-ruleform">
+                    <el-form-item label="" prop="platName" style="" class="dialogTypeLabel">
+                        <el-radio-group v-model="ruleform.platName">
+                            <el-radio-button :label="item.categoryName" v-for="item in fatherdialoga" :key="item.id">
+                            </el-radio-button>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="姓名" prop="consultName">
+                                <el-input v-model="ruleform.consultName"></el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="联系电话" prop="consultPhone">
+                                <el-input v-model="ruleform.consultPhone"></el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="邮箱" prop="mail">
+                                <el-input v-model="ruleform.mail"></el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="公司" prop="company">
+                                <el-input v-model="ruleform.company"></el-input>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-form-item label="需求描述" prop="consultContent">
+                        <el-input type="textarea" v-model="ruleform.consultContent"></el-input>
+                    </el-form-item>
+                </el-form>
+
+                <!-- <span>需要注意的是内容是默认不居中的</span> -->
+                <span slot="footer" class="dialog-footer" style="width:100%;text-align:center">
+                    <el-button @click="resetForm('ruleform')">取 消</el-button>
+                    <el-button type="primary" @click="submitForm('ruleform')">提 交</el-button>
+                </span>
+            </el-dialog>
+  `,
+  mounted: function () {
+
+  },
+  methods:{
+
+    
+
+     //公共弹框
+     submitForm(formName) {
+      var _this = this
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          let param = JSON.stringify(_this.ruleform)
+          jQuery.ajax({
+            type: 'POST',
+            // dataType: 'json',
+            contentType: 'application/json;charset=UTF-8',
+            url: window.FQDN2 + 'siteReview',
+            data: param
+          }).done(function (res) {
+            if (res.status === "SUCCESS") {
+              _this.$message({
+                message: '提交成功',
+                type: 'success'
+              });
+              _this.$emit('data-event', false); 
+              _this.$refs[formName].resetFields(); //重置from校验
+            }
+          }).fail(function (err) {});
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+
+    /** 关闭弹窗 */
+    closeDialog(formName) {
+      this.$emit('data-event', false); 
+      this.$refs[formName].resetFields();
+    },
+
+    // 重置表单
+    resetForm(formName) {
+      this.$refs[formName].resetFields();
+      this.$emit('data-event', false); 
+    },
+  }
+}

+ 52 - 0
src/assets/js/component/feedFix.js

@@ -0,0 +1,52 @@
+export default {
+  props: {
+    todo: Object
+  },
+  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:0">
+                  <img src="/assets/img/home/f_top.png" alt="">
+              </div>
+          </div>
+  `,
+  methods:{
+    //返回顶部
+    scrollToTop() {
+    
+        window.scrollTo({
+          top: 0,
+          behavior: "smooth"
+        });
+      },
+    }
+}

+ 57 - 0
src/assets/js/component/footerCom.js

@@ -0,0 +1,57 @@
+export default {
+    props: {
+      todo: Object
+    },
+    template: `
+    <footer>
+              <!-- widgets -->
+              <div class="footer-widget-area">
+                  <div class="container">
+                      <div class="row footerOne">
+                          <div class="col-lg-2 col-md-6 col-sm-6 footerWidth">
+                              <div class="copyrigt-or-code d-flex flex-column align-items-center ">
+                                  <img width="130 " height="130 " src="https://aiot.usky.cn/uskyq/assets/img/qr_code.png">
+                                  <span style="text-align: left;color:#fff;margin-top:10px ">微信公众号</span>
+                              </div>
+                          </div>
+                          <div class="footerNone" :style="{'width':(.8/todo.length*100)+'%' }"  v-for="item in todo" :key="item.id">
+                              <div class="widget nav-widget d-flex justify-content-center ">
+                                  <div>
+                                      <h5 class="widget-title">
+                                        <a  v-if="item.sname" :href="item.categoryStyle==1?'/?dup='+item.sname:'/template'+item.categoryStyle+'/?dup='+item.sname">{{item.categoryName}}</a>
+                                        <a  v-else :href="item.categoryStyle==1?'/':'/template'+item.categoryStyle+'/'">{{item.categoryName}}</a>
+                                      </h5>
+                                      <ul>
+                                          <li v-if="item.children" v-for="r in item.children" :key="r.id">
+                                              <a :href="item.sname?'/template'+item.categoryStyle+'/?dup='+item.sname+'&categoryid='+r.id+'&isUrlId=1'  : '/template'+item.categoryStyle+'/?categoryid='+r.id+'&isUrlId=1'"> <span
+                                              > {{r.categoryName}}</a>
+                                          </li>
+                                      </ul>
+                                  </div>
+                              </div>
+                          </div>
+                      </div>
+                  </div>
+              </div>
+              <!-- copyright -->
+              <div class="copy-right-area ">
+                  <div class="container ">
+                      <div class="row copyrigt-text ">
+                          <div class="col-lg-12 ">
+                              <p>Copyright © 2001- 2024 Usky. All Rights Reserved. 永天股份 版权所有</p>
+                              <p>增值电信业务经营许可证(IDC、ISP)编号B2-20080010</p>
+                              <p style="margin-top:10px">
+                                <a target="_blank" href="https://wap.scjgj.sh.gov.cn/businessCheck/verifKey.do?showType=extShow&serial=9031000020180517151815000002552816-SAIC_SHOW_310000-C5DE2EFE9AD14E94923F7AC487AA7077105&signData=MEYCIQDqmcH8RWjPwf4id/UFCbng+HLdnF21HDjoUikAjkdiKQIhAOrQRYz74d3T5P03DL6OW10HBRktOYPenEbcmn1gCweV">
+                                    <img src="/assets/img/spc.png" alt="1" width="20"></img>
+                                    沪公网安备 31010802001185号
+                                </a>
+                              </p>
+                          </div>
+                      </div>
+                  </div>
+              </div>
+          </footer>
+    `,
+   
+  }
+  

+ 51 - 0
src/assets/js/component/headerCom.js

@@ -0,0 +1,51 @@
+export default {
+  props: {
+    todo: Object,
+    currentone: String
+  },
+  template: `
+  <header class="header-absolute sticky-header">
+            <div class="custom-container-one">
+                <div class="mainmenu-area  d-flex align-items-center justify-content-center">
+                    <div class="logo">
+                        <a href="/"><img src="../assets/img/logo-white.png" alt="uskylogo"></a>
+                    </div>
+                    <div class="d-flex align-items-center ">
+                        <nav class="main-menu">
+
+                            <div class="menu-items">
+                                <ul v-if="todo">
+                                    <li v-for="item in todo" :key="item.id" 
+                                    :class="!item.sname ? currentone=='/template'+item.categoryStyle+'/' ? 'active' : '' :currentone == '/template'+item.categoryStyle+'/?dup=' + item.sname ? 'active' : ''" 
+                                    
+                                    >
+                                        <a  v-if="item.sname" :href="item.categoryStyle==1?'/?dup='+item.sname:'/template'+item.categoryStyle+'/?dup='+item.sname">{{item.categoryName}}</a>
+                                        <a  v-else :href="item.categoryStyle==1?'/':'/template'+item.categoryStyle+'/'">{{item.categoryName}}</a>
+                                        <ul class="submenu">
+                                            <li v-if="item.children" v-for="aa in item.children" :key="aa.id"><a
+                                                    :href="item.sname?'/template'+item.categoryStyle+'/?dup='+item.sname+'&categoryid='+aa.id+'&isUrlId=1'  : '/template'+item.categoryStyle+'/?categoryid='+aa.id+'&isUrlId=1'"> <span
+                                                        style="font-weight:bold;margin-right:10px">·</span>
+                                                    {{aa.categoryName}}</a></li>
+                                        </ul>
+                                    </li>
+
+                                </ul>
+                            </div>
+                        </nav>
+                        <div class="apply-expre" v-if="todo.length>0" @click="gogo()">申请体验
+                        </div>
+                    </div>
+                </div>
+                <div>
+                    <div class="mobile-menu"></div>
+                </div>
+            </div>
+        </header>
+  `,
+  methods:{
+    gogo(){
+      this.$emit('data-event'); 
+    }
+  }
+ 
+}

+ 15 - 0
src/assets/js/component/loadingCom.js

@@ -0,0 +1,15 @@
+export default {
+  props: {
+    loadingfather: Object
+  },
+  template: `
+                <div class="loadEffect">
+                    <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
+                </div>
+          
+  `,
+  mounted: function () {
+
+  },
+ 
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 9525 - 0
src/assets/js/element/index.js


+ 236 - 0
src/assets/js/jquery.meanmenu.min.js

@@ -0,0 +1,236 @@
+(function($) {
+    'use strict';
+   
+        $.fn.meanmenu = function(e) {
+            
+            var n = {
+                meanMenuTarget: jQuery(this),
+                meanMenuContainer: 'body',
+                meanMenuClose: '<span /><span /><span />',
+                meanMenuCloseSize: '18px',
+                meanMenuOpen: '<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)) &&
+                jQuery('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
+                                ?
+                                jQuery('.meanmenu-reveal').animate({
+                                    left: n,
+                                }) :
+                                jQuery('.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() {
+                        jQuery('.mean-bar,.mean-push').remove(),
+                            jQuery(t).removeClass('mean-container'),
+                            jQuery(n).css('display', g),
+                            (A = !1),
+                            (E = !1),
+                            jQuery(p).removeClass('mean-remove');
+                    },
+                    b = function() {
+                     
+                            var e = 'background:' + l + ';color:' + l + ';' + w;
+                        if (o >= a) {
+                            jQuery(p).addClass('mean-remove'),
+                                (E = !0),
+                                jQuery(t).addClass('mean-container'),
+                                jQuery('.mean-container').prepend(
+                                    '<div class="mean-bar"><a href="#nav" class="meanmenu-reveal" style="' +
+                                    e +
+                                    '">Show Navigation</a><nav class="mean-nav"></nav></div>'
+                                );
+jQuery(v).html(s),
+
+                                setTimeout(function(){
+                            var r = jQuery(n).html();
+                            jQuery('.mean-nav').html(r),
+                                Q &&
+                                jQuery(
+                                    'nav.mean-nav ul, nav.mean-nav ul *'
+                                ).each(function() {
+                                    jQuery(this).is('.mean-remove') ?
+                                        jQuery(this).attr(
+                                            'class',
+                                            'mean-remove'
+                                        ) :
+                                        jQuery(this).removeAttr('class'),
+                                        jQuery(this).removeAttr('id');
+                                }),
+                                jQuery(n).before('<div class="mean-push" />'),
+                                jQuery('.mean-push').css('margin-top', c),
+                                jQuery(n).hide(),
+                                jQuery('.meanmenu-reveal').show(),
+                                
+                                (M = jQuery(v)),
+                                jQuery('.mean-nav ul').hide(),
+                                h ?
+                                d ?
+                                (jQuery('.mean-nav ul ul').each(
+                                        function() {
+                                            jQuery(this).children()
+                                                .length &&
+                                                jQuery(this, 'li:first')
+                                                .parent()
+                                                .append(
+                                                    '<a class="mean-expand" href="#" style="font-size: ' +
+                                                    i +
+                                                    '">' +
+                                                    y +
+                                                    '</a>'
+                                                );
+                                        }
+                                    ),
+                                    jQuery('.mean-expand').on(
+                                        'click',
+                                        function(e) {
+                                            e.preventDefault(),
+                                                jQuery(this).hasClass(
+                                                    'mean-clicked'
+                                                ) ?
+                                                (jQuery(this).text(y),
+                                                    jQuery(this)
+                                                    .prev('ul')
+                                                    .slideUp(
+                                                        300,
+                                                        function() {}
+                                                    )) :
+                                                (jQuery(this).text(j),
+                                                    jQuery(this)
+                                                    .prev('ul')
+                                                    .slideDown(
+                                                        300,
+                                                        function() {}
+                                                    )),
+                                                jQuery(this).toggleClass(
+                                                    'mean-clicked'
+                                                );
+                                        }
+                                    )) :
+                                jQuery('.mean-nav ul ul').show() :
+                                jQuery('.mean-nav ul ul').hide(),
+                                jQuery('.mean-nav ul li')
+                                .last()
+                                .addClass('mean-last'),
+                                M.removeClass('meanclose'),
+                                jQuery(M).on('click',function(e) {
+                                    e.preventDefault(),
+                                        A === !1 ?
+                                        (M.css('text-align', 'center'),
+                                            M.css('text-indent', '0'),
+                                            M.css('font-size', i),
+                                            jQuery(
+                                                '.mean-nav ul:first'
+                                            ).slideDown(),
+                                            (A = !0)) :
+                                        (jQuery(
+                                                '.mean-nav ul:first'
+                                            ).slideUp(),
+                                            (A = !1)),
+                                        M.toggleClass('meanclose'),
+                                        jQuery(p).addClass('mean-remove');
+                                }),
+                                f &&
+                                jQuery('.mean-nav ul > li > a:first-child').on(
+                                    'click',
+                                    function() {
+                                        jQuery('.mean-nav ul:first').slideUp(),
+                                            (A = !1),
+                                            jQuery(M)
+                                            .toggleClass('meanclose')
+                                            .html(s);
+                                    }
+                                );
+
+
+                                },300)
+                            
+                            
+                        } else W();
+    
+                       
+                        
+                    };
+                C ||
+                    jQuery(window).resize(function() {
+                        (a =
+                            window.innerWidth ||
+                            document.documentElement.clientWidth),
+                        a > o,
+                            W(),
+                            o >= a ? (b(), x()) : W();
+                    }),
+                    jQuery(window).resize(function() {
+                        (a =
+                            window.innerWidth ||
+                            document.documentElement.clientWidth),
+                        C
+                            ?
+                            (x(), o >= a ? E === !1 && b() : W()) :
+                            (W(), o >= a && (b(), x()));
+                    }),
+                    b();
+            });
+                };
+
+   
+    
+})(jQuery);

+ 511 - 0
src/assets/js/jquery.media.js

@@ -0,0 +1,511 @@
+/*
+ * jQuery Media Plugin for converting elements into rich media content.
+ *
+ * Examples and documentation at: http://malsup.com/jquery/media/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * @author: M. Alsup
+ * @version: 0.99 (05-JUN-2013)
+ * @requires jQuery v1.1.2 or later
+ * $Id: jquery.media.js 2460 2007-07-23 02:53:15Z malsup $
+ *
+ * Supported Media Players:
+ *	- Flash
+ *	- Quicktime
+ *	- Real Player
+ *	- Silverlight
+ *	- Windows Media Player
+ *	- iframe
+ *
+ * Supported Media Formats:
+ *	 Any types supported by the above players, such as:
+ *	 Video: asf, avi, flv, mov, mpg, mpeg, mp4, qt, smil, swf, wmv, 3g2, 3gp
+ *	 Audio: aif, aac, au, gsm, mid, midi, mov, mp3, m4a, snd, rm, wav, wma
+ *	 Other: bmp, html, pdf, psd, qif, qtif, qti, tif, tiff, xaml
+ *
+ * Thanks to Mark Hicken and Brent Pedersen for helping me debug this on the Mac!
+ * Thanks to Dan Rossi for numerous bug reports and code bits!
+ * Thanks to Skye Giordano for several great suggestions!
+ * Thanks to Richard Connamacher for excellent improvements to the non-IE behavior!
+ */
+/*global SWFObject alert Sys */
+/*jshint forin:false */
+;(function($) {
+"use strict";	
+
+var mode = document.documentMode || 0;
+var msie = /MSIE/.test(navigator.userAgent);
+var lameIE = msie && (/MSIE (6|7|8)\.0/.test(navigator.userAgent) || mode < 9);
+
+/**
+ * Chainable method for converting elements into rich media.
+ *
+ * @param options
+ * @param callback fn invoked for each matched element before conversion
+ * @param callback fn invoked for each matched element after conversion
+ */
+$.fn.media = function(options, f1, f2) {
+	if (options == 'undo') {
+		return this.each(function() {
+			var $this = $(this);
+			var html = $this.data('media.origHTML');
+			if (html)
+				$this.replaceWith(html);
+		});
+	}
+	
+	return this.each(function() {
+		if (typeof options == 'function') {
+			f2 = f1;
+			f1 = options;
+			options = {};
+		}
+		var o = getSettings(this, options);
+		// pre-conversion callback, passes original element and fully populated options
+		if (typeof f1 == 'function') f1(this, o);
+
+		var r = getTypesRegExp();
+		var m = r.exec(o.src.toLowerCase()) || [''];
+		var fn;
+
+		if (o.type)
+			m[0] = o.type;
+		else
+			m.shift();
+
+		for (var i=0; i < m.length; i++) {
+			fn = m[i].toLowerCase();
+			if (isDigit(fn[0])) fn = 'fn' + fn; // fns can't begin with numbers
+			if (!$.fn.media[fn])
+				continue;  // unrecognized media type
+			// normalize autoplay settings
+			var player = $.fn.media[fn+'_player'];
+			if (!o.params) o.params = {};
+			if (player) {
+				var num = player.autoplayAttr == 'autostart';
+				o.params[player.autoplayAttr || 'autoplay'] = num ? (o.autoplay ? 1 : 0) : o.autoplay ? true : false;
+			}
+			var $div = $.fn.media[fn](this, o);
+
+			$div.css('backgroundColor', o.bgColor).width(o.width);
+			
+			if (o.canUndo) {
+				var $temp = $('<div></div>').append(this);
+				$div.data('media.origHTML', $temp.html()); // store original markup
+			}
+			
+			// post-conversion callback, passes original element, new div element and fully populated options
+			if (typeof f2 == 'function') f2(this, $div[0], o, player.name);
+			break;
+		}
+	});
+};
+
+/**
+ * Non-chainable method for adding or changing file format / player mapping
+ * @name mapFormat
+ * @param String format File format extension (ie: mov, wav, mp3)
+ * @param String player Player name to use for the format (one of: flash, quicktime, realplayer, winmedia, silverlight or iframe
+ */
+$.fn.media.mapFormat = function(format, player) {
+	if (!format || !player || !$.fn.media.defaults.players[player]) return; // invalid
+	format = format.toLowerCase();
+	if (isDigit(format[0])) format = 'fn' + format;
+	$.fn.media[format] = $.fn.media[player];
+	$.fn.media[format+'_player'] = $.fn.media.defaults.players[player];
+};
+
+// global defautls; override as needed
+$.fn.media.defaults = {
+	standards:  true,       // use object tags only (no embeds for non-IE browsers)
+	canUndo:    true,       // tells plugin to store the original markup so it can be reverted via: $(sel).mediaUndo()
+	width:		400,
+	height:		400,
+	autoplay:	0,			// normalized cross-player setting
+	bgColor:	'#ffffff',	// background color
+	params:		{ wmode: 'transparent'},	// added to object element as param elements; added to embed element as attrs
+	attrs:		{},			// added to object and embed elements as attrs
+	flvKeyName: 'file',		// key used for object src param (thanks to Andrea Ercolino)
+	flashvars:	{},			// added to flash content as flashvars param/attr
+	flashVersion:	'7',	// required flash version
+	expressInstaller: null,	// src for express installer
+
+	// default flash video and mp3 player (@see: http://jeroenwijering.com/?item=Flash_Media_Player)
+	flvPlayer:	 'mediaplayer.swf',
+	mp3Player:	 'mediaplayer.swf',
+
+	// @see http://msdn2.microsoft.com/en-us/library/bb412401.aspx
+	silverlight: {
+		inplaceInstallPrompt: 'true', // display in-place install prompt?
+		isWindowless:		  'true', // windowless mode (false for wrapping markup)
+		framerate:			  '24',	  // maximum framerate
+		version:			  '0.9',  // Silverlight version
+		onError:			  null,	  // onError callback
+		onLoad:			      null,   // onLoad callback
+		initParams:			  null,	  // object init params
+		userContext:		  null	  // callback arg passed to the load callback
+	}
+};
+
+// Media Players; think twice before overriding
+$.fn.media.defaults.players = {
+	flash: {
+		name:		 'flash',
+		title:		 'Flash',
+		types:		 'flv,mp3,swf',
+		mimetype:	 'application/x-shockwave-flash',
+		pluginspage: 'http://www.adobe.com/go/getflashplayer',
+		ieAttrs: {
+			classid:  'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000',
+			type:	  'application/x-oleobject',
+			codebase: 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' + $.fn.media.defaults.flashVersion
+		}
+	},
+	quicktime: {
+		name:		 'quicktime',
+		title:		 'QuickTime',
+		mimetype:	 'video/quicktime',
+		pluginspage: 'http://www.apple.com/quicktime/download/',
+		types:		 'aif,aiff,aac,au,bmp,gsm,mov,mid,midi,mpg,mpeg,mp4,m4a,psd,qt,qtif,qif,qti,snd,tif,tiff,wav,3g2,3gp',
+		ieAttrs: {
+			classid:  'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
+			codebase: 'http://www.apple.com/qtactivex/qtplugin.cab'
+		}
+	},
+	realplayer: {
+		name:		  'real',
+		title:		  'RealPlayer',
+		types:		  'ra,ram,rm,rpm,rv,smi,smil',
+		mimetype:	  'audio/x-pn-realaudio-plugin',
+		pluginspage:  'http://www.real.com/player/',
+		autoplayAttr: 'autostart',
+		ieAttrs: {
+			classid: 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'
+		}
+	},
+	winmedia: {
+		name:		  'winmedia',
+		title:		  'Windows Media',
+		types:		  'asx,asf,avi,wma,wmv',
+		mimetype:	  isFirefoxWMPPluginInstalled() ? 'application/x-ms-wmp' : 'application/x-mplayer2',
+		pluginspage:  'http://www.microsoft.com/Windows/MediaPlayer/',
+		autoplayAttr: 'autostart',
+		oUrl:		  'url',
+		ieAttrs: {
+			classid:  'clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6',
+			type:	  'application/x-oleobject'
+		}
+	},
+	// special cases
+	img: {
+		name:  'img',
+		title: 'Image',
+		types: 'gif,png,jpg'
+	},
+	iframe: {
+		name:  'iframe',
+		types: 'html,pdf'
+	},
+	silverlight: {
+		name:  'silverlight',
+		types: 'xaml'
+	}
+};
+
+//
+//	everything below here is private
+//
+
+
+// detection script for FF WMP plugin (http://www.therossman.org/experiments/wmp_play.html)
+// (hat tip to Mark Ross for this script)
+function isFirefoxWMPPluginInstalled() {
+	var plugs = navigator.plugins || [];
+	for (var i = 0; i < plugs.length; i++) {
+		var plugin = plugs[i];
+		if (plugin['filename'] == 'np-mswmp.dll')
+			return true;
+	}
+	return false;
+}
+
+var counter = 1;
+
+for (var player in $.fn.media.defaults.players) {
+	var types = $.fn.media.defaults.players[player].types;
+	$.each(types.split(','), function(i,o) {
+		if (isDigit(o[0])) o = 'fn' + o;
+		$.fn.media[o] = $.fn.media[player] = getGenerator(player);
+		$.fn.media[o+'_player'] = $.fn.media.defaults.players[player];
+	});
+}
+
+function getTypesRegExp() {
+	var types = '';
+	for (var player in $.fn.media.defaults.players) {
+		if (types.length) types += ',';
+		types += $.fn.media.defaults.players[player].types;
+	}
+	return new RegExp('\\.(' + types.replace(/,/ig,'|') + ')\\b');
+}
+
+function getGenerator(player) {
+	return function(el, options) {
+		return generate(el, options, player);
+	};
+}
+
+function isDigit(c) {
+	return '0123456789'.indexOf(c) > -1;
+}
+
+// flatten all possible options: global defaults, meta, option obj
+function getSettings(el, options) {
+	options = options || {};
+	var a, n;
+	var $el = $(el);
+	var cls = el.className || '';
+	// support metadata plugin (v1.0 and v2.0)
+	var meta = $.metadata ? $el.metadata() : $.meta ? $el.data() : {};
+	meta = meta || {};
+	var w = meta.width  || parseInt(((cls.match(/\bw:(\d+)/)||[])[1]||0),10) || parseInt(((cls.match(/\bwidth:(\d+)/)||[])[1]||0),10);
+	var h = meta.height || parseInt(((cls.match(/\bh:(\d+)/)||[])[1]||0),10) || parseInt(((cls.match(/\bheight:(\d+)/)||[])[1]||0),10);
+
+	if (w) meta.width = w;
+	if (h) meta.height = h;
+	if (cls) meta.cls = cls;
+	
+	// crank html5 style data attributes
+	var dataName = 'data-';
+    for (var i=0; i < el.attributes.length; i++) {
+        a = el.attributes[i], n = $.trim(a.name);
+        var index = n.indexOf(dataName);
+        if (index === 0) {
+			n = n.substring(dataName.length);
+			meta[n] = a.value;
+        }
+    }
+
+	a = $.fn.media.defaults;
+	var b = options;
+	var c = meta;
+
+	var p = { params: { bgColor: options.bgColor || $.fn.media.defaults.bgColor } };
+	var opts = $.extend({}, a, b, c);
+	$.each(['attrs','params','flashvars','silverlight'], function(i,o) {
+		opts[o] = $.extend({}, p[o] || {}, a[o] || {}, b[o] || {}, c[o] || {});
+	});
+
+	if (typeof opts.caption == 'undefined') opts.caption = $el.text();
+
+	// make sure we have a source!
+	opts.src = opts.src || $el.attr('href') || $el.attr('src') || 'unknown';
+	return opts;
+}
+
+//
+//	Flash Player
+//
+
+// generate flash using SWFObject library if possible
+$.fn.media.swf = function(el, opts) {
+	var f, p;
+	if (!window.SWFObject && !window.swfobject) {
+		// roll our own
+		if (opts.flashvars) {
+			var a = [];
+			for (f in opts.flashvars)
+				a.push(f + '=' + opts.flashvars[f]);
+			if (!opts.params) opts.params = {};
+			opts.params.flashvars = a.join('&');
+		}
+		return generate(el, opts, 'flash');
+	}
+
+	var id = el.id ? (' id="'+el.id+'"') : '';
+	var cls = opts.cls ? (' class="' + opts.cls + '"') : '';
+	var $div = $('<div' + id + cls + '>');
+
+	// swfobject v2+
+	if (window.swfobject) {
+		$(el).after($div).appendTo($div);
+		if (!el.id) el.id = 'movie_player_' + counter++;
+
+		// replace el with swfobject content
+		window.swfobject.embedSWF(opts.src, el.id, opts.width, opts.height, opts.flashVersion,
+			opts.expressInstaller, opts.flashvars, opts.params, opts.attrs);
+	}
+	// swfobject < v2
+	else {
+		$(el).after($div).remove();
+		var so = new SWFObject(opts.src, 'movie_player_' + counter++, opts.width, opts.height, opts.flashVersion, opts.bgColor);
+		if (opts.expressInstaller) so.useExpressInstall(opts.expressInstaller);
+
+		for (p in opts.params)
+			if (p != 'bgColor') so.addParam(p, opts.params[p]);
+		for (f in opts.flashvars)
+			so.addVariable(f, opts.flashvars[f]);
+		so.write($div[0]);
+	}
+
+	if (opts.caption) $('<div>').appendTo($div).html(opts.caption);
+	return $div;
+};
+
+// map flv and mp3 files to the swf player by default
+$.fn.media.flv = $.fn.media.mp3 = function(el, opts) {
+	var src = opts.src;
+	var player = /\.mp3\b/i.test(src) ? opts.mp3Player : opts.flvPlayer;
+	var key = opts.flvKeyName;
+	src = encodeURIComponent(src);
+	opts.src = player;
+	opts.src = opts.src + '?'+key+'=' + (src);
+	var srcObj = {};
+	srcObj[key] = src;
+	opts.flashvars = $.extend({}, srcObj, opts.flashvars );
+	return $.fn.media.swf(el, opts);
+};
+
+//
+//	Silverlight
+//
+$.fn.media.xaml = function(el, opts) {
+	if (!window.Sys || !window.Sys.Silverlight) {
+		if ($.fn.media.xaml.warning) return;
+		$.fn.media.xaml.warning = 1;
+		alert('You must include the Silverlight.js script.');
+		return;
+	}
+
+	var props = {
+		width: opts.width,
+		height: opts.height,
+		background: opts.bgColor,
+		inplaceInstallPrompt: opts.silverlight.inplaceInstallPrompt,
+		isWindowless: opts.silverlight.isWindowless,
+		framerate: opts.silverlight.framerate,
+		version: opts.silverlight.version
+	};
+	var events = {
+		onError: opts.silverlight.onError,
+		onLoad: opts.silverlight.onLoad
+	};
+
+	var id1 = el.id ? (' id="'+el.id+'"') : '';
+	var id2 = opts.id || 'AG' + counter++;
+	// convert element to div
+	var cls = opts.cls ? (' class="' + opts.cls + '"') : '';
+	var $div = $('<div' + id1 + cls + '>');
+	$(el).after($div).remove();
+
+	Sys.Silverlight.createObjectEx({
+		source: opts.src,
+		initParams: opts.silverlight.initParams,
+		userContext: opts.silverlight.userContext,
+		id: id2,
+		parentElement: $div[0],
+		properties: props,
+		events: events
+	});
+
+	if (opts.caption) $('<div>').appendTo($div).html(opts.caption);
+	return $div;
+};
+
+//
+// generate object/embed markup
+//
+function generate(el, opts, player) {
+	var $el = $(el);
+	var o = $.fn.media.defaults.players[player];
+	var a, key, v;
+
+	if (player == 'iframe') {
+		o = $('<iframe' + ' width="' + opts.width + '" height="' + opts.height + '" >');
+		o.attr('src', opts.src);
+		o.css('backgroundColor', o.bgColor);
+	}
+	else if (player == 'img') {
+		o = $('<img>');
+		o.attr('src', opts.src);
+		if (opts.width)
+			o.attr('width', opts.width);
+		if (opts.height)
+			o.attr('height', opts.height);
+		o.css('backgroundColor', o.bgColor);
+	}
+	else if (lameIE) {
+		a = ['<object width="' + opts.width + '" height="' + opts.height + '" '];
+		for (key in opts.attrs)
+			a.push(key + '="'+opts.attrs[key]+'" ');
+		for (key in o.ieAttrs || {}) {
+			v = o.ieAttrs[key];
+			if (key == 'codebase' && window.location.protocol == 'https:')
+				v = v.replace('http','https');
+			a.push(key + '="'+v+'" ');
+		}
+		a.push('></ob'+'ject'+'>');
+		var p = ['<param name="' + (o.oUrl || 'src') +'" value="' + opts.src + '">'];
+		for (key in opts.params)
+			p.push('<param name="'+ key +'" value="' + opts.params[key] + '">');
+		o = document.createElement(a.join(''));
+		for (var i=0; i < p.length; i++)
+			o.appendChild(document.createElement(p[i]));
+	}
+	else if (opts.standards) {
+		// Rewritten to be standards compliant by Richard Connamacher
+		a = ['<object type="' + o.mimetype +'" width="' + opts.width + '" height="' + opts.height +'"'];
+		if (opts.src) a.push(' data="' + opts.src + '" ');
+		if (msie) {
+			for (key in o.ieAttrs || {}) {
+				v = o.ieAttrs[key];
+				if (key == 'codebase' && window.location.protocol == 'https:')
+					v = v.replace('http','https');
+				a.push(key + '="'+v+'" ');
+			}
+		}
+		a.push('>');
+		a.push('<param name="' + (o.oUrl || 'src') +'" value="' + opts.src + '">');
+		for (key in opts.params) {
+			if (key == 'wmode' && player != 'flash') // FF3/Quicktime borks on wmode
+				continue;
+			a.push('<param name="'+ key +'" value="' + opts.params[key] + '">');
+		}
+		// Alternate HTML
+		a.push('<div><p><strong>'+o.title+' Required</strong></p><p>'+o.title+' is required to view this media. <a href="'+o.pluginspage+'">Download Here</a>.</p></div>');
+		a.push('</ob'+'ject'+'>');
+	}
+	 else {
+	        a = ['<embed width="' + opts.width + '" height="' + opts.height + '" style="display:block"'];
+	        if (opts.src) a.push(' src="' + opts.src + '" ');
+	        for (key in opts.attrs)
+	            a.push(key + '="'+opts.attrs[key]+'" ');
+	        for (key in o.eAttrs || {})
+	            a.push(key + '="'+o.eAttrs[key]+'" ');
+	        for (key in opts.params) {
+	            if (key == 'wmode' && player != 'flash') // FF3/Quicktime borks on wmode
+					continue;
+	            a.push(key + '="'+opts.params[key]+'" ');
+	        }
+	        a.push('></em'+'bed'+'>');
+	    }	
+	// convert element to div
+	var id = el.id ? (' id="'+el.id+'"') : '';
+	var cls = opts.cls ? (' class="' + opts.cls + '"') : '';
+	var $div = $('<div' + id + cls + '>');
+	$el.after($div).remove();
+	if (lameIE || player == 'iframe' || player == 'img')
+		$div.append(o);
+	else
+		$div.html(a.join(''));
+	
+	if (opts.caption) 
+		$('<div>').appendTo($div).html(opts.caption);
+	return $div;
+}
+
+
+})(jQuery);

+ 93 - 0
src/assets/js/main.js

@@ -0,0 +1,93 @@
+var onitirDoc;
+
+(function($) {
+    'use strict';
+    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 = jQuery('.grid-isotope');
+            if (!grid.length) {
+                return;
+            }
+
+            grid.isotope();
+
+            jQuery('.grid-filter ul').on('click', 'li', function() {
+                var filterValue = jQuery(this).attr('data-filter');
+                grid.isotope({ filter: filterValue });
+            });
+
+            jQuery('.grid-filter ul li').on('click', function(event) {
+                jQuery(this).siblings('.active').removeClass('active');
+                jQuery(this).addClass('active');
+                event.preventDefault();
+            });
+        }
+    };
+
+    // Document Ready
+    $(document).ready(function() {
+        onitirDoc.init();
+
+        //首页下箭头点击事件
+        var $wh = $(window).height();
+        $('.go_down').click(function (e) {
+            $('html,body').animate({
+                scrollTop: $(window).height()
+            }, 700);
+        });
+    });
+
+    
+    $(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'});
+        }
+    })
+
+
+    //百度统计
+    var _hmt = _hmt || [];
+    (function() {
+    var hm = document.createElement("script");
+    hm.src = "https://hm.baidu.com/hm.js?082d841c5adb911dd14595d0885a7c69";
+    var s = document.getElementsByTagName("script")[0]; 
+    s.parentNode.insertBefore(hm, s);
+    })();
+
+
+
+})(jQuery)
+
+
+
+
+
+
+

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 3 - 0
src/assets/js/popper.min.js


+ 9 - 0
src/assets/js/settinginfo.js

@@ -0,0 +1,9 @@
+window.FQDN = 'http://aiot.usky.cn:8089/USKYOW/index.php/index/';
+
+//请求域名写活
+window.FQDN2 = (window.location.host.indexOf('172.16.120.165')>-1||window.location.host.indexOf('127.0.0.1')>-1)?'http://172.16.120.165:13200/prod-api/service-website/':'http://gateway.usky.cn/prod-api/service-website/';  
+
+//本地调试域名
+// window.FQDN2 = 'http://172.16.120.165:13200/prod-api/service-website/';  
+  
+

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
src/assets/js/vendor/jquery-1.12.4.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 2 - 0
src/assets/js/vendor/modernizr-3.6.0.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
src/assets/js/vue.min.js


+ 3 - 3
src/assets/styles/common/style.css

@@ -2639,9 +2639,9 @@
             footer {
                 background-color: #2B2F42;
                 width: 100vw;
-                position: fixed;
-                bottom: 0;
-                left: 0;
+                /* position: fixed; */
+                /* bottom: 0;
+                left: 0; */
             }
             
             @media (max-width: 575px) {

+ 12 - 5
src/components/layout/footer.vue

@@ -1,6 +1,12 @@
-<script setup lang="ts">
+<script lang="ts">
+import { defineComponent } from 'vue'
 import { useStore  } from 'vuex'
-const store = useStore()
+export default defineComponent({
+    setup(){
+        const store = useStore()
+        return { store }
+    },
+})
 </script>
 <template>
     <footer>
@@ -22,9 +28,10 @@ const store = useStore()
                                     <a  v-else :href="item.categoryStyle==1?'/':'/template'+item.categoryStyle+'/'">{{item.categoryName}}</a>
                                 </h5>
                                 <ul>
-                                    <li v-if="item.children" v-for="r in item.children" :key="r.id">
-                                        <a :href="item.sname?'/template'+item.categoryStyle+'/?dup='+item.sname+'&categoryid='+r.id+'&isUrlId=1'  : '/template'+item.categoryStyle+'/?categoryid='+r.id+'&isUrlId=1'"> <span
-                                        > {{r.categoryName}}</span></a>
+                                    <li v-if="item.children" v-for="children in item.children" :key="children.id" style="text-align: left;">
+                                        <a  :href="item.sname ?   `${item.path}?dup=${item.sname}&categoryid=${children.id}&isUrlId=1` : `${item.path}?categoryid=${children.id}&isUrlId=1` "> 
+                                            {{children.categoryName}}
+                                        </a>
                                     </li>
                                 </ul>
                             </div>

+ 21 - 20
src/components/layout/header.vue

@@ -1,46 +1,47 @@
 <script lang="ts">
 import { defineComponent, ref } from 'vue'
 import { useStore  } from 'vuex'
-
-
+import { useRoute } from "vue-router";
 export default defineComponent({
     setup(){
         const store = useStore()
-        const currentone = ref("")
-        return { store,currentone }
+        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
+        }
+        return { store,pagePath,pathTemplateQuery,currentPagePath }
     },
-    asyncData({store, route}:any){
-        console.log(111)
-        return store.dispatch('getMenuList')
-    }
 })
 
 
 </script>
 <template>
-    {{ store.state.menuList }}
         <header class="header-absolute sticky-header">
             <div class="custom-container-one">
                 <div class="mainmenu-area  d-flex align-items-center justify-content-center">
                     <div class="logo">
-                        <a href="/"><img src="@/assets/img/logo.png" alt="uskylogo"></a>
+                        <a href="/"><img src="@/assets/img/logo-white.png" alt="uskylogo"></a>
                     </div>
                     <div class="d-flex align-items-center ">
                         <nav class="main-menu">
                             <div class="menu-items">
                                 <ul v-if="store.state.menuList.length>0">
                                     <li v-for="item in store.state.menuList" :key="item.id" 
-                                    :class="!item.sname ? (currentone=='/template'+item.categoryStyle+'/' ? 'active' : item.categoryStyle == '1' ? 'active' : '') : currentone == '/template'+item.categoryStyle+'/?dup=' + item.sname ? 'active' : ''    " 
+                                    :class="item.sname ?  `${currentPagePath}?dup=${item.sname}` ==   `${item.path}?dup=${item.sname}`  &&  pathTemplateQuery ? 'active' : ' '  : currentPagePath == item.path  &&  !pathTemplateQuery ? 'active' : ' ' "
                                     >
-                                        <a  v-if="item.sname" :href="item.categoryStyle==1?'/?dup='+item.sname:'/template'+item.categoryStyle+'/?dup='+item.sname">{{item.categoryName}}</a>
-                                        <a  v-else :href="item.categoryStyle==1?'/':'/template'+item.categoryStyle+'/'">{{item.categoryName}}</a>
-                                        <ul class="submenu">
-                                            <li v-if="item.children" v-for="children in item.children" :key="children.id"><a
-                                                    :href="item.sname?'/template'+item.categoryStyle+'/?dup='+item.sname+'&categoryid='+children.id+'&isUrlId=1'  : '/template'+item.categoryStyle+'/?categoryid='+children.id+'&isUrlId=1'"> <span
-                                                        style="font-weight:bold;margin-right:10px">·</span>
-                                                    {{children.categoryName}}</a>
-                                            </li>
-                                        </ul>
+                                        <a  :href="item.sname ? `${item.path}?dup=${item.sname}` : item.path
+                                            ">{{item.categoryName}}</a>
+                                            <ul class="submenu">
+                                                <li v-if="item.children" v-for="children in item.children" :key="children.id">
+                                                    <a  :href="item.sname ?   `${item.path}?dup=${item.sname}&categoryid=${children.id}&isUrlId=1` : `${item.path}?categoryid=${children.id}&isUrlId=1` "> 
+                                                        <span style="font-weight:bold;margin-right:10px">·</span>
+                                                        {{children.categoryName}}
+                                                    </a>
+                                                </li>
+                                            </ul>
                                     </li>
                                 </ul>
                             </div>

+ 3 - 4
src/entry-client.ts

@@ -1,8 +1,8 @@
 import { createApp } from './main'
 const { app, router, store } = createApp()
-if(window.__INITIAL_STATE__){
-    store.replaceState(window.__INITIAL_STATE__)
-}
+// if(window.__INITIAL_STATE__){
+//     store.replaceState(window.__INITIAL_STATE__)
+// }
 // router.beforeEach((to,from,next)=>{
 //     const uskyDb = new indexedDb("uskyDb") //创建或连接DB数据库
 //     uskyDb.openStore("menu","id",['list']).then((res:any)=>{
@@ -10,7 +10,6 @@ if(window.__INITIAL_STATE__){
 //     })
 // })
 router.isReady().then(() => {
-    console.log(77)
     //比较to、from不同时执行数据预取
     router.beforeResolve((to,from,next)=>{
         console.log("跳转")

+ 0 - 1
src/entry-server.ts

@@ -28,7 +28,6 @@ export async function render(url: string,manifest:any) {
 
 //文件路径获取
 function renderLinks(modules:any,manifest:any){
-    console.log(90,modules)
     let links = ""
     modules.forEach((id:any) => {
         if(id){

+ 48 - 11
src/router/index.ts

@@ -1,29 +1,66 @@
-// import home from '@/views/home/index.vue'
-// import mine from '@/views/mine/index.vue'
-const home = () => import('@/views/home/homeIndex.vue')
-const mine = () => import('@/views/mine/index.vue')
-// const header = () => import('@/views/mine/index.vue')
+const index = () => import('@/views/index/index.vue')
+const cases = () => import('@/views/cases/index.vue')
+const services = () => import('@/views/services/index.vue')
+const news = () => import('@/views/news/index.vue')
+const about = () => import('@/views/about/index.vue')
 import { createRouter, createMemoryHistory, createWebHistory } from 'vue-router'
 
 const routes = [
     {
-        path: "/home",
-        name: "home",
-        component: home,
+        path: "/index",
+        name: "首页",
+        component: index,
         meta: {
             title: "",
             keepAlive: false
         }
     },
     {
-        path: "/mine",
-        name: "mine",
-        component: mine,
+        path: "/cases",
+        name: "客户案例",
+        component: cases,
         meta: {
             title: "",
             keepAlive: false
         }
     },
+    {
+        path: "/services",
+        name: "产品服务",
+        component: services,
+        meta: {
+            title: "",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/news",
+        name: "新闻动态",
+        component: news,
+        meta: {
+            title: "",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/about",
+        name: "关于永天",
+        component: about,
+        meta: {
+            title: "",
+            keepAlive: false
+        }
+    },
+    {
+        path: "/cases",
+        name: "客户案例",
+        component: cases,
+        meta: {
+            title: "",
+            keepAlive: false
+        }
+    },
+
 ]
 
 // const router = createRouter({

+ 56 - 10
src/store/index.ts

@@ -1,5 +1,5 @@
 import { createStore } from 'vuex'
-import { getMenu } from '@/api/index'
+import { getMenu, getPageContent } from '@/api/index'
 // import { InjectionKey } from 'vue'
 
 // export interface AllStateTypes {
@@ -9,17 +9,25 @@ import { getMenu } from '@/api/index'
 export const store = createStore({
     state:{
         count:1,
-        menuList:[]
+        menuList:[],
+        pageContent:[],
+        currentPagePath:'',
+        sub:""
     },
     mutations:{
-        setCount(state,dd){
-            state.count += dd
-            return state.count
-        },
-        setMenuList(state,data){
+        setMenuList(state:any,data:any){
             state.menuList = data
             return state.menuList
-        }
+        },
+        setPageData(state:any,data:object){
+            state.pageContent = data
+            return state.pageContent
+        },
+        setcurrentPagePathOrSub(state:any,data:object){
+            state.index = data.index
+            state.sub = data.sub
+            return  state.index,state.sub 
+        },
     },
     actions:{
         fatchCount({commit,state},payload){
@@ -30,11 +38,49 @@ export const store = createStore({
         getMenuList({ commit }){
             return new Promise(resolve=>{
                 getMenu().then((res:any)=>{
-                    console.log(res)
+                    let data = []
+                    for(let i=0;i<res.data.length;i++){
+                        data.push(res.data[i])
+                        if(data[i].categoryStyle == 1){
+                            data[i].path = "/index"
+                        }
+                        if(data[i].categoryStyle == 2){
+                            data[i].path = "/cases"
+                        }
+                        if(data[i].categoryStyle == 3){
+                            data[i].path = "/services"
+                        }
+                        if(data[i].categoryStyle == 4){
+                            data[i].path = "/news"
+                        }
+                        if(data[i].categoryStyle == 5){
+                            data[i].path = "/about"
+                        }
+                    }
                     commit('setMenuList',res.data)
                     resolve(true)
                 })
             })
-        }
+        },
+        /**
+         * 获取页面数据
+         * @param data.params 传参
+         * @param data.index 页面 
+         * @param data.sub 页面下标
+         * @returns 
+         */
+        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})
+                }
+                getPageContent(data.params).then((res:any)=>{
+                    console.log(1111,res)
+                    commit('setPageData',res.data.records)
+                    resolve(true)
+                })
+            })
+        },
     }
 })

+ 4 - 2
src/utils/request.ts

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

+ 16 - 0
src/views/about/index.vue

@@ -0,0 +1,16 @@
+<script lang="ts">
+import { defineComponent, ref } from 'vue'
+export default defineComponent({
+    setup(){
+    },
+    asyncData({store, route}:any){
+        return store.dispatch('getMenuList') 
+    }
+})
+</script>
+<template>
+       
+</template>
+<style lang="scss" scoped>
+
+</style>

+ 16 - 0
src/views/cases/index.vue

@@ -0,0 +1,16 @@
+<script lang="ts">
+import { defineComponent, ref } from 'vue'
+export default defineComponent({
+    setup(){
+    },
+    asyncData({store, route}:any){
+        return store.dispatch('getMenuList') 
+    }
+})
+</script>
+<template>
+       
+</template>
+<style lang="scss" scoped>
+
+</style>

+ 0 - 8
src/views/home/homeIndex.vue

@@ -1,8 +0,0 @@
-<script setup lang="ts">
-
-</script>
-<template>
-
-</template>
-<style lang="scss" scoped>
-</style>

+ 142 - 0
src/views/index/index.vue

@@ -0,0 +1,142 @@
+<script lang="ts">
+import { defineComponent, ref } from 'vue'
+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,)
+        }) 
+    }
+})
+</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;">
+
+
+
+
+    <!--====== 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>
+            </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>
+
+        </div>
+    </div>
+    <!--====== WHYUS SECTION END ======-->
+
+</section>
+</div>
+</template>
+<style lang="scss" scoped>
+.video-section{
+    width:100vw;
+    height:100vh;
+    position: absolute;
+    top: 0;
+    left:0;
+    z-index: 1;
+}
+</style>

+ 0 - 5
src/views/mine/index.vue

@@ -1,5 +0,0 @@
-<script setup lang="ts">
-</script>
-<template>
-  <div>我的</div>
-</template>

+ 16 - 0
src/views/news/index.vue

@@ -0,0 +1,16 @@
+<script lang="ts">
+import { defineComponent, ref } from 'vue'
+export default defineComponent({
+    setup(){
+    },
+    asyncData({store, route}:any){
+        return store.dispatch('getMenuList') 
+    }
+})
+</script>
+<template>
+       
+</template>
+<style lang="scss" scoped>
+
+</style>

+ 16 - 0
src/views/services/index.vue

@@ -0,0 +1,16 @@
+<script lang="ts">
+import { defineComponent, ref } from 'vue'
+export default defineComponent({
+    setup(){
+    },
+    asyncData({store, route}:any){
+        return store.dispatch('getMenuList') 
+    }
+})
+</script>
+<template>
+       
+</template>
+<style lang="scss" scoped>
+
+</style>

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