浏览代码

feat: 完善PC模板

zhangyuhan 9 月之前
父节点
当前提交
016c055c3d

+ 2 - 0
.env.development

@@ -0,0 +1,2 @@
+NODE_ENV=development
+VUE_APP_UPLOAD_IMAGE_BASE='https://web-qmxtest.jydev.jianyu360.com'

+ 2 - 0
.env.production

@@ -0,0 +1,2 @@
+NODE_ENV=production
+VUE_APP_UPLOAD_IMAGE_BASE='https://web-qmxtest.jydev.jianyu360.com'

+ 1 - 1
client/api/modules/image.js

@@ -10,4 +10,4 @@ export const uploadImage = p => $axios.post('/imageLib/upload', p)
 export const uploadCommonImage = p => $axios.post('/imageCommon/upload', p)
 
 // 获取外部图片列表
-export const getExternalImages = p => $axios.get('/imageLib/ExternalImages', p)
+export const getExternalImages = p => $axios.get('/imageLib/ExternalImages', p)

+ 34 - 21
client/components/image-libs.vue

@@ -6,13 +6,13 @@
       direction="ltr"
       custom-class="drawerClass">
        <el-tabs tab-position="top" stretch>
-          <el-tab-pane label="正版图片">
+          <el-tab-pane label="历史图片">
             <!-- v-loading="loading" -->
             <div style="column-count: 3;column-gap: 0;">
                 <div v-for="(item,index) in externalImagesList" :key="index" >
                     <el-image
                       style="height: 100%;"
-                      :src="item.src" @click="handleImageClick(item.src)"></el-image>
+                      :src="item.url" @click="handleImageClick(item.url)"></el-image>
                 </div>
 
             </div>
@@ -25,10 +25,16 @@
           <div class="image-lib-inner">
             <div class="image-lib-btn">
               <el-upload
-                      action="https://jsonplaceholder.typicode.com/posts/"
-                      :before-upload="beforeUpload"
+                      action="/filemanage/upload"
                       accept="jpg,png,gif"
-                      :show-file-list="false">
+                      name="upload"
+                      :data="{
+                        type: 'upload'
+                      }"
+                      :show-file-list="false"
+                      :on-success="uploadSuccess"
+                      :on-error="uploadError"
+              >
                 <el-button size="small" type="primary">点击上传</el-button>
                 <span slot="tip" class="el-upload__tip marginL20">只能上传jpg/png/gif文件,且不超过2M</span>
               </el-upload>
@@ -41,8 +47,6 @@
             <div class="padding60 text-center gray" v-else>暂无数据</div>
           </div>
           </el-tab-pane>
-          <el-tab-pane label="我的收藏"></el-tab-pane>
-          <el-tab-pane label="最近图片"></el-tab-pane>
         </el-tabs>
     </el-drawer>
   </div>
