Explorar o código

Merge branch 'master' of http://gits.hdlkeji.com:3000/mabaoyi/factoryDirector

mabaoyi hai 5 meses
pai
achega
6028039418
Modificáronse 50 ficheiros con 872 adicións e 183 borrados
  1. BIN=BIN
      dist.zip
  2. BIN=BIN
      dist/assets/bannebg-QEyV7bUG.png
  3. BIN=BIN
      dist/assets/bg-CwcYviGf.png
  4. BIN=BIN
      dist/assets/bg@2x-B4NyvJ_n.png
  5. BIN=BIN
      dist/assets/bg@2x-CZgS7LA7.png
  6. BIN=BIN
      dist/assets/bookbg-FK62YUjM.png
  7. 0 1
      dist/assets/bookinfo-CKk6wZuK.css
  8. 0 1
      dist/assets/bottom-CMS95VKK.css
  9. 0 0
      dist/assets/code-BL6zcpLW.js
  10. 0 1
      dist/assets/handbook-BxV4xwP8.css
  11. 0 1
      dist/assets/index-BXIwoPAs.css
  12. 0 0
      dist/assets/index-DWPGdCUA.css
  13. 0 1
      dist/assets/index-D_NAWIQ-.css
  14. 0 1
      dist/assets/index-vT7ZDBzP.css
  15. BIN=BIN
      dist/assets/lanse3@2x-D3q2Z7hm.png
  16. BIN=BIN
      dist/assets/mianfeibg-CFAg8adE.png
  17. BIN=BIN
      dist/assets/peixun-Iwbc4AKt.png
  18. 0 0
      dist/assets/price-BKVGgnf9.css
  19. 0 1
      dist/assets/price_bg-BEEhHTL3.js
  20. BIN=BIN
      dist/assets/price_bg-CsOr6EjM.png
  21. BIN=BIN
      dist/assets/price_bg2-D7xuq_md.png
  22. BIN=BIN
      dist/assets/shichang-C-nBLvfb.png
  23. BIN=BIN
      dist/assets/shuzitubiao1-BPJ4Ic-a.png
  24. BIN=BIN
      dist/assets/shuzitubiao2-DoMMSz9N.png
  25. BIN=BIN
      dist/assets/shuzitubiao3-DuAQpQ80.png
  26. BIN=BIN
      dist/assets/shuzitubiao4-D5T-mI3O.png
  27. BIN=BIN
      dist/assets/shuzizhuanxing-Du2Ayl7M.png
  28. BIN=BIN
      dist/assets/weixuanzhongbg-DL-eqMH7.png
  29. BIN=BIN
      dist/assets/xiaoshou-PMRrsOud.png
  30. BIN=BIN
      dist/assets/xuanzhongbg-Dnjdx730.png
  31. BIN=BIN
      dist/assets/zengzhangtubiao1-DAK0Un3I.png
  32. BIN=BIN
      dist/assets/zengzhangtubiao2-DvQ7j1VE.png
  33. BIN=BIN
      dist/assets/zengzhangtubiao3-BMA1mz49.png
  34. BIN=BIN
      dist/assets/zengzhangtubiao4-BHyR9lWJ.png
  35. 0 1
      dist/vite.svg
  36. 25 0
      src/api/config.ts
  37. 34 0
      src/api/document.ts
  38. 1 1
      src/components/Banne/index.vue
  39. 126 12
      src/components/Form/from.vue
  40. 32 14
      src/components/Layout/bottom.vue
  41. 6 0
      src/components/advantage/index.vue
  42. 151 30
      src/components/corporation.vue
  43. 38 35
      src/view/Home/price.vue
  44. 36 19
      src/view/Home/product.vue
  45. 10 1
      src/view/Login/index.vue
  46. 196 21
      src/view/handbook/bookinfo.vue
  47. 80 11
      src/view/handbook/handbook.vue
  48. 48 6
      src/view/video/course.vue
  49. 10 0
      src/view/video/index.vue
  50. 79 25
      src/view/video/info.vue

BIN=BIN
dist.zip


BIN=BIN
dist/assets/bannebg-QEyV7bUG.png


BIN=BIN
dist/assets/bg-CwcYviGf.png


BIN=BIN
dist/assets/bg@2x-B4NyvJ_n.png


BIN=BIN
dist/assets/bg@2x-CZgS7LA7.png


BIN=BIN
dist/assets/bookbg-FK62YUjM.png


+ 0 - 1
dist/assets/bookinfo-CKk6wZuK.css

