瀏覽代碼

Merge branch 'master' of http://8.136.199.33:3000/eta_front/eta_front into ETA_1.0.1

hbchen 1 年之前
父節點
當前提交
2be7ab5a7e
共有 58 個文件被更改,包括 950 次插入274 次删除
  1. 4 3
      .gitignore
  2. 14 3
      README.md
  3. 1 1
      build/build.js
  4. 1 1
      build/build.test.js
  5. 4 4
      config/index.js
  6. 2 1
      index.html
  7. 5 0
      src/api/api.js
  8. 3 1
      src/api/crypto.js
  9. 1 1
      src/api/http.js
  10. 22 0
      src/api/modules/home.js
  11. 4 1
      src/api/modules/oldApi.js
  12. 二進制
      src/assets/img/home/login_logo.png
  13. 二進制
      src/assets/img/questionnaire.png
  14. 154 0
      src/components/questionnaireDia.vue
  15. 12 0
      src/config/setting.js
  16. 39 3
      src/main.js
  17. 3 6
      src/mixins/theme.js
  18. 199 0
      src/utils/TimeOnPage.js
  19. 7 5
      src/utils/common.js
  20. 71 27
      src/views/Home.vue
  21. 10 2
      src/views/Login.vue
  22. 8 16
      src/views/chartRelevance_manage/components/chartCard.vue
  23. 1 1
      src/views/chartRelevance_manage/fittingEquationList.vue
  24. 1 1
      src/views/chartRelevance_manage/list.vue
  25. 32 2
      src/views/chartRelevance_manage/relevanceChartEditor.vue
  26. 1 1
      src/views/chartRelevance_manage/statisticFeatureList.vue
  27. 28 35
      src/views/dataEntry_manage/chartSetting.vue
  28. 7 1
      src/views/dataEntry_manage/databaseComponents/addTargetDiaBase.vue
  29. 13 27
      src/views/dataEntry_manage/databaseList.vue
  30. 1 1
      src/views/futures_manage/commodityChartBase.vue
  31. 1 1
      src/views/mychart_manage/components/chartDetailDia.vue
  32. 3 34
      src/views/positionAnalysis_manage/components/chartDetail.vue
  33. 39 3
      src/views/positionAnalysis_manage/detail.vue
  34. 17 7
      src/views/ppt_manage/mixins/pptMixins.js
  35. 9 9
      src/views/ppt_manage/newVersion/components/Cover.vue
  36. 7 7
      src/views/ppt_manage/newVersion/components/CoverEn.vue
  37. 3 1
      src/views/ppt_manage/newVersion/components/catalog/pptContent.vue
  38. 3 1
      src/views/ppt_manage/newVersion/components/catalog/pptContentEn.vue
  39. 26 11
      src/views/ppt_manage/newVersion/components/editor/ChooseCover.vue
  40. 26 10
      src/views/ppt_manage/newVersion/components/editor/ChooseCoverEn.vue
  41. 1 0
      src/views/ppt_manage/newVersion/pptEditor.vue
  42. 1 0
      src/views/ppt_manage/newVersion/pptEnEditor.vue
  43. 3 3
      src/views/ppt_manage/newVersion/pptEnPublish.vue
  44. 3 3
      src/views/ppt_manage/newVersion/pptPublish.vue
  45. 3 3
      src/views/predictEdb_manage/components/chartInfo.vue
  46. 49 15
      src/views/predictEdb_manage/predictEdb.vue
  47. 1 1
      src/views/report_manage/addreportNew.vue
  48. 1 1
      src/views/report_manage/editChapterReport.vue
  49. 1 1
      src/views/report_manage/editreportNew.vue
  50. 1 1
      src/views/report_manage/mixins/editor.js
  51. 3 3
      src/views/report_manage/mixins/messagePush.js
  52. 2 2
      src/views/report_manage/mixins/reportMixin.js
  53. 1 1
      src/views/report_manage/reportEn/reportEditor.vue
  54. 5 5
      src/views/system_manage/components/addUserDialog.vue
  55. 47 6
      src/views/system_manage/departManage.vue
  56. 35 0
      src/views/system_manage/etaBaseConfig.vue
  57. 3 0
      src/vuex/index.js
  58. 8 1
      src/vuex/mutations.js

+ 4 - 3
.gitignore

@@ -5,9 +5,9 @@
 /package-lock.json
 /dist.zip
 
-/hz_eta
-/hz_eta.rar
-/hz_eta.zip
+/eta_front
+/eta_front.rar
+/eta_front.zip
 
 /yarn-error.log
 
@@ -17,3 +17,4 @@
 
 /static/dll.vendor.js
 /.idea
+/static/base_config.js

+ 14 - 3
README.md

@@ -1,4 +1,4 @@
-# 弘则 ETA 模块项目
+# ETA 模块项目(弘则,试用平台,客户)
 
 ### styles
 - element-ui.scss elment-ui相关重置样式
@@ -6,5 +6,16 @@
 - global.scss 当做全局样式吧
 
 ### branch
-- master debug 内部eta分支
-- company_output 外部eta分支 同步时merge master
+- master  debug  sandbox
+
+### pack
+- 在static/下新建base_config.js
+- base_config.js用于导出正式环境加密用的key,`window.key='对应环境的密钥'`
+- 在index.html中引入
+- 在src/api/crypto.js中,将key替换成window.key
+- 打包完成后,发布不同环境,只需要更改base_config.js中的密钥
+
+### link
+- http://8.136.199.33:7778 弘则测试
+- https://eta.hzinsights.com 弘则正式
+- https://exptest.hzinsights.com 试用平台

+ 1 - 1
build/build.js

@@ -10,7 +10,7 @@ var webpack = require('webpack')
 var config = require('../config')
 var webpackConfig = require('./webpack.prod.conf')
 
