total.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <template>
  2. <view class="page_view">
  3. <top-return color="#FFF" text="成绩走势"></top-return>
  4. <!-- 背景 -->
  5. <view class="bg_box"></view>
  6. <!-- 头部学期信息 -->
  7. <top-semester></top-semester>
  8. <!-- 分析列表 -->
  9. <view class="card_view">
  10. <view class="card_item" style="background-color: #4169E1;height: 200rpx;">
  11. <view class="analysis_box">
  12. <view class="analysis_text">{{analysisData[0].title}}</view>
  13. <view class="flex_baseline">
  14. <view class="analysis_data" style="font-size: 44rpx;">{{totalSemAvg}}</view>
  15. <view class="analysis_text" style="margin-right: 20rpx;font-size: 26rpx;">分</view>
  16. <view class="analysis_text" style="font-size: 26rpx;" v-if="analysisData[0].data != 'btm'">超过</view>
  17. <view class="analysis_text" style="font-size: 26rpx;" v-if="analysisData[0].data === 'btm'">未超过</view>
  18. </view>
  19. <view class="flex_baseline">
  20. <view class="analysis_text">
  21. {{analysisData[0].data === 'top' ? '班级和年级学期平均':(analysisData[0].data === 'midClass'? '班级学期平均分':(analysisData[0].data === 'midGrade'?'年级学期平均分':'班级和年级学期平均'))}}
  22. </view>
  23. </view>
  24. </view>
  25. <view class="icon_box">
  26. <view v-if="analysisData[0].data==='top'" class="t-icon t-icon-a-bianzu6"></view>
  27. <view v-if="analysisData[0].data==='midGrade'||analysisData[0].data === 'midClass'" class="t-icon t-icon-a-bianzu7">
  28. </view>
  29. <view v-if="analysisData[0].data==='btm'" class="t-icon t-icon-a-bianzu8"></view>
  30. </view>
  31. </view>
  32. <view class="card_item" style="background-color: #ff8caf;height: 200rpx;">
  33. <view class="analysis_box">
  34. <view class="analysis_text">{{analysisData[1].title}}</view>
  35. <view class="flex_baseline">
  36. <view class="analysis_data" style="font-size: 44rpx;">{{singleSemAvg}}</view>
  37. <view class="analysis_text" style="margin-right: 20rpx;font-size: 26rpx;">分</view>
  38. <view class="analysis_text" style="font-size: 26rpx;" v-if="analysisData[1].data != 'btm'">超过</view>
  39. <view class="analysis_text" style="font-size: 26rpx;" v-if="analysisData[1].data === 'btm'">未超过</view>
  40. </view>
  41. <view class="flex_baseline">
  42. <view class="analysis_text">
  43. {{analysisData[1].data === 'top' ? '班级和年级学期平均':(analysisData[1].data === 'midClass'? '班级学期平均分':(analysisData[1].data === 'midGrade'?'年级学期平均分':'班级和年级学期平均'))}}
  44. </view>
  45. </view>
  46. </view>
  47. <view class="icon_box">
  48. <view v-if="analysisData[1].data==='top'" class="t-icon t-icon-a-bianzu6"></view>
  49. <view v-if="analysisData[1].data==='midGrade'||analysisData[1].data === 'midClass'" class="t-icon t-icon-a-bianzu7">
  50. </view>
  51. <view v-if="analysisData[1].data==='btm'" class="t-icon t-icon-a-bianzu8"></view>
  52. </view>
  53. </view>
  54. <!-- 总成绩对比 -->
  55. <view class="card_item" style="width: 100%;">
  56. <view class="card_title">
  57. <view class="front_tag"></view>
  58. <view class="title">总成绩趋势</view>
  59. <!-- <view class="t-icon t-icon-tishi2" style="margin-left: auto;"></view> -->
  60. </view>
  61. <view class="chart_box">
  62. <qiun-data-charts type="area" ontouch="true" :chartData="examChartData.totalChartData[0]"
  63. tooltipFormat='tooltipScore' :canvas2d="true" canvasId="total_chart1" />
  64. </view>
  65. </view>
  66. <!-- 单科与平均对比 -->
  67. <view class="card_item" style="width: 100%;">
  68. <view class="card_title">
  69. <view class="front_tag"></view>
  70. <view class="title">单科成绩趋势</view>
  71. <view class="flex_row" style="margin-left: auto;" @click="subjectPicker = true">
  72. <text class="title" style="color: #4169E1;font-weight: 400;">{{subjectCurrent}}</text>
  73. <view class="t-icon t-icon-xia"></view>
  74. </view>
  75. </view>
  76. <view class="chart_box">
  77. <qiun-data-charts type="area" ontouch="true" :chartData="examChartData.totalChartData[1]"
  78. tooltipFormat='tooltipScore' :canvas2d="true" canvasId="total_chart2" />
  79. </view>
  80. </view>
  81. <!-- 个人单科对比 -->
  82. <view class="card_item" style="width: 100%;">
  83. <view class="card_title">
  84. <view class="front_tag"></view>
  85. <view class="title">单科对比趋势</view>
  86. <view class="flex_row" style="margin-left: auto;" @click="scoreTypePicker = true">
  87. <text class="title" style="color: #4169E1;font-weight: 400;">{{scoreTypeCurrent}}</text>
  88. <view class="t-icon t-icon-xia"></view>
  89. </view>
  90. </view>
  91. <view class="chart_box" v-if="scoreTypeCurrent === '得分'">
  92. <qiun-data-charts type="line" ontouch="true" :chartData="examChartData.totalChartData[2]"
  93. tooltipFormat='tooltipScore' :canvas2d="true" canvasId="total_chart3" />
  94. </view>
  95. <view class="chart_box" v-if="scoreTypeCurrent === '得分率'">
  96. <qiun-data-charts type="line" ontouch="true" :chartData="examChartData.totalChartData[2]"
  97. tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="total_chart4" />
  98. </view>
  99. </view>
  100. </view>
  101. <!-- 选择器 -->
  102. <!-- 科目选择 -->
  103. <u-picker :show="subjectPicker" :columns="subjectList" @confirm="subjectConfirm" @cancel="cancel" />
  104. <!-- 模式选择 -->
  105. <u-picker :show="scoreTypePicker" :columns="scoreTypeList" @confirm="scoreTypeConfirm" @cancel="cancel" />
  106. </view>
  107. </template>
  108. <script>
  109. import MockData from '@/common/global_js/MockData.js'
  110. import {
  111. mapState,
  112. mapMutations
  113. } from 'vuex'
  114. export default {
  115. computed: {
  116. ...mapState('m_chart', ['examChartData', 'subjectExamData']),
  117. },
  118. watch: {
  119. subjectCurrent: {
  120. handler(newValue) {
  121. let subjectChartData = this.mockData.find(x => x.series[0].name.includes(newValue))
  122. let temp = this.examChartData
  123. temp.totalChartData[1] = subjectChartData
  124. this.updateExamChartData(temp)
  125. this.chooseAnalysisSubject()
  126. },
  127. immediate: false
  128. },
  129. },
  130. data() {
  131. return {
  132. mockData: MockData.subjectData,
  133. //选择器显示
  134. subjectPicker: false,
  135. scoreTypePicker: false,
  136. //选择器内容
  137. subjectList: '',
  138. scoreTypeList: [
  139. ['得分', '得分率']
  140. ],
  141. //当前选中
  142. subjectCurrent: '',
  143. scoreTypeCurrent: '',
  144. //分析模块数据
  145. analysisData: [{
  146. title: '学期平均总得分',
  147. data: '',
  148. color: '#4169E1',
  149. }, {
  150. title: '学期平均分',
  151. data: '',
  152. color: '#ff8caf',
  153. }],
  154. //学期平均总得分
  155. totalSemAvg: '',
  156. //单科学期平均得分
  157. singleSemAvg: ''
  158. }
  159. },
  160. onLoad() {
  161. this.init()
  162. },
  163. methods: {
  164. ...mapMutations('m_chart', ['updateExamChartData']),
  165. init() {
  166. this.setChartOptions()
  167. this.getAnalysisData()
  168. },
  169. //获得分析数据
  170. getAnalysisData() {
  171. function arrSum(array) {
  172. let cont = 0
  173. for (let i = 0; i < array.length; i++) {
  174. cont += array[i]
  175. }
  176. return cont;
  177. }
  178. let totalSemAvg = parseInt((arrSum(this.examChartData.totalChartData[0].series[0].data) / this.examChartData.totalChartData[0].series[0].data.length).toFixed(0))
  179. this.totalSemAvg = totalSemAvg
  180. let classSemAvg = parseInt((arrSum(this.examChartData.totalChartData[0].series[1].data) / this.examChartData.totalChartData[0].series[1].data.length).toFixed(0))
  181. console.log('班级平均总分', classSemAvg);
  182. let gradeSemAvg = parseInt((arrSum(this.examChartData.totalChartData[0].series[2].data) / this.examChartData.totalChartData[0].series[2].data.length).toFixed(0))
  183. console.log('年级平均总分', gradeSemAvg);
  184. if (totalSemAvg > classSemAvg && totalSemAvg > gradeSemAvg) {
  185. this.analysisData[0].data = 'top'
  186. } else if (totalSemAvg > classSemAvg && totalSemAvg >= gradeSemAvg) {
  187. this.analysisData[0].data = 'midClass'
  188. } else if (totalSemAvg > gradeSemAvg && totalSemAvg >= classSemAvg) {
  189. this.analysisData[0].data = 'midGrade'
  190. } else {
  191. this.analysisData[0].data = 'btm'
  192. }
  193. },
  194. chooseAnalysisSubject(){
  195. function arrSum(array) {
  196. let cont = 0
  197. for (let i = 0; i < array.length; i++) {
  198. cont += array[i]
  199. }
  200. return cont;
  201. }
  202. this.analysisData[1].title = this.subjectCurrent + '学期平均分'
  203. console.log(this.examChartData.totalChartData[1]);
  204. let singleSemAvg = parseInt((arrSum(this.examChartData.totalChartData[1].series[0].data) / this.examChartData.totalChartData[1].series[0].data.length).toFixed(0))
  205. this.singleSemAvg = singleSemAvg
  206. let classSemSinAvg = parseInt((arrSum(this.examChartData.totalChartData[1].series[1].data) / this.examChartData.totalChartData[1].series[1].data.length).toFixed(0))
  207. console.log('班级平均单科总分', classSemSinAvg);
  208. let gradeSemSinAvg = parseInt((arrSum(this.examChartData.totalChartData[1].series[2].data) / this.examChartData.totalChartData[1].series[2].data.length).toFixed(0))
  209. console.log('年级平均单科总分', gradeSemSinAvg);
  210. if (singleSemAvg > classSemSinAvg && singleSemAvg > gradeSemSinAvg) {
  211. this.analysisData[1].data = 'top'
  212. } else if (singleSemAvg > classSemSinAvg && singleSemAvg >= gradeSemSinAvg) {
  213. this.analysisData[1].data = 'midClass'
  214. } else if (singleSemAvg > gradeSemSinAvg && singleSemAvg >= classSemSinAvg) {
  215. this.analysisData[1].data = 'midGrade'
  216. } else {
  217. this.analysisData[1].data = 'btm'
  218. }
  219. },
  220. //初始化选择器内容(图表配置)
  221. setChartOptions() {
  222. if (this.scoreTypeCurrent === '')
  223. this.scoreTypeCurrent = this.scoreTypeList[0][0]
  224. if (this.subjectList === '') {
  225. let arr = []
  226. arr.push(this.subjectExamData.subjectList)
  227. this.subjectList = arr
  228. this.subjectCurrent = this.subjectList[0][0]
  229. }else{
  230. this.subjectCurrent = this.subjectList[0][0]
  231. }
  232. },
  233. //切换科目
  234. subjectConfirm(e) {
  235. this.subjectCurrent = e.value[0]
  236. this.subjectPicker = false
  237. },
  238. //切换模式
  239. scoreTypeConfirm(e) {
  240. this.scoreTypeCurrent = e.value[0]
  241. this.scoreTypePicker = false
  242. },
  243. cancel() {
  244. this.subjectPicker = false
  245. this.scoreTypePicker = false
  246. }
  247. }
  248. }
  249. </script>
  250. <style lang="scss">
  251. @import 'gradelist_pages.scss';
  252. </style>