index.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <!-- -->
  2. <template>
  3. <div class="chart-show">
  4. <header class="chart-header" @click="openNew">
  5. <span
  6. class="chart-title"
  7. @click.stop
  8. @dblclick="copyText"
  9. :style="chartInfo.ChartThemeStyle?`
  10. text-align:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.align};
  11. font-size:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.style.fontSize}px;
  12. color:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.style.color}
  13. `:''"
  14. >
  15. {{ language === 'en'?(chartInfo.ChartNameEn||chartInfo.ChartName): chartInfo.ChartName}}
  16. </span>
  17. </header>
  18. <template v-if="haveData">
  19. <div
  20. class="chart-wrapper"
  21. id="chart-wrapper"
  22. v-loading="loading"
  23. element-loading-text="加载中..."
  24. >
  25. <chart
  26. :options="options"
  27. :chartId="chartInfo.ChartInfoId || 0" :chartInfo="chartInfo"
  28. />
  29. <div class="mark"></div>
  30. </div>
  31. </template>
  32. <div class="chart-wrapper notfound" v-else>
  33. <i class="el-icon-warning"></i>哎吆,你的图飞了,赶快去找管理员救命吧~
  34. </div>
  35. <!-- 图表来源说明 -->
  36. <div
  37. class="chart-bottom-info bootom-source"
  38. v-if="chartInfo.Instructions&&JSON.parse(chartInfo.Instructions).isShow
  39. ">
  40. <!-- 图表说明 -->
  41. <div
  42. class="chart-instruction text_oneLine"
  43. v-text="JSON.parse(chartInfo.Instructions).text"
  44. :style="`
  45. color: ${JSON.parse(chartInfo.Instructions).color};
  46. font-size: ${ JSON.parse(chartInfo.Instructions).fontSize }px
  47. `"
  48. ></div>
  49. </div>
  50. <div class="bootom-source">
  51. <!-- 自定义来源 -->
  52. <div>
  53. <div class="chart-source text_oneLine"
  54. v-if="chartInfo.SourcesFrom&&JSON.parse(chartInfo.SourcesFrom).isShow"
  55. :style="`
  56. color: ${ JSON.parse(chartInfo.SourcesFrom).color };
  57. font-size: ${ JSON.parse(chartInfo.SourcesFrom).fontSize }px;
  58. `"
  59. >
  60. source:<em>{{ JSON.parse(chartInfo.SourcesFrom).text}}</em>
  61. </div>
  62. </div>
  63. <ul class="right-action" @click.stop>
  64. <li v-if="$route.query.source==='ybxcx'"><collectBtn/></li>
  65. <!-- eta小程序报告详情中的有收藏 -->
  66. <li v-if="$route.query.source==='etamini'" @click="handleChangeChartCollect">{{IsCollect?'取消收藏':'收藏'}}</li>
  67. <li @click="copyUrl" class="copy" v-if="isShare"><i class="el-icon-share"/>分享</li>
  68. <li @click="refreshChart" v-if="chartInfo.UniqueCode&&$route.query.source!=='smartReportGetImg'"><i class="el-icon-refresh"/>刷新</li>
  69. </ul>
  70. </div>
  71. </div>
  72. </template>
  73. <script lang="ts">
  74. import { defineComponent, reactive, toRefs, onMounted, ref, nextTick } from 'vue';
  75. import { ElMessage } from 'element-plus';
  76. import _ from 'lodash';
  77. import { useRoute } from 'vue-router';
  78. import chart from '@/components/chart.vue';
  79. import { IState } from './typing';
  80. import { ChartApi } from '@/request/api';
  81. import collectBtn from './components/collectBtn.vue'
  82. import { useChartRender } from '@/hooks/chart/useChartRender';
  83. export default defineComponent({
  84. components: {
  85. chart,
  86. collectBtn
  87. },
  88. setup() {
  89. const route = useRoute();
  90. const state = reactive<IState>({
  91. options: {},
  92. chartInfo: {},
  93. dataList: [],
  94. sourceName: ''
  95. });
  96. onMounted(() => {
  97. getChartInfo();
  98. });
  99. // 打开新窗口
  100. const openNew = (): void => {
  101. window.open(window.location.href,'_blank');
  102. }
  103. /* 获取图表数据信息 */
  104. const loading = ref(false);
  105. const haveData = ref(false);
  106. const code = ref(route.query.code);
  107. const isShare = ref(route.query.fromType === 'share');
  108. // 语言 中英文 ch en 默认中文
  109. const language = ref(route.query.fromPage || route.query.lang || 'zh');
  110. const IsCollect=ref(false)//图表是否收藏
  111. const getChartInfo = async (type='') => {
  112. if(!code.value) {
  113. haveData.value = false;
  114. return
  115. }
  116. loading.value = true;
  117. try {
  118. let params={
  119. UniqueCode: code.value || '',
  120. }
  121. // 如果是来自etamini 也就是eta小程序的报告详情
  122. if(route.query.source==='etamini'){
  123. params.Source=1
  124. params.Token=route.query.token
  125. }
  126. const { Data } = await ChartApi.getChart(params);
  127. loading.value = false;
  128. state.chartInfo = Data.ChartInfo;
  129. IsCollect.value=Data.IsCollect
  130. state.dataList = Data.ChartInfo.Source === 1 ? Data.EdbInfoList : [Data.EdbInfoList[0]];
  131. //处理英文研报英文设置不全就展示中文
  132. // setLangFromEnReport();
  133. document.title = language.value==='zh'?Data.ChartInfo.ChartName:Data.ChartInfo.ChartNameEn;
  134. state.options = useChartRender(Data,language.value)
  135. haveData.value = true;
  136. type === 'refresh' && ElMessage.success('刷新成功');
  137. //水印配置
  138. nextTick(()=>{
  139. const markDom = document.querySelector('.mark')
  140. Data.WaterMark&&(markDom.style.backgroundImage = `url(${Data.WaterMark})`)
  141. })
  142. }catch (e) {
  143. loading.value = false;
  144. haveData.value = false;
  145. }
  146. };
  147. /* 复制标题 */
  148. const copyText = () => {
  149. const { chartInfo } = state;
  150. let input = document.createElement("input");
  151. input.value = chartInfo.ChartName;
  152. document.body.appendChild(input)
  153. input.select();
  154. document.execCommand('copy');
  155. document.body.removeChild(input);
  156. ElMessage.success('复制标题成功')
  157. }
  158. /* 分享链接 */
  159. const copyUrl = () => {
  160. let input = document.createElement("input");
  161. input.value = location.href;
  162. document.body.appendChild(input)
  163. input.select();
  164. document.execCommand('copy');
  165. document.body.removeChild(input);
  166. ElMessage.success('复制链接成功')
  167. }
  168. const refreshChart = _.debounce(async () => {
  169. loading.value = true;
  170. let res: any=null
  171. if([1,6,7,8,9,10,11].includes(state.chartInfo.Source)){
  172. res=await ChartApi.refreshChart({UniqueCode: state.chartInfo.UniqueCode})
  173. }else if([2,5].includes(state.chartInfo.Source)){
  174. res=await ChartApi.refreshCommordityChart({UniqueCode: state.chartInfo.UniqueCode});
  175. }else if([3,4].includes(state.chartInfo.Source)){
  176. res=await ChartApi.refreshRelevanceChart({UniqueCode: state.chartInfo.UniqueCode});
  177. }
  178. loading.value = false;
  179. res.Ret === 200 && getChartInfo('refresh');
  180. },400)
  181. // 点击收藏\取消收藏
  182. const handleChangeChartCollect=async ()=>{
  183. const params={
  184. UniqueCode:code.value || '',
  185. Token:route.query.token,
  186. }
  187. const res=IsCollect.value?await ChartApi.chartCollectCancel(params):await ChartApi.chartCollect(params)
  188. if(res.Ret===200){
  189. ElMessage.success(IsCollect.value?'取消收藏成功':'收藏成功')
  190. IsCollect.value=!IsCollect.value
  191. }
  192. }
  193. return {
  194. ...toRefs(state),
  195. loading,
  196. haveData,
  197. getChartInfo,
  198. openNew,
  199. copyUrl,
  200. isShare,
  201. language,
  202. refreshChart,
  203. copyText,
  204. handleChangeChartCollect,
  205. IsCollect
  206. };
  207. },
  208. });
  209. </script>
  210. <style scoped lang="less">
  211. @import './index.less';
  212. </style>