@@ -1 +0,0 @@
-[data-v-9bf9c21c] .el-col-12{max-width:100%!important}[data-v-9bf9c21c] .el-menu-item.is-active{background:#0d0fff0d!important;color:#0d0fff!important}[data-v-9bf9c21c] .el-menu-item.is-active:before{width:.20833vw;height:100%;background:#0d0fff;content:"";display:block;position:absolute;left:0}[data-v-9bf9c21c] .el-menu-item{position:relative}.left[data-v-9bf9c21c]{width:12.5vw;height:62.5vw;border-right:1px solid rgba(151,151,151,.5)}.left .chan[data-v-9bf9c21c]{font-family:PingFangSC,PingFang SC;font-weight:500;font-size:.83333vw;color:#222;line-height:1.14583vw;text-align:left;font-style:normal;margin-bottom:.83333vw}.flex[data-v-9bf9c21c]{display:flex;align-items:center}.content[data-v-9bf9c21c]{width:62.5vw;margin:0 auto}.menu[data-v-9bf9c21c]{margin-top:1.25vw}.top[data-v-9bf9c21c]{width:100vw;height:3.125vw;background:#fff;box-shadow:0 .10417vw .52083vw -.10417vw #0003;margin-top:3.125vw;margin-bottom:1.25vw}.item[data-v-9bf9c21c]{width:4.16667vw;height:1.66667vw;background:#f5f5f7;border-radius:.15625vw;font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.72917vw;color:#2f2f2f;line-height:1.66667vw;text-align:center;font-style:normal;margin-right:.625vw;cursor:pointer}.active[data-v-9bf9c21c]{background:#0d0fff0d!important;color:#0d0fff!important}

+ 0 - 1
dist/assets/bottom-CMS95VKK.css

@@ -1 +0,0 @@
-.bottom_font[data-v-f4a94964]{font-family:SFPro,SFPro;font-weight:400;font-size:.72917vw;color:#fff9;line-height:.83333vw;text-align:justify;font-style:normal;text-align:center;margin-top:1.04167vw}.line[data-v-f4a94964]{height:1px;opacity:.2;margin-top:1.35417vw;background:#979797}.center[data-v-f4a94964]{margin-top:3.125vw;display:flex;justify-content:space-between;align-items:center}.center .address[data-v-f4a94964]{font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.625vw;color:#ffffff80;line-height:1.14583vw;text-align:justify;font-style:normal;margin-top:.52083vw}.center .emil[data-v-f4a94964]{font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.625vw;color:#fff;line-height:.88542vw;text-align:justify;font-style:normal}.center .logo[data-v-f4a94964]{width:5.41667vw;height:2.29167vw;background:#d8d8d8}.top[data-v-f4a94964]{display:flex;justify-content:space-between}.top .img[data-v-f4a94964]{margin:1.04167vw 0 0}.top .img .image[data-v-f4a94964]{width:3.75vw;height:3.75vw;margin-right:1.04167vw}.bg[data-v-f4a94964]{width:100vw;background:#131415;padding:3.38542vw 18.75vw;box-sizing:border-box}.title[data-v-f4a94964]{font-family:PingFangSC,PingFang SC;font-weight:500;font-size:.83333vw;color:#fff;line-height:1.14583vw;text-align:justify;font-style:normal}.item[data-v-f4a94964]{font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.72917vw;color:#ffffff80;line-height:1.04167vw;text-align:justify;font-style:normal;margin-top:.72917vw;cursor:pointer}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/code-BL6zcpLW.js


+ 0 - 1
dist/assets/handbook-BxV4xwP8.css

@@ -1 +0,0 @@
-.flex[data-v-de45cdfc]{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-top:2.08333vw}.bga[data-v-de45cdfc]{width:100vw;background:#f5f9ff;padding:4.16667vw 18.75vw;box-sizing:border-box}.bga .imgbox[data-v-de45cdfc]{margin-top:2.5vw}.bga .image[data-v-de45cdfc]{width:19.79167vw;height:13.54167vw;border-radius:.41667vw;cursor:pointer}.bga .item[data-v-de45cdfc]{width:11.71875vw;height:6.45833vw;background:#fff;box-shadow:0 .20833vw .41667vw #adb8ca1a;border-radius:.41667vw;margin-bottom:1.04167vw}.bga .title[data-v-de45cdfc]{font-family:PingFangSC,PingFang SC;font-weight:600;font-size:1.875vw;color:#222;line-height:2.60417vw;text-align:justify;font-style:normal;text-align:center}.bga .sm_font[data-v-de45cdfc]{font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.83333vw;color:#525967;line-height:1.5625vw;text-align:center;font-style:normal}.black[data-v-de45cdfc]{width:100%;height:25vw;background:url(./bookbg-FK62YUjM.png);background-size:100%;display:flex;flex-direction:column;align-items:center}.black .title[data-v-de45cdfc]{font-family:PingFangSC,PingFang SC;font-weight:600;font-size:2.8125vw;color:#222;line-height:3.90625vw;text-align:left;font-style:normal;margin-top:9.27083vw;margin-bottom:2.08333vw}[data-v-de45cdfc] .el-input{width:31.25vw!important;height:2.8125vw!important}

+ 0 - 1
dist/assets/index-BXIwoPAs.css

@@ -1 +0,0 @@
-.imag[data-v-c409c360]{width:100%;height:29.6875vw;margin-top:1.5625vw;background:#0d0fff80}.content[data-v-c409c360]{width:62.5vw;margin:0 auto}.content .item[data-v-c409c360]:hover{border:1px solid rgba(13,15,255,.5)}.content .item[data-v-c409c360]{width:14.84375vw;height:5.3125vw;border-radius:.52083vw;border:1px solid rgba(151,151,151,.3);padding:1.04167vw 0 0 1.45833vw;box-sizing:border-box}.content .item_title[data-v-c409c360]{font-family:PingFangSC,PingFang SC;font-weight:500;font-size:.9375vw;color:#181818;line-height:1.30208vw;text-align:left;font-style:normal}.content .item_font[data-v-c409c360]{font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.72917vw;color:#4e5969;line-height:1.5625vw;text-align:left;font-style:normal}.content .box_item[data-v-c409c360]{margin-top:2.08333vw;display:flex;justify-content:space-between;align-items:center}.content .title[data-v-c409c360]{font-family:PingFangSC,PingFang SC;font-weight:600;font-size:1.875vw;color:#222;line-height:2.60417vw;text-align:center;font-style:normal;margin-top:4.16667vw}.content .top_font[data-v-c409c360]{font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.83333vw;color:#525967;line-height:1.35417vw;text-align:center;font-style:normal;margin-top:.72917vw}.top[data-v-c409c360]{margin-top:3.125vw}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/index-DWPGdCUA.css


+ 0 - 1
dist/assets/index-D_NAWIQ-.css

@@ -1 +0,0 @@
-.top-banne[data-v-ea019971]{height:17.8125vw;padding-top:13.4375vw;background-image:url(./bannebg-QEyV7bUG.png);background-size:100% 100%;background-repeat:no-repeat}.top-banne .title[data-v-ea019971]{font-size:2.8125vw;font-weight:600;color:#222;text-align:center}.top-banne .btn-list[data-v-ea019971]{display:flex;justify-content:center;margin-top:3.85417vw}.top-banne .btn-list .free[data-v-ea019971]{width:8.22917vw;height:2.91667vw;border:none;background-color:#0d0fff;color:#fff;font-size:.83333vw;margin-right:1.25vw}.top-banne .btn-list .consult[data-v-ea019971]{width:8.22917vw;height:2.91667vw;background-color:#0000;border:1px solid #0d0fff;color:#0d0fff}.about[data-v-ea019971]{display:flex;width:60%;margin:4.16667vw auto;justify-content:space-between}.about .about-left[data-v-ea019971]{width:48%}.about .about-left .heng[data-v-ea019971]{width:2.29167vw;height:.20833vw;background-color:#0d0fff;margin-bottom:1.04167vw}.about .about-left .about-name[data-v-ea019971]{font-size:1.66667vw;font-weight:600;color:#222;margin-bottom:.72917vw}.about .about-left .about-content[data-v-ea019971]{font-size:.83333vw;color:#444;line-height:1.9}.about .about-video[data-v-ea019971]{width:28.125vw;height:23.4375vw;background-color:#d8d8d8}.publicize[data-v-ea019971]{padding:4.27083vw 0 4.6875vw;background-color:#f5f9ff}.publicize .publicize-title[data-v-ea019971]{font-size:1.875vw;margin-bottom:3.22917vw;font-weight:600;color:#222;text-align:center}.publicize .pane-content[data-v-ea019971]{width:62.5vw;height:35.15625vw;margin:3.28125vw auto 0;display:block}[data-v-ea019971] .el-tabs__item{font-size:.9375vw;width:15.625vw;text-align:center}[data-v-ea019971] .is-active{color:#0d0fff}[data-v-ea019971] .el-tabs__active-bar{background-color:#0d0fff}[data-v-ea019971] .el-tabs__nav{width:60%;justify-content:space-around;float:none;margin:0 auto}[data-v-ea019971] .el-tabs__item:hover{color:#0d0fff;cursor:pointer}

+ 0 - 1
dist/assets/index-vT7ZDBzP.css

@@ -1 +0,0 @@
-.bgbox[data-v-eb902af6]{padding-bottom:2.29167vw}.contenta[data-v-eb902af6]{width:62.5vw;margin:0 auto}.left[data-v-eb902af6]{display:flex;flex-direction:column;justify-content:center;flex:1;height:26.04167vw}.left .title[data-v-eb902af6]{font-family:PingFangSC,PingFang SC;font-weight:600;font-size:1.35417vw;color:#1a1a1a;line-height:1.92708vw;text-align:left;font-style:normal}.left .content[data-v-eb902af6]{font-family:SFPro,SFPro;font-weight:400;font-size:.83333vw;color:#525967;line-height:1.35417vw;text-align:left;font-style:normal;margin-top:1.14583vw}.left .content .active[data-v-eb902af6]{width:.83333vw;height:.83333vw;margin-right:.52083vw}.left .trybtn[data-v-eb902af6]{width:6.35417vw;height:2.29167vw;background:#0d0fff;border-radius:.15625vw;font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.83333vw;color:#fff;line-height:2.29167vw;text-align:center;font-style:normal;margin-top:4.16667vw;cursor:pointer}.right[data-v-eb902af6]{width:40.10417vw;height:26.04167vw}.line[data-v-eb902af6]{background:#e4e7ed;height:.10417vw;width:100%;position:absolute;top:1.97917vw}[data-v-eb902af6] .el-tabs__nav.is-stretch{width:62.5vw}.flex[data-v-eb902af6]{display:flex;justify-content:center;margin-top:3.125vw}.title[data-v-eb902af6]{font-family:PingFangSC,PingFang SC;font-weight:600;font-size:1.875vw;color:#222;line-height:2.60417vw;text-align:center;font-style:normal;margin-top:4.16667vw}.top_font[data-v-eb902af6]{font-family:PingFangSC,PingFang SC;font-weight:400;font-size:.83333vw;color:#525967;line-height:1.5625vw;text-align:center;font-style:normal;margin-top:.625vw}

BIN=BIN
dist/assets/lanse3@2x-D3q2Z7hm.png


BIN=BIN
dist/assets/mianfeibg-CFAg8adE.png


BIN=BIN
dist/assets/peixun-Iwbc4AKt.png


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/price-BKVGgnf9.css


+ 0 - 1
dist/assets/price_bg-BEEhHTL3.js

@@ -1 +0,0 @@
-const r=""+new URL("price_bg-CsOr6EjM.png",import.meta.url).href;export{r as _};

BIN=BIN
dist/assets/price_bg-CsOr6EjM.png


BIN=BIN
dist/assets/price_bg2-D7xuq_md.png


BIN=BIN
dist/assets/shichang-C-nBLvfb.png


BIN=BIN
dist/assets/shuzitubiao1-BPJ4Ic-a.png


BIN=BIN
dist/assets/shuzitubiao2-DoMMSz9N.png


BIN=BIN
dist/assets/shuzitubiao3-DuAQpQ80.png


BIN=BIN
dist/assets/shuzitubiao4-D5T-mI3O.png


BIN=BIN
dist/assets/shuzizhuanxing-Du2Ayl7M.png


BIN=BIN
dist/assets/weixuanzhongbg-DL-eqMH7.png


BIN=BIN
dist/assets/xiaoshou-PMRrsOud.png


BIN=BIN
dist/assets/xuanzhongbg-Dnjdx730.png


BIN=BIN
dist/assets/zengzhangtubiao1-DAK0Un3I.png


BIN=BIN
dist/assets/zengzhangtubiao2-DvQ7j1VE.png


BIN=BIN
dist/assets/zengzhangtubiao3-BMA1mz49.png


BIN=BIN
dist/assets/zengzhangtubiao4-BHyR9lWJ.png


+ 0 - 1
dist/vite.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 25 - 0
src/api/config.ts

@@ -7,3 +7,28 @@ export const config = (params: any) => {
     params,
   });
 };
+//获取轮播图
+export const getBanneList = (params) => {
+  return request({
+    url: "banner",
+    method: "get",
+    params,
+  });
+};
+//申请试用类型
+export const trialType = (params) => {
+  return request({
+    url: "trial/type",
+    method: "get",
+    params,
+  });
+};
+
+//发起试用申请
+export const trial = (data) => {
+  return request({
+    url: "trial",
+    method: "post",
+    data,
+  });
+};

+ 34 - 0
src/api/document.ts

@@ -0,0 +1,34 @@
+import request from "../utils/request";
+//文档类型
+export const documentType = (params: any) => {
+  return request({
+    url: "document-type",
+    method: "get",
+    params,
+  });
+};
+//文档分类列表
+export const category = (params: any) => {
+  return request({
+    url: "document-category",
+    method: "get",
+    params,
+  });
+};
+//文档列表
+export const document = (params: any) => {
+  return request({
+    url: "document",
+    method: "get",
+    params,
+  });
+};
+// //文档分类列表
+// export const detail = (params: any) => {
+//   return request({
+//     url: "document-category",
+//     method: "get",
+//     params,
+//   });
+// };
+

+ 1 - 1
src/components/Banne/index.vue

@@ -5,7 +5,7 @@
         v-for="(item, index) in props.banneImageList"
         :key="index"
       >
-        <img class="version-img" :src="item.imgUrl" alt="" />
+        <img class="version-img" :src="item.imgUrl || item.image" alt="" />
         <div v-if="item.isBtn">
           <button
             class="detail"

+ 126 - 12
src/components/Form/from.vue

@@ -1,10 +1,62 @@
 <template>
- 
+  <div class="two">
+    <el-dialog @close="closea" v-model="show" :show-close="false">
+      <div class="width">
+        <div class="toptitle">申请免费试用</div>
+        <div class="topfont">请填写表单信息,我们团队将尽快与您联系</div>
+      </div>
+      <div class="formbox">
+        <el-form :model="formLabelAlign" style="max-width: 660px">
+          <el-form-item label="您的姓名">
+            <el-input
+              v-model="formLabelAlign.name"
+              placeholder="请填写您的真实姓名(必填)"
+            />
+          </el-form-item>
+          <el-form-item label="公司名称">
+            <el-input
+              v-model="formLabelAlign.corporation"
+              placeholder="请填写公司真实名称"
+            />
+          </el-form-item>
+          <el-form-item label="邮箱">
+            <el-input
+              v-model="formLabelAlign.email"
+              placeholder="请填写您的邮箱地址"
+            />
+          </el-form-item>
+          <!-- <el-form-item label="手机号">
+              <el-input
+                v-model="formLabelAlign.phone"
+                placeholder="请填写您的手机号码"
+              />
+            </el-form-item> -->
+          <el-form-item label="申请版本">
+            <el-select
+              v-model="formLabelAlign.type"
+              placeholder="请选择您需要试用的版本(必填)"
+            >
+              <el-option
+                v-for="(item, idx) in typeList.list"
+                :key="idx"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div style="display: flex; justify-content: center">
+        <div class="button" @click="apply">立即申请</div>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script setup>
 import { useRouter } from "vue-router";
-import { onMounted, ref, reactive } from "vue";
+import { onMounted, ref, reactive, watch } from "vue";
+import * as configApi from "../../api/config";
 onMounted(() => {});
 //表单数据
 const formLabelAlign = reactive({
@@ -12,23 +64,85 @@ const formLabelAlign = reactive({
   region: "",
   type: "",
   corporation: "",
-  emil: "",
-  phone: "",
+  email: "",
 });
-// const dialogTableVisible2 = ref(true);
 const props = defineProps({
-    dialogTableVisible2:{
-        default:false
-    }
-})
+  dialogTableVisible2: {
+    default: false,
+  },
+});
+const show = ref(false);
+watch(
+  () => props.dialogTableVisible2,
+  (newVal) => {
+    show.value = props.dialogTableVisible2;
+  }
+);
+
+const emit = defineEmits(["todetails"], ["like"]);
+const todetails = () => {
+  emit("clos");
+};
+// show.value = props.dialogTableVisible2;
+//发起试用申请
+const apply = async () => {
+  try {
+    const { data } = await configApi.trial({
+      realname: formLabelAlign.name,
+      company_name: formLabelAlign.corporation,
+      email: formLabelAlign.email,
+      type: formLabelAlign.type,
+    });
+    show.value = false;
+    todetails();
+  } catch (error) {}
+};
+//关闭模态框
+const closea = ()=>{
+  todetails();
+}
+//申请试用类型
+const typeList = reactive({
+  list: [],
+});
+const type = async () => {
+  try {
+    const { data } = await configApi.trialType({});
+    typeList.list = data;
+  } catch (error) {}
+};
+onMounted(type);
 </script>
 
 <style lang="scss" scoped>
-
-
+:deep(.el-dialog) {
+  --el-dialog-width: 520px !important;
+}
+::v-deep(.el-form-item__label) {
+  width: 83px !important;
+}
+.formbox {
+  padding: 0 50px;
+}
+.button {
+  width: 420px;
+  height: 44px;
+  background: #0d0fff;
+  border-radius: 4px;
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 400;
+  font-size: 16px;
+  color: #ffffff;
+  line-height: 44px;
+  text-align: center;
+  font-style: normal;
+  margin-top: 48px;
+  cursor: pointer;
+  margin-bottom: 20px;
+}
 .width {
   width: 100%;
-  padding: 40px 60px 0;
+  padding: 20px 60px 0px;
   box-sizing: border-box;
   display: flex;
   flex-direction: column;

+ 32 - 14
src/components/Layout/bottom.vue

@@ -3,42 +3,50 @@
     <div class="top">
       <div v-for="(item, idx) in foot.list" :key="idx">
         <div class="title">{{ item.title }}</div>
-        <div class="item" v-for="(child,index) in item.footer" :key="index">{{ child.title }}</div>
+        <div class="item" v-for="(child, index) in item.footer" :key="index">
+          {{ child.title }}
+        </div>
       </div>
       <div>
         <div class="title">联系我们</div>
-        <div class="item">售前电话:400-008-0559</div>
+        <div class="item">售前电话:{{ foot.info.pre_sale_mobile }}</div>
+        <div class="item">市场合作:{{ foot.info.market_cooperation }}</div>
+        <div class="item">渠道合作:{{ foot.info.channel_cooperation }}</div>
+        <div class="item">投诉电话:{{ foot.info.complaint_mobile }}</div>
       </div>
       <div>
         <div class="title">关注我们</div>
-        <div class="item">周一至周五(09:30-18:00)</div>
+        <div class="item">{{ foot.info.service_time }}</div>
         <div class="img">
-          <img class="image" src="../../assets/login/code.png" alt="" />
-          <img class="image" src="../../assets/login/code.png" alt="" />
+          <img class="image" :src="foot.info.service_qr_code" alt="" />
+          <img class="image" :src="foot.info.official_qr_code" alt="" />
         </div>
       </div>
     </div>
     <div class="center">
       <div>
-        <div class="emil">官方邮箱:yunchangzhang@1</div>
-        <div class="address">广州市天河区林和东路285号天安人寿中心</div>
+        <div class="emil">官方邮箱:{{ foot.info.email }}</div>
+        <div class="address">{{ foot.info.address }}</div>
       </div>
       <div>
-        <div class="logo"></div>
+        <!-- <div class="logo"></div> -->
+        <img class="logo" :src="foot.info.logo" alt="" />
       </div>
     </div>
     <div class="line"></div>
-    <div class="bottom_font">鲁ICP备13020601号-8 版权所有</div>
+    <div class="bottom_font">{{ foot.info.copyright }}</div>
   </div>
 </template>
 
 <script setup lang="ts">
 import { useRouter } from "vue-router";
 import { onMounted, reactive, ref } from "vue";
-import * as tongApi from '../../api/tongyong'
+import * as tongApi from "../../api/tongyong";
+import * as configApi from "../../api/config";
 const foot = reactive({
-  list:[]
-})
+  list: [],
+  info: {},
+});
 //页脚
 const list = async () => {
   try {
@@ -46,7 +54,17 @@ const list = async () => {
     foot.list = data;
   } catch (error) {}
 };
-onMounted(list)
+onMounted(list);
+//基本信息
+const info = async () => {
+  try {
+    const { data } = await configApi.config({
+      module: "basic",
+    });
+    foot.info = data;
+  } catch (error) {}
+};
+onMounted(info);
 onMounted(() => {});
 </script>
 
@@ -95,7 +113,7 @@ onMounted(() => {});
   .logo {
     width: 104px;
     height: 44px;
-    background: #d8d8d8;
+    // background: #d8d8d8;
   }
 }
 .top {

+ 6 - 0
src/components/advantage/index.vue

@@ -83,6 +83,12 @@ const props = defineProps({
 </script>
 
 <style lang="scss" scoped>
+:deep(.el-tabs__item.is-active){
+  color: rgba(13, 15, 255, 1) !important;
+}
+:deep(.el-tabs__active-bar){
+  background-color: rgba(13, 15, 255, 1) !important;
+}
 .bgbox {
   padding-bottom: 44px;
 }

+ 151 - 30
src/components/corporation.vue

@@ -13,16 +13,52 @@
       />
     </div>
     <div v-else class="box">
-      <div class="imgbox">
-        <div class="bo" @mouseover="changeBackground"></div>
-      </div>
+      <el-carousel indicator-position="none" :autoplay="false">
+        <el-carousel-item v-for="(child, index) in newlist.list" :key="index">
+          <div class="" style="display: flex; align-items: center">
+            <div
+              class="imgbox"
+              :style="{
+                background: 'url(' + item.background_image + ')',
+                backgroundSize: 'cover',
+              }"
+              v-for="(item, idx) in child"
+              :key="idx"
+            >
+              <div
+                class="bo"
+                @mouseover="changeBackground(idx)"
+                @mouseleave="leave"
+              >
+                <img class="logo" :src="item.logo" alt="" />
+                <div class="name">{{ item.company_name }}</div>
+                <div class="content">{{ item.content }}</div>
+                <div
+                  v-if="over == 1 && ind == idx"
+                  style="
+                    display: flex;
+                    align-items: center;
+                    justify-content: center;
+                  "
+                >
+                  <div class="btntitle" @click="apply">
+                    {{ item.button_title }}
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </el-carousel-item>
+      </el-carousel>
     </div>
   </div>
+  <forma :dialogTableVisible2="dialogTableVisible2" @clos="close"></forma>
 </template>
 
 <script setup>
 import { useRouter } from "vue-router";
-import { onMounted, ref } from "vue";
+import { onMounted, reactive, ref, watch } from "vue";
+import forma from "../components/Form/from.vue";
 onMounted(() => {});
 const props = defineProps({
   title: {
@@ -38,30 +74,115 @@ const props = defineProps({
     default: "",
   },
 });
-const changeBackground = ()=>{
-
+//是否登录
+const is_login = ref(false);
+if (localStorage.getItem("access_token")) {
+  is_login.value = true;
+} else {
+  is_login.value = false;
 }
+const dialogTableVisible2 = ref(false);
+//申请
+const apply = () => {
+  if (is_login.value) {
+    dialogTableVisible2.value = true;
+  } else {
+    ElMessage({
+      message: "请先登录",
+      type: "error",
+    });
+  }
+};
+
+const ind = ref("");
+const over = ref(0);
+const changeBackground = (index) => {
+  over.value = 1;
+  ind.value = index;
+};
+const leave = () => {
+  over.value = 0;
+};
+
+//关闭
+const close = () => {
+  dialogTableVisible2.value = false;
+};
+
+const newlist = reactive({
+  list: [],
+});
+const chong = () => {
+  var result = [];
+  for (var i = 0; i < props.list.length; i += 2) {
+    result.push(props.list.slice(i, i + 2));
+    newlist.list = result;
+    // result = [];
+  }
+  console.log(newlist.list, 1);
+};
+watch(
+  () => props.list,
+  (newVal) => {
+    if (props.list.length > 0) {
+      chong();
+    }
+  }
+);
 </script>
 
 <style lang="scss" scoped>
-// @keyframes ball {
-//   0% {
-//     bottom: 0;
-//     left: 0;
-//     width: 580px;
-//     height: 320px;
-//     position: absolute;
-//   }
-//   100% {
-//     top: 0;
-//     left: 0;
-//     width: 580px;
-//     height: 600px;
-//     position: absolute;
-//   }
-// }
+.btntitle {
+  width: 428px;
+  height: 56px;
+  background: #0d0fff;
+  border-radius: 5px;
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 500;
+  font-size: 16px;
+  color: #ffffff;
+  line-height: 56px;
+  text-align: center;
+  font-style: normal;
+  // position: absolute;
+  // bottom: 40px;
+  cursor: pointer;
+  margin-top: 60px;
+}
+:deep(.el-carousel--horizontal) {
+  height: 600px !important;
+  width: 1200px !important;
+}
+:deep(.el-carousel__item) {
+  overflow: visible !important;
+}
+
+.content {
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 400;
+  font-size: 16px;
+  color: #222222;
+  line-height: 28px;
+  text-align: justify;
+  font-style: normal;
+  margin-top: 24px;
+}
+.name {
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 600;
+  font-size: 26px;
+  color: #222222;
+  line-height: 37px;
+  text-align: justify;
+  font-style: normal;
+  margin-top: 16px;
+}
+.logo {
+  width: 154px;
+  height: 60px;
+}
 .bo {
-  width: 580px;
+  // width: 580px;
   height: 320px;
   background: linear-gradient(
     180deg,
@@ -73,12 +194,12 @@ const changeBackground = ()=>{
   backdrop-filter: blur(10px);
   position: absolute;
   bottom: 0px;
-  left: 0;
-  // animation-name: ball;
-  // animation-duration: 4s;
+  left: 32px;
+  padding: 30px 40px;
+  box-sizing: border-box;
 }
 .bo:hover {
-  width: 580px;
+  // width: 580px;
   height: 600px;
   background: linear-gradient(
     180deg,
@@ -88,9 +209,9 @@ const changeBackground = ()=>{
   );
   border-radius: 14px;
   backdrop-filter: blur(10px);
-  transition: all 1s;
-  // top: 0px;
-  // left: 0;
+  transition: all 0.6s;
+  padding: 30px 40px;
+  box-sizing: border-box;
   transform: translateY(-0%); /* 使用transform进行微调 */
 }
 .imgbox {

+ 38 - 35
src/view/Home/price.vue

@@ -29,63 +29,63 @@
         </div>
       </div>
       <div class="bankuai">
-        <div v-if="tabs==0" class="flex">
+        <div v-if="tabs == 0" class="flex">
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.month_group"
+            :src="pricea.price.month_group"
             alt=""
           />
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.month_professional"
+            :src="pricea.price.month_professional"
             alt=""
           />
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.month_enterprise"
+            :src="pricea.price.month_enterprise"
             alt=""
           />
         </div>
-        <div v-if="tabs==1" class="flex">
+        <div v-if="tabs == 1" class="flex">
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.year_group"
+            :src="pricea.price.year_group"
             alt=""
           />
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.year_professional"
+            :src="pricea.price.year_professional"
             alt=""
           />
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.year_enterprise"
+            :src="pricea.price.year_enterprise"
             alt=""
           />
         </div>
-        <div v-if="tabs==2" class="flex">
+        <div v-if="tabs == 2" class="flex">
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.base_enhancement"
+            :src="pricea.price.base_enhancement"
             alt=""
           />
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.professional_enhancement"
+            :src="pricea.price.professional_enhancement"
             alt=""
           />
           <img
             @click="dialogTableVisible2 = true"
             class="image"
-            :src="price.enterprise_enhancement"
+            :src="pricea.price.enterprise_enhancement"
             alt=""
           />
         </div>
@@ -101,9 +101,12 @@
       <div class="Compare">各个版本功能对比</div>
     </div>
     <div class="content">
-      <img class="bigimage" :src="price.version_compare" alt="">
+      <img class="bigimage" :src="pricea.price.version_compare" alt="" />
     </div>
-    <application :titleinfo="info.scene_content" :image="info.scene_image"></application>
+    <application
+      :titleinfo="infoa.info.scene_content"
+      :image="infoa.info.scene_image"
+    ></application>
     <!-- <corporation></corporation> -->
     <bottom></bottom>
 
@@ -119,7 +122,7 @@
         </div>
       </el-dialog>
     </div>
-    <div class="two">
+    <!-- <div class="two">
       <el-dialog v-model="dialogTableVisible2" :show-close="false">
         <div class="width">
           <div class="toptitle">申请免费试用</div>
@@ -145,12 +148,6 @@
                 placeholder="请填写您的邮箱地址"
               />
             </el-form-item>
-            <el-form-item label="手机号">
-              <el-input
-                v-model="formLabelAlign.phone"
-                placeholder="请填写您的手机号码"
-              />
-            </el-form-item>
             <el-form-item label="申请版本">
               <el-input
                 v-model="formLabelAlign.type"
@@ -159,12 +156,12 @@
             </el-form-item>
           </el-form>
         </div>
-        <div style="display: flex;justify-content: center;">
-          <div class="button">立即申请</div>
+        <div style="display: flex; justify-content: center">
+          <div class="button" @click='apply'>立即申请</div>
         </div>
-        
       </el-dialog>
-    </div>
+    </div> -->
+    <froma :dialogTableVisible2="dialogTableVisible2" @clos="close"></froma>
   </div>
 </template>
 
@@ -175,13 +172,15 @@ import bottom from "../../components/Layout/bottom.vue";
 import application from "../../components/Application .vue";
 import corporation from "../../components/corporation.vue";
 import * as configApi from "../../api/config";
+import froma from '../../components/Form/from.vue'
+
 //价格配置
 const config = async () => {
   try {
     const { data } = await configApi.config({
       module: "cms_price",
     });
-    price = data
+    pricea.price = data;
   } catch (error) {}
 };
 onMounted(config);
@@ -191,7 +190,7 @@ const configa = async () => {
     const { data } = await configApi.config({
       module: "cms_product",
     });
-    info = data;
+    infoa.info = data;
   } catch (error) {}
 };
 onMounted(configa);
@@ -215,26 +214,29 @@ const formLabelAlign = reactive({
   emil: "",
   phone: "",
 });
-const price = reactive({
-
+const pricea = reactive({
+  price: {},
 });
-const info = reactive({
-
+const infoa = reactive({
+  info: {},
 });
+const close = ()=>{
+  dialogTableVisible2.value = false
+}
 </script>
 
 <style lang="scss" scoped>
-.bigimage{
+.bigimage {
   width: 1200px;
   margin-bottom: 70px;
 }
-::v-deep .one .el-dialog {
+::v-deep(.one .el-dialog){
   --el-dialog-width: 420px !important;
 }
-::v-deep .two .el-dialog {
+:deep(.two .el-dialog) {
   --el-dialog-width: 520px !important;
 }
-::v-deep .el-form-item__label {
+::v-deep(.el-form-item__label){
   width: 83px !important;
 }
 .button {
@@ -250,6 +252,7 @@ const info = reactive({
   text-align: center;
   font-style: normal;
   margin-top: 48px;
+  cursor: pointer;
 }
 
 .formbox {

+ 36 - 19
src/view/Home/product.vue

@@ -1,6 +1,6 @@
 <template>
   <!-- 产品团队 -->
-  <banner class="top" :banneImageList="imgList.banneImageList" />
+  <banner :banneImageList="imgList.banneImageList" />
   <div v-if="index != 3" class="content">
     <div class="fang">
       <div class="title">方案概述</div>
@@ -60,8 +60,17 @@
     :ing="0"
   ></corporation>
   <!-- 管理平台 -->
-  <application :titleinfo="tabbar.info.scene_content" :image="tabbar.info.scene_image" style="background: #ffffff" v-if="index == 3"></application>
-  <application :titleinfo="tabbar.info.scene_content" :image="tabbar.info.scene_image" v-else></application>
+  <application
+    :titleinfo="tabbar.info.scene_content"
+    :image="tabbar.info.scene_image"
+    style="background: #ffffff"
+    v-if="index == 3"
+  ></application>
+  <application
+    :titleinfo="tabbar.info.scene_content"
+    :image="tabbar.info.scene_image"
+    v-else
+  ></application>
   <!-- 客户案例 -->
   <corporation
     v-if="index != 3"
@@ -97,6 +106,30 @@ const overview = async () => {
   } catch (error) {}
 };
 onMounted(overview);
+//获取轮播图
+const imgList = reactive({
+  banneImageList: [
+    {
+      imgUrl:
+        "https://img1.baidu.com/it/u=1964831979,2551193402&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=357",
+      isBtn: true,
+    },
+    {  
+      imgUrl:
+        "https://img1.baidu.com/it/u=3821883389,2247186365&fm=253&fmt=auto&app=138&f=JPEG?w=798&h=500",
+      isBtn: false,
+    },
+  ],
+});
+const getBanneList = async () => {
+  try {
+    const { data } = await configApi.getBanneList({
+      code:'product'
+  });
+  imgList.banneImageList = data;
+  } catch (error) {}
+};
+onMounted(getBanneList);
 //方案优势
 const advantag = async () => {
   try {
@@ -220,22 +253,6 @@ const tabbar = reactive({
   info: {},
   newlist:[]
 });
-
-const imgList = reactive({
-  banneImageList: [
-    {
-      imgUrl:
-        "https://img1.baidu.com/it/u=1964831979,2551193402&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=357",
-      isBtn: true,
-    },
-    {
-      imgUrl:
-        "https://img1.baidu.com/it/u=3821883389,2247186365&fm=253&fmt=auto&app=138&f=JPEG?w=798&h=500",
-      isBtn: false,
-    },
-  ],
-});
-onMounted(() => {});
 </script>
 
 <style lang="scss" scoped>

+ 10 - 1
src/view/Login/index.vue

@@ -110,12 +110,13 @@
 </template>
 <script lang="ts" setup>
 import { ref, reactive, onMounted } from "vue";
-import { useRouter } from "vue-router";
+import { useRouter, useRoute } from "vue-router";
 import { ElMessage } from "element-plus";
 import { useStore } from "../../store/index";
 import * as loginApi from "../../api/login";
 const counter = useStore();
 const router = useRouter();
+const route = useRoute();
 const isLogin = ref(true);
 
 const isQRCode: any = ref(false);
@@ -138,6 +139,14 @@ const __topic__ = async () => {
       mobile: phone.value,
       password: 123456,
     });
+    if (route.query.index) {
+      router.go(-1);
+    } else {
+      router.push({
+        name: "home",
+      });
+    }
+    localStorage.setItem("access_token", JSON.stringify(data.token));
     router.push({
       name: "home",
     });

+ 196 - 21
src/view/handbook/bookinfo.vue

@@ -1,15 +1,20 @@
 <template>
   <div class="top flex">
     <div class="content flex">
-      <div class="item">文档首页</div>
-      <div class="item active">产品文档</div>
-      <div class="item">开发文档</div>
-      <div class="item">接口文档</div>
+      <div
+        @click="topchange(item.name, idx, item.id)"
+        class="item"
+        :class="changeindex == idx ? 'active' : ''"
+        v-for="(item, idx) in book.list"
+        :key="idx"
+      >
+        {{ item.name }}
+      </div>
     </div>
   </div>
-  <div class="content">
+  <div class="content" style="display: flex">
     <div class="left">
-      <div class="chan">产品文档</div>
+      <div class="chan">{{ changefont }}</div>
       <el-input
         v-model="input2"
         style="width: 80%"
@@ -19,43 +24,204 @@
       <div class="menu">
         <el-col :span="12">
           <el-menu
-            default-active="2"
+            :default-openeds="book.category"
+            :unique-opened="true"
+            v-for="(item, idx) in book.category"
+            :key="idx"
+            default-active="1"
             class="el-menu-vertical-demo"
-            @open="handleOpen"
+            @open="document(item.id, item.name)"
             @close="handleClose"
           >
             <el-sub-menu index="1">
               <template #title>
-                <span>Navigator One</span>
+                <div>
+                  <span>{{ item.name }}</span>
+                </div>
+              </template>
+              <template v-if="item.children">
+                <el-sub-menu
+                  @click="document(item2.id, item2.name)"
+                  v-for="(item2, ind) in item.children"
+                  :key="ind"
+                  index="1-4"
+                >
+                  <template #title>{{ item2.name }}</template>
+
+                  <template v-if="item2.children">
+                    <el-sub-menu
+                      @click="document(item3.id, item3.name)"
+                      v-for="(item3, ind) in item2.children"
+                      :key="ind"
+                      index="1-4"
+                    >
+                      <template #title>{{ item3.name }}</template>
+                      <el-menu-item
+                        v-for="(child, inx) in book.documentlist"
+                        :key="inx"
+                        @click="change(e, child.content, child.title)"
+                        :index="'1' + index"
+                        >{{ child.title }}</el-menu-item
+                      >
+                    </el-sub-menu>
+                  </template>
+                  <template v-else>
+                    <el-menu-item
+                      v-for="(child, index) in book.documentlist"
+                      :key="index"
+                      @click="change(e, child.content, child.title)"
+                      :index="'1' + index"
+                      >{{ child.title }}</el-menu-item
+                    >
+                  </template>
+                </el-sub-menu>
+              </template>
+              <template v-else>
+                <el-menu-item
+                  v-for="(child, index) in book.documentlist"
+                  :key="index"
+                  @click="change(e, child.content, child.title)"
+                  :index="'1' + index"
+                  >{{ child.title }}</el-menu-item
+                >
               </template>
-              <el-menu-item @click="change" index="1-1">item one</el-menu-item>
-              <el-menu-item index="1-2">item two</el-menu-item>
-              <el-menu-item index="1-3">item three</el-menu-item>
             </el-sub-menu>
           </el-menu>
         </el-col>
       </div>
     </div>
+    <!-- <div class="right" >
+      <div v-html="book.content.con"></div>
+    </div> -->
+    <div class="right">
+      <div style="display: flex; align-items: center; column-gap: 6px">
+        <span class="topsm">{{ changefont }}</span>
+        <el-icon><ArrowRight /></el-icon>
+        <span class="topsm">{{ categoryname }}</span>
+        <el-icon><ArrowRight /></el-icon>
+        <span class="topsm">{{ docu }}</span>
+      </div>
+      <div class="bigtitle">{{ docu }}</div>
+      <div class="btnline"></div>
+      <div v-html="book.content.con"></div>
+    </div>
   </div>
 </template>
 
 <script setup>
-import { useRouter } from "vue-router";
-import { onMounted, ref } from "vue";
-import { Calendar, Search } from "@element-plus/icons-vue";
-onMounted(() => {});
+import { useRouter, useRoute } from "vue-router";
+import { onMounted, ref, reactive } from "vue";
+import { Calendar, Search, ArrowRight } from "@element-plus/icons-vue";
+import * as bookApi from "../../api/document";
+const route = useRoute();
+// const router = useRouter()
+const changeindex = ref(0);
+const changefont = ref("产品文档");
+const type_id = ref(1);
+changefont.value = route.query.name;
+changeindex.value = route.query.index;
+type_id.value = route.query.id;
+const categoryname = ref("");
+const docu = ref("");
+//更换文档
+const topchange = (name, index, id) => {
+  changefont.value = name;
+  changeindex.value = index;
+  type_id.value = id;
+  book.documentlist = [];
+  category();
+};
+
+const book = reactive({
+  list: [],
+  category: [],
+  documentlist: [],
+  content: {
+    con: "",
+  },
+});
+//文档类型列表
+const documentType = async () => {
+  try {
+    const { data } = await bookApi.documentType({});
+    book.list = data;
+  } catch (error) {}
+};
+onMounted(documentType);
+const category_id = ref("");
+//文档分类列表
+const category = async () => {
+  try {
+    const { data } = await bookApi.category({
+      type_id: type_id.value,
+    });
+    book.category = data;
+    categoryname.value = data[0].name;
+    category_id.value = data[0].id;
+    document();
+  } catch (error) {}
+};
+onMounted(category);
+
+//文档列表
+const document = async (id, name) => {
+  category_id.value = id;
+  try {
+    const { data } = await bookApi.document({
+      category_id: category_id.value,
+    });
+    book.documentlist = data.data;
+    categoryname.value = categoryname.value ? categoryname.value : name;
+    docu.value = data.data[0].title;
+    book.content.con = data.data[0].content;
+  } catch (error) {
+    console.log(error);
+  }
+};
+// onMounted(document);
+
 const handleOpen = (key, keyPath) => {
   console.log(key, keyPath);
 };
-const change = (e) => {
-  console.log(e);
+const content = ref("");
+const change = (e, content, title) => {
+  book.content.con = content;
+  docu.value = title;
 };
 </script>
 
 <style lang="scss" scoped>
-// ::v-deep .el-col-12 {
-//   width: 100% !important;
-// }
+.btnline {
+  width: 880px;
+  height: 1px;
+  background: rgba(151, 151, 151, 0.2);
+  margin-bottom: 25px;
+}
+.topsm {
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 400;
+  font-size: 14px;
+  color: #2f2f2f;
+  line-height: 20px;
+  text-align: left;
+  font-style: normal;
+}
+.bigtitle {
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 600;
+  font-size: 30px;
+  color: #2f2f2f;
+  line-height: 42px;
+  text-align: left;
+  font-style: normal;
+  margin-top: 38px;
+  margin-bottom: 36px;
+}
+.right {
+  margin-left: 40px;
+  flex: 1;
+  min-height: 80vh;
+}
 :deep(.el-col-12) {
   max-width: 100% !important;
 }
@@ -72,6 +238,15 @@ const change = (e) => {
   position: absolute;
   left: 0;
 }
+// :deep(.el-menu-item:hover::before) {
+//   width: 4px;
+//   height: 100%;
+//   background: #0d0fff;
+//   content: "";
+//   display: block;
+//   position: absolute;
+//   left: 0;
+// }
 :deep(.el-menu-item) {
   position: relative;
 }

+ 80 - 11
src/view/handbook/handbook.vue

@@ -26,14 +26,26 @@
           align-items: center;
         "
       >
-        <img
+        <!-- <img
           @click="bookinfo"
-          v-for="(item, idx) in 3"
+          v-for="(item, idx) in book.list"
           :key="idx"
           class="image"
-          :src="image"
+          :src="item.image"
           alt=""
-        />
+        /> -->
+        <div
+          class="image"
+          @click="bookinfo(item.name, idx, item.id)"
+          v-for="(item, idx) in book.list"
+          :key="idx"
+        >
+          <img class="small" :src="item.image" alt="" />
+          <div class="booktitle">{{ item.name }}</div>
+          <div class="content">{{ item.description }}</div>
+          <div class="line"></div>
+          <div class="time">{{ item.created_at }}</div>
+        </div>
       </div>
     </div>
     <bottom></bottom>
@@ -42,18 +54,72 @@
 
 <script setup>
 import { useRouter } from "vue-router";
-import { onMounted, ref } from "vue";
+import { onMounted, reactive, ref } from "vue";
 import bottom from "../../components/Layout/bottom.vue";
-const router =  useRouter()
-const bookinfo = ()=>{
+import * as bookApi from "../../api/document";
+const router = useRouter();
+const bookinfo = (name, idx, id) => {
   router.push({
-    name:'bookinfo'
-  })
-}
-onMounted(() => {});
+    name: "bookinfo",
+    query: {
+      name: name,
+      index: idx,
+      id: id,
+    },
+  });
+};
+const book = reactive({
+  list: [],
+});
+const documentType = async () => {
+  try {
+    const { data } = await bookApi.documentType({});
+    book.list = data;
+  } catch (error) {}
+};
+onMounted(documentType);
 </script>
 
 <style lang="scss" scoped>
+.small {
+  width: 56px;
+  height: 54px;
+}
+.booktitle {
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 500;
+  font-size: 22px;
+  color: #222222;
+  line-height: 30px;
+  text-align: left;
+  font-style: normal;
+  margin-top: 20px;
+}
+.content {
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 400;
+  font-size: 14px;
+  color: #222222;
+  line-height: 20px;
+  text-align: left;
+  font-style: normal;
+  margin-top: 16px;
+}
+.line {
+  height: 1px;
+  background: rgba(151, 151, 151, 0.1);
+  margin-top: 24px;
+}
+.time {
+  font-family: SFPro, SFPro;
+  font-weight: 400;
+  font-size: 14px;
+  color: #222222;
+  line-height: 16px;
+  text-align: left;
+  font-style: normal;
+  margin-top: 21px;
+}
 .flex {
   display: flex;
   flex-wrap: wrap;
@@ -75,6 +141,9 @@ onMounted(() => {});
     height: 260px;
     border-radius: 8px;
     cursor: pointer;
+    padding: 36px 30px 22px;
+    box-sizing: border-box;
+    background: #ffffff;
   }
   .item {
     width: 225px;

+ 48 - 6
src/view/video/course.vue

@@ -187,7 +187,7 @@
           >
             <img class="suo" src="../../assets/images/suo.png" alt="" />
             <div class="login">登录后才能查看评论</div>
-            <div class="log">立即登录</div>
+            <div class="log" @click="tologin">立即登录</div>
           </div>
         </div>
       </div>
@@ -198,11 +198,11 @@
         <img class="img" :src="videodetail.detail.image" alt="" />
       </div>
       <div style="display: flex; flex-direction: column; align-items: center">
-        <div class="join" v-if="islogin">
+        <div class="join" v-if="islogin && is_join == 0">
           <div>您已加入</div>
           <div class="success">完成进度{{ percentage }}%</div>
         </div>
-        <div class="progress" v-if="islogin">
+        <div class="progress" v-if="islogin && is_join == 0">
           <el-progress
             :percentage="percentage"
             :color="customColor"
@@ -221,7 +221,9 @@
         >
           继续学习
         </div>
-        <div class="button" v-else @click="join">加入课程</div>
+        <div class="button" v-if="is_join == 1 && islogin" @click="join">
+          加入课程
+        </div>
         <div class="updata" v-if="videodetail.detail.updated_at">
           最后更新时间:{{ videodetail.detail.updated_at.slice(0, 10) }}
         </div>
@@ -275,7 +277,18 @@ const comment_list = async () => {
     total.value = data.total;
   } catch (error) {}
 };
-onMounted(comment_list);
+if (islogin.value == true) {
+  comment_list();
+}
+//去登陆
+const tologin = (index) => {
+  router.push({
+    name: "/login",
+    query: {
+      index: index,
+    },
+  });
+};
 //输入框内容
 const textarea = ref("");
 //评论
@@ -303,7 +316,7 @@ const handleCurrentChange = (val) => {
 //加入课程
 const join = async () => {
   try {
-    const { data } = await videoAPi.details({
+    const { data } = await videoAPi.join({
       course_id: route.query.id,
     });
     is_join.value = 0;
@@ -375,6 +388,35 @@ const videoinfo = (id, time) => {
 </script>
 
 <style lang="scss" scoped>
+.log {
+  width: 156px;
+  height: 44px;
+  background: #0d0fff;
+  border-radius: 4px;
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 400;
+  font-size: 16px;
+  color: #ffffff;
+  line-height: 44px;
+  text-align: center;
+  font-style: normal;
+  margin-top: 34px;
+}
+.login {
+  font-family: PingFangSC, PingFang SC;
+  font-weight: 400;
+  font-size: 14px;
+  color: #666666;
+  line-height: 20px;
+  text-align: right;
+  font-style: normal;
+  margin-top: 20px;
+}
+.suo {
+  width: 32px;
+  height: 32px;
+  margin-top: 48px;
+}
 // .lefta {
 //   width: 820px;
 //   // height: 968px;

+ 10 - 0
src/view/video/index.vue

@@ -29,6 +29,7 @@ import Banne from "../../components/Banne/index.vue";
 import bottom from "../../components/Layout/bottom.vue";
 import { useRouter, useRoute } from "vue-router";
 import * as videoAPi from "../../api/kecheng";
+import * as configApi from "../../api/config";
 const router = useRouter();
 
 //课程列表
@@ -57,6 +58,15 @@ const imgList = reactive({
   ],
   list: [],
 });
+const getBanneList = async () => {
+  try {
+    const { data } = await configApi.getBanneList({
+      code:'video'
+  });
+  imgList.banneImageList = data;
+  } catch (error) {}
+};
+onMounted(getBanneList)
 const toinfo = (id) => {
   router.push({
     name: "course",

+ 79 - 25
src/view/video/info.vue

@@ -8,7 +8,7 @@
       </div>
     </div>
     <div class="videobox">
-      <div class="content">
+      <div class="content" style="position: relative;">
         <!-- <div > -->
         <video
           controls
@@ -19,19 +19,48 @@
           :initial-time="timeStamp"
           @play="time"
         ></video>
+        <div class="jindu" ></div>
         <!-- </div> -->
         <div class="like">
-          <div class="flex" @click="like" style="cursor: pointer;">
-            <img v-if="is_like==1" class="image" src="../../assets/images/like.png" alt="" />
-            <img v-else class="image" src="../../assets/images/likea.png" alt="" />
-            <span :style="{color:is_like==0?'rgba(0, 83, 255, 1)':''}" class="number">{{ videoinfo.info.like_num }}</span>
+          <div class="flex" @click="like" style="cursor: pointer">
+            <img
+              v-if="is_like == 1"
+              class="image"
+              src="../../assets/images/like.png"
+              alt=""
+            />
+            <img
+              v-else
+              class="image"
+              src="../../assets/images/likea.png"
+              alt=""
+            />
+            <span
+              :style="{ color: is_like == 0 ? 'rgba(0, 83, 255, 1)' : '' }"
+              class="number"
+              >{{ videoinfo.info.like_num }}</span
+            >
           </div>
-          <div class="flex left" @click="collect" style="cursor: pointer;">
-            <img v-if="is_collect==1" class="image" src="../../assets/images/Collect.png" alt="" />
-            <img v-else class="image" src="../../assets/images/collecta.png" alt="" />
-            <span :style="{color:is_collect==0?'rgba(254, 198, 64, 1)':''}" class="number">{{ videoinfo.info.collect_num }}</span>
+          <div class="flex left" @click="collect" style="cursor: pointer">
+            <img
+              v-if="is_collect == 1"
+              class="image"
+              src="../../assets/images/Collect.png"
+              alt=""
+            />
+            <img
+              v-else
+              class="image"
+              src="../../assets/images/collecta.png"
+              alt=""
+            />
+            <span
+              :style="{ color: is_collect == 0 ? 'rgba(254, 198, 64, 1)' : '' }"
+              class="number"
+              >{{ videoinfo.info.collect_num }}</span
+            >
           </div>
-          <div class="flex left" style="cursor: pointer;">
+          <div class="flex left" style="cursor: pointer">
             <img class="image" src="../../assets/images/mission.png" alt="" />
             <span class="number" @click="shareLink">分享</span>
           </div>
@@ -108,7 +137,7 @@
             >
               <img class="suo" src="../../assets/images/suo.png" alt="" />
               <div class="login">登录后才能查看评论</div>
-              <div class="log">立即登录</div>
+              <div class="log" @click='tologin(0)'>立即登录</div>
             </div>
           </div>
         </div>
@@ -196,7 +225,6 @@ const like = () => {
   } else {
     // is_like.value = 0
     likea();
-    
   }
 };
 //收藏
@@ -204,12 +232,19 @@ const is_collect = ref(0);
 const collect = () => {
   if (is_collect.value == 0) {
     collectdel();
-    
   } else {
     collectadd();
-    
   }
 };
+//去登陆
+const tologin = (index)=>{
+  router.push({
+    name:'/login',
+    query:{
+      index:index
+    }
+  })
+}
 //收藏接口
 const collectadd = async () => {
   try {
@@ -217,7 +252,7 @@ const collectadd = async () => {
       video_id: route.query.id,
     });
     is_collect.value = 0;
-    course_video()
+    course_video();
   } catch (error) {}
 };
 //点赞接口
@@ -227,7 +262,7 @@ const likea = async () => {
       video_id: route.query.id,
     });
     is_like.value = 0;
-    course_video()
+    course_video();
   } catch (error) {}
 };
 //删除收藏
@@ -237,7 +272,7 @@ const collectdel = async () => {
       id: route.query.id,
     });
     is_collect.value = 1;
-    course_video()
+    course_video();
   } catch (error) {}
 };
 //视频详情
@@ -290,7 +325,7 @@ const commentList = reactive({
 const comment_list = async () => {
   try {
     const { data } = await videoAPi.comment_list({
-      video_id: route.query.id,
+      video_id: Number(route.query.id),
       page: page.value,
       limit: 5,
     });
@@ -298,7 +333,10 @@ const comment_list = async () => {
     total.value = data.total;
   } catch (error) {}
 };
-onMounted(comment_list);
+if (islogin.value == true) {
+  comment_list();
+}
+//评论列表
 
 const handleSizeChange = (val) => {};
 const handleCurrentChange = (val) => {
@@ -312,11 +350,6 @@ let intervalId = ref();
 //播放结束
 const onVideoEnded = () => {
   read.value = 1;
-  if (intervalId.value) {
-    clearInterval(intervalId.value);
-    intervalId.value = null;
-  }
-  console.log("播放结束");
   //可在这里做视频播放结束后的处理,比如跳转新页面、显示弹框等
 };
 // 当前播放时间
@@ -325,7 +358,15 @@ timeStamp.value = route.query.time;
 const allTime = ref("");
 const currentTime = ref("");
 //timeUpdate
-
+const study_record = async () => {
+  try {
+    const { data } = await videoAPi.study_record({
+      video_id: Number(route.query.id),
+      total_duration: allTime.value,
+      duration: timeStamp.value,
+    });
+  } catch (error) {}
+};
 const time = () => {
   intervalId.value = setInterval(() => {
     study_record();
@@ -339,6 +380,10 @@ const timeUpdate = (e) => {
 
 //返回课程
 const returna = () => {
+  if (intervalId.value) {
+    clearInterval(intervalId.value);
+    intervalId.value = null;
+  }
   router.replace({
     name: "course",
     query: {
@@ -350,6 +395,15 @@ const returna = () => {
 </script>
 
 <style lang="scss" scoped>
+.jindu{
+  width: 100%;
+  height: 30px;
+  opacity: 0;
+  background: #000;
+  position: absolute;
+  z-index: 300;
+  top: 600px;
+}
 .comment {
   &-list {
     dl {

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio