Sfoglia il codice sorgente

Merge branch 'lang_dev' into lang_db

bding 1 anno fa
parent
commit
1a77477d74
100 ha cambiato i file con 8345 aggiunte e 428 eliminazioni
  1. 8 8
      index.html
  2. 10 2
      src/api/api.js
  3. 10 0
      src/api/modules/chartApi.js
  4. 139 1
      src/api/modules/thirdBaseApi.js
  5. BIN
      src/assets/icons/menu/2VjyIToUNbtlLeQj0jn6jRN1LZ2I.png
  6. BIN
      src/assets/icons/menu/JAwRFxOjZCQ1qfAwLQzd9q23B7JO.png
  7. BIN
      src/assets/icons/menu/OKobqhVdWm0TkAFiimA8pxvPl1fk.png
  8. BIN
      src/assets/icons/menu/data_source.png
  9. BIN
      src/assets/icons/menu/english_ppt.png
  10. BIN
      src/assets/icons/menu/eta_chart.png
  11. BIN
      src/assets/icons/menu/eta_data.png
  12. BIN
      src/assets/icons/menu/eta_logic.png
  13. BIN
      src/assets/icons/menu/eta_predict_data.png
  14. BIN
      src/assets/icons/menu/eta_table.png
  15. BIN
      src/assets/icons/menu/my_eta.png
  16. BIN
      src/assets/icons/menu/out_link.png
  17. BIN
      src/assets/icons/menu/position_analysis.png
  18. BIN
      src/assets/icons/menu/ppt.png
  19. BIN
      src/assets/icons/menu/product_price.png
  20. BIN
      src/assets/icons/menu/semantic_analysis.png
  21. BIN
      src/assets/icons/menu/statistic_analysis.png
  22. BIN
      src/assets/icons/menu/supply_analysis.png
  23. BIN
      src/assets/icons/menu/system_manager.png
  24. BIN
      src/assets/icons/menu/yb_manager.png
  25. 8 41
      src/components/lzTable.vue
  26. 80 0
      src/lang/commonLang.js
  27. 27 2
      src/lang/modules/SandboxManage/SandFlow.js
  28. 6 0
      src/lang/modules/SandboxManage/SandList.js
  29. 16 3
      src/main.js
  30. 28 0
      src/routes/modules/dataRoutes.js
  31. 4 1
      src/utils/buttonConfig.js
  32. 24 0
      src/utils/common.js
  33. 31 3
      src/views/Home.vue
  34. 189 97
      src/views/Login.vue
  35. 15 18
      src/views/dataEntry_manage/addChart.vue
  36. 9 5
      src/views/dataEntry_manage/chartSetting.vue
  37. 5 4
      src/views/dataEntry_manage/components/barOptionSection.vue
  38. 2 0
      src/views/dataEntry_manage/components/chart.vue
  39. 50 47
      src/views/dataEntry_manage/components/markersSection.vue
  40. 96 0
      src/views/dataEntry_manage/css/coalCommon.scss
  41. 16 10
      src/views/dataEntry_manage/editChart.vue
  42. 79 25
      src/views/dataEntry_manage/mixins/addOreditMixin.js
  43. 121 2
      src/views/dataEntry_manage/mixins/chartPublic.js
  44. 540 0
      src/views/dataEntry_manage/thirdBase/FwmtData.vue
  45. 388 0
      src/views/dataEntry_manage/thirdBase/coalWord.vue
  46. 279 0
      src/views/dataEntry_manage/thirdBase/gqExchangeData.vue
  47. 292 0
      src/views/dataEntry_manage/thirdBase/icpiConsumption.vue
  48. 15 0
      src/views/datasheet_manage/addSheet.vue
  49. 37 32
      src/views/datasheet_manage/components/MixedTable.vue
  50. 14 2
      src/views/datasheet_manage/components/SheetExcel.vue
  51. 34 20
      src/views/datasheet_manage/customSheetEdit.vue
  52. 32 18
      src/views/datasheet_manage/mixedSheetEdit.vue
  53. 64 7
      src/views/datasheet_manage/sheetList.vue
  54. 2 2
      src/views/edbHistoryPage.vue
  55. 4 0
      src/views/login_manage/ForgetPassModel.vue
  56. 11 4
      src/views/mychart_manage/components/chartDetailDia.vue
  57. 1 1
      src/views/mychart_manage/index.vue
  58. 114 1
      src/views/ppt_manage/mixins/mixins.js
  59. 9 1
      src/views/ppt_manage/mixins/pptMixins.js
  60. 11 4
      src/views/ppt_manage/newVersion/components/editor/AddFormat.vue
  61. 7 1
      src/views/ppt_manage/newVersion/components/editor/ChangeFormatDialog.vue
  62. 111 0
      src/views/ppt_manage/newVersion/components/formatPage/FormatEle.vue
  63. 121 0
      src/views/ppt_manage/newVersion/components/formatPage/FormatTen.vue
  64. 115 0
      src/views/ppt_manage/newVersion/components/formatPage/FormatTwelve.vue
  65. 40 0
      src/views/ppt_manage/newVersion/components/formatPreview/FormatPreEle.vue
  66. 44 0
      src/views/ppt_manage/newVersion/components/formatPreview/FormatPreTen.vue
  67. 41 0
      src/views/ppt_manage/newVersion/components/formatPreview/FormatPreTwelve.vue
  68. 16 2
      src/views/ppt_manage/newVersion/pptPublish.vue
  69. 192 3
      src/views/ppt_manage/newVersion/utils/config.js
  70. 47 4
      src/views/ppt_manage/newVersion/utils/untils.js
  71. 24 24
      src/views/sandbox_manage/index_new_version.vue
  72. 20 20
      src/views/sandbox_manage/sandFlowNew/components/addLInkDia.vue
  73. 17 10
      src/views/sandbox_manage/sandFlowNew/index.vue
  74. 3 2
      src/views/system_manage/chartTheme/components/optionsSection.vue
  75. 4 1
      src/views/system_manage/chartTheme/themeSetting.vue
  76. BIN
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/Anton-Regular.ttf
  77. BIN
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/HanaleiFill-Regular.ttf
  78. BIN
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/Pacifico-Regular.ttf
  79. 539 0
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/demo.css
  80. 2700 0
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/demo_index.html
  81. 3 0
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.css
  82. BIN
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.eot
  83. 0 0
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.js
  84. 779 0
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.json
  85. 97 0
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.svg
  86. BIN
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.ttf
  87. BIN
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.woff
  88. BIN
      static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.woff2
  89. BIN
      static/js/Luckysheet@2.1.13/dist/css/EwaAntH.gif
  90. BIN
      static/js/Luckysheet@2.1.13/dist/css/EwaAntV.gif
  91. BIN
      static/js/Luckysheet@2.1.13/dist/css/arrow-down.png
  92. BIN
      static/js/Luckysheet@2.1.13/dist/css/loading.gif
  93. 0 0
      static/js/Luckysheet@2.1.13/dist/css/luckysheet.css
  94. 68 0
      static/js/Luckysheet@2.1.13/dist/css/menuSprite.svg
  95. BIN
      static/js/Luckysheet@2.1.13/dist/css/paint_16px.ico
  96. BIN
      static/js/Luckysheet@2.1.13/dist/css/paint_24px.ico
  97. BIN
      static/js/Luckysheet@2.1.13/dist/css/paint_32px.ico
  98. 127 0
      static/js/Luckysheet@2.1.13/dist/css/sprite38.svg
  99. BIN
      static/js/Luckysheet@2.1.13/dist/css/waffle_sprite.png
  100. 410 0
      static/js/Luckysheet@2.1.13/dist/demoData/chat.js

+ 8 - 8
index.html

@@ -15,12 +15,12 @@
 	<!-- 引入组件库 -->
 	
 	<!-- oss SDK -->
-	<script type="text/javascript" src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.16.0.min.js"></script>
+	<script type="text/javascript" src="./static/js/aliyun-oss-sdk-6.16.0.min.js"></script>
 	<!-- luckysheet cdn -->
-	<link rel='stylesheet' href='https://hzstatic.hzinsights.com/static/cdn/Luckysheet@2.1.13/dist/plugins/css/pluginsCss.css' />
-	<link rel='stylesheet' href='https://hzstatic.hzinsights.com/static/cdn/Luckysheet@2.1.13/dist/plugins/plugins.css' />
-	<link rel='stylesheet' href='https://hzstatic.hzinsights.com/static/cdn/Luckysheet@2.1.13/dist/css/luckysheet.css' />
-	<link rel='stylesheet' href='https://hzstatic.hzinsights.com/static/cdn/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.css' />
+	<link rel='stylesheet' href='./static/js/Luckysheet@2.1.13/dist/plugins/css/pluginsCss.css' />
+	<link rel='stylesheet' href='./static/js/Luckysheet@2.1.13/dist/plugins/plugins.css' />
+	<link rel='stylesheet' href='./static/js/Luckysheet@2.1.13/dist/css/luckysheet.css' />
+	<link rel='stylesheet' href='./static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.css' />
 	
 	<!-- dataTables -->
 	<link rel="stylesheet" type="text/css" href="./static/css/jquery.dataTables.css"/>
@@ -63,9 +63,9 @@
 	<script type="text/javascript" src="./static/dll.vendor.js"></script>
 	<!-- built files will be auto injected -->
 	<script type="text/javascript" src="./static/js/jquery.min.js"></script>
-	<script src="https://hzstatic.hzinsights.com/static/cdn/Luckysheet@2.1.13/dist/plugins/js/plugin.js"></script>
-	<script src="https://hzstatic.hzinsights.com/static/cdn/Luckysheet@2.1.13/dist/luckysheet.umd.js"></script>
-	<script src="https://hzstatic.hzinsights.com/static/cdn/luckyexcel.umd.js"></script>
+	<script src="./static/js/Luckysheet@2.1.13/dist/plugins/js/plugin.js"></script>
+	<script src="./static/js/Luckysheet@2.1.13/dist/luckysheet.umd.js"></script>
+	<script src="./static/js/luckyexcel.umd.js"></script>
 	<script type="text/javascript" src="./static/js/jquery.dataTables.js"></script>
 </body>
 </html>

+ 10 - 2
src/api/api.js

@@ -11,7 +11,11 @@ import {
   baiinfoInterface,
   nationalInterface,
   databankInterface,
-  yongyiInterface
+  yongyiInterface,
+  fwmtInterface,
+  guangqiInterface,
+  icpiInterface,
+  coalWordInterface
 } from './modules/thirdBaseApi';
 
 //手工指标 手工数据 手工数据权限
@@ -114,7 +118,11 @@ export {
   homeInterface,
   businessTripInterence,
   reportVarietyENInterence,
-  yongyiInterface
+  yongyiInterface,
+  fwmtInterface,
+  guangqiInterface,
+  icpiInterface,
+  coalWordInterface
 };
 
 //老接口 研报 ppt等

+ 10 - 0
src/api/modules/chartApi.js

@@ -933,6 +933,16 @@ const dataBaseInterface = {
 	 */
 	getReportrefreshStatus: params => {
 		return http.post('/datamanage/chart_info/batch_refresh/result',params)
+	},
+
+	/**
+	 * 获取雷达图预览数据
+	 * @param {
+	 * 	ExtraConfig: { EdbInfoIdList  DateList }
+	 * } params 
+	 */
+	getRadarPreviewData: params => {
+		return http.post('/datamanage/chart_info/preview/radar',params)
 	}
 	
 }

+ 139 - 1
src/api/modules/thirdBaseApi.js

@@ -777,6 +777,140 @@ const yongyiInterface={
 	},
 }
 
