zytj.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <script setup>
  2. import { ref } from "vue";
  3. import typeUrl from '~/assets/type.png';
  4. import request from '~/utils/request';
  5. import * as echarts from 'echarts';
  6. const loading = ref(true)
  7. const tableKey = 'xqzt_id'
  8. const queryFormData = ref({})
  9. const tableData = ref()
  10. const cardData = ref([])
  11. // const xAxisType = ['语文', '英语', '数学', '音乐', '体育', '美术', '物理', '化学', '历史', '政治', '生物', '地理']
  12. function queryApi() {
  13. loading.value = true
  14. return request({
  15. url: '/xdjy/qjygl_zytj_stat/content_json',
  16. data: {
  17. // ...queryFormData.value,
  18. // limit: limit.value,
  19. // page: currentPage.value
  20. }
  21. }).then(response => {
  22. const { data } = response
  23. const str = JSON.stringify(data.content_json)
  24. if(str==='{}'){
  25. throw new Error('暂无数据')
  26. }
  27. tableData.value = data.content_json
  28. cardData.value = data.content_json.card ?? []
  29. return response
  30. }).then(() => {
  31. loading.value = false
  32. }).then(() => {
  33. const size = boxRef.value.getBoundingClientRect()
  34. const chartData = tableData.value?.chart
  35. const xAxisType = chartData?.xk
  36. const chart1 = echarts.init(canvasRef1.value, 'default', { width: size.width * 0.6, height: size.height / 2 })
  37. const chart2 = echarts.init(canvasRef2.value, 'default', { width: size.width * 0.4, height: size.height / 2 })
  38. const chart3 = echarts.init(canvasRef3.value, 'default', { width: size.width * .33, height: size.height / 2 })
  39. const chart4 = echarts.init(canvasRef4.value, 'default', { width: size.width * .34, height: size.height / 2 })
  40. const chart5 = echarts.init(canvasRef5.value, 'default', { width: size.width * .33, height: size.height / 2 })
  41. chart1.setOption({
  42. title: { bottom: 0, left: 'center', text: '各学科资源数量' },
  43. legend: {
  44. right: '10',
  45. top: '10',
  46. },
  47. grid: {
  48. left: '3%',
  49. right: '40px',
  50. bottom: '30',
  51. containLabel: true
  52. },
  53. xAxis:
  54. {
  55. type: 'category',
  56. show: true,
  57. name: '学期',
  58. data: xAxisType
  59. },
  60. yAxis:
  61. {
  62. type: 'value',
  63. name: '数量',
  64. show: true,
  65. }
  66. ,
  67. series: [
  68. {
  69. name: '总数',
  70. type: 'bar',
  71. stack: 'me',
  72. emphasis: {
  73. focus: 'series'
  74. },
  75. data: chartData?.zysl?.map(({ zs }) => zs)
  76. },
  77. {
  78. name: '今年新增',
  79. type: 'bar',
  80. stack: 'me',
  81. emphasis: {
  82. focus: 'series'
  83. },
  84. data: chartData?.zysl?.map(({ jnxz }) => jnxz)
  85. },
  86. ]
  87. })
  88. chart2.setOption({
  89. title: { bottom: 0, left: '25%', text: '各学科资源占比' },
  90. legend: {
  91. right: '3%',
  92. top: 'center',
  93. orient: 'vertical',
  94. },
  95. series: [
  96. {
  97. type: 'pie',
  98. center: ['42%', '50%'],
  99. itemStyle: {
  100. borderRadius: 1
  101. },
  102. label: {
  103. show: false
  104. },
  105. emphasis: {
  106. label: {
  107. show: false
  108. }
  109. },
  110. data: xAxisType.map((val, idx) => ({
  111. value: chartData.zyzb[idx],
  112. name: val
  113. }))
  114. },
  115. ]
  116. })
  117. chart3.setOption({
  118. title: { bottom: 0, left: '25%', text: '各学科占有的空间占比' },
  119. legend: {
  120. right: '3%',
  121. top: 'center',
  122. orient: 'vertical',
  123. },
  124. series: [
  125. {
  126. type: 'pie',
  127. radius: ['57%', '70%'],
  128. center: ['42%', '50%'],
  129. itemStyle: {
  130. borderRadius: 1
  131. },
  132. label: {
  133. show: false
  134. },
  135. emphasis: {
  136. label: {
  137. show: false
  138. }
  139. },
  140. data: xAxisType.map((val, idx) => ({
  141. value: chartData.kjzb[idx],
  142. name: val
  143. }))
  144. },
  145. ]
  146. })
  147. chart4.setOption({
  148. title: { bottom: 0, left: '25%', text: '各学科资源上传量' },
  149. legend: {
  150. right: '3%',
  151. top: 'center',
  152. orient: 'vertical',
  153. },
  154. series: [
  155. {
  156. type: 'pie',
  157. radius: ['57%', '70%'],
  158. center: ['42%', '50%'],
  159. itemStyle: {
  160. borderRadius: 1
  161. },
  162. label: {
  163. show: false
  164. },
  165. emphasis: {
  166. label: {
  167. show: false
  168. }
  169. },
  170. data: xAxisType.map((val, idx) => ({
  171. value: chartData.zyscl[idx],
  172. name: val
  173. }))
  174. },
  175. ]
  176. })
  177. chart5.setOption({
  178. title: { bottom: 0, left: '25%', text: '各学科资源下载量' },
  179. legend: {
  180. right: '3%',
  181. top: 'center',
  182. orient: 'vertical',
  183. },
  184. series: [
  185. {
  186. type: 'pie',
  187. radius: ['57%', '70%'],
  188. center: ['42%', '50%'],
  189. itemStyle: {
  190. borderRadius: 1
  191. },
  192. label: {
  193. show: false
  194. },
  195. emphasis: {
  196. label: {
  197. show: false
  198. }
  199. },
  200. data: xAxisType.map((val, idx) => ({
  201. value: chartData.zyxzl[idx],
  202. name: val
  203. }))
  204. },
  205. ]
  206. })
  207. }).catch(err => {
  208. console.log(err)
  209. loading.value = false
  210. ElMessage.error(err.message)
  211. })
  212. }
  213. queryApi()
  214. const boxRef = ref()
  215. const canvasRef1 = ref()
  216. const canvasRef2 = ref()
  217. const canvasRef3 = ref()
  218. const canvasRef4 = ref()
  219. const canvasRef5 = ref()
  220. </script>
  221. <template>
  222. <div class="flex flex-col justify-between h-full">
  223. <div class="flex-none flex justify-between text-gray-500 text-sm mb-14px">
  224. <div class="card w-19/100">
  225. <div class="flex justify-start ">
  226. <div class="flex_center w-40px h-40px rounded-4px mr-6 bg-blue-500">
  227. <img :src="typeUrl" class="w-3/5 h-3/5" />
  228. </div>
  229. <div>
  230. <div>资源数量</div>
  231. <div class="text-black text-2xl mt-1">{{ cardData[0]?.zysl ??'-'}}</div>
  232. </div>
  233. </div>
  234. <div class="divider"></div>
  235. <div class="flex justify-between py-1"><span>本月新增</span><span class="text-black">{{ cardData[0]?.byxz ??'-'}}</span>
  236. </div>
  237. <div class="flex justify-between py-1"><span>资源类型数</span><span class="text-black">{{ cardData[0]?.zylxs ??'-'}}</span>
  238. </div>
  239. </div>
  240. <div class="card w-19/100">
  241. <div class="flex justify-start ">
  242. <div class="flex_center w-40px h-40px rounded-4px mr-6 bg-orange-500">
  243. <img :src="typeUrl" class="w-3/5 h-3/5" />
  244. </div>
  245. <div>
  246. <div>下载数量</div>
  247. <div class=" text-black text-2xl mt-1">{{ cardData[1]?.xzsl ??'-'}}</div>
  248. </div>
  249. </div>
  250. <div class="divider"></div>
  251. <div class="flex justify-between py-1"><span>本月下载</span><span class="text-black">{{ cardData[1]?.byxz ??'-'}}</span>
  252. </div>
  253. <div class="flex justify-between py-1"><span>单日最多下载数</span><span class="text-black">{{ cardData[1]?.drzdxzs
  254. ??'-'}}</span></div>
  255. </div>
  256. <div class="card w-19/100">
  257. <div class="flex justify-start ">
  258. <div class="flex_center w-40px h-40px rounded-4px mr-6 bg-red-500">
  259. <img :src="typeUrl" class="w-3/5 h-3/5" />
  260. </div>
  261. <div>
  262. <div>占有空间</div>
  263. <div class=" text-black text-2xl mt-1">{{ cardData[2]?.zykj ??'-'}}</div>
  264. </div>
  265. </div>
  266. <div class="divider"></div>
  267. <div class="flex justify-between py-1"><span>本月占有</span><span class="text-black">{{ cardData[2]?.byzy ??'-'}}</span>
  268. </div>
  269. <div class="flex justify-between py-1"><span>总空间</span><span class="text-black">{{ cardData[2]?.zkj ??'-'}}</span>
  270. </div>
  271. </div>
  272. <div class="card w-19/100">
  273. <div class="flex justify-start ">
  274. <div class="flex_center w-40px h-40px rounded-4px mr-6 bg-green-500">
  275. <img :src="typeUrl" class="w-3/5 h-3/5" />
  276. </div>
  277. <div>
  278. <div>总空间</div>
  279. <div class=" text-black text-2xl mt-1">{{ cardData[3]?.yhsl ??'-'}}</div>
  280. </div>
  281. </div>
  282. <div class="divider"></div>
  283. <div class="flex justify-between py-1"><span>本年新增</span><span class="text-black">{{ cardData[3]?.bnxz ??'-'}}</span>
  284. </div>
  285. <div class="flex justify-between py-1"><span>平台总访问量</span><span class="text-black">{{ cardData[3]?.ptzfwl
  286. ??'-'}}</span></div>
  287. </div>
  288. <div class="card w-19/100">
  289. <div class="flex justify-start ">
  290. <div class="flex_center w-40px h-40px rounded-4px mr-6 bg-teal-500">
  291. <img :src="typeUrl" class="w-3/5 h-3/5" />
  292. </div>
  293. <div>
  294. <div>资源评论</div>
  295. <div class=" text-black text-2xl mt-1">{{ cardData[4]?.zypl ??'-'}}</div>
  296. </div>
  297. </div>
  298. <div class="divider"></div>
  299. <div class="flex justify-between py-1"><span>本月新增</span><span class="text-black">{{ cardData[4]?.byxz ??'-'}}</span>
  300. </div>
  301. <div class="flex justify-between py-1"><span>匿名评价总数</span><span class="text-black">{{ cardData[4]?.nmpjzs
  302. ??'-'}}</span></div>
  303. </div>
  304. </div>
  305. <div class="flex-auto card flex flex-col w-full">
  306. <div>各学科资源统计</div>
  307. <div class="divider"></div>
  308. <div v-if="tableData" ref="boxRef" class="flex-auto w-full">
  309. <div class="h-1/2 flex">
  310. <canvas ref="canvasRef1" class=" h-full"></canvas>
  311. <canvas ref="canvasRef2" class=" h-full"></canvas>
  312. </div>
  313. <div class="h-1/2 flex">
  314. <canvas ref="canvasRef3" class=" h-full"></canvas>
  315. <canvas ref="canvasRef4" class=" h-full"></canvas>
  316. <canvas ref="canvasRef5" class=" h-full"></canvas>
  317. </div>
  318. </div>
  319. <el-empty v-else description="暂无数据"></el-empty>
  320. </div>
  321. </div>
  322. </template>