-var spinner = ora('building for production...,打包后的静态资源在 hz_eta 文件夹中')
+var spinner = ora('building for production...,打包后的静态资源在 eta_front 文件夹中')
 spinner.start()
 
 rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {

+ 1 - 1
build/build.test.js

@@ -13,7 +13,7 @@ var webpackConfig = require('./webpack.prod.test.conf')
 var argv = process.argv.slice(2);
 var isPreProduction  = argv.indexOf('preProduction') !== -1;
 
-var spinner = ora('building for production.test...,打包后的静态资源在 hz_eta 文件夹中')
+var spinner = ora('building for production.test...,打包后的静态资源在 eta_front 文件夹中')
 spinner.start()
 
 rm(path.join(config.test.assetsRoot, config.test.assetsSubDirectory), err => {

+ 4 - 4
config/index.js

@@ -9,8 +9,8 @@ console.log(argv,isPreProduction);
 module.exports = {
   build: {
     env: require('./prod.env'),
-    index: path.resolve(__dirname, '../hz_eta/index.html'),
-    assetsRoot: path.resolve(__dirname, '../hz_eta'),
+    index: path.resolve(__dirname, '../eta_front/index.html'),
+    assetsRoot: path.resolve(__dirname, '../eta_front'),
     assetsSubDirectory: 'static',
 //  assetsPublicPath: '/vue-admin/',
 		assetsPublicPath: './',
@@ -54,8 +54,8 @@ module.exports = {
   },
   test: {
     env: !isPreProduction ? require('./prod.test.env') : require('./prod.pre.env'),
-    index: !isPreProduction ? path.resolve(__dirname, '../hz_eta/index.html') : path.resolve(__dirname, '../hz_eta/index.html') ,
-    assetsRoot: !isPreProduction ? path.resolve(__dirname, '../hz_eta') : path.resolve(__dirname, '../hz_eta'),
+    index: !isPreProduction ? path.resolve(__dirname, '../eta_front/index.html') : path.resolve(__dirname, '../eta_front/index.html') ,
+    assetsRoot: !isPreProduction ? path.resolve(__dirname, '../eta_front') : path.resolve(__dirname, '../eta_front'),
     assetsSubDirectory: 'static',
 //  assetsPublicPath: '/vue-admin/',
 		assetsPublicPath: './',

+ 2 - 1
index.html

@@ -6,12 +6,13 @@
 	<meta name="renderer" content="webkit" />
 	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
 	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
-	<title>弘则ETA</title>
+	<title>ETA</title>
 
 	<link rel="stylesheet" href="./static/css/iconfont.css"/>
 	<link rel="icon" type="image/x-icon" href="./static/fa.ico" id="icon"/>
 	<script src="./static/js/vue.js"></script>  <!-- 开发版,开发过程中使用此方案-->
 	<script src="./static/js/main.js"></script>  <!-- 生产版,打包的时候使用此方案 -->
+	<script src="./static/base_config.js"></script>  <!-- key -->
 	<!-- 引入组件库 -->
 	
 	<!-- oss SDK -->

+ 5 - 0
src/api/api.js

@@ -56,6 +56,8 @@ import interactiveInterface from './modules/interactive';
 // 共享网盘
 import cloudDiskInterface from './modules/cloudDisk';
 
+import homeInterface from './modules/home'
+
 //视频管理模块
 import videoInterface from './modules/videoApi'
 
@@ -105,6 +107,7 @@ export {
   baiinfoInterface,
   nationalInterface,
   cloudDiskInterface,
+  homeInterface,
   businessTripInterence,
   reportVarietyENInterence
 };
@@ -116,6 +119,7 @@ const {
   userLogin,
   modifyPwd,
   checkPwd,
+  timeOnPage,
   reportlist,
   reportpublish,
   reportpublishcancle,
@@ -189,6 +193,7 @@ export {
   userLogin,
   modifyPwd,
   checkPwd,
+  timeOnPage,
   reportlist,
   reportpublish,
   reportpublishcancle,

+ 3 - 1
src/api/crypto.js

@@ -1,4 +1,6 @@
-const key = '6WpHp4vSvLVQK8SLioNZ7WMq';
+const key = window.key||'6WpHp4vSvLVQK8SLioNZ7WMq'; //eta
+// const key = 'cJ3b1I4YBlTc85vnxy36xip2'; //逸诺
+// const key = 'bvS3kVp7QIZoD70fPk1wk41n'; //试用
 
 class CryptoJS {
 	// 3DES加密,CBC/PKCS5Padding

+ 1 - 1
src/api/http.js

@@ -51,13 +51,13 @@ function checkStatus(response) {
     } else if (res.Ret == 403) {
       bus.$message.error(res.Msg);
     } else if (res.Ret === 408) {
+      localStorage.setItem("auth", "")
       bus
         .$alert(res.Msg, "提示", {
           showClose: false,
         })
         .then(() => {
           window.location.href = window.location.origin + '/login';
-
         });
     }
     return res;

+ 22 - 0
src/api/modules/home.js

@@ -0,0 +1,22 @@
+import http from "@/api/http.js"
+
+/* 首页请求的接口  */
+const homeInterface = {
+	/**
+	 * 问卷调查详情接口
+	 */
+	getQuestionnaireDetail: () => {
+		return http.get('/eta_trial/questionnaire/popup')
+	},
+  /**
+ * 问卷调查详情 - 提交答案
+ * List[index].QuestionnaireId  题目Id
+  List[index].integerOptions 答案 多选用 ~# 隔开
+  List[index].Type 问题类型
+ */
+	questionnaireSubmit: (params) => {
+		return http.post('/eta_trial/questionnaire/commit',params)
+	}
+}
+
+export default homeInterface

+ 4 - 1
src/api/modules/oldApi.js

@@ -5,7 +5,9 @@ import http from "@/api/http.js"
 //  const modifyPwd = params => { return http.post('/modifyPwd',params); };  //修改密码
  const modifyPwd = params => { return http.post('/sysuser/modify/pwd',params); };  //修改密码
  const checkPwd = params => { return http.get('/sysuser/check_pwd'); };  //判断是否为初始密码
-
+ 
+	//用户累计停留时长 ActiveTime(s) Part
+ const timeOnPage = params =>{return http.post('/eta_trial/user/active',params)}
  const reportlist = params => { return http.get('/report/list',params); };  //获取报告列表
  const reportpublish = params => { return http.post('/report/publish',params); };  //批量发布报告
  const reportpublishcancle = params => { return http.post('/report/publish/cancle',params); };  //取消发布报告
@@ -308,6 +310,7 @@ export {
 	userLogin,
 	modifyPwd,
 	checkPwd,
+	timeOnPage,
 	reportlist,
 	reportpublish,
 	reportpublishcancle,

二進制
src/assets/img/home/login_logo.png


二進制
src/assets/img/questionnaire.png


+ 154 - 0
src/components/questionnaireDia.vue

@@ -0,0 +1,154 @@
+<template>
+  <div >
+    <el-dialog
+      title="问卷调查"
+      :visible.sync="dialogVisiblePwd"
+      :append-to-body="true"
+      :close-on-click-modal="false"
+      @closed="handleClosed"
+      width="780px"
+      top="5vh"
+    >
+      <div style="padding: 10px 40px 0;" class="questionnaire-container" id="questionnaire-container">
+        <div class="questionnaire-title">
+          {{ questionList[0]&&questionList[0].Option?questionList[0].Option[0]:'尊敬的用户,感谢您使用系统,以下是对系统使用的调研问卷,我们期待您真实的反馈' }}
+        </div>
+        <el-form :model="quesitionForm" ref="questionRef" label-position="top" size="small">
+          <el-form-item :label="index+1+'.'+item.Question" :prop="item.QuestionnaireId+''" 
+          :rules="item.IsMust?{required:true,message:'该题为必答题',trigger:['blur','change']}:''"
+          v-for="(item,index) in questionList.slice(1)" :key="item.QuestionnaireId">
+            <el-radio-group v-model="quesitionForm[item.QuestionnaireId]" v-if="item.Type==1">
+              <el-radio :label="it" v-for="(it,ind) in item.Option" :key="it">{{ it }}</el-radio>
+            </el-radio-group>
+            <el-checkbox-group v-model="quesitionForm[item.QuestionnaireId]"
+            v-else-if="item.Type==2">
+              <el-checkbox  :label="it" v-for="(it,ind) in item.Option" :key="it">{{ it }}</el-checkbox>
+            </el-checkbox-group>
+            <el-input v-else rows="5" v-model="quesitionForm[item.QuestionnaireId]" type="textarea" placeholder="请输入文本"></el-input>
+          </el-form-item>
+        </el-form>
+        <div style="text-align: center;padding:40px 0 ;">
+          <el-button @click="submitQuestion(1)" type="primary" style="width: 120px;" size="40">提交</el-button>
+          <el-button @click="submitQuestion(0)" style="width: 120px;margin-left: 28px;" size="40">以后再填</el-button>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {  homeInterface } from "api/api.js";
+
+  export default {
+    name:'questionnaireDia',
+    data() {
+      return {
+        quesitionForm:{}
+      }
+    },
+    watch:{
+      questionList:{
+        handler:function(value,old){
+          // console.log(value);
+          // 初始化数据
+          value.map((item,index) =>{
+            if(index ==0)  return
+            if(item.Type==2){
+              this.$set(this.quesitionForm,item.QuestionnaireId,[])
+            }else{
+              this.$set(this.quesitionForm,item.QuestionnaireId,'')
+            }
+
+          })
+          console.log(this.quesitionForm);
+        },
+        deep:true,
+        immediate:true
+      }
+    },
+    props:{
+      dialogVisiblePwd: {
+        type: Boolean,
+        default: false,
+      },
+      questionList:{
+        type: Array,
+        default: () =>[],
+      }
+    },
+    methods:{
+      submitQuestion(isFill){
+        if(isFill!=1){
+          homeInterface.questionnaireSubmit({List:[],IsFill:isFill}).then(res=>{
+            if(res.Ret == 200){
+              this.$emit('update:dialogVisiblePwd',false)
+            }
+          })
+        }else{
+          this.$refs.questionRef.validate((valid)=>{
+            if(valid){
+              let paramList = this.questionList.map((item)=>{
+                if(item.Type==4 || this.quesitionForm[item.QuestionnaireId].length==0) return undefined
+                return {
+                  QuestionnaireId:item.QuestionnaireId,
+                  Options:Array.isArray(this.quesitionForm[item.QuestionnaireId])?
+                  this.quesitionForm[item.QuestionnaireId].join('~#'):this.quesitionForm[item.QuestionnaireId],
+                  Type:item.Type
+                }
+              }).filter(Boolean)
+              // console.log(paramList);
+              if(paramList.length==0){
+                this.$emit('update:dialogVisiblePwd',false)
+                return 
+              }
+              homeInterface.questionnaireSubmit({List:paramList,IsFill:isFill}).then(res=>{
+                if(res.Ret == 200){
+                  this.$message.success('提交成功')
+                  this.$emit('submitSuccess')
+                  this.$emit('update:dialogVisiblePwd',false)
+                }
+              })
+            }
+          })
+        }
+      },
+      handleClosed(){
+        this.$refs.questionRef.resetFields()
+        this.$emit('update:dialogVisiblePwd',false)
+      }
+    },
+    created(){
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .questionnaire-container{
+    .questionnaire-title{
+      font-weight: 500;
+      font-size: 16px;
+      color: #333333;
+      margin-bottom: 15px;
+    }
+
+  }
+</style>
+<style lang="scss">
+  #questionnaire-container{
+    .el-form-item__label{
+      font-weight: 5000;
+      font-size: 16px;
+      color: #333333;
+    }
+    .el-radio__label,.el-checkbox__label,.el-textarea__inner{
+      color: #666666;
+    }
+    .el-checkbox-group,.el-radio-group{
+      margin-left: -40px;
+    }
+    .el-radio,.el-checkbox{
+      margin-right: 0;
+      margin-left: 40px;
+    }
+  }
+</style>

+ 12 - 0
src/config/setting.js

@@ -0,0 +1,12 @@
+//全局配置
+export default {
+  name: '后台管理系统',
+  company_name: '**公司',
+  g_logo: require('@/assets/img/home/logo.png'), //主页菜单栏logo
+  g_mini_logo: require('@/assets/img/home/eta_mini.png'), //主页菜单栏mini-logo
+  theme_color: '',
+  menu_bg:'#FFFFFF',//菜单栏背景色
+  login_title: '',//登录页标题
+  login_logo: require('@/assets/img/home/login_logo.png'),//登录页logo
+  login_bg: require('@/assets/img/login_bg.png')
+}

+ 39 - 3
src/main.js

@@ -18,6 +18,22 @@ Vue.use(ElementUI);
 Vue.use(VueRouter);
 Vue.use(Vuex);
 
+import {
+  getBusinessCode
+} from "api/api.js";
+import global from '@/config/setting';
+import{endCalc,optionTimeCalc,doPageEventListener}from'@/utils/TimeOnPage.js';
+
+// 获取商家code
+getBusinessCode().then(res=>{
+  if(res.Ret!==200) return 
+  let bus_code = res.Data||''
+  if(stores.state.TRIAL_CODE == bus_code){
+    doPageEventListener()
+  }
+  stores.mutations.SET_BUSINESS_CODE(stores.state,bus_code) 
+})
+
 import setting from '@/mixins/theme.js'
 Vue.prototype.$setting = setting;
 
@@ -173,12 +189,32 @@ router.beforeEach(async(to, from, next) => {
   }
 });
 
+
 router.afterEach((to, from, next) => {
   // 改变页面标题
-  document.title = to.matched[to.matched.length - 1].name
-    ? `弘则ETA-${to.matched[to.matched.length - 1].name}`
-    : "弘则ETA";
+  if(stores.state.TRIAL_CODE == stores.state.businessCode){
+    // 试用ETA
+    document.title = to.matched[to.matched.length-1].name ?
+    `${global.company_name}-${to.matched[to.matched.length-1].name}`: global.name
+  }else{
+    document.title = to.matched[to.matched.length - 1].name
+    ? `ETA-${to.matched[to.matched.length - 1].name}`
+    : "ETA";
+  }
+
   window.scrollTo(0, 0);
+  
+  sessionStorage.setItem('preTitle',from.name||'')
+  const routerChangeType = sessionStorage.getItem('routerChangeType')
+  if(routerChangeType==='popstate'){
+    const IsActive = sessionStorage.getItem('IsActive')
+    if(IsActive=='1'){
+      endCalc('popstate',Number(sessionStorage.getItem('popStayTime')||0))
+    }
+    optionTimeCalc()
+    sessionStorage.removeItem('routerChangeType')
+    sessionStorage.removeItem('popStayTime')
+  }
 });
 
 Vue.config.devtools = true;

+ 3 - 6
src/mixins/theme.js

@@ -1,11 +1,6 @@
 /* 
 一些动态配置和一些全局自定义东西 
 */
-import  store  from '@/vuex'
-console.log(store)
-const { dynamicOutLinks } = store;
-
-
 export default {
 	name: '后台管理系统',
   theme_color: '#0052D9',
@@ -33,5 +28,7 @@ export default {
   ],
   login_bg: require('@/assets/img/login_bg.png'),//登录页的大图
   login_logo: require('@/assets/img/login_logo.png'),
-  dynamicOutLinks//动态的外部链接
+  g_logo: require('@/assets/img/home/logo.png'),
+  g_mini_logo: require('@/assets/img/home/eta_mini.png'),
+  dynamicOutLinks:{}//动态的外部link链接
 }

+ 199 - 0
src/utils/TimeOnPage.js

@@ -0,0 +1,199 @@
+//计算账号累计活跃时长
+import global from '@/config/setting';
+import {timeOnPage} from '@/api/api.js';
+
+//活跃时间间隔 (s)
+const TimeInterval = 60*10
+//页面停留时间 (s)
+let stayTime = 0
+
+let timer = null
+
+//打开计时器
+export const optionTimeCalc = ()=>{
+  const IsActive = sessionStorage.getItem('IsActive')
+  if(Number(IsActive)===0){
+    //console.log('打开计时器')
+    sessionStorage.setItem('IsActive',1)
+    timeStr = new Date().getTime()
+    startCalc()
+  }
+  
+}
+//开始计时
+export const startCalc = ()=>{
+  sessionStorage.setItem('preTitle',document.title)
+  timer = setInterval(()=>{
+    stayTime++
+    
+    if(stayTime>=TimeInterval){
+      endCalc('timeup',0)
+    }
+  },1000)
+}
+
+//结束计时
+export const endCalc = (type,intervalT)=>{
+  //console.log('关闭计时器')
+  clearInterval(timer)
+  const IsActive = sessionStorage.getItem('IsActive')
+  if(Number(IsActive) && localStorage.getItem('auth')){
+     sendTOPInfo(type,intervalT)
+  }
+  stayTime = 0
+  /* if(type==='timeup'){
+    sessionStorage.setItem('IsActive',0)
+  } */
+  timeStr = new Date().getTime()
+  sessionStorage.setItem('IsActive',0)
+}
+
+
+//发送活跃时长数据
+export const sendTOPInfo = (type,intervalT)=>{
+  //获取上一个页面标题
+  const Title = sessionStorage.getItem('preTitle')
+  //console.log('发送活跃时长数据 ↓↓↓')
+  //获取计时间隔时间和页面名称
+  if(type==='timeup'){
+    console.table([{'停留时间(timeup)':stayTime+' s','停留页面':Title}])
+  }else{
+    console.table([{'停留时间(other)':Number(intervalT)/1000+' s','停留页面':Title,'触发类型':type}])
+  }
+  const Part = Title.split('-').length>1?Title.split('-')[1]:Title
+  const ActiveTime = type==='timeup'?stayTime:Number(intervalT)/1000
+  //发送数据
+  if(!Part.length||Part==global.name) return
+  if(ActiveTime>TimeInterval*12) return
+  console.log("ActiveTime:",ActiveTime,"Part:",Part)
+  timeOnPage({
+    ActiveTime:Math.round(ActiveTime),
+    Part:Part
+  }).then(res=>{
+    if(res.Ret!==200) return
+  })
+}
+
+//路由监听部分 
+//source https://juejin.cn/post/6905913200060366862#heading-2
+
+
+let timeStr=null
+let rewriteHis = function(type){
+  let origin = window.history[type]
+  return function(){
+    let rs = origin.apply(this, arguments)
+    let e = new Event(type.toLocaleLowerCase())
+    e.arguments = arguments
+    window.dispatchEvent(e)
+    return rs
+  }
+}
+
+
+export const doPageEventListener=function(){
+  window.history.pushState = rewriteHis('pushState')
+
+  window.history.replaceState = rewriteHis('replaceState')
+  
+  //刷新加载完成
+  window.addEventListener('load',(e)=>{
+    const unloadT = sessionStorage.getItem('unloadT')
+    const IsActive = sessionStorage.getItem('IsActive')
+    if(unloadT){
+      //console.log('刷新该页呆了时长',unloadT)
+      sessionStorage.removeItem('unloadT')
+      sessionStorage.setItem('preTitle',document.title)
+      if(Number(IsActive)){
+        endCalc('unload',unloadT)
+      }
+    }
+    console.log('onload')
+    timeStr = new Date().getTime()
+    optionTimeCalc()
+  })
+  //刷新离开页面
+  window.addEventListener('beforeunload',(e)=>{
+    console.log('unload')
+    let t = new Date().getTime() - timeStr
+    const IsActive = sessionStorage.getItem('IsActive')
+    if(Number(IsActive)){
+      sessionStorage.setItem('unloadT',t)
+    }
+  })
+  //popstate会在router.before/afterEach 之前触发,所以这里不对计时操作,操作放到before/afterEach
+  window.addEventListener('popstate',(e)=>{
+    //console.log('popState',e)
+    let t = new Date().getTime() - timeStr
+    timeStr = new Date().getTime()
+    //console.log('待了时长popstate:'+ t)
+    sessionStorage.setItem('routerChangeType','popstate')
+    sessionStorage.setItem('popStayTime',t)
+  })
+  
+  window.addEventListener('pushstate',()=>{
+    let t = new Date().getTime() - timeStr
+    timeStr = new Date().getTime()
+    //console.log('待了时长pushstate:'+ t)
+    const IsActive = sessionStorage.getItem('IsActive')
+    if(Number(IsActive)){
+      endCalc('pushstate',t)
+    }
+    optionTimeCalc()
+  })
+  
+  window.addEventListener('replacestate',()=>{
+    let t = new Date().getTime() - timeStr
+    timeStr = new Date().getTime()
+    //console.log('待了时长replacestate:'+ t)
+    const IsActive = sessionStorage.getItem('IsActive')
+    if(Number(IsActive)){
+      endCalc('replacestate',t)
+    }
+    optionTimeCalc()
+  })
+  
+  //页面监听
+  /* document.addEventListener('visibilitychange', function () {
+    // 用户离开了当前页面
+    if (document.visibilityState === 'hidden') {
+      console.log('hidden')
+      const IsActive = sessionStorage.getItem('IsActive')
+      if(Number(IsActive)){
+        let t = new Date().getTime() - timeStr
+        timeStr = new Date().getTime()
+        endCalc('hidden',t)
+      }
+    }
+  
+    // 用户打开或回到页面
+    if (document.visibilityState === 'visible') {
+      console.log('visible')
+      const IsActive = sessionStorage.getItem('IsActive')
+      if(IsActive==='0'){
+        timeStr = new Date().getTime()
+        optionTimeCalc()
+      }
+    }
+  }); */
+  document.addEventListener('click',(e)=>{
+    //console.log('click',e,e.composedPath())
+    //只计算displayMain 的click
+    const path = e.composedPath()
+    const contentIndex = path.findIndex((item)=>{return item.className==="content-container"})
+    if(contentIndex===-1) return 
+    //console.log('合法的click')
+    const IsActive = sessionStorage.getItem('IsActive')
+    if(Number(IsActive)===0){
+      optionTimeCalc()
+    }else{
+      //console.log('重置活跃计时')
+      //重置活跃时间
+      stayTime = 0
+    }
+  })
+}
+
+
+
+

+ 7 - 5
src/utils/common.js

@@ -39,8 +39,10 @@ export function downloadByFlow(data,type,fileName) {
     window.URL.revokeObjectURL(blob) //释放掉 blob 对象
   }
 
-// export default {
-//     getBrowser,
-//     getNetworkType,
-//     getSystemInfo
-// }
+/* 获取地址栏参数值 */
+export function getUrlParams(str=window.location.href,key) {
+  let obj = {};
+	str.split('?')[1].split('&').map(i => obj[(i.split('=')[0])] = i.split('=')[1]);
+
+  return obj[key]
+}

+ 71 - 27
src/views/Home.vue

@@ -7,13 +7,13 @@
           <img
             class="logo"
             v-if="!isCollapse"
-            src="~@/assets/img/home/logo.png"
+            :src="isTrail?global.g_logo:$setting.g_logo"
           />
           <!-- 折叠侧边栏logo尺寸 -->
           <img
             class="logo_coll"
             v-else
-            src="~@/assets/img/home/eta_mini.png"
+            :src="isTrail?global.g_mini_logo:$setting.g_mini_logo"
           />
         </div>
         <div
@@ -23,7 +23,7 @@
           <aside class="menu-expanded">
             <!--导航菜单-->
             <el-menu
-              :background-color="$setting.menu_bg"
+              :background-color="isTrail?global.menu_bg:$setting.menu_bg"
               text-color="#333"
               :collapse-transition="false"
               :active-text-color="$setting.theme_color"
@@ -243,6 +243,10 @@
                     >
                   </el-dropdown-menu>
                 </el-dropdown>
+                <div class="userinfo-fingerpost">
+                  <img src="~@/assets/img/questionnaire.png" v-if="isQuestionShow" @click="showQuestionDia=true"
+                style="width: 84px;height: 24; cursor: pointer;" />
+                </div>
               </div>
 
               <el-dropdown trigger="click" style="width:130px;">
@@ -292,7 +296,9 @@
 
     <!-- //重置初始密码 -->
     <pwd-dlg :dialogVisiblePwd="dialogVisiblePwd" />
-    
+    <!-- 问卷调查弹窗 -->
+    <questionnaire-dia :dialogVisiblePwd.sync="showQuestionDia" @submitSuccess="questionSubmitSuccess"
+    :questionList="questionList"></questionnaire-dia>
   </div>
 </template>
 
@@ -303,15 +309,20 @@ import {
   customInterence,
   roadshowInterence,
   getBusinessCode,
+  homeInterface
 } from "api/api.js";
 import { getPublicSettingsApi } from '@/api/modules/oldApi';
 import PwdDlg from "@/components/pwdDlg.vue";
 import questionMsgDia from "@/components/questionMsgDia.vue";
+import questionnaireDia from "../components/questionnaireDia.vue";
 import EventBus from "@/api/bus.js";
+import global from '@/config/setting';
+
 export default {
   components: {
     PwdDlg,
     questionMsgDia,
+    questionnaireDia,
   },
   inject: ["reload"],
   filters: {
@@ -371,7 +382,11 @@ export default {
         return this.permissionBtn.checkPermissionBtn(
             this.permissionBtn.baseConfigPermission.sysJump_updateLog
         )
-    }
+    },
+		// 是否是eta试用
+    isTrail(){
+			return this.$store.state.businessCode == this.$store.state.TRIAL_CODE
+		}
   },
   data() {
     return {
@@ -415,7 +430,12 @@ export default {
       flag2: false, //显示合同提示红点
       flag3: false, //显示用印提示红点
       dialogVisiblePwd: false, //初始密码的弹框
-
+      //  ----------------问卷调查弹窗
+      showQuestionDia:false,
+      // 问卷调查icon是否展示
+      isQuestionShow:false,
+      // 问题列表
+      questionList:[],
       flag4: false,
       flag5: false, //显示ETA试用相关的红点
       flag6: false, //显示出差相关的红点
@@ -443,10 +463,12 @@ export default {
 
       //链接系统
       linkSystems: this.$setting.linkSystems,
+      bus_code:"",
+      global
     };
   },
   created() {
-    this.isInitialPwd(); //判断是否为初始密码
+    //this.isInitialPwd(); //判断是否为初始密码
     this.Role = localStorage.getItem("Role") || "";
     this.RoleType = localStorage.getItem("RoleType") || "";
     this.sysUserName = localStorage.getItem("userName") || "";
@@ -456,6 +478,9 @@ export default {
       this.isShowApprovalNotice = true;
     }
     this.resetLinkSys()
+    // this.getBusinessCodeFun()
+    
+    this.getQuestionStaus()
   },
   mounted() {
     if (sessionStorage.getItem("hasGetMenu")) {
@@ -467,6 +492,14 @@ export default {
     this.getPublicSettings();
   },
   methods: {
+    // 获取商家Code
+    // getBusinessCodeFun(){
+      // getBusinessCode().then(res=>{
+      //   if(res.Ret!==200) return 
+      //   this.bus_code = res.Data||''
+      //   this.$store.commit("SET_BUSINESS_CODE", this.bus_code);
+      // })
+    // },
     //判断是否为初始密码
     async isInitialPwd() {
       const res = await checkPwd();
@@ -637,7 +670,28 @@ export default {
         this.roadshowFeedbackList = Data;
       });
     },
-
+    // 获取用户的问卷调查状态
+    getQuestionStaus(){
+      if(!this.isTrail){
+        this.showQuestionDia=false
+        this.isQuestionShow=false
+        this.questionList=[]
+        return 
+      }
+      // console.log(this.isTrail,'isTrail');
+      homeInterface.getQuestionnaireDetail().then(res=>{
+        // console.log(res);
+        if(res.Ret == 200){
+          this.showQuestionDia=!!res.Data.IsPopup && (!!res.Data.IsShow)
+          this.isQuestionShow = !!res.Data.IsShow
+          this.questionList = res.Data.Question.List || []
+        }
+      })
+    },
+    // 问卷提交成功
+    questionSubmitSuccess(){
+      this.isQuestionShow=false
+    },
     // 操作指南的跳转
     toOperation() {
       // this.$router.replace({name: '/fingerpost', params: {id: 1}})
@@ -646,16 +700,11 @@ export default {
       //   query: { contractid: this.contractId },
       // });
       // window.open(href, "_blank");
-      // 获取商家
-      getBusinessCode().then(res=>{
-        if(res.Ret!==200) return 
-        const bus_code = res.Data||''
-        //打开帮助文档
-        const href = `${process.env.VUE_APP_ETA_HELP_DOCS}?bus_code=${bus_code}`
-        console.log(href);
-        // const href = `http://192.168.77.13:3033/help/index?bus_code=${bus_code}`
-        window.open(href, "_blank");
-      })
+      //打开帮助文档
+      const href = `${process.env.VUE_APP_ETA_HELP_DOCS}?bus_code=${this.$store.state.businessCode}`
+      // console.log(href);
+      // const href = `http://192.168.77.13:3033/help/index?bus_code=${this.bus_code}`
+      window.open(href, "_blank");
     },
     // 跳转去其他的系统
     async linkToOtherMS({path,key}) {
@@ -749,15 +798,9 @@ export default {
         .catch(() => {});
     },
     toDoc(){
-        //获取商家code
-        getBusinessCode().then(res=>{
-            if(res.Ret!==200) return 
-            const bus_code = res.Data||''
-            //打开更新日志项目
-            const href = `${process.env.VUE_APP_ETA_DOCS}?bus_code=${bus_code}`
-            window.open(href, "_blank");
-        })
-        
+      //打开更新日志项目
+      const href = `${process.env.VUE_APP_ETA_DOCS}?bus_code=${this.$store.state.businessCode}`
+      window.open(href, "_blank");
     },
     collapseHandle () {
       //折叠导航栏
@@ -989,6 +1032,7 @@ export default {
       padding: 0 30px;
       .main_left_container {
         display: flex;
+        flex-shrink: 0;
         align-items: center;
         .main_left_section {
           display: flex;

+ 10 - 2
src/views/Login.vue

@@ -2,8 +2,8 @@
   <div id="login">
 		<div id="login_wrapper">
       
-			<img class="login-bg" :src="$setting.login_bg" alt />
-      <img class="login-icon" :src="$setting.login_logo">
+			<img class="login-bg" :src="isTrail?global.login_bg:$setting.login_bg" alt />
+      <img class="login-icon" :src="isTrail?global.login_logo:$setting.login_logo" v-if="isTrail?global.login_logo:$setting.login_logo">
 			<el-form
 				:model="ruleForm"
 				:rules="rules"
@@ -72,9 +72,11 @@
 import { userLogin, departInterence } from "@/api/api.js";
 import http from "@/api/http.js";
 import md5 from "@/utils/md5.js";
+import global from '@/config/setting'
 export default {
   data() {
     return {
+			global,
       b: new http.Base64(),
       logining: false, //登录loadding
       ruleForm: {
@@ -100,6 +102,12 @@ export default {
       checked: false, //是否保持登录状态
       visible: true, //密码输入类型
     };
+  },
+	computed: {
+		// 是否是eta试用
+    isTrail(){
+			return this.$store.state.businessCode == this.$store.state.TRIAL_CODE
+		}
   },
   created() {
     this.keyupSubmit(); //回车登录

+ 8 - 16
src/views/chartRelevance_manage/components/chartCard.vue

@@ -7,7 +7,7 @@
       <div style="flex-shrink: 0">
         <template v-if="isHaveEdbHandle">
           <el-dropdown 
-            v-if="isEdbAdd" 
+            v-show="isEdbAdd" 
             split-button 
             type="primary" 
             @click="updateEdbHandle(entryType)" 
@@ -18,22 +18,22 @@
               <el-dropdown-item :command="{entryType,scence:'saveOther'}">指标另存为</el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
-          <el-button type="primary" v-else @click="saveEdb(entryType)">保存指标</el-button>
+          <el-button type="primary" v-show="!isEdbAdd" @click="saveEdb(entryType)">保存指标</el-button>
         </template>
 
         <el-dropdown 
-          v-if="isChartAdd" 
+          v-show="isChartAdd" 
           split-button 
           type="primary" 
           @click="updateChartHandle(entryType)" 
           @command="chartCommandHandle"
         >
           更新
-          <el-dropdown-menu slot="dropdown" v-if="isHaveSaveOtherHandle">
+          <el-dropdown-menu slot="dropdown" v-show="isHaveSaveOtherHandle">
             <el-dropdown-item :command="{entryType,scence:'saveOther'}">另存为</el-dropdown-item>
           </el-dropdown-menu>
         </el-dropdown>
-        <el-button type="primary" @click="saveChart(entryType)" v-else>保存</el-button>
+        <el-button type="primary" @click="saveChart(entryType)" v-show="!isChartAdd">保存</el-button>
 
       </div>
     </div>
@@ -206,16 +206,7 @@ export default {
 
     /* 设置图表封面图片 */
     setChartImage(entryType,id) {
-      let otherOptions = this.chartInfo.Source===3 ? {
-        chart: {
-          width:340,
-          height:230,
-        },
-        xAxis:[{
-          ...this.options.xAxis,
-          offset: -65,
-        }]//这里记得要写成你渲染的图的配置项一样的 单独就配置一个offset无效
-      } : {
+      let otherOptions = {
         chart: {
           width:340,
           height:230,
@@ -265,7 +256,8 @@ export default {
       } 
 
       if(res.Ret !== 200) return
-
+      
+      this.setChartImage(entryType,res.Data.ChartInfoId)
       this.$message.success('更新成功');
     },
 

+ 1 - 1
src/views/chartRelevance_manage/fittingEquationList.vue

@@ -262,7 +262,7 @@ export default {
 	computed: {
 		/* 分享地址 */
     linkUrl() {
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
       return `${LINK_CHART_URL}?code=${this.chartInfo.UniqueCode}&fromType=share?&lang=${this.currentLang}`
     }
 	},

+ 1 - 1
src/views/chartRelevance_manage/list.vue

@@ -323,7 +323,7 @@ export default {
   computed: {
     /* 分享地址 */
     linkUrl() {
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
       return `${LINK_CHART_URL}?code=${this.chartInfo.UniqueCode}&fromType=share?&lang=${this.currentLang}`;
     },
   },

+ 32 - 2
src/views/chartRelevance_manage/relevanceChartEditor.vue

@@ -147,7 +147,18 @@
         </div>  
 
         <div class="section">
-          <div>相关性</div>
+          <div>相关性
+            <el-tooltip
+              effect="dark"
+            >
+              <div
+                slot="content"
+                v-html="useTip['correlation']"
+                style="line-height: 20px;width:350px"
+              ></div>
+              <i class="el-icon-question" style="color:#666"/>
+            </el-tooltip>
+          </div>
           <div class="section-item">
             <div style="flex-shrink:0;min-width:70px"><span style="color:red;font-size:18px;">*</span>计算窗口</div>
             <el-input
@@ -196,7 +207,18 @@
 
 
       <div class="section" v-for="(item,index) in chartInfo.RollingCorrelation" :key="index">
-        <div>滚动相关性{{index+1}}</div>
+        <div>滚动相关性{{index+1}}
+          <el-tooltip
+            effect="dark"
+          >
+            <div
+              slot="content"
+              v-html="useTip['rollingCorrelation']"
+              style="line-height: 20px;width:350px"
+            ></div>
+            <i class="el-icon-question" style="color:#666"/>
+          </el-tooltip>
+        </div>
         <div class="section-item">
           <span style="flex-shrink:0;min-width:70px">计算窗口</span>
           <el-input
@@ -470,6 +492,14 @@ export default {
        /* 指标入库 */
       isSaveEdbToBase: false,
 
+      /* 使用说明 */
+      useTip:{
+        correlation: `计算窗口:参与计算的历史数据时间段;<br>
+          分析周期:指标B领先A的期数,如配置参数10个月,表示B领先A -10月、B领先A -9月,...,B领先A 9月、B领先A 10月,每期分别计算相关性值;`,
+        rollingCorrelation:`计算窗口:参与计算的时间段长度,从两个指标都有值的日期开始滚动的取计算窗口长度的值进行计算,如配置计算窗口1个月,则2023.7.28的值取2023.6.28~2023.7.28时间段,2023.7.27的值取2023.6.27~2023.7.27时间段;<br>
+        B领先A:B指标领先A指标的参数,为0时不领先;`
+      }
+
     };
   },
   methods: {

+ 1 - 1
src/views/chartRelevance_manage/statisticFeatureList.vue

@@ -247,7 +247,7 @@ export default {
 	computed: {
 		/* 分享地址 */
     linkUrl() {
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
       return `${LINK_CHART_URL}?code=${this.chartInfo.UniqueCode}&fromType=share?&lang=${this.currentLang}`
     }
 	},

+ 28 - 35
src/views/dataEntry_manage/chartSetting.vue

@@ -945,7 +945,7 @@ export default {
     },
     /* 分享地址 */
     linkUrl() {
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
       return `${LINK_CHART_URL}?code=${this.chartInfo.UniqueCode}&fromType=share&lang=${this.currentLang}`
     }
   },
@@ -1055,7 +1055,7 @@ export default {
     resetNodeStyle: _.debounce(function (node) {
       const tree = $('.target_tree')[0];
       let width = tree.offsetWidth;
-      let label_wid = width > 500 ? 'auto' : width <= 250 ? 80 : 0.58 * width;
+      let label_wid = width > 500 ? 'auto' : width <= 250 ? 80 : 0.4 * width;
       this.$set(node, 'Nodewidth', label_wid + 'px');
     }, 300),
     /* 双击label出现input修改框 */
@@ -1166,42 +1166,35 @@ export default {
              * 1 关联图表一
              * 2 有子目录无图表
              */
-            if (res.Data.DeleteStatus === 1)
-              this.$confirm('该分类下关联图表不可删除', '删除失败', {
+            const deleteLabelMap = {
+              1: '该分类下关联图表不可删除',
+              2: '确认删除当前分类及包含的子分类吗?',
+              4: res.Data.TipsMsg
+            }
+
+            if([1,4].includes(res.Data.DeleteStatus)) this.$confirm(
+                deleteLabelMap[res.Data.DeleteStatus],
+                '删除失败',
+                {
                 confirmButtonText: '知道了',
-                showCancelButton: false,
-                type: 'error',
-              });
-            else if (res.Data.DeleteStatus === 0 && !data.ChartInfoId)
-              this.$confirm('确定删除当前分类吗?', '提示', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
-                type: 'warning',
-              })
-                .then(() => {
-                  this.delHandle(data.ChartClassifyId, data.ChartInfoId);
-                })
-                .catch(() => {});
-            else if (res.Data.DeleteStatus === 0 && data.ChartInfoId)
-              this.$confirm('删除后该图表将不能再引用,确认删除吗?', '提示', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
-                type: 'warning',
+                showCancelButton:false,
+                type: 'error'
               })
-                .then(() => {
-                  this.delHandle(data.ChartClassifyId, data.ChartInfoId, 1);
-                })
-                .catch(() => {});
-            else if (res.Data.DeleteStatus === 2)
-              this.$confirm('确认删除当前分类及包含的子分类吗?', '提示', {
+            else if([0,2].includes(res.Data.DeleteStatus)) this.$confirm(
+                res.Data.DeleteStatus === 2 
+                ? deleteLabelMap[res.Data.DeleteStatus]
+                : data.ChartInfoId?'删除后该图表将不能再引用,确认删除吗?':'确定删除当前分类吗?', 
+                '提示',
+                {
                 confirmButtonText: '确定',
                 cancelButtonText: '取消',
-                type: 'warning',
-              })
-                .then(() => {
-                  this.delHandle(data.ChartClassifyId, data.ChartInfoId);
-                })
-                .catch(() => {});
+                type: 'warning'
+              }).then(() => {
+                res.Data.DeleteStatus === 0 && data.ChartInfoId 
+                ? this.delHandle(data.ChartClassifyId, data.ChartInfoId, 1)
+                : this.delHandle(data.ChartClassifyId, data.ChartInfoId);
+              }).catch(() => {         
+              });
           }
         });
     },
@@ -2651,7 +2644,7 @@ export default {
       }
       .main-left {
         width: 400px;
-        min-width: 300px;
+        min-width: 350px;
         background: #fff;
         margin-right: 20px;
         border: 1px solid #ececec;

+ 7 - 1
src/views/dataEntry_manage/databaseComponents/addTargetDiaBase.vue

@@ -110,9 +110,15 @@ export default {
 			search_company_txt: ''
 		};
 	},
+	computed: {
+		// 是否是eta试用
+    isTrail(){
+			return this.$store.state.businessCode == this.$store.state.TRIAL_CODE
+		}
+  },
 	methods: {
 		init() {
-			this.fromType = 'wind'
+			this.fromType = this.isTrail?'同花顺':'wind'
 			this.status = ''
 			this.tableData = []
 			this.dataList = []

+ 13 - 27
src/views/dataEntry_manage/databaseList.vue

@@ -990,6 +990,7 @@ export default {
 		resetNodeStyle: _.debounce(function(node) {
 			const tree = $('.target_tree')[0];
 			let width = tree.offsetWidth;
+			console.log(width)
 			// let label_wid = width > 500 ? 'auto' : (width <= 300 && width < 360) ?  100 : 0.7*width;
 			let label_wid =
 				width > 500
@@ -1190,40 +1191,25 @@ export default {
 					 * 1 关联指标
 					 * 2 有子目录无指标
 					*/
+					const deleteLabelMap = {
+						1: '该目录关联指标不可删除',
+						2: '确认删除当前目录及包含的子目录吗?',
+						3: '当前指标已用作画图,不可删除',
+						4: res.Data.TipsMsg
+					}
+
 					if([1,3,4].includes(res.Data.DeleteStatus)) this.$confirm(
-							res.Data.DeleteStatus === 1 ? '该目录关联指标不可删除' 
-							: res.Data.DeleteStatus === 3 ? '当前指标已用作画图,不可删除'
-							: res.Data.TipsMsg,
+							deleteLabelMap[res.Data.DeleteStatus],
 							'删除失败',
 							{
 							confirmButtonText: '知道了',
 							showCancelButton:false,
 							type: 'error'
 						})
-					else if(res.Data.DeleteStatus === 0 && !data.EdbCode) this.$confirm(
-							'确定删除当前目录吗?', 
-							'提示',
-							{
-							confirmButtonText: '确定',
-							cancelButtonText: '取消',
-							type: 'warning'
-						}).then(() => {
-							this.delHandle(data.ClassifyId,data.EdbInfoId);
-						}).catch(() => {         
-						});
-					else if(res.Data.DeleteStatus === 0 && data.EdbCode) this.$confirm(
-							'删除后指标和指标值均不可使用,确认删除吗?', 
-							'提示',
-							{
-							confirmButtonText: '确定',
-							cancelButtonText: '取消',
-							type: 'warning'
-						}).then(() => {
-							this.delHandle(data.ClassifyId,data.EdbInfoId);
-						}).catch(() => {         
-						});
-					else if(res.Data.DeleteStatus === 2) this.$confirm(
-							'确认删除当前目录及包含的子目录吗?', 
+					else if([0,2].includes(res.Data.DeleteStatus)) this.$confirm(
+							res.Data.DeleteStatus === 2 
+							? deleteLabelMap[res.Data.DeleteStatus]
+							: data.EdbCode?'删除后指标和指标值均不可使用,确认删除吗?':'确定删除当前目录吗?', 
 							'提示',
 							{
 							confirmButtonText: '确定',

+ 1 - 1
src/views/futures_manage/commodityChartBase.vue

@@ -273,7 +273,7 @@ export default {
 	computed: {
 		/* 分享地址 */
     linkUrl() {
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
       return `${LINK_CHART_URL}?code=${this.chartInfo.UniqueCode}&fromType=share?&lang=${this.currentLang}`
     }
 	},

+ 1 - 1
src/views/mychart_manage/components/chartDetailDia.vue

@@ -610,7 +610,7 @@ export default {
     },
     /* 分享地址 */
     linkUrl() {
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
       return `${LINK_CHART_URL}?code=${this.chartInfo.UniqueCode}&fromType=share?&lang=${this.currentLang}`
     }
   },

+ 3 - 34
src/views/positionAnalysis_manage/components/chartDetail.vue

@@ -23,23 +23,6 @@
             >
           </el-radio-group>
         </div>
-        <div>
-          <el-date-picker
-            v-model="selectDate"
-            type="date"
-            placeholder="请选择日期"
-            value-format="yyyy-MM-dd"
-            :picker-options="pickerOption"
-            @change="getInfo"
-            style="margin-right: 10px"
-          />
-          <el-button type="primary" @click="handleDateChange('before')"
-            >查看前一天</el-button
-          >
-          <el-button type="primary" @click="handleDateChange('next')"
-            >查看后一天</el-button
-          >
-        </div>
       </div>
       <div
         class="chart-wrap"
@@ -75,22 +58,6 @@ import {
 import chartBox from "./chartBox.vue";
 export default {
   components: { chartBox },
-  computed: {
-    pickerOption() {
-      let that = this;
-      let obj = {
-        // 周六日禁用
-        disabledDate(t) {
-          if ([5, 6].includes(that.$moment(t).weekday())) {
-            return true;
-          } else {
-            return false;
-          }
-        },
-      };
-      return obj;
-    },
-  },
   watch: {
     "$route.query": {
       handler(nval) {
@@ -106,7 +73,7 @@ export default {
       isRefresh: false,
 
       minDate: new Date("2000/01/01"),
-      currentDate: "", //
+      latestDate: "", //
       selectDate: "",
 
       allClassifyTypeList: [],
@@ -248,10 +215,12 @@ export default {
           };
         }
         this.chartItemInfo = this.chartListState[this.tabKey];
+        this.latestDate = res.Data.LastDataTime;
         if (res.Data.DataTime) {
           this.selectDate = this.$moment(res.Data.DataTime).format(
             "YYYY-MM-DD"
           );
+          this.$emit('setInfo',{date: this.selectDate})
         }
 
         this.$store.commit(

+ 39 - 3
src/views/positionAnalysis_manage/detail.vue

@@ -1,15 +1,27 @@
 <template>
   <div class="hasrightaside-box position-analysis-detail-page">
     <div class="detail-top">
-      <span></span>
       <div>
-        <el-button type="primary" @click="refreshData" plain>一键刷新</el-button>
+          <el-date-picker
+            v-model="selectDate"
+            type="date"
+            placeholder="请选择日期"
+            value-format="yyyy-MM-dd"
+            :picker-options="pickerOption"
+            @change="handleOpt('date')"
+            style="margin-right: 10px"
+          />
+          <el-button type="primary" plain @click="handleOpt('beforeDate')">查看前一天</el-button>
+          <el-button type="primary" plain @click="handleOpt('nextDate')" :disabled="disabledNextBtn">查看后一天</el-button>
+        </div>
+      <div>
+        <!-- <el-button type="primary" @click="refreshData" plain>一键刷新</el-button> -->
         <el-button type="primary" @click="handleOpt('beforeClassifyType')">上一个合约</el-button>
         <el-button type="primary" @click="handleOpt('nextClassifyType')">下一个合约</el-button>
       </div>
     </div>
     <div class="content-box detail-content">
-        <chartDetail ref="chartDetailRef"/>
+        <chartDetail ref="chartDetailRef" @setInfo="e => { selectDate=e.date; }"/>
     </div>
    
   </div>
@@ -21,9 +33,33 @@ export default {
   components: { chartDetail },
   data() {
     return {
+      selectDate: ''
     }
   },
+  computed: {
+    pickerOption() {
+      let that = this;
+      let obj = {
+        // 周六日禁用
+        disabledDate(t) {
+          if ([5, 6].includes(that.$moment(t).weekday())) {
+            return true;
+          } else {
+            return false;
+          }
+        },
+      };
+      return obj;
+    },
 
+    disabledNextBtn() {
+      if(this.selectDate) {
+        return new Date(this.selectDate).getTime() >= new Date(this.$refs.chartDetailRef.latestDate).getTime()
+      }else {
+        return true
+      }
+    }
+  },
   methods: {
     // 操作选项
     handleOpt(type){

+ 17 - 7
src/views/ppt_manage/mixins/pptMixins.js

@@ -39,8 +39,12 @@ export default {
       pageLoading:null,//演示时,切换page需要加载图表数据
       publishLoading:null,//发布时loading
       pptCoverList:[],//配置ppt封面
-      pptBgImage:'',
-      pptBackImage:'',
+      pptBgImage:'',//ppt背景图
+      pptBackImage:'',//ppt封底
+      pptCoverCompenyName:'',//封面公司名称
+      pptCoverDepartName:'',//封面部门名称
+      pptCoverTextColor:'',//控制上面两个字段展示的颜色
+
 
       setEnName:false,
       // 传入的formItem所需内容
@@ -56,21 +60,27 @@ export default {
     }
   },
   methods: {
-    //获取ppt配置
+    //获取基本配置-ppt配置
     async getpptConfig(){
         const res = await etaBaseConfigInterence.getBaseConfig()
         if(res.Ret!==200) return 
-        const {CnPptCoverImgs,CnPptBackgroundImg,CnPptBottomImg,
-               EnPptCoverImgs,EnPptBackgroundImg,EnPptBottomImg,
+        const {CnPptCoverImgs,CnPptBackgroundImg,CnPptBottomImg,PptCompanyName,PptTeamName,PptFontColor,
+               EnPptCoverImgs,EnPptBackgroundImg,EnPptBottomImg,PptCompanyNameEn,PptTeamNameEn,PptFontColorEn
               } = res.Data
         if(this.currentLang==='en'){
             this.pptCoverList = EnPptCoverImgs.split(',')
             this.pptBgImage = EnPptBackgroundImg
             this.pptBackImage = EnPptBottomImg
+            this.pptCoverCompenyName = PptCompanyNameEn
+            this.pptCoverDepartName = PptTeamNameEn
+            this.pptCoverTextColor = PptFontColorEn
         }else{
             this.pptCoverList = CnPptCoverImgs.split(',')
             this.pptBgImage = CnPptBackgroundImg
             this.pptBackImage = CnPptBottomImg
+            this.pptCoverCompenyName = PptCompanyName
+            this.pptCoverDepartName = PptTeamName
+            this.pptCoverTextColor = PptFontColor
         }
     },
     //获取ppt详情
@@ -531,7 +541,7 @@ export default {
     //加载iframe
     initSheetIframe(idName,sheetId){
       console.log('init sheet iframe',idName)
-      const LINK_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/sheetshow';
+      const LINK_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/sheetshow';
       $(`#${idName}`).append(`<iframe 
           src='${LINK_URL}?code=${sheetId}' 
           width='100%'
@@ -543,7 +553,7 @@ export default {
     },
     //获取表格iframe的高度,用于ppt转报告
     reInitIframe(e) {
-      const LINK_URLS=[JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow',JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/sheetshow']
+      const LINK_URLS=[this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow',this.$setting.dynamicOutLinks.ChartViewUrl+'/sheetshow']
       if(!LINK_URLS.includes(e.origin)) return
       /* console.log('iframe加载完成',e.data) */
       const { height,code } = e.data;

+ 9 - 9
src/views/ppt_manage/newVersion/components/Cover.vue

@@ -1,23 +1,23 @@
 <template>
-    <div class="flex-column cover" style="width:100%;" v-if="pageInfo">
+    <div class="flex-column cover" :style="`width:100%;color: ${$parent.pptCoverTextColor||'#fff'};`" v-if="pageInfo">
         <!-- <img :src="pageInfo.BackgroundImg" class="pptbg" /> -->
         <!-- <img :src="base64Url" class="pptbg" /> -->
         <img :src="pageInfo.BackgroundImg" class="pptbg"  style="width:100%"/>
         <div
-        style="width:62%; font-size:16px; text-align:center; line-height:1.6; color:#fff; position:absolute; right:20px; top:50%;zIndex:20;">
-        <p style="height:5px; border-top:1px solid #fff;marginBottom:21px;"></p>
+        style="width:62%; font-size:16px; text-align:center; line-height:1.6;  position:absolute; right:20px; top:50%;zIndex:20;">
+        <p :style="`height:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};marginBottom:21px;`"></p>
         <p style="font-size:28px;">{{ pageInfo.Title }}</p>
         <p style="display:flex; align-items:center; justify-content:center;margin:10px 0;">
-            <span style="display:inline-block; width:15px; margin-right:5px; border-top:1px solid #fff;"></span>
-            <span>弘则弥道(上海)投资咨询有限公司</span>
+            <span :style="`display:inline-block; width:15px; margin-right:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};`"></span>
+            <span :style="{'color':$parent.pptCoverTextColor||''}">{{$parent.pptCoverCompenyName||'ETA'}}</span>
             <span
-            style="display:inline-block; width:14px; height:14px; background:#fff; border-radius:100%; margin:0 5px;"></span>
+            :style="`display:inline-block; width:14px; height:14px; background:${$parent.pptCoverTextColor||'#fff'}; border-radius:100%; margin:0 5px;`"></span>
             <span>{{ pageInfo.ReportType }}</span>
-            <span style="display:inline-block; width:15px; margin-left:5px; border-top:1px solid #fff;"></span>
+            <span :style="`display:inline-block; width:15px; margin-left:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};`"></span>
         </p>
-        <p>FICC研究部</p>
+        <p :style="{'color':$parent.pptCoverTextColor||''}">{{$parent.pptCoverDepartName||'投研部'}}</p>
         <p>{{pageInfo.PptDate}}</p>
-        <p style="width:80%; height:1px; border-bottom:1px solid #fff; margin:21px auto 0;"></p>
+        <p :style="`width:80%; height:1px; border-bottom:1px solid ${$parent.pptCoverTextColor||'#fff'}; margin:21px auto 0;`"></p>
         </div>
     </div>
 </template>

+ 7 - 7
src/views/ppt_manage/newVersion/components/CoverEn.vue

@@ -2,20 +2,20 @@
     <div class="flex-column cover" style="width:100%;" v-if="pageInfo">
         <img :src="pageInfo.BackgroundImg" class="pptbg"  style="width:100%"/>
         <div
-        style="width:62%; font-size:16px; text-align:center; line-height:1.6; color:#fff; position:absolute; right:20px; top:50%;zIndex:20;">
-        <p style="height:5px; border-top:1px solid #fff;marginBottom:21px;"></p>
+        :style="`width:62%; font-size:16px; text-align:center; line-height:1.6; color:${$parent.pptCoverTextColor||'#fff'}; position:absolute; right:20px; top:50%;zIndex:20;`">
+        <p :style="`height:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};marginBottom:21px;`"></p>
         <p style="font-size:28px;">{{ pageInfo.Title }}</p>
         <p style="display:flex; align-items:center; justify-content:center;margin:10px 0;">
-            <span>HORIZON INSIGHTS PTE. LTD.</span>
+            <span :style="{'color':$parent.pptCoverTextColor||'#fff'}">{{$parent.pptCoverCompenyName||'ETA'}}</span>
         </p>
         <p style="display:flex; align-items:center; justify-content:center;">
-          <span style="display:inline-block; width:15px; margin-left:5px; border-top:1px solid #fff;"></span>  
+          <span :style="`display:inline-block; width:15px; margin-left:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};`"></span>  
           <span>{{ pageInfo.ReportType }}</span>
-          <span style="display:inline-block; width:15px; margin-left:5px; border-top:1px solid #fff;"></span>
+          <span :style="`display:inline-block; width:15px; margin-left:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};`"></span>
         </p>
-        <p>FICC Research Department</p>
+        <p :style="{'color':$parent.pptCoverTextColor||'#fff'}">{{$parent.pptCoverDepartName||'Research Department'}}</p>
         <p>{{pageInfo.PptDate}}</p>
-        <p style="width:80%; height:1px; border-bottom:1px solid #fff; margin:21px auto 0;"></p>
+        <p :style="`width:80%; height:1px; border-bottom:1px solid ${$parent.pptCoverTextColor||'#fff'}; margin:21px auto 0;`"></p>
         </div>
     </div>
 </template>

+ 3 - 1
src/views/ppt_manage/newVersion/components/catalog/pptContent.vue

@@ -144,7 +144,8 @@ export default {
         await this.initPageElements(this.pageList[i],'show')
       } 
       this.isLoadBack = true
-      this.loadArr.push({name:'back'})
+      if(this.pptBackImage.length)
+        this.loadArr.push({name:'back'})
 
       //获取已加载图表的信息
       let chartInfoMap = {}
@@ -241,6 +242,7 @@ export default {
     },
     //计算title的字节数
     getStrCount(title){
+        if(!title) return
         return countStrSize(title)
     }
   },

+ 3 - 1
src/views/ppt_manage/newVersion/components/catalog/pptContentEn.vue

@@ -140,7 +140,8 @@ export default {
         await this.initPageElements(this.pageList[i],'show')
       }
       this.isLoadBack = true
-      this.loadArr.push({name:'back'})
+      if(this.pptBackImage.length)
+        this.loadArr.push({name:'back'})
       //获取已加载图表的信息
       let chartInfoMap = {}
       for(let i=1;i<this.loadArr.length-1;i++){
@@ -236,6 +237,7 @@ export default {
     },
     //计算title的字节数
     getStrCount(title){
+        if(!title) return
         return countStrSize(title)
     }
   },

+ 26 - 11
src/views/ppt_manage/newVersion/components/editor/ChooseCover.vue

@@ -6,35 +6,37 @@
                 <img src="~@/assets/img/ppt_m/close.png" alt="" class="close_ico" @click="closeDialog">
             </header>
             <div class="dialog-bg" :style="'backgroundImage:url('+bgList[bgListIndex]+');backgroundPosition:center;backgroundRepeat:no-repeat;backgroundSize:cover;'">
-                <div style="width:62%; font-size:16px; text-align:center; line-height:1.6; color:#fff; position:absolute; right:20px; top:50%;">
-                    <p style="height:5px; border-top:1px solid #fff;margin-bottom:21px;"></p>
+                <div :style="`width:62%; font-size:16px; text-align:center; line-height:1.6; color:${$parent.pptCoverTextColor}; position:absolute; right:20px; top:50%;`">
+                    <p :style="`height:5px; border-top:1px solid ${$parent.pptCoverTextColor};margin-bottom:21px;`"></p>
                     <el-input
+                      :data-textcolor="$parent.pptCoverTextColor"
                       type="textarea"
                       autosize
                       placeholder="请输入标题"
                       :maxlength="48"
                       v-model="pageData.Title" />
                     <p style="display:flex; align-items:center; justify-content:center;margin:10px 0;">
-                        <span style="display:inline-block; width:15px; margin-right:5px; border-top:1px solid #fff;"></span>
-                        <span>弘则弥道(上海)投资咨询有限公司</span>
-                        <span style="display:inline-block; width:14px; height:14px; background:#fff; border-radius:100%; margin:0 5px;"></span>
+                        <span style="display:inline-block; width:15px; margin-right:5px; border-top:1px solid $parent.pptCoverTextColor;"></span>
+                        <span :style="{'color':$parent.pptCoverTextColor||''}">{{$parent.pptCoverCompenyName||'ETA'}}</span>
+                        <span :style="`display:inline-block; width:14px; height:14px; background:${$parent.pptCoverTextColor}; border-radius:100%; margin:0 5px;`"></span>
                         <input 
                         type="text" 
-                        style="width:80px;background:transparent;color:#fff;border:none;text-align:center;display:inline-block" 
+                        :style="`width:80px;background:transparent;color:${$parent.pptCoverTextColor};border:none;text-align:center;display:inline-block`" 
                         v-model="pageData.ReportType"
                         placeholder="请输入类型">
-                        <span style="display:inline-block; width:15px; margin-left:5px; border-top:1px solid #fff;"></span>
+                        <span :style="`display:inline-block; width:15px; margin-left:5px; border-top:1px solid ${$parent.pptCoverTextColor};`"></span>
                     </p>
-                    <p>FICC研究部</p>
+                    <p :style="{'color':$parent.pptCoverTextColor||''}">{{$parent.pptCoverDepartName||'投研部'}}</p>
                     <el-date-picker
                         v-model="pageData.PptDate"
+                        :data-textcolor="$parent.pptCoverTextColor"
                         type="month"
                         ref="date_pic"
                         format="yyyy年M月"
                         value-format="yyyy年M月"
                         placeholder="请选择日期">
                     </el-date-picker>
-                    <p style="width:80%; height:1px; border-bottom:1px solid #fff; margin:21px auto 0;"></p>
+                    <p :style="`width:80%; height:1px; border-bottom:1px solid ${$parent.pptCoverTextColor}; margin:21px auto 0;`"></p>
                 </div>
             </div>
             <div class="dialog-bot">
@@ -68,7 +70,7 @@ export default {
         };
     },
     mounted(){
-        $('.el-date-editor .el-input__inner').css({backgroundColor: 'transparent',border:'none',color:'#fff',textAlign:'center',fontSize:'16px'});
+        $('.el-date-editor .el-input__inner').css({backgroundColor: 'transparent',border:'none',color:this.$parent.pptCoverTextColor||'#fff',textAlign:'center',fontSize:'16px'});
 		$('.el-date-editor .el-icon-date' ).css({display:'none'});
         this.bgList = this.pptCoverList
         this.searchIndex = this.bgList.findIndex(i=>i===this.firstPage.BackgroundImg)
@@ -123,6 +125,7 @@ export default {
     .dialog-bg{
       .el-textarea{
         max-width: 95%;
+        --text-color:attr(data-textcolor);
         textarea{
           outline: none;
           border: none;
@@ -132,7 +135,10 @@ export default {
           text-align: center;
           resize: none;
           font-weight:bolder; 
-          color: #fff;
+          color:var(--text-color);
+          &::placeholder{
+            color:var(--text-color);
+          }
           scrollbar-width: none; 
           -ms-overflow-style: none;
           &::-webkit-scrollbar {
@@ -140,6 +146,15 @@ export default {
           }
         }
       }
+      .el-date-editor{
+        --text-color:attr(data-textcolor);
+          .el-input__inner::placeholder{
+            color:var(--text-color);
+          }
+          .el-input__suffix{
+            color:var(--text-color);
+          }
+      }
     }
   }
 }

+ 26 - 10
src/views/ppt_manage/newVersion/components/editor/ChooseCoverEn.vue

@@ -6,36 +6,38 @@
                 <img src="~@/assets/img/ppt_m/close.png" alt="" class="close_ico" @click="closeDialog">
             </header>
             <div class="dialog-bg" :style="'backgroundImage:url('+bgList[bgListIndex]+');backgroundPosition:center;backgroundRepeat:no-repeat;backgroundSize:cover;'">
-                <div style="width:62%; font-size:16px; text-align:center; line-height:1.6; color:#fff; position:absolute; right:20px; top:50%;">
-                    <p style="height:5px; border-top:1px solid #fff;margin-bottom:21px;"></p>
+                <div :style="`width:62%; font-size:16px; text-align:center; line-height:1.6; color:${$parent.pptCoverTextColor||'#fff'}; position:absolute; right:20px; top:50%;`">
+                    <p :style="`height:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};margin-bottom:21px;`"></p>
                     <el-input
+                      :data-textcolor="$parent.pptCoverTextColor"
                       type="textarea"
                       autosize
                       placeholder="请输入标题"
                       :maxlength="48"
                       v-model="pageData.Title" />
                     <p style="display:flex; align-items:center; justify-content:center;margin:10px 0;">
-                        <span>HORIZON INSIGHTS PTE. LTD.</span>
+                        <span :style="{'color':$parent.pptCoverTextColor||''}">{{$parent.pptCoverCompenyName||'ETA'}}</span>
                     </p>
                     <p style="display:flex; align-items:center; justify-content:center;">
-                      <span style="display:inline-block; width:15px; margin-left:5px; border-top:1px solid #fff;"></span>
+                      <span :style="`display:inline-block; width:15px; margin-left:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};`"></span>
                       <input 
                         type="text" 
-                        style="width:80px;background:transparent;color:#fff;border:none;text-align:center;display:inline-block" 
+                        :style="`width:80px;background:transparent;color:${$parent.pptCoverTextColor||'#fff'};border:none;text-align:center;display:inline-block`" 
                         v-model="pageData.ReportType"
                         placeholder="请输入类型"/>
-                        <span style="display:inline-block; width:15px; margin-left:5px; border-top:1px solid #fff;"></span>
+                        <span :style="`display:inline-block; width:15px; margin-left:5px; border-top:1px solid ${$parent.pptCoverTextColor||'#fff'};`"></span>
                     </p>
-                    <p>FICC Research Department</p>
+                    <p :style="{'color':$parent.pptCoverTextColor||''}">{{$parent.pptCoverDepartName||'Research Department'}}</p>
                     <el-date-picker
                         v-model="pageData.PptDate"
+                        :data-textcolor="$parent.pptCoverTextColor"
                         type="month"
                         ref="date_pic"
                         format="yyyy.MM"
                         value-format="yyyy.MM"
                         placeholder="请选择日期">
                     </el-date-picker>
-                    <p style="width:80%; height:1px; border-bottom:1px solid #fff; margin:21px auto 0;"></p>
+                    <p :style="`width:80%; height:1px; border-bottom:1px solid ${$parent.pptCoverTextColor||'#fff'}; margin:21px auto 0;`"></p>
                 </div>
             </div>
             <div class="dialog-bot">
@@ -69,7 +71,7 @@ export default {
         };
     },
     mounted(){
-        $('.el-date-editor .el-input__inner').css({backgroundColor: 'transparent',border:'none',color:'#fff',textAlign:'center',fontSize:'16px'});
+        $('.el-date-editor .el-input__inner').css({backgroundColor: 'transparent',border:'none',color:this.$parent.pptCoverTextColor||'#fff',textAlign:'center',fontSize:'16px'});
 		$('.el-date-editor .el-icon-date' ).css({display:'none'});
         this.bgList = this.pptCoverList
         this.searchIndex = this.bgList.findIndex(i=>i===this.firstPage.BackgroundImg)
@@ -126,6 +128,7 @@ export default {
     .dialog-bg{
       .el-textarea{
         max-width: 95%;
+        --text-color:attr(data-textcolor);
         textarea{
           outline: none;
           border: none;
@@ -135,14 +138,27 @@ export default {
           text-align: center;
           resize: none;
           font-weight:bolder; 
-          color: #fff;
+          /* color: #fff; */
           scrollbar-width: none; 
           -ms-overflow-style: none;
+          color:var(--text-color);
+          &::placeholder{
+            color:var(--text-color);
+          }
           &::-webkit-scrollbar {
             width: 0px;
           }
         }
       }
+      .el-date-editor{
+        --text-color:attr(data-textcolor);
+          .el-input__inner::placeholder{
+            color:var(--text-color);
+          }
+          .el-input__suffix{
+            color:var(--text-color);
+          }
+      }
     }
   }
 }

+ 1 - 0
src/views/ppt_manage/newVersion/pptEditor.vue

@@ -1227,6 +1227,7 @@ export default {
   },
   updated(){
     $('.ppt-item').css('height',$('.ppt-item').width()*0.7);
+    $('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
     window.onresize = ()=>{
       $('.ppt-item').css('height',$('.ppt-item').width()*0.7);
     }

+ 1 - 0
src/views/ppt_manage/newVersion/pptEnEditor.vue

@@ -1202,6 +1202,7 @@ export default {
   },
   updated(){
     $('.ppt-item').css('height',$('.ppt-item').width()*0.7);
+    $('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
     window.onresize = ()=>{
       $('.ppt-item').css('height',$('.ppt-item').width()*0.7);
     }

+ 3 - 3
src/views/ppt_manage/newVersion/pptEnPublish.vue

@@ -394,10 +394,10 @@ export default {
       const coverInfo = [
         {text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
-        {text:`\nHORIZON INSIGHTS PTE. LTD.`,
+        {text:`\n${this.pptCoverCompenyName||'ETA'}`,
          options:{fontSize:16*0.75,breakLine:true}},
         {text:`\n — ${this.coverInfo.page.ReportType} —`,options:{fontSize:16*0.75,breakLine:true}}, 
-        {text:'\nFICC Research Department',options:{fontSize:16*0.75,breakLine:true}},
+        {text:`\n${this.pptCoverDepartName||'Research Department'}`,options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
         {text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
       ]
@@ -406,7 +406,7 @@ export default {
         y:'50%',
         w:'60%',
         h:'28%',
-        color:'ffffff',
+        color:(this.pptCoverTextColor||'#ffffff').slice(1),
         align:'center',
         fontFace:'SimHei'
       })

+ 3 - 3
src/views/ppt_manage/newVersion/pptPublish.vue

@@ -474,9 +474,9 @@ export default {
       const coverInfo = [
         {text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
-        {text:`\n— 弘则弥道(上海)投资咨询有限公司 ● ${this.coverInfo.page.ReportType} —`,
+        {text:`\n— ${this.pptCoverCompenyName||'ETA'} ● ${this.coverInfo.page.ReportType} —`,
          options:{fontSize:16*0.75,breakLine:false}},
-        {text:'\nFICC研究部',options:{fontSize:16*0.75,breakLine:true}},
+        {text:`\n${this.pptCoverDepartName||'投研部'}`,options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
         {text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
       ]
@@ -485,7 +485,7 @@ export default {
         y:'50%',
         w:'60%',
         h:'28%',
-        color:'ffffff',
+        color:(this.pptCoverTextColor||'#ffffff').slice(1),
         align:'center',
         fontFace:'SimHei'
       })

+ 3 - 3
src/views/predictEdb_manage/components/chartInfo.vue

@@ -169,15 +169,15 @@ export default {
         // 曲线图/季节图切换
         chartTypeChange(){
             this.chartInfo.ChartType=this.chartInfo.ChartType==1?2:1
-            this.$emit('refreshData')
+            this.$emit('refreshData','saveLimit')
         },
 
         seasonYearChange(){
-            this.$emit('refreshData')
+            this.$emit('refreshData','saveLimit')
         },
 
         seasonTypeChange2(){
-            this.$emit('refreshData')
+            this.$emit('refreshData','saveLimit')
         }
     },
 }

+ 49 - 15
src/views/predictEdb_manage/predictEdb.vue

@@ -823,21 +823,55 @@ export default {
 
 			const { Data } = await preDictEdbInterface.classifyDelCheck({ ClassifyId,EdbInfoId })
 
-			const { DeleteStatus } = Data;
-
-			DeleteStatus === 1 
-			? this.$confirm('该分类下关联指标不可删除', '删除失败', {
-				confirmButtonText: '知道了',
-				showCancelButton: false,
-				type: 'error',
-			}) : DeleteStatus === 0 && !EdbInfoId
-			?  this.$confirm('确定删除当前分类吗?', '提示', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			}).then(() => {
-				this.delApi(ClassifyId, EdbInfoId)
-			}): null;
+			const { DeleteStatus,TipsMsg } = Data;
+
+			// DeleteStatus === 1 
+			// ? this.$confirm('该分类下关联指标不可删除', '删除失败', {
+			// 	confirmButtonText: '知道了',
+			// 	showCancelButton: false,
+			// 	type: 'error',
+			// }) : DeleteStatus === 0 && !EdbInfoId
+			// ?  this.$confirm('确定删除当前分类吗?', '提示', {
+			// 	confirmButtonText: '确定',
+			// 	cancelButtonText: '取消',
+			// 	type: 'warning',
+			// }).then(() => {
+			// 	this.delApi(ClassifyId, EdbInfoId)
+			// }): null;
+
+			/**
+			 * 0 可删除
+			 * 1 关联指标
+			 * 2 有子目录无指标
+			*/
+			const deleteLabelMap = {
+				1: '该目录关联指标不可删除',
+				2: '确认删除当前目录及包含的子目录吗?',
+				3: '当前指标已用作画图,不可删除',
+				4: TipsMsg
+			}
+
+			if([1,3,4].includes(DeleteStatus)) this.$confirm(
+					deleteLabelMap[DeleteStatus],
+					'删除失败',
+					{
+					confirmButtonText: '知道了',
+					showCancelButton:false,
+					type: 'error'
+				})
+			else if([0,2].includes(DeleteStatus)) this.$confirm(
+					DeleteStatus === 2 
+					? deleteLabelMap[DeleteStatus]
+					: EdbInfoId?'删除后指标和指标值均不可使用,确认删除吗?':'确定删除当前目录吗?', 
+					'提示',
+					{
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					type: 'warning'
+				}).then(() => {
+					this.delApi(ClassifyId, EdbInfoId)
+				}).catch(() => {         
+				});
 
     },
 

+ 1 - 1
src/views/report_manage/addreportNew.vue

@@ -688,7 +688,7 @@ export default {
 			}
 			//插入内容
 			let htmlStr=''
-			const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+			const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
 			
 			data.forEach(item=>{
 				const t=new Date().getTime()

+ 1 - 1
src/views/report_manage/editChapterReport.vue

@@ -744,7 +744,7 @@ export default {
       }
       //插入内容
       let htmlStr = "";
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
 
       data.forEach((item) => {
         const t = new Date().getTime();

+ 1 - 1
src/views/report_manage/editreportNew.vue

@@ -677,7 +677,7 @@ export default {
 			}
 			//插入内容
 			let htmlStr=''
-			const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+			const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
 			
 			data.forEach(item=>{
 				const t=new Date().getTime()

+ 1 - 1
src/views/report_manage/mixins/editor.js

@@ -117,7 +117,7 @@ export default {
         selection.addRange(this.lastEditRange);
       }
       //插入内容
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
       this.$nextTick(() => {
         this.editor.html.insert(
           `<p style='text-align:left; margin-top:10px;'>

+ 3 - 3
src/views/report_manage/mixins/messagePush.js

@@ -1,4 +1,5 @@
 import { reportadd, reportedit, messagePushPost,dataBaseInterface,reportMessageSend } from "@/api/api.js";
+import { getUrlParams } from '@/utils/common'
 export default {
   data() {
     return {
@@ -68,13 +69,12 @@ export default {
       $('iframe').each((k,i) => {
         try {
           let href = $(i).attr('src');
-          code_arr.push(href.slice(href.indexOf('code=') + 5));
+          code_arr.push(getUrlParams(href,'code'));
     
         } catch (err) {
         }
       });
-      
-      // console.log(code_arr);
+
       if(!code_arr.length) return this.$message.warning('请插入图表');
 
       const loading = this.$loading({

+ 2 - 2
src/views/report_manage/mixins/reportMixin.js

@@ -202,7 +202,7 @@ export default {
       if (item.Disabled)
         return this.$message.warning("内部图表,不允许插入报告");
 
-      const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
       let fromPage = this.$route.path === "/reportEnEditor" ? "en" : "";
       this.$nextTick(() => {
         this.editor.html.insert(
@@ -215,7 +215,7 @@ export default {
 
     /* 插入表格 */
     insertSheet(item) {
-      const LINK_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/sheetshow';
+      const LINK_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/sheetshow';
       this.$nextTick(() => {
         this.editor.html.insert(
           `<p style='text-align:left; margin-top:10px;'>

+ 1 - 1
src/views/report_manage/reportEn/reportEditor.vue

@@ -712,7 +712,7 @@ export default {
 			}
 			//插入内容
 			let htmlStr=''
-			const LINK_CHART_URL = JSON.parse(localStorage.getItem('dynamicOutLinks')).ChartViewUrl+'/chartshow';
+			const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
 			let fromPage = this.$route.path === '/reportEnEditor' ? 'en' :'';
 			
 			data.forEach(item=>{

+ 5 - 5
src/views/system_manage/components/addUserDialog.vue

@@ -9,7 +9,7 @@
         <el-form @submit.native.prevent :model="userForm" :rules="userRule" ref="userForm" label-width="100px"
             class="demo-ruleForm" style="marginTop:15px;">
             <el-form-item label="登录账号" prop="account">
-                <el-input v-model="userForm.account" placeholder="建议使用邮箱前缀或者手机号码" clearable>
+                <el-input v-model="userForm.account" placeholder="建议使用邮箱前缀或者手机号码" :disabled="userForm.disabledForm" clearable>
                 </el-input>
             </el-form-item>
             <el-form-item label="登录密码" prop="pwd" v-if="userForm.title == '添加用户'">
@@ -21,19 +21,19 @@
                 </el-input>
             </el-form-item>
             <el-form-item label="手机号码" prop="mobile">
-                <el-input v-model="userForm.mobile" placeholder="请输入手机号码" clearable>
+                <el-input v-model="userForm.mobile" placeholder="请输入手机号码" :disabled="userForm.disabledForm" clearable>
                 </el-input>
             </el-form-item>
             <el-form-item label="所属部门" prop="depart" v-if="userForm.title == '添加用户'">
                 <el-cascader :options="departArr" v-model="userForm.depart" :props="form_departProp"
-                    placeholder="请选择部门分组" clearable>
+                    placeholder="请选择部门分组" :disabled="userForm.disabledForm" clearable>
                 </el-cascader>
             </el-form-item>
             <el-form-item label="工号" prop="employeeNumber">
                 <el-input :disabled="hasEmployeeNo" v-model="userForm.employeeNumber" placeholder="请输入工号"></el-input>
             </el-form-item>
             <el-form-item label="分配角色" prop="role">
-                <el-select v-model="userForm.role" placeholder="分配角色" @change="roleChange">
+                <el-select v-model="userForm.role" placeholder="分配角色" :disabled="userForm.disabledForm" @change="roleChange">
                     <el-option v-for="item in roleArr" :key="item.RoleId" :label="item.RoleName" :value="item.RoleId">
                     </el-option>
                 </el-select>
@@ -54,7 +54,7 @@
                         @selected="selectRegion"/>
             </el-form-item>
             <el-form-item label="状态" prop="status">
-                <el-radio-group v-model="userForm.status">
+                <el-radio-group v-model="userForm.status" :disabled="userForm.disabledStatus">
                     <el-radio :label="1">启用</el-radio>
                     <el-radio :label="0">禁用</el-radio>
                 </el-radio-group>

+ 47 - 6
src/views/system_manage/departManage.vue

@@ -3,7 +3,7 @@
 		<div class="left_cont">
 			<div class="company_top" @click="initDepart">
 				<img src="~@/assets/img/set_m/home_ico.png" alt="" style="width:30px;height:30px;">
-				<span :class="!defaultGroup&&!defaultDepart?'act':''">弘则研究</span>
+				<span :class="!defaultGroup&&!defaultDepart?'act':''">{{isTrail?global.company_name:'弘则研究'}}</span>
 			</div>
 			<el-tree
 				ref="departTree"
@@ -23,9 +23,11 @@
 					<span>{{ node.label }}</span>
 					<span style="display:flex;alignItems:center;" v-show="act_node===data.unicodeKey">
                         <img src="~@/assets/img/data_m/move_ico.png" alt="" style="width:12px;height:12px;marginRight:10px;" @click.stop>
-						<img src="~@/assets/img/set_m/add.png" alt="" style="width:12px;height:12px;marginRight:10px;" @click.stop="addNode(data)" v-if="data.IsDepartment">
+						<img src="~@/assets/img/set_m/add.png" alt="" style="width:12px;height:12px;marginRight:10px;" @click.stop="addNode(data)" 
+						v-if="data.IsDepartment && (!isTrail || (isTrail && data.canEdit))">
 						<img src="~@/assets/img/set_m/add.png" alt="" style="width:12px;height:12px;marginRight:10px;" @click.stop="addNode(data)" v-if="data.IsGroup">
-						<img src="~@/assets/img/set_m/edit.png" alt="" style="width:12px;height:12px;marginRight:10px;" @click.stop="editNode(data)">
+						<img src="~@/assets/img/set_m/edit.png" alt="" style="width:12px;height:12px;marginRight:10px;" @click.stop="editNode(data)"
+						v-if="(!isTrail) || (data.canEdit||data.IsGroup)">
 						<el-popconfirm
 						@onConfirm="removeNode(node,data)"
 						confirmButtonText='删除'
@@ -34,7 +36,7 @@
 						icon="el-icon-info"
 						iconColor="red"
 						title="确定删除吗"
-						v-if="data.DepartmentId!=shareCustomDepartmentId"
+						v-if="data.DepartmentId!=shareCustomDepartmentId && (!isTrail || (isTrail && (data.canEdit || data.IsGroup)))"
 						>
 						<!-- 共享客户组不允许删除 -->
 							<img slot="reference" src="~@/assets/img/set_m/del.png" alt="" style="width:12px;height:12px;marginTop:4px">
@@ -109,7 +111,8 @@
 					<el-table-column label="操作" align="center" width="300">
 						<template slot-scope="scope">
 							<div style="color:#4099ef; font-size:24px;display: flex;gap:0 10px;">
-								<span v-permission="permissionBtn.sysDepartPermission.sysDepart_saveUser"
+								<span  v-permission="permissionBtn.sysDepartPermission.sysDepart_saveUser"
+								v-if="!isTrail || (!(scope.row.DepartmentGroup=='ETA试用客户'&&scope.row.Enabled===0))"
 									class="editsty" @click.stop="editUser(scope.row)">编辑</span>
 								<span v-permission="permissionBtn.sysDepartPermission.sysDepart_resetPass"
 									class="editsty" @click.stop="resetPassWord(scope.row)">重置密码</span>
@@ -503,6 +506,7 @@ import { departInterence } from '@/api/api.js';
 import http from '@/api/http.js'
 import md5 from '@/utils/md5.js';
 import mixin from './mixin/departManageMixin.js';
+import global from '@/config/setting'
 //自定义省市数据
 import{province_sorce,city_sorce} from '@/utils/distpicker'; 
 export default {
@@ -530,6 +534,7 @@ export default {
         }
 		}
 		return {
+			global,
 			isAddDepart:false,//添加部门弹窗
 			departForm:{
 				title:"添加部门",
@@ -593,6 +598,9 @@ export default {
 				mobile:'',
 				auth:0,
 				status:1,//状态 1启用 0禁用
+				disabledForm:false,//是否禁用表单的某些选项
+				disabledStatus:false,//是否禁用表单的状态项
+				departmentName:'',//所属一级部门名称
 			},//用户弹框表单
 			// 是否有工号
 			hasEmployeeNo:false,
@@ -690,6 +698,24 @@ export default {
 	watch: {
 		click_roleId() {
 			this.getAuth();
+		},
+		isAddUser(val){
+     	if(val&&this.userForm.title==="编辑用户"){
+				//检查编辑的是否是属于ETA试用客户部门的客户
+				if(this.userForm.departmentName==='ETA试用客户' && this.isTrail){
+					this.userForm.disabledForm = true
+					//若用户状态为启用,则允许编辑状态,若为禁用,则无法编辑状态
+          this.userForm.disabledStatus = this.userForm.status===0?true:false
+				}
+      }
+    }
+	},
+	computed:{
+		// 有些是试用平台独有的内容和判断
+		// 是否是eta试用
+		isTrail(){
+			// console.log(this.$store.state.businessCode,this.$store.state.TRIAL_CODE,'this.$store.state.businessCode == this.$store.state.TRIAL_CODE');
+			return this.$store.state.businessCode == this.$store.state.TRIAL_CODE
 		}
 	},
 	created() {
@@ -732,6 +758,18 @@ export default {
 			departInterence.getDepartList().then(res => {
 				if(res.Ret === 200) {
 					this.departArr = res.Data.List || []
+					if(this.isTrail){
+						this.departArr = this.departArr.map(item=>{
+							//如果部门为ETA试用客户,则屏蔽所有操作
+							if(item.DepartmentName==='ETA试用客户'){
+								item.disabled = true
+								item.canEdit = false
+							}else{
+								item.canEdit = true
+							}
+							return item
+						})
+					}
 					//给节点增加唯一key和parentkey
 					this.departArr = this.departArr.map(depart=>{
 						depart.unicodeKey='depart_'+depart.DepartmentId
@@ -1307,7 +1345,10 @@ export default {
 				mobile:item.Mobile,
 				auth:item.Authority,
 				status:item.Enabled,
-				direct:direct
+				direct:direct,
+				departmentName:item.DepartmentGroup,
+        disabledForm:false,
+				disabledStatus:false
 			}
 			this.hasEmployeeNo=!!item.EmployeeId
 			this.isAddUser = true;

+ 35 - 0
src/views/system_manage/etaBaseConfig.vue

@@ -42,6 +42,18 @@
                     <el-radio-button label="en">英文PPT</el-radio-button>
                 </el-radio-group>
                 <div v-if="isShowPPT" v-show="pptLang === 'cn'" class="ppt-form-item-wrap">
+                    <div class="inner-input-wrap">
+                        <el-form-item label="公司名称" prop="PptCompanyName">
+                            <el-input type="text" v-model="formData.PptCompanyName"></el-input>
+                        </el-form-item>
+                        <el-form-item label="团队名称" prop="PptTeamName">
+                            <el-input type="text" v-model="formData.PptTeamName"></el-input>
+                        </el-form-item>
+                        <el-form-item label="字体颜色" prop="PptFontColor">
+                            <el-input type="color" style="width:100px;" v-model="formData.PptFontColor"></el-input>
+                        </el-form-item>
+                    </div>
+                    
                     <el-form-item label="PPT封面图" prop="CnPptCoverImgs">
                         <div class="input-line" style="display:flex;">
                             <ImgUpload 
@@ -80,6 +92,17 @@
                     </el-form-item>
                 </div>
                 <div v-if="isShowEnPPT" v-show="pptLang === 'en'" class="ppt-form-item-wrap">
+                    <div class="inner-input-wrap">
+                        <el-form-item label="公司名称" prop="PptCompanyNameEn">
+                            <el-input type="text" v-model="formData.PptCompanyNameEn"></el-input>
+                        </el-form-item>
+                        <el-form-item label="团队名称" prop="PptTeamNameEn">
+                            <el-input type="text" v-model="formData.PptTeamNameEn"></el-input>
+                        </el-form-item>
+                        <el-form-item label="字体颜色" prop="PptFontColorEn">
+                            <el-input type="color" style="width:100px;" v-model="formData.PptFontColorEn"></el-input>
+                        </el-form-item>
+                    </div>
                     <el-form-item label="PPT封面图" prop="EnPptCoverImgs">
                         <div class="input-line" style="display:flex;">
                             <ImgUpload 
@@ -447,6 +470,18 @@ export default {
                 width:100%;
                 display: flex;
                 justify-content: space-between;
+                flex-wrap: wrap;
+                .inner-input-wrap{
+                    width: 100%;
+                    display: flex;
+                    justify-content: space-between;
+                    >.el-form-item{
+                        width:30%;
+                    }
+                }
+                >.el-form-item{
+                    width:30%;
+                }
             }
         }
     }

+ 3 - 0
src/vuex/index.js

@@ -6,6 +6,7 @@ import ppt from "./modules/ppt";
 import edb from "./modules/edb";
 import permissionButton from "./modules/permissionButton";
 
+
 // 应用初始状态
 const state = {
   theme: "#409EFF",
@@ -26,6 +27,8 @@ const state = {
   breadSelfName: '',//面包屑自定义当前页面name
 
   dynamicOutLinks:{},//外部动态链接配置 iframe链接 研报详情分享link
+  businessCode:"", //商家code
+  TRIAL_CODE:"e069d0a024e09636a1225e72a964b4b6", //试用平台的 商家code
 };
 
 export default {

+ 8 - 1
src/vuex/mutations.js

@@ -1,3 +1,4 @@
+import setting from '@/mixins/theme.js'
 // 定义所需的 mutations
 const mutations = {
   SET_THEME: (state, color) => {
@@ -25,7 +26,13 @@ const mutations = {
         }
     });
     localStorage.setItem('dynamicOutLinks',JSON.stringify(filterObj))
-    state.dynamicOutLinks = filterObj;
+    state.dynamicOutLinks = filterObj; 
+    setting.dynamicOutLinks = state.dynamicOutLinks;
+
+  },
+  //设置商家code
+  SET_BUSINESS_CODE(state,code) {
+    state.businessCode = code || ""
   }
 };