+/* 汾渭煤炭树 */
+const fwmtInterface={
+		/**
+	 * 分类列表
+	 * @param {} params 
+	 * @returns 
+	 */
+		classifyList: params => {
+			return http.get('/datamanage/fenwei/classify',params);
+		},
+		/**
+		 * 获取指标列表详情
+		 */
+		dataList: params => {
+			return http.get('/datamanage/fenwei/index/data',params);
+		},
+		//单个指标数据
+		getTargetDataList:params=>{
+			return http.get('/datamanage/fenwei/single_data',params);
+		},
+		// 搜索
+		getTargetListByName:params=>{
+			return http.get('/datamanage/fenwei/search_list',params);
+		}
+}
+/* 广期所 */
+const guangqiInterface={
+		/**
+		 * 分类列表
+		 * @param {} params 
+		 * @returns 
+		 */
+	getClassifyList: params => {
+		return http.get('/data_source/gfex/classify/list',params);
+	},
+	/**
+	 * 获取数据最新日期
+	 */
+	getNewtestDate: params => {
+		return http.get('/data_source/gfex/max/date',params);
+	},
+	/**
+ * 获取分类下合约
+ * @param {} params 
+ * BaseFromTradeGuangzhouClassifyId TradeDate
+ * @returns 
+ */
+	getContractList:params=>{
+		return http.get('/data_source/gfex/contract',params);
+	},
+	/**
+ * 获取指标数据
+ * @param {} params 
+ * BaseFromTradeGuangzhouClassifyId BaseFromTradeGuangzhouContractId TradeDate
+ * @returns 
+ */
+	getIndexDataList:params=>{
+		return http.get('/data_source/gfex/index_data',params);
+	},
+	/**
+ * 获取指标数据详情(一次性交割卖方仓单查询)
+ * @param {} params 
+ * BaseFromTradeGuangzhouIndexId TradeDate
+ * @returns 
+ */
+	getIndexDataDetail:params=>{
+		return http.get('/data_source/gfex/index/detail',params);
+	},
+	/**
+ * 导出指标数据详情(一次性交割卖方仓单查询)
+ * @param {} params 
+ * BaseFromTradeGuangzhouIndexId TradeDate
+ * @returns 
+ */
+	exportIndexDataDetail:params=>{
+		return http.get('/data_source/gfex/index/detail/export',params);
+	},
+}
+
+/* ICPI消费价格指数 */
+const icpiInterface={
+	/**
+	 * 分类列表
+	 * @param {} params 
+	 * @returns 
+	 */
+	classifyList: params => {
+		return http.get('/data_source/icpi/classify/list',params);
+	},
+	/**
+	 * 获取指标列表详情
+	 * BaseFromIcpiClassifyId PageSize CurrentIndex
+	 */
+	dataList: params => {
+		return http.get('/data_source/icpi/index/data',params);
+	}
+}
+
+/* 煤炭江湖 */
+const coalWordInterface={
+	/**
+	 * 分类列表
+	 * @param {} params 
+	 * @returns 
+	 */
+	classifyList: params => {
+		return http.get('/entry/data/mtjh/classify',params);
+	},
+	/**
+	 * 获取指标列表详情 Area PageSize CurrentIndex
+	 */
+	dataList: params => {
+		return http.get('/entry/data/mtjh/data',params);
+	},
+	/**
+	 * 单个指标数据 IndexCode PageSize CurrentIndex
+	*/
+	getTargetDataList:params=>{
+		return http.get('/entry/data/mtjh/single_data',params);
+	},
+	/**
+	 * 搜索 Keyword
+	*/
+	targetListSearch:params=>{
+		return http.get('/entry/data/mtjh/search',params);
+	},
+	/**
+	 * 获取频度列表 Area
+	*/
+	getFrequencyList:params=>{
+		return http.get('/entry/data/mtjh/frequency',params)
+	},
+}
+
 export { 
 	lzDataInterface,
 	glDataInterface,
@@ -788,5 +922,9 @@ export {
   baiinfoInterface,
   nationalInterface,
   databankInterface,
-  yongyiInterface
+  yongyiInterface,
+  fwmtInterface,
+	guangqiInterface,
+	icpiInterface,
+	coalWordInterface
 }

BIN
src/assets/icons/menu/2VjyIToUNbtlLeQj0jn6jRN1LZ2I.png


BIN
src/assets/icons/menu/JAwRFxOjZCQ1qfAwLQzd9q23B7JO.png


BIN
src/assets/icons/menu/OKobqhVdWm0TkAFiimA8pxvPl1fk.png


BIN
src/assets/icons/menu/data_source.png


BIN
src/assets/icons/menu/english_ppt.png


BIN
src/assets/icons/menu/eta_chart.png


BIN
src/assets/icons/menu/eta_data.png


BIN
src/assets/icons/menu/eta_logic.png


BIN
src/assets/icons/menu/eta_predict_data.png


BIN
src/assets/icons/menu/eta_table.png


BIN
src/assets/icons/menu/my_eta.png


BIN
src/assets/icons/menu/out_link.png


BIN
src/assets/icons/menu/position_analysis.png


BIN
src/assets/icons/menu/ppt.png


BIN
src/assets/icons/menu/product_price.png


BIN
src/assets/icons/menu/semantic_analysis.png


BIN
src/assets/icons/menu/statistic_analysis.png


BIN
src/assets/icons/menu/supply_analysis.png


BIN
src/assets/icons/menu/system_manager.png


BIN
src/assets/icons/menu/yb_manager.png


+ 8 - 41
src/components/lzTable.vue

@@ -69,19 +69,11 @@ export default {
 		headerArr(){
 			let arr=['QuotaName','LzCode','Frequency','UnitName','ModifyTime']
 
+			let sourceTypeOne = ['smm','coal','baiinfo','yyzx','icpi','coalWord']
+
 			if(this.source==='gl'){
 				arr=['IndexName','IndexCode','FrequencyName','UnitName','UpdateTime']
-			}
-			if(this.source==='smm'){
-				arr=['IndexName','IndexCode','Frequency','Unit','ModifyTime']
-			}
-			if(this.source==='coal'){
-				arr=['IndexName','IndexCode','Frequency','Unit','ModifyTime']
-			}
-			if(this.source==='baiinfo'){
-				arr=['IndexName','IndexCode','Frequency','Unit','ModifyTime']
-			}
-			if(this.source==='yyzx'){
+			}else if(sourceTypeOne.includes(this.source)){
 				arr=['IndexName','IndexCode','Frequency','Unit','ModifyTime']
 			}
 
@@ -95,6 +87,7 @@ export default {
 				['UnitName', '单位'],
 				['ModifyTime', '更新时间'],
 			])
+			let sourceTypeOne = ['smm','coal','baiinfo','yyzx','icpi','coalWord']
 
 			if(this.source==='gl'){
 				temMap=new Map([
@@ -104,35 +97,7 @@ export default {
 					['UnitName', '单位'],
 					['UpdateTime', '更新时间'],
 				])
-			}
-			if(this.source==='smm'){
-				temMap=new Map([
-					['IndexName', '指标名称'],
-					['IndexCode', '指标ID'],
-					['Frequency', '频度'],
-					['Unit', '单位'],
-					['ModifyTime', '更新时间'],
-				])
-			}
-			if(this.source==='coal'){
-				temMap=new Map([
-					['IndexName', '指标名称'],
-					['IndexCode', '指标ID'],
-					['Frequency', '频度'],
-					['Unit', '单位'],
-					['ModifyTime', '更新时间'],
-				])
-			}
-			if(this.source==='baiinfo'){
-				temMap=new Map([
-					['IndexName', '指标名称'],
-					['IndexCode', '指标ID'],
-					['Frequency', '频度'],
-					['Unit', '单位'],
-					['ModifyTime', '更新时间'],
-				])
-			}
-			if(this.source==='yyzx'){
+			}else if(sourceTypeOne.includes(this.source)){
 				temMap=new Map([
 					['IndexName', '指标名称'],
 					['IndexCode', '指标ID'],
@@ -146,8 +111,10 @@ export default {
 		},
 		dynamic_key(){
 			let key='InputValue'
-			if(['smm','baiinfo','coal','yyzx'].includes(this.source)){
+			if(['smm','baiinfo','coal','yyzx','icpi'].includes(this.source)){
 				key='Value'
+			}else if(this.source=='coalWord'){
+				key='DealValue'
 			}
 
 			return key

+ 80 - 0
src/lang/commonLang.js

@@ -31,6 +31,14 @@ export default {
       en: "Delete",
       zh: "删除",
     },
+    save_as:{
+      en: "Save as",
+      zh: "另存为",
+    },
+    copy_btn:{
+      en: "Copy",
+      zh: "复制",
+    },
     column_operations: {
       en: "Operations",
       zh: "操作",
@@ -39,6 +47,43 @@ export default {
       en: "No data available.",
       zh: "暂无数据",
     },
+    edb_id:{
+      en:'Indicator ID',
+      zh:'指标Id'
+    },
+    edb_name:{
+      en:'Indicator Name',
+      zh:'指标名称'
+    },
+    frequency:{
+      en:'Frequency',
+      zh:'频度'
+    },
+    unit:{
+      en:'Unit',
+      zh:'单位'
+    },
+    start_time:{
+      en:'Start Time',
+      zh:'起始时间'
+    },
+    update_time:{
+      en:'Update Time',
+      zh:'更新时间'
+    },
+    source:{
+      en:'Source',
+      zh:'来源'
+    },
+    report_title:{
+      en:'Report Title',
+      zh:'报告标题'
+    },
+    publish_time:{
+      en:'Publish Time',
+      zh:'发布时间'
+    }
+
   },
   Confirm: {
     prompt: {
@@ -82,6 +127,41 @@ export default {
     saveing_msg:{
       en:'Saving',
       zh:'保存中'
+    },
+    save_hints:{
+      en:'Save hints',
+      zh:'保存提示'
+    },
+    author:{
+      en:'Author',
+      zh:'作者'
+    },
+    select_category:{
+      en:'please select category',
+      zh:'请选择分类'
+    },
+    delete_fail_msg:{
+      en:'Delete failed',
+      zh:'删除失败'
+    },
+    known:{
+      en:'Known',
+      zh:'知道了'
+    },
+    browser_not_support:{
+      en:'Browser not supported',
+      zh:'浏览器不支持'
+    },
+    http_not_support:{
+      en:'The current protocol is not currently supported, only the HTTPS protocol is supported',
+      zh:'当前协议暂不支持,仅支持https协议'
     }
+  },
+  Common:{
+    category:{
+      en:'categories',
+      zh:'分类'
+    },
+
   }
 };

+ 27 - 2
src/lang/modules/SandboxManage/SandFlow.js

@@ -37,7 +37,19 @@ export const SandFlowEn = {
     right:"Right",
     center_theme:'Central theme',
     branch_topic:'Branch topic',
-    sub_topic:'Subtopic'
+    sub_topic:'Subtopic',
+    clear_link_success:'clear links sucessfully',
+    add_link:'Add links',
+    edit_link:'Edit links',
+    clear_link:'clear links',
+    save_link:'links saved sucessfully',
+    copy_tag:'Copy',
+    delete_tag:'Delete',
+    add_link_search_placeholder:'Indicator ID/ indicator name',
+    link_type_opt1:'ETA Indicator/ ETA forecast indicator',
+    link_type_opt2:'ETA Image library',
+    link_type_opt3:'ETA reports',
+    msg_leave_page_save:'Before leaving this page, do you want to save current contents?',
   };
   
   /* 中文 */
@@ -75,7 +87,20 @@ export const SandFlowEn = {
     right:"居右",
     center_theme:'中心主题',
     branch_topic:'分支主题',
-    sub_topic:'子主题'
+    sub_topic:'子主题',
+    clear_link_success:'清除链接成功',
+    add_link:'添加链接',
+    edit_link:'编辑链接',
+    clear_link:'清除链接',
+    save_link:'链接保存成功',
+    copy_tag:'复制',
+    delete_tag:'删除',
+    add_link_search_placeholder:'指标ID/指标名称',
+    link_type_opt1:'ETA指标/ETA预测指标',
+    link_type_opt2:'ETA图库',
+    link_type_opt3:'ETA研报',
+    msg_leave_page_save:'在离开页面之前,是否保存当前内容?',
+
   };
   
   /**

+ 6 - 0
src/lang/modules/SandboxManage/SandList.js

@@ -17,6 +17,9 @@ export const SandListEn = {
     catalog_name:'Catalog name',
     catalog_name_placeholder:'Please enter the catalog name',
     associated_variety:'Associated variety',
+    logic_diagram_name:"Logic diagram's name",
+    delete_attention_msg1:'Logic diagrams exist under this category and cannot be deleted',
+    delete_attention_msg2:'Are you sure to delete current category?',
   };
   
   /* 中文 */
@@ -34,6 +37,9 @@ export const SandListEn = {
     catalog_name:'目录名称',
     catalog_name_placeholder:'请输入目录名称',
     associated_variety:'关联品种',
+    logic_diagram_name:"逻辑图名称",
+    delete_attention_msg1:'该分类下存在沙盘图,不可删除',
+    delete_attention_msg2:'确定删除当前分类吗?',
   };
   
   /**

+ 16 - 3
src/main.js

@@ -11,13 +11,18 @@ import "font-awesome/css/font-awesome.min.css";
 import "@/utils/dialog.js";
 import "@/utils/option-scroll.js";
 import "@/utils/buttonPermission.js";
+import { dataBaseInterface } from '@/api/api.js';
 import { mixins } from "@/mixins";
 import VueI18n from 'vue-i18n';
 import messages from './lang/index';
+import langEN from 'element-ui/lib/locale/lang/en'
+import langZH from 'element-ui/lib/locale/lang/zh-CN'
+import locale from 'element-ui/lib/locale'
+
 Vue.mixin(mixins);
 Vue.use(VueI18n);
 const i18n = new VueI18n({
-  locale: 'zh', // 默认语言
+  locale: localStorage.getItem('i18n')||'zh', // 默认语言
   messages,
   // 隐藏警告
   silentTranslationWarn: true
@@ -26,13 +31,16 @@ Vue.use(ElementUI);
 Vue.use(VueRouter);
 Vue.use(Vuex);
 
+// 设置element语言
+locale.use(localStorage.getItem('i18n')=='zh' ? langZH : langEN)
+
 import{endCalc,optionTimeCalc,init}from'@/utils/TimeOnPage.js';
 
 
 import setting from '@/mixins/theme.js'
 Vue.prototype.$setting = setting;
 
-Vue.prototype.toHistoryPage = (EdbInfoId,from=[])=>{
+Vue.prototype.toHistoryPage =  async(EdbInfoId,from=[])=>{
     console.log('from',from)
     let pathArr = from.map(p=>{
         return {
@@ -45,10 +53,15 @@ Vue.prototype.toHistoryPage = (EdbInfoId,from=[])=>{
         path:'/edbHistory'
     })
     sessionStorage.setItem('edbHistoryPath',JSON.stringify(pathArr))
+
+    //改为传code获取溯源 改的地方太多了在这里直接获取code算了
+    const {Ret,Data} = await dataBaseInterface.targetDetail({EdbInfoId})
+    if(Ret!==200) return
+
     const href = router.resolve({
         path:'/edbHistory',
         query:{
-            edbId:EdbInfoId,
+            code:Data.UniqueCode,
         }
     }).href
     window.open(href,"_blank")

+ 28 - 0
src/routes/modules/dataRoutes.js

@@ -80,6 +80,12 @@ export default [
         name: "天然气历史数据",
         hidden: true,
       },
+      {
+        path: "ICPIconsumption",
+        component: () => import("@/views/dataEntry_manage/thirdBase/icpiConsumption.vue"),
+        name: "ICPI消费价格指数",
+        hidden: false,
+      },
       {
         path: "zhengzhoushop",
         component: () =>
@@ -132,6 +138,13 @@ export default [
           keepAlive: false,
         },
       },
+      {
+        path: "guangzhouFutures",
+        component: () =>
+          import("@/views/dataEntry_manage/thirdBase/gqExchangeData.vue"),
+        name: "广期所",
+        hidden: false
+      },
       {
         path: "chineseCoal",
         component: () => import("@/views/dataEntry_manage/coal/index.vue"),
@@ -217,6 +230,21 @@ export default [
         name: "有色原始数据库",
         hidden: false,
       },
+      {
+        path: "fwmtData",
+        component: () => import("@/views/dataEntry_manage/thirdBase/FwmtData.vue"),
+        name: "汾渭数据",
+        hidden: false,
+        meta: {
+          keepAlive: false,
+        },
+      },
+      {
+        path: "coalWord",
+        component: () => import("@/views/dataEntry_manage/thirdBase/coalWord.vue"),
+        name: "煤炭江湖",
+        hidden: false
+      },
     ],
   },
 ];

+ 4 - 1
src/utils/buttonConfig.js

@@ -241,7 +241,10 @@ export const dataSourcePermission = {
     dataSource_account_edit:'dataSourceAccount:edit',//编辑
     dataSource_account_enable:'dataSourceAccount:enable',//禁用/启用
     /*--------涌益咨询---- */
-    yyzxData_export:'yyzx:exportData'
+    yyzxData_export:'yyzx:exportData',
+    /*--------煤炭江湖---- */
+    coalWordData_view:'coalWord:view', // 查看
+    coalWordData_export:'coalWord:export', // 导出
 }
 
 /*

+ 24 - 0
src/utils/common.js

@@ -314,4 +314,28 @@ const handleUploadToS3=(file,fileName,options={})=>{
             reject(error)
           }
     })
+  }
+  
+/**
+ * 等待几个请求返回才能进行下一步的中间函数
+ * @param {*} flag 执行下一步的标志 需要取到最新的值,传入返回值函数
+ * @param {*} callBack 回调
+ * @param {*} timeout 间隔
+ */
+export const waitRequestReturn=(flag,callBack,timeout)=>{
+  if(typeof(flag)!='function' || typeof(callBack)!='function'){
+    return console.error('waitRequestReturn--参数错误')
+  }
+  let timer=null
+  if(!flag()){
+    timer=setInterval(()=>{
+      // console.log(flag());
+        if(flag()){
+            clearInterval(timer)
+            callBack()
+        }
+    },+timeout||10)
+  }else{
+    callBack()
+  }
 }

+ 31 - 3
src/views/Home.vue

@@ -52,7 +52,7 @@
                     @click="(e) => e.preventDefault()"
                   >
                     <img
-                      :src="item.icon_path"
+                      :src="getMenuIcon(item)"
                       alt=""
                       style="width: 24px; height: 24px"
                     />
@@ -75,7 +75,7 @@
                 <el-submenu v-else-if="item.IsLevel!==1&&!item.hidden" :index="index" :key="index">
                   <template slot="title">
                     <img
-                      :src="item.icon_path"
+                      :src="getMenuIcon(item)"
                       alt=""
                       style="width: 24px; height: 24px"
                     />
@@ -332,7 +332,9 @@ import EventBus from "@/api/bus.js";
 
 import {recordActiveLoginFun,loginEndCalc} from "@/utils/TimeOnPage.js"
 import NotificationMsg from "../components/notificationMsg.vue";
-
+import langEN from 'element-ui/lib/locale/lang/en'
+import langZH from 'element-ui/lib/locale/lang/zh-CN'
+import locale from 'element-ui/lib/locale'
 export default {
   components: {
     PwdDlg,
@@ -512,6 +514,30 @@ export default {
     this.$refs.notification&&this.$refs.notification.getMsgList()
   },
   methods: {
+    getMenuIcon(item){
+      const iconMap=new Map([
+        ['外部链接',require('@/assets/icons/menu/out_link.png')],
+        ['研报管理',require('@/assets/icons/menu/yb_manager.png')],
+        ['智能ppt',require('@/assets/icons/menu/ppt.png')],
+        ['英文ppt',require('@/assets/icons/menu/english_ppt.png')],
+        ['审批管理',require('@/assets/icons/menu/OKobqhVdWm0TkAFiimA8pxvPl1fk.png')],
+        ['数据源',require('@/assets/icons/menu/data_source.png')],
+        ['ETA指标库',require('@/assets/icons/menu/eta_data.png')],
+        ['ETA预测指标',require('@/assets/icons/menu/eta_predict_data.png')],
+        ['ETA图库',require('@/assets/icons/menu/eta_chart.png')],
+        ['My ETA',require('@/assets/icons/menu/my_eta.png')],
+        ['ETA表格',require('@/assets/icons/menu/eta_table.png')],
+        ['ETA逻辑',require('@/assets/icons/menu/eta_logic.png')],
+        ['语义分析',require('@/assets/icons/menu/semantic_analysis.png')],
+        ['统计分析',require('@/assets/icons/menu/statistic_analysis.png')],
+        ['供应分析',require('@/assets/icons/menu/supply_analysis.png')],
+        ['工具箱',require('@/assets/icons/menu/2VjyIToUNbtlLeQj0jn6jRN1LZ2I.png')],
+        ['数据报表管理',require('@/assets/icons/menu/JAwRFxOjZCQ1qfAwLQzd9q23B7JO.png')],
+        ['系统设置',require('@/assets/icons/menu/system_manager.png')],
+      ])
+      return iconMap.get(item.name)
+    },
+
     handleClickSubMenuItem(item,e){
       e.preventDefault();
       if(item.path==='AIQA'){
@@ -893,6 +919,8 @@ export default {
     // 中英文的切换
     langChangeHandler(){
        this.$i18n.locale =  this.$i18n.locale == 'zh' ? 'en' : 'zh'
+       locale.use(this.$i18n.locale == 'zh' ? langZH : langEN)
+       localStorage.setItem('i18n',this.$i18n.locale)
     },
   },
 };

+ 189 - 97
src/views/Login.vue

@@ -65,51 +65,73 @@
 				</el-form-item>
 			</el-form>  -->
 			<div class="login-box" id="login-container" v-if="activeModel!=='forgetPassModel'">
-				<span class="login-title">ETA — 让投研领先市场半步</span>
-				<el-tabs v-model="activeModel" @tab-click="handleClick">
-					<el-tab-pane label="账号登录" name="ordinaryModel">
-						<OrdinaryModel ref="ordinaryModel"
-							:loginCheck="loginCheck"
-							:accountCheck="accountCheck"
-							@clearnHint="clearnHint"
-							@changeModel="changeModel('forgetPassModel')"
-						/>
-					</el-tab-pane>
-					<el-tab-pane label="手机号登录" name="mobileModel">
-						<MobileModel ref="mobileModel"
-							:areaCode="areaCode"
-						/>
-					</el-tab-pane>
-					<!-- <el-tab-pane label="邮箱登录" name="emailModel"> -->
-						<EmailModel ref="emailModel" v-show="activeModel=='emailModel'"/>
-					<!-- </el-tab-pane> -->
-				</el-tabs>
-				<el-button
-					type="primary"
-					size="medium"
-					@click.native="handleLogin"
-					:loading="logining"
-					class="submit_btn"
-					>登录</el-button>
-                <div class="another-login-type">
-                    <div class="another-type-hint">
-                        <div class="type-hint-line"></div>
-                        <div class="type-hint-text">其他登录方式</div>
-                        <div class="type-hint-line"></div>
-                    </div>
-                    <div class="another-type">
-                        <!-- <div class="login-type-item"
-                        > -->
-                            <img src="~@/assets/img/icons/email-login-type.png" @click="activeModel='emailModel';handleClick({name:'emailModel'})" />
-                        <!-- </div> -->
+                <div class="fixed-login-cont">
+                    <span class="login-title">ETA — 让投研领先市场半步</span>
+                    <el-tabs v-model="activeModel" >
+                        <!-- <el-tab-pane label="账号登录" name="ordinaryModel">
+                            <OrdinaryModel ref="ordinaryModel"
+                                :loginCheck="loginCheck"
+                                :accountCheck="accountCheck"
+                                @clearnHint="clearnHint"
+                                @changeModel="changeModel('forgetPassModel')"
+                            />
+                        </el-tab-pane>
+                        <el-tab-pane label="手机号登录" name="mobileModel">
+                            <MobileModel ref="mobileModel"
+                                :areaCode="areaCode"
+                            />
+                        </el-tab-pane> -->
+
+                        <OrdinaryModel ref="ordinaryModel"
+                            :loginCheck="loginCheck"
+                            :accountCheck="accountCheck"
+                            @clearnHint="clearnHint"
+                            @changeModel="changeModel('forgetPassModel')"
+                            v-show="activeModel=='ordinaryModel'"
+                        />
+
+                        <MobileModel ref="mobileModel"
+                            :areaCode="areaCode"
+                            v-show="activeModel=='mobileModel'"
+                        />
+
+                        <EmailModel ref="emailModel" v-show="activeModel=='emailModel'"/>
+                    </el-tabs>
+                    <el-button
+                        type="primary"
+                        size="medium"
+                        @click.native="handleLogin"
+                        :loading="logining"
+                        class="submit_btn"
+                        >登录</el-button>
+                    <div class="another-login-type">
+                        <div class="another-type-hint">
+                            <div class="type-hint-line"></div>
+                            <div class="type-hint-text">其他登录方式</div>
+                            <div class="type-hint-line"></div>
+                        </div>
+                        <div class="another-type">
+                            <div class="login-type-item"
+                                v-for="item in loginTypeIcons"
+                                :key="item.name"
+                                :style="activeModel===item.name?'display: none':''"
+                                @click="activeModel=item.name;handleClick(item)"
+                            >
+                            <div v-html="item.svg"></div>
+                            {{item.label}}
+                            </div>
+                                <!-- <img src="~@/assets/img/icons/email-login-type.png" @click="activeModel='emailModel';handleClick({name:'emailModel'})" /> -->
+                        </div>
                     </div>
                 </div>
 			</div>
 			<div class="login-box" v-else>
-				<ForgetPassModel 
-					ref="forgetPassModel"
-					:autoAccount="$refs.ordinaryModel?$refs.ordinaryModel.form.account:''"
-					@changeModel="changeModel('ordinaryModel')"/>
+                <div class="fixed-login-cont">
+                    <ForgetPassModel 
+                        ref="forgetPassModel"
+                        :autoAccount="$refs.ordinaryModel?$refs.ordinaryModel.form.account:''"
+                        @changeModel="changeModel('ordinaryModel')"/>
+                </div>
 			</div>
 		</div>
 		<!-- 验证弹窗 -->
@@ -153,44 +175,122 @@ import OrdinaryModel from "./login_manage/OrdinaryModel.vue";
 
 export default {
     components: { OrdinaryModel, MobileModel, EmailModel, ForgetPassModel },
-  data() {
-    return {
-        b: new http.Base64(),
-        logining: false, //登录loadding
-        ruleForm: {
-            account: "",
-            checkPass: "",
-        },
-        rules: {
-            account: [
-            {
-                required: true,
-                message: "请输入用户名",
-                trigger: "blur",
+    data() {
+        return {
+            b: new http.Base64(),
+            logining: false, //登录loadding
+            ruleForm: {
+                account: "",
+                checkPass: "",
             },
-            ],
-            checkPass: [
-            {
-                required: true,
-                message: "请输入密码",
-                trigger: "blur",
+            rules: {
+                account: [
+                {
+                    required: true,
+                    message: "请输入用户名",
+                    trigger: "blur",
+                },
+                ],
+                checkPass: [
+                {
+                    required: true,
+                    message: "请输入密码",
+                    trigger: "blur",
+                },
+                ],
             },
-            ],
-        },
-        checked: false, //是否保持登录状态
-        visible: true, //密码输入类型
+            checked: false, //是否保持登录状态
+            visible: true, //密码输入类型
+
+            activeModel: 'ordinaryModel',
+            /* form check 错误提示标识*/
+            loginCheck:false, //账号或密码错误
+            accountCheck:false,//账号异常:多次输错密码、长时间未登录
+            accountForbidden:false,//账号被禁用
+            mobileCheck:false,//手机号未绑定
+            emailCheck:false,//邮箱未绑定
+            areaCode:[],
 
-        activeModel: 'ordinaryModel',
-        /* form check 错误提示标识*/
-        loginCheck:false, //账号或密码错误
-        accountCheck:false,//账号异常:多次输错密码、长时间未登录
-        accountForbidden:false,//账号被禁用
-        mobileCheck:false,//手机号未绑定
-        emailCheck:false,//邮箱未绑定
-        areaCode:[],
+            isCheckDialogShow:false,
+            checkActiveModel:'checkMobileModel',
+            
+            /* 登录方式icon */
+            loginTypeIcons: [
+                {
+                    name: 'ordinaryModel',
+                    label: '账号登录',
+                    svg: `<svg data-v-5b948168="" width="64" height="64" viewBox="0 0 60 64" fill="none" xmlns="http://www.w3.org/2000/svg"><g filter="url(#filter0_d_6575_1450)">
+                        <circle cx="26" cy="25" r="20" fill="white"></circle>
+                        <circle cx="26" cy="25" r="19.75" stroke="#DCDFE6" stroke-width="0.5"></circle>
+                        </g>
+                        <g clip-path="url(#clip0_6575_1450)">
+                        <path d="M30.9555 24.9201C29.6869 26.0392 28.0029 26.7261 26.1469 26.7261C24.2634 26.7261 22.5516 26.0169 21.2775 24.8647C18.3137 25.6402 16.48 28.2883 16.48 31.4516V33.0637C16.48 36.8364 35.5204 36.8364 35.5204 33.0637V31.4516C35.5203 28.3716 33.7809 25.7678 30.9555 24.9201ZM26.1469 25.5794C29.4321 25.5794 32.1023 23.0144 32.1023 19.8457C32.1023 16.677 29.4376 14.1064 26.1469 14.1064C22.8673 14.1064 20.1972 16.677 20.1972 19.8457C20.1972 23.0145 22.8673 25.5794 26.1469 25.5794Z" fill="#0052D9"></path>
+                        </g>
+                        <defs>
+                        <filter id="filter0_d_6575_1450" x="0" y="0" width="52" height="52" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                        <feOffset dy="1"></feOffset>
+                        <feGaussianBlur stdDeviation="3"></feGaussianBlur>
+                        <feComposite in2="hardAlpha" operator="out"></feComposite>
+                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1450"></feBlend>
+                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1450" result="shape"></feBlend>
+                        </filter>
+                        <clipPath id="clip0_6575_1450">
+                        <rect width="24" height="24" fill="white" transform="translate(14 13)"></rect>
+                        </clipPath>
+                        </defs></svg>`
+                },
+                {
+                    name:'mobileModel',
+                    label: '手机号登录',
+                    svg: `<svg data-v-5b948168="" width="64" height="64" viewBox="0 0 56 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+                        <g filter="url(#filter0_d_6575_1430)">
+                        <circle cx="26" cy="25" r="20" fill="white"></circle>
+                        <circle cx="26" cy="25" r="19.75" stroke="#DCDFE6" stroke-width="0.5"></circle>
+                        </g>
+                        <path d="M31.7982 13.6985H19.7718C18.6414 13.6985 17.7246 14.6153 17.7246 15.7457V34.2977C17.7246 35.4281 18.6414 36.3449 19.7718 36.3449H24.8262H27.6366H31.7982C32.9286 36.3449 33.8454 35.4281 33.8454 34.2977V15.7457C33.8454 14.6153 32.9286 13.6985 31.7982 13.6985ZM23.8038 15.1577H27.7662C27.963 15.1577 28.1238 15.3185 28.1238 15.5153C28.1238 15.7121 27.963 15.8729 27.7662 15.8729H23.8038C23.607 15.8729 23.4462 15.7121 23.4462 15.5153C23.4462 15.3185 23.607 15.1577 23.8038 15.1577ZM25.7862 33.9689C24.9894 33.9689 24.3438 33.3233 24.3438 32.5265C24.3438 31.7297 24.9894 31.0841 25.7862 31.0841C26.583 31.0841 27.2286 31.7297 27.2286 32.5265C27.2262 33.3233 26.5806 33.9689 25.7862 33.9689ZM32.3478 28.6337C32.3478 28.9169 32.1198 29.1449 31.8366 29.1449H19.7334C19.4502 29.1449 19.2222 28.9169 19.2222 28.6337V17.7377C19.2222 17.4545 19.4502 17.2265 19.7334 17.2265H31.8342C32.1174 17.2265 32.3454 17.4545 32.3454 17.7377V28.6337H32.3478Z" fill="#0052D9"></path>
+                        <defs>
+                        <filter id="filter0_d_6575_1430" x="0" y="0" width="52" height="52" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                        <feOffset dy="1"></feOffset>
+                        <feGaussianBlur stdDeviation="3"></feGaussianBlur>
+                        <feComposite in2="hardAlpha" operator="out"></feComposite>
+                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1430"></feBlend>
+                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1430" result="shape"></feBlend>
+                        </filter>
+                        </defs></svg>`
+                },
+                {
+                    name: 'emailModel',
+                    label: '邮箱登录',
+                    svg: `
+                        <svg data-v-5b948168="" width="64" height="64" viewBox="0 4 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+                        <g filter="url(#filter0_d_6575_1422)">
+                        <circle cx="32" cy="30" r="20" fill="white"></circle>
+                        <circle cx="32" cy="30" r="19.5" stroke="#DCDFE6"></circle>
+                        </g>
+                        <path d="M41.1382 34.9875C41.1382 37.1966 39.3473 38.9875 37.1382 38.9875H26.8774C24.6683 38.9875 22.8774 37.1966 22.8774 34.9875V28.1164C22.8774 26.864 23.464 25.6839 24.4623 24.9278L31.3139 19.7381C31.517 19.5832 31.7594 19.5 32.0078 19.5C32.2562 19.5 32.4986 19.5832 32.7017 19.7381L39.5533 24.9278C40.5516 25.6839 41.1382 26.864 41.1382 28.1164V34.9875Z" fill="#0052D9"></path>
+                        <path d="M38.682 26.5957C38.682 27.0061 38.4316 27.3751 38.0501 27.5266L33.4963 29.3353C32.5408 29.7148 31.4758 29.7119 30.5224 29.327L25.956 27.4837C25.5853 27.334 25.3425 26.9743 25.3425 26.5745C25.3425 26.033 25.7815 25.594 26.323 25.594H37.6803C38.2335 25.594 38.682 26.0425 38.682 26.5957Z" fill="white"></path>
+                        <defs>
+                        <filter id="filter0_d_6575_1422" x="0" y="0" width="64" height="64" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                        <feOffset dy="2"></feOffset>
+                        <feGaussianBlur stdDeviation="6"></feGaussianBlur>
+                        <feComposite in2="hardAlpha" operator="out"></feComposite>
+                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1422"></feBlend>
+                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1422" result="shape"></feBlend>
+                        </filter>
+                        </defs></svg>`
+                },
+            ]
 
-        isCheckDialogShow:false,
-        checkActiveModel:'checkMobileModel'
+        
         };
     },
     created() {
@@ -572,7 +672,7 @@ export default {
 		}
 		.login-title {
 			color: #333;
-			font-size: 38px;
+			font-size: 32px;
 			display: block;
 			text-align: center;
 			margin-bottom: 60px;
@@ -588,6 +688,10 @@ export default {
 			input::-webkit-input-placeholder {
 				color: #595959 !important;
 			}
+            .fixed-login-cont {
+                width: 460px;
+                margin: 0 auto;
+            }
 			.remember {
 				margin: 0px 0 20px;
 			}
@@ -618,6 +722,8 @@ export default {
                     display: flex;
                     align-items: center;
                     justify-content: center;
+                    gap:10%;
+                    margin-top: 20px;
                     img{
                         margin-top: 20px;
                         height: 72px;
@@ -625,19 +731,11 @@ export default {
                         cursor: pointer;
                         // margin-bottom: 4px;
                     }
-					// .login-type-item{
-					// 	display: flex;
-					// 	flex-direction: column;
-					// 	justify-content: center;
-					// 	align-items: center;
-					// 	margin-top: 20px;
-					// 	cursor: pointer;
-	
-					// 	span{
-					// 		font-size: 16px;
-					// 		color: #666666;
-					// 	}
-					// }
+                    .login-type-item {
+                        text-align: center;
+                        color: #666;
+                        cursor: pointer;
+                    }
 				}
 			}
 			.el-input input {
@@ -699,16 +797,10 @@ export default {
 			#login-container ,.login-box{
 				width: 70%;
 				top:15%;
+                left: 50%;
+                transform: translateX(-50%);
 			}
 		}
-		@media screen and (max-width:1440px){
-			#login-container ,.login-box{
-				.login-title{
-					font-size: 32px;
-				}
-			}
-			
-		}
 		@media screen and (max-height:720px) {
 			#login-container ,.login-box{
 				top:20%;

+ 15 - 18
src/views/dataEntry_manage/addChart.vue

@@ -112,14 +112,7 @@
 							placeholder="请选择所属分类"
 						/>
 					</el-form-item>
-					<el-form-item label="图表单位" prop="Unit" v-if="chartInfo.ChartType===7">
-						<!-- <el-input
-							v-model="chartInfo.Unit"
-							style="width: 90%"
-							placeholder="请输入图表单位"
-							clearable
-							@change="changeUnit"
-						/> -->
+					<el-form-item label="图表单位" prop="Unit" v-if="[7,11].includes(chartInfo.ChartType)">
 						<el-select
 							v-model="chartInfo.Unit"
 							filterable
@@ -195,7 +188,8 @@
 						<el-checkbox v-model="tableData[0].IsOrder">逆序</el-checkbox>
 					</div>
 					
-          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10].includes(chartInfo.ChartType)">
+					<!-- 配置区  柱形 截面 雷达不需要-->
+          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10,11].includes(chartInfo.ChartType)">
             <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="[2,5].includes(chartInfo.ChartType)">
               <template slot="title">
                 <span class="text_oneLine">{{item.EdbName}}</span>
@@ -326,14 +320,14 @@
             </el-collapse-item>
           </el-collapse>
 
-					<!-- 奇怪柱状图配置 -->
+					<!-- 奇怪柱状图配置 雷达图也要用 -->
 					<bar-option
-						v-if="chartInfo.ChartType===7"
+						v-if="[7,11].includes(chartInfo.ChartType)"
 						ref="BarOptRef"
 						:chartInfo="chartInfo"
 						:edblist="tableData"
-						:datedata="barDateList"
-						@getData="getBarPreviewData"
+						:datedata="chartInfo.ChartType===7?barDateList:radarChartData.YDataList"
+						@getData="barOptionPreviewMap"
 					/>
 
 					<!-- 截面散点图 -->
@@ -467,7 +461,7 @@
 							</div>
 
 							<!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-							<template v-if="[7,10].includes(chartInfo.ChartType)">	
+							<template v-if="[7,10,11].includes(chartInfo.ChartType)">	
 								<div class="range-cont left">
 									<el-input
 										style="width: 60px; display: block"
@@ -574,7 +568,7 @@
 							align="center"
 						>
 							<template slot-scope="scope">
-								<div v-if="item.key === 'EdbName' && [1,4,6,7].includes(chartInfo.ChartType)">
+								<div v-if="item.key === 'EdbName' && [1,4,6,7,11].includes(chartInfo.ChartType)">
 									<!-- 柱状图用别名 -->
 									<el-input 
 										v-model="scope.row.EdbAliasName"
@@ -685,9 +679,12 @@ export default {
 		tableData: {
       handler(newval, oldval) {
 				if(newval.length) {
-					if([7,10].includes(this.chartInfo.ChartType)) {
+					if([7,10,11].includes(this.chartInfo.ChartType)) {
 						// 奇怪柱形图
 						this.chartInfo.ChartType === 7 && this.barDateList.length && this.$refs.BarOptRef.getBarData();
+
+						//雷达图
+						this.chartInfo.ChartType === 11 && this.$refs.BarOptRef.getBarData();
 				
 					}else {
 						//拼接标题
@@ -739,9 +736,9 @@ export default {
 					// 季节图只允许添加一个指标
 					if(this.chartInfo.ChartType === 2 && this.tableData.length > 1) return this.$message.warning('您选择的图表样式为季节性图表,只支持单指标画图');
 
-					if(this.chartInfo.ChartType === 7 && !this.$refs.BarOptRef.dateList.length)  return this.$message.warning('请添加日期');
+					else if([7,11].includes(this.chartInfo.ChartType)  && !this.$refs.BarOptRef.dateList.length)  return this.$message.warning('请添加日期');
 
-					if(this.chartInfo.ChartType === 10 && !this.$refs.SectionScatterOptRef.seriesArr[0].edbs)  return this.$message.warning('请添加系列指标');
+					else if(this.chartInfo.ChartType === 10 && !this.$refs.SectionScatterOptRef.seriesArr[0].edbs)  return this.$message.warning('请添加系列指标');
 
 					if(this.chartInfo.ChartType === 2){
 						if(!(this.SeasonExtraConfig.XStartDate && this.SeasonExtraConfig.XEndDate)){

+ 9 - 5
src/views/dataEntry_manage/chartSetting.vue

@@ -177,7 +177,7 @@
 					</div>
 
           <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length">
-            <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="[2,5,7,10].includes(chartInfo.ChartType)">
+            <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="![1,4,6].includes(chartInfo.ChartType)">
               <template slot="title">
                 <span class="text_oneLine">{{item.EdbName}}</span>
               </template>
@@ -443,7 +443,7 @@
                     </div>
 
                     <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-                    <template v-if="[7,10].includes(chartInfo.ChartType)">	
+                    <template v-if="[7,10,11].includes(chartInfo.ChartType)">	
                       <div class="range-cont left">
                         <el-input
                           style="width: 60px; display: block"
@@ -1606,7 +1606,8 @@ export default {
 
       const chartTypeMap = {
         7: this.initBarData, //柱形图
-        10: this.initSectionScatterData //截面散点
+        10: this.initSectionScatterData, //截面散点
+        11: this.initRadarData //雷达图
       }
       chartTypeMap[this.chartInfo.ChartType] && chartTypeMap[this.chartInfo.ChartType](res.Data);
 
@@ -1811,12 +1812,14 @@ export default {
             }
             break
           case 7:
+          case 11:
             typeChartParam = {
                ...public_param,
               DateType: 6,
               LeftMin: String(this.chartLimit.min),
               LeftMax: String(this.chartLimit.max),
             }
+            break
           case 10: 
             typeChartParam = {
               ...public_param,
@@ -1829,7 +1832,8 @@ export default {
                 YMinValue: String(this.chartLimit.min),
                 YMaxValue: String(this.chartLimit.max),
               })
-            } 
+            }
+            break
         }
 
         let params = this.sameOptionType.includes(this.selected_chartType)
@@ -2204,7 +2208,7 @@ export default {
         .then((res) => {
           this.refreshLoading.close();
           if (res.Ret === 200) {
-            [7,10].includes(this.chartInfo.ChartType) ? this.getChartDetail() : this.getPreviewChartInfo();
+            [7,10,11].includes(this.chartInfo.ChartType) ? this.getChartDetail() : this.getPreviewChartInfo();
             this.$message.success(res.Msg);
           }
         });

+ 5 - 4
src/views/dataEntry_manage/components/barOptionSection.vue

@@ -2,7 +2,7 @@
   <div class="bar-option-wrapper">
     <template v-if="dateList.length">
       <!-- 排序规则 -->
-      <div v-if="isBaseBarShow">
+      <div v-if="isBaseBarShow&&chartInfo.ChartType===7">
         <div>
           <label style="margin-right: 5px;">排序规则</label> 
           <el-radio-group v-model="sortObj.sort" @change="() => { sortObj.sortIndex= '';changeSort()}">
@@ -141,7 +141,8 @@ export default {
     edblist: Array,
     datedata: Array,
     chartInfo: {
-      type: Object
+      type: Object,
+      default: () => {}
     },
     initData: {
       default: null
@@ -311,8 +312,8 @@ export default {
         Name:  _.Name
       }));
       this.sortObj = {
-        sort: Sort.Sort,
-        sortIndex: Sort.DateIndex
+        sort: Sort?Sort.Sort:0,
+        sortIndex: Sort?Sort.DateIndex:''
       }
     }
   }

+ 2 - 0
src/views/dataEntry_manage/components/chart.vue

@@ -5,9 +5,11 @@
 
 <script>
 import Highcharts from 'highcharts/highstock';
+import HighchartsMore from 'highcharts/highcharts-more';
 import HightchartsExport from 'highcharts/modules/exporting';
 import HighchartszhCN  from '@/utils/highcahrts-zh_CN'
 HighchartszhCN(Highcharts)
+HighchartsMore(Highcharts)
 HightchartsExport(Highcharts)
 const elementResizeDetectorMaker = require("element-resize-detector");//引入监听dom变化的组件
 const erd = elementResizeDetectorMaker();

+ 50 - 47
src/views/dataEntry_manage/components/markersSection.vue

@@ -1,57 +1,60 @@
 <template>
   <div class="chart-markers-section">
-    <!-- 标示线 -->
-    <div class="section-item">
-      <ul class="marker-list"  v-if="markerLinesArr.length">
-        <li class="marker-item" v-for="(item,index) in markerLinesArr" :key="index">
-          <span>{{item.axisName}}: {{item.value}}</span>
-          <div style="flex-shrink:0">
-            <i class="el-icon-view icon" :style="item.isShow?'color:#0052D9':'color:#999'" @click="item.isShow=!item.isShow;updateChartHandle()"/>
-            <i class="el-icon-edit icon" style="margin:0 6px" @click="openMarkerDiaHandle('line',index+1)"/>
-            <i class="el-icon-delete icon" @click="markerLinesArr.splice(index,1);updateChartHandle()"/>
-          </div>
-        </li>
-      </ul>
+    <!-- 雷达不要 -->
+    <template v-if="chartInfo.ChartType!==11">
+      <!-- 标示线 -->
+      <div class="section-item">
+        <ul class="marker-list"  v-if="markerLinesArr.length">
+          <li class="marker-item" v-for="(item,index) in markerLinesArr" :key="index">
+            <span>{{item.axisName}}: {{item.value}}</span>
+            <div style="flex-shrink:0">
+              <i class="el-icon-view icon" :style="item.isShow?'color:#0052D9':'color:#999'" @click="item.isShow=!item.isShow;updateChartHandle()"/>
+              <i class="el-icon-edit icon" style="margin:0 6px" @click="openMarkerDiaHandle('line',index+1)"/>
+              <i class="el-icon-delete icon" @click="markerLinesArr.splice(index,1);updateChartHandle()"/>
+            </div>
+          </li>
+        </ul>
+
+        <div
+          class="add-cont"
+          @click="openMarkerDiaHandle('line')"
+        >
+          <img
+            src="~@/assets/img/set_m/add_ico.png"
+            alt=""
+            style="width: 16px; height: 16px; margin-right: 10px"
+          />
+          <span>添加标识线</span>
+        </div>
 
-      <div
-        class="add-cont"
-        @click="openMarkerDiaHandle('line')"
-      >
-        <img
-          src="~@/assets/img/set_m/add_ico.png"
-          alt=""
-          style="width: 16px; height: 16px; margin-right: 10px"
-        />
-        <span>添加标识线</span>
       </div>
 
-    </div>
+      <!-- 标识区 -->
+      <div class="section-item">
+        <ul class="marker-list" v-if="markerAreasArr.length">
+          <li class="marker-item" v-for="(item,index) in markerAreasArr" :key="index">
+            <span>{{item.axisName}}: {{`${item.fromValue}至${item.toValue}`}}</span>
+            <div style="flex-shrink:0">
+              <i class="el-icon-view icon" :style="item.isShow?'color:#0052D9':'color:#999'" @click="item.isShow=!item.isShow;updateChartHandle()"/>
+              <i class="el-icon-edit icon" style="margin:0 6px" @click="openMarkerDiaHandle('area',index+1)"/>
+              <i class="el-icon-delete icon" @click="markerAreasArr.splice(index,1);updateChartHandle()"/>
+            </div>
+          </li>
+        </ul>
+        <div
+          class="add-cont"
+          @click="openMarkerDiaHandle('area')"
+        >
+          <img
+            src="~@/assets/img/set_m/add_ico.png"
+            alt=""
+            style="width: 16px; height: 16px; margin-right: 10px"
+          />
+          <span>添加标识区</span>
+        </div>
 
-    <!-- 标识区 -->
-    <div class="section-item">
-      <ul class="marker-list" v-if="markerAreasArr.length">
-        <li class="marker-item" v-for="(item,index) in markerAreasArr" :key="index">
-          <span>{{item.axisName}}: {{`${item.fromValue}至${item.toValue}`}}</span>
-          <div style="flex-shrink:0">
-            <i class="el-icon-view icon" :style="item.isShow?'color:#0052D9':'color:#999'" @click="item.isShow=!item.isShow;updateChartHandle()"/>
-            <i class="el-icon-edit icon" style="margin:0 6px" @click="openMarkerDiaHandle('area',index+1)"/>
-            <i class="el-icon-delete icon" @click="markerAreasArr.splice(index,1);updateChartHandle()"/>
-          </div>
-        </li>
-      </ul>
-      <div
-        class="add-cont"
-        @click="openMarkerDiaHandle('area')"
-      >
-        <img
-          src="~@/assets/img/set_m/add_ico.png"
-          alt=""
-          style="width: 16px; height: 16px; margin-right: 10px"
-        />
-        <span>添加标识区</span>
       </div>
-
-    </div>
+    </template>
 
     <!-- 图表说明 -->
     <div class="section-item">

+ 96 - 0
src/views/dataEntry_manage/css/coalCommon.scss

@@ -0,0 +1,96 @@
+// 煤炭江湖页面的同款样式
+
+.coal-similarity-container {
+  display: flex;
+  position: relative;
+  box-sizing: border-box;
+  .slide-btn-icon{
+        &.slide-left{
+            left:225px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+    }
+  .minHeight {
+    height: calc(100vh - 120px);
+    background-color: #fff;
+    box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
+    border-radius: 4px;
+    box-sizing: border-box;
+  }
+  div::-webkit-scrollbar {
+    width: 5px !important;
+  }
+  .left-cont {
+    min-width: 240px;
+    width:240px;
+    margin-right: 20px;
+    padding: 30px 0;
+    overflow: hidden;
+    .left-top {
+      padding: 0 20px;
+    }
+    .classify-list {
+      padding: 0 20px;
+      margin-top: 20px;
+      height: calc(100vh - 280px);
+      overflow-y: auto;
+      .classify-item {
+        font-size: 14px;
+        color: #666;
+        margin-bottom: 20px;
+        &:hover {
+          cursor: pointer;
+          color: #409eff;
+        }
+        &.act {
+          color: #409eff;
+        }
+      }
+    }
+  }
+  .right-cont {
+    flex:1;
+    padding: 30px;
+    overflow-x: auto;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    .right-box {
+      max-width: 100%;
+      flex-grow: 1;
+      min-height: 600px;
+      // border-right: 1px solid #dcdfe6;
+      box-sizing: border-box;
+      overflow: auto;
+      .data-header {
+        width: 100%;
+        position: sticky;
+        top: 0;
+        z-index: 2;
+      }
+      .data-cont {
+        height: calc(100vh - 444px);
+      }
+      .nodata {
+        width: 100%;
+        font-size: 16px;
+        color: #999;
+        padding-top: 100px;
+      }
+    }
+    .frequency-list {
+      margin-top: 20px;
+      display: flex;
+      flex-wrap: wrap;
+      gap:20px;
+      .el-button{
+            margin-left: 0 !important;
+        }
+      .frequency-btn {
+        width: 112px;
+      }
+    }
+  }
+}

+ 16 - 10
src/views/dataEntry_manage/editChart.vue

@@ -120,7 +120,7 @@
 							placeholder="请选择所属分类"
 						/>
 					</el-form-item>
-					<el-form-item label="图表单位" prop="Unit" v-if="chartInfo.ChartType===7">
+					<el-form-item label="图表单位" prop="Unit" v-if="[7,11].includes(chartInfo.ChartType)">
 						<el-select
 							v-model="chartInfo.Unit"
 							filterable
@@ -196,7 +196,7 @@
 						<el-checkbox v-model="tableData[0].IsOrder">逆序</el-checkbox>
 					</div>
 
-          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10].includes(chartInfo.ChartType)">
+          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10,11].includes(chartInfo.ChartType)">
             <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="[2,5].includes(chartInfo.ChartType)">
               <template slot="title">
                 <span class="text_oneLine">{{item.EdbName}}</span>
@@ -317,13 +317,13 @@
 
 					<!-- 奇怪柱状图配置 -->
 					<bar-option
-						v-if="chartInfo.ChartType===7"
+						v-if="[7,11].includes(chartInfo.ChartType)"
 						ref="BarOptRef"
 						:chartInfo="chartInfo"
 						:edblist="tableData"
-						:datedata="barDateList"
-						:initData="initBarOptions"
-						@getData="getBarPreviewData"
+						:datedata="chartInfo.ChartType===7?barDateList:radarChartData.YDataList"
+						:initData="chartInfo.ChartType===7?initBarOptions:(chartInfo.ExtraConfig&&JSON.parse(chartInfo.ExtraConfig))"
+						@getData="barOptionPreviewMap"
 					/>
 
 					<!-- 截面散点图 -->
@@ -458,7 +458,7 @@
 							</div>
 
 							<!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-							<template v-if="[7,10].includes(chartInfo.ChartType)">	
+							<template v-if="[7,10,11].includes(chartInfo.ChartType)">	
 								<div class="range-cont left">
 									<el-input
 										style="width: 60px; display: block"
@@ -563,7 +563,7 @@
 							align="center"
 						>
 							<template slot-scope="scope">
-								<div v-if="item.key === 'EdbName' && [1,4,6,7].includes(chartInfo.ChartType)">
+								<div v-if="item.key === 'EdbName' && [1,4,6,7,11].includes(chartInfo.ChartType)">
 									<!-- 奇怪柱状图用别名 -->
 									<el-input 
 										v-model="scope.row.EdbAliasName"
@@ -682,9 +682,12 @@ export default {
 		tableData: {
       handler(newval, oldval) {
 				if(newval) {
-					if([7,10].includes(this.chartInfo.ChartType)) {
+					if([7,10,11].includes(this.chartInfo.ChartType)) {
 						// 奇怪柱形图
 						this.chartInfo.ChartType === 7 && this.barDateList.length && this.$refs.BarOptRef && this.$refs.BarOptRef.getBarData();
+
+						//雷达图
+						this.chartInfo.ChartType === 11 && this.$refs.BarOptRef && this.$refs.BarOptRef.getBarData();
 					}else {
 						this.setAddChartDefault();
 						newval.length && !this.chartInfo.WarnMsg && this.setChartOptionHandle(newval);
@@ -732,7 +735,7 @@ export default {
           this.chartInfo = {
 						...ChartInfo,
 						classify: [ChartInfo.ChartClassify[0].ParentId,...ChartInfo.ChartClassify.map(item => item.ChartClassifyId)],
-						Unit: BarChartInfo ? BarChartInfo.Unit : '',
+						Unit: ChartInfo.ChartType===7 ? BarChartInfo.Unit : ChartInfo.Unit,
 						SourcesFromVisable: ChartInfo.SourcesFrom ? JSON.parse(ChartInfo.SourcesFrom).isShow : true
 					};
 					//处理下历史默认来源
@@ -758,6 +761,9 @@ export default {
 
 					//截面散点图
 					this.chartInfo.ChartType === 10 && this.initSectionScatterData(res.Data);
+
+					//雷达图
+					this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
 					
 					this.getThemeList();
 

+ 79 - 25
src/views/dataEntry_manage/mixins/addOreditMixin.js

@@ -53,6 +53,7 @@ export default {
         { label: '组合图', key: 6 },
 				{ label: '柱形图',key: 7 },
 				{ label: '截面散点图',key: 10 },
+				{ label: '雷达图',key: 11 },
       ], //图表样式
 
 
@@ -138,7 +139,7 @@ export default {
 				this.getThemeList('init')
 
 				//柱形图 截面散点切换到普通图 依赖的指标信息其实只有信息无数据 需清空
-				if([7,10].includes(oldval)&&![7,10].includes(newval)) {
+				if([7,10,11].includes(oldval)&&![7,10,11].includes(newval)) {
 					this.tableData = [];
 					this.chartInfo.LeftMax = '';
 					this.chartInfo.LeftMin = '';
@@ -149,7 +150,7 @@ export default {
 				this.initStatus();
 
 				//共用结构的类型切换可以直接画图
-				if(![7,10].includes(newval)) {
+				if(![7,10,11].includes(newval)) {
 					//单指标允许切换到季节图需药重新请求数据
 					this.tableData.length===1 && this.selectTarget(this.tableData[0],'switch');
 					this.tableData.length > 1 && this.setChartOptionHandle(this.tableData);
@@ -163,26 +164,9 @@ export default {
 		selectTarget(item,type='') {
 			if(!item) return
 
-			/* 正常图获取指标数据 柱形图不获取 */
-			if(this.chartInfo.ChartType === 7) return this.setBarEdbList(item);
-				// let params = this.sameOptionType.includes(this.chartInfo.ChartType) 
-				// 	? {
-				// 		EdbInfoId: item.EdbInfoId,
-				// 		ChartType: this.chartInfo.ChartType,
-				// 		DateType: this.year_select,
-				// 		StartDate:
-				// 			this.year_select === 5 || this.year_select === 6
-				// 				? this.select_date[0]
-				// 				: '',
-				// 		EndDate: this.year_select === 5 ? this.select_date[1] : '',
-				// 	} 
-				// 	: {
-				// 		EdbInfoId: item.EdbInfoId,
-				// 		ChartType: this.chartInfo.ChartType,
-				// 		Calendar: this.calendar_type,
-				// 		SeasonStartDate: '',
-				// 		SeasonEndDate: '',
-				// 	};
+			/* 正常图获取指标数据 柱形图 雷达图不获取 */
+			if([7,11].includes(this.chartInfo.ChartType)) return this.setBarEdbList(item);
+
 				let dateArray=this.chartInfo.ChartType==2?this.season_year:this.select_date
 
 				let params = {
@@ -255,7 +239,7 @@ export default {
 
 		},
 
-		/* 添加柱形图表格 */
+		/* 添加柱形图 /雷达图指标数组 */
 		setBarEdbList(edb) {
 			let have_bol = this.tableData.some(item => item.EdbInfoId === edb.EdbInfoId);
 
@@ -265,7 +249,16 @@ export default {
 			this.search_txt = '';
 			this.chartInfo.Unit = this.chartInfo.Unit||edb.Unit
 			this.tableData.push(edb)
+		},
 
+		/* 奇怪柱形图的日期配置项现在不止柱形图用了 获取数据时扩展一下 */
+		barOptionPreviewMap(data) {
+			let tyepeMapApi = {
+				7: this.getBarPreviewData,//柱形图
+				11: this.getRadarPreviewData//雷达图
+			}
+
+			tyepeMapApi[this.chartInfo.ChartType](data);
 		},
 
 		/* 获取bar数据 */
@@ -314,6 +307,49 @@ export default {
 			})
 		},
 
+		/* 获取雷达图预览数据 */
+		async getRadarPreviewData({dateList}) {
+			if(this.tableData.length<3 || !dateList.length) return
+			
+			let parmas = {
+				ChartEdbInfoList: this.tableData.map(_ => ({
+					EdbInfoId: _.EdbInfoId,
+					EdbAliasName:_.EdbAliasName
+				})),
+				ExtraConfig: JSON.stringify({ DateList: dateList})
+			}
+
+			const res = await dataBaseInterface.getRadarPreviewData(parmas)
+
+			if(res.Ret!==200) return 
+
+			const { DataResp,EdbInfoList,ChartInfo } = res.Data;
+			this.chartInfo = {
+				...this.chartInfo,
+				ChartSource: ChartInfo.ChartSource
+			}
+			
+			this.radarChartData = {
+				YDataList: DataResp.YDataList,
+				XDataList: EdbInfoList.filter(_ => DataResp.XEdbIdValue.includes(_.EdbInfoId))
+			}
+
+			// //初始状态设置上下限极值
+			if(!this.chartInfo.LeftMin) {
+				const value_arr = this.radarChartData.YDataList.map(_ => _.Value).flat(Infinity)
+
+				this.chartLimit = {
+					min: Math.min(...value_arr),
+					max: Math.max(...value_arr)
+				}
+			}
+
+			//默认来源搞一下
+			this.setDefaultSourceFrom();
+
+			this.setRadarChart()
+		},
+
 		/* 曲线图切换筛选项时请求数据 */
 		async getPreviewSplineInfo() {
 			let dateArray=this.chartInfo.ChartType==2?this.season_year:this.select_date
@@ -683,10 +719,27 @@ export default {
 							}))
 						})
 					}	
+				case 11: 
+					return {
+						...public_param,
+						DateType: 6,
+						Unit: this.chartInfo.Unit,
+						LeftMin: String(this.chartLimit.min),
+						LeftMax: String(this.chartLimit.max),
+						ExtraConfig: JSON.stringify({
+							DateList: this.$refs.BarOptRef.dateList.map(item => ({
+								Type: item.Type,
+								Date: item.Date,
+								Value: item.Value,
+								Name: item.Name,
+								Color: item.Color
+							})),
+						})
+					}
 			}
 		},
 
-		/* 奇怪柱形图更新单位 */
+		/* 更新单位 */
 		changeUnit(val) {
 			if(!this.options.series) return
 
@@ -862,7 +915,8 @@ export default {
 			
 			const chartTypeMap = {
         7: this.setBarChart, //柱形图
-        10: this.setSectionScatterChart //截面散点
+        10: this.setSectionScatterChart, //截面散点
+				11: this.setRadarChart  //雷达图
       }
       chartTypeMap[this.chartInfo.ChartType] 
 				? chartTypeMap[this.chartInfo.ChartType]() 

+ 121 - 2
src/views/dataEntry_manage/mixins/chartPublic.js

@@ -189,7 +189,10 @@ export const chartSetMixin = {
 			},
 
       /* 跨品种分析图 */
-      crossVarietyChartData: {}
+      crossVarietyChartData: {},
+
+      /* 雷达图 */
+      radarChartData: {}
 		}
 	},
   watch: {
@@ -1797,6 +1800,121 @@ export const chartSetMixin = {
       this.currentLang=='en' && this.changeOptions()
     },
 
+    //雷达图数据初始化
+    initRadarData(data) {
+      const { DataResp,EdbInfoList,ChartInfo } = data;
+
+      this.leftIndex = -1;
+      this.rightIndex = -1;
+      this.rightTwoIndex = -1;
+      
+      this.radarChartData = {
+				YDataList: DataResp.YDataList,
+				XDataList: EdbInfoList.filter(_ => DataResp.XEdbIdValue.includes(_.EdbInfoId))
+			}
+      this.chartLimit = {
+        min: Number(ChartInfo.LeftMin),
+        max: Number(ChartInfo.LeftMax)
+      }
+
+      this.setRadarChart();
+    },
+    /*雷达图绘图*/
+    setRadarChart() {
+      const { YDataList,XDataList } = this.radarChartData;
+
+      /* 主题样式*/
+      const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+
+      //x轴
+      let xAxis = {
+        lineWidth: 0,
+        tickLength: 0,
+        tickmarkPlacement: 'on',
+        categories: XDataList.map(_ => _.EdbAliasName||_.EdbName),
+        labels: {
+          allowOverlap: true,
+          autoRotationLimit: 40,
+          distance: 20,
+          style: {
+            ...chartTheme&&chartTheme.xAxisOptions.style
+          }
+        }
+      }
+
+      //y轴
+      const { max,min } = this.chartLimit;
+      let yAxis = [{
+        gridLineInterpolation: 'polygon',
+        gridLineWidth: 1,
+        lineWidth: 0,
+        endOnTick: false,
+        startOnTick: false,
+        showLastLabel: true,
+        // tickAmount:4,
+        title: {
+          text:  this.chartInfo.Unit,
+          textCh: this.chartInfo.Unit,
+          textEn: this.chartInfo.UnitEn,
+          align: 'high',
+          rotation: 0,
+          y: 5,
+          x:10,
+          textAlign: 'left',
+          reserveSpace: false,
+          style:{
+            ...chartTheme&&chartTheme.yAxisOptions.style
+          },
+        },
+        labels: {
+          allowOverlap: true,
+          style:{
+            ...chartTheme&&chartTheme.yAxisOptions.style
+          }
+        },
+        min: Number(min),
+        max: Number(max),
+      }]
+
+      //系列
+      let series = [];
+      YDataList.forEach(item => {
+        let serie_item = {
+          data: item.Value,
+          pointPlacement: 'on',
+          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'line',
+          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          yAxis: 0,
+          name: item.Name || item.Date,
+          nameCh: item.Name || item.Date,
+          nameEn: item.Date,
+          color: item.Color,
+          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 1,
+          chartType: 'linear'
+        };
+        series.push(serie_item)
+      })
+
+      this.options = {
+        chart: {
+          ...defaultOpts.chart,
+					...chartTheme.drawOption,
+          spacing: [2,10,2,10],
+          polar:true,
+        },
+        title: {
+          text:''
+        },
+        pane: {
+          size: '80%'
+        },
+        series,
+        yAxis,
+        xAxis
+      }
+      this.currentLang=='en' && this.changeOptions();
+    },
+
 
     /* 统计频率图 */
     setStatisticFrequency() {
@@ -2319,7 +2437,8 @@ export const chartSetMixin = {
       //source1 eta图库的类型对应
       const typeMap = {
         7: this.setBarChart,
-        10: this.setSectionScatterChart
+        10: this.setSectionScatterChart,
+        11: this.setRadarChart
       }
       //其他source
       const sourceMap = {

+ 540 - 0
src/views/dataEntry_manage/thirdBase/FwmtData.vue

@@ -0,0 +1,540 @@
+<template>
+  <div class="smmTarget-container target-container" id="box">
+    <span
+        v-show="!isLeftWrapShow"
+        class="slide-btn-icon slide-right"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" id="left" v-show="isLeftWrapShow">
+        <span
+            v-show="isLeftWrapShow"
+            class="slide-btn-icon slide-left"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+      <div class="left-top">
+        <el-button
+          v-permission="permissionBtn.dataSourcePermission.yyzxData_export"
+          style="width: 100%"
+          type="primary"
+          plain
+          size="medium"
+          @click="exportClick"
+          :loading="btnload"
+          >导出Excel</el-button
+        >
+        <el-autocomplete
+          style="margin: 20px 0; width: 100%"
+          prefix-icon="el-icon-search"
+          v-model="leftSearchVal"
+          :fetch-suggestions="handleLeftSearch"
+          :trigger-on-focus="false"
+          placeholder="指标名称/指标ID"
+          @select="handleSelectLeftSearchval"
+          popper-class="el-autocomplete-suggestion-data-entry"
+          clearable
+        >
+          <template slot-scope="scope">
+            <div v-if="scope.item.nodata" style="text-align: center">
+              暂无数据
+            </div>
+            <div v-else>
+              {{ scope.item.IndexName }}
+            </div>
+          </template>
+        </el-autocomplete>
+      </div>
+      <div class="scroll-wrap">
+        <el-tree
+          ref="treeRef"
+          class="target_tree"
+          :data="classifyList"
+          node-key="ClassifyId"
+          :props="{
+            label: 'ClassifyName',
+            children: 'Child',
+          }"
+          :current-node-key="select_classify"
+          :expand-on-click-node="false"
+          check-strictly
+          highlight-current
+          empty-text="暂无分类"
+          @current-change="nodeChangeHandle"
+        >
+        </el-tree>
+      </div>
+      <span
+        class="move-btn resize"
+        v-drag
+        id="resize"
+        @mousemove="dynamicNode && resetNodeStyle(dynamicNode)"
+      >
+      </span>
+    </div>
+    <div
+      class="right-cont minHeight"
+      id="right"
+      v-loading="dataloading"
+      element-loading-text="获取数据中..."
+    >
+      <template v-if="rightShow">
+        <div class="right-box" @scroll="scrollHandle">
+          <div class="data-header">
+            <lz-table
+              :tableOption="tableOption"
+              tableType="header"
+              ref="table"
+              source="yyzx"
+              @editTarget="editTargetByTable"
+            />
+          </div>
+          <div class="data-cont" v-if="dateArr.length">
+            <lz-table
+              :tableOption="tableOption"
+              tableType="data"
+              :dateArr="dateArr"
+              source="yyzx"
+            />
+          </div>
+          <div v-else class="nodata"></div>
+        </div>
+      </template>
+      <div v-else class="nodata-cont">
+        <tableNoData text="暂无数据"/>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import lzTable from "@/components/lzTable.vue";
+import { fwmtInterface } from "@/api/api.js";
+export default {
+  name: "Fwmt",
+  components: { lzTable },
+  data() {
+    return {
+      isLeftWrapShow:true,
+      exportBase:process.env.VUE_APP_API_ROOT + "/datamanage/fenwei/export", //ssm数据导出接口
+      dataloading: false,
+      rightShow: false,
+      select_classify: 0,
+      classifyList: [],
+      tableOption: [],
+      dateArr: [], //最长的日期数组
+      btnload: false,
+      page_no: 1,
+      page_size: 20,
+      havemore: true, //是否还有数据
+
+      leftSearchVal: "", //左侧搜索值
+      leftSearchTradeCode: "", //如果是搜索选择的 则有此code
+      isShowSingleData: false, //右侧是否展示的是单个指标数据
+    };
+  },
+  methods: {
+    /* 获取分类 */
+    getClassify() {
+      fwmtInterface.classifyList().then((res) => {
+        if (res.Ret !== 200) return;
+        this.classifyList = res.Data || [];
+      });
+    },
+    /* 获取数据 */
+    getDataList: _.throttle(function () {
+      this.isShowSingleData = false;
+      this.dataloading = true;
+      fwmtInterface
+        .dataList({
+          ClassifyId: this.select_classify,
+          PageSize: this.page_size,
+          CurrentIndex: this.page_no,
+        })
+        .then((res) => {
+          this.rightShow = true;
+          if (res.Ret !== 200) return;
+
+          // 找出最多的页码 判断是否还有数据
+          let page_arrs = res.Data.map((item) => item.Paging.Pages);
+          let totalPage = Math.max.apply(Math, page_arrs);
+          this.havemore = this.page_no < totalPage ? true : false;
+
+          // 合并数据
+          if (this.page_no === 1) {
+            this.tableOption = res.Data;
+          } else {
+            this.tableOption.forEach((item) => {
+              res.Data.forEach((_item) => {
+                if (item.IndexCode === _item.IndexCode) {
+                  item.DataList = item.DataList.concat(_item.DataList);
+                }
+              });
+            });
+          }
+
+          // 合并所有指标中的日期 作为日期数组
+          let arr = res.Data.map((item) => {
+            return item.DataList;
+          });
+
+          let obj = [];
+          for (let i of arr) {
+            for (let j of i) {
+              obj.push(j.DataTime);
+            }
+          }
+          let arr2 = [...new Set(obj)].sort().reverse();
+          let concatArr = [...new Set([...this.dateArr, ...arr2])]
+            .sort()
+            .reverse();
+          this.dateArr = this.page_no === 1 ? arr2 : concatArr;
+
+          /* 不满6个追加6个空的显示一排 别问 问就是为了美观  */
+          if (this.tableOption.length < 7)
+            for (let i = 0; i < 7; i++) {
+              this.tableOption.push({
+                DataList: [],
+              });
+              if (this.tableOption.length >= 7) break;
+            }
+
+          //数据最大长度小于12个 追加数据满12个 别问 问就是为了美观
+          if (this.dateArr.length < 12)
+            for (let i = 0; i < 12; i++) {
+              this.dateArr.push("");
+              if (this.dateArr.length >= 12) break;
+            }
+
+          this.dataloading = false;
+          this.page_no === 1 &&
+            this.$nextTick(() => {
+              this.rightShow && this.initWidth();
+            });
+        });
+    }, 200),
+    // 获取单个指标数据
+    async getTargetDataList(code) {
+      this.isShowSingleData = true;
+      this.dataloading = true;
+      try {
+        const res = await fwmtInterface.getTargetDataList({
+          IndexCode: code,
+        });
+        this.rightShow = true;
+        if (res.Ret !== 200) return;
+        const DataList = res.Data.Data || [];
+        // 设置为没有更多数据
+        this.haveMore = false;
+        // 合并数据
+        this.tableOption = [
+          {
+            DataList: DataList,
+            ...res.Data,
+          },
+        ];
+        // 这里是单个指标所以不用合并日期
+        const arr = DataList.map((item) => item.DataTime);
+        this.dateArr = [...new Set(arr)].sort().reverse();
+        /* 不满6个追加6个空的显示一排 别问 问就是为了美观  */
+        for (let i = 0; i < 7; i++) {
+          this.tableOption.push({
+            DataList: [],
+          });
+          if (this.tableOption.length >= 7) break;
+        }
+        //数据最大长度小于12个 追加数据满12个 别问 问就是为了美观
+        if (this.dateArr.length < 12)
+          for (let i = 0; i < 12; i++) {
+            this.dateArr.push("");
+            if (this.dateArr.length >= 12) break;
+          }
+        this.select_quota = res.Data.IndexName;
+        this.select_Unit = res.Data.Unit;
+        this.select_frequency = res.Data.Frequency;
+        this.select_ModifyTime = res.Data.ModifyTime || "";
+        this.dataloading = false;
+        this.rightShow && this.initWidth();
+      } catch (err) {
+        console.log(err);
+      }
+    },
+    initWidth() {
+      this.$nextTick(() => {
+        $(".right-box")[0].style.width =
+          this.$refs.table.$el.clientWidth + 5 + "px";
+        $(".right-box")[0].scrollTop = 0;
+        $(".right-box")[0].scrollLeft = 0;
+      });
+    },
+    /* 无频度的异常显示处理 7*12*/
+    nodataDeal() {
+      this.tableOption = [];
+      this.dateArr = [];
+      for (let i = 0; i < 7; i++) {
+        this.tableOption.push({
+          DataList: [],
+        });
+        if (this.tableOption.length >= 7) break;
+      }
+      for (let i = 0; i < 12; i++) {
+        this.dateArr.push("");
+        if (this.dateArr.length >= 12) break;
+      }
+    },
+    /* 滚动加载 */
+    scrollHandle(e) {
+      if (this.isShowSingleData) return;
+      const dom = e.target;
+      let total = dom.scrollTop + dom.clientHeight;
+      if (total >= dom.scrollHeight && this.havemore) {
+        this.page_no++;
+        console.log("load下一页");
+        this.getDataList();
+      }
+    },
+    /* 数据导出 */
+    exportClick() {
+      this.btnload = true;
+      const link = document.createElement("a");
+      link.href = this.exportDataUrl;
+      link.download = "";
+      link.click();
+      setTimeout(() => {
+        this.btnload = false;
+      }, 5000);
+    },
+    //左侧搜索
+    async handleLeftSearch(query, cb) {
+      cb([]);
+      if (!query) return;
+      const res = await fwmtInterface.getTargetListByName({
+        Keyword: query,
+      });
+      if (res.Ret === 200) {
+        let arr = res.Data || [];
+        if (!arr.length) {
+          cb([{ nodata: true }]);
+        } else {
+          cb(arr);
+        }
+      }
+    },
+    // 选中左侧搜索值
+    handleSelectLeftSearchval(e) {
+      if (!e.IndexCode) return;
+      this.leftSearchTradeCode = e.IndexCode;
+      this.leftSearchVal = e.IndexName;
+
+      // 获取单独指标数据
+      this.getTargetDataList(e.IndexCode);
+    },
+
+    getTargetData(code, arr) {
+      for (const item of arr) {
+        if (item.BaseFromBaiinfoIndexCode === code) return item;
+        if (item.Children && item.Children.length) {
+          const _item = this.getTargetData(code, item.Children);
+          if (_item) return _item;
+        }
+      }
+    },
+    // 对[#,;]转义
+    escapeStr(str) {
+      return str.replace(/#/g, escape("#")).replace(/;/g, escape(";")); 
+    },
+  
+    //改变选中节点
+    nodeChangeHandle(data, node) {
+      if (data.ClassifyId === this.select_classify) return;
+      this.select_classify = data.ClassifyId;
+      if(data.ParentId===0&&data.Child){
+        this.rightShow=false
+        return
+      }
+      this.leftSearchVal=''
+      this.page_no = 1;
+      this.page_size = 20;
+      this.getDataList()
+    },
+   
+  },
+  computed: {
+    exportDataUrl() {
+      // 数据导出接口
+      let urlStr = this.exportBase;
+      // token
+      urlStr += `?${localStorage.getItem("auth") || ""}`;
+      if (this.isShowSingleData) {
+        // 指标id
+        urlStr += `&IndexCode=${
+          this.isShowSingleData ? this.leftSearchTradeCode : ""
+        }`;
+      } else {
+        // 目录id
+        urlStr += `&ClassifyId=${
+          this.isShowSingleData ? "" : this.select_classify
+        }`;
+      }
+      return this.escapeStr(urlStr);
+    },
+  },
+  created() {},
+  mounted() {
+    this.getClassify();
+  },
+};
+</script>
+<style lang="scss">
+@import "../css/customtree.scss";
+.smmTarget-dialog-cont {
+  .el-cascader {
+    .el-input {
+      width: 100% !important;
+    }
+  }
+}
+</style>
+<style lang="scss" scoped>
+.smmTarget-container {
+  display: flex;
+  * {
+    box-sizing: border-box;
+  }
+  .minHeight {
+    height: calc(100vh - 120px);
+    background-color: #fff;
+    box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
+    border-radius: 4px;
+  }
+  div::-webkit-scrollbar {
+    width: 5px !important;
+  }
+  .left-cont {
+    min-width: 300px;
+    width: 300px;
+    margin-right: 20px;
+    padding: 30px 0;
+    overflow: hidden;
+    position: relative;
+    .left-top {
+      padding: 0 20px;
+    }
+    .scroll-wrap {
+      padding: 0 10px;
+      height: calc(100vh - 280px);
+      overflow-y: auto;
+      .target_tree {
+        color: #333;
+        .label-input .el-input__inner {
+          height: 25px;
+          line-height: 25px;
+        }
+        .custom-tree-node {
+          display: flex !important;
+          justify-content: space-between;
+          align-items: center;
+          display: block;
+          flex: 1;
+          .node_label {
+            margin-right: 2px;
+          }
+          .el-icon-view {
+            color: #409eff;
+            font-size: 18px;
+            margin-left: 5px;
+          }
+        }
+      }
+      .add-cont {
+        margin: 50px 0 20px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        color: #409eff;
+        font-size: 16px;
+        cursor: pointer;
+      }
+    }
+    .move-btn {
+      height: 100%;
+      width: 4px;
+      position: absolute;
+      right: 0px;
+      top: 0;
+      &:hover {
+        cursor: col-resize;
+      }
+    }
+    .classify-list {
+      padding: 0 20px;
+      /* margin-top: 20px; */
+      height: calc(100vh - 280px);
+      overflow-y: auto;
+      .classify-item {
+        font-size: 14px;
+        color: #666;
+        margin-bottom: 20px;
+        &:hover {
+          cursor: pointer;
+          color: #409eff;
+        }
+        &.act {
+          color: #409eff;
+        }
+      }
+    }
+  }
+  .right-cont {
+    width: 82%;
+    padding: 30px;
+    .right-box {
+      max-width: 100%;
+      max-height: calc(100vh - 230px);
+      border-left: 1px solid #dcdfe6;
+      border-right: 1px solid #dcdfe6;
+      overflow: auto;
+      .data-header {
+        width: 100%;
+        position: sticky;
+        top: 0;
+        z-index: 2;
+      }
+      .data-cont {
+        height: calc(100vh - 444px);
+      }
+      .nodata {
+        height: calc(100vh - 460px);
+        border: 1px solid #dcdfe6;
+        font-size: 16px;
+        color: #999;
+      }
+    }
+    .frequency-list {
+      margin-top: 20px;
+      display: flex;
+      flex-wrap: wrap;
+      .frequency-btn {
+        width: 112px;
+        margin: 0 30px 10px 0;
+      }
+    }
+    .nodata-cont {
+      width: 150px !important;
+      text-align: center;
+      color: #666;
+      font-size: 16px;
+      margin: 0 auto;
+    }
+  }
+}
+.dialog-cont {
+  padding-left: 50px;
+}
+.dia-bot {
+  display: flex;
+  justify-content: center;
+}
+</style>

+ 388 - 0
src/views/dataEntry_manage/thirdBase/coalWord.vue

@@ -0,0 +1,388 @@
+<template>
+  <div class="coal-word-container coal-similarity-container" >
+    <span
+        class="slide-btn-icon"
+        :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" v-show="isLeftWrapShow">
+      <div class="left-top">
+        <el-button
+          style="width: 100%;margin-bottom: 10px;"
+          type="primary"
+          plain
+          size="medium"
+          @click="exportClick"
+          :loading="btnload"
+          v-permission="permissionBtn.dataSourcePermission.coalWordData_export" 
+          >导出Excel</el-button
+        >
+        <el-autocomplete
+          style="margintop: 20px; width: 100%"
+          prefix-icon="el-icon-search"
+          v-model="leftSearchVal"
+          :fetch-suggestions="handleLeftSearch"
+          :trigger-on-focus="false"
+          placeholder="指标名称/指标ID"
+          @select="handleSelectLeftSearchval"
+          @blur="searchvalBlur"
+          @clear="searchvalClear"
+          popper-class="el-autocomplete-suggestion-data-entry"
+          clearable
+        >
+          <template slot-scope="scope">
+            <div v-if="scope.item.nodata" style="text-align: center">
+              暂无数据
+            </div>
+            <div v-else>
+              {{ scope.item.IndexName }}
+            </div>
+          </template>
+        </el-autocomplete>
+      </div>
+      <ul class="classify-list">
+        <li
+          :class="['classify-item', { act: select_classify == item.Area }]"
+          v-for="item in classifyList"
+          :key="item.Area"
+          @click="changeClassify(item)"
+        >
+          {{ item.Area }}
+        </li>
+      </ul>
+    </div>
+    <div
+      class="right-cont minHeight"
+      v-loading="dataloading"
+      element-loading-text="获取数据中..."
+    >
+      <div class="right-box" v-if="rightShow"
+        v-infinite-scroll="loadNext"
+        :infinite-scroll-disabled="!haveMore"
+        :infinite-scroll-immediate="false">
+        <template v-if="dateArr.length">
+          <div class="data-header">
+            <lz-table
+              :tableOption="tableOption"
+              tableType="header"
+              ref="table"
+              source="coalWord"
+            />
+          </div>
+          <div class="data-cont" >
+            <lz-table
+              :tableOption="tableOption"
+              tableType="data"
+              :dateArr="dateArr"
+              source="coalWord"
+            />
+          </div>
+        </template>
+        <tableNoData v-else text="暂无数据" class="nodata"></tableNoData>
+      </div>
+      <div class="frequency-list" v-if="rightShow">
+        <el-button
+          type="primary"
+          class="frequency-btn"
+          :plain="select_frequency !== item"
+          v-for="item in frequencyList"
+          :key="item"
+          @click="changeFrequency(item)"
+          >{{ item }}</el-button
+        >
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import lzTable from "@/components/lzTable.vue";
+import { coalWordInterface } from "@/api/api.js";
+export default {
+  name: "coalWord",
+  components: { lzTable },
+  watch: {
+    select_classify(newval) {
+      if (!this.isAuto) return;
+      this.select_frequency = "";
+      newval && this.getFrequency();
+    },
+    select_frequency(newval) {
+      if (!this.isAuto) return;
+      newval && this.getDataList();
+    },
+  },
+  computed: {
+    exportApi() {
+      // 数据导出接口
+      let urlStr = this.exportBase;
+      // token
+      urlStr += `?${localStorage.getItem("auth") || ""}`;
+      // 分类名称
+      urlStr += `&Area=${this.select_classify}`;
+      // 指标Id
+      urlStr += `&IndexCode=${this.leftSearchTradeCode}`;
+      return this.escapeStr(urlStr);
+    },
+  },
+  created() {
+    if(this.permissionBtn.isShowBtn('dataSourcePermission','coalWordData_view')){
+      this.getClassify();
+    }else{
+      this.rightShow=true
+    }
+  },
+  data() {
+    return {
+      isLeftWrapShow:true,
+      dataloading: false,
+      rightShow: false,
+      exportBase: process.env.VUE_APP_API_ROOT + "/entry/export/mtjh", //数据导出接口
+      select_classify: "",
+      classifyList: [],
+      select_frequency: "",
+      PageSize:20,
+      CurrentIndex:1,
+      haveMore:true,
+      frequencyType: new Map([
+        [1, "日度"],
+        [2, "周度"],
+        [3, "月度"],
+        [4, "季度"],
+        [5, "年度"],
+        [99, "无固定频率"],
+      ]),
+      frequencyList: [],
+      tableOption: [],
+      dateArr: [], //最长的日期数组
+      btnload: false,
+      leftSearchVal: "", //左侧搜索值
+      leftSearchTradeCode: "", //如果是搜索选择的 则有此code
+      isAuto: true, // 改变分类时是否自动获取数据
+    };
+  },
+  methods: {
+    /* 获取分类 */
+    getClassify() {
+      coalWordInterface.classifyList().then((res) => {
+        if (res.Ret !== 200) return;
+        this.classifyList = res.Data || [];
+        this.select_classify =
+          this.select_classify || this.classifyList[0].Area;
+      });
+    },
+    /* 获取频度 */
+    getFrequency(defaultSelect) {
+      coalWordInterface.getFrequencyList({
+        Area: this.select_classify,
+      }).then((res) => {
+        if (res.Ret !== 200) return;
+        this.frequencyList = res.Data || []
+        //设置当前选中的频度,若传入有默认选项则选中默认频度,否则选中列表第一个
+        this.select_frequency = defaultSelect || this.frequencyList[0];
+        //如果有默认频度,结束后恢复watcher
+        this.$nextTick(() => {
+          if (defaultSelect) this.isAuto = true;
+        });
+      });
+    },
+    /* 获取数据 */
+    getDataList() {
+      this.dataloading = true;
+      coalWordInterface.dataList({
+        Area: this.select_classify,
+        PageSize: this.PageSize,
+        CurrentIndex:this.CurrentIndex,
+        Frequency: this.select_frequency,
+      }).then((res) => {
+        this.rightShow = true;
+        if (res.Ret !== 200) return;
+
+        // 找出最多的页码 判断是否还有数据
+        let page_arrs = res.Data.map((item) => item.Paging?item.Paging.Pages:0);
+        let totalPage = Math.max.apply(Math, page_arrs);
+        this.haveMore = this.CurrentIndex < totalPage ? true : false;
+        // 设置表格数据
+        this.setDataList(res.Data || []);
+
+        this.CurrentIndex == 1 &&
+          this.$nextTick(() => {
+            this.initWidth();
+          });
+      }).finally(()=>{
+        this.dataloading = false;
+      })
+    },
+    /* 滚动加载 */
+    loadNext() {
+      this.CurrentIndex++;
+      if(this.leftSearchTradeCode){
+        this.getTargetDataList()
+      }else{
+        this.getDataList();
+      }
+    },
+    /* 改变分类 */
+    changeClassify(item) {
+      if(this.dataloading) return 
+      this.select_classify = item.Area;
+      this.leftSearchVal = "";
+      this.leftSearchTradeCode = ""
+      this.CurrentIndex=1
+    },
+    /* 改变频度 */
+    changeFrequency(item) {
+      if(this.select_frequency == item) return 
+      this.select_frequency = item;
+      this.leftSearchVal = "";
+      this.CurrentIndex=1
+    },
+    initWidth() {
+      $(".right-box")[0].style.width =
+      this.$refs.table ? this.$refs.table.$el.clientWidth + 2 + "px":0
+      $(".right-box")[0].scrollTop = 0;
+      $(".right-box")[0].scrollLeft = 0;
+    },
+    /* 数据导出 */
+    exportClick() {
+      this.btnload = true;
+      console.log({
+        Area:this.select_classify,
+        IndexCode:this.leftSearchTradeCode
+      },this.exportApi);
+      const link = document.createElement("a");
+      link.href = this.exportApi;
+      link.download = "";
+      link.click();
+      setTimeout(() => {
+        this.btnload = false;
+      }, 2000);
+    },
+
+    //左侧搜索
+    async handleLeftSearch(query, cb) {
+      cb([]);
+      if (!query) return;
+      const res = await coalWordInterface.targetListSearch({
+        Keyword: query,
+      });
+      if (res.Ret === 200) {
+        let arr = res.Data || [];
+        if (!arr.length) {
+          cb([{ nodata: true }]);
+        } else {
+          cb(arr);
+        }
+      }
+    },
+    // 选中左侧搜索值
+    handleSelectLeftSearchval(e) {
+      if (!e.IndexCode || this.dataloading) return;
+      this.leftSearchTradeCode = e.IndexCode;
+      this.leftSearchVal = e.IndexName;
+      this.select_classify = e.Area
+      // 关闭watcher
+      this.isAuto = false;
+      this.getFrequency(e.Frequency);
+      this.CurrentIndex=1
+      this.getTargetDataList()
+      this.$nextTick(() => {
+        this.handleScrollLeftWrap();
+      });
+    },
+    searchvalBlur(){
+      if((!this.leftSearchVal) && this.leftSearchTradeCode){
+        this.searchvalClear()
+      }   
+    },
+    searchvalClear(){
+      this.CurrentIndex=1
+      this.leftSearchTradeCode=''
+      this.getDataList();
+    },
+    // 左侧滚动
+    handleScrollLeftWrap() {
+      let top = $(".act")[0].offsetTop;
+      $(".classify-list").animate({
+        scrollTop: top - 200,
+      });
+    },
+    // 获取单个指标数据
+    getTargetDataList() {
+      if (!this.leftSearchTradeCode) return;
+      this.dataloading = true;
+
+      try {
+        coalWordInterface.getTargetDataList({
+          IndexCode: this.leftSearchTradeCode,
+          Pagesize: this.PageSize,
+          CurrentIndex: this.CurrentIndex
+        }).then(res=>{
+          if (res.Ret !== 200) return;
+
+          this.haveMore = this.CurrentIndex < res.Data.Paging.Pages ? true : false;
+          this.setDataList([res.Data])
+
+          this.CurrentIndex == 1 &&
+            this.$nextTick(() => {
+              this.initWidth();
+            });
+        }).finally(()=>{
+          this.dataloading = false;
+        })
+      } catch (err) {
+        console.error(err);
+        this.dataloading = false;
+      }
+    },
+    // 设置表格数据
+    setDataList(data) {
+      if(this.CurrentIndex ==1){
+        this.tableOption = data;
+        /* 不满6个追加6个空的显示一排 别问 问就是为了美观  */
+        if (data.length < 6){
+          for (let i = 0; i < 6; i++) {
+            this.tableOption.push({
+              DataList: [],
+            });
+            if (this.tableOption.length >= 6) break;
+          }
+        }
+      }else{
+        this.tableOption.forEach((item) => {
+          data.forEach((_item) => {
+            if (item.IndexCode === _item.IndexCode) {
+              item.DataList = item.DataList.concat(_item.DataList);
+            }
+          });
+        });
+      }   
+      // 合并所有日期
+      let arr = this.tableOption.map((item) => item.DataList);
+      let obj = [];
+      arr.forEach((dataList) => {
+        obj.push(...dataList.map((item) => item.DataTime));
+      });
+      // 日期去重倒序排序
+      this.dateArr = [...new Set(obj)].sort().reverse();
+      //数据最大长度小于12个 追加数据满12个 别问 问就是为了美观
+      if (this.dateArr.length < 12){
+        for (let i = 0; i < 12; i++) {
+          this.dateArr.push("");
+          if (this.dateArr.length >= 12) break;
+        }
+      }
+
+    },
+    // 对[#,;]转义
+    escapeStr(str) {
+      return str.replace(/#/g, escape("#")).replace(/;/g, escape(";"));
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "../css/coalCommon.scss";
+</style>

+ 279 - 0
src/views/dataEntry_manage/thirdBase/gqExchangeData.vue

@@ -0,0 +1,279 @@
+<template>
+    <div class="exchangedata-wrap">
+        <span class="slide-btn-icon" :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow">
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+        <div class="left-wrap box" v-show="isLeftWrapShow">
+            <el-date-picker  style="width:100%"  v-model="time" type="date" placeholder="选择日期"
+            value-format="yyyy-MM-dd" :clearable="false" @change="handleTimeChange">
+            </el-date-picker>
+            <div class="scroll-wrap">
+                <el-tree ref="treeRef" class="target_tree custom-tree" :data="typeList" 
+                node-key="BaseFromTradeGuangzhouClassifyId" :default-expanded-keys="defaultShowNodes"
+                :props="{
+                    label: 'ClassifyName',
+                    children: 'Children',
+                }"
+                :current-node-key="type" empty-text="暂无分类" @current-change="handleChangeType">
+                    <span slot-scope="{ node, data }">{{ data.ClassifyName }}</span>
+                </el-tree>
+            </div>
+        </div>
+        <div class="right-wrap box" v-loading="loading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading">
+            <el-button v-if="list.length>0 && haveSummation && (!summationView)" 
+                class="export-button" type="primary" plain @click="excelExport" :loading="exportBtnload">导出Excel</el-button>
+            <div class="content" v-if="list.length>0">
+                <table width="auto" border="0">
+                    <thead class="border-head">
+                        <tr>
+                            <td v-for="(val,index) in labelArr" :key="`${val}_${index}`">
+                                {{ val }}
+                            </td>
+                            <td v-if="haveSummation && summationView">操作</td>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        <tr v-for="item in list" :key="item.BaseFromTradeGuangzhouIndexId">
+                            <td v-for="(val,key) in labelArr" :key="key">{{item[key]}}</td>
+                            <td v-if="haveSummation && summationView">
+                                <el-button type="text" @click="detailView(item)">查看详情</el-button>
+                            </td>
+                        </tr>
+                    </tbody>
+                </table>
+            </div>
+            <div class="empty-wrap" v-else>
+                <tableNoData text="暂无数据"/>
+            </div>
+            <div class="num-warp" v-if="numList.length>0">
+                <div v-for="item in numList" :key="item.BaseFromTradeGuangzhouContractId" 
+                :class="['num-box',num===item.BaseFromTradeGuangzhouContractId&&'num-active']" @click="handleChangeNum(item)">
+                    {{item.Contract}}
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+// 广期所数据
+import { guangqiInterface } from "@/api/api.js";
+import {waitRequestReturn} from '@/utils/common.js'
+export default {
+    name: "gqExchangeData",
+    data() {
+        return {
+            isLeftWrapShow:true,
+            labelArr: {
+                IndexCode: "指标ID",
+                IndexName: "指标名称",
+                Value: "数值",
+                Unit: "单位",
+                Frequency: "频度",
+                StartDate: "起始日期",
+                EndDate: "最新日期",
+                // Operations:"操作"
+            },
+            summationView:true,// 当前是否是合计
+            haveSummation:false, // 是否有合计
+            time:'',
+            topLevelType:'',
+            type:'',
+            typeList:[],
+            defaultShowNodes:[],
+            numList:[],
+            num:'',
+            list:[],
+            loading:false,
+            tradeIndexId:'',
+            exportApi:process.env.VUE_APP_API_ROOT + "/data_source/gfex/index/detail/export",
+            exportBtnload:false
+        };
+    },
+    watch:{
+        type(value){
+            this.summationView=true
+        },
+        time(value){
+            this.summationView=true
+        }
+    },
+    computed:{
+        exportUrl(){
+            let url=this.exportApi + 
+                `?${localStorage.getItem("auth") || ""}&BaseFromTradeGuangzhouIndexId=${this.tradeIndexId}&TradeDate=${this.time}`
+            return this.escapeStr(url);
+        }
+    },
+    created () {
+        this.getClassifyListFun()  
+        this.getNewtestDateFun()  
+        waitRequestReturn(()=> this.type && this.time,this.getNumList,10)
+    },
+    methods: {
+        escapeStr(str) {
+            return str.replace(/#/g, escape("#")).replace(/;/g, escape(";"));
+        },
+        handleChangeNum(e){
+            this.num=e.BaseFromTradeGuangzhouContractId
+            this.getData()
+        },
+
+        // 时间切换
+        handleTimeChange(){
+            this.getNumList()
+        },
+
+        // 获取分类
+        getClassifyListFun(){
+            guangqiInterface.getClassifyList().then(res=>{
+                if(res.Ret===200){
+                    this.typeList=res.Data || []
+                    try {
+                        this.type=this.typeList[0].Children[0].BaseFromTradeGuangzhouClassifyId
+                        this.topLevelType = this.typeList[0].BaseFromTradeGuangzhouClassifyId
+                        this.$nextTick(() => {
+                            this.$refs.treeRef.setCurrentKey(this.type);
+                        });
+                        this.defaultShowNodes=[this.typeList[0].BaseFromTradeGuangzhouClassifyId,this.typeList[0].Children[0].BaseFromTradeGuangzhouClassifyId]
+                    } catch (error) {
+                        console.error('Data的返回存在问题或为空');
+                    }
+                }
+            })
+        },
+        // 获取最新日期
+        getNewtestDateFun(){
+            guangqiInterface.getNewtestDate().then(res=>{
+                if(res.Ret == 200){
+                    this.time=res.Data || this.$moment(new Date()).format('YYYY-MM-DD')
+                }
+            })
+        },
+        handleChangeType(data, node) {
+            if (data.BaseFromTradeGuangzhouClassifyId == this.type || (!data.ParentId)) return;
+            this.type = data.BaseFromTradeGuangzhouClassifyId
+            this.topLevelType = data.ParentId
+            this.getNumList()
+        },
+        // 获取合约号
+        async getNumList(){
+            this.loading=true
+            guangqiInterface.getContractList({
+                BaseFromTradeGuangzhouClassifyId:this.type,
+                TradeDate:this.time,
+            }).then(res=>{
+                if(res.Ret===200){
+                    this.numList=res.Data||[]
+                    this.num=this.numList[0]?this.numList[0].BaseFromTradeGuangzhouContractId||'':''
+                    this.getData()
+                }else{
+                    this.loading=false
+                }
+            }).catch(()=>{
+                this.loading=false
+            })
+        },
+        getData(){
+            $('.content').animate({scrollTop:0},0)
+            this.loading=true
+            guangqiInterface.getIndexDataList({
+                BaseFromTradeGuangzhouClassifyId:this.type,
+                TradeDate:this.time,
+                BaseFromTradeGuangzhouContractId:this.num
+            }).then(res =>{
+                if(res.Ret===200){
+                    this.list=res.Data || []
+                }
+            }).finally(()=>{
+                this.haveSummation = this.topLevelType == 4
+                this.loading=false
+            })
+        },
+        detailView(item){
+            this.loading=true
+            this.tradeIndexId = item.BaseFromTradeGuangzhouIndexId
+            let params={
+                BaseFromTradeGuangzhouIndexId:item.BaseFromTradeGuangzhouIndexId,
+                TradeDate:this.time
+            }
+            guangqiInterface.getIndexDataDetail(params).then(res=>{
+                if(res.Ret == 200){
+                    this.list=res.Data || []
+                    this.summationView=false
+                }
+            })
+            .finally(()=>{
+                this.loading=false
+            })
+        },
+        excelExport(){
+            this.exportBtnload = true;
+            const link = document.createElement("a");
+            link.href = this.exportUrl;
+            link.download = "";
+            link.click();
+            setTimeout(() => {
+                this.exportBtnload = false;
+            }, 2000);
+        }
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../css/exchangedata.scss";
+
+.exchangedata-wrap{
+    .right-wrap{
+        display: flex;
+        flex-direction: column;
+        .export-button{
+            align-self: flex-start;
+            padding:0 40px;
+            margin-bottom: 20px;
+            height: 40px;
+        }
+        .content{
+            flex-grow: 1;
+            min-height: 90%;
+        }
+        .empty-wrap{
+            min-height: 90%;
+            flex-grow: 1;
+        }
+    }
+    .slide-btn-icon{
+        &.slide-left{
+            left:285px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+      }
+    .left-wrap{
+        width: 300px;
+    }
+}
+
+.scroll-wrap {
+    margin: 20px 0;
+    height: calc(100vh - 250px);
+    overflow-y: auto;
+    .target_tree {
+        color: #333;
+    }
+}
+
+thead{
+    position: sticky;
+    top: 0;
+    left: 0;
+    border-top: 1px solid #dcdfe6;
+}
+</style>
+<style lang="scss">
+@import "../css/customtree.scss";
+
+</style>

+ 292 - 0
src/views/dataEntry_manage/thirdBase/icpiConsumption.vue

@@ -0,0 +1,292 @@
+<template>
+  <div class="icpc-container coal-similarity-container">
+    <span
+        class="slide-btn-icon"
+        :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" v-show="isLeftWrapShow">
+      <div class="left-top">
+        <el-button
+          style="width: 100%;"
+          type="primary"
+          plain
+          size="medium"
+          @click="exportClick"
+          :loading="btnload"
+          >导出Excel</el-button
+        >
+        <el-autocomplete
+          style="margin-top: 20px; width: 100%"
+          prefix-icon="el-icon-search"
+          v-model="leftSearchVal"
+          :fetch-suggestions="handleLeftSearch"
+          :trigger-on-focus="false"
+          placeholder="指标名称/指标ID"
+          @select="handleSelectLeftSearchval"
+          popper-class="el-autocomplete-suggestion-data-entry"
+          @clear="clearSearchVal"
+          clearable
+        >
+          <template slot-scope="scope">
+            <div v-if="scope.item.nodata" style="text-align: center">
+              暂无数据
+            </div>
+            <div v-else>
+              {{ scope.item.IndexName }}
+            </div>
+          </template>
+        </el-autocomplete>
+      </div>
+      <ul class="classify-list">
+        <li
+          :class="['classify-item', { act: select_classify === item.BaseFromIcpiClassifyId }]"
+          v-for="item in classifyList"
+          :key="item.BaseFromIcpiClassifyId"
+          @click="changeClassify(item)"
+        >
+          {{ item.ClassifyName }}
+        </li>
+      </ul>
+    </div>
+    <div
+      class="right-cont minHeight"
+      v-loading="dataloading"
+      element-loading-text="获取数据中..."
+    >
+      <div class="right-box" v-if="rightShow" @scroll="scrollHandle">
+        <template v-if="dateArr.length">
+          <div class="data-header">
+            <lz-table
+              :tableOption="tableOption"
+              tableType="header"
+              ref="table"
+              source="icpi"
+            />
+          </div>
+          <div class="data-cont">
+            <lz-table
+              :tableOption="tableOption"
+              tableType="data"
+              :dateArr="dateArr"
+              source="icpi"
+            />
+          </div>
+        </template>
+        <tableNoData v-else text="暂无数据" class="nodata"></tableNoData>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import lzTable from "@/components/lzTable.vue";
+import { lzDataInterface } from "@/api/api.js";
+import { icpiInterface } from "@/api/api.js";
+
+export default {
+  name: "icpiConsumption",
+  components: { lzTable },
+  data() {
+    return {
+      isLeftWrapShow:true,
+      dataloading: false,
+      rightShow: false,
+      exportBase: process.env.VUE_APP_API_ROOT + "/data_source/icpi/export/icpiDataList", //数据导出接口
+      select_classify: "",
+      classifyList: [],
+      tableOption: [],
+      dateArr: [], //最长的日期数组
+      btnload: false,
+
+      leftSearchVal: "", //左侧搜索值
+      pageParams:{
+        PageSize:20,
+        CurrentIndex:1,
+        KeyWord:''
+      },
+      havemore:true
+    };
+  },
+  computed: {
+    exportIcpiApi() {
+      // 数据导出接口
+      let urlStr = this.exportBase;
+      // token
+      urlStr += `?${localStorage.getItem("auth") || ""}`;
+      // 分类Id参数
+      urlStr += `&BaseFromIcpiClassifyId=${this.select_classify}`;
+      urlStr += `&KeyWord=${this.pageParams.KeyWord}`;
+      return this.escapeStr(urlStr);
+    },
+  },
+  created() {
+    this.getClassify();
+  },
+  methods: {
+    /* 获取分类 */
+    getClassify() {
+      icpiInterface.classifyList().then((res) => {
+        if (res.Ret !== 200) return;
+        this.classifyList = res.Data || [];
+        this.select_classify =
+          this.select_classify || this.classifyList[0].BaseFromIcpiClassifyId;
+        
+        this.getDataList()
+      });
+    },
+
+    /* 获取数据 */
+    getDataList() {
+      this.dataloading = true;
+      icpiInterface.dataList({
+        BaseFromIcpiClassifyId: Number(this.select_classify),
+        PageSize:this.pageParams.PageSize,
+        CurrentIndex:this.pageParams.CurrentIndex,
+        KeyWord:this.pageParams.KeyWord
+      }).then((res) => {
+        this.rightShow = true;
+        if (res.Ret !== 200) return;
+
+        // 找出最多的页码 判断是否还有数据
+        let page_arrs = res.Data.map((item) => item.Paging?item.Paging.Pages:0);
+        let totalPage = Math.max.apply(Math, page_arrs);
+        this.havemore = this.pageParams.CurrentIndex < totalPage ? true : false;
+        
+        // 设置表格数据
+        this.setDataList(res.Data);
+        this.$nextTick(() => {
+          this.initWidth();
+        });
+      }).finally(()=>{
+        this.dataloading = false;
+      })
+    },
+    /* 改变品种 */
+    changeClassify(item) {
+      this.select_classify = item.BaseFromIcpiClassifyId;
+      this.leftSearchVal = ""
+      this.pageParams.KeyWord=''
+      this.getDataList()
+    },
+
+    initWidth() {
+      $(".right-box")[0].style.width =
+      this.$refs.table ? this.$refs.table.$el.clientWidth + 2 + "px":'0';
+      $(".right-box")[0].scrollTop = 0;
+      $(".right-box")[0].scrollLeft = 0;
+    },
+    // 对[#,;]转义
+    escapeStr(str) {
+      return str.replace(/#/g, escape("#")).replace(/;/g, escape(";")); 
+    },
+    /* 导出 */
+    exportClick() {
+      this.btnload = true;
+      const link = document.createElement("a");
+      link.href = this.exportIcpiApi;
+      link.download = "";
+      link.click();
+      setTimeout(() => {
+        this.btnload = false;
+      }, 2000);
+    },
+
+    //左侧搜索
+    async handleLeftSearch(query, cb) {
+      cb([]);
+      if (!query) return;
+      const res = await icpiInterface.dataList({
+        KeyWord: query
+      });
+      if (res.Ret === 200) {
+        let arr = res.Data || [];
+        if (!arr.length) {
+          cb([{ nodata: true }]);
+        } else {
+          cb(arr);
+        }
+      }
+    },
+    // 选中左侧搜索值
+    handleSelectLeftSearchval(e) {
+      if (!e.BaseFromIcpiIndexId) return;
+      this.rightShow = false;
+      this.leftSearchVal = e.IndexName;
+      this.pageParams.KeyWord=e.IndexName
+      this.select_classify = e.BaseFromIcpiClassifyId;
+      this.pageParams.CurrentIndex=1
+      this.getDataList()
+      this.$nextTick(() => {
+        this.rightShow = true;
+        this.handleScrollLeftWrap();
+      });
+    },
+    clearSearchVal(){
+      this.pageParams.KeyWord=''
+      this.getDataList()
+    },
+    // 左侧滚动
+    handleScrollLeftWrap() {
+      let top = $(".act")[0].offsetTop;
+      $(".classify-list").animate({
+        scrollTop: top - 200,
+      });
+    },
+    /* 滚动加载 */
+    scrollHandle(e) {
+      const dom = e.target;
+      let total = dom.scrollTop + dom.clientHeight;
+      if (total >= dom.scrollHeight && this.havemore) {
+        this.pageParams.CurrentIndex++;
+        // console.log("load下一页");
+        this.getDataList();
+      }
+    },
+    // 设置表格数据
+    setDataList(data) {
+      if(this.pageParams.CurrentIndex==1){
+        this.tableOption = data;
+        /* 不满7个追加7个空的显示一排 别问 问就是为了美观  */
+        if (this.tableOption.length < 7){
+          for (let i = 0; i < 7; i++) {
+            this.tableOption.push({
+              DataList: [],
+            });
+            if (this.tableOption.length >= 7) break;
+          }
+        }
+      }else{
+        this.tableOption.forEach((item) => {
+          data.forEach((_item) => {
+            if (item.IndexCode === _item.IndexCode) {
+              item.DataList = item.DataList.concat(_item.DataList);
+            }
+          });
+        });
+      }
+
+      // 合并所有日期
+      let arr = this.tableOption.map((item) => item.DataList);
+      let obj = [];
+      arr.forEach((dataList) => {
+        obj.push(...dataList.map((item) => item.DataTime));
+      });
+      // 日期去重倒序排序
+      this.dateArr = [...new Set(obj)].sort().reverse();
+      //数据最大长度小于13个 追加数据满13个 别问 问就是为了美观
+      if (this.dateArr.length < 13){
+        for (let i = 0; i < 13; i++) {
+          this.dateArr.push("");
+          if (this.dateArr.length >= 13) break;
+        }
+      }
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "../css/coalCommon.scss";
+</style>

+ 15 - 0
src/views/datasheet_manage/addSheet.vue

@@ -175,6 +175,14 @@ export default {
       }
       const res = await sheetInterface.sheetEdit(params)
       if(res.Ret !==200) return
+
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
 
       // console.log("自动保存");
@@ -214,6 +222,13 @@ export default {
 
       this.loading.close()
       if(res.Ret !==200) return
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
       
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;

+ 37 - 32
src/views/datasheet_manage/components/MixedTable.vue

@@ -563,44 +563,49 @@ export default {
 
       //去处理每一组关联的情况
       haveRelationArr.forEach( async(relation) => {
-        const { relation_date,relation_edb } = relation;
+        const { relation_date,relation_edb,type } = relation;
   
         if((relation_date.key === key && cell.DataType === 1) || (relation_edb.key === key && cell.DataType === 2)) { //单元格类型不变只变值仍有关联关系 更新值
-  
-          //刷新插入值结果
-          let params = null;
-          if(relation_date.key === key && cell.DataType === 1) { //修改的是依赖日期格
-            let { EdbInfoId } = findCellByKey(this.config.data,relation.key)
-            params = {
-              EdbInfoId,
-              Date: cell.ShowValue
+
+          //类型4的表格插值才调接口刷数据 之后关联的有其他类型插值 区分一下
+          if(type === 4) {
+
+            //刷新插入值结果
+            let params = null;
+            if(relation_date.key === key && cell.DataType === 1) { //修改的是依赖日期格
+              let { EdbInfoId } = findCellByKey(this.config.data,relation.key)
+              params = {
+                EdbInfoId,
+                Date: cell.ShowValue
+              }
+    
+            } else if( relation_edb.key === key && cell.DataType === 2) { //修改的依赖指标格
+              let {ShowValue} = findCellByKey(this.config.data,relation_date.key)
+              params = {
+                EdbInfoId: cell.EdbInfoId,
+                Date: ShowValue
+              }
             }
+    
+            const res = await sheetInterface.insertData(params)
+            if(res.Ret !==200) return
   
-          } else if( relation_edb.key === key && cell.DataType === 2) { //修改的依赖指标格
-            let {ShowValue} = findCellByKey(this.config.data,relation_date.key)
-            params = {
-              EdbInfoId: cell.EdbInfoId,
-              Date: ShowValue
-            }
+            //现在日期无值也不清除关系了
+            // !res.Data && this.updateInsertCell(relation.key);
+            
+            this.config.data.forEach(row => {
+              row.forEach(cell => {
+                if(cell.Uid === relation.key) {
+                    cell.DataType = relation.type;
+                    cell.ShowValue = res.Data;
+                    cell.Value = res.Data;
+                    cell.EdbInfoId = params.EdbInfoId;
+                    cell.DataTime = params.Date;
+                }
+              })
+            })
           }
   
-          const res = await sheetInterface.insertData(params)
-          if(res.Ret !==200) return
-
-          //现在日期无值也不清除关系了
-          // !res.Data && this.updateInsertCell(relation.key);
-          
-          this.config.data.forEach(row => {
-            row.forEach(cell => {
-              if(cell.Uid === relation.key) {
-                  cell.DataType = relation.type;
-                  cell.ShowValue = res.Data;
-                  cell.Value = res.Data;
-                  cell.EdbInfoId = params.EdbInfoId;
-                  cell.DataTime = params.Date;
-              }
-            })
-          })
   
         }else {
           // 清除插入值单元格式和关联关系

+ 14 - 2
src/views/datasheet_manage/components/SheetExcel.vue

@@ -54,12 +54,13 @@ export default {
     },
 
     copyData() {
-      let rangeArr = luckysheet.getRangeArray('twoDimensional');
+      let rangeArr = luckysheet.getRangeValue();
+      console.log(rangeArr)
       let str = ''
       rangeArr.forEach((item,r_index) => {
         let row = ''
         item.forEach((cell,index) => {
-          row+= `${index!==0?'\t':''}${cell||''}`
+          row+= `${index!==0?'\t':''}${cell?(cell.m||this.getCellContent(cell.ct.s)):''}`
         })
         str+= r_index===rangeArr.length-1 ? row : `${row}\n`
       });
@@ -67,6 +68,17 @@ export default {
       copyFit(str)
     },
 
+    // 单元格内的文字分段
+    getCellContent(arr) {
+      if(!arr||!arr.length) return ''
+      let cellStr = ''
+      arr.forEach(_ => {
+        cellStr+=_.v.replace(/\r/,'').replace(/\n/,'')
+      })
+
+      return cellStr;
+    },
+
     updateEmit(){
       this.$emit("updated")
     }

+ 34 - 20
src/views/datasheet_manage/customSheetEdit.vue

@@ -112,12 +112,12 @@ export default {
             this.permissionBtn.isShowBtn('etaTablePermission','etaTable_customize_data_save')
     }
   },
-  beforeRouteLeave(to,from,next){
-    if(to.path!='/addMixedSheet'){
-      this.markFinishStatus()
-    }
-    next()
-  },
+  // beforeRouteLeave(to,from,next){
+  //   if(to.path!='/addMixedSheet'){
+  //     this.markFinishStatus()
+  //   }
+  //   next()
+  // },
   data() {
     return {
       sheetId: this.$route.query.id || '',
@@ -232,9 +232,17 @@ export default {
         Source: 3,
         TableData: this.$refs.customTableRef.getSaveParams()
       };
-      console.log("自动保存");
+      // console.log("自动保存");
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       if(res.Ret !==200) return
+
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.saveTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
     },1500),
     /* 保存表格 */
@@ -274,7 +282,13 @@ export default {
       : await sheetInterface.sheetAdd(params)
 
       if(res.Ret !==200) return
-
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;
       this.$message.success('保存成功')
       this.saveTime =  this.$moment().format('YYYY-MM-DD HH:mm:ss')
@@ -289,23 +303,23 @@ export default {
       //   }
       // })
     },300),
-    markFinishStatus(){
-      if((!this.sheetId) || (!this.isCanEdit)) return
-      sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
-        if(res.Ret != 200) return 
-      })
-    }
+    // markFinishStatus(){
+    //   if((!this.sheetId) || (!this.isCanEdit)) return
+    //   sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
+    //     if(res.Ret != 200) return 
+    //   })
+    // }
   },
   created() {
     this.getClassify();
     this.getDetail();
   },
-  mounted(){
-    window.addEventListener('beforeunload',this.markFinishStatus)
-  },
-  beforeDestroy(){
-    window.removeEventListener('beforeunload',this.markFinishStatus)
-  }
+  // mounted(){
+  //   window.addEventListener('beforeunload',this.markFinishStatus)
+  // },
+  // beforeDestroy(){
+  //   window.removeEventListener('beforeunload',this.markFinishStatus)
+  // }
 }
 </script>
 <style scoped lang="scss">

+ 32 - 18
src/views/datasheet_manage/mixedSheetEdit.vue

@@ -86,12 +86,12 @@ export default {
               this.permissionBtn.isShowBtn('etaTablePermission','etaTable_customize_mix_save')
     }
   },
-  beforeRouteLeave(to,from,next){
-    if(to.path!='/addMixedSheet'){
-      this.markFinishStatus()
-    }
-    next()
-  },
+  // beforeRouteLeave(to,from,next){
+  //   if(to.path!='/addMixedSheet'){
+  //     this.markFinishStatus()
+  //   }
+  //   next()
+  // },
   data() {
     return {
       sheetId: this.$route.query.id || '',
@@ -181,6 +181,13 @@ export default {
       console.log("自动保存");
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       if(res.Ret !==200) return
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
     },1500),
 
@@ -220,6 +227,13 @@ export default {
       : await sheetInterface.sheetAdd(params)
 
       if(res.Ret !==200) return
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
       
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;
@@ -227,23 +241,23 @@ export default {
       isAdd && this.$router.replace({path:'/addMixedSheet',query:{id:this.sheetId}})
     },300),
 
-    markFinishStatus(){
-      if((!this.sheetId) || (!this.isCanEdit)) return
-      sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
-        if(res.Ret != 200) return 
-      })
-    }
+    // markFinishStatus(){
+    //   if((!this.sheetId) || (!this.isCanEdit)) return
+    //   sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
+    //     if(res.Ret != 200) return 
+    //   })
+    // }
   },
   created() {
     this.getClassify();
     this.getDetail();
   },
-  mounted(){
-    window.addEventListener('beforeunload',this.markFinishStatus)
-  },
-  beforeDestroy(){
-    window.removeEventListener('beforeunload',this.markFinishStatus)
-  }
+  // mounted(){
+  //   window.addEventListener('beforeunload',this.markFinishStatus)
+  // },
+  // beforeDestroy(){
+  //   window.removeEventListener('beforeunload',this.markFinishStatus)
+  // }
 }
 </script>
 <style scoped lang="scss">

+ 64 - 7
src/views/datasheet_manage/sheetList.vue

@@ -344,7 +344,7 @@ export default {
   components: { mDialog, classifyDia, Sheet, CustomTable, MixedTable,sheetListWrap },
   mixins: [leftMixin],
   beforeRouteLeave(to,from,next){
-    if(from.path=='/sheetList' && to.path!='/sheetList'){
+    if(from.path=='/sheetList'){
       this.markFinishStatus()
     }
     next()
@@ -719,13 +719,21 @@ export default {
       });
       this.loading.close();
       if (res.Ret !== 200) return;
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        this.refreshOnlineExcel()
+        this.onlineExcelEditing=false
+        this.editButtonText = `${res.Data.Editor}编辑中`
+        return 
+      }
       this.$message.success("保存成功");
-      this.getTreeData();
+      this.markFinishStatus()
 
+      this.getTreeData();
       this.getDetailHandle();
     }, 300),
     autoSaveFun:_.debounce(async function(){
-      console.log("自动保存");
+      // console.log("自动保存");
       if(!this.onlineExcelEditing || this.cancelAutoSave){
         this.cancelAutoSave=false
         return
@@ -744,6 +752,14 @@ export default {
         Content: JSON.stringify(data),
       });
       if (res.Ret !== 200) return;
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        this.refreshOnlineExcel()
+        this.onlineExcelEditing=false
+        this.editButtonText = `${res.Data.Editor}编辑中`
+        this.autoSaveType=''
+        return 
+      }
       if(this.autoSaveType == "nameEdit"){
         this.getTreeData();
         this.autoSaveType=''
@@ -838,6 +854,11 @@ export default {
             3: "/addMixedSheet",
           };
           if(this.sheetDetailInfo.Source === 1) {
+            if(this.editButtonText.indexOf('编辑中')!=-1){
+              // 编辑中的状态 重新获取最新的详情数据
+              this.refreshOnlineExcel()
+            }
+
             this.onlineExcelEditing=true
           }else {
             this.$router.push({
@@ -911,7 +932,6 @@ export default {
     },
     // 标记 编辑完成
     markFinishStatus(select_id){
-      // console.log(select_id,'markFinishStatus',this.select_id);
       let id = select_id || this.select_id
       if((!this.onlineExcelEditing) || (!id) || id=='0'){
         this.onlineExcelEditing=false
@@ -921,6 +941,44 @@ export default {
         if(res.Ret != 200) return 
       })
       this.onlineExcelEditing=false
+    },
+    unloadMark(){
+      // sheetInterface.markSheetEditStatus({ExcelInfoId: this.select_id,Status:2}) 
+      if((!this.onlineExcelEditing) || (!this.select_id) || this.select_id=='0'){
+        this.onlineExcelEditing=false
+        return
+      }
+
+      let url = process.env.VUE_APP_API_ROOT + "/datamanage/excel_info/mark"
+      let params={ExcelInfoId: this.select_id,Status:2}
+      const uuid = localStorage.getItem("uuid") || "";
+      fetch(url, {
+        method: 'POST',
+        headers:{
+          Authorization:localStorage.getItem("auth"),
+          Uuid:uuid,
+          AccessToken:uuid + "--zheshiyigename"
+        },
+        body:JSON.stringify(params),
+        // 保持连接 让请求不会因为页面关闭而中断
+        keepalive: true
+      });
+    },
+    // 刷新在线excel详情数据
+    refreshOnlineExcel(){
+      sheetInterface.sheetDetail({
+        ExcelInfoId: this.select_id,
+      })
+      .then((res) => {
+        if (res.Ret !== 200) return;
+
+        this.sheetDetailInfo = res.Data;
+        this.saveTime = this.$moment(this.sheetDetailInfo.ModifyTime).format('YYYY-MM-DD HH:mm:ss')||''
+
+        this.$nextTick(() => {
+          this.$refs.sheetRef.init();
+        });
+      });
     }
   },
   mounted() {
@@ -933,16 +991,15 @@ export default {
       this.getTreeData();
       this.getPublicList();
     }
-
     window.addEventListener("resize", this.reloadRightWid);
     if(this.$route.path == '/sheetList'){
-      window.addEventListener('beforeunload',this.markFinishStatus)
+      window.addEventListener('beforeunload',this.unloadMark)
     }
   },
   destroyed() {
     window.removeEventListener("resize", this.reloadRightWid);
     if(this.$route.path == '/sheetList'){
-      window.removeEventListener('beforeunload',this.markFinishStatus)
+      window.removeEventListener('beforeunload',this.unloadMark)
     }
   },
 };

+ 2 - 2
src/views/edbHistoryPage.vue

@@ -42,13 +42,13 @@ export default {
             window.open(href, '_blank');
         },
         async getData() {
-            const res = await dataBaseInterface.getEdbCreateHistory({ EdbInfoId: Number(this.$route.query.edbId) })
+            const res = await dataBaseInterface.getEdbCreateHistory({ UniqueCode: this.$route.query.code})
             if (res.Ret !== 200) return
             this.treeData = res.Data;
         }
     },
     mounted(){
-        if(this.$route.query.edbId){
+        if(this.$route.query.code){
             this.getData()
         }
     }

+ 4 - 0
src/views/login_manage/ForgetPassModel.vue

@@ -281,6 +281,10 @@ export default {
                     }).then(res=>{
                         if(res.Ret!==200) return
                         this.$message.success('重置密码成功,请登陆')
+                        localStorage.setItem('timeKey',Date.now())
+                        localStorage.setItem("account", new http.Base64().encode(this.form.account));
+                        localStorage.setItem("checkPass", new http.Base64().encode(this.passForm.pass1));
+
                         this.resetPassCountDown()
                         this.resetPassTimer = setInterval(()=>{
                             this.resetPassCountDown()

+ 11 - 4
src/views/mychart_manage/components/chartDetailDia.vue

@@ -272,7 +272,7 @@
                 </div>
 
                   <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-                <template v-if="[7,10].includes(chartInfo.ChartType)">	
+                <template v-if="[7,10,11].includes(chartInfo.ChartType)">	
                   <div class="range-cont left">
                     <el-input
                       style="width: 60px; display: block"
@@ -517,7 +517,7 @@
               label="操作"
               key="Copy"
               align="center"
-              v-if="[2,5,7].includes(chartInfo.ChartType)"
+              v-if="chartInfo.Source!==1 || ![1,4,6].includes(chartInfo.ChartType)"
               width="110"
             >
               <template slot-scope="scope">
@@ -735,7 +735,11 @@ export default {
             this.setDefaultDateSelect(); //设置默认的日期选中
             this.chartInfo.ChartType === 7 && this.initBarData(res.Data);
 
+            //截面散点图
             this.chartInfo.ChartType === 10 && this.initSectionScatterData(res.Data);
+
+            //雷达图
+            this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
           }else if([2,5].includes(this.chartInfo.Source)) {
             this.tableData = [res.Data.EdbInfoList[0]];
             this.chartInfo = res.Data.ChartInfo.Source===5 ? {
@@ -947,7 +951,7 @@ export default {
         if (res.Ret !== 200) return
         this.$message.success(res.Msg);
 
-        Source===1&&![7,10].includes(ChartType)  
+        Source===1&&![7,10,11].includes(ChartType) 
           ? this.getPreviewChartInfo() 
           : this.getChartDetail(UniqueCode);
     },
@@ -1155,12 +1159,14 @@ export default {
           }
           break
         case 7:
+        case 11:
           typeChartParam = {
             ...public_param,
             DateType: 6,
             LeftMin: String(this.chartLimit.min),
             LeftMax: String(this.chartLimit.max),
           }
+          break
         case 10: 
           typeChartParam = {
             ...public_param,
@@ -1173,7 +1179,8 @@ export default {
               YMinValue: String(this.chartLimit.min),
               YMaxValue: String(this.chartLimit.max),
             })
-          } 
+          }
+          break
       }
 
       let params = this.sameOptionType.includes(this.chartInfo.ChartType)

+ 1 - 1
src/views/mychart_manage/index.vue

@@ -623,7 +623,7 @@ export default {
     /* 切换分类 */
     chooseClassify({MyChartClassifyId,fromPublic,AdminId}) {
       if(fromPublic!==1){
-        this.$refs.catalogTree.setCurrentKey(null)
+        this.$refs.catalogTree&&this.$refs.catalogTree.setCurrentKey(null)
       }
       this.select_classify = MyChartClassifyId;
       this.ispublic = fromPublic;

+ 114 - 1
src/views/ppt_manage/mixins/mixins.js

@@ -75,7 +75,10 @@ export default {
       statisticFrequencyData: {},
 
       /* 跨品种分析图 */
-      crossVarietyChartData: {}
+      crossVarietyChartData: {},
+
+      /* 雷达图 */
+      radarChartData: {}
     }
   },
   methods: {
@@ -1491,6 +1494,116 @@ export default {
       }
     },
 
+    //雷达图数据初始化
+    initRadarData(data) {
+      const { DataResp,EdbInfoList,ChartInfo } = data;
+      
+      this.radarChartData = {
+        YDataList: DataResp.YDataList,
+        XDataList: EdbInfoList.filter(_ => DataResp.XEdbIdValue.includes(_.EdbInfoId))
+      }
+      this.chartLimit = {
+        min: Number(ChartInfo.LeftMin),
+        max: Number(ChartInfo.LeftMax)
+      }
+
+      this.setRadarChart();
+    },
+    /*雷达图绘图*/
+    setRadarChart() {
+      const { YDataList,XDataList } = this.radarChartData;
+
+      /* 主题样式*/
+      const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+
+      //x轴
+      let xAxis = {
+        lineWidth: 0,
+        tickLength: 0,
+        tickmarkPlacement: 'on',
+        categories: XDataList.map(_ => _.EdbAliasName||_.EdbName),
+        labels: {
+          allowOverlap: true,
+          autoRotationLimit: 40,
+          distance: 20,
+          style: {
+            ...chartTheme&&chartTheme.xAxisOptions.style
+          }
+        }
+      }
+
+      //y轴
+      const { max,min } = this.chartLimit;
+      let yAxis = [{
+        gridLineInterpolation: 'polygon',
+        gridLineWidth: 1,
+        lineWidth: 0,
+        endOnTick: false,
+        startOnTick: false,
+        showLastLabel: true,
+        // tickAmount:4,
+        title: {
+          text:  this.chartInfo.Unit,
+          textCh: this.chartInfo.Unit,
+          textEn: this.chartInfo.UnitEn,
+          align: 'high',
+          rotation: 0,
+          y: 5,
+          x:10,
+          textAlign: 'left',
+          reserveSpace: false,
+          style:{
+            ...chartTheme&&chartTheme.yAxisOptions.style
+          },
+        },
+        labels: {
+          allowOverlap: true,
+          style:{
+            ...chartTheme&&chartTheme.yAxisOptions.style
+          }
+        },
+        min: Number(min),
+        max: Number(max),
+      }]
+
+      //系列
+      let series = [];
+      YDataList.forEach(item => {
+        let serie_item = {
+          data: item.Value,
+          pointPlacement: 'on',
+          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'line',
+          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          yAxis: 0,
+          name: item.Name || item.Date,
+          nameCh: item.Name || item.Date,
+          nameEn: item.Date,
+          color: item.Color,
+          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 1,
+          chartType: 'linear'
+        };
+        series.push(serie_item)
+      })
+
+      this.options = {
+        chart: {
+          ...defaultOpts.chart,
+          ...chartTheme.drawOption,
+          spacing: [2,10,2,10],
+          polar:true,
+        },
+        title: {
+          text:''
+        },
+        pane: {
+          size: '80%'
+        },
+        series,
+        yAxis,
+        xAxis
+      }
+    },
+
     /* 查询范围为1年内 x轴显示为月/日 否则默认年/月 */
     xTimeDiffer() {
       const end_date =

+ 9 - 1
src/views/ppt_manage/mixins/pptMixins.js

@@ -1,7 +1,9 @@
 /** 图库9.0(智能PPT) 共通逻辑 */
 import Highcharts from "highcharts/highstock";
+import HighchartsMore from 'highcharts/highcharts-more';
 import HighchartszhCN  from '@/utils/highcahrts-zh_CN'
 HighchartszhCN(Highcharts)
+HighchartsMore(Highcharts)
 import { dataBaseInterface,pptInterface } from "@/api/api.js";
 import {etaBaseConfigInterence} from '@/api/modules/etaBaseConfigApi.js';
 import {pptEnInterface} from '@/api/modules/pptEnApi.js';
@@ -20,9 +22,12 @@ import FormatSix from '../newVersion/components/formatPage/FormatSix.vue';
 import FormatSeven from '../newVersion/components/formatPage/FormatSeven.vue';
 import FormatEight from '../newVersion/components/formatPage/FormatEight.vue';
 import FormatNine from '../newVersion/components/formatPage/FormatNine.vue';
+import FormatTen from '../newVersion/components/formatPage/FormatTen.vue';
+import FormatEle from '../newVersion/components/formatPage/FormatEle.vue';
+import FormatTwelve from '../newVersion/components/formatPage/FormatTwelve.vue';
 export default {
   components:{ FormatOne,FormatTwo,FormatThree,
-    FormatFour,FormatFive,FormatSix,FormatSeven,FormatEight,FormatNine},
+    FormatFour,FormatFive,FormatSix,FormatSeven,FormatEight,FormatNine,FormatTen,FormatEle,FormatTwelve},
   data(){
     return{
       chartInfo:null,
@@ -210,6 +215,8 @@ export default {
         this.chartInfo.ChartType === 7 && this.initBarData(res.Data);
         //截面散点图
         this.chartInfo.ChartType === 10 && this.initSectionScatterData(res.Data);
+        //雷达图
+        this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
 
         Data.Status && ![7,10].includes(this.chartInfo.ChartType) && this.setOptions();
         Data.Status&&this.setOptionsLang(currentLang)
@@ -557,6 +564,7 @@ export default {
             animation: false,
             backgroundColor: "rgba(0,0,0,0)",
             renderTo:$(`#${refName}`)[0],
+            ...options.chart||{}
           },
           legend: {
             ...defaultOpts.legend,

+ 11 - 4
src/views/ppt_manage/newVersion/components/editor/AddFormat.vue

@@ -29,6 +29,9 @@ import FormatPreSix from "@/views/ppt_manage/newVersion/components/formatPreview
 import FormatPreSeven from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreSeven";
 import FormatPreEight from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreEight";
 import FormatPreNine from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreNine";
+import FormatPreTen from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreTen";
+import FormatPreEle from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreEle";
+import FormatPreTwelve from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreTwelve";
 import {countComponentName} from '@/views/ppt_manage/newVersion/utils/untils';
 export default {
   name: "AddFormat",
@@ -47,7 +50,10 @@ export default {
     FormatPreSix,
     FormatPreSeven,
     FormatPreEight,
-    FormatPreNine
+    FormatPreNine,
+    FormatPreTen,
+    FormatPreEle,
+    FormatPreTwelve
   },
   data() {
     return {
@@ -91,11 +97,12 @@ export default {
     width: calc(100% - 40px);
     /* height: 120px; */
     display: flex;
+    /* flex-wrap: wrap; */
     justify-content: space-between;
     .format-item {
-      width: 95px;
-      height: 70px;
-      padding: 10px 10px 20px 10px;
+      width: 80px;
+      height: 56px;
+      padding: 5px;
       border: 1px solid transparent;
       cursor: pointer;
       &:hover {

+ 7 - 1
src/views/ppt_manage/newVersion/components/editor/ChangeFormatDialog.vue

@@ -45,6 +45,9 @@ import FormatPreSix from "@/views/ppt_manage/newVersion/components/formatPreview
 import FormatPreSeven from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreSeven";
 import FormatPreEight from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreEight";
 import FormatPreNine from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreNine";
+import FormatPreTen from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreTen";
+import FormatPreEle from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreEle";
+import FormatPreTwelve from "@/views/ppt_manage/newVersion/components/formatPreview/FormatPreTwelve";
 import {countComponentName} from '@/views/ppt_manage/newVersion/utils/untils';
 export default {
   props:{
@@ -65,7 +68,10 @@ export default {
     FormatPreSix,
     FormatPreSeven,
     FormatPreEight,
-    FormatPreNine
+    FormatPreNine,
+    FormatPreTen,
+    FormatPreEle,
+    FormatPreTwelve
   },
   data() {
     return {

+ 111 - 0
src/views/ppt_manage/newVersion/components/formatPage/FormatEle.vue

@@ -0,0 +1,111 @@
+<template>
+    <div class="total-wrap flex-column" :style="{'pointer-events' :isPreview?'none':'auto'}">
+        <div class="line flex-center">
+            <div class="line-item flex-center" 
+                :style="pageItem.layers&&!isLayerShow()?TypeName(1)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="1" :is="TypeName(1)" :ref="RefName(1)" :index="pageIndex" :position="1"
+                    :item="Item(1)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,1)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(2)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="2" :is="TypeName(2)" :ref="RefName(2)" :index="pageIndex" :position="2"
+                    :item="Item(2)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,2)" />
+            </div>
+        </div>
+        <div class="line flex-center">
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(3)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="3" :is="TypeName(3)" :ref="RefName(3)" :index="pageIndex" :position="3"
+                    :item="Item(3)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,3)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(4)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="4" :is="TypeName(4)" :ref="RefName(4)" :index="pageIndex" :position="4"
+                    :item="Item(4)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,4)" />
+            </div>
+        </div>
+        <div class="wrap-full-bottom bottom-15 flex-center"
+            :style="pageItem.layers&&!isLayerShow()?TypeName(5)==='ChartEl'?'z-index:5':'z-index:3':''">
+            <component :data-position="5" :is="TypeName(5)" :ref="RefName(5)" :index="pageIndex" :position="5"
+                :item="Item(5)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                @getText="getText($event,5)"></component>
+        </div>
+        <!-- 图层编辑模式 -->
+        <div class="layers" :id="`layers_${pageItem.id}`" v-if="isLayerShow()" @click.stop="clickLayer"
+            @contextmenu.stop="showLayerContentMenu">
+            <template v-for="item in pageItem.layers">
+                <component :is="getLayerElName(item)" :key="item.id" :elementInfo="item"
+                    :isActive="item.id===activeLayerEl.id&&!isClickLayer" :isLayerEdit="true"
+                    @click.stop.native="changeActEl(item)" @chooseThis="changeActEl(item)" v-on="$listeners">
+                </component>
+            </template>
+        </div>
+        <!-- 非图层编辑模式 -->
+        <template v-else>
+            <template v-for="item in pageItem.layers">
+                <component :is="getLayerElName(item)" :key="item.id" :elementInfo="item" :isActive="false"
+                    :isLayerEdit="false"></component>
+            </template>
+        </template>
+    </div>
+</template>
+
+<script>
+    import mixin from "./mixins";
+    import {
+        defaultPosition
+    } from "../../utils/config";
+    export default {
+        name: "formatEle",
+        mixins: [mixin],
+        data() {
+            return {
+                modelId: 11,
+                positionInfo: defaultPosition[11]
+            }
+        },
+    };
+</script>
+<style lang="scss">
+.line{
+    justify-content: space-around !important;
+    .line-item{
+        .el-wrap .chart-wrap{
+            width:90%;
+            height:90%;
+        }
+        .editor-wrap{
+            width:90%;
+            height:90%
+        }
+    }
+}
+</style>
+<style scoped lang="scss">
+    .total-wrap {
+        .line{
+            height:40%;
+            .line-item{
+                width:45%;
+                height:100%;
+                .el-wrap .chart-wrap{
+                    width:90%;
+                    height:90%;
+                }
+            }
+        }
+
+        .wrap-full-bottom {
+            position: absolute;
+            bottom: 0;
+            justify-content: space-around;
+        }
+        .bottom-15{
+            height: 18%;
+        }
+    }
+</style>

+ 121 - 0
src/views/ppt_manage/newVersion/components/formatPage/FormatTen.vue

@@ -0,0 +1,121 @@
+<template>
+    <div class="total-wrap flex-column" :style="{'pointer-events' :isPreview?'none':'auto'}">
+        <div class="line flex-center">
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(1)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="1" :is="TypeName(1)" :ref="RefName(1)" :index="pageIndex" :position="1"
+                    :item="Item(1)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,1)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(2)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="2" :is="TypeName(2)" :ref="RefName(2)" :index="pageIndex" :position="2"
+                    :item="Item(2)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,2)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(3)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="3" :is="TypeName(3)" :ref="RefName(3)" :index="pageIndex" :position="3"
+                    :item="Item(3)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,3)" />
+            </div>
+        </div>
+        <div class="line flex-center">
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(4)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="4" :is="TypeName(4)" :ref="RefName(4)" :index="pageIndex" :position="4"
+                    :item="Item(4)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,4)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(5)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="5" :is="TypeName(5)" :ref="RefName(5)" :index="pageIndex" :position="5"
+                    :item="Item(5)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,5)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(6)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="6" :is="TypeName(6)" :ref="RefName(6)" :index="pageIndex" :position="6"
+                    :item="Item(6)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,6)" />
+            </div>
+        </div>
+        <div class="wrap-full-bottom bottom-15 flex-center"
+            :style="pageItem.layers&&!isLayerShow()?TypeName(7)==='ChartEl'?'z-index:5':'z-index:3':''">
+            <component :data-position="7" :is="TypeName(7)" :ref="RefName(7)" :index="pageIndex" :position="7"
+                :item="Item(7)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                @getText="getText($event,7)"></component>
+        </div>
+        <!-- 图层编辑模式 -->
+        <div class="layers" :id="`layers_${pageItem.id}`" v-if="isLayerShow()" @click.stop="clickLayer"
+            @contextmenu.stop="showLayerContentMenu">
+            <template v-for="item in pageItem.layers">
+                <component :is="getLayerElName(item)" :key="item.id" :elementInfo="item"
+                    :isActive="item.id===activeLayerEl.id&&!isClickLayer" :isLayerEdit="true"
+                    @click.stop.native="changeActEl(item)" @chooseThis="changeActEl(item)" v-on="$listeners">
+                </component>
+            </template>
+        </div>
+        <!-- 非图层编辑模式 -->
+        <template v-else>
+            <template v-for="item in pageItem.layers">
+                <component :is="getLayerElName(item)" :key="item.id" :elementInfo="item" :isActive="false"
+                    :isLayerEdit="false"></component>
+            </template>
+        </template>
+    </div>
+</template>
+
+<script>
+    import mixin from "./mixins";
+    import {
+        defaultPosition
+    } from "../../utils/config";
+    export default {
+        name: "formatTen",
+        mixins: [mixin],
+        data() {
+            return {
+                modelId: 10,
+                positionInfo: defaultPosition[10]
+            }
+        },
+    };
+</script>
+<style lang="scss">
+.line{
+    .line-item{
+        .el-wrap .chart-wrap{
+            width:90%;
+            height:90%;
+        }
+        .editor-wrap{
+            width:90%;
+            height:90%
+        }
+    }
+}
+</style>
+<style scoped lang="scss">
+    .total-wrap {
+        .line{
+            height:40%;
+            .line-item{
+                width:33%;
+                height:100%;
+                .el-wrap .chart-wrap{
+                    width:90%;
+                    height:90%;
+                }
+            }
+        }
+
+        .wrap-full-bottom {
+            position: absolute;
+            bottom: 0;
+        }
+        .bottom-15{
+            height: 18%;
+        }
+    }
+</style>

+ 115 - 0
src/views/ppt_manage/newVersion/components/formatPage/FormatTwelve.vue

@@ -0,0 +1,115 @@
+<template>
+    <div class="total-wrap flex-column" :style="{'pointer-events' :isPreview?'none':'auto'}">
+        <div class="line flex-center">
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(1)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="1" :is="TypeName(1)" :ref="RefName(1)" :index="pageIndex" :position="1"
+                    :item="Item(1)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,1)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(2)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="2" :is="TypeName(2)" :ref="RefName(2)" :index="pageIndex" :position="2"
+                    :item="Item(2)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,2)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(3)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="3" :is="TypeName(3)" :ref="RefName(3)" :index="pageIndex" :position="3"
+                    :item="Item(3)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,3)" />
+            </div>
+        </div>
+        <div class="line flex-center">
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(4)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="4" :is="TypeName(4)" :ref="RefName(4)" :index="pageIndex" :position="4"
+                    :item="Item(4)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,4)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(5)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="5" :is="TypeName(5)" :ref="RefName(5)" :index="pageIndex" :position="5"
+                    :item="Item(5)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,5)" />
+            </div>
+            <div class="line-item flex-center"
+                :style="pageItem.layers&&!isLayerShow()?TypeName(6)==='ChartEl'?'z-index:5':'z-index:3':''">
+                <component :data-position="6" :is="TypeName(6)" :ref="RefName(6)" :index="pageIndex" :position="6"
+                    :item="Item(6)" @dragstart.native="onDragStart" @dragover.native="onDragOver" @drop.native="onDrop"
+                    @getText="getText($event,6)" />
+            </div>
+        </div>
+        <!-- 图层编辑模式 -->
+        <div class="layers" :id="`layers_${pageItem.id}`" v-if="isLayerShow()" @click.stop="clickLayer"
+            @contextmenu.stop="showLayerContentMenu">
+            <template v-for="item in pageItem.layers">
+                <component :is="getLayerElName(item)" :key="item.id" :elementInfo="item"
+                    :isActive="item.id===activeLayerEl.id&&!isClickLayer" :isLayerEdit="true"
+                    @click.stop.native="changeActEl(item)" @chooseThis="changeActEl(item)" v-on="$listeners">
+                </component>
+            </template>
+        </div>
+        <!-- 非图层编辑模式 -->
+        <template v-else>
+            <template v-for="item in pageItem.layers">
+                <component :is="getLayerElName(item)" :key="item.id" :elementInfo="item" :isActive="false"
+                    :isLayerEdit="false"></component>
+            </template>
+        </template>
+    </div>
+</template>
+
+<script>
+    import mixin from "./mixins";
+    import {
+        defaultPosition
+    } from "../../utils/config";
+    export default {
+        name: "formatTen",
+        mixins: [mixin],
+        data() {
+            return {
+                modelId: 10,
+                positionInfo: defaultPosition[10]
+            }
+        },
+    };
+</script>
+<style lang="scss">
+.line{
+    .line-item{
+        .el-wrap .chart-wrap{
+            width:90%;
+            height:90%;
+        }
+        .editor-wrap{
+            width:90%;
+            height:90%
+        }
+    }
+}
+</style>
+<style scoped lang="scss">
+    .total-wrap {
+        .line{
+            height:48%;
+            .line-item{
+                width:33%;
+                height:100%;
+                .el-wrap .chart-wrap{
+                    width:90%;
+                    height:90%;
+                }
+            }
+        }
+
+        .wrap-full-bottom {
+            position: absolute;
+            bottom: 0;
+        }
+        .bottom-15{
+            height: 18%;
+        }
+    }
+</style>

+ 40 - 0
src/views/ppt_manage/newVersion/components/formatPreview/FormatPreEle.vue

@@ -0,0 +1,40 @@
+<template>
+    <div class="format-pre-wrap flex-center" style="flex-direction: column;">
+      <div class="line flex-center" style="justify-content: space-between;">
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+      </div>
+      <div class="line flex-center" style="justify-content: space-between;">
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+      </div>
+      <div class="line flex-center" style="width:100%;height:30%;">
+        <div class="full text" style="width:97%;height:90%;"></div>
+      </div>
+    </div>
+  </template>
+  
+  <script>
+  export default {
+    name: "formatPreEle",
+    data() {
+      return {};
+    },
+    methods: {},
+  };
+  </script>
+  
+  <style scoped lang="scss">
+  .format-pre-wrap{
+    .line{
+        img{
+            width:40%;
+        }
+    }
+  }
+  </style>
+  

+ 44 - 0
src/views/ppt_manage/newVersion/components/formatPreview/FormatPreTen.vue

@@ -0,0 +1,44 @@
+<template>
+    <div class="format-pre-wrap flex-center" style="flex-direction: column;">
+      <div class="line flex-center" style="justify-content: space-between;">
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+      </div>
+      <div class="line flex-center" style="justify-content: space-between;">
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+      </div>
+      <div class="line flex-center" style="width:100%;height:30%;">
+        <div class="full text" style="width:97%;height:90%;"></div>
+      </div>
+    </div>
+  </template>
+  
+  <script>
+  export default {
+    name: "formatPreTen",
+    data() {
+      return {};
+    },
+    methods: {},
+  };
+  </script>
+  
+  <style scoped lang="scss">
+  .format-pre-wrap{
+    .line{
+        img{
+            width:30%;
+        }
+    }
+  }
+  </style>
+  

+ 41 - 0
src/views/ppt_manage/newVersion/components/formatPreview/FormatPreTwelve.vue

@@ -0,0 +1,41 @@
+<template>
+    <div class="format-pre-wrap flex-center" style="flex-direction: column;">
+      <div class="line flex-center" style="justify-content: space-between;">
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+      </div>
+      <div class="line flex-center" style="justify-content: space-between;">
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+        <img style="object-fit:fill !important;"
+          src="~@/assets/img/ppt_m/format-pic.png" />
+      </div>
+    </div>
+  </template>
+  
+  <script>
+  export default {
+    name: "formatPreTwelve",
+    data() {
+      return {};
+    },
+    methods: {},
+  };
+  </script>
+  
+  <style scoped lang="scss">
+  .format-pre-wrap{
+    .line{
+        img{
+            width:33%;
+        }
+    }
+  }
+  </style>
+  

+ 16 - 2
src/views/ppt_manage/newVersion/pptPublish.vue

@@ -26,7 +26,12 @@
           </div>
           <!-- 内容 -->
           <div class="ppt-item" v-for="(item,index) in pageList" :key="item.id">
-            <div class="title-wrap">
+            <div class="title-wrap"
+            :style="`
+                top:${lineClamp===2?'2%':getStrCount(item.title)<58?'5.5%':'0'};
+                height:${lineClamp===2?'12%':getStrCount(item.title)<58?'7%':'14%'};
+                -webkit-line-clamp:${lineClamp===2?2:3};`" 
+            :class="{'title-ellipsis':getStrCount(item.title)>lineClamp*57}">
               {{item.title}} 
             </div>
             <component
@@ -59,7 +64,7 @@ import Cover from './components/Cover.vue';
 import CustomCover from './components/CustomCover.vue';
 import TransReport from './components/catalog/transReport.vue';
 //import {pageList} from './utils/mock';
-import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,getImgRealSize,calcScale,getShapeOptions,createRandomCode,getTableData,getChartInfo,pptInit,rgbaToHex } from './utils/untils';
+import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,getImgRealSize,calcScale,countStrSize,getShapeOptions,createRandomCode,getTableData,getChartInfo,pptInit,rgbaToHex } from './utils/untils';
 import {marginTop,modelConfig,pptSlideMaster} from './utils/config';
 import pptmixin from '../mixins/pptMixins';
 import mixins from '../mixins/mixins';
@@ -120,7 +125,16 @@ export default {
       this.coefficient = coefficient
     }
   },
+  computed:{
+    lineClamp(){
+        return this.LayoutType===2?2:3
+    },
+  },
   methods: {
+    //计算title的字节数
+    getStrCount(title){
+        return countStrSize(title)
+    },
     async transHandle(){
       //需要校验PPT
       const {result,hintText} = this.checkPPT()

+ 192 - 3
src/views/ppt_manage/newVersion/utils/config.js

@@ -83,6 +83,16 @@ export const formatPre = [{
     },{
       modelId:9,
       text:'上2图+文字'
+    },{
+        modelId:10,
+        text:'上6图+文字'
+    },
+    {
+        modelId:11,
+        text:'上4图+文字'
+    },{
+        modelId:12,
+        text:'上6图'
     }
 ]
 //版式id对应组件名
@@ -95,7 +105,10 @@ export const modelMap = {
     6: 'Six',
     7: 'Seven',
     8: 'Eight',
-    9: 'Nine'
+    9: 'Nine',
+    10:'Ten',
+    11:'Ele',
+    12:'Twelve'
 }
 //版式信息,用于判断图表/文字插入哪个位置
 export const modelInfo = {
@@ -167,7 +180,31 @@ export const modelInfo = {
       elChartNum:2,
       elTextNum:1,
       elTextPosition: 3
-    }
+    },
+    12:{
+        elNum:6,
+        elType:['chart','chart','chart','chart','chart','chart'],
+        positions:[1,2,3,4,5,6],
+        elChartNum:6,
+        elTextNum:0,
+        /* elTextPosition: 7 */
+    },
+    11:{
+        elNum:5,
+        elType:['chart','chart','chart','chart','text'],
+        positions:[1,2,3,4,5],
+        elChartNum:4,
+        elTextNum:1,
+        elTextPosition: 5
+      },
+    10:{
+        elNum:7,
+        elType:['chart','chart','chart','chart','chart','chart','text'],
+        positions:[1,2,3,4,5,6],
+        elChartNum:6,
+        elTextNum:1,
+        elTextPosition: 7
+    },
 }
 
 //给标题预留的位置,单位%
@@ -176,6 +213,7 @@ const titleHeight = 7
 const restHeight = 100 - marginTop
 //版式位置宽高设置,x,y,width,height都是基于整张ppt的百分比
 //百分比的值来自./css/format.scss ->.chart-wrap,.editor-wrap
+//用于发布页生成PPT
 export const modelConfig = [{
         modelId: 1,
         elements: [{
@@ -348,6 +386,132 @@ export const modelConfig = [{
         y:60
       }
     ]
+    },{
+        modelId:12,
+        elements:[{
+            position:1,
+            width:33*0.9,
+            height:(restHeight)*0.48*0.9,
+            x:(33*0.1)/2,
+            y:(restHeight*0.48*0.1)/2
+        },{
+            position:2,
+            width:33*0.9,
+            height:(restHeight)*0.48*0.9,
+            x:(33*0.1)/2+33,
+            y:(restHeight*0.48*0.1)/2
+        },
+        {
+            position:3,
+            width:33*0.9,
+            height:(restHeight)*0.48*0.9,
+            x:(33*0.1)/2+33*2,
+            y:(restHeight*0.48*0.1)/2
+        },
+        {
+            position:4,
+            width:33*0.9,
+            height:(restHeight)*0.48*0.9,
+            x:(33*0.1)/2,
+            y:(restHeight)*0.48
+        },
+        {
+            position:5,
+            width:33*0.9,
+            height:(restHeight)*0.48*0.9,
+            x:(33*0.1)/2+33,
+            y:(restHeight)*0.48
+        },
+        {
+            position:6,
+            width:33*0.9,
+            height:(restHeight)*0.48*0.9,
+            x:(33*0.1)/2+33*2,
+            y:(restHeight)*0.48
+        }]
+    },{
+        modelId:11,
+        elements:[{
+            position:1,
+            width:45*0.9,
+            height:(restHeight)*0.40*0.9,
+            x:(45*0.1)/2,
+            y:(restHeight*0.4*0.1)/2
+        },{
+            position:2,
+            width:45*0.9,
+            height:(restHeight)*0.40*0.9,
+            x:(45*0.1)/2+50,
+            y:(restHeight*0.4*0.1)/2
+        },{
+            position:3,
+            width:45*0.9,
+            height:(restHeight)*0.40*0.9,
+            x:(45*0.1)/2,
+            y:38
+        },{
+            position:4,
+            width:45*0.9,
+            height:(restHeight)*0.40*0.9,
+            x:(45*0.1)/2+50,
+            y:38
+        },{
+            position:5,
+            width:100*0.9,
+            height:(restHeight)*0.18*0.8,
+            x:(100-100*0.9)/2,
+            y:74
+        }]
+    },{
+        modelId:10,
+        elements:[{
+            position:1,
+            width:33*0.9,
+            height:(restHeight)*0.4*0.9,
+            x:(33*0.1)/2,
+            y:(restHeight*0.4*0.1)/2
+        },{
+            position:2,
+            width:33*0.9,
+            height:(restHeight)*0.4*0.9,
+            x:(33*0.1)/2+33,
+            y:(restHeight*0.4*0.1)/2
+        },
+        {
+            position:3,
+            width:33*0.9,
+            height:(restHeight)*0.4*0.9,
+            x:(33*0.1)/2+33*2,
+            y:(restHeight*0.4*0.1)/2
+        },
+        {
+            position:4,
+            width:33*0.9,
+            height:(restHeight)*0.4*0.9,
+            x:(33*0.1)/2,
+            y:38
+        },
+        {
+            position:5,
+            width:33*0.9,
+            height:(restHeight)*0.4*0.9,
+            x:(33*0.1)/2+33,
+            y:38
+        },
+        {
+            position:6,
+            width:33*0.9,
+            height:(restHeight)*0.4*0.9,
+            x:(33*0.1)/2+33*2,
+            y:38
+        },
+        {
+            position:7,
+            width:100*0.9,
+            height:(restHeight)*0.18*0.8,
+            x:(100-100*0.9)/2,
+            y:74
+        }]
     }
 ]
 //ppt母版
@@ -579,6 +743,7 @@ export const BaseTextShape = {
   richContent:''
 }
 //默认情况下,版式内部位置对应的组件元素
+//用于版式渲染,版式内切换元素位置
 export const defaultPosition = {
   1:{//modelId
     1:{type:'chart'},//position
@@ -619,7 +784,31 @@ export const defaultPosition = {
     1:{type:'chart'},
     2:{type:'chart'},
     3:{type:'text'}
-  }
+  },
+  12:{
+    1:{type:'chart'},
+    2:{type:'chart'},
+    3:{type:'chart'},
+    4:{type:'chart'},
+    5:{type:'chart'},
+    6:{type:'chart'},
+  },
+  11:{
+    1:{type:'chart'},
+    2:{type:'chart'},
+    3:{type:'chart'},
+    4:{type:'chart'},
+    5:{type:'text'},
+  },
+  10:{
+    1:{type:'chart'},
+    2:{type:'chart'},
+    3:{type:'chart'},
+    4:{type:'chart'},
+    5:{type:'chart'},
+    6:{type:'chart'},
+    7:{type:'text'}
+  },
 }
 //画笔工具栏
 export const boardTool = [

+ 47 - 4
src/views/ppt_manage/newVersion/utils/untils.js

@@ -140,7 +140,7 @@ export const toTextProps = (json) => {
       if ('tagName' in item && item.tagName === 'br') {
         slices.push({ text: '', options: { breakLine: true } })
       } else if ('content' in item) {
-            const transStr = /(&lt;|&gt;|&ldquo;|&rdquo;|&amp;|&lsquo;|&rsquo;|&mdash;|&ge;|&le;|&middot;)/g
+            const transStr = /(&lt;|&gt;|&ldquo;|&rdquo;|&amp;|&lsquo;|&rsquo;|&mdash;|&ge;|&le;|&middot;|&oslash;|&Oslash;|&empty;)/g
             const text = item.content.replace(/\n/g, '').replace(/&nbsp;/g, ' ').replace(transStr, replacer)
             const options = {}
 
@@ -205,6 +205,7 @@ export const toTextProps = (json) => {
   return slices
 }
 //将text中被转义的字符转义回来,如:a<b 在富文本内会被转义成 a&lt;b
+//https://www.cnblogs.com/tiancixiong/p/13581746.html
 const replacer = (_, p1) => {
     return {
         "&lt;": "<",
@@ -217,7 +218,10 @@ const replacer = (_, p1) => {
         "&mdash;":'——',
         "&ge;":'≥',
         "&le;":'≤',
-        "&middot;":'·'
+        "&middot;":'·',
+        "&oslash;":'ø',
+        "&Oslash;":'Ø',
+        "&empty;":'∅'
     } [p1]
 }
 //根据字符串的字节长,在指定位置换行
@@ -292,6 +296,7 @@ export const changeCatalogArr = (arr)=>{
 }
 //计算各个版式下,文本框占据的真实宽度
 //基准:编辑页ppt-item的最大宽高:w:900px;h:630
+//用于transform:scale 文本元素,如果该版式没有文本框,可以直接给一个空数组
 export const getTextContentSize = (model,position)=>{
     const modelMapWidth = {
         1:{
@@ -330,7 +335,26 @@ export const getTextContentSize = (model,position)=>{
           1:[1,1,0.5,0.9],
           2:[1,1,0.5,0.9],
           3:[1,1,0.9]
-        }
+        },
+        12:{
+            1:[],2:[],3:[],4:[],5:[],6:[],7:[],
+        },
+        11:{
+            1:[1,1,0.45,1,0.9],
+            2:[1,1,0.45,1,0.9],
+            3:[1,1,0.45,1,0.9],
+            4:[1,1,0.45,1,0.9],
+            5:[1,1,0.9],
+        },
+        10:{
+            1:[1,1,0.33,1,0.9],
+            2:[1,1,0.33,1,0.9],
+            3:[1,1,0.33,1,0.9],
+            4:[1,1,0.33,1,0.9],
+            5:[1,1,0.33,1,0.9],
+            6:[1,1,0.33,1,0.9],
+            7:[1,1,0.9],
+        },
     }
     const modelMapHeight = {
         1:{
@@ -365,7 +389,26 @@ export const getTextContentSize = (model,position)=>{
           1:[0.86,0.7,1,0.9],
           2:[0.86,0.7,1,0.9],
           3:[0.86,0.3,0.8]
-        }
+        },
+        12:{
+            1:[],2:[],3:[],4:[],5:[],6:[],
+        },
+        11:{
+            1:[0.86,0.4,1,0.9],
+            2:[0.86,0.4,1,0.9],
+            3:[0.86,0.4,1,0.9],
+            4:[0.86,0.4,1,0.9],
+            5:[0.86,0.18,0.8],
+        },
+        10:{
+            1:[0.86,0.4,1,0.9],
+            2:[0.86,0.4,1,0.9],
+            3:[0.86,0.4,1,0.9],
+            4:[0.86,0.4,1,0.9],
+            5:[0.86,0.4,1,0.9],
+            6:[0.86,0.4,1,0.9],
+            7:[0.86,0.18,0.8],
+        },
     }
     const baseWidth=900,baseHeight=630
     const width = modelMapWidth[model][position].reduce((pre,curr)=>{

+ 24 - 24
src/views/sandbox_manage/index_new_version.vue

@@ -65,24 +65,24 @@
             width:rightType=='list'?'1px':'unset',
             flexGrow:rightType=='list'?'unset':1}">
       <div class="sandbox-chart-head">
-        <div class="sandbox-chartHead-author">作者:<span>{{ this.viewSandbox.SysUserName }}</span></div>
+        <div class="sandbox-chartHead-author">{{$t('MsgPrompt.author')}}:<span>{{ this.viewSandbox.SysUserName }}</span></div>
         <div class="sandbox-chartHead-title">{{ this.viewSandbox.Name }}</div>
         <div class="sandbox-chartHead-options">
           <div class="chartHead-options-button" @click="editSand" v-permission="permissionBtn.sandboxPermission.sandbox_saveView">
             <img src="~@/assets/img/sand_new/edit_outline.png" />
-            <span>编辑</span> 
+            <span>{{$t('Table.edit_btn')}}</span> 
           </div>
           <div class="chartHead-options-button" @click="saveOther">
             <img src="~@/assets/img/sand_new/save-other.png" />
-            <span>另存为</span> 
+            <span>{{$t('Table.save_as')}}</span> 
           </div>
           <div class="chartHead-options-button" @click="copySandHandle" v-permission="permissionBtn.sandboxPermission.sandbox_addMy">
             <img src="~@/assets/img/sand_new/copy.png" />
-            <span>复制</span> 
+            <span>{{$t('Table.copy_btn')}}</span> 
           </div>
           <div class="chartHead-options-button" @click="deleteHandle(viewSandbox,'inchart')" v-permission="permissionBtn.sandboxPermission.sandbox_del">
             <img src="~@/assets/img/sand_new/remove.png" />
-            <span style="color: red;" >删除</span> 
+            <span style="color: red;" >{{$t('Table.delete_btn')}}</span> 
           </div>
         </div>
       </div>
@@ -153,7 +153,7 @@
     </el-dialog>
     <!-- 另存为 -->
     <el-dialog
-      title="另存为"
+      :title="$t('Table.save_as')"
       :visible.sync="saveOtherShow"
       :append-to-body="true"
       :close-on-click-modal="false"
@@ -162,10 +162,10 @@
       <div style="padding: 10px 40px 0;" class="save-as-dialog">
         <el-form :model="saveOtherForm" ref="saveOtherFormRef"
         label-width="96px">
-          <el-form-item label="逻辑图名称" prop="chartName" :rules="{required:true,message:'请输入逻辑图名称',trigger:'blur'}">
-            <el-input v-model="saveOtherForm.chartName" style="width: 317px;" placeholder="请输入逻辑图名称"></el-input>
+          <el-form-item :label="$t('SandboxManage.SandList.logic_diagram_name')" prop="chartName" :rules="{required:true,message:this.$t('SandboxManage.SandList.search_placeholder'),trigger:'blur'}">
+            <el-input v-model="saveOtherForm.chartName" style="width: 317px;" :placeholder="$t('SandboxManage.SandList.search_placeholder')"></el-input>
           </el-form-item>
-          <el-form-item label="分类" prop="classifyId" :rules="{required:true,message:'请选择分类',trigger:'change'}" >
+          <el-form-item :label="$t('Common.category')" prop="classifyId" :rules="{required:true,message:this.$t('MsgPrompt.select_category'),trigger:'change'}" >
             <el-cascader 
             :options="onlyClassifyTreeData"
             @change="classifyTreeChange"
@@ -173,13 +173,13 @@
               label: 'SandboxClassifyName',
                 value: 'SandboxClassifyId',checkStrictly:true}"
             v-model="saveOtherClassifys" 
-            placeholder="请选择分类">
+            :placeholder="$t('MsgPrompt.select_category')">
             </el-cascader>
           </el-form-item>
         </el-form>
         <div style="text-align: center;padding:40px 0 ;">
           <el-button @click="saveOtherSubmit" type="primary" style="width: 120px;" size="large">{{$t('Dialog.confirm_save_btn')}}</el-button>
-          <el-button @click="saveOtherShow=false" style="width: 120px;margin-left: 28px;" size="large">取消</el-button>
+          <el-button @click="saveOtherShow=false" style="width: 120px;margin-left: 28px;" size="large">{{$t('Dialog.cancel_btn')}}</el-button>
         </div>
       </div>
     </el-dialog>
@@ -289,7 +289,7 @@ import { myGraph } from './common/gragh';
         initData:{},
         customButtonDom:'',
         // ------- 添加分类弹窗
-        classifyAddTitle:"添加分类",
+        classifyAddTitle:this.$t('SandboxManage.SandList.categories_add_btn')||"添加分类",
         classifyAddShow:false,
         lastLevelClassifyName:'',
         classifyForm:{
@@ -301,7 +301,7 @@ import { myGraph } from './common/gragh';
           Level:0
         },
         classifyFormRules:{
-          SandboxClassifyName:{required: true, message:'请输入目录名称', trigger: 'blur'},
+          SandboxClassifyName:{required: true, message:this.$t('SandboxManage.SandList.catalog_name_placeholder')||'请输入目录名称', trigger: 'blur'},
           ChartPermissionId:{required: true, message:'请选择对应品种', trigger: 'change'}
         },
         classifyProps: {
@@ -640,27 +640,27 @@ import { myGraph } from './common/gragh';
              * 2 有子目录无沙盘图
              */
             const deleteLabelMap = {
-              1: '该分类下存在沙盘图,不可删除',
+              1: this.$t('SandboxManage.SandList.delete_attention_msg1')||'该分类下存在沙盘图,不可删除',
               2: '确认删除当前分类及包含的子分类吗?',
               4: res.Data.TipsMsg
             }
 
             if([1,4].includes(res.Data.DeleteStatus)) this.$confirm(
                 deleteLabelMap[res.Data.DeleteStatus],
-                '删除失败',
+                this.$t('MsgPrompt.delete_fail_msg'),
                 {
-                confirmButtonText: '知道了',
+                confirmButtonText: this.$t('MsgPrompt.known')||'知道了',
                 showCancelButton:false,
                 type: 'error'
               })
             else if([0,2].includes(res.Data.DeleteStatus)) this.$confirm(
                 res.Data.DeleteStatus === 2 
                 ? deleteLabelMap[res.Data.DeleteStatus]
-                : node.SandboxId?'确认删除该沙盘图吗?':'确定删除当前分类吗?', 
-                '提示',
+                : node.SandboxId?'确认删除该沙盘图吗?':this.$t('SandboxManage.SandList.delete_attention_msg2'), 
+                this.$t('Confirm.prompt'),
                 {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
+                confirmButtonText: this.$t('Dialog.confirm_btn'),
+                cancelButtonText: this.$t('Dialog.cancel_btn'),
                 type: 'warning'
               }).then(() => {
                 res.Data.DeleteStatus === 0 && node.SandboxId 
@@ -878,7 +878,7 @@ import { myGraph } from './common/gragh';
         }
       },500),
       deleteHandle(item,type){
-        this.$confirm("确定删除该沙盘图吗?", "提示", {
+        this.$confirm("确定删除该沙盘图吗?", this.$t('Confirm.prompt'), {
           type: "warning",
         })
         .then(() => {
@@ -1076,10 +1076,10 @@ import { myGraph } from './common/gragh';
                 const data = [new ClipboardItem({ [blob.type]: blob })]; 
                 await navigator.clipboard.write(data).then(
                 () => {
-                    this.$message.success('复制成功!')
+                    this.$message.success(this.$t('MsgPrompt.copy_success_msg'))
                 },
                 () => {
-                    this.$message.warning('浏览器不支持')
+                    this.$message.warning(this.$t('MsgPrompt.browser_not_support'))
                 }
                 ).finally(()=>{
                     this.lockLoding && this.lockLoding.close();
@@ -1087,7 +1087,7 @@ import { myGraph } from './common/gragh';
             });
           }else {
             this.lockLoding && this.lockLoding.close();
-            this.$message.warning('当前协议暂不支持,仅支持https协议')
+            this.$message.warning(this.$t('MsgPrompt.http_not_support'))
           }	
         }
       },{

+ 20 - 20
src/views/sandbox_manage/sandFlowNew/components/addLInkDia.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-dialog :modal-append-to-body='false' title="添加链接" :visible.sync="show" 
+    <el-dialog :modal-append-to-body='false' :title="$t('SandboxManage.SandFlow.add_link')" :visible.sync="show" 
     :close-on-click-modal="false" width="872px" top="5vh">
       <div class="add-link-box">
         <div class="link-box-option">
@@ -13,7 +13,7 @@
             :filterable="!search_dataBaseId"
             remote
             clearable
-            placeholder="指标ID/指标名称"
+            :placeholder="$t('SandboxManage.SandFlow.add_link_search_placeholder')"
             style="width: 240px"
             :remote-method="dataBaseSearch"
             @click.native="dataBaseInputFocus"
@@ -57,30 +57,30 @@
           <!-- 指标 -->
           <div class="link-content-dataIndex" v-if="addLinkSearchParams.linkType==1 && databaseTableData && databaseTableData.length>0">
             <el-table :data="databaseTableData" border style="box-shadow: rgba(155, 170, 219, 0.2) 0px 3px 6px;">
-              <el-table-column label="指标Id" align="center">
+              <el-table-column :label="$t('Table.edb_id')" align="center">
                 <template slot-scope="scope">{{ scope.row.EdbCode }}</template>
               </el-table-column>
-              <el-table-column label="指标名称" align="center" width="200">
+              <el-table-column :label="$t('Table.edb_name')" align="center" width="200">
                 <template slot-scope="scope">{{ scope.row.EdbName }}</template>
               </el-table-column>
-              <el-table-column label="频度" align="center" width="50">
+              <el-table-column :label="$t('Table.frequency')" align="center" width="50">
                 <template slot-scope="scope">{{ scope.row.Frequency }}</template>
               </el-table-column>
-              <el-table-column label="单位" align="center">
+              <el-table-column :label="$t('Table.unit')" align="center">
                 <template slot-scope="scope">{{ scope.row.Unit }}</template>
               </el-table-column>
-              <el-table-column label="起始时间" align="center" width="100">
+              <el-table-column :label="$t('Table.start_time')" align="center" width="100">
                 <template slot-scope="scope">{{ scope.row.StartDate }}</template>
               </el-table-column>
-              <el-table-column label="更新时间" align="center" width="160">
+              <el-table-column :label="$t('Table.update_time')" align="center" width="160">
                 <template slot-scope="scope">{{ scope.row.ModifyTime }}</template>
               </el-table-column>
-              <el-table-column label="来源" align="center">
+              <el-table-column :label="$t('Table.source')" align="center">
                 <template slot-scope="scope">{{ scope.row.SourceName }}</template>
               </el-table-column>
-              <el-table-column label="操作" align="center" width="50">
+              <el-table-column :label="$t('Table.column_operations')" align="center" width="50">
                 <template slot-scope="scope">
-                  <span class="delete-button">删除</span>
+                  <span class="delete-button">{{$t('Table.delete_btn')}}</span>
                 </template>
               </el-table-column>
             </el-table>
@@ -104,7 +104,7 @@
                   <span :class="['value-style',{'predict-act': databaseTableData[0].DataInsertConfig.Date===item.DataTime}]">{{item.Value}}</span>
                 </span>
               </li>
-              <li class="nodata value-item" v-if="!databaseList.length">暂无数据</li>
+              <li class="nodata value-item" v-if="!databaseList.length">{{$t('Table.prompt_slogan')}}</li>
             </ul>
           </div>
           <div class="link-content-chartIndex" v-else-if="addLinkSearchParams.linkType==2 && this.chartInfo && this.chartInfo.ChartInfoId">
@@ -115,7 +115,7 @@
             <el-table :data="this.reportList" border style="margin-bottom: 10px;" ref="reportTable"
             @select="reportSelect" @select-all="reportSelect"> 
               <el-table-column type="selection" width="40" align="center"></el-table-column>
-              <el-table-column label="报告标题" align="center" show-overflow-tooltip>
+              <el-table-column :label="$t('Table.report_title')" align="center" show-overflow-tooltip>
                 <template slot-scope="scope">
                   <span >{{ scope.row.Title }}</span>
                   <span  v-if="scope.row.MsgSendTime">
@@ -129,7 +129,7 @@
                   </span>
                 </template>
               </el-table-column >
-              <el-table-column label="发布时间" align="center">
+              <el-table-column :label="$t('Table.publish_time')" align="center">
                 <template slot-scope="scope">
                   <span>{{scope.row.PrePublishTime?scope.row.PrePublishTime:scope.row.PublishTime}}</span>
                 </template>
@@ -137,7 +137,7 @@
             </el-table>
             <m-page :page_no="reportParams.CurrentIndex" :pageSize="5" :total="reportTotal" @handleCurrentChange="pageChange"/>
           </div>
-          <tableNoData text="暂无数据" v-else/>
+          <tableNoData :text="$t('Table.prompt_slogan')" v-else/>
         </div>
         <div class="link-box-tags">
           <div class="link-box-tag" v-for="(item,index) in checkedLinkList" :key="item.RId">
@@ -148,8 +148,8 @@
           </div>
         </div>
         <div class="link-box-buttons">
-          <el-button type="info" style="width:120px;color:#333333;background-color:#F4F8FE" @click="cancelHandle">取消</el-button>
-          <el-button type="primary" style="width:120px;margin-left: 30px;" @click="saveLink">确定</el-button>
+          <el-button type="info" style="width:120px;color:#333333;background-color:#F4F8FE" @click="cancelHandle">{{$t('Dialog.cancel_btn')}}</el-button>
+          <el-button type="primary" style="width:120px;margin-left: 30px;" @click="saveLink">{{$t('Dialog.confirm_btn')}}</el-button>
         </div>
       </div>
 		</el-dialog>
@@ -241,9 +241,9 @@ import { dataBaseInterface,reportlist} from '@/api/api.js';
     data() {
       return {
         linkTypeList:[
-          {value:1,label:"ETA指标/预测指标"},
-          {value:2,label:"ETA图库"},
-          {value:3,label:"ETA研报"}
+          {value:1,label:this.$t('SandboxManage.SandFlow.link_type_opt1')},
+          {value:2,label:this.$t('SandboxManage.SandFlow.link_type_opt2')},
+          {value:3,label:this.$t('SandboxManage.SandFlow.link_type_opt3')}
         ],
         addLinkSearchParams:{
           linkType:1

+ 17 - 10
src/views/sandbox_manage/sandFlowNew/index.vue

@@ -394,7 +394,7 @@
           <dropdown-menu size="medium">
             <el-dropdown-item v-for="menu in contextMenuOption.filter(it => it.show)" :key="menu.key" @click.native="handleContext(menu.key)">
               <i :class="menu.icon" v-if="menu.icon" /> 
-              {{menu.label}}
+              {{getContentMenuOptText(menu.label)}}
             </el-dropdown-item>
           </dropdown-menu>
         </div>
@@ -445,7 +445,7 @@ import addLInkDia from './components/addLInkDia.vue';
     beforeRouteLeave(to,from,next) {
 		// 添加页切换路由提示保存
 		if(!this.$route.query.SandboxId) {
-			this.$confirm("在离开页面之前,是否保存当前内容?", "保存提示", {
+			this.$confirm(this.$t('SandboxManage.SandFlow.msg_leave_page_save'), this.$t('MsgPrompt.save_hints'), {
 					type: "warning"
 				}).then(() => {
 					this.saveChart('exit',()=>{
@@ -564,6 +564,13 @@ import addLInkDia from './components/addLInkDia.vue';
       clearInterval(this.loopTimer)
     },
     methods: {
+      getContentMenuOptText(e){
+        if(e==='复制') return this.$t('SandboxManage.SandFlow.copy_tag')
+        if(e==='删除') return this.$t('SandboxManage.SandFlow.delete_tag')
+        if(e==='添加链接') return this.$t('SandboxManage.SandFlow.add_link')
+        if(e==='清除链接') return this.$t('SandboxManage.SandFlow.clear_link')
+        return e
+      },
       getSandboxClassify(){
         sandInterface.getSandboxClassifyOnly().then(res=>{
           if (res.Ret === 200) {
@@ -657,7 +664,7 @@ import addLInkDia from './components/addLInkDia.vue';
                 this.popoverVisible=true
                 if(!(this.linkList.length>0)){
                   if(item.key=='addLink'){
-                    item.label='添加链接'
+                    item.label=this.$t('SandboxManage.SandFlow.add_link')
                   }else if(item.key=='deleteLink'){
                     item.show=false
                   }
@@ -665,7 +672,7 @@ import addLInkDia from './components/addLInkDia.vue';
               }
               this.contextMenuOption.map(item =>{
                 if(item.key=='addLink'){
-                  item.label='编辑链接'
+                  item.label=this.$t('SandboxManage.SandFlow.edit_link')
                 }else if(item.key=='deleteLink'){
                   item.show=true
                 }
@@ -674,7 +681,7 @@ import addLInkDia from './components/addLInkDia.vue';
           }else{
             this.contextMenuOption.map(item =>{
               if(item.key=='addLink'){
-                item.label='添加链接'
+                item.label=this.$t('SandboxManage.SandFlow.add_link')
               }else if(item.key=='deleteLink'){
                 item.show=false
               }
@@ -806,7 +813,7 @@ import addLInkDia from './components/addLInkDia.vue';
         const select_cell = this.graph.getSelectedCells()[0]
         if(select_cell){
           select_cell.data.linkData=[]
-          this.$message.success('清除链接成功')
+          this.$message.success(this.$t('SandboxManage.SandFlow.clear_link_success'))
         }
       },
       saveLink(list){
@@ -821,7 +828,7 @@ import addLInkDia from './components/addLInkDia.vue';
             select_cell.data.linkFold=true
           }
         }
-        this.$message.success("链接保存成功")
+        this.$message.success(this.$t('SandboxManage.SandFlow.save_link'))
         this.addLinkShow=false
       },
       backList(){
@@ -862,7 +869,7 @@ import addLInkDia from './components/addLInkDia.vue';
                   const data = [new ClipboardItem({ [blob.type]: blob })]; 
                   await navigator.clipboard.write(data).then(
                   () => {
-                      this.$message.success('复制成功!')
+                      this.$message.success(this.$t('MsgPrompt.copy_success_msg'))
                   },
                   () => {
                       this.$message.warning('浏览器不支持')
@@ -926,7 +933,7 @@ import addLInkDia from './components/addLInkDia.vue';
 
         this.lockLoding = this.$loading({
           lock: true,
-          text: '保存中...',
+          text: this.$t('MsgPrompt.saveing_msg')+'...',
           target: '.sand-edit-container',
           spinner: 'el-icon-loading',
           background: 'rgba(255, 255, 255, 0.8)'
@@ -956,7 +963,7 @@ import addLInkDia from './components/addLInkDia.vue';
           if(this.$refs.classifyIdRef && this.$refs.classifyIdRef.getCheckedNodes()[0]){
             this.parentIds=this.$refs.classifyIdRef.getCheckedNodes()[0].path
           }
-          this.$message.success(`${SandboxId ? '编辑成功' : '保存成功'}`);
+          this.$message.success(`${SandboxId ? this.$t('MsgPrompt.edit_msg') : this.$t('MsgPrompt.saved_msg')}`);
           this.lockLoding.close();
           //如果是新增,直接跳转到编辑页面
           if(!SandboxId){

+ 3 - 2
src/views/system_manage/chartTheme/components/optionsSection.vue

@@ -32,8 +32,8 @@
                   </el-select>
                 </li>
 
-                <!-- 曲线额外配置 -->
-                <template v-if="[1,2].includes(chartType)">
+                <!-- 曲线额外配置 雷达 -->
+                <template v-if="[1,2,11].includes(chartType)">
                   <li class="option-item">
                     <label class="el-form-item__label">线型</label>
                     <el-select 
@@ -246,6 +246,7 @@ export default {
         6: {label:'线条、柱形设置',lineLabel: '系列'},
         7: {label:'柱形设置',lineLabel: '根'},
         10: {label:'散点设置',lineLabel: '系列'},
+        11: {label:'线条设置',lineLabel: '条'},
       },
       labelMap: new Map([
         ['lineOptions','线条设置'],

+ 4 - 1
src/views/system_manage/chartTheme/themeSetting.vue

@@ -112,8 +112,11 @@ export default {
         ChartThemeStyle: themeItem.Config
       };
       this.tableData = res.Data.EdbInfoList;
+
       if(this.chartInfo.ChartType === 7) return this.initBarData(res.Data);
-      if(this.chartInfo.ChartType === 10) return this.initSectionScatterData(res.Data);
+      else if(this.chartInfo.ChartType === 10) return this.initSectionScatterData(res.Data);
+      
+      else if(this.chartInfo.ChartType === 11) return this.initRadarData(res.Data);
 
       this.setChartOptionHandle(this.tableData)
     },

BIN
static/js/Luckysheet@2.1.13/dist/assets/iconfont/Anton-Regular.ttf


BIN
static/js/Luckysheet@2.1.13/dist/assets/iconfont/HanaleiFill-Regular.ttf


BIN
static/js/Luckysheet@2.1.13/dist/assets/iconfont/Pacifico-Regular.ttf


+ 539 - 0
static/js/Luckysheet@2.1.13/dist/assets/iconfont/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 2700 - 0
static/js/Luckysheet@2.1.13/dist/assets/iconfont/demo_index.html

@@ -0,0 +1,2700 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>IconFont Demo</title>
+  <link rel="shortcut icon" href="https://img.alicdn.com/tps/i4/TB1_oz6GVXXXXaFXpXXJDFnIXXX-64-64.ico" type="image/x-icon"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">&#xe86b;</a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=1990368" target="_blank" class="nav-more">查看项目</a>
+
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f8;</span>
+                <div class="name">链接</div>
+                <div class="code-name">&amp;#xe7f8;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f5;</span>
+                <div class="name">打印区域</div>
+                <div class="code-name">&amp;#xe7f5;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f6;</span>
+                <div class="name">打印页面配置</div>
+                <div class="code-name">&amp;#xe7f6;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f7;</span>
+                <div class="name">打印标题</div>
+                <div class="code-name">&amp;#xe7f7;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f2;</span>
+                <div class="name">分页预览</div>
+                <div class="code-name">&amp;#xe7f2;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f3;</span>
+                <div class="name">普通</div>
+                <div class="code-name">&amp;#xe7f3;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f4;</span>
+                <div class="name">页面布局</div>
+                <div class="code-name">&amp;#xe7f4;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ee;</span>
+                <div class="name">表格锁定</div>
+                <div class="code-name">&amp;#xe7ee;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f1;</span>
+                <div class="name">转到</div>
+                <div class="code-name">&amp;#xe7f1;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ed;</span>
+                <div class="name">右箭头</div>
+                <div class="code-name">&amp;#xe7ed;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ef;</span>
+                <div class="name">菜单</div>
+                <div class="code-name">&amp;#xe7ef;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7f0;</span>
+                <div class="name">替换</div>
+                <div class="code-name">&amp;#xe7f0;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e1;</span>
+                <div class="name">冻结</div>
+                <div class="code-name">&amp;#xe7e1;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e2;</span>
+                <div class="name">剪</div>
+                <div class="code-name">&amp;#xe7e2;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e3;</span>
+                <div class="name">加</div>
+                <div class="code-name">&amp;#xe7e3;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e4;</span>
+                <div class="name">溢出</div>
+                <div class="code-name">&amp;#xe7e4;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e5;</span>
+                <div class="name">升序</div>
+                <div class="code-name">&amp;#xe7e5;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e6;</span>
+                <div class="name">内框线</div>
+                <div class="code-name">&amp;#xe7e6;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e7;</span>
+                <div class="name">清除筛选</div>
+                <div class="code-name">&amp;#xe7e7;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e8;</span>
+                <div class="name">文本向上</div>
+                <div class="code-name">&amp;#xe7e8;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e9;</span>
+                <div class="name">降序</div>
+                <div class="code-name">&amp;#xe7e9;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ea;</span>
+                <div class="name">内框横线</div>
+                <div class="code-name">&amp;#xe7ea;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7eb;</span>
+                <div class="name">内框竖线</div>
+                <div class="code-name">&amp;#xe7eb;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ec;</span>
+                <div class="name">自定义排序</div>
+                <div class="code-name">&amp;#xe7ec;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7df;</span>
+                <div class="name">logo2</div>
+                <div class="code-name">&amp;#xe7df;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7e0;</span>
+                <div class="name">logo</div>
+                <div class="code-name">&amp;#xe7e0;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7de;</span>
+                <div class="name">文本倾斜</div>
+                <div class="code-name">&amp;#xe7de;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d9;</span>
+                <div class="name">加粗</div>
+                <div class="code-name">&amp;#xe7d9;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe78a;</span>
+                <div class="name">搜索</div>
+                <div class="code-name">&amp;#xe78a;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe78b;</span>
+                <div class="name">关闭</div>
+                <div class="code-name">&amp;#xe78b;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe78c;</span>
+                <div class="name">下一个</div>
+                <div class="code-name">&amp;#xe78c;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe78d;</span>
+                <div class="name">下拉</div>
+                <div class="code-name">&amp;#xe78d;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe78e;</span>
+                <div class="name">文本颜色</div>
+                <div class="code-name">&amp;#xe78e;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe78f;</span>
+                <div class="name">上一个</div>
+                <div class="code-name">&amp;#xe78f;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe790;</span>
+                <div class="name">数据透视</div>
+                <div class="code-name">&amp;#xe790;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe791;</span>
+                <div class="name">填充</div>
+                <div class="code-name">&amp;#xe791;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe792;</span>
+                <div class="name">增加小数位</div>
+                <div class="code-name">&amp;#xe792;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe793;</span>
+                <div class="name">编辑2</div>
+                <div class="code-name">&amp;#xe793;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe794;</span>
+                <div class="name">截屏</div>
+                <div class="code-name">&amp;#xe794;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe796;</span>
+                <div class="name">减小小数位</div>
+                <div class="code-name">&amp;#xe796;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe797;</span>
+                <div class="name">菜单</div>
+                <div class="code-name">&amp;#xe797;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe798;</span>
+                <div class="name">数据库</div>
+                <div class="code-name">&amp;#xe798;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe799;</span>
+                <div class="name">无边框</div>
+                <div class="code-name">&amp;#xe799;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe79a;</span>
+                <div class="name">编辑</div>
+                <div class="code-name">&amp;#xe79a;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe79b;</span>
+                <div class="name">清除样式</div>
+                <div class="code-name">&amp;#xe79b;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe79c;</span>
+                <div class="name">删除</div>
+                <div class="code-name">&amp;#xe79c;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe79d;</span>
+                <div class="name">文本居中对齐</div>
+                <div class="code-name">&amp;#xe79d;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe79e;</span>
+                <div class="name">打印</div>
+                <div class="code-name">&amp;#xe79e;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe79f;</span>
+                <div class="name">文本分割</div>
+                <div class="code-name">&amp;#xe79f;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a0;</span>
+                <div class="name">函数‘</div>
+                <div class="code-name">&amp;#xe7a0;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a1;</span>
+                <div class="name">降序</div>
+                <div class="code-name">&amp;#xe7a1;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a2;</span>
+                <div class="name">顶部对齐</div>
+                <div class="code-name">&amp;#xe7a2;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a3;</span>
+                <div class="name">图片</div>
+                <div class="code-name">&amp;#xe7a3;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a4;</span>
+                <div class="name">向下90</div>
+                <div class="code-name">&amp;#xe7a4;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a5;</span>
+                <div class="name">竖排文字</div>
+                <div class="code-name">&amp;#xe7a5;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a6;</span>
+                <div class="name">全加边框</div>
+                <div class="code-name">&amp;#xe7a6;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a7;</span>
+                <div class="name">升序</div>
+                <div class="code-name">&amp;#xe7a7;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a8;</span>
+                <div class="name">裁剪</div>
+                <div class="code-name">&amp;#xe7a8;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7a9;</span>
+                <div class="name">金额</div>
+                <div class="code-name">&amp;#xe7a9;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7aa;</span>
+                <div class="name">菜单1</div>
+                <div class="code-name">&amp;#xe7aa;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ab;</span>
+                <div class="name">取消合并</div>
+                <div class="code-name">&amp;#xe7ab;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ac;</span>
+                <div class="name">文本下划线</div>
+                <div class="code-name">&amp;#xe7ac;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ad;</span>
+                <div class="name">上边框</div>
+                <div class="code-name">&amp;#xe7ad;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ae;</span>
+                <div class="name">定位</div>
+                <div class="code-name">&amp;#xe7ae;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7af;</span>
+                <div class="name">四周加边框</div>
+                <div class="code-name">&amp;#xe7af;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b0;</span>
+                <div class="name">侧边栏收起</div>
+                <div class="code-name">&amp;#xe7b0;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b1;</span>
+                <div class="name">合并</div>
+                <div class="code-name">&amp;#xe7b1;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b2;</span>
+                <div class="name">向上倾斜</div>
+                <div class="code-name">&amp;#xe7b2;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b3;</span>
+                <div class="name">水平对齐</div>
+                <div class="code-name">&amp;#xe7b3;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b4;</span>
+                <div class="name">文本删除线</div>
+                <div class="code-name">&amp;#xe7b4;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b5;</span>
+                <div class="name">文本右对齐</div>
+                <div class="code-name">&amp;#xe7b5;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b6;</span>
+                <div class="name">前进</div>
+                <div class="code-name">&amp;#xe7b6;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b7;</span>
+                <div class="name">图表</div>
+                <div class="code-name">&amp;#xe7b7;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b8;</span>
+                <div class="name">右边框</div>
+                <div class="code-name">&amp;#xe7b8;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b9;</span>
+                <div class="name">百分号</div>
+                <div class="code-name">&amp;#xe7b9;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ba;</span>
+                <div class="name">格式刷</div>
+                <div class="code-name">&amp;#xe7ba;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7bb;</span>
+                <div class="name">保存</div>
+                <div class="code-name">&amp;#xe7bb;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7bc;</span>
+                <div class="name">数据验证</div>
+                <div class="code-name">&amp;#xe7bc;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7bd;</span>
+                <div class="name">截断</div>
+                <div class="code-name">&amp;#xe7bd;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7be;</span>
+                <div class="name">格式条件</div>
+                <div class="code-name">&amp;#xe7be;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7bf;</span>
+                <div class="name">自动换行</div>
+                <div class="code-name">&amp;#xe7bf;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c0;</span>
+                <div class="name">侧边栏展开</div>
+                <div class="code-name">&amp;#xe7c0;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c1;</span>
+                <div class="name">筛选2</div>
+                <div class="code-name">&amp;#xe7c1;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c2;</span>
+                <div class="name">向下倾斜</div>
+                <div class="code-name">&amp;#xe7c2;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c3;</span>
+                <div class="name">溢出</div>
+                <div class="code-name">&amp;#xe7c3;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c4;</span>
+                <div class="name">垂直合并</div>
+                <div class="code-name">&amp;#xe7c4;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c5;</span>
+                <div class="name">文本分散对齐</div>
+                <div class="code-name">&amp;#xe7c5;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c6;</span>
+                <div class="name">左边框</div>
+                <div class="code-name">&amp;#xe7c6;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c7;</span>
+                <div class="name">分页查看</div>
+                <div class="code-name">&amp;#xe7c7;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c8;</span>
+                <div class="name">运行</div>
+                <div class="code-name">&amp;#xe7c8;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7c9;</span>
+                <div class="name">列</div>
+                <div class="code-name">&amp;#xe7c9;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ca;</span>
+                <div class="name">全屏</div>
+                <div class="code-name">&amp;#xe7ca;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7cb;</span>
+                <div class="name">筛选</div>
+                <div class="code-name">&amp;#xe7cb;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7cc;</span>
+                <div class="name">更新</div>
+                <div class="code-name">&amp;#xe7cc;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7cd;</span>
+                <div class="name">清除</div>
+                <div class="code-name">&amp;#xe7cd;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7ce;</span>
+                <div class="name">行</div>
+                <div class="code-name">&amp;#xe7ce;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7cf;</span>
+                <div class="name">注释</div>
+                <div class="code-name">&amp;#xe7cf;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d0;</span>
+                <div class="name">剪</div>
+                <div class="code-name">&amp;#xe7d0;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d1;</span>
+                <div class="name">计算</div>
+                <div class="code-name">&amp;#xe7d1;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d2;</span>
+                <div class="name">加</div>
+                <div class="code-name">&amp;#xe7d2;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d3;</span>
+                <div class="name">底部对齐</div>
+                <div class="code-name">&amp;#xe7d3;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d4;</span>
+                <div class="name">向上90</div>
+                <div class="code-name">&amp;#xe7d4;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d5;</span>
+                <div class="name">无选装</div>
+                <div class="code-name">&amp;#xe7d5;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d6;</span>
+                <div class="name">显示隐藏网格</div>
+                <div class="code-name">&amp;#xe7d6;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d7;</span>
+                <div class="name">冻结</div>
+                <div class="code-name">&amp;#xe7d7;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7d8;</span>
+                <div class="name">文本左对齐</div>
+                <div class="code-name">&amp;#xe7d8;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7da;</span>
+                <div class="name">后退</div>
+                <div class="code-name">&amp;#xe7da;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7db;</span>
+                <div class="name">水平合并</div>
+                <div class="code-name">&amp;#xe7db;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7dc;</span>
+                <div class="name">下边框</div>
+                <div class="code-name">&amp;#xe7dc;</div>
+              </li>
+
+            <li class="dib">
+              <span class="icon iconfont">&#xe7dd;</span>
+                <div class="name">设置</div>
+                <div class="code-name">&amp;#xe7dd;</div>
+              </li>
+
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>兼容性最好,支持 IE6+,及所有现代浏览器。</li>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.eot');
+  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
+      url('iconfont.woff2') format('woff2'),
+      url('iconfont.woff') format('woff'),
+      url('iconfont.ttf') format('truetype'),
+      url('iconfont.svg#iconfont') format('svg');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-lianjie"></span>
+            <div class="name">
+              链接
+            </div>
+            <div class="code-name">.luckysheet-iconfont-lianjie
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dayinquyu"></span>
+            <div class="name">
+              打印区域
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dayinquyu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dayinyemianpeizhi"></span>
+            <div class="name">
+              打印页面配置
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dayinyemianpeizhi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dayinbiaoti"></span>
+            <div class="name">
+              打印标题
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dayinbiaoti
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-fenyeyulan"></span>
+            <div class="name">
+              分页预览
+            </div>
+            <div class="code-name">.luckysheet-iconfont-fenyeyulan
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-putong"></span>
+            <div class="name">
+              普通
+            </div>
+            <div class="code-name">.luckysheet-iconfont-putong
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-yemianbuju"></span>
+            <div class="name">
+              页面布局
+            </div>
+            <div class="code-name">.luckysheet-iconfont-yemianbuju
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-biaogesuoding"></span>
+            <div class="name">
+              表格锁定
+            </div>
+            <div class="code-name">.luckysheet-iconfont-biaogesuoding
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-zhuandao1"></span>
+            <div class="name">
+              转到
+            </div>
+            <div class="code-name">.luckysheet-iconfont-zhuandao1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-youjiantou"></span>
+            <div class="name">
+              右箭头
+            </div>
+            <div class="code-name">.luckysheet-iconfont-youjiantou
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-caidan2"></span>
+            <div class="name">
+              菜单
+            </div>
+            <div class="code-name">.luckysheet-iconfont-caidan2
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-tihuan"></span>
+            <div class="name">
+              替换
+            </div>
+            <div class="code-name">.luckysheet-iconfont-tihuan
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dongjie1"></span>
+            <div class="name">
+              冻结
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dongjie1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jian1"></span>
+            <div class="name">
+              剪
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jian1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jia1"></span>
+            <div class="name">
+              加
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jia1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-yichu1"></span>
+            <div class="name">
+              溢出
+            </div>
+            <div class="code-name">.luckysheet-iconfont-yichu1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shengxu1"></span>
+            <div class="name">
+              升序
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shengxu1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-neikuangxian"></span>
+            <div class="name">
+              内框线
+            </div>
+            <div class="code-name">.luckysheet-iconfont-neikuangxian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-qingchushaixuan"></span>
+            <div class="name">
+              清除筛选
+            </div>
+            <div class="code-name">.luckysheet-iconfont-qingchushaixuan
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenxiangshang"></span>
+            <div class="name">
+              文本向上
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenxiangshang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jiangxu1"></span>
+            <div class="name">
+              降序
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jiangxu1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-neikuanghengxian"></span>
+            <div class="name">
+              内框横线
+            </div>
+            <div class="code-name">.luckysheet-iconfont-neikuanghengxian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-neikuangshuxian"></span>
+            <div class="name">
+              内框竖线
+            </div>
+            <div class="code-name">.luckysheet-iconfont-neikuangshuxian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-zidingyipaixu"></span>
+            <div class="name">
+              自定义排序
+            </div>
+            <div class="code-name">.luckysheet-iconfont-zidingyipaixu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-logo2"></span>
+            <div class="name">
+              logo2
+            </div>
+            <div class="code-name">.luckysheet-iconfont-logo2
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-logo"></span>
+            <div class="name">
+              logo
+            </div>
+            <div class="code-name">.luckysheet-iconfont-logo
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenqingxie1"></span>
+            <div class="name">
+              文本倾斜
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenqingxie1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jiacu"></span>
+            <div class="name">
+              加粗
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jiacu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-sousuo"></span>
+            <div class="name">
+              搜索
+            </div>
+            <div class="code-name">.luckysheet-iconfont-sousuo
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-guanbi"></span>
+            <div class="name">
+              关闭
+            </div>
+            <div class="code-name">.luckysheet-iconfont-guanbi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-xiayige"></span>
+            <div class="name">
+              下一个
+            </div>
+            <div class="code-name">.luckysheet-iconfont-xiayige
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-xiala"></span>
+            <div class="name">
+              下拉
+            </div>
+            <div class="code-name">.luckysheet-iconfont-xiala
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenyanse"></span>
+            <div class="name">
+              文本颜色
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenyanse
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shangyige"></span>
+            <div class="name">
+              上一个
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shangyige
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shujutoushi"></span>
+            <div class="name">
+              数据透视
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shujutoushi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-tianchong"></span>
+            <div class="name">
+              填充
+            </div>
+            <div class="code-name">.luckysheet-iconfont-tianchong
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-zengjiaxiaoshuwei"></span>
+            <div class="name">
+              增加小数位
+            </div>
+            <div class="code-name">.luckysheet-iconfont-zengjiaxiaoshuwei
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-bianji2"></span>
+            <div class="name">
+              编辑2
+            </div>
+            <div class="code-name">.luckysheet-iconfont-bianji2
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jieping"></span>
+            <div class="name">
+              截屏
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jieping
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jianxiaoxiaoshuwei"></span>
+            <div class="name">
+              减小小数位
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jianxiaoxiaoshuwei
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-caidan"></span>
+            <div class="name">
+              菜单
+            </div>
+            <div class="code-name">.luckysheet-iconfont-caidan
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shujuku"></span>
+            <div class="name">
+              数据库
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shujuku
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wubiankuang"></span>
+            <div class="name">
+              无边框
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wubiankuang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-bianji"></span>
+            <div class="name">
+              编辑
+            </div>
+            <div class="code-name">.luckysheet-iconfont-bianji
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-qingchuyangshi"></span>
+            <div class="name">
+              清除样式
+            </div>
+            <div class="code-name">.luckysheet-iconfont-qingchuyangshi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shanchu"></span>
+            <div class="name">
+              删除
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shanchu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenjuzhongduiqi"></span>
+            <div class="name">
+              文本居中对齐
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenjuzhongduiqi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dayin"></span>
+            <div class="name">
+              打印
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dayin
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenfenge"></span>
+            <div class="name">
+              文本分割
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenfenge
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-hanshu"></span>
+            <div class="name">
+              函数‘
+            </div>
+            <div class="code-name">.luckysheet-iconfont-hanshu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jiangxu"></span>
+            <div class="name">
+              降序
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jiangxu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dingbuduiqi"></span>
+            <div class="name">
+              顶部对齐
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dingbuduiqi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-tupian"></span>
+            <div class="name">
+              图片
+            </div>
+            <div class="code-name">.luckysheet-iconfont-tupian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-xiangxia90"></span>
+            <div class="name">
+              向下90
+            </div>
+            <div class="code-name">.luckysheet-iconfont-xiangxia90
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shupaiwenzi"></span>
+            <div class="name">
+              竖排文字
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shupaiwenzi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-quanjiabiankuang"></span>
+            <div class="name">
+              全加边框
+            </div>
+            <div class="code-name">.luckysheet-iconfont-quanjiabiankuang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shengxu"></span>
+            <div class="name">
+              升序
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shengxu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-caijian"></span>
+            <div class="name">
+              裁剪
+            </div>
+            <div class="code-name">.luckysheet-iconfont-caijian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jine"></span>
+            <div class="name">
+              金额
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jine
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-caidan1"></span>
+            <div class="name">
+              菜单1
+            </div>
+            <div class="code-name">.luckysheet-iconfont-caidan1
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-quxiaohebing"></span>
+            <div class="name">
+              取消合并
+            </div>
+            <div class="code-name">.luckysheet-iconfont-quxiaohebing
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenxiahuaxian"></span>
+            <div class="name">
+              文本下划线
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenxiahuaxian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shangbiankuang"></span>
+            <div class="name">
+              上边框
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shangbiankuang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dingwei"></span>
+            <div class="name">
+              定位
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dingwei
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-sizhoujiabiankuang"></span>
+            <div class="name">
+              四周加边框
+            </div>
+            <div class="code-name">.luckysheet-iconfont-sizhoujiabiankuang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-cebianlanshouqi"></span>
+            <div class="name">
+              侧边栏收起
+            </div>
+            <div class="code-name">.luckysheet-iconfont-cebianlanshouqi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-hebing"></span>
+            <div class="name">
+              合并
+            </div>
+            <div class="code-name">.luckysheet-iconfont-hebing
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-xiangshangqingxie"></span>
+            <div class="name">
+              向上倾斜
+            </div>
+            <div class="code-name">.luckysheet-iconfont-xiangshangqingxie
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shuipingduiqi"></span>
+            <div class="name">
+              水平对齐
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shuipingduiqi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenshanchuxian"></span>
+            <div class="name">
+              文本删除线
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenshanchuxian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenyouduiqi"></span>
+            <div class="name">
+              文本右对齐
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenyouduiqi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-qianjin"></span>
+            <div class="name">
+              前进
+            </div>
+            <div class="code-name">.luckysheet-iconfont-qianjin
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-tubiao"></span>
+            <div class="name">
+              图表
+            </div>
+            <div class="code-name">.luckysheet-iconfont-tubiao
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-youbiankuang"></span>
+            <div class="name">
+              右边框
+            </div>
+            <div class="code-name">.luckysheet-iconfont-youbiankuang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-baifenhao"></span>
+            <div class="name">
+              百分号
+            </div>
+            <div class="code-name">.luckysheet-iconfont-baifenhao
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-geshishua"></span>
+            <div class="name">
+              格式刷
+            </div>
+            <div class="code-name">.luckysheet-iconfont-geshishua
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-baocun"></span>
+            <div class="name">
+              保存
+            </div>
+            <div class="code-name">.luckysheet-iconfont-baocun
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shujuyanzheng"></span>
+            <div class="name">
+              数据验证
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shujuyanzheng
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jieduan"></span>
+            <div class="name">
+              截断
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jieduan
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-geshitiaojian"></span>
+            <div class="name">
+              格式条件
+            </div>
+            <div class="code-name">.luckysheet-iconfont-geshitiaojian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-zidonghuanhang"></span>
+            <div class="name">
+              自动换行
+            </div>
+            <div class="code-name">.luckysheet-iconfont-zidonghuanhang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-cebianlanzhankai"></span>
+            <div class="name">
+              侧边栏展开
+            </div>
+            <div class="code-name">.luckysheet-iconfont-cebianlanzhankai
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shaixuan2"></span>
+            <div class="name">
+              筛选2
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shaixuan2
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-xiangxiaqingxie"></span>
+            <div class="name">
+              向下倾斜
+            </div>
+            <div class="code-name">.luckysheet-iconfont-xiangxiaqingxie
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-yichu"></span>
+            <div class="name">
+              溢出
+            </div>
+            <div class="code-name">.luckysheet-iconfont-yichu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-chuizhihebing"></span>
+            <div class="name">
+              垂直合并
+            </div>
+            <div class="code-name">.luckysheet-iconfont-chuizhihebing
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenfensanduiqi"></span>
+            <div class="name">
+              文本分散对齐
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenfensanduiqi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-zuobiankuang"></span>
+            <div class="name">
+              左边框
+            </div>
+            <div class="code-name">.luckysheet-iconfont-zuobiankuang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-fenyechakan"></span>
+            <div class="name">
+              分页查看
+            </div>
+            <div class="code-name">.luckysheet-iconfont-fenyechakan
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-yunhang"></span>
+            <div class="name">
+              运行
+            </div>
+            <div class="code-name">.luckysheet-iconfont-yunhang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-lie"></span>
+            <div class="name">
+              列
+            </div>
+            <div class="code-name">.luckysheet-iconfont-lie
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-quanping"></span>
+            <div class="name">
+              全屏
+            </div>
+            <div class="code-name">.luckysheet-iconfont-quanping
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shaixuan"></span>
+            <div class="name">
+              筛选
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shaixuan
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-gengxin"></span>
+            <div class="name">
+              更新
+            </div>
+            <div class="code-name">.luckysheet-iconfont-gengxin
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-qingchu"></span>
+            <div class="name">
+              清除
+            </div>
+            <div class="code-name">.luckysheet-iconfont-qingchu
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-hang"></span>
+            <div class="name">
+              行
+            </div>
+            <div class="code-name">.luckysheet-iconfont-hang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-zhushi"></span>
+            <div class="name">
+              注释
+            </div>
+            <div class="code-name">.luckysheet-iconfont-zhushi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jian"></span>
+            <div class="name">
+              剪
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jian
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jisuan"></span>
+            <div class="name">
+              计算
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jisuan
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-jia"></span>
+            <div class="name">
+              加
+            </div>
+            <div class="code-name">.luckysheet-iconfont-jia
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dibuduiqi"></span>
+            <div class="name">
+              底部对齐
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dibuduiqi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-xiangshang90"></span>
+            <div class="name">
+              向上90
+            </div>
+            <div class="code-name">.luckysheet-iconfont-xiangshang90
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wuxuanzhuang"></span>
+            <div class="name">
+              无选装
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wuxuanzhuang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-xianshiyincangwangge"></span>
+            <div class="name">
+              显示隐藏网格
+            </div>
+            <div class="code-name">.luckysheet-iconfont-xianshiyincangwangge
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-dongjie"></span>
+            <div class="name">
+              冻结
+            </div>
+            <div class="code-name">.luckysheet-iconfont-dongjie
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-wenbenzuoduiqi"></span>
+            <div class="name">
+              文本左对齐
+            </div>
+            <div class="code-name">.luckysheet-iconfont-wenbenzuoduiqi
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-houtui"></span>
+            <div class="name">
+              后退
+            </div>
+            <div class="code-name">.luckysheet-iconfont-houtui
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shuipinghebing"></span>
+            <div class="name">
+              水平合并
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shuipinghebing
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-xiabiankuang"></span>
+            <div class="name">
+              下边框
+            </div>
+            <div class="code-name">.luckysheet-iconfont-xiabiankuang
+            </div>
+          </li>
+
+          <li class="dib">
+            <span class="icon iconfont-luckysheet luckysheet-iconfont-shezhi"></span>
+            <div class="name">
+              设置
+            </div>
+            <div class="code-name">.luckysheet-iconfont-shezhi
+            </div>
+          </li>
+
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>兼容性良好,支持 IE8+,及所有现代浏览器。</li>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+          <li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont-luckysheet luckysheet-iconfont-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-lianjie"></use>
+                </svg>
+                <div class="name">链接</div>
+                <div class="code-name">#luckysheet-iconfont-lianjie</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dayinquyu"></use>
+                </svg>
+                <div class="name">打印区域</div>
+                <div class="code-name">#luckysheet-iconfont-dayinquyu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dayinyemianpeizhi"></use>
+                </svg>
+                <div class="name">打印页面配置</div>
+                <div class="code-name">#luckysheet-iconfont-dayinyemianpeizhi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dayinbiaoti"></use>
+                </svg>
+                <div class="name">打印标题</div>
+                <div class="code-name">#luckysheet-iconfont-dayinbiaoti</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-fenyeyulan"></use>
+                </svg>
+                <div class="name">分页预览</div>
+                <div class="code-name">#luckysheet-iconfont-fenyeyulan</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-putong"></use>
+                </svg>
+                <div class="name">普通</div>
+                <div class="code-name">#luckysheet-iconfont-putong</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-yemianbuju"></use>
+                </svg>
+                <div class="name">页面布局</div>
+                <div class="code-name">#luckysheet-iconfont-yemianbuju</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-biaogesuoding"></use>
+                </svg>
+                <div class="name">表格锁定</div>
+                <div class="code-name">#luckysheet-iconfont-biaogesuoding</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-zhuandao1"></use>
+                </svg>
+                <div class="name">转到</div>
+                <div class="code-name">#luckysheet-iconfont-zhuandao1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-youjiantou"></use>
+                </svg>
+                <div class="name">右箭头</div>
+                <div class="code-name">#luckysheet-iconfont-youjiantou</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-caidan2"></use>
+                </svg>
+                <div class="name">菜单</div>
+                <div class="code-name">#luckysheet-iconfont-caidan2</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-tihuan"></use>
+                </svg>
+                <div class="name">替换</div>
+                <div class="code-name">#luckysheet-iconfont-tihuan</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dongjie1"></use>
+                </svg>
+                <div class="name">冻结</div>
+                <div class="code-name">#luckysheet-iconfont-dongjie1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jian1"></use>
+                </svg>
+                <div class="name">剪</div>
+                <div class="code-name">#luckysheet-iconfont-jian1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jia1"></use>
+                </svg>
+                <div class="name">加</div>
+                <div class="code-name">#luckysheet-iconfont-jia1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-yichu1"></use>
+                </svg>
+                <div class="name">溢出</div>
+                <div class="code-name">#luckysheet-iconfont-yichu1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shengxu1"></use>
+                </svg>
+                <div class="name">升序</div>
+                <div class="code-name">#luckysheet-iconfont-shengxu1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-neikuangxian"></use>
+                </svg>
+                <div class="name">内框线</div>
+                <div class="code-name">#luckysheet-iconfont-neikuangxian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-qingchushaixuan"></use>
+                </svg>
+                <div class="name">清除筛选</div>
+                <div class="code-name">#luckysheet-iconfont-qingchushaixuan</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenxiangshang"></use>
+                </svg>
+                <div class="name">文本向上</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenxiangshang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jiangxu1"></use>
+                </svg>
+                <div class="name">降序</div>
+                <div class="code-name">#luckysheet-iconfont-jiangxu1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-neikuanghengxian"></use>
+                </svg>
+                <div class="name">内框横线</div>
+                <div class="code-name">#luckysheet-iconfont-neikuanghengxian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-neikuangshuxian"></use>
+                </svg>
+                <div class="name">内框竖线</div>
+                <div class="code-name">#luckysheet-iconfont-neikuangshuxian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-zidingyipaixu"></use>
+                </svg>
+                <div class="name">自定义排序</div>
+                <div class="code-name">#luckysheet-iconfont-zidingyipaixu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-logo2"></use>
+                </svg>
+                <div class="name">logo2</div>
+                <div class="code-name">#luckysheet-iconfont-logo2</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-logo"></use>
+                </svg>
+                <div class="name">logo</div>
+                <div class="code-name">#luckysheet-iconfont-logo</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenqingxie1"></use>
+                </svg>
+                <div class="name">文本倾斜</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenqingxie1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jiacu"></use>
+                </svg>
+                <div class="name">加粗</div>
+                <div class="code-name">#luckysheet-iconfont-jiacu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-sousuo"></use>
+                </svg>
+                <div class="name">搜索</div>
+                <div class="code-name">#luckysheet-iconfont-sousuo</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-guanbi"></use>
+                </svg>
+                <div class="name">关闭</div>
+                <div class="code-name">#luckysheet-iconfont-guanbi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-xiayige"></use>
+                </svg>
+                <div class="name">下一个</div>
+                <div class="code-name">#luckysheet-iconfont-xiayige</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-xiala"></use>
+                </svg>
+                <div class="name">下拉</div>
+                <div class="code-name">#luckysheet-iconfont-xiala</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenyanse"></use>
+                </svg>
+                <div class="name">文本颜色</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenyanse</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shangyige"></use>
+                </svg>
+                <div class="name">上一个</div>
+                <div class="code-name">#luckysheet-iconfont-shangyige</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shujutoushi"></use>
+                </svg>
+                <div class="name">数据透视</div>
+                <div class="code-name">#luckysheet-iconfont-shujutoushi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-tianchong"></use>
+                </svg>
+                <div class="name">填充</div>
+                <div class="code-name">#luckysheet-iconfont-tianchong</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-zengjiaxiaoshuwei"></use>
+                </svg>
+                <div class="name">增加小数位</div>
+                <div class="code-name">#luckysheet-iconfont-zengjiaxiaoshuwei</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-bianji2"></use>
+                </svg>
+                <div class="name">编辑2</div>
+                <div class="code-name">#luckysheet-iconfont-bianji2</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jieping"></use>
+                </svg>
+                <div class="name">截屏</div>
+                <div class="code-name">#luckysheet-iconfont-jieping</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jianxiaoxiaoshuwei"></use>
+                </svg>
+                <div class="name">减小小数位</div>
+                <div class="code-name">#luckysheet-iconfont-jianxiaoxiaoshuwei</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-caidan"></use>
+                </svg>
+                <div class="name">菜单</div>
+                <div class="code-name">#luckysheet-iconfont-caidan</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shujuku"></use>
+                </svg>
+                <div class="name">数据库</div>
+                <div class="code-name">#luckysheet-iconfont-shujuku</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wubiankuang"></use>
+                </svg>
+                <div class="name">无边框</div>
+                <div class="code-name">#luckysheet-iconfont-wubiankuang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-bianji"></use>
+                </svg>
+                <div class="name">编辑</div>
+                <div class="code-name">#luckysheet-iconfont-bianji</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-qingchuyangshi"></use>
+                </svg>
+                <div class="name">清除样式</div>
+                <div class="code-name">#luckysheet-iconfont-qingchuyangshi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shanchu"></use>
+                </svg>
+                <div class="name">删除</div>
+                <div class="code-name">#luckysheet-iconfont-shanchu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenjuzhongduiqi"></use>
+                </svg>
+                <div class="name">文本居中对齐</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenjuzhongduiqi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dayin"></use>
+                </svg>
+                <div class="name">打印</div>
+                <div class="code-name">#luckysheet-iconfont-dayin</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenfenge"></use>
+                </svg>
+                <div class="name">文本分割</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenfenge</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-hanshu"></use>
+                </svg>
+                <div class="name">函数‘</div>
+                <div class="code-name">#luckysheet-iconfont-hanshu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jiangxu"></use>
+                </svg>
+                <div class="name">降序</div>
+                <div class="code-name">#luckysheet-iconfont-jiangxu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dingbuduiqi"></use>
+                </svg>
+                <div class="name">顶部对齐</div>
+                <div class="code-name">#luckysheet-iconfont-dingbuduiqi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-tupian"></use>
+                </svg>
+                <div class="name">图片</div>
+                <div class="code-name">#luckysheet-iconfont-tupian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-xiangxia90"></use>
+                </svg>
+                <div class="name">向下90</div>
+                <div class="code-name">#luckysheet-iconfont-xiangxia90</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shupaiwenzi"></use>
+                </svg>
+                <div class="name">竖排文字</div>
+                <div class="code-name">#luckysheet-iconfont-shupaiwenzi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-quanjiabiankuang"></use>
+                </svg>
+                <div class="name">全加边框</div>
+                <div class="code-name">#luckysheet-iconfont-quanjiabiankuang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shengxu"></use>
+                </svg>
+                <div class="name">升序</div>
+                <div class="code-name">#luckysheet-iconfont-shengxu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-caijian"></use>
+                </svg>
+                <div class="name">裁剪</div>
+                <div class="code-name">#luckysheet-iconfont-caijian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jine"></use>
+                </svg>
+                <div class="name">金额</div>
+                <div class="code-name">#luckysheet-iconfont-jine</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-caidan1"></use>
+                </svg>
+                <div class="name">菜单1</div>
+                <div class="code-name">#luckysheet-iconfont-caidan1</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-quxiaohebing"></use>
+                </svg>
+                <div class="name">取消合并</div>
+                <div class="code-name">#luckysheet-iconfont-quxiaohebing</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenxiahuaxian"></use>
+                </svg>
+                <div class="name">文本下划线</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenxiahuaxian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shangbiankuang"></use>
+                </svg>
+                <div class="name">上边框</div>
+                <div class="code-name">#luckysheet-iconfont-shangbiankuang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dingwei"></use>
+                </svg>
+                <div class="name">定位</div>
+                <div class="code-name">#luckysheet-iconfont-dingwei</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-sizhoujiabiankuang"></use>
+                </svg>
+                <div class="name">四周加边框</div>
+                <div class="code-name">#luckysheet-iconfont-sizhoujiabiankuang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-cebianlanshouqi"></use>
+                </svg>
+                <div class="name">侧边栏收起</div>
+                <div class="code-name">#luckysheet-iconfont-cebianlanshouqi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-hebing"></use>
+                </svg>
+                <div class="name">合并</div>
+                <div class="code-name">#luckysheet-iconfont-hebing</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-xiangshangqingxie"></use>
+                </svg>
+                <div class="name">向上倾斜</div>
+                <div class="code-name">#luckysheet-iconfont-xiangshangqingxie</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shuipingduiqi"></use>
+                </svg>
+                <div class="name">水平对齐</div>
+                <div class="code-name">#luckysheet-iconfont-shuipingduiqi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenshanchuxian"></use>
+                </svg>
+                <div class="name">文本删除线</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenshanchuxian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenyouduiqi"></use>
+                </svg>
+                <div class="name">文本右对齐</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenyouduiqi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-qianjin"></use>
+                </svg>
+                <div class="name">前进</div>
+                <div class="code-name">#luckysheet-iconfont-qianjin</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-tubiao"></use>
+                </svg>
+                <div class="name">图表</div>
+                <div class="code-name">#luckysheet-iconfont-tubiao</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-youbiankuang"></use>
+                </svg>
+                <div class="name">右边框</div>
+                <div class="code-name">#luckysheet-iconfont-youbiankuang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-baifenhao"></use>
+                </svg>
+                <div class="name">百分号</div>
+                <div class="code-name">#luckysheet-iconfont-baifenhao</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-geshishua"></use>
+                </svg>
+                <div class="name">格式刷</div>
+                <div class="code-name">#luckysheet-iconfont-geshishua</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-baocun"></use>
+                </svg>
+                <div class="name">保存</div>
+                <div class="code-name">#luckysheet-iconfont-baocun</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shujuyanzheng"></use>
+                </svg>
+                <div class="name">数据验证</div>
+                <div class="code-name">#luckysheet-iconfont-shujuyanzheng</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jieduan"></use>
+                </svg>
+                <div class="name">截断</div>
+                <div class="code-name">#luckysheet-iconfont-jieduan</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-geshitiaojian"></use>
+                </svg>
+                <div class="name">格式条件</div>
+                <div class="code-name">#luckysheet-iconfont-geshitiaojian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-zidonghuanhang"></use>
+                </svg>
+                <div class="name">自动换行</div>
+                <div class="code-name">#luckysheet-iconfont-zidonghuanhang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-cebianlanzhankai"></use>
+                </svg>
+                <div class="name">侧边栏展开</div>
+                <div class="code-name">#luckysheet-iconfont-cebianlanzhankai</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shaixuan2"></use>
+                </svg>
+                <div class="name">筛选2</div>
+                <div class="code-name">#luckysheet-iconfont-shaixuan2</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-xiangxiaqingxie"></use>
+                </svg>
+                <div class="name">向下倾斜</div>
+                <div class="code-name">#luckysheet-iconfont-xiangxiaqingxie</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-yichu"></use>
+                </svg>
+                <div class="name">溢出</div>
+                <div class="code-name">#luckysheet-iconfont-yichu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-chuizhihebing"></use>
+                </svg>
+                <div class="name">垂直合并</div>
+                <div class="code-name">#luckysheet-iconfont-chuizhihebing</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenfensanduiqi"></use>
+                </svg>
+                <div class="name">文本分散对齐</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenfensanduiqi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-zuobiankuang"></use>
+                </svg>
+                <div class="name">左边框</div>
+                <div class="code-name">#luckysheet-iconfont-zuobiankuang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-fenyechakan"></use>
+                </svg>
+                <div class="name">分页查看</div>
+                <div class="code-name">#luckysheet-iconfont-fenyechakan</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-yunhang"></use>
+                </svg>
+                <div class="name">运行</div>
+                <div class="code-name">#luckysheet-iconfont-yunhang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-lie"></use>
+                </svg>
+                <div class="name">列</div>
+                <div class="code-name">#luckysheet-iconfont-lie</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-quanping"></use>
+                </svg>
+                <div class="name">全屏</div>
+                <div class="code-name">#luckysheet-iconfont-quanping</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shaixuan"></use>
+                </svg>
+                <div class="name">筛选</div>
+                <div class="code-name">#luckysheet-iconfont-shaixuan</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-gengxin"></use>
+                </svg>
+                <div class="name">更新</div>
+                <div class="code-name">#luckysheet-iconfont-gengxin</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-qingchu"></use>
+                </svg>
+                <div class="name">清除</div>
+                <div class="code-name">#luckysheet-iconfont-qingchu</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-hang"></use>
+                </svg>
+                <div class="name">行</div>
+                <div class="code-name">#luckysheet-iconfont-hang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-zhushi"></use>
+                </svg>
+                <div class="name">注释</div>
+                <div class="code-name">#luckysheet-iconfont-zhushi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jian"></use>
+                </svg>
+                <div class="name">剪</div>
+                <div class="code-name">#luckysheet-iconfont-jian</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jisuan"></use>
+                </svg>
+                <div class="name">计算</div>
+                <div class="code-name">#luckysheet-iconfont-jisuan</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-jia"></use>
+                </svg>
+                <div class="name">加</div>
+                <div class="code-name">#luckysheet-iconfont-jia</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dibuduiqi"></use>
+                </svg>
+                <div class="name">底部对齐</div>
+                <div class="code-name">#luckysheet-iconfont-dibuduiqi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-xiangshang90"></use>
+                </svg>
+                <div class="name">向上90</div>
+                <div class="code-name">#luckysheet-iconfont-xiangshang90</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wuxuanzhuang"></use>
+                </svg>
+                <div class="name">无选装</div>
+                <div class="code-name">#luckysheet-iconfont-wuxuanzhuang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-xianshiyincangwangge"></use>
+                </svg>
+                <div class="name">显示隐藏网格</div>
+                <div class="code-name">#luckysheet-iconfont-xianshiyincangwangge</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-dongjie"></use>
+                </svg>
+                <div class="name">冻结</div>
+                <div class="code-name">#luckysheet-iconfont-dongjie</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-wenbenzuoduiqi"></use>
+                </svg>
+                <div class="name">文本左对齐</div>
+                <div class="code-name">#luckysheet-iconfont-wenbenzuoduiqi</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-houtui"></use>
+                </svg>
+                <div class="name">后退</div>
+                <div class="code-name">#luckysheet-iconfont-houtui</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shuipinghebing"></use>
+                </svg>
+                <div class="name">水平合并</div>
+                <div class="code-name">#luckysheet-iconfont-shuipinghebing</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-xiabiankuang"></use>
+                </svg>
+                <div class="name">下边框</div>
+                <div class="code-name">#luckysheet-iconfont-xiabiankuang</div>
+            </li>
+
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#luckysheet-iconfont-shezhi"></use>
+                </svg>
+                <div class="name">设置</div>
+                <div class="code-name">#luckysheet-iconfont-shezhi</div>
+            </li>
+
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

File diff suppressed because it is too large
+ 3 - 0
static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.css


BIN
static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.eot


File diff suppressed because it is too large
+ 0 - 0
static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.js


+ 779 - 0
static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.json

@@ -0,0 +1,779 @@
+{
+  "id": "1990368",
+  "name": "lucksheet",
+  "font_family": "iconfont",
+  "css_prefix_text": "luckysheet-iconfont-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "17878780",
+      "name": "链接",
+      "font_class": "lianjie",
+      "unicode": "e7f8",
+      "unicode_decimal": 59384
+    },
+    {
+      "icon_id": "17612330",
+      "name": "打印区域",
+      "font_class": "dayinquyu",
+      "unicode": "e7f5",
+      "unicode_decimal": 59381
+    },
+    {
+      "icon_id": "17612331",
+      "name": "打印页面配置",
+      "font_class": "dayinyemianpeizhi",
+      "unicode": "e7f6",
+      "unicode_decimal": 59382
+    },
+    {
+      "icon_id": "17612332",
+      "name": "打印标题",
+      "font_class": "dayinbiaoti",
+      "unicode": "e7f7",
+      "unicode_decimal": 59383
+    },
+    {
+      "icon_id": "17600443",
+      "name": "分页预览",
+      "font_class": "fenyeyulan",
+      "unicode": "e7f2",
+      "unicode_decimal": 59378
+    },
+    {
+      "icon_id": "17600444",
+      "name": "普通",
+      "font_class": "putong",
+      "unicode": "e7f3",
+      "unicode_decimal": 59379
+    },
+    {
+      "icon_id": "17600445",
+      "name": "页面布局",
+      "font_class": "yemianbuju",
+      "unicode": "e7f4",
+      "unicode_decimal": 59380
+    },
+    {
+      "icon_id": "17597312",
+      "name": "表格锁定",
+      "font_class": "biaogesuoding",
+      "unicode": "e7ee",
+      "unicode_decimal": 59374
+    },
+    {
+      "icon_id": "17444514",
+      "name": "转到",
+      "font_class": "zhuandao1",
+      "unicode": "e7f1",
+      "unicode_decimal": 59377
+    },
+    {
+      "icon_id": "17444503",
+      "name": "右箭头",
+      "font_class": "youjiantou",
+      "unicode": "e7ed",
+      "unicode_decimal": 59373
+    },
+    {
+      "icon_id": "17444507",
+      "name": "菜单",
+      "font_class": "caidan2",
+      "unicode": "e7ef",
+      "unicode_decimal": 59375
+    },
+    {
+      "icon_id": "17444508",
+      "name": "替换",
+      "font_class": "tihuan",
+      "unicode": "e7f0",
+      "unicode_decimal": 59376
+    },
+    {
+      "icon_id": "17392794",
+      "name": "冻结",
+      "font_class": "dongjie1",
+      "unicode": "e7e1",
+      "unicode_decimal": 59361
+    },
+    {
+      "icon_id": "17392795",
+      "name": "剪",
+      "font_class": "jian1",
+      "unicode": "e7e2",
+      "unicode_decimal": 59362
+    },
+    {
+      "icon_id": "17392796",
+      "name": "加",
+      "font_class": "jia1",
+      "unicode": "e7e3",
+      "unicode_decimal": 59363
+    },
+    {
+      "icon_id": "17392797",
+      "name": "溢出",
+      "font_class": "yichu1",
+      "unicode": "e7e4",
+      "unicode_decimal": 59364
+    },
+    {
+      "icon_id": "17392798",
+      "name": "升序",
+      "font_class": "shengxu1",
+      "unicode": "e7e5",
+      "unicode_decimal": 59365
+    },
+    {
+      "icon_id": "17392799",
+      "name": "内框线",
+      "font_class": "neikuangxian",
+      "unicode": "e7e6",
+      "unicode_decimal": 59366
+    },
+    {
+      "icon_id": "17392800",
+      "name": "清除筛选",
+      "font_class": "qingchushaixuan",
+      "unicode": "e7e7",
+      "unicode_decimal": 59367
+    },
+    {
+      "icon_id": "17392801",
+      "name": "文本向上",
+      "font_class": "wenbenxiangshang",
+      "unicode": "e7e8",
+      "unicode_decimal": 59368
+    },
+    {
+      "icon_id": "17392802",
+      "name": "降序",
+      "font_class": "jiangxu1",
+      "unicode": "e7e9",
+      "unicode_decimal": 59369
+    },
+    {
+      "icon_id": "17392803",
+      "name": "内框横线",
+      "font_class": "neikuanghengxian",
+      "unicode": "e7ea",
+      "unicode_decimal": 59370
+    },
+    {
+      "icon_id": "17392804",
+      "name": "内框竖线",
+      "font_class": "neikuangshuxian",
+      "unicode": "e7eb",
+      "unicode_decimal": 59371
+    },
+    {
+      "icon_id": "17392805",
+      "name": "自定义排序",
+      "font_class": "zidingyipaixu",
+      "unicode": "e7ec",
+      "unicode_decimal": 59372
+    },
+    {
+      "icon_id": "16746498",
+      "name": "logo2",
+      "font_class": "logo2",
+      "unicode": "e7df",
+      "unicode_decimal": 59359
+    },
+    {
+      "icon_id": "16746532",
+      "name": "logo",
+      "font_class": "logo",
+      "unicode": "e7e0",
+      "unicode_decimal": 59360
+    },
+    {
+      "icon_id": "16730159",
+      "name": "文本倾斜",
+      "font_class": "wenbenqingxie1",
+      "unicode": "e7de",
+      "unicode_decimal": 59358
+    },
+    {
+      "icon_id": "16728412",
+      "name": "加粗",
+      "font_class": "jiacu",
+      "unicode": "e7d9",
+      "unicode_decimal": 59353
+    },
+    {
+      "icon_id": "16728080",
+      "name": "搜索",
+      "font_class": "sousuo",
+      "unicode": "e78a",
+      "unicode_decimal": 59274
+    },
+    {
+      "icon_id": "16728081",
+      "name": "关闭",
+      "font_class": "guanbi",
+      "unicode": "e78b",
+      "unicode_decimal": 59275
+    },
+    {
+      "icon_id": "16728082",
+      "name": "下一个",
+      "font_class": "xiayige",
+      "unicode": "e78c",
+      "unicode_decimal": 59276
+    },
+    {
+      "icon_id": "16728083",
+      "name": "下拉",
+      "font_class": "xiala",
+      "unicode": "e78d",
+      "unicode_decimal": 59277
+    },
+    {
+      "icon_id": "16728084",
+      "name": "文本颜色",
+      "font_class": "wenbenyanse",
+      "unicode": "e78e",
+      "unicode_decimal": 59278
+    },
+    {
+      "icon_id": "16728085",
+      "name": "上一个",
+      "font_class": "shangyige",
+      "unicode": "e78f",
+      "unicode_decimal": 59279
+    },
+    {
+      "icon_id": "16728086",
+      "name": "数据透视",
+      "font_class": "shujutoushi",
+      "unicode": "e790",
+      "unicode_decimal": 59280
+    },
+    {
+      "icon_id": "16728087",
+      "name": "填充",
+      "font_class": "tianchong",
+      "unicode": "e791",
+      "unicode_decimal": 59281
+    },
+    {
+      "icon_id": "16728088",
+      "name": "增加小数位",
+      "font_class": "zengjiaxiaoshuwei",
+      "unicode": "e792",
+      "unicode_decimal": 59282
+    },
+    {
+      "icon_id": "16728089",
+      "name": "编辑2",
+      "font_class": "bianji2",
+      "unicode": "e793",
+      "unicode_decimal": 59283
+    },
+    {
+      "icon_id": "16728090",
+      "name": "截屏",
+      "font_class": "jieping",
+      "unicode": "e794",
+      "unicode_decimal": 59284
+    },
+    {
+      "icon_id": "16728092",
+      "name": "减小小数位",
+      "font_class": "jianxiaoxiaoshuwei",
+      "unicode": "e796",
+      "unicode_decimal": 59286
+    },
+    {
+      "icon_id": "16728093",
+      "name": "菜单",
+      "font_class": "caidan",
+      "unicode": "e797",
+      "unicode_decimal": 59287
+    },
+    {
+      "icon_id": "16728094",
+      "name": "数据库",
+      "font_class": "shujuku",
+      "unicode": "e798",
+      "unicode_decimal": 59288
+    },
+    {
+      "icon_id": "16728095",
+      "name": "无边框",
+      "font_class": "wubiankuang",
+      "unicode": "e799",
+      "unicode_decimal": 59289
+    },
+    {
+      "icon_id": "16728096",
+      "name": "编辑",
+      "font_class": "bianji",
+      "unicode": "e79a",
+      "unicode_decimal": 59290
+    },
+    {
+      "icon_id": "16728097",
+      "name": "清除样式",
+      "font_class": "qingchuyangshi",
+      "unicode": "e79b",
+      "unicode_decimal": 59291
+    },
+    {
+      "icon_id": "16728099",
+      "name": "删除",
+      "font_class": "shanchu",
+      "unicode": "e79c",
+      "unicode_decimal": 59292
+    },
+    {
+      "icon_id": "16728100",
+      "name": "文本居中对齐",
+      "font_class": "wenbenjuzhongduiqi",
+      "unicode": "e79d",
+      "unicode_decimal": 59293
+    },
+    {
+      "icon_id": "16728101",
+      "name": "打印",
+      "font_class": "dayin",
+      "unicode": "e79e",
+      "unicode_decimal": 59294
+    },
+    {
+      "icon_id": "16728102",
+      "name": "文本分割",
+      "font_class": "wenbenfenge",
+      "unicode": "e79f",
+      "unicode_decimal": 59295
+    },
+    {
+      "icon_id": "16728103",
+      "name": "函数‘",
+      "font_class": "hanshu",
+      "unicode": "e7a0",
+      "unicode_decimal": 59296
+    },
+    {
+      "icon_id": "16728104",
+      "name": "降序",
+      "font_class": "jiangxu",
+      "unicode": "e7a1",
+      "unicode_decimal": 59297
+    },
+    {
+      "icon_id": "16728105",
+      "name": "顶部对齐",
+      "font_class": "dingbuduiqi",
+      "unicode": "e7a2",
+      "unicode_decimal": 59298
+    },
+    {
+      "icon_id": "16728106",
+      "name": "图片",
+      "font_class": "tupian",
+      "unicode": "e7a3",
+      "unicode_decimal": 59299
+    },
+    {
+      "icon_id": "16728107",
+      "name": "向下90",
+      "font_class": "xiangxia90",
+      "unicode": "e7a4",
+      "unicode_decimal": 59300
+    },
+    {
+      "icon_id": "16728108",
+      "name": "竖排文字",
+      "font_class": "shupaiwenzi",
+      "unicode": "e7a5",
+      "unicode_decimal": 59301
+    },
+    {
+      "icon_id": "16728109",
+      "name": "全加边框",
+      "font_class": "quanjiabiankuang",
+      "unicode": "e7a6",
+      "unicode_decimal": 59302
+    },
+    {
+      "icon_id": "16728110",
+      "name": "升序",
+      "font_class": "shengxu",
+      "unicode": "e7a7",
+      "unicode_decimal": 59303
+    },
+    {
+      "icon_id": "16728111",
+      "name": "裁剪",
+      "font_class": "caijian",
+      "unicode": "e7a8",
+      "unicode_decimal": 59304
+    },
+    {
+      "icon_id": "16728112",
+      "name": "金额",
+      "font_class": "jine",
+      "unicode": "e7a9",
+      "unicode_decimal": 59305
+    },
+    {
+      "icon_id": "16728113",
+      "name": "菜单1",
+      "font_class": "caidan1",
+      "unicode": "e7aa",
+      "unicode_decimal": 59306
+    },
+    {
+      "icon_id": "16728114",
+      "name": "取消合并",
+      "font_class": "quxiaohebing",
+      "unicode": "e7ab",
+      "unicode_decimal": 59307
+    },
+    {
+      "icon_id": "16728115",
+      "name": "文本下划线",
+      "font_class": "wenbenxiahuaxian",
+      "unicode": "e7ac",
+      "unicode_decimal": 59308
+    },
+    {
+      "icon_id": "16728116",
+      "name": "上边框",
+      "font_class": "shangbiankuang",
+      "unicode": "e7ad",
+      "unicode_decimal": 59309
+    },
+    {
+      "icon_id": "16728117",
+      "name": "定位",
+      "font_class": "dingwei",
+      "unicode": "e7ae",
+      "unicode_decimal": 59310
+    },
+    {
+      "icon_id": "16728118",
+      "name": "四周加边框",
+      "font_class": "sizhoujiabiankuang",
+      "unicode": "e7af",
+      "unicode_decimal": 59311
+    },
+    {
+      "icon_id": "16728119",
+      "name": "侧边栏收起",
+      "font_class": "cebianlanshouqi",
+      "unicode": "e7b0",
+      "unicode_decimal": 59312
+    },
+    {
+      "icon_id": "16728120",
+      "name": "合并",
+      "font_class": "hebing",
+      "unicode": "e7b1",
+      "unicode_decimal": 59313
+    },
+    {
+      "icon_id": "16728121",
+      "name": "向上倾斜",
+      "font_class": "xiangshangqingxie",
+      "unicode": "e7b2",
+      "unicode_decimal": 59314
+    },
+    {
+      "icon_id": "16728122",
+      "name": "水平对齐",
+      "font_class": "shuipingduiqi",
+      "unicode": "e7b3",
+      "unicode_decimal": 59315
+    },
+    {
+      "icon_id": "16728123",
+      "name": "文本删除线",
+      "font_class": "wenbenshanchuxian",
+      "unicode": "e7b4",
+      "unicode_decimal": 59316
+    },
+    {
+      "icon_id": "16728124",
+      "name": "文本右对齐",
+      "font_class": "wenbenyouduiqi",
+      "unicode": "e7b5",
+      "unicode_decimal": 59317
+    },
+    {
+      "icon_id": "16728125",
+      "name": "前进",
+      "font_class": "qianjin",
+      "unicode": "e7b6",
+      "unicode_decimal": 59318
+    },
+    {
+      "icon_id": "16728126",
+      "name": "图表",
+      "font_class": "tubiao",
+      "unicode": "e7b7",
+      "unicode_decimal": 59319
+    },
+    {
+      "icon_id": "16728127",
+      "name": "右边框",
+      "font_class": "youbiankuang",
+      "unicode": "e7b8",
+      "unicode_decimal": 59320
+    },
+    {
+      "icon_id": "16728128",
+      "name": "百分号",
+      "font_class": "baifenhao",
+      "unicode": "e7b9",
+      "unicode_decimal": 59321
+    },
+    {
+      "icon_id": "16728129",
+      "name": "格式刷",
+      "font_class": "geshishua",
+      "unicode": "e7ba",
+      "unicode_decimal": 59322
+    },
+    {
+      "icon_id": "16728130",
+      "name": "保存",
+      "font_class": "baocun",
+      "unicode": "e7bb",
+      "unicode_decimal": 59323
+    },
+    {
+      "icon_id": "16728131",
+      "name": "数据验证",
+      "font_class": "shujuyanzheng",
+      "unicode": "e7bc",
+      "unicode_decimal": 59324
+    },
+    {
+      "icon_id": "16728132",
+      "name": "截断",
+      "font_class": "jieduan",
+      "unicode": "e7bd",
+      "unicode_decimal": 59325
+    },
+    {
+      "icon_id": "16728133",
+      "name": "格式条件",
+      "font_class": "geshitiaojian",
+      "unicode": "e7be",
+      "unicode_decimal": 59326
+    },
+    {
+      "icon_id": "16728134",
+      "name": "自动换行",
+      "font_class": "zidonghuanhang",
+      "unicode": "e7bf",
+      "unicode_decimal": 59327
+    },
+    {
+      "icon_id": "16728135",
+      "name": "侧边栏展开",
+      "font_class": "cebianlanzhankai",
+      "unicode": "e7c0",
+      "unicode_decimal": 59328
+    },
+    {
+      "icon_id": "16728136",
+      "name": "筛选2",
+      "font_class": "shaixuan2",
+      "unicode": "e7c1",
+      "unicode_decimal": 59329
+    },
+    {
+      "icon_id": "16728137",
+      "name": "向下倾斜",
+      "font_class": "xiangxiaqingxie",
+      "unicode": "e7c2",
+      "unicode_decimal": 59330
+    },
+    {
+      "icon_id": "16728138",
+      "name": "溢出",
+      "font_class": "yichu",
+      "unicode": "e7c3",
+      "unicode_decimal": 59331
+    },
+    {
+      "icon_id": "16728139",
+      "name": "垂直合并",
+      "font_class": "chuizhihebing",
+      "unicode": "e7c4",
+      "unicode_decimal": 59332
+    },
+    {
+      "icon_id": "16728140",
+      "name": "文本分散对齐",
+      "font_class": "wenbenfensanduiqi",
+      "unicode": "e7c5",
+      "unicode_decimal": 59333
+    },
+    {
+      "icon_id": "16728141",
+      "name": "左边框",
+      "font_class": "zuobiankuang",
+      "unicode": "e7c6",
+      "unicode_decimal": 59334
+    },
+    {
+      "icon_id": "16728142",
+      "name": "分页查看",
+      "font_class": "fenyechakan",
+      "unicode": "e7c7",
+      "unicode_decimal": 59335
+    },
+    {
+      "icon_id": "16728143",
+      "name": "运行",
+      "font_class": "yunhang",
+      "unicode": "e7c8",
+      "unicode_decimal": 59336
+    },
+    {
+      "icon_id": "16728144",
+      "name": "列",
+      "font_class": "lie",
+      "unicode": "e7c9",
+      "unicode_decimal": 59337
+    },
+    {
+      "icon_id": "16728145",
+      "name": "全屏",
+      "font_class": "quanping",
+      "unicode": "e7ca",
+      "unicode_decimal": 59338
+    },
+    {
+      "icon_id": "16728146",
+      "name": "筛选",
+      "font_class": "shaixuan",
+      "unicode": "e7cb",
+      "unicode_decimal": 59339
+    },
+    {
+      "icon_id": "16728147",
+      "name": "更新",
+      "font_class": "gengxin",
+      "unicode": "e7cc",
+      "unicode_decimal": 59340
+    },
+    {
+      "icon_id": "16728148",
+      "name": "清除",
+      "font_class": "qingchu",
+      "unicode": "e7cd",
+      "unicode_decimal": 59341
+    },
+    {
+      "icon_id": "16728149",
+      "name": "行",
+      "font_class": "hang",
+      "unicode": "e7ce",
+      "unicode_decimal": 59342
+    },
+    {
+      "icon_id": "16728150",
+      "name": "注释",
+      "font_class": "zhushi",
+      "unicode": "e7cf",
+      "unicode_decimal": 59343
+    },
+    {
+      "icon_id": "16728151",
+      "name": "剪",
+      "font_class": "jian",
+      "unicode": "e7d0",
+      "unicode_decimal": 59344
+    },
+    {
+      "icon_id": "16728152",
+      "name": "计算",
+      "font_class": "jisuan",
+      "unicode": "e7d1",
+      "unicode_decimal": 59345
+    },
+    {
+      "icon_id": "16728153",
+      "name": "加",
+      "font_class": "jia",
+      "unicode": "e7d2",
+      "unicode_decimal": 59346
+    },
+    {
+      "icon_id": "16728154",
+      "name": "底部对齐",
+      "font_class": "dibuduiqi",
+      "unicode": "e7d3",
+      "unicode_decimal": 59347
+    },
+    {
+      "icon_id": "16728155",
+      "name": "向上90",
+      "font_class": "xiangshang90",
+      "unicode": "e7d4",
+      "unicode_decimal": 59348
+    },
+    {
+      "icon_id": "16728156",
+      "name": "无选装",
+      "font_class": "wuxuanzhuang",
+      "unicode": "e7d5",
+      "unicode_decimal": 59349
+    },
+    {
+      "icon_id": "16728157",
+      "name": "显示隐藏网格",
+      "font_class": "xianshiyincangwangge",
+      "unicode": "e7d6",
+      "unicode_decimal": 59350
+    },
+    {
+      "icon_id": "16728158",
+      "name": "冻结",
+      "font_class": "dongjie",
+      "unicode": "e7d7",
+      "unicode_decimal": 59351
+    },
+    {
+      "icon_id": "16728159",
+      "name": "文本左对齐",
+      "font_class": "wenbenzuoduiqi",
+      "unicode": "e7d8",
+      "unicode_decimal": 59352
+    },
+    {
+      "icon_id": "16728161",
+      "name": "后退",
+      "font_class": "houtui",
+      "unicode": "e7da",
+      "unicode_decimal": 59354
+    },
+    {
+      "icon_id": "16728162",
+      "name": "水平合并",
+      "font_class": "shuipinghebing",
+      "unicode": "e7db",
+      "unicode_decimal": 59355
+    },
+    {
+      "icon_id": "16728163",
+      "name": "下边框",
+      "font_class": "xiabiankuang",
+      "unicode": "e7dc",
+      "unicode_decimal": 59356
+    },
+    {
+      "icon_id": "16728164",
+      "name": "设置",
+      "font_class": "shezhi",
+      "unicode": "e7dd",
+      "unicode_decimal": 59357
+    }
+  ]
+}

File diff suppressed because it is too large
+ 97 - 0
static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.svg


BIN
static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.ttf


BIN
static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.woff


BIN
static/js/Luckysheet@2.1.13/dist/assets/iconfont/iconfont.woff2


BIN
static/js/Luckysheet@2.1.13/dist/css/EwaAntH.gif


BIN
static/js/Luckysheet@2.1.13/dist/css/EwaAntV.gif


BIN
static/js/Luckysheet@2.1.13/dist/css/arrow-down.png


BIN
static/js/Luckysheet@2.1.13/dist/css/loading.gif


File diff suppressed because it is too large
+ 0 - 0
static/js/Luckysheet@2.1.13/dist/css/luckysheet.css


File diff suppressed because it is too large
+ 68 - 0
static/js/Luckysheet@2.1.13/dist/css/menuSprite.svg


BIN
static/js/Luckysheet@2.1.13/dist/css/paint_16px.ico


BIN
static/js/Luckysheet@2.1.13/dist/css/paint_24px.ico


BIN
static/js/Luckysheet@2.1.13/dist/css/paint_32px.ico


File diff suppressed because it is too large
+ 127 - 0
static/js/Luckysheet@2.1.13/dist/css/sprite38.svg


BIN
static/js/Luckysheet@2.1.13/dist/css/waffle_sprite.png


+ 410 - 0
static/js/Luckysheet@2.1.13/dist/demoData/chat.js

@@ -0,0 +1,410 @@
+export function initChat() {
+    if (!isNeedChat()) {
+        return
+    }
+
+    // Your CSS as text
+    let styles = `
+body {
+    background-color: #f5f5f5;
+}
+
+#chat-assistant-container {
+    position: fixed;
+    right: 40px;
+    bottom: 86px;
+    z-index:9990;
+}
+
+#chat-assistant-button {
+    width: 50px;
+    height: 50px;
+    border-radius: 50%;
+    border: none;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    cursor: pointer;
+    background: linear-gradient(135deg, rgb(215 98 150 / 55%),rgb(34 78 139 / 71%), rgb(114 222 172));
+    box-shadow: 0px 0px 8px 1px rgb(0 0 0 / 22%);
+    color: #fff;
+    text-shadow: 1px 1px 3px rgb(0 0 0 / 56%);
+}
+
+
+#chat-container {
+    position: fixed;
+    padding: 10px;
+    top: 45%;
+    left: 50%;
+    z-index:9990;
+    transform: translate(-50%, -50%);
+    display: none;
+    border-radius: 5px;
+    width: 40%;
+    background: linear-gradient(135deg, rgb(215 98 150 / 92%),rgb(34 78 139 / 93%), rgb(114 222 172 / 94%));
+    box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.2);
+}
+
+
+
+#chat-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 0 10px 10px 0;
+    border-radius: 5px 5px 0 0;
+    cursor: move;
+}
+
+#loading-indicator {
+    width: 14px;
+    height: 14px;
+    margin: 0 10px 0 10px;
+    border: 2px solid #ccc;
+    border-top-color: #4caf50;
+    border-radius: 50%;
+    animation: spin 2s linear infinite;
+    visibility: hidden;
+}
+
+@keyframes spin {
+    0% {
+        transform: rotate(0deg);
+    }
+
+    100% {
+        transform: rotate(360deg);
+    }
+}
+
+#chat-header .show-loading {
+    visibility: visible;
+}
+
+#chat-header .hide-loading {
+    visibility: hidden;
+}
+
+
+#circle-button {
+    padding: 0;
+    border: none;
+    background-color: transparent;
+    font-size: 16px;
+    user-select: none;
+    display: flex;
+    align-items: center;
+    color: #fff; 
+    text-shadow: 1px 1px 3px black;
+}
+
+#close-button {
+    cursor: pointer;
+    padding: 0;
+    border: none;
+    background-color: transparent;
+    font-size: 24px;
+    color: #fff; 
+    text-shadow: 1px 1px 3px black;
+}
+#send-button {
+    cursor: pointer;
+    padding: 0;
+    border: none;
+    background-color: transparent;
+    font-size: 16px;
+}
+
+#close-button:hover,
+#send-button:hover {
+    color: #888;
+}
+
+#chat-input-container,
+#chat-input {
+    border: none;
+}
+
+#chat-input-container {
+    display: flex;
+    align-items: center;
+    border-radius: 5px;
+    background-color: #fff;
+    padding: 10px;
+}
+
+#chat-input {
+    flex: 1;
+    padding: 0;
+    margin-right: 5px;
+    border-radius: 5px;
+    overflow-y: auto;
+    height: 24px;
+    font-size: 1rem;
+    outline: none;
+    resize: none;
+    background: transparent;
+}
+
+#send-button {
+    background-color: transparent;
+    border: none;
+    border-radius: 5px;
+    cursor: pointer;
+    padding: 5px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 32px;
+    width: 32px;
+}
+
+#send-button>span {
+    height: 16px;
+    width: 16px;
+}
+
+#send-button:enabled {
+    background-color: rgb(120,198,174);
+}
+
+#send-button:enabled svg path {
+    fill: #fff;
+}
+`
+
+    let styleSheet = document.createElement("style")
+    styleSheet.innerText = styles
+    document.head.appendChild(styleSheet)
+
+
+    const html = `<div id="chat-assistant-container">
+            <button id="chat-assistant-button">🤖AI</button>
+        </div>
+    
+        <div id="chat-container">
+            <div id="chat-header">
+                <span id="circle-button">Univer AI 助手<div id="loading-indicator"></div></span>
+    
+                <button id="close-button">×</button>
+            </div>
+            <div id="chat-input-container">
+                <textarea id="chat-input" placeholder="请输入问题"></textarea>
+                <!-- <textarea id="chat-input" placeholder="请输入问题"></textarea> -->
+                <button id="send-button" disabled>
+                    <span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" class="h-4 w-4 m-1 md:m-0"
+                            stroke-width="2">
+                            <path
+                                d="M.5 1.163A1 1 0 0 1 1.97.28l12.868 6.837a1 1 0 0 1 0 1.766L1.969 15.72A1 1 0 0 1 .5 14.836V10.33a1 1 0 0 1 .816-.983L8.5 8 1.316 6.653A1 1 0 0 1 .5 5.67V1.163Z"
+                                fill="currentColor"></path>
+                        </svg></span>
+                </button>
+            </div>
+    
+        </div>`;
+    document.body.insertAdjacentHTML('beforeend', html)
+
+
+    const assistantButton = document.getElementById('chat-assistant-button');
+    const chatContainer = document.getElementById('chat-container');
+    const closeButton = document.getElementById('close-button');
+    const chatInput = document.getElementById('chat-input');
+    const sendButton = document.getElementById('send-button');
+    const loadingIndicator = document.getElementById('loading-indicator');
+
+    assistantButton.addEventListener('click', function () {
+        chatContainer.style.display = 'block';
+    });
+
+    closeButton.addEventListener('click', function () {
+        chatContainer.style.display = 'none';
+    });
+
+    sendButton.addEventListener('click', function () {
+        const message = chatInput.value;
+        if (message.trim() !== '') {
+            // 处理发送消息的逻辑
+
+            chatInput.value = '';
+            resetButton(chatInput)
+
+            // 显示 Loading
+            loadingIndicator.classList.add('show-loading');
+            setTimeout(() => {
+                setFormuala(message);
+                // 隐藏 Loading
+                loadingIndicator.classList.remove('show-loading');
+            }, 1000);
+        }
+
+
+    });
+
+    chatInput.addEventListener('input', function () {
+        inputHandler(this)
+    });
+
+    function inputHandler(input) {
+        if (input.scrollHeight > 24) {
+            input.style.height = 'auto'
+        }
+        input.style.height = input.scrollHeight + 'px'; // 根据内容高度设置 textarea 高度
+        if (input.scrollHeight > 200) {
+            input.style.overflowY = 'scroll'
+        } else {
+            input.style.overflowY = 'hidden'
+        }
+
+        resetButton(input)
+
+    }
+
+    function resetButton(input) {
+        if (input.value.trim() !== '') {
+            sendButton.disabled = false;
+            sendButton.classList.add('enabled');
+        } else {
+            input.style.height = '24px'; // 重置高度为一行
+            sendButton.disabled = true;
+            sendButton.classList.remove('enabled');
+        }
+    }
+
+    // 快捷键
+    let isComposing = false;
+
+    chatInput.addEventListener('compositionstart', function () {
+        isComposing = true;
+    });
+
+    chatInput.addEventListener('compositionend', function () {
+        isComposing = false;
+    });
+
+    chatInput.addEventListener('keydown', function (event) {
+        const isWindows = navigator.platform.includes('Win');
+        const isMac = navigator.platform.includes('Mac');
+
+        const key = event.key;
+
+        if (isWindows && event.key === 'Enter' && !isComposing && !event.altKey) {
+            // Windows 上的 Enter 键触发发送
+            event.preventDefault();
+            sendButton.click();
+        } else if (isWindows && event.key === 'Enter' && !isComposing && event.altKey) {
+            // Windows 上的 Alt+Enter 键触发换行
+            event.preventDefault();
+            this.value += '\n';
+        } else if (isMac && event.key === 'Enter' && !isComposing && !event.metaKey) {
+            // Mac 上的 Enter 键触发发送
+            event.preventDefault();
+            sendButton.click();
+        } else if (isMac && event.key === 'Enter' && !isComposing && event.metaKey) {
+            // Mac 上的 Command+Enter 键触发换行
+            event.preventDefault();
+            this.value += '\n';
+        } else if (!isComposing && (key === "Backspace" || key === "Delete")) {
+
+        }
+
+        inputHandler(this)
+    });
+
+
+    // 添加拖拽功能
+    let isDragging = false;
+    let offset = { x: 0, y: 0 };
+
+    const chatHeader = document.getElementById('chat-header');
+
+    chatHeader.addEventListener('mousedown', function (event) {
+        isDragging = true;
+        offset.x = event.clientX - chatContainer.offsetLeft;
+        offset.y = event.clientY - chatContainer.offsetTop;
+    });
+
+    document.addEventListener('mousemove', function (event) {
+        if (isDragging) {
+            chatContainer.style.left = `${event.clientX - offset.x}px`;
+            chatContainer.style.top = `${event.clientY - offset.y}px`;
+        }
+    });
+
+    document.addEventListener('mouseup', function () {
+        isDragging = false;
+    });
+}
+
+const needChatHosts = [
+    'crm.lashuju.com',
+    'localhost:3000'
+]
+function isNeedChat() {
+    const host = location.host;
+    if (needChatHosts.includes(host)) {
+        return true
+    }
+
+    return false
+}
+
+
+function setFormuala(sentence = '') {
+
+    let link = getLink(sentence)
+
+    if (link !== '') {
+        setGET_AIRTABLE(link)
+    } else {
+        setASK_AI(sentence)
+    }
+
+}
+
+function setASK_AI(sentence = '') {
+
+    let range = getRange(sentence);
+
+    range = range === '' ? '' : ',' + range
+    const data = [
+        [
+            {
+                "f": "=ASK_AI(\"" + sentence + "\"" + range + ")"
+            }
+        ]
+    ]
+    luckysheet.setRangeValue(data)
+}
+
+function setGET_AIRTABLE(link) {
+    const data = [
+        [
+            {
+                "f": "=GET_AIRTABLE_DATA(\"" + link + "\")"
+            }
+        ]
+    ]
+    luckysheet.setRangeValue(data)
+}
+
+function getLink(sentence = '') {
+    const regex = /(https?:\/\/(?:www\.)?airtable\.com\/\S+)/gi;
+    const matches = sentence.match(regex);
+
+    if (matches) {
+        return matches[0];
+    }
+
+    return ''
+
+}
+
+function getRange(text) {
+    const regex = /([A-Z]+[0-9]*):([A-Z]+[0-9]*)/g;
+    const matche = text.match(regex);
+    if (matche) {
+        return matche[0]
+    }
+    return ''
+}

Some files were not shown because too many files changed in this diff