scientificResearchProject.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. <!--科研项目情况概览-->
  2. <template>
  3. <div class="scientificResearchProject">
  4. <titleComponent :titleData="titleData"></titleComponent>
  5. <div class="scientificResearchProject-page">
  6. <div class="left-max-big-box" id="scientificResearchProject-eCharts-1"></div>
  7. <div class="right-max-big-box">
  8. <div class="right-top-big-box" id="scientificResearchProject-eCharts-2"></div>
  9. <div class="right-bottom-big-box" id="scientificResearchProject-eCharts-3"></div>
  10. </div>
  11. <p class="position-top-right-p">{{pieNum}}</p>
  12. <img class="position-img" src="@/assets/ZDimages/705@1x.png">
  13. </div>
  14. </div>
  15. </template>
  16. <script>
  17. import { dashboardsResearchProjects } from '@/api/yiLi'
  18. import titleComponent from './components/titleComponent.vue'
  19. export default {
  20. name: 'scientificResearchProject',
  21. components: {
  22. titleComponent
  23. },
  24. data() {
  25. return {
  26. titleData: {
  27. name: '科研项目情况概览',
  28. // text: 'Overview of scientific research projects'
  29. text: ''
  30. },
  31. eChartsData1: null,
  32. eChartsData2: null,
  33. eChartsData3: null,
  34. //柱状图数据
  35. barMaxList:[],
  36. barList:[],
  37. //饼图数据
  38. pieData: [],
  39. pieNum: '0',
  40. //雷达图数据--雷达图默认逆时针排序 所以数据需要倒序
  41. radarNameList: [],
  42. radarDataList: [],
  43. //图标轮播
  44. eChartsTimerData: null,
  45. eChartsCarouselTime: 20000,
  46. eChartsCarouselIndex: 0,
  47. //定时拉取数据
  48. getDataTimer: null,
  49. getDataSwitchTime: 360000
  50. }
  51. },
  52. created() {
  53. },
  54. mounted() {
  55. this.getDataTimerFunction()
  56. this.eChartsMethod1()
  57. },
  58. methods: {
  59. getDataTimerFunction() {
  60. this.dashboardsResearchProjects()
  61. this.getDataTimer = window.setInterval(() => {
  62. this.dashboardsResearchProjects()
  63. }, this.getDataSwitchTime)
  64. },
  65. //科研项目情况概览
  66. dashboardsResearchProjects() {
  67. clearInterval(this.eChartsTimerData)
  68. dashboardsResearchProjects().then(res => {
  69. this.$set(this,'eChartsCarouselIndex',0);
  70. const getFirstSix = (str) => str.slice(0, 6);
  71. //柱状图
  72. let maxList = []
  73. let list = []
  74. for (let i = 0; i < res.data.collages.length; i++) {
  75. if (list[7]) {
  76. maxList.push(JSON.parse(JSON.stringify(list)))
  77. list = []
  78. list.push({
  79. // name: res.data.collages[i].type,
  80. name: getFirstSix(res.data.collages[i].type),
  81. value: res.data.collages[i].count
  82. })
  83. } else {
  84. list.push({
  85. // name: res.data.collages[i].type,
  86. name: getFirstSix(res.data.collages[i].type),
  87. value: res.data.collages[i].count
  88. })
  89. }
  90. }
  91. if (!maxList[0]) {
  92. maxList.push(JSON.parse(JSON.stringify(list)))
  93. } else {
  94. if (maxList[maxList.length - 1].name != list[list.length - 1].name) {
  95. maxList.push(JSON.parse(JSON.stringify(list)))
  96. }
  97. }
  98. this.$set(this, 'barMaxList', maxList)
  99. this.$set(this, 'barList', maxList[0])
  100. //雷达图/饼图
  101. this.$set(this, 'pieNum', res.data.totalProjects)
  102. let max = 0
  103. for (let i = 0; i < res.data.projectLevels.length; i++) {
  104. if (res.data.projectLevels[i].count > max) {
  105. max = res.data.projectLevels[i].count
  106. }
  107. }
  108. max = this.precisionAdd(max, this.preciseDivide(max, 6))
  109. //雷达图数据
  110. let radarNameList = []
  111. let radarDataList = []
  112. //饼图数据
  113. let pieData = []
  114. for (let i = 0; i < res.data.projectLevels.length; i++) {
  115. radarNameList.unshift({
  116. max: max,
  117. name: res.data.projectLevels[i].type
  118. })
  119. radarDataList.unshift(res.data.projectLevels[i].count)
  120. pieData.push({
  121. value: res.data.projectLevels[i].count,
  122. name: res.data.projectLevels[i].type
  123. })
  124. }
  125. this.$set(this, 'radarNameList', radarNameList)
  126. this.$set(this, 'radarDataList', radarDataList)
  127. this.$set(this, 'pieData', pieData)
  128. if(maxList[0]){
  129. this.eChartsMethod1()
  130. }
  131. if(pieData[0]){
  132. this.eChartsMethod2()
  133. this.eChartsMethod3()
  134. }
  135. })
  136. },
  137. eChartsMethod1() {
  138. let self = this;
  139. clearInterval(this.eChartsTimerData)
  140. let borderValueList = [
  141. { value: 100 },
  142. { value: 100 },
  143. { value: 100 },
  144. { value: 100 },
  145. { value: 100 },
  146. { value: 100 },
  147. { value: 100 },
  148. { value: 100 }
  149. ]
  150. let numValueList = []
  151. let nameValueList = []
  152. for (let i=0;i<self.barList.length;i++) {
  153. nameValueList.push(self.barList[i].name)
  154. numValueList.push(self.barList[i].value)
  155. }
  156. let { borderData, total, numData, nameData } = {
  157. borderData: borderValueList,
  158. total: 100,
  159. numData: numValueList,
  160. nameData: nameValueList
  161. }
  162. let totalList = []
  163. numData.forEach((item) => {
  164. totalList.push(total)
  165. })
  166. let option = {
  167. xAxis: {
  168. max: total,
  169. splitLine: {
  170. show: false
  171. },
  172. axisLine: {
  173. show: false
  174. },
  175. axisLabel: {
  176. show: false
  177. },
  178. axisTick: {
  179. show: false
  180. }
  181. },
  182. grid: {
  183. borderWidth: 0,
  184. top: '3%',
  185. left: '125',
  186. right: '35',
  187. bottom: '3%'
  188. },
  189. yAxis: [
  190. {
  191. type: 'category',
  192. inverse: true,
  193. data: nameData,
  194. axisLine: {
  195. show: false
  196. },
  197. axisTick: {
  198. show: false
  199. },
  200. axisLabel: {
  201. show: true,
  202. textStyle: {
  203. color: '#fff',
  204. fontSize: 16
  205. }
  206. }
  207. }
  208. ],
  209. series: [
  210. {
  211. // 内
  212. type: 'bar',
  213. barWidth: 10,
  214. legendHoverLink: false,
  215. silent: true,
  216. itemStyle: {
  217. normal: {
  218. barBorderRadius: 15,
  219. color: {//渐变色
  220. x: 1,
  221. y: 0,
  222. x2: 0,
  223. y2: 0,
  224. type: 'linear',
  225. global: false,
  226. colorStops: [
  227. {
  228. offset: 0,
  229. color: '#00F7FF'
  230. },
  231. {
  232. offset: 1,
  233. color: '#0591F3'
  234. }
  235. ]
  236. }
  237. }
  238. },
  239. label: {
  240. show: true,
  241. // position: 'insideBottomLeft',
  242. position: 'insideRight',
  243. // distance: 20,
  244. offset: [40, 2],
  245. fontSize: 14,
  246. color: '#fff',
  247. formatter: function(params) {
  248. let str = params.value
  249. return str
  250. }
  251. },
  252. data: numData,
  253. z: 1,
  254. animationEasing: 'elasticOut'
  255. },
  256. {
  257. name: '外框',
  258. type: 'bar',
  259. barGap: '-130%', // 设置外框粗细
  260. data: borderData,
  261. barWidth: 16,
  262. label: {
  263. show: false
  264. },
  265. itemStyle: {
  266. normal: {
  267. color: {//渐变色
  268. x: 1,
  269. y: 0,
  270. x2: 0,
  271. y2: 0,
  272. type: 'linear',
  273. global: false,
  274. colorStops: [
  275. {
  276. offset: 0,
  277. color: 'rgba(167,167,167,0.1)'
  278. },
  279. {
  280. offset: 1,
  281. color: 'rgba(167,167,167,0.1)'
  282. }
  283. ]
  284. },
  285. barBorderRadius: 15,
  286. label: {
  287. // 标签显示位置
  288. show: false
  289. }
  290. }
  291. },
  292. z: 0
  293. },
  294. {
  295. name: '圆点',
  296. type: 'scatter',
  297. data: numData,
  298. label: 'none',
  299. symbolSize: 50,
  300. // symbolSize: 75,
  301. symbolOffset: [0, -1.5, 0, 0],
  302. // symbol: 'image://data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMzhweCIgaGVpZ2h0PSIzOHB4IiB2aWV3Qm94PSIwIDAgMzggMzgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+57yW57uEIDUxPC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOC4wNDYxOTciIGhlaWdodD0iMTgiIHJ4PSI5Ij48L3JlY3Q+CiAgICAgICAgPGZpbHRlciB4PSItNTIuNiUiIHk9Ii01Mi44JSIgd2lkdGg9IjIwNS4zJSIgaGVpZ2h0PSIyMDUuNiUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaWQ9ImZpbHRlci0yIj4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMSIgaW49IlNvdXJjZUdyYXBoaWMiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciB4PSItNzIuMCUiIHk9Ii03Mi4yJSIgd2lkdGg9IjI0NC4xJSIgaGVpZ2h0PSIyNDQuNCUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaWQ9ImZpbHRlci0zIj4KICAgICAgICAgICAgPGZlTW9ycGhvbG9neSByYWRpdXM9IjAuNSIgb3BlcmF0b3I9ImRpbGF0ZSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd1NwcmVhZE91dGVyMSI+PC9mZU1vcnBob2xvZ3k+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjAiIGluPSJzaGFkb3dTcHJlYWRPdXRlcjEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMS41IiBvcGVyYXRvcj0iZXJvZGUiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dJbm5lciI+PC9mZU1vcnBob2xvZ3k+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjAiIGluPSJzaGFkb3dJbm5lciIgcmVzdWx0PSJzaGFkb3dJbm5lciI+PC9mZU9mZnNldD4KICAgICAgICAgICAgPGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiIGluMj0ic2hhZG93SW5uZXIiIG9wZXJhdG9yPSJvdXQiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIj48L2ZlQ29tcG9zaXRlPgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzIiBpbj0ic2hhZG93T2Zmc2V0T3V0ZXIxIiByZXN1bHQ9InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHZhbHVlcz0iMCAwIDAgMCAwLjA4NjI3NDUwOTggICAwIDAgMCAwIDAuNTMzMzMzMzMzICAgMCAwIDAgMCAwLjkxNzY0NzA1OSAgMCAwIDAgMC4zIDAiIHR5cGU9Im1hdHJpeCIgaW49InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgICA8cmVjdCBpZD0icGF0aC00IiB4PSI2LjAxNTM5ODk5IiB5PSI2IiB3aWR0aD0iNi4wMTUzOTg5OSIgaGVpZ2h0PSI2IiByeD0iMyI+PC9yZWN0PgogICAgICAgIDxmaWx0ZXIgeD0iLTE2Ni4yJSIgeT0iLTE2Ni43JSIgd2lkdGg9IjQzMi41JSIgaGVpZ2h0PSI0MzMuMyUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaWQ9ImZpbHRlci01Ij4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMSIgaW49IlNvdXJjZUdyYXBoaWMiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciB4PSItMjI0LjQlIiB5PSItMjI1LjAlIiB3aWR0aD0iNTQ4LjglIiBoZWlnaHQ9IjU1MC4wJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTYiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMC41IiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93U3ByZWFkT3V0ZXIxIj48L2ZlTW9ycGhvbG9neT4KICAgICAgICAgICAgPGZlT2Zmc2V0IGR4PSIwIiBkeT0iMCIgaW49InNoYWRvd1NwcmVhZE91dGVyMSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMiIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUdhdXNzaWFuQmx1cj4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAuMDg2Mjc0NTA5OCAgIDAgMCAwIDAgMC41MzMzMzMzMzMgICAwIDAgMCAwIDAuOTE3NjQ3MDU5ICAwIDAgMCAxIDAiIHR5cGU9Im1hdHJpeCIgaW49InNoYWRvd0JsdXJPdXRlcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4T3V0ZXIxIj48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgICAgIDxmZU1vcnBob2xvZ3kgcmFkaXVzPSIwLjUiIG9wZXJhdG9yPSJkaWxhdGUiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dTcHJlYWRPdXRlcjIiPjwvZmVNb3JwaG9sb2d5PgogICAgICAgICAgICA8ZmVPZmZzZXQgZHg9IjAiIGR5PSIwIiBpbj0ic2hhZG93U3ByZWFkT3V0ZXIyIiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMiI+PC9mZU9mZnNldD4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMyIgaW49InNoYWRvd09mZnNldE91dGVyMiIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIyIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9IjAgMCAwIDAgMC4wODYyNzQ1MDk4ICAgMCAwIDAgMCAwLjUzMzMzMzMzMyAgIDAgMCAwIDAgMC45MTc2NDcwNTkgIDAgMCAwIDAuMyAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dCbHVyT3V0ZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeE91dGVyMiI+PC9mZUNvbG9yTWF0cml4PgogICAgICAgICAgICA8ZmVNZXJnZT4KICAgICAgICAgICAgICAgIDxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4T3V0ZXIxIj48L2ZlTWVyZ2VOb2RlPgogICAgICAgICAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhPdXRlcjIiPjwvZmVNZXJnZU5vZGU+CiAgICAgICAgICAgIDwvZmVNZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSLnlKjmiLfkuK3lv4MiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLlrr3lsY8t6aaW6aG1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjU5NC4wMDAwMDAsIC0yMjkuMDAwMDAwKSI+CiAgICAgICAgICAgIDxnIGlkPSLnvJbnu4QtNDkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NDUuMTcwMDAwLCAxNzUuNjc3NzE0KSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0i57yW57uELTUxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1OC44MzAwMDAsIDYzLjMyMjI4NikiPgogICAgICAgICAgICAgICAgICAgIDxnIGlkPSLnn6nlvaIiIG9wYWNpdHk9IjAuNyIgZmlsdGVyPSJ1cmwoI2ZpbHRlci0yKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMSIgZmlsdGVyPSJ1cmwoI2ZpbHRlci0zKSIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHN0cm9rZT0iIzZGOUFCRiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWpvaW49InNxdWFyZSIgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSIxNy4wNDYxOTciIGhlaWdodD0iMTciIHJ4PSI4LjUiPjwvcmVjdD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgPGcgaWQ9IuefqeW9oiIgZmlsdGVyPSJ1cmwoI2ZpbHRlci01KSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMSIgZmlsdGVyPSJ1cmwoI2ZpbHRlci02KSIgeGxpbms6aHJlZj0iI3BhdGgtNCI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iIzk1RTJGMCIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC00Ij48L3VzZT4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==',
  303. symbol: 'image://data:image/png;base64,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',
  304. itemStyle: {
  305. borderColor: 'rgba(230, 240, 255, 0.2)',
  306. borderWidth: 12,
  307. color: '#70FFFF',
  308. opacity: 1
  309. },
  310. z: 2
  311. }
  312. ]
  313. }
  314. this.eChartsData1 = this.$echarts.init(document.getElementById('scientificResearchProject-eCharts-1'))
  315. this.eChartsData1.clear()
  316. this.eChartsData1.setOption(option)
  317. this.eChartsTimer()
  318. },
  319. eChartsTimer() {
  320. let self = this
  321. self.eChartsTimerData = window.setInterval(() => {
  322. eChartsCarousel()
  323. }, this.eChartsCarouselTime)
  324. function eChartsCarousel() {
  325. if (self.eChartsCarouselIndex < self.barMaxList.length-1) {
  326. self.eChartsCarouselIndex++
  327. }else{
  328. self.$set(self, 'eChartsCarouselIndex', 0)
  329. }
  330. if(self.barList[0]){
  331. self.$set(self,'barList',self.barMaxList[self.eChartsCarouselIndex]);
  332. self.eChartsMethod1();
  333. self.eChartsMethod2();
  334. self.eChartsMethod3();
  335. }
  336. }
  337. },
  338. eChartsMethod2() {
  339. const colorList = ['#00B312', '#FFE019', '#FF9718', '#109BFF', '#00FFFF', '#9956FF', '#FF5D5D']
  340. let option = {
  341. tooltip: {
  342. trigger: 'item',
  343. backgroundColor: 'rgba(9,40,84,0.8)',
  344. borderColor: 'rgba(9,40,84,0.8)',
  345. textStyle: {
  346. fontSize: 20,
  347. color: '#fff'
  348. },
  349. formatter: function(params) {
  350. return ('<span style="margin-right: 5px; border-radius: 50%; display: inline-block; width:14px; height: 14px; vertical-align: middle; background:linear-gradient( ' + params.color.colorStops[0].color + ', ' + params.color.colorStops[1].color + ');"></span>' + params.name + '&nbsp;&nbsp;<span style=\'font-weight:bold\'>' + params.value + '</span>')
  351. }
  352. },
  353. polar: {},
  354. angleAxis: {
  355. interval: 1,
  356. type: 'category',
  357. data: [],
  358. z: 10,
  359. axisLine: {
  360. show: false,
  361. lineStyle: {
  362. color: '#0B4A6B',
  363. width: 1,
  364. type: 'solid'
  365. }
  366. },
  367. axisLabel: {
  368. show: false,
  369. interval: 0,
  370. color: '#0B4A6B',
  371. margin: 8,
  372. fontSize: 20
  373. }
  374. },
  375. radiusAxis: {
  376. axisLine: {
  377. show: false
  378. },
  379. axisTick: {
  380. show: false
  381. },
  382. axisLabel: {
  383. formatter: '{value} %',
  384. show: false,
  385. padding: [0, 0, 20, 0],
  386. color: '#0B3E5E',
  387. fontSize: 20
  388. }
  389. },
  390. calculable: true,
  391. series: [{
  392. type: 'pie',
  393. center: ['50%', '53%'],
  394. radius: ['55%', '70%'],
  395. zlevel: 10,
  396. label: {
  397. show: true,
  398. formatter: function(param) {
  399. if (param.dataIndex == 0) {
  400. return ('{a|' + param.name + '}' + '{b|' + ' ' + param.value + '}\n\n')
  401. } else if (param.dataIndex == 1) {
  402. return ('{a|' + param.name + '}' + '{c|' + ' ' + param.value + '}\n\n')
  403. } else if (param.dataIndex == 2) {
  404. return ('{a|' + param.name + '}' + '{d|' + ' ' + param.value + '}\n\n')
  405. } else if (param.dataIndex == 3) {
  406. return ('{a|' + param.name + '}' + '{e|' + ' ' + param.value + '}\n\n')
  407. } else if (param.dataIndex == 4) {
  408. return ('{a|' + param.name + '}' + '{f|' + ' ' + param.value + '}\n\n')
  409. } else if (param.dataIndex == 5) {
  410. return ('{a|' + param.name + '}' + '{g|' + ' ' + param.value + '}\n\n')
  411. } else if (param.dataIndex == 6) {
  412. return ('{a|' + param.name + '}' + '{h|' + ' ' + param.value + '}\n\n')
  413. }
  414. },
  415. padding: [0, -40],
  416. height: 50,
  417. rich: {
  418. a: {
  419. color: '#fff',
  420. fontSize: '16'
  421. },
  422. b: {
  423. color: '#00B312',
  424. fontSize: '18'
  425. },
  426. c: {
  427. color: '#FFE019',
  428. fontSize: '18'
  429. },
  430. d: {
  431. color: '#FF9718',
  432. fontSize: '18'
  433. },
  434. e: {
  435. color: '#109BFF',
  436. fontSize: '18'
  437. },
  438. f: {
  439. color: '#00FFFF',
  440. fontSize: '18'
  441. },
  442. g: {
  443. color: '#9956FF',
  444. fontSize: '18'
  445. },
  446. h: {
  447. color: '#FF5D5D',
  448. fontSize: '18'
  449. }
  450. },
  451. position: 'outside'
  452. },
  453. emphasis: {
  454. label: {
  455. show: true
  456. },
  457. labelLine: {
  458. show: true
  459. }
  460. },
  461. itemStyle: {
  462. normal: {
  463. borderColor: '#01132a',
  464. boderRadius: 10,
  465. borderWidth: 5,
  466. color: function(params) {
  467. return colorList[params.dataIndex]
  468. }
  469. }
  470. },
  471. labelLine: {
  472. show: true,
  473. length: 14,
  474. length2: 70,
  475. lineStyle: {
  476. type: 'dashed',
  477. width: 2
  478. }
  479. },
  480. data: this.pieData
  481. }, {
  482. // 外层刻度
  483. name: '',
  484. type: 'gauge',
  485. // splitNumber: 360, // 刻度数量
  486. radius: '50%', // 图表尺寸
  487. center: ['50%', '53%'],
  488. startAngle: 0,
  489. endAngle: 360,
  490. axisLine: {
  491. show: false,
  492. lineStyle: {
  493. width: 0,
  494. shadowBlur: 0,
  495. color: [
  496. [1, '#84CDFF']
  497. ]
  498. }
  499. },
  500. axisTick: {
  501. show: true,
  502. lineStyle: {
  503. color: {
  504. type: 'linear',
  505. x: 0,
  506. y: 0,
  507. x2: 0,
  508. y2: 1,
  509. colorStops: [{
  510. offset: 0,
  511. color: '#84CDFF' // 0% 处的颜色
  512. }, {
  513. offset: 1,
  514. color: '#84CDFF' // 100% 处的颜色
  515. }],
  516. global: false // 缺省为 false
  517. },
  518. width: 2 //宽度
  519. },
  520. length: 10, //长度
  521. splitNumber: 8 //密度
  522. },
  523. splitLine: {
  524. show: true,
  525. length: 2,
  526. lineStyle: {
  527. color: 'auto'
  528. }
  529. },
  530. axisLabel: {
  531. show: false
  532. }
  533. }]
  534. }
  535. this.eChartsData2 = this.$echarts.init(document.getElementById('scientificResearchProject-eCharts-2'))
  536. this.eChartsData2.clear()
  537. this.eChartsData2.setOption(option)
  538. },
  539. eChartsMethod3() {
  540. let option = {
  541. tooltip: {
  542. show: false // 弹层数据去掉
  543. },
  544. legend: {
  545. show: false
  546. },
  547. radar: {
  548. center: ['50%', '45%'], // 外圆的位置
  549. radius: '70%',
  550. // startAngle:0,
  551. startAngle: 90 + (365 / this.radarNameList.length),
  552. splitNumber: 5,//网格数量
  553. name: {
  554. textStyle: {
  555. color: '#fff',
  556. fontSize: 16,
  557. fontWeight: 400,
  558. fontFamily: 'PingFangSC-Regular,PingFang SC',
  559. fontStyle: 'normal'
  560. }
  561. },
  562. indicator: this.radarNameList,
  563. splitArea: {
  564. areaStyle: {
  565. //雷达间隔背景色
  566. color: ['#012149', '#012a5e']
  567. }
  568. },
  569. axisLine: {
  570. // 指向外圈文本的分隔线样式
  571. lineStyle: {
  572. color: 'rgba(255,255,255,0)'
  573. }
  574. },
  575. splitLine: {
  576. lineStyle: {
  577. type: 'solid',
  578. color: '#04386a', // 分隔线颜色
  579. width: 2 // 分隔线线宽
  580. }
  581. }
  582. },
  583. series: {
  584. type: 'radar',
  585. data: [{
  586. value: this.radarDataList,
  587. name: '',
  588. areaStyle: {
  589. normal: {
  590. color: {
  591. type: 'radial',
  592. x: 0.5,
  593. y: 0.5,
  594. r: 0.5,
  595. colorStops: [{
  596. offset: 0,
  597. color: 'rgba(0,194,255, 0.14)' // 0% 处的颜色
  598. }, {
  599. offset: 0.15,
  600. color: 'rgba(0,194,255, 0.14)' // 100% 处的颜色
  601. }, {
  602. offset: 0.75,
  603. color: 'rgba(0,194,255, 0.4)' // 100% 处的颜色
  604. }, {
  605. offset: 1,
  606. color: 'rgba(0,194,255, 0.8)' // 100% 处的颜色
  607. }],
  608. global: false // 缺省为 false
  609. }
  610. }
  611. },
  612. symbolSize: [6, 6],
  613. lineStyle: { //边缘颜色
  614. color: 'rgba(0, 194, 255, 0.8)'
  615. },
  616. //雷达线颜色
  617. itemStyle: {
  618. color: '#00FFFF',
  619. borderColor: '#00FFFF',
  620. borderWidth: 1,
  621. shadowBlur: 8,
  622. shadowColor: '#00FFFF'
  623. }
  624. }]
  625. }
  626. }
  627. this.eChartsData3 = this.$echarts.init(document.getElementById('scientificResearchProject-eCharts-3'))
  628. this.eChartsData3.clear()
  629. this.eChartsData3.setOption(option)
  630. },
  631. // 处理浮点数精度的加法
  632. precisionAdd(num1, num2) {
  633. const multiplier = Math.pow(10, Math.max(this.getDecimalPlaces(num1), this.getDecimalPlaces(num2)))
  634. return (Math.round(num1 * multiplier) + Math.round(num2 * multiplier)) / multiplier
  635. },
  636. // 获取数字的小数位数
  637. getDecimalPlaces(num) {
  638. const str = num.toString()
  639. const decimalIndex = str.indexOf('.')
  640. return decimalIndex === -1 ? 0 : str.length - decimalIndex - 1
  641. },
  642. preciseDivide(dividend, divisor) {
  643. const dividendStr = dividend.toString()
  644. const divisorStr = divisor.toString()
  645. const dividendDecimals = dividendStr.includes('.') ? dividendStr.split('.')[1].length : 0
  646. const divisorDecimals = divisorStr.includes('.') ? divisorStr.split('.')[1].length : 0
  647. const maxDecimals = Math.max(dividendDecimals, divisorDecimals)
  648. const adjustedDividend = parseInt(dividendStr.replace('.', ''), 10) * Math.pow(10, maxDecimals - dividendDecimals)
  649. const adjustedDivisor = parseInt(divisorStr.replace('.', ''), 10) * Math.pow(10, maxDecimals - divisorDecimals)
  650. const result = adjustedDividend / adjustedDivisor
  651. return result / Math.pow(10, maxDecimals * 2)
  652. }
  653. },
  654. destroyed() {
  655. //清除定时器
  656. clearInterval(this.getDataTimer)
  657. clearInterval(this.eChartsTimerData)
  658. }
  659. }
  660. </script>
  661. <style scoped lang="scss">
  662. .scientificResearchProject {
  663. /*width: 826px;*/
  664. /*height: 707px;*/
  665. /*分辨率调整*/
  666. width: 1082px;
  667. height: 957px;
  668. overflow: hidden;
  669. background-image: url("../../assets/ZDimages/img_kyxm_bg@1x.png");
  670. background-size: 100% 100%;
  671. .scientificResearchProject-page {
  672. /*width: 826px;*/
  673. /*height: 647px;*/
  674. /*分辨率调整*/
  675. width: 1082px;
  676. height: 897px;
  677. overflow: hidden;
  678. display: flex;
  679. position: relative;
  680. .left-max-big-box {
  681. width: 451px;
  682. height: 647px;
  683. /*分辨率调整*/
  684. margin-top:130px;
  685. margin-left:20px;
  686. }
  687. .right-max-big-box {
  688. width: 475px;
  689. /*height: 647px;*/
  690. .right-top-big-box {
  691. width: 475px;
  692. height: 320px;
  693. /*分辨率调整*/
  694. margin:100px 0 0 60px;
  695. }
  696. .right-bottom-big-box {
  697. width: 475px;
  698. height: 327px;
  699. /*分辨率调整*/
  700. margin:80px 0 0 60px;
  701. }
  702. }
  703. .position-top-right-p {
  704. z-index: 2;
  705. width: 100px;
  706. position: absolute;
  707. /*top: 145px;*/
  708. /*right: 187px;*/
  709. /*分辨率调整*/
  710. top: 245px;
  711. right: 264px;
  712. height: 50px;
  713. line-height: 50px;
  714. text-align: center;
  715. font-size: 40px;
  716. font-weight: bold;
  717. background: -webkit-linear-gradient(#FFFFFF, #0095FF);
  718. -webkit-background-clip: text;
  719. color: transparent;
  720. font-family: Alimama ShuHeiTi, Alimama ShuHeiTi;
  721. }
  722. .position-img {
  723. z-index: 1;
  724. position: absolute;
  725. /*top: 111px;*/
  726. /*right: 178px;*/
  727. /*分辨率调整*/
  728. top: 210px;
  729. right: 256px;
  730. }
  731. }
  732. }
  733. </style>