@@ -74,16 +78,27 @@
       })
 		},
 		watch: {
-      // dialogVisible(val) {
-      //   if (val && !this.uploading) {
-      //     this.getMyImages()
-			// 	}
-			// }
+      dialogVisible(val) {
+        if (val && !this.uploading) {
+          this.getMyImages()
+				}
+			}
     },
 
 		methods: {
       getMyImage(){
         this.getMyImages()
+      },
+      uploadSuccess (res, file, fileList) {
+        console.log(res, file, fileList)
+        if (res.url) {
+          this.uploadPsd(process.env.VUE_APP_UPLOAD_IMAGE_BASE + res.url)
+        } else {
+          this.uploadError('请检查接口')
+        }
+      },
+      uploadError (err) {
+        this.$message.error('上传失败', err)
       },
 			beforeUpload(file) {
 				if (file.size > 1 * 1024 * 1024) {
@@ -100,10 +115,10 @@
 				return false;
 			},
 			uploadPsd(file) {
-				let params = new FormData()
-				params.append('file', file);
 				this.uploading = true;
-				this.$API.uploadImage(params).then(res => {
+				this.$API.uploadImage({
+          fileUrl: file
+        }).then(res => {
 					this.uploading = false;
 					this.imageList.splice(0, 0, res.body)
 				}).catch(() => {
@@ -113,16 +128,14 @@
 			getMyImages() {
 				this.hasLoadData = true;
 				this.$API.getMyImages().then(res => {
-					this.imageList = res.body || [];
+					this.imageList = res?.body || [];
 				})
       },
        getExternalImages(){
           this.$API.getExternalImages().then(res => {
-            res.body.data.dataList.forEach(v => {
-                this.externalImagesList.push({
-                    'src':"https://res1.eqh5.com/"+ v.productTypeMap.tmbPath
-                })
-            });
+            if (res?.body?.data) {
+              this.externalImagesList = res.body.data || []
+            }
           })
 
       },

+ 1 - 0
client/config/index.js

@@ -22,6 +22,7 @@ const configObj = {
     ...configDict[currentConfigKey],
     // h5模式宽高
     canvasH5Width: 375,
+    canvasPCWidth: 1200,
     canvasH5Height: 644,
     pageModeList: [
         {

+ 2 - 5
client/pages/editor/Index.vue

@@ -618,8 +618,10 @@ export default {
     width: 250px;
     padding: 0 10px;
     position: relative;
+    flex-shrink: 0;
   }
   .editor-main {
+    overflow: auto;
     flex: 1;
     background: #f0f2f5;
     // background: #ffffff;
@@ -632,11 +634,6 @@ export default {
 }
 
 .control-bar-wrapper {
-  position: absolute;
-  top: -44px;
-  left: 0;
-  width: 100%;
-  text-align: center;
   z-index: 1000;
 }
 </style>

+ 2 - 2
client/pages/editor/components/attr-configure/attr-props-components/base-attr.vue

@@ -463,11 +463,11 @@
 			handleResizeClick(type) {
 				if (type.includes('w')) {
 					this.activeElement.commonStyle.left = 0;
-					this.activeElement.commonStyle.width = this.$config.canvasH5Width;
+					this.activeElement.commonStyle.width = Math.max(this.projectData.width, this.$config.canvasH5Width);
 				}
 				if (type.includes('h')) {
 					this.activeElement.commonStyle.top = 0;
-					this.activeElement.commonStyle.height = this.$config.canvasH5Height;
+					this.activeElement.commonStyle.height = Math.max(this.projectData.height, this.$config.canvasH5Height);
 				}
 			}
 		}

+ 16 - 4
client/pages/editor/components/attr-configure/event-edit.vue

@@ -8,7 +8,7 @@
               添加事件<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
-              <el-dropdown-item v-for="(item, index) in eventTypeList" :key="index">
+              <el-dropdown-item v-for="(item, index) in eventTypeList" :disabled="item.disabled" :key="index">
                 <div @click="addEvent(item.value)">{{item.label}}</div>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -27,6 +27,15 @@
                         class="el-icon-delete"></i></span>
               </template>
               <div class="el-animate-item">
+                <div class="attr-item-edit-wrapper"  v-show="item.type !== 'share'">
+                  <p>打开方式:</p>
+                  <div class="col-1">
+                    <el-radio-group v-model="item.target" size="small">
+                      <el-radio-button label="_blank">新窗口</el-radio-button>
+                      <el-radio-button label="_self">当前窗口</el-radio-button>
+                    </el-radio-group>
+                  </div>
+                </div>
                 <div class="attr-item-edit-wrapper" v-show="item.type !== 'share'">
                   <p class="attr-item-title">链接/接口url:</p>
                   <div class="col-1  attr-item-edit-input">
@@ -54,13 +63,16 @@
 			return {
 				eventTypeList: [{
 					label: '链接跳转',
-          value: 'link'
+          value: 'link',
+          disabled: false
         }, {
 					label: '分享',
-					value: 'share'
+					value: 'share',
+          disabled: true
 				}, {
 					label: '表单提交',
-					value: 'submitForm'
+					value: 'submitForm',
+          disabled: true
 				}]
       }
     },

+ 22 - 1
client/pages/editor/components/attr-configure/page-attr-edit.vue

@@ -14,13 +14,34 @@
         <imageSelect :url.sync="activePage.commonStyle.backgroundImage" />
       </div>
     </div>
+    <p class="page-title fontBold">页面配置</p>
+    <div class="attr-item-edit-wrapper">
+      <el-form ref="form" :model="projectData" label-width="80px">
+        <el-form-item label="标题">
+          <el-input type="textarea" :rows="2" v-model="projectData.title"></el-input>
+        </el-form-item>
+        <el-form-item label="关键词">
+          <el-input type="textarea" :rows="2" v-model="projectData.keywords"></el-input>
+        </el-form-item>
+        <el-form-item label="描述">
+          <el-input type="textarea" :rows="2" v-model="projectData.description"></el-input>
+        </el-form-item>
+        <el-form-item label="分享标题">
+          <el-input type="textarea" :rows="2" v-model="projectData.shareConfig.title"></el-input>
+        </el-form-item>
+        <el-form-item label="分享描述">
+          <el-input type="textarea" :rows="2" v-model="projectData.shareConfig.description"></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
   </el-scrollbar>
 </template>
 
 <script>
 	import {mapState, mapGetters} from 'vuex'
 	import imageSelect from '@client/components/image-select'
-	export default {
+
+  export default {
 		components: {
 			imageSelect
 		},

+ 11 - 4
client/pages/editor/components/control-bar.vue

@@ -199,10 +199,17 @@
     }
   }
   .components-contrl-bar {
-    display: inline-block;
-    z-index: 3;
-    padding: 2px 12px;
-    height: 30px;
+    position: fixed;
+    border-radius: 12px;
+    padding: 8px;
+    height: 48px;
+    box-shadow: 0 0 4px 1px #e2e3e5;
+    background-color: #fff;
+    top: 12px;
+    left: 50%;
+    display: flex;
+    transform: translateX(-50%);
+    z-index: 1003;
     .button-item {
       display: inline-block;
       width: 68px;

+ 4 - 1
client/plugins/SourceForm/src/index.vue

@@ -11,6 +11,7 @@
       <van-field
           v-if="sourceFormConfig.company"
           v-model.trim="form.company"
+          required
           name="公司名称"
           label="公司名称"
           placeholder="请输入准确的公司名称"
@@ -18,6 +19,7 @@
       <van-field
           v-if="sourceFormConfig.name"
           v-model.trim="form.name"
+          required
           name="姓名"
           label="姓名"
           placeholder="请输入姓名"
@@ -25,11 +27,12 @@
       <van-field
           v-if="sourceFormConfig.phone"
           v-model.trim="form.phone"
+          required
           name="手机号"
           label="手机号"
           placeholder="请输入准确的手机号"
       />
-      <van-field name="radio" label="你希望获得哪个行业的报告" v-if="sourceFormConfig.source_desc">
+      <van-field name="radio" required label="你希望获得哪个行业的报告" v-if="sourceFormConfig.source_desc">
         <template #input>
           <div class="custom-radio-type">
             <van-radio-group

+ 21 - 2
client/store/modules/editor.js

@@ -126,7 +126,8 @@ const actions = {
    * @param data
    */
   addElement({ commit, state, dispatch }, elData) {
-    if (elData.creState == 'click') { //如果不是移动添加或者psd导入,则使用默认坐标
+    if (elData.creState == 'click') {
+      //如果不是移动添加或者psd导入,则使用默认坐标
       elData.defaultStyle.left = undefined
       elData.defaultStyle.top = undefined
     }
@@ -135,6 +136,12 @@ const actions = {
       console.log("出错了")
       dispatch('addPage')
       return;
+    } else {
+      if (elData.creState == 'click') {
+        // 默认添加到底部
+        elData.defaultStyle.left = 0
+        elData.defaultStyle.top = getters.computedActivePageMaxHeight() || 0
+      }
     }
     let data = editorProjectConfig.getElementConfig(elData, { zIndex: activePage.elements.length + 1 })
     commit('addElement', data);
@@ -253,7 +260,8 @@ const actions = {
     // 初始化数据
     let eventDefaultData = {
       type: type,
-      url: ''
+      url: '',
+      target: '_self'
     }
     commit('addElementEvent', eventDefaultData)
     commit('addHistoryCache', '添加事件')
@@ -346,6 +354,13 @@ const mutations = {
   addElement(state, elData) {
     let index = state.projectData.pages.findIndex(v => { return v.uuid === state.activePageUUID })
     state.projectData.pages[index].elements.push(elData);
+    this.commit('computedPageHeight')
+  },
+  computedPageHeight (state) {
+    // 长页H5 自动高度
+    if (state.projectData.pageMode === 'longPage' || state.projectData.pageMode === 'pc') {
+      state.projectData.height = Math.max(644, getters.computedActivePageMaxHeight())
+    }
   },
   /**
    * 往画板删除元素
@@ -564,6 +579,10 @@ const getters = {
     }
     return state.projectData.pages.find(v => { return v.uuid === state.activePageUUID })
   },
+  computedActivePageMaxHeight () {
+    const maxHeights = this.activePage().elements.map(v => v.commonStyle.top + v.commonStyle.height).sort((a, b) => b - a)
+    return maxHeights[0]
+  },
   /**
    * 当前选中元素
    */

+ 19 - 4
engine-template/engine-h5-long/src/index.vue

@@ -40,11 +40,23 @@
 		},
 		created() {
 			this.pageData = window._pageData;
-			this.scalingRatio = document.body.clientWidth / $config.canvasH5Width
-			this.pageTop = (document.documentElement.clientHeight - this.pageData.height * this.scalingRatio) / 2
-			this.pageTop = Math.max(this.pageTop, 0);
+			this.computedPageStyle()
+
+      window.addEventListener('resize', this.computedPageStyle)
 		},
-		methods: {
+    destroyed() {
+      window.removeEventListener('resize', this.computedPageStyle)
+    },
+    methods: {
+      computedPageStyle () {
+        let width = document.body.clientWidth
+        if (width > 580) {
+          width = 580
+        }
+        this.scalingRatio = width / $config.canvasH5Width
+        this.pageTop = (document.documentElement.clientHeight - this.pageData.height * this.scalingRatio) / 2
+        this.pageTop = Math.max(this.pageTop, 0);
+      },
 			/**
 			 * 按钮点击事件
 			 * @param eventsData
@@ -66,6 +78,9 @@
     width: 100%;
     height: 100%;
   }
+  .quark-page-wrapper {
+    margin: 0 auto;
+  }
 
   .relative {
     position: relative;

+ 70 - 56
engine-template/engine-pc/src/index.vue

@@ -6,11 +6,11 @@
       <div class="quark-page-wrapper"
            :style="getCommonStyle({...page.commonStyle, top: pageTop, height: pageData.height, width: pageData.width, position: 'relative'}, scalingRatio)">
         <componentsTemplate
-                v-for="(item, index) in page.elements"
-                :key="index"
-                @handleElementClick="handleElementClick"
-                :element="item"
-                :style="getCommonStyle(item.commonStyle, scalingRatio)">
+            v-for="(item, index) in page.elements"
+            :key="index"
+            @handleElementClick="handleElementClick"
+            :element="item"
+            :style="getCommonStyle(item.commonStyle, scalingRatio)">
         </componentsTemplate>
       </div>
     </div>
@@ -18,60 +18,74 @@
 </template>
 
 <script>
-	import editorProjectConfig from '@client/pages/editor/DataModel'
-	import componentsTemplate from '../../components/components-template'
-	import $config from '@client/config'
-	import elementEvents from '@client/mixins/elementEvents'
-	export default {
-		name: 'engineH5Long',
-		components: {
-			componentsTemplate
-		},
-		mixins: [elementEvents],
-		data() {
-			return {
-				getCommonStyle: editorProjectConfig.getCommonStyle,
-				scalingRatio: 1,
-				pageData: {
-					pages: []
-				},
-				pageTop: 0
-			}
-		},
-		created() {
-			this.pageData = window._pageData;
-			this.scalingRatio = document.body.clientWidth / $config.canvasH5Width
-			this.pageTop = (document.documentElement.clientHeight - this.pageData.height * this.scalingRatio) / 2
-			this.pageTop = Math.max(this.pageTop, 0);
-		},
-		methods: {
-			/**
-			 * 按钮点击事件
-			 * @param eventsData
-			 */
-			async handleElementClick(eventsData, element) {
-				for (let i = 0, len = eventsData.length; i < len; i++) {
-					if (this['_event_' + eventsData[i].type]) {
-						await this['_event_' + eventsData[i].type](eventsData[i], element, this.pageData)
-					}
-				}
-			}
-		}
-	}
+import editorProjectConfig from '@client/pages/editor/DataModel'
+import componentsTemplate from '../../components/components-template'
+import elementEvents from '@client/mixins/elementEvents'
+export default {
+  name: 'engine-pc',
+  components: {
+    componentsTemplate
+  },
+  mixins: [elementEvents],
+  data() {
+    return {
+      getCommonStyle: editorProjectConfig.getCommonStyle,
+      scalingRatio: 1,
+      pageData: {
+        pages: []
+      },
+      pageTop: 0
+    }
+  },
+  created() {
+    this.pageData = window._pageData;
+    this.computedPageStyle()
+
+    window.addEventListener('resize', this.computedPageStyle)
+  },
+  destroyed() {
+    window.removeEventListener('resize', this.computedPageStyle)
+  },
+  methods: {
+    computedPageStyle () {
+      let width = document.body.clientWidth
+      if (width < 1200) {
+        width = 1200
+      }
+      this.scalingRatio = 1
+      this.pageTop = (document.documentElement.clientHeight - this.pageData.height * this.scalingRatio) / 2
+      this.pageTop = Math.max(this.pageTop, 0);
+    },
+    /**
+     * 按钮点击事件
+     * @param eventsData
+     */
+    async handleElementClick(eventsData, element) {
+      for (let i = 0, len = eventsData.length; i < len; i++) {
+        if (this['_event_' + eventsData[i].type]) {
+          await this['_event_' + eventsData[i].type](eventsData[i], element, this.pageData)
+        }
+      }
+    }
+  }
+}
 </script>
 
 <style scoped>
-  .engine-template-wrapper {
-    position: relative;
-    width: 100%;
-    height: 100%;
-  }
+.engine-template-wrapper {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.quark-page-wrapper {
+  margin: 0 auto;
+}
 
-  .relative {
-    position: relative;
-  }
+.relative {
+  position: relative;
+}
 
-  .hidden {
-    overflow: hidden;
-  }
+.hidden {
+  overflow: hidden;
+}
 </style>

+ 3 - 22
service/api/image.js

@@ -28,26 +28,7 @@ module.exports = app => ({
    * 获取外部图片
    */
   async getExternalImages() {
-    const { ctx } = app;
-    let url = 'https://material-api.eqxiu.com/m/material/category/template/list?categoryId=898438&searchCode=94231&sortBy=0&fee=&pageNo=5&pageSize=20'
-      // let url = 'https://www.vcg.com/api/common/searchImage?assetFormat%5B%5D=png&phrase=%E4%BA%BA%E7%89%A9&graphicalStyle=6&transform=renwu&isRecommendCreativeFreshData=false'
-    var options = {
-      url,
-      'method': 'GET',
-      'headers': {
-        'cookie': $config.eqxiuCookie
-      }
-    };
-    return new Promise((resolve, reject) => {
-      request(options, function(error, response, body) {
-        if (!error && response.statusCode == 200) {
-          let arr = JSON.parse(body)
-          resolve(arr.obj)
-            // resolve(JSON.stringify(arr.list, ['equalw_url', 'url800', 'width', 'height']))
-        } else {
-          reject(error)
-        }
-      })
-    })
+    const { $model } = app;
+    return await $model.image.find({}).select('_id url').exec()
   }
-})
+})

+ 6 - 6
service/controller/image.js

@@ -20,12 +20,12 @@ module.exports = app => ({
    */
   async uploadImage() {
     const { ctx, $service, $helper } = app;
-    let userData = ctx.userData;
+    // let userData = ctx.userData;
     // 时间戳
-    let timestamps = (new Date().getTime()).toString();
-    let file = ctx.request.files.file;
-    let fileResult = await $service.file.upload(file, 'image_lib/' + userData.username + '/' + timestamps);
-    const imageData = await $service.image.addImage(fileResult.url);
+    // let timestamps = (new Date().getTime()).toString();
+    let fileUrl = ctx.request.body.fileUrl;
+    // let fileResult = await $service.file.upload(file, 'image_lib/' + userData.username + '/' + timestamps);
+    const imageData = await $service.image.addImage(fileUrl);
     $helper.returnBody(true, imageData)
   },
   /**
@@ -38,4 +38,4 @@ module.exports = app => ({
       // console.log(imageData)
     $helper.returnBody(true, { data: imageData })
   }
-})
+})

+ 11 - 4
service/views/h5-long.ejs

@@ -1,13 +1,13 @@
 <!DOCTYPE html>
-<html lang="en">
+<html lang="zh-CN">
 <head>
   <meta charset="UTF-8">
-  <title></title>
+  <title><%= pageData.title %></title>
   <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">
-  <meta name="keywords" content="">
-  <meta name="description" content="">
+  <meta name="keywords" content="<%= pageData.keywords %>">
+  <meta name="description" content="<%= pageData.description %>">
   <meta name="renderer" content="webkit">
   <meta name="robots" content="index, follow">
   <meta name="format-detection" content="telephone=no">
@@ -16,6 +16,13 @@
   <!--引入模板-->
   <script src="/engine_libs/h5-long/page-engine.umd.js"></script>
   <link rel="stylesheet" href="/engine_libs/h5-long/page-engine.css">
+  <!--S 【可选项】加载jquery获得更好的事件属性支持 -->
+  <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.5.1/jquery.min.js"></script>
+  <!--E 【可选项】加载jquery获得更好的事件属性支持 -->
+
+  <!--S 加载百度统计及剑鱼自定义埋点 -->
+  <script src="https://www.jianyu360.cn/common-module/public/head.js?v=1029"></script>
+  <!--E 加载百度统计及剑鱼自定义埋点 -->
   <style>
     * {
       padding: 0;

+ 13 - 6
service/views/h5-swiper.ejs

@@ -1,15 +1,15 @@
 <!DOCTYPE html>
-<html lang="en">
+<html lang="zh-CN">
 
 <head>
   <meta charset="UTF-8">
-  <title>Dcode-Editor</title>
+  <title><%= pageData.title %></title>
   <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">
   <meta http-equiv="Cache-Control" content="no-siteapp">
-  <meta name="keywords" content="">
-  <meta name="description" content="">
+  <meta name="keywords" content="<%= pageData.keywords %>">
+  <meta name="description" content="<%= pageData.description %>">
   <meta name="renderer" content="webkit">
   <meta name="robots" content="index, follow">
   <meta name="format-detection" content="telephone=no">
@@ -37,13 +37,20 @@
   <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
   <script src="https://cdn.jsdelivr.net/npm/v-charts/lib/index.min.js"></script>
   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/v-charts/lib/style.min.css">
+  <!--S 【可选项】加载jquery获得更好的事件属性支持 -->
+  <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.5.1/jquery.min.js"></script>
+  <!--E 【可选项】加载jquery获得更好的事件属性支持 -->
+
+  <!--S 加载百度统计及剑鱼自定义埋点 -->
+  <script src="https://www.jianyu360.cn/common-module/public/head.js?v=1029"></script>
+  <!--E 加载百度统计及剑鱼自定义埋点 -->
   <style>
     * {
       padding: 0;
       margin: 0;
       box-sizing: border-box;
     }
-    
+
     html,
     body,
     #app {
@@ -97,4 +104,4 @@
   </script>
 </body>
 
-</html>
+</html>

+ 56 - 0
service/views/pc.ejs

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+  <meta charset="UTF-8">
+  <title><%= pageData.title %></title>
+  <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+  <meta name="keywords" content="<%= pageData.keywords %>">
+  <meta name="description" content="<%= pageData.description %>">
+  <meta name="renderer" content="webkit">
+  <meta name="robots" content="index, follow">
+  <meta name="format-detection" content="telephone=no">
+  <script src="/third-libs/vue.js"></script>
+  <link rel="stylesheet" href="/third-libs/animate.min.css">
+  <!--引入模板-->
+  <script src="/engine_libs/pc/page-engine.umd.js"></script>
+  <link rel="stylesheet" href="/engine_libs/pc/page-engine.css">
+  <!--S 【可选项】加载jquery获得更好的事件属性支持 -->
+  <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.5.1/jquery.min.js"></script>
+  <!--E 【可选项】加载jquery获得更好的事件属性支持 -->
+
+  <!--S 加载百度统计及剑鱼自定义埋点 -->
+  <script src="https://www.jianyu360.cn/common-module/public/head.js?v=1029"></script>
+  <!--E 加载百度统计及剑鱼自定义埋点 -->
+  <style>
+    * {
+      padding: 0;
+      margin: 0;
+      box-sizing: border-box;
+    }
+    html, body, #app{
+      position: relative;
+      width: 100%;
+      height: 100%;
+    }
+  </style>
+  <script>
+	  window._pageData = <%- JSON.stringify(pageData) %>
+  </script>
+</head>
+<body>
+<div id="app">
+  <engine-pc  />
+</div>
+<script>
+  new Vue({
+	  el:"#app"
+  })
+</script>
+
+<script>
+	eval(window._pageData.script);
+</script>
+</body>
+</html>

+ 8 - 0
vue.config.js

@@ -22,6 +22,14 @@ let devServer = {
       pathRewrite: {
         '^/salesLeads': '/salesLeads'
       }
+    },
+    '/filemanage': {
+      target: 'https://web-qmxtest.jydev.jianyu360.com',
+      ws: false, //如果要代理 websockets
+      changeOrigin: true, //将主机标头的原点更改为目标URL
+      pathRewrite: {
+        '^/filemanage': '/filemanage'
+      }
     }
     // '/dev-api': {
     //   target: 'http://localhost:3333', //设置你调用的接口域名和端口号 别忘了加http