111 Commits 30f684c24a ... 8945b84dfc

Autore SHA1 Messaggio Data
  KELECHUAN 8945b84dfc update: 修改家校数据记录逻辑 2 anni fa
  KELECHUAN b249afccac update: 字体与详情列表页面 2 anni fa
  KELECHUAN 48542e3068 update: 全局字体修改 2 anni fa
  KELECHUAN ffbd2b6b08 update: 二级页面修改 2 anni fa
  KELECHUAN 7ac63ae326 update: 解决冲突 2 anni fa
  KELECHUAN ba7998415a update: 同步提交 2 anni fa
  KELECHUAN 146bf7f7f3 update: 优化当前课程算法 2 anni fa
  KELECHUAN cb185d31ad update: 错题本与评测练习模块 2 anni fa
  KELECHUAN f63665c1e7 update: 总成绩分析模块,页面背景图,组件优化等等 3 anni fa
  KELECHUAN 1b1957d986 update: 课程推荐模块,优化当前课程统计 3 anni fa
  KELECHUAN 37e957b4fc update: 课程推荐模块和个人信息页面等 3 anni fa
  KELECHUAN 6b51168612 update: 新模块设计与部分bug修复 3 anni fa
  KELECHUAN e0db7dbb8d update: 基础内容 3 anni fa
  KELECHUAN 5d76740c10 initwxapp 3 anni fa
  zhangsl 62234db44b Initial commit 3 anni fa
  KELECHUAN 30f684c24a update:初步完成修改 3 anni fa
  KELECHUAN fe9e675fba update:排除周末,优化全局样式 3 anni fa
  KELECHUAN 869c84ee75 update:视频列表,活动详情 3 anni fa
  KELECHUAN 0eb6a8d947 update:完成5.7讨论修改 3 anni fa
  KELECHUAN 500bf20bc1 update:UI,活动单次详情页 3 anni fa
  KELECHUAN f68d8062d2 update:完成block主次关系优化 3 anni fa
  KELECHUAN 3de65db806 update:图表tooltip 3 anni fa
  KELECHUAN 56026d6c6f update:打卡block等等 3 anni fa
  KELECHUAN 0ea80edfc8 update: initApp、video 3 anni fa
  KELECHUAN 129564ca14 update5.6 3 anni fa
  KELECHUAN ac200634b6 4.26.2 3 anni fa
  KELECHUAN 2b0c2cf93e 4.26 3 anni fa
  KELECHUAN 5f7d6635f5 评测,作业,活动页面优化与完成 3 anni fa
  KELECHUAN 6cf9607741 4.19 3 anni fa
  KELECHUAN e13d42735a 优化block,优化提示tooltip,优化项目结构,统一色彩等 3 anni fa
  KELECHUAN 9c254cf903 4.15 3 anni fa
  KELECHUAN 86d4d574fd 4.14 3 anni fa
  KELECHUAN ff3ae40d2c 4.12 3 anni fa
  KELECHUAN adc43e9209 4.11 3 anni fa
  KELECHUAN b90bfcb0a6 4.8.3 3 anni fa
  KELECHUAN 6791b707ae 4.8.2 3 anni fa
  KELECHUAN 7b228a502b 4.8 3 anni fa
  KELECHUAN 146077129a 4.7 3 anni fa
  KELECHUAN 5bbacfbebd 打卡页面 3 anni fa
  KELECHUAN 62d227e48b 4.2 3 anni fa
  KELECHUAN 8aeff2b402 4.1 3 anni fa
  KELECHUAN 6687629d2b 4.1 3 anni fa
  KELECHUAN d35e91fa4b 完成作业页面优化,首页优化 3 anni fa
  KELECHUAN 122f58a524 3.30-3 3 anni fa
  KELECHUAN a2f2ad857d 3.30-2 3 anni fa
  KELECHUAN 438c9d2c5d 3.30 3 anni fa
  KELECHUAN e3d45f5459 完成课程列表展示逻辑,完成作业页面设计等 3 anni fa
  KELECHUAN 2b7e1ceac0 3.28-3 3 anni fa
  KELECHUAN a0425e7d6a 3.28-2 3 anni fa
  KELECHUAN bc5482b085 3.28 3 anni fa
  KELECHUAN 7a29efd3a8 优化工作 3 anni fa
  KELECHUAN ee47b268a6 作业页面初步完成 3 anni fa
  KELECHUAN 23a852e5e8 3.25 3 anni fa
  KELECHUAN 047e3c3497 3.22 3 anni fa
  KELECHUAN 9744bd9de7 3.18 3 anni fa
  KELECHUAN 4a41902550 图表展示方式切换 3 anni fa
  KELECHUAN 0157cc943a 通知绑定,通知页面优化,首页优化 3 anni fa
  KELECHUAN 6bea00f292 抽离css,优化图表tooltips,实现按钮功能,实现今日数据记录 3 anni fa
  KELECHUAN 384726a1fc 3-15 3 anni fa
  KELECHUAN 10f2ee430e Merge branch 'master' of http://52.130.252.100:10000/TEAMMODEL/MiniPrograms 3 anni fa
  KELECHUAN c2539fffa1 今日页数据获取 3 anni fa
  OnePsycho cdf01de4bc 订阅页面及通知页面 3 anni fa
  KELECHUAN 284e18a495 3.14-2 3 anni fa
  KELECHUAN 6e5552d71a css提取公共部分 3 anni fa
  KELECHUAN f9b18df733 3.14 3 anni fa
  KELECHUAN b084314205 3.11-4 3 anni fa
  KELECHUAN cd9fdfa3a8 3.11-3 3 anni fa
  KELECHUAN b740844be4 3.11-2 3 anni fa
  KELECHUAN 7b8c546308 3.11 3 anni fa
  KELECHUAN 0bf6f74a55 完成首页模块化设计 3 anni fa
  KELECHUAN 46983b80c3 完善首页学习,运动,睡眠图表,设计订阅组件,通过微信方法自适应icon布局等等 3 anni fa
  KELECHUAN 471e6f1320 优化CSS,解决按钮多次响应问题,优化组件,完善个人信息页面,完善孩子信息页面等 3 anni fa
  KELECHUAN f27456191d 3.7 3 anni fa
  KELECHUAN 0bc81d0072 优化样式,设计孩子信息页面 3 anni fa
  KELECHUAN 730affa9dc 3.6 3 anni fa
  KELECHUAN 6b52047aa1 优化数据存储,首页优化 3 anni fa
  KELECHUAN 51c0e415d1 完善分析模块,布局首页今日模块 3 anni fa
  KELECHUAN 70621f0ff8 修改成绩页面内容 3 anni fa
  KELECHUAN c20abcc77e 修改数据结构,修改图表详情页 3 anni fa
  KELECHUAN b01c88e3db 成绩图表获取数据方法编写,组件更新数据方法编写,解决图表抖动bug,完善项目结构与规划数据流 3 anni fa
  KELECHUAN eb8aa9baa1 初步布局今日页面,优化成绩页面 3 anni fa
  KELECHUAN fafbe30dbb 完成成绩页基本功能与图表的封装 3 anni fa
  KELECHUAN 13427ab2c2 完成引导页美化,成绩页布局修改与美化,二级页面展示成绩表封装并设计 3 anni fa
  KELECHUAN d05cfcdf3b 美化登录页和引导页 3 anni fa
  zhangsl ca63b5f7be 登录流程切换,优化项目结构 3 anni fa
  zhangsl b47bc169dd Merge branch 'master' of http://52.130.252.100:10000/TEAMMODEL/MiniPrograms 3 anni fa
  zhangsl 3339121c0b 切换登录流程顺序,初步优化项目结构 3 anni fa
  OnePsycho cd5f911848 Merge branch 'master' of http://52.130.252.100:10000/TEAMMODEL/MiniPrograms 3 anni fa
  OnePsycho cf62fbfe90 update:表格宽度 3 anni fa
  zhangsl 563acdc794 2.18 3 anni fa
  OnePsycho 4a883a1557 update:个人中心页面调整 3 anni fa
  zhangsl 76cfa6140e iconfont 3 anni fa
  zhangsl ff8f56790b 页面与组件代码简化,孩子信息头部学期切换,学期信息全局存储等 3 anni fa
  zhangsl a45f55a386 2.17 3 anni fa
  zhangsl 69af486318 图表优化 3 anni fa
  zhangsl 7c257e45fd 优化跳转 3 anni fa
  zhangsl 0e0eb69ef6 解决登录bug,登录页面bug,分包,继续完善成绩页面 3 anni fa
  zhangsl 6d88c3f5b2 2.16图片优化,grade页面修改缩略图,封装组件,美化个人页面等 3 anni fa
  zhangsl 76193c1f0c 美化登录页面 3 anni fa
  zhangsl aedf9668a8 2.15 3 anni fa
  zhangsl 9354878de4 优化登录流程获取手机号优化全局存储等 3 anni fa
  zhangsl c6c8892f0c 登录流程与引导页完善首页美化 3 anni fa
  zhangsl 478440f208 优化表格与个人页 3 anni fa
  zhangsl ee5177cf81 表格和个人页面等等 3 anni fa
  zhangsl 5142bf3faf 表格和个人页面等 3 anni fa
  zhangsl dbf4c70f2b 1.25提交 3 anni fa
  kelezhang 6a46b0ec1a Merge branch 'master' of http://52.130.252.100:10000/TEAMMODEL/MiniPrograms 3 anni fa
  张生龙 dcc50739bf master 3 anni fa
  kelezhang 21366ab17d 1.24 3 anni fa
  OnePsycho 2b5c5a8ded update:修改APPID 3 anni fa
  kelezhang b9ce434801 first commit 3 anni fa
100 ha cambiato i file con 6499 aggiunte e 7580 eliminazioni
  1. 0 2
      .gitignore
  2. 6 10
      .hbuilderx/launch.json
  3. 0 1
      .vs/VSWorkspaceState.json
  4. BIN
      .vs/miniprogram/v17/.suo
  5. BIN
      .vs/slnx.sqlite
  6. 0 0
      .vs/teammodelwxapp/project-colors.json
  7. BIN
      .vs/teammodelwxapp/v17/.suo
  8. BIN
      .vs/teammodelwxapp/v17/workspaceFileList.bin
  9. 20 53
      App.vue
  10. 0 520
      common/data.js
  11. 811 0
      common/global_js/MockData.js
  12. 169 0
      common/global_scss/pages_style.scss
  13. 20 0
      common/global_scss/theme_style.scss
  14. 0 19
      common/style.scss
  15. 0 77
      components/back/back.vue
  16. 0 392
      components/interactive-box/interactive-box.vue
  17. 145 0
      components/loading/loading.vue
  18. 0 493
      components/task-box/task-box.vue
  19. 0 188
      components/todayclass-box/todayclass-box.vue
  20. 0 206
      components/top-box/top-box.vue
  21. 147 0
      components/top-info/top-info.vue
  22. 90 0
      components/top-return/top-return.vue
  23. 86 0
      components/top-semester/top-semester.vue
  24. 0 6
      subpkg/z-calendar/dateBox.vue
  25. 0 0
      components/z-calendar/js/utils.js
  26. 3 3
      subpkg/z-calendar/zsy-calendar.vue
  27. 0 13
      components/z-table/table-render.js
  28. 0 784
      components/z-table/z-table.vue
  29. 0 148
      gradepkg/ability-chart/ability-chart.vue
  30. 0 152
      gradepkg/common/chartpage.scss
  31. 0 199
      gradepkg/general-chart/general-chart.vue
  32. 0 163
      gradepkg/rank-chart/rank-chart.vue
  33. 0 104
      gradepkg/single-chart/single-chart.vue
  34. 0 104
      gradepkg/subject-chart/subject-chart.vue
  35. 29 96
      main.js
  36. 35 27
      manifest.json
  37. 0 16
      package-lock.json
  38. 0 15
      package.json
  39. 163 170
      pages.json
  40. 0 43
      pages/common/blockmsg.scss
  41. 0 70
      pages/common/mainpage.scss
  42. 0 232
      pages/grade/grade.vue
  43. 0 340
      pages/home/home.vue
  44. 0 46
      pages/homework/homework.vue
  45. 52 28
      pages/init/init.vue
  46. 0 77
      pages/interactive/interactive.vue
  47. 0 361
      pages/my/my.vue
  48. 242 0
      pages/style/tab_pages.scss
  49. 299 0
      pages/tab_exam/tab_exam.vue
  50. 800 0
      pages/tab_home/tab_home.vue
  51. 288 0
      pages/tab_mine/tab_mine.vue
  52. 277 0
      pages/tab_swap/tab_swap.vue
  53. 301 0
      pages/tab_work/tab_work.vue
  54. BIN
      static/default-icons/boy.png
  55. BIN
      static/default-icons/girl.png
  56. 58 0
      static/default_icons/boy_avatar.svg
  57. 69 0
      static/default_icons/girl_avatar.svg
  58. 4 0
      static/iconfont/iconfont-font.css
  59. 623 0
      static/iconfont/iconfont-weapp-icon.css
  60. 0 0
      static/tab_icons/exam.png
  61. 0 0
      static/tab_icons/examselect.png
  62. 0 0
      static/tab_icons/home.png
  63. 0 0
      static/tab_icons/homeselect.png
  64. 0 0
      static/tab_icons/mine.png
  65. 0 0
      static/tab_icons/mineselect.png
  66. 0 0
      static/tab_icons/swap.png
  67. 0 0
      static/tab_icons/swapselect.png
  68. 0 0
      static/tab_icons/work.png
  69. 0 0
      static/tab_icons/workselect.png
  70. 21 30
      store/chart.js
  71. 46 79
      store/children.js
  72. 41 51
      store/parent.js
  73. 3 5
      store/store.js
  74. 0 347
      subpkg/calendar/calendar.vue
  75. 0 218
      subpkg/classlist/classlist.vue
  76. 0 91
      subpkg/common/detaillistpage.scss
  77. 0 85
      subpkg/common/detailpage.scss
  78. 0 611
      subpkg/common/iconfont-weapp-icon.css
  79. 0 98
      subpkg/common/infopage.scss
  80. 0 157
      subpkg/common/videopage.scss
  81. 94 0
      subpkg/datalist/examdata.vue
  82. 189 0
      subpkg/datalist/examlist.vue
  83. 81 0
      subpkg/datalist/swapdata.vue
  84. 166 0
      subpkg/datalist/swaplist.vue
  85. 80 0
      subpkg/datalist/workdata.vue
  86. 203 0
      subpkg/datalist/worklist.vue
  87. 0 111
      subpkg/detail/activity.vue
  88. 0 72
      subpkg/detail/exam.vue
  89. 0 107
      subpkg/detail/homework.vue
  90. 0 132
      subpkg/detaillist/activitylist.vue
  91. 0 97
      subpkg/detaillist/examlist.vue
  92. 0 131
      subpkg/detaillist/homeworklist.vue
  93. 48 0
      subpkg/exam/exercisesinfo.vue
  94. 41 0
      subpkg/gradelist/gradelist_pages.scss
  95. 131 0
      subpkg/gradelist/level.vue
  96. 143 0
      subpkg/gradelist/ranking.vue
  97. 97 0
      subpkg/gradelist/single.vue
  98. 99 0
      subpkg/gradelist/subject.vue
  99. 279 0
      subpkg/gradelist/total.vue
  100. 0 0
      subpkg/guide/accesspage.vue

+ 0 - 2
.gitignore

@@ -1,2 +0,0 @@
-/node_modules
-/unpackage/dist

+ 6 - 10
.hbuilderx/launch.json

@@ -1,20 +1,16 @@
-{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
-  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
-    "version": "0.0",
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
     "configurations": [{
      	"default" : 
      	{
      		"launchtype" : "local"
      	},
-     	"h5" : 
-     	{
-     		"launchtype" : "local"
-     	},
      	"mp-weixin" : 
      	{
      		"launchtype" : "local"
      	},
      	"type" : "uniCloud"
-     }
-    ]
-}
+     }
+    ]
+}

+ 0 - 1
.vs/VSWorkspaceState.json

@@ -2,6 +2,5 @@
   "ExpandedNodes": [
     ""
   ],
-  "SelectedNode": "\\common",
   "PreviewInSolutionExplorer": false
 }

BIN
.vs/miniprogram/v17/.suo


BIN
.vs/slnx.sqlite


.vs/miniprogram/project-colors.json → .vs/teammodelwxapp/project-colors.json


BIN
.vs/teammodelwxapp/v17/.suo


BIN
.vs/teammodelwxapp/v17/workspaceFileList.bin


+ 20 - 53
App.vue

@@ -1,57 +1,24 @@
 <script>
-	export default {
-		onLaunch: function() {
-			// console.warn('当前组件仅支持 uni_modules 目录结构 ,请升级 HBuilderX 到 3.1.0 版本以上!')
-			// console.log('App Launch')
-		},
-		onShow: function() {
-			// console.log('App Show')
-		},
-		onHide: function() {
-			// console.log('App Hide')
-		}
-	}
+export default {
+  onLaunch: function () {
+		console.log('App onLaunch')
+  },
+  onShow: function () {
+    console.log('App Show')
+  },
+  onHide: function () {
+    console.log('App Hide')
+  }
+}
 </script>
 
 <style lang="scss">
-	/* uView */
-	@import "@/uni_modules/uview-ui/index.scss";
-	/*每个页面公共css */
-	@import '@/uni_modules/uni-scss/index.scss';
-	// /* #ifndef APP-NVUE */
-	// 引入图标
-	@import '@/subpkg/common/iconfont-weapp-icon.css';
-
-	.t-icon {
-		display: inline-block;
-		width: 30px;
-		height: 30px;
-		background-repeat: no-repeat;
-		background-position: center;
-		background-size: 100%;
-	}
-
-	.start-tag {
-		height: 32rpx;
-		width: 10rpx;
-		border-radius: 100rpx;
-		background-image: linear-gradient($color-mixblue 60%, #FFF);
-	}
-
-	// 设置整个项目的背景色
-	page {
-		background-color: $page-background-color;
-	}
-
-	//第二种
-	::-webkit-scrollbar {
-		display: none;
-	}
-
-	/* #endif */
-	.example-info {
-		font-size: 14px;
-		color: #333;
-		padding: 10px;
-	}
-</style>
+/*每个页面公共css */
+@import '@/common/global_scss/pages_style';
+/*uView配置 */
+@import '@/uni_modules/uview-ui/index.scss';
+/*iconfont */
+@import '@/static/iconfont/iconfont-weapp-icon.css';
+/*字体 */
+@import url('~@/static/iconfont/iconfont-font.css');
+</style>

+ 0 - 520
common/data.js

@@ -1,520 +0,0 @@
-const subjectData = [
-	{
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "语文成绩",
-				"data": [
-					90,
-					95,
-					72,
-					89,
-					88,
-					84
-				]
-			},
-			{
-				"name": "班级平均",
-				"data": [
-					85,
-					98,
-					84,
-					72,
-					83,
-					89
-				]
-			},
-			{
-				"name": "年纪平均",
-				"data": [
-					88,
-					79,
-					88,
-					74,
-					81,
-					92
-				]
-			}
-		],
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "语文成绩",
-				"data": [
-					90,
-					95,
-					92,
-					80,
-					88,
-					99
-				]
-			},
-			{
-				"name": "班级平均",
-				"data": [
-					85,
-					88,
-					84,
-					42,
-					93,
-					89
-				]
-			},
-			{
-				"name": "年纪平均",
-				"data": [
-					88,
-					79,
-					77,
-					74,
-					85,
-					59
-				]
-			}
-		],
-	},
-	{
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "数学成绩",
-				"data": [
-					90,
-					95,
-					62,
-					100,
-					88,
-					99
-				]
-			},
-			{
-				"name": "班级平均",
-				"data": [
-					85,
-					88,
-					84,
-					92,
-					73,
-					89
-				]
-			},
-			{
-				"name": "年纪平均",
-				"data": [
-					88,
-					99,
-					77,
-					74,
-					85,
-					89
-				]
-			}
-		],
-	},
-	{
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "英语成绩",
-				"data": [
-					90,
-					75,
-					92,
-					100,
-					88,
-					99
-				]
-			},
-			{
-				"name": "班级平均",
-				"data": [
-					85,
-					48,
-					84,
-					92,
-					93,
-					89
-				]
-			},
-			{
-				"name": "年纪平均",
-				"data": [
-					88,
-					99,
-					77,
-					74,
-					85,
-					86
-				]
-			}
-		],
-	},
-	{
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "科学成绩",
-				"data": [
-					90,
-					95,
-					92,
-					50,
-					88,
-					99
-				]
-			},
-			{
-				"name": "班级平均",
-				"data": [
-					85,
-					88,
-					84,
-					92,
-					63,
-					89
-				]
-			},
-			{
-				"name": "年纪平均",
-				"data": [
-					78,
-					79,
-					77,
-					74,
-					85,
-					89
-				]
-			}
-		],
-	},
-	{
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "体育成绩",
-				"data": [
-					90,
-					95,
-					92,
-					70,
-					88,
-					99
-				]
-			},
-			{
-				"name": "班级平均",
-				"data": [
-					85,
-					88,
-					84,
-					92,
-					83,
-					89
-				]
-			},
-			{
-				"name": "年纪平均",
-				"data": [
-					88,
-					79,
-					87,
-					74,
-					55,
-					89
-				]
-			}
-		],
-	},
-	{
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "思品成绩",
-				"data": [
-					90,
-					95,
-					92,
-					60,
-					88,
-					99
-				]
-			},
-			{
-				"name": "班级平均",
-				"data": [
-					85,
-					88,
-					84,
-					92,
-					93,
-					79
-				]
-			},
-			{
-				"name": "年纪平均",
-				"data": [
-					88,
-					79,
-					77,
-					74,
-					55,
-					89
-				]
-			}
-		],
-	},
-]
-
-const rankData = [
-	{
-		name: "语文",
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "超过年级中",
-				"data": [
-					90,
-					95,
-					82,
-					76,
-					88,
-					99
-				]
-			},
-			{
-				"name": "超过班级中",
-				"data": [
-					95,
-					58,
-					64,
-					92,
-					93,
-					79
-				]
-			}
-		]
-	},
-	{
-		name: "数学",
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "超过年级中",
-				"data": [
-					90,
-					95,
-					82,
-					76,
-					88,
-					99
-				]
-			},
-			{
-				"name": "超过班级中",
-				"data": [
-					95,
-					58,
-					88,
-					92,
-					93,
-					79
-				]
-			}
-		]
-	},
-	{
-		name: "英语",
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "超过年级中",
-				"data": [
-					90,
-					74,
-					82,
-					66,
-					77,
-					99
-				]
-			},
-			{
-				"name": "超过班级中",
-				"data": [
-					95,
-					89,
-					64,
-					75,
-					93,
-					92
-				]
-			}
-		]
-	},
-	{
-		name: "思品",
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "超过年级中",
-				"data": [
-					80,
-					91,
-					82,
-					76,
-					55,
-					99
-				]
-			},
-			{
-				"name": "超过班级中",
-				"data": [
-					95,
-					92,
-					69,
-					92,
-					93,
-					55
-				]
-			}
-		]
-	},
-	{
-		name: "体育",
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "超过年级中",
-				"data": [
-					90,
-					33,
-					82,
-					45,
-					88,
-					99
-				]
-			},
-			{
-				"name": "超过班级中",
-				"data": [
-					95,
-					99,
-					64,
-					77,
-					93,
-					79
-				]
-			}
-		]
-	},
-	{
-		name: "科学",
-		categories: [
-			"开学考试",
-			"第一月考",
-			"第二月考",
-			"期中考试",
-			"第三月考",
-			"期末考试"
-		],
-		series: [{
-				"name": "超过年级中",
-				"data": [
-					50,
-					95,
-					55,
-					76,
-					66,
-					99
-				]
-			},
-			{
-				"name": "超过班级中",
-				"data": [
-					30,
-					58,
-					64,
-					92,
-					22,
-					79
-				]
-			}
-		]
-	},
-]
-
-export default {
-	subjectData, //主要科目列表
-	rankData, //排行科目列表
-}

+ 811 - 0
common/global_js/MockData.js

@@ -0,0 +1,811 @@
+const subjectData = [
+	{
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "语文成绩",
+				"data": [
+					90,
+					95,
+					72,
+					89,
+					88,
+					84
+				]
+			},
+			{
+				"name": "班级平均",
+				"data": [
+					85,
+					98,
+					84,
+					72,
+					83,
+					89
+				]
+			},
+			{
+				"name": "年纪平均",
+				"data": [
+					88,
+					79,
+					88,
+					74,
+					81,
+					92
+				]
+			}
+		],
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "语文成绩",
+				"data": [
+					90,
+					95,
+					92,
+					80,
+					88,
+					99
+				]
+			},
+			{
+				"name": "班级平均",
+				"data": [
+					85,
+					88,
+					84,
+					42,
+					93,
+					89
+				]
+			},
+			{
+				"name": "年纪平均",
+				"data": [
+					88,
+					79,
+					77,
+					74,
+					85,
+					59
+				]
+			}
+		],
+	},
+	{
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "数学成绩",
+				"data": [
+					90,
+					95,
+					62,
+					69,
+					88,
+					99
+				]
+			},
+			{
+				"name": "班级平均",
+				"data": [
+					85,
+					88,
+					84,
+					92,
+					73,
+					89
+				]
+			},
+			{
+				"name": "年纪平均",
+				"data": [
+					88,
+					99,
+					77,
+					74,
+					85,
+					89
+				]
+			}
+		],
+	},
+	{
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "英语成绩",
+				"data": [
+					90,
+					75,
+					92,
+					77,
+					88,
+					99
+				]
+			},
+			{
+				"name": "班级平均",
+				"data": [
+					85,
+					48,
+					84,
+					92,
+					93,
+					89
+				]
+			},
+			{
+				"name": "年纪平均",
+				"data": [
+					88,
+					99,
+					77,
+					74,
+					85,
+					86
+				]
+			}
+		],
+	},
+	{
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "科学成绩",
+				"data": [
+					90,
+					95,
+					92,
+					50,
+					56,
+					99
+				]
+			},
+			{
+				"name": "班级平均",
+				"data": [
+					85,
+					88,
+					84,
+					92,
+					63,
+					89
+				]
+			},
+			{
+				"name": "年纪平均",
+				"data": [
+					78,
+					79,
+					77,
+					74,
+					85,
+					89
+				]
+			}
+		],
+	},
+	{
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "体育成绩",
+				"data": [
+					90,
+					95,
+					92,
+					70,
+					66,
+					99
+				]
+			},
+			{
+				"name": "班级平均",
+				"data": [
+					85,
+					88,
+					84,
+					92,
+					83,
+					89
+				]
+			},
+			{
+				"name": "年纪平均",
+				"data": [
+					88,
+					79,
+					87,
+					74,
+					55,
+					89
+				]
+			}
+		],
+	},
+	{
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "思品成绩",
+				"data": [
+					90,
+					95,
+					92,
+					60,
+					88,
+					72
+				]
+			},
+			{
+				"name": "班级平均",
+				"data": [
+					85,
+					88,
+					84,
+					92,
+					93,
+					79
+				]
+			},
+			{
+				"name": "年纪平均",
+				"data": [
+					88,
+					79,
+					77,
+					74,
+					55,
+					89
+				]
+			}
+		],
+	},
+]
+
+const rankData = [
+	{
+		name: "语文",
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "超过年级中",
+				"data": [
+					90,
+					95,
+					82,
+					76,
+					88,
+					99
+				]
+			},
+			{
+				"name": "超过班级中",
+				"data": [
+					95,
+					58,
+					64,
+					92,
+					93,
+					79
+				]
+			}
+		]
+	},
+	{
+		name: "数学",
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "超过年级中",
+				"data": [
+					90,
+					95,
+					82,
+					76,
+					88,
+					99
+				]
+			},
+			{
+				"name": "超过班级中",
+				"data": [
+					95,
+					58,
+					88,
+					92,
+					93,
+					79
+				]
+			}
+		]
+	},
+	{
+		name: "英语",
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "超过年级中",
+				"data": [
+					90,
+					74,
+					82,
+					66,
+					77,
+					99
+				]
+			},
+			{
+				"name": "超过班级中",
+				"data": [
+					95,
+					89,
+					64,
+					75,
+					93,
+					92
+				]
+			}
+		]
+	},
+	{
+		name: "思品",
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "超过年级中",
+				"data": [
+					80,
+					91,
+					82,
+					76,
+					55,
+					99
+				]
+			},
+			{
+				"name": "超过班级中",
+				"data": [
+					95,
+					92,
+					69,
+					92,
+					93,
+					55
+				]
+			}
+		]
+	},
+	{
+		name: "体育",
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "超过年级中",
+				"data": [
+					90,
+					33,
+					82,
+					45,
+					88,
+					99
+				]
+			},
+			{
+				"name": "超过班级中",
+				"data": [
+					95,
+					99,
+					64,
+					77,
+					93,
+					79
+				]
+			}
+		]
+	},
+	{
+		name: "科学",
+		categories: [
+			"开学考试",
+			"第一月考",
+			"第二月考",
+			"期中考试",
+			"第三月考",
+			"期末考试"
+		],
+		series: [{
+				"name": "超过年级中",
+				"data": [
+					50,
+					95,
+					55,
+					76,
+					66,
+					99
+				]
+			},
+			{
+				"name": "超过班级中",
+				"data": [
+					30,
+					58,
+					64,
+					92,
+					22,
+					79
+				]
+			}
+		]
+	},
+]
+
+const classData = {
+	"周四":[{
+		title: '文章鉴赏',
+		name: '语文',
+		teacher: '王老师',
+		time: '09:00-09:50',
+		timeFrame: '上午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '计算练习',
+		name: '数学',
+		teacher: '李老师',
+		time: '09:50-10:50',
+		timeFrame: '上午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '阅读专项训练',
+		name: '外语',
+		teacher: '张老师',
+		time: '10:50-11:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '思想品德教育',
+		name: '思品',
+		teacher: '史老师',
+		time: '11:50-14:50',
+		timeFrame: '下午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '户外运动锻炼',
+		name: '体育',
+		teacher: '李老师',
+		time: '14:50-17:55',
+		timeFrame: '下午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '科学学习实验',
+		name: '科学',
+		teacher: '张老师',
+		time: '17:55-20:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '随堂测验',
+		name: '数学',
+		teacher: '李老师',
+		time: '20:50-21:50',
+		timeFrame: '下午第四节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}],
+	"周五":[{
+		title: '计算练习',
+		name: '数学',
+		teacher: '李老师',
+		time: '09:00-09:50',
+		timeFrame: '上午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '文言文学习',
+		name: '语文',
+		teacher: '王老师',
+		time: '09:50-10:50',
+		timeFrame: '上午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '阅读专项训练',
+		name: '外语',
+		teacher: '张老师',
+		time: '10:50-11:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '思想品德教育',
+		name: '思品',
+		teacher: '史老师',
+		time: '11:50-14:50',
+		timeFrame: '下午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '户外运动锻炼',
+		name: '体育',
+		teacher: '李老师',
+		time: '14:50-17:55',
+		timeFrame: '下午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '科学学习实验',
+		name: '科学',
+		teacher: '张老师',
+		time: '17:55-20:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '随堂测验',
+		name: '数学',
+		teacher: '李老师',
+		time: '20:50-21:50',
+		timeFrame: '下午第四节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}],
+	"周六": '',
+	"周日": '',
+	"周一":[{
+		title: '阅读专项训练',
+		name: '英语',
+		teacher: '张老师',
+		time: '09:00-09:50',
+		timeFrame: '上午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '计算练习',
+		name: '数学',
+		teacher: '李老师',
+		time: '09:50-10:50',
+		timeFrame: '上午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '作文练习',
+		name: '语文',
+		teacher: '王老师',
+		time: '10:50-11:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '思想品德教育',
+		name: '思品',
+		teacher: '史老师',
+		time: '11:50-14:50',
+		timeFrame: '下午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '户外运动锻炼',
+		name: '体育',
+		teacher: '李老师',
+		time: '14:50-17:55',
+		timeFrame: '下午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '科学学习实验',
+		name: '科学',
+		teacher: '张老师',
+		time: '17:55-20:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '随堂测验',
+		name: '数学',
+		teacher: '李老师',
+		time: '20:50-21:50',
+		timeFrame: '下午第四节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}],
+	"周二":[{
+		title: '文章鉴赏',
+		name: '语文',
+		teacher: '王老师',
+		time: '09:00-09:50',
+		timeFrame: '上午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '计算练习',
+		name: '数学',
+		teacher: '李老师',
+		time: '09:50-10:50',
+		timeFrame: '上午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '阅读专项训练',
+		name: '外语',
+		teacher: '张老师',
+		time: '10:50-11:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '思想品德教育',
+		name: '思品',
+		teacher: '史老师',
+		time: '11:50-14:50',
+		timeFrame: '下午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '户外运动锻炼',
+		name: '体育',
+		teacher: '李老师',
+		time: '14:50-17:55',
+		timeFrame: '下午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '科学学习实验',
+		name: '科学',
+		teacher: '张老师',
+		time: '17:55-20:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '随堂测验',
+		name: '数学',
+		teacher: '李老师',
+		time: '20:50-21:50',
+		timeFrame: '下午第四节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}],
+	"周三":[{
+		title: '文章鉴赏',
+		name: '语文',
+		teacher: '王老师',
+		time: '09:00-09:50',
+		timeFrame: '上午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '计算练习',
+		name: '数学',
+		teacher: '李老师',
+		time: '09:50-10:50',
+		timeFrame: '上午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '阅读专项训练',
+		name: '外语',
+		teacher: '张老师',
+		time: '10:50-11:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '思想品德教育',
+		name: '思品',
+		teacher: '史老师',
+		time: '11:50-14:50',
+		timeFrame: '下午第一节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4',
+		attendance: true
+	}, {
+		title: '户外运动锻炼',
+		name: '体育',
+		teacher: '李老师',
+		time: '14:50-17:55',
+		timeFrame: '下午第二节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}, {
+		title: '科学学习实验',
+		name: '科学',
+		teacher: '张老师',
+		time: '17:55-20:50',
+		timeFrame: '上午第三节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4',
+		attendance: true
+	}, {
+		title: '随堂测验',
+		name: '数学',
+		teacher: '李老师',
+		time: '20:50-21:50',
+		timeFrame: '下午第四节',
+		resource: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg1.mp4',
+		attendance: true
+	}],
+}
+
+export default {
+	subjectData, //主要科目列表
+	rankData, //排行科目列表
+	classData, //课程数据列表
+}

+ 169 - 0
common/global_scss/pages_style.scss

@@ -0,0 +1,169 @@
+page{
+	background-color: $page-color;
+}
+.page_view{
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+	overflow-x: hidden; //隐藏多余的页面
+}
+.title{
+	line-height: 35rpx;
+	font-size: 35rpx;
+	font-weight: bold;
+	color: $title;
+}
+.subtitle{
+	line-height: 30rpx;
+	font-size: 30rpx;
+	font-weight: bold;
+	color: $subtitle;
+}
+.YS_title{
+	line-height: 35rpx;
+	font-size: 35rpx;
+	color: $title;
+	font-family: YSfont;
+}
+//标题头
+.front_tag {
+	margin-right: 20rpx;
+	height: 100%;
+	width: 10rpx;
+	border-radius: 100rpx;
+	background-image: linear-gradient(#4169E1, rgba(1,1,1,0));
+	z-index: 99;
+}
+//标题底
+.bottom_tag{
+	margin-top: -10rpx;
+	margin-left: 20%;
+	height: 20rpx;
+	width: 90%;
+	border-radius: 6rpx;
+	background-image: linear-gradient(to right, #4169E1, rgba(1,1,1,0));
+	z-index: -1;
+}
+//标签
+.tag {
+	border-radius: 50rpx;
+	border: 1rpx solid $color-blue;
+	padding: 2rpx 12rpx;
+
+	.tag_text {
+		font-size: 22rpx;
+		color: $color-blue;
+	}
+}
+//标签
+.tag_fill{
+	display: flex;
+	align-items: center;
+	border-radius: 6rpx;
+	background-color: $color-blue;
+	padding: 5rpx 16rpx;
+	.tag_text {
+		font-size: 24rpx;
+		color: #FFF;
+	}
+}
+//卡片
+.card_view {
+	display: flex;
+	flex-flow: row wrap;
+	margin: 20rpx;
+	justify-content: space-between;
+
+	.card_item {
+		margin: 2% 0;
+		width: 48%;
+		height: auto;
+		display: flex;
+		flex-direction: column;
+		background-color: #FFF;
+		border-radius: $border-radius;
+		overflow: hidden;
+		z-index: 55;
+
+		.card_title {
+			display: flex;
+			align-items: center;
+			padding: 20rpx;
+			z-index: 55;
+
+			.title {
+				font-size: 32rpx;
+				line-height: 40rpx;
+			}
+		}
+	}
+}
+//横向flex布局
+.flex_row{
+	display:flex;
+	align-items: center;
+}
+//竖向flex布局
+.flex_cloumn{
+	display:flex;
+	flex-direction: column;
+}
+//横向baseline布局
+.flex_baseline{
+	display: flex;
+	align-items: baseline;
+}
+//插画
+.detail_image {
+	width: 100%;
+	height: 450rpx;
+	background-size: cover; //背景图片自适应
+	background-repeat: no-repeat;
+	z-index: 50;
+}
+//图标
+.t-icon {
+    display: inline-block;
+    width: 40rpx; 
+    height: 40rpx;
+    background-repeat: no-repeat;
+    background-position: center;
+    background-size: 100%;
+}
+//头部背景
+	.bg_box {
+		position: fixed;
+		width: 100%;
+		height: 800rpx;
+		background-size: 100%;
+		background-repeat: no-repeat;
+		background-image: linear-gradient(to top, #f3f4f9, rgba(255, 255, 255, 0) 45%),url('https://image.meiye.art/pic_1628634662880');
+		// left: 50%;
+		// right: 50%;
+		// transform: translate(-50%, -30%);
+		// height: 1200rpx;
+		// width: 2300rpx;
+		// border-radius: 50%;
+		// transform: rotate(15deg);
+		// background: radial-gradient(100% 225% at 100% 0%, #FF4040 0%, #000000 100%), linear-gradient(236deg, #00C2FF 0%, #000000 100%), linear-gradient(135deg, #CDFFEB 0%, #CDFFEB 36%, #009F9D 36%, #009F9D 60%, #07456F 60%, #07456F 67%, #0F0A3C 67%, #0F0A3C 100%);
+		// background-blend-mode: overlay, hard-light, normal;
+	}
+	.bg_card{
+		position: fixed;
+		width: 100%;
+		height: 800rpx;
+		background-size: 100%;
+		background-repeat: no-repeat;
+		background-image: linear-gradient(to top, #f3f4f9, rgba(255, 255, 255, 0) 45%),url('https://image.meiye.art/pic_1628634712718');
+		
+// 		position: fixed;
+// 		left: 50%;
+// 		right: 50%;
+// 		transform: translate(-50%, -30%);
+// 		height: 1200rpx;
+// 		width: 2300rpx;
+// 		border-radius: 50%;
+// background: linear-gradient(140.54deg, #608D00 0%, #D30000 72.37%), linear-gradient(58.72deg, #0029FF 0%, #8FFF00 100%), radial-gradient(100% 164.72% at 100% 100%, #6100FF 0%, #00FF57 100%), radial-gradient(100% 148.07% at 0% 0%, #FFF500 0%, #51D500 100%);
+// background-blend-mode: color-dodge, overlay, difference, normal;
+	}

+ 20 - 0
common/global_scss/theme_style.scss

@@ -0,0 +1,20 @@
+//主题色
+$color-blue: #4169E1;
+$color-green: #23b46c;
+$color-pink: #ff8caf;
+$color-yellow: #f9c752;
+$color-red: #ff5959;
+$color-orange: #FF6D31;
+//次级色
+$subcolor-blue: #d8deff;
+//页面色
+$page-color: #f3f4f9;
+//字体色
+$title: #303133;
+$subtitle: #909399;
+//渐变
+$gradient-color: linear-gradient(to right, #4169E1, #d8deff );
+//卡片圆弧
+$border-radius: 12rpx;
+//阴影
+$box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.1);

+ 0 - 19
common/style.scss

@@ -1,19 +0,0 @@
-// 拟态阴影
-$box-shadow-stereo-white: 5px 5px 10px #f2f2f2,-5px -5px 10px #ffffff;
-//卡片背景
-$card-gradient-pink: linear-gradient(90deg, #d9515e, #e57e7b, #eea69a, #f3ceba);
-$card-gradient-blue: linear-gradient(90deg, #002971, #02449c, #0260c8, #007ef7);
-//页面背景
-$page-background-color: #F5F5F5;
-//主题色
-$color-mixblue: #4169E1;
-$color-blue: #3C9CFF;
-$color-camblue: #bdd2ef;
-$color-green: #23b46c;
-$color-pink: #ff8caf;
-$color-yellow: #f9c752;
-//字体色
-$color-title: #3B4144;
-$color-subtitle: #aaaaaa;
-//卡片圆弧
-$card-border-radius: 20rpx

+ 0 - 77
components/back/back.vue

@@ -1,77 +0,0 @@
-<template>
-	<view class="back" :style="{height: capsuleHeight+ 'px',top:capsuleHighly+'px'}">
-		<u-icon name="arrow-left" v-if="show" :color="color" size="24" @click="backIconHandler"></u-icon>
-		<u-icon name="home-fill" v-if="!show" :color="color" size="24" @click="backHomeHandler"></u-icon>
-		<view class="back-text" :style="{color: color}">
-			{{ text }}
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "back",
-		props:{
-			text:{
-				type:String,
-				default:''
-			},
-			color:{
-				type:String,
-				default:'#3B4144'
-			},
-			show:{
-				type:Boolean,
-				default: true
-			}
-		},
-		data() {
-			return {
-				//胶囊高度
-				capsuleHeight: 0,
-				//
-				capsuleHighly: 0,
-			};
-		},
-		created() {
-			this.getCapsuleSite()
-		},
-		methods:{
-			backIconHandler(){
-				uni.navigateBack()
-			},
-			backHomeHandler(){
-				uni.switchTab({
-					url: '/pages/home/home'
-				})
-			},
-			//获取胶囊位置信息
-			getCapsuleSite(){
-				let res=uni.getMenuButtonBoundingClientRect()
-				this.capsuleHeight = res.height
-				this.capsuleHighly = res.top 
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.back {
-		position: relative;
-		padding: 0 0 120rpx 20rpx;
-		display: flex;
-		align-items: center;
-		z-index: 99;
-
-		.t-icon {
-			width: 35rpx;
-			height: 35rpx;
-		}
-		
-		.back-text{
-			font-size: 40rpx;
-			font-weight: bold;
-			margin:0 0 4rpx 20rpx;
-		}
-	}
-</style>

+ 0 - 392
components/interactive-box/interactive-box.vue

@@ -1,392 +0,0 @@
-<template>
-	<!-- 今日记录模块 -->
-	<view class="module-container">
-		<u-tabs :list="list" :current="current" @change="changeModule"
-			:activeStyle="{color: '#4169E1',fontWeight: 'bold',transform: 'scale(1.08)',}"
-			:inactiveStyle="{fontWeight: 'bold',transform: 'scale(1)'}" lineColor="#4169E1" lineWidth="60"></u-tabs>
-
-		<!-- 记录模块 -->
-		<view class="module-box" v-if="current == 0">
-			<view class="module-item" v-for="(item,index) in moduleData" :key="index" :style="item.color"
-				@click="setTime(index)">
-				<view class="module-item-box">
-					<text class="module-item-text">{{item.text}}</text>
-					<view class="num-box">
-						
-						<view style="display: flex;align-items: baseline;" v-if="item.numData === '记录一下'">
-							<text class="module-item-num">记录</text>
-							<text class="module-item-num" style="font-size: 30rpx;opacity:0.8;margin-left: 6rpx">今日时长</text>
-						</view>
-						<view style="display: flex;align-items: baseline;" v-else>
-							<text class="module-item-num">{{item.numData.split('小时')[0]}}</text>
-							<text class="module-item-num" style="font-size: 30rpx;opacity:0.8;margin-left: 6rpx">小时</text>
-							<text class="module-item-num" style="margin-left: 6rpx">{{item.numData.split('小时')[1].replace('分','')}}</text>
-							<text class="module-item-num" style="font-size: 30rpx;opacity:0.8;margin-left: 6rpx">分钟</text>
-						</view>
-					</view>
-					<view :class="item.icon"></view>
-				</view>
-			</view>
-		</view>
-
-		<!-- 记录表 -->
-		<view class="module-box" v-if="current == 1">
-			<view class="chart-item" style="width: 100%;">
-				<view class="chart-info">
-					<view class="t-icon t-icon-shuju1"></view>
-					<text class="chart-info-text">近七天学习记录</text>
-				</view>
-				<view style=" width:100%; margin-top: -30rpx;">
-					<qiun-data-charts type="column" :chartData="studyColumn" :loadingType="4"
-						tooltipFormat='tooltipHourColum' :canvas2d="true" canvasId="canvasId9839618" />
-				</view>
-			</view>
-
-			<view class="chart-item">
-				<view class="chart-info">
-					<view class="t-icon t-icon-tiyu"></view>
-					<text class="chart-info-text">近七天运动</text>
-				</view>
-				<view class="chart-view">
-					<qiun-data-charts type="pie" :chartData="exercisePie" :loadingType="4" tooltipFormat='pieMinute'
-						:canvas2d="true" canvasId="canvasId91234111" />
-				</view>
-			</view>
-
-			<view class="chart-item">
-				<view class="chart-info">
-					<view class="t-icon t-icon-yejian"></view>
-					<text class="chart-info-text">近七天睡眠</text>
-				</view>
-				<view class="chart-view">
-					<qiun-data-charts type="pie" :chartData="sleepRing" :loadingType="4" tooltipFormat='pieHour' :canvas2d="true" canvasId="canvasId6312231" />
-				</view>
-			</view>
-
-			<view class="chart-item" style="width: 100%;">
-				<view class="chart-info">
-					<view class="t-icon t-icon-qingjiashenqing"></view>
-					<text class="chart-info-text">运动睡眠对比</text>
-				</view>
-				<view style=" width:100%;margin-top: -30rpx;height: 420rpx;">
-					<qiun-data-charts type="area" :chartData="exerciseSleepArea" :loadingType="4"
-						tooltipFormat='sleepExerciseCom' :canvas2d="true" canvasId="canvasId983131231" />
-				</view>
-			</view>
-
-		</view>
-		<!-- 时间选择器 -->
-		<u-picker :show="setTimePicker" :columns="pickerList" ref="uPicker" @confirm="pickerConfirm"
-			@cancel="pickerCancel" :closeOnClickOverlay="true" :immediateChange="true">
-		</u-picker>
-	</view>
-
-</template>
-
-<script>
-	export default {
-		name: "interactive-box",
-		data() {
-			return {
-				//学习记录表
-				studyColumn: {},
-				//锻炼时间表
-				exercisePie: {},
-				//睡眠时间表
-				sleepRing: {},
-				//运动睡眠比
-				exerciseSleepArea: {},
-				//模块名
-				list: [{
-					name: '每日记录'
-				}, {
-					name: '记录分析'
-				}],
-				//当前模块
-				current: 0,
-				//记录卡片
-				moduleData: [{
-						text: '学习时长',
-						color: 'background-color: #4169E1;',
-						icon: 't-icon t-icon-bianjibi',
-						numData: '记录一下',
-					},
-					{
-						text: '娱乐时长',
-						color: 'background-color: #ff5959;',
-						icon: 't-icon t-icon-leimucuyule',
-						numData: '记录一下',
-					},
-					{
-						text: '运动时长',
-						color: 'background-color: #ff8caf;',
-						icon: 't-icon t-icon-yundong',
-						numData: '记录一下',
-					},
-					{
-						text: '睡眠时长',
-						color: 'background-color: #f9c752;',
-						icon: 't-icon t-icon-a-icon_wananyueliangshuimian',
-						numData: '记录一下',
-					}
-				],
-				//当前记录卡片
-				cardCurrent: 5,
-				//选择器
-				setTimePicker: false,
-				//时间表
-				pickerList: [
-					['0小时', '1小时', '2小时', '3小时', '4小时', '5小时', '6小时', '7小时', '8小时', '9小时', '10小时'],
-					['5分', '10分', '15分', '20分', '25分', '30分', '35分', '40分', '45分', '50分', '55分']
-				],
-				//历史数据
-				historyData: {
-					study: [2, 3, 2.5, 3, 2, 1, 3],
-					rest: [1, 2, 0.5, 3, 0.5, 3.5, 2],
-					exercise: [0.1, 0.2, 0.5, 0.3, 0.5, 1.5, 0.2],
-					sleep: [8, 9, 8, 8.5, 7.8, 8, 7.6]
-				},
-
-			};
-		},
-		created() {
-			this.saveToStudyChart()
-		},
-		methods: {
-			//更改模块
-			changeModule(index) {
-				this.current = index.index
-			},
-			//点击卡片唤起picker
-			setTime(index) {
-				if (this.moduleData[index].numData === '记录一下') {
-					this.cardCurrent = index
-					this.setTimePicker = true
-				} else {
-					uni.$showMsg('今日已记录,明日再来吧')
-				}
-
-			},
-			//记录数据
-			pickerConfirm(e) {
-				if (e.value[0] === '0小时') {
-					this.moduleData[this.cardCurrent].numData = e.value[1]
-				} else {
-					this.moduleData[this.cardCurrent].numData = e.value[0] + e.value[1]
-				}
-				//转换为数据记录到图表中
-				if (this.moduleData[this.cardCurrent].numData.search('小时') == -1) {
-					let timeData = parseFloat((parseInt(this.moduleData[this.cardCurrent].numData.replace('分', '')) / 60)
-						.toFixed(1))
-					switch (this.cardCurrent) {
-						case 0:
-							this.historyData.study.push(timeData)
-							this.historyData.study.shift()
-							break
-						case 1:
-							this.historyData.rest.push(timeData)
-							this.historyData.rest.shift()
-							break
-						case 2:
-							let numExercise = parseInt(this.moduleData[this.cardCurrent].numData.replace('分', '')) / 60
-							this.historyData.exercise.push(numExercise)
-							this.historyData.exercise.shift()
-							console.log(this.historyData.exercise);
-							break
-						case 3:
-							this.historyData.sleep.push(timeData)
-							this.historyData.sleep.shift()
-							console.log(this.historyData.sleep);
-							break
-					}
-					this.saveToStudyChart()
-				} else {
-					let timeTemp = this.moduleData[this.cardCurrent].numData.replace('小时', '.').replace('分', '').split('.')
-					let timeData = parseInt(timeTemp[0]) + parseFloat((timeTemp[1] / 60).toFixed(1))
-					switch (this.cardCurrent) {
-						case 0:
-							this.historyData.study.push(timeData)
-							this.historyData.study.shift()
-							break
-						case 1:
-							this.historyData.rest.push(timeData)
-							this.historyData.rest.shift()
-							break
-						case 2:
-							this.historyData.exercise.push(timeData)
-							this.historyData.exercise.shift()
-							console.log(this.historyData.exercise);
-							break
-						case 3:
-							this.historyData.sleep.push(timeData)
-							this.historyData.sleep.shift()
-							console.log(this.historyData.sleep);
-							break
-					}
-					this.saveToStudyChart()
-				}
-				uni.$showMsg('记录完成', 1000)
-				this.setTimePicker = false
-			},
-			//取消
-			pickerCancel() {
-				uni.$showMsg('取消选择', 1000)
-				this.setTimePicker = false
-			},
-			//记录到图表
-			saveToStudyChart() {
-				let studyColumn = {
-					categories: [],
-					series: [{
-							name: '自主学习',
-							data: this.historyData.study
-						},
-						{
-							name: '娱乐放松',
-							data: this.historyData.rest
-						}
-					]
-				}
-				//时间
-				studyColumn.categories = this.$getRecentDateArray(this.historyData.study.length)
-				//学习记录表数据记录
-				switch (this.cardCurrent) {
-					case 0:
-						studyColumn.series[0].data = this.historyData.study
-						break
-					case 1:
-						studyColumn.series[1].data = this.historyData.rest
-						break
-				}
-				//学习记录表赋值
-				this.studyColumn = studyColumn
-				//运动记录表
-				let exercisePie = {
-					series: [{
-						data: [{}, {}, {}, {}, {}, {}, {}]
-					}]
-				}
-				//睡眠记录表
-				let sleepRing = {
-					series: [{
-						data: [{}, {}, {}, {}, {}, {}, {}]
-					}]
-				}
-				studyColumn.categories.forEach((value, index) => {
-					exercisePie.series[0].data[index].name = value
-					exercisePie.series[0].data[index].value = parseFloat((this.historyData.exercise[index] * 60)
-						.toFixed(1))
-					sleepRing.series[0].data[index].name = value
-					sleepRing.series[0].data[index].value = this.historyData.sleep[index]
-				})
-				this.exercisePie = exercisePie
-				this.sleepRing = sleepRing
-
-				let exerciseSleepArea = {
-					categories: [],
-					series: [{
-						name: "运动睡眠时间比",
-						data: []
-					}]
-				}
-				exerciseSleepArea.categories = this.$getRecentDateArray(this.historyData.sleep.length)
-				let tempArr = []
-				for (let i = 0; i < this.historyData.sleep.length; i++) {
-					let num = parseFloat(((this.historyData.exercise[i] / this.historyData.sleep[i]) * 100).toFixed(1))
-					tempArr.push(num)
-				}
-				exerciseSleepArea.series[0].data = tempArr
-				this.exerciseSleepArea = exerciseSleepArea
-			}
-
-		}
-	}
-</script>
-
-<style lang="scss">
-	.module-container {
-		margin: -25rpx 20rpx 0 20rpx;
-	}
-
-	.module-box {
-		display: flex;
-		flex-direction: row;
-		flex-wrap: wrap;
-		justify-content: space-between;
-
-		.module-item {
-			margin: 2% 0;
-			display: flex;
-			flex-direction: column;
-			background-color: #FFFFFF;
-			border-radius: $card-border-radius;
-			width: 48%;
-			height: auto;
-			overflow: hidden;
-
-			.module-item-box {
-				padding: 35rpx 30rpx 20rpx 30rpx;
-				width: 100%;
-				display: flex;
-				flex-direction: column;
-				justify-content: space-around;
-				height: 160rpx;
-
-				.t-icon {
-					width: 250rpx;
-					height: 250rpx;
-					margin: -250rpx 0 0 160rpx;
-					z-index: 1;
-				}
-			}
-		}
-	}
-
-	.module-item-text {
-		color: #FFF;
-		font-size: 30rpx;
-		font-weight: bold;
-		z-index: 5;
-	}
-
-	.num-box {
-		margin-top: 20rpx;
-		z-index: 5;
-
-		.module-item-num {
-			color: #FFF;
-			font-size: 50rpx;
-			font-weight: bold;
-		}
-	}
-
-	.chart-item {
-		margin: 2% 0;
-		display: flex;
-		flex-direction: column;
-		justify-content: space-between;
-		background-color: #FFF;
-		// box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.05);
-		border-radius: $card-border-radius;
-		width: 48%;
-		height: auto;
-
-		.chart-info {
-			display: flex;
-			align-items: center;
-			padding: 20rpx;
-
-			.chart-info-text {
-				font-size: 30rpx;
-				font-weight: bold;
-				color: $color-title;
-				margin-left: 10rpx;
-			}
-		}
-
-		.chart-view {
-			height: 320rpx;
-			width: 100%;
-		}
-	}
-</style>

+ 145 - 0
components/loading/loading.vue

@@ -0,0 +1,145 @@
+<template>
+	<view class="flex">
+		<view class="sk-folding-cube">
+			<view class="sk-cube1 sk-cube"></view>
+			<view class="sk-cube2 sk-cube"></view>
+			<view class="sk-cube4 sk-cube"></view>
+			<view class="sk-cube3 sk-cube"></view>
+		</view>
+		<view class="YS_title" style="margin-top: 20rpx;color: #555555;">正在加载中...</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "loading",
+		data() {
+			return {
+
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+	.flex {
+		width: 100vw;
+		height: 100vh;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.sk-folding-cube {
+		margin: 20px auto;
+		width: 40px;
+		height: 40px;
+		position: relative;
+		-webkit-transform: rotateZ(45deg);
+		transform: rotateZ(45deg);
+	}
+
+	.sk-folding-cube .sk-cube {
+		float: left;
+		width: 50%;
+		height: 50%;
+		position: relative;
+		-webkit-transform: scale(1.1);
+		-ms-transform: scale(1.1);
+		transform: scale(1.1);
+	}
+
+	.sk-folding-cube .sk-cube:before {
+		content: '';
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		background-color: #555555;
+		-webkit-animation: sk-foldCubeAngle 2.4s infinite linear both;
+		animation: sk-foldCubeAngle 2.4s infinite linear both;
+		-webkit-transform-origin: 100% 100%;
+		-ms-transform-origin: 100% 100%;
+		transform-origin: 100% 100%;
+	}
+
+	.sk-folding-cube .sk-cube2 {
+		-webkit-transform: scale(1.1) rotateZ(90deg);
+		transform: scale(1.1) rotateZ(90deg);
+	}
+
+	.sk-folding-cube .sk-cube3 {
+		-webkit-transform: scale(1.1) rotateZ(180deg);
+		transform: scale(1.1) rotateZ(180deg);
+	}
+
+	.sk-folding-cube .sk-cube4 {
+		-webkit-transform: scale(1.1) rotateZ(270deg);
+		transform: scale(1.1) rotateZ(270deg);
+	}
+
+	.sk-folding-cube .sk-cube2:before {
+		-webkit-animation-delay: 0.3s;
+		animation-delay: 0.3s;
+	}
+
+	.sk-folding-cube .sk-cube3:before {
+		-webkit-animation-delay: 0.6s;
+		animation-delay: 0.6s;
+	}
+
+	.sk-folding-cube .sk-cube4:before {
+		-webkit-animation-delay: 0.9s;
+		animation-delay: 0.9s;
+	}
+
+	@-webkit-keyframes sk-foldCubeAngle {
+
+		0%,
+		10% {
+			-webkit-transform: perspective(140px) rotateX(-180deg);
+			transform: perspective(140px) rotateX(-180deg);
+			opacity: 0;
+		}
+
+		25%,
+		75% {
+			-webkit-transform: perspective(140px) rotateX(0deg);
+			transform: perspective(140px) rotateX(0deg);
+			opacity: 1;
+		}
+
+		90%,
+		100% {
+			-webkit-transform: perspective(140px) rotateY(180deg);
+			transform: perspective(140px) rotateY(180deg);
+			opacity: 0;
+		}
+	}
+
+	@keyframes sk-foldCubeAngle {
+
+		0%,
+		10% {
+			-webkit-transform: perspective(140px) rotateX(-180deg);
+			transform: perspective(140px) rotateX(-180deg);
+			opacity: 0;
+		}
+
+		25%,
+		75% {
+			-webkit-transform: perspective(140px) rotateX(0deg);
+			transform: perspective(140px) rotateX(0deg);
+			opacity: 1;
+		}
+
+		90%,
+		100% {
+			-webkit-transform: perspective(140px) rotateY(180deg);
+			transform: perspective(140px) rotateY(180deg);
+			opacity: 0;
+		}
+	}
+</style>

+ 0 - 493
components/task-box/task-box.vue

@@ -1,493 +0,0 @@
-<template>
-	<view class="module-container">
-		<!-- 评测 -->
-		<view class="card" style="background-color:#4169e1" v-if="current == 0">
-			<view class="box">
-				<view class="flex">
-					<text class="card-title">今日评测:</text>
-					<view class="flex-line">
-						<text class="card-title" style="margin-left: 20rpx;">{{testData.length}}</text>
-						<text class="unit">例</text>
-					</view>
-				</view>
-				<view class="box" style="margin: 10rpx 0 0 0;">
-					<view class="flex">
-						<view class="tag"></view>
-						<text class="card-subtitle">已完成:</text>
-						<view class="flex-line">
-							<text class="fin-number">{{testFinish}}</text>
-							<text class="unit">例</text>
-						</view>
-					</view>
-					<view class="flex">
-						<view class="tag"></view>
-						<text class="card-subtitle">完成情况:</text>
-						<text class="card-subtitle" style="font-weight: bold;opacity: 0.8;">{{list[0].level}}</text>
-					</view>
-				</view>
-			</view>
-			<view class="image" :style="{backgroundImage:`url(${list[0].image})`}"></view>
-		</view>
-		<!-- 作业 -->
-		<view class="card" style="background-color:#ff8caf" v-if="current == 1">
-			<view class="box">
-				<view class="flex">
-					<text class="card-title">今日作业:</text>
-					<view class="flex-line">
-						<text class="card-title" style="margin-left: 20rpx;">{{homeworkData.length}}</text>
-						<text class="unit">例</text>
-					</view>
-				</view>
-				<view class="box" style="margin: 10rpx 0 0 0;">
-					<view class="flex">
-						<view class="tag"></view>
-						<text class="card-subtitle">已完成:</text>
-						<view class="flex-line">
-							<text class="fin-number">{{homeworkFinish}}</text>
-							<text class="unit">例</text>
-						</view>
-					</view>
-					<view class="flex">
-						<view class="tag"></view>
-						<text class="card-subtitle">完成情况:</text>
-						<text class="card-subtitle" style="font-weight: bold;opacity: 0.8;">{{list[1].level}}</text>
-					</view>
-				</view>
-			</view>
-			<view class="image" :style="{backgroundImage:`url(${list[1].image})`}"></view>
-		</view>
-		<!-- 活动 -->
-		<view class="card" style="background-color:#f9c752" v-if="current == 2">
-			<view class="box">
-				<view class="flex">
-					<text class="card-title">今日活动:</text>
-					<view class="flex-line">
-						<text class="card-title" style="margin-left: 20rpx;">{{activityData.length}}</text>
-						<text class="unit">例</text>
-					</view>
-				</view>
-				<view class="box" style="margin: 10rpx 0 0 0;">
-					<view class="flex">
-						<view class="tag"></view>
-						<text class="card-subtitle">已完成:</text>
-						<view class="flex-line">
-							<text class="fin-number">{{activityFinish}}</text>
-							<text class="unit">例</text>
-						</view>
-					</view>
-					<view class="flex">
-						<view class="tag"></view>
-						<text class="card-subtitle">完成情况:</text>
-						<text class="card-subtitle" style="font-weight: bold;opacity: 0.8;">{{list[2].level}}</text>
-					</view>
-				</view>
-			</view>
-			<view class="image" :style="{backgroundImage:`url(${list[2].image})`}"></view>
-		</view>
-		<!-- 插槽传入内容 -->
-		<slot name="center-slot"></slot>
-		<!-- 列表 -->
-		<view class="detail-box">
-			<!-- 图表模块 -->
-			<view class="detail-box-item" v-if="current == 1">
-				<view class="item-info">
-					<view class="t-icon t-icon-ceping"></view>
-					<view class="item-text">完成率统计</view>
-				</view>
-				<view class="charts-box">
-					<qiun-data-charts type="mount" :chartData="taskData" :loadingType="4"
-						:canvas2d='true' tooltipFormat='HomeworkPercent' canvasId='canvans0933511'/>
-				</view>
-			</view>
-			<!-- 详情列表 -->
-			<!-- 评测 -->
-			<view class="detail-box-item" v-if="current == 0" @click="navListData">
-				<view class="item-info">
-					<view class="t-icon t-icon-daiban"></view>
-					<view class="item-text">评测列表</view>
-				</view>
-				<view style="margin-bottom: 20rpx;">
-					<view class="block-box" v-for="(item,i) in testData" :key="i">
-						<view class="tag-index" style="background-image: linear-gradient(#4169E1, #FFF);">
-						</view>
-						<view class="class-block" style="width: 85%;">
-							<view style="width: 40%;">
-								<view class="list-item-title">{{item.examInfo.name}}</view>
-							</view>
-
-							<view style=" display: flex; justify-content: space-between; width: 50%;">
-								<view class="block-tag-box">
-									<view class="block-tag">
-										{{item.examInfo.subjects[0].name}}
-									</view>
-								</view>
-								<view class="block-tag-box">
-									<view class="block-tag">
-										{{item.examInfo.examType.name}}
-									</view>
-								</view>
-								<view class="block-tag-box"
-									:style="{borderColor: item.examInfo.progress === 'finish'? '#23b46c':'#4169E1'}">
-									<view class="block-tag"
-										:style="{color: item.examInfo.progress === 'finish'? '#23b46c':'#4169E1'}">
-										{{item.examInfo.progress === 'finish' ? '已完成' : '进行中'}}
-									</view>
-								</view>
-							</view>
-						</view>
-					</view>
-				</view>
-			</view>
-			<!-- 作业 -->
-			<view class="detail-box-item" v-if="current == 1" @click="navListData">
-				<view class="item-info">
-					<view class="t-icon t-icon-daiban"></view>
-					<view class="item-text">作业列表</view>
-				</view>
-				<view style="margin-bottom: 20rpx;">
-					<view class="block-box" v-for="(item,i) in homeworkData" :key="i">
-						<view class="tag-index" style="background-image: linear-gradient(#ff8caf, #FFF);">
-						</view>
-						<view class="class-block" style="width: 85%;justify-content: flex-start;">
-							<view style="display: flex; flex-direction: column;">
-
-								<view style="display: flex;margin-left: 30rpx;align-items: center;">
-									<view class="list-item-title">{{item.work.name}}</view>
-									<view class="block-tag-box"
-										:style="{marginLeft: 40+'rpx',borderColor:'#ff8caf'}">
-										<view class="block-tag"
-											:style="{color:'#ff8caf'}">
-											{{item.work.scope === 'private' ? '个人':'学校'}}作业
-										</view>
-									</view>
-									<view class="block-tag-box"
-										:style="{marginLeft: 20+'rpx',borderColor: item.work.progress === 'finish'? '#23b46c':'#ff8caf'}">
-										<view class="block-tag"
-											:style="{color: item.work.progress === 'finish'? '#23b46c':'#ff8caf'}">
-											{{item.work.progress === 'finish' ? '已完成' : '进行中'}}
-										</view>
-									</view>
-								</view>
-								<rich-text class="block-subtitle" style="margin:10rpx 0 0 30rpx;"
-									:nodes="item.work.description"></rich-text>
-							</view>
-						</view>
-					</view>
-				</view>
-			</view>
-			<!-- 活动 -->
-			<view class="detail-box-item" v-if="current == 2" @click="navListData">
-				<view class="item-info">
-					<view class="t-icon t-icon-daiban"></view>
-					<view class="item-text">活动列表</view>
-				</view>
-				<view style="margin-bottom: 20rpx;">
-					<view class="block-box" v-for="(item,i) in activityData" :key="i">
-						<view class="tag-index" style="background-image: linear-gradient(#f9c752, #FFF);">
-						</view>
-						<view class="class-block" style="width: 85%;justify-content: flex-start;">
-							<view style="display: flex; flex-direction: column;">
-								<view style="display: flex;margin-left: 30rpx;align-items: center;">
-									<view class="list-item-title">
-										{{item.survey.name || item.vote.name}}
-									</view>
-
-									<view class="block-tag-box"
-										:style="{ marginLeft: 40+'rpx',borderColor:'#f9c752'}">
-										<view class="block-tag"
-											:style="{color:'#f9c752'}">
-											{{item.survey.scope === 'private' ? '个人':'学校' || item.vote.scope === 'private' ? '个人':'学校'}}活动
-										</view>
-									</view>
-									<view class="block-tag-box"
-										:style="{ marginLeft: 20+'rpx',borderColor: item.survey.progress === 'finish' || item.vote.progress === 'finish'? '#23b46c':'#f9c752'}">
-										<view class="block-tag"
-											:style="{color: item.survey.progress === 'finish' || item.vote.progress === 'finish'? '#23b46c':'#f9c752'}">
-											{{item.survey.progress === 'finish' || item.vote.progress === 'finish' ? '已完成' : '进行中'}}
-										</view>
-									</view>
-								</view>
-
-								<rich-text class="block-subtitle" style="margin:10rpx 0 0 30rpx;"
-									:nodes="item.vote.description || item.survey.description"></rich-text>
-							</view>
-						</view>
-					</view>
-				</view>
-			</view>
-		</view>
-		<!-- 插槽传入内容 -->
-		<slot name="end-slot"></slot>
-	</view>
-
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		name: "task-box",
-		computed: {
-			//单独作业图表数据
-			...mapState('m_chart', ['taskData']),
-		},
-		props: {
-			//当前模块
-			current: {
-				type: Number,
-				default () {
-					return 1
-				}
-			},
-		},
-		data() {
-			return {
-				//模块名
-				list: [{
-					name: '评测详情',
-					level: '',
-					image: 'https://ouch-cdn2.icons8.com/yFl5NWU3aVehLBlQf9ctvnZPqtm5U0hqM3IzWvFDCaQ/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvNzY5/LzY1ZTQxZmZjLTg1/YWQtNDYyMi1hYzU0/LWQ3NDEzZmY2NGI1/YS5wbmc.png',
-				}, {
-					name: '作业详情',
-					level: '',
-					image: 'https://ouch-cdn2.icons8.com/AVOwJ9emg_ZOeHvQaunQAZlgeLsG-b1cGhiYvgoJ06g/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvNTAw/LzI5YjU1YWQ4LWMw/YTEtNDE1MS1iYmQw/LWIyMDdhYmRkOTE0/Mi5wbmc.png',
-				}, {
-					name: '活动详情',
-					level: '',
-					image: 'https://ouch-cdn2.icons8.com/LW70TMgW1cGfYeGNSTEp7__kiKVgIhwdZwUmykdLYMY/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvOTI0/LzU3MWU4ZDZkLTg0/NzEtNGM5YS04MDJk/LTEzNTM5YmZmZTM2/YS5wbmc.png',
-				}],
-				//页面数据内容
-				testData: {},
-				homeworkData: {},
-				activityData: {},
-				//完成内容
-				testFinish: '',
-				homeworkFinish: '',
-				activityFinish: '',
-				//作业完成率记录
-				historyHomeworkChart: [80,60,66,79,55,20,40]
-			};
-		},
-		created(options) {
-			this.init()
-		},
-		methods: {
-			...mapMutations('m_chart', ['updateHomeworkFinChart']),
-			...mapMutations('m_children', ['updateDetailList', 'updateDetail']),
-			//初始化页面
-			init() {
-				this.$initHomework()
-				this.getLevel()
-				this.saveToStudyChart()
-			},
-			//获得评判信息
-			getLevel() {
-				this.list[0].level = this.testFinish / this.testData.length >= 0.4 ?
-					(this.testFinish / this.testData.length >= 0.7 ? '优秀' : '良好') : '较差'
-				this.list[1].level = this.homeworkFinish / this.homeworkData.length >= 0.4 ?
-					(this.homeworkFinish / this.homeworkData.length >= 0.7 ? '优秀' : '良好') : '较差'
-				this.list[2].level = this.activityFinish / this.activityData.length >= 0.4 ?
-					(this.activityFinish / this.activityData.length >= 0.7 ? '优秀' : '良好') : '较差'
-			},
-			//记录完成率到图表
-			saveToStudyChart(){
-				this.historyHomeworkChart.push(parseInt(this.homeworkFinish * 100 / this.homeworkData.length))
-				if(this.historyHomeworkChart.length>7)
-				this.historyHomeworkChart.shift()
-				let temp = {
-					series: [{
-						data: []
-					}]
-				}
-				let dateArray = this.$getRecentDateArray(this.historyHomeworkChart.length)
-				for (let i = 0 ;i<this.historyHomeworkChart.length; i++) {
-					let item = {
-						name: dateArray[i],
-						value: this.historyHomeworkChart[i]
-					}
-					temp.series[0].data.push(item)
-				}
-				this.updateHomeworkFinChart(temp)
-			},
-			//导航到详情页面
-			navListData() {
-				if (this.current === 0) {
-					this.updateDetailList(this.testData)
-					uni.navigateTo({
-						url: `/subpkg/detaillist/examlist`
-					})
-				}
-				if (this.current === 1) {
-					this.updateDetailList(this.homeworkData)
-					uni.navigateTo({
-						url: `/subpkg/detaillist/homeworklist`
-					})
-				}
-				if (this.current === 2) {
-					this.updateDetailList(this.activityData)
-					uni.navigateTo({
-						url: `/subpkg/detaillist/activitylist`
-					})
-				}
-			},
-			//导航到单条数据页面
-			navSingleData(item) {
-				if (this.current === 0) {
-					this.updateDetail(item)
-					console.log(item);
-					uni.navigateTo({
-						url: `/subpkg/detail/exam`
-					})
-				}
-				if (this.current === 1) {
-					this.updateDetail(item)
-					console.log(item);
-					uni.navigateTo({
-						url: `/subpkg/detail/homework`
-					})
-				}
-				if (this.current === 2) {
-					this.updateDetail(item)
-					console.log(item);
-					uni.navigateTo({
-						url: `/subpkg/detail/activity`
-					})
-				}
-			}
-
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/pages/common/blockmsg.scss';
-
-	.list-item-title {
-		font-size: 30rpx;
-		font-weight: bold;
-		color: $color-title;
-	}
-
-	//模块
-	.module-container {
-		margin-top: -70rpx;
-
-		//头部卡片
-		.card {
-			display: flex;
-			justify-content: space-around;
-			margin: 20rpx auto 20rpx auto;
-			height: 220rpx;
-			width: 710rpx;
-			// background: linear-gradient(to right, #ff95007a,#ff8419);
-			border-radius: $card-border-radius;
-
-			.card-title {
-				font-size: 50rpx;
-				font-weight: bold;
-				color: #FFF;
-			}
-
-			.card-subtitle {
-				margin-left: 20rpx;
-				font-size: 30rpx;
-				color: #FFF;
-			}
-
-			.unit {
-				margin-left: 10rpx;
-				font-size: 30rpx;
-				opacity: 0.8;
-				color: #FFF;
-			}
-
-			.fin-number {
-				margin-left: 20rpx;
-				font-size: 36rpx;
-				font-weight: bold;
-				color: #FFF;
-			}
-
-			.image {
-				position: relative;
-				top: -80rpx;
-				right: -40rpx;
-				height: 300rpx;
-				width: 300rpx;
-				background-size: 100%;
-				background-repeat: no-repeat;
-				z-index: 2;
-			}
-		}
-
-		//头部卡片
-		.box {
-			display: flex;
-			flex-direction: column;
-			justify-content: space-around;
-			margin: 25rpx 0;
-		}
-
-		//列表block
-		.detail-box {
-			display: flex;
-			flex-flow: row wrap;
-			margin: 30rpx 20rpx 0 20rpx;
-			justify-content: space-between;
-
-			.detail-box-item {
-				margin: 0 0 4% 0;
-				width: 100%;
-				height: auto;
-				background-color: #FFF;
-				border-radius: $card-border-radius;
-
-				.item-info {
-					display: flex;
-					align-items: center;
-					padding: 20rpx;
-
-					.t-icon {
-						width: 40rpx;
-						height: 40rpx;
-					}
-
-					.item-text {
-						font-size: 30rpx;
-						font-weight: bold;
-						color: $color-title;
-						margin-left: 15rpx;
-					}
-				}
-			}
-		}
-	}
-
-	.tag {
-		background-color: #FFF;
-		height: 30rpx;
-		width: 10rpx;
-		border-radius: 100rpx;
-		margin-left: 10rpx;
-		opacity: 0.8;
-	}
-
-	//图表
-	.charts-box {
-		width: 100%;
-		height: 300rpx;
-	}
-
-	.flex {
-		display: flex;
-		align-items: center;
-		margin-left: 20rpx;
-	}
-
-	.flex-line {
-		display: flex;
-		align-items: baseline;
-	}
-</style>

+ 0 - 188
components/todayclass-box/todayclass-box.vue

@@ -1,188 +0,0 @@
-<template>
-	<!-- 今日课程 -->
-	<view>
-		<!-- 课程列表 -->
-		<view style="margin-bottom: 20rpx;">
-			<!-- 插画 -->
-			<view class="detail-image" v-if="classCurrent === -1" :style="{backgroundImage:`url(${image.none})`}">
-			</view>
-			<view v-if="classCurrent === -1">
-				<view class="class-block">
-					<view class="block-title">自由安排</view>
-					<view class="block-tag-box">
-						<view class="block-tag">已下课</view>
-					</view>
-					<view class="block-subtitle">休息时间</view>
-					<view style="display: flex; align-items: center;" @click="navClass">
-						<view class="t-icon t-icon-fenlei" style="width: 40rpx;height: 40rpx;"></view>
-						<view style="font-size: 30rpx;color: #4169E1;margin-left: 10rpx;">课程列表</view>
-					</view>
-				</view>
-			</view>
-			<!-- 课程列表 -->
-			<view v-if="classCurrent != -1">
-				<!-- 上上节 -->
-				<view class="class-block" v-if="classCurrent === classList.length">
-					<view class="block-title">{{classList[classCurrent-3].name}}</view>
-					<view class="block-tag-box">
-						<view class="block-tag">{{classList[classCurrent-3].teacher}}</view>
-					</view>
-					<view class="block-subtitle">更早</view>
-					<view class="block-title">{{classList[classCurrent-3].time}}</view>
-					<view class="btn" @click="navVideoBefore(classCurrent-3)">
-						<!-- <view class="t-icon t-icon-bofang3"></view> -->
-						<view class="btn-text">已出勤</view>
-					</view>
-				</view>
-				<!-- 上节 -->
-				<view class="class-block" v-if="classCurrent >= 2">
-					<view class="block-title">{{classList[classCurrent-2].name}}</view>
-					<view class="block-tag-box">
-						<view class="block-tag">{{classList[classCurrent-2].teacher}}</view>
-					</view>
-					<view class="block-subtitle">上节</view>
-					<view class="block-title">{{classList[classCurrent-2].time}}</view>
-					<view class="btn" @click="navVideoBefore(classCurrent-2)">
-						<!-- <view class="t-icon t-icon-bofang3"></view> -->
-						<view class="btn-text">已出勤</view>
-					</view>
-				</view>
-				<!-- 当前 -->
-				<view class="class-block" style="background-color: #FFF;">
-					<view class="block-title" style="color: #4169E1;">{{classList[classCurrent-1].name}}</view>
-					<view class="block-tag-box">
-						<view class="block-tag">{{classList[classCurrent-1].teacher}}</view>
-					</view>
-					<view class="block-index">当前</view>
-					<view class="block-title" style="color: #4169E1;">{{classList[classCurrent-1].time}}</view>
-					<view class="btn" style="background-color: #ff5959" @click="navVideoNow(classCurrent-1)">
-						<!-- <view class="t-icon t-icon-zhibo"></view> -->
-						<view class="btn-text">正出勤</view>
-					</view>
-				</view>
-				<!-- 下节 -->
-				<view class="class-block" v-if="!(classCurrent === classList.length)">
-					<view class="block-title">{{classList[classCurrent].name}}</view>
-					<view class="block-tag-box">
-						<view class="block-tag">{{classList[classCurrent].teacher}}</view>
-					</view>
-					<view class="block-subtitle">下节</view>
-					<view class="block-title">{{classList[classCurrent].time}}</view>
-					<view class="btn" style="background-color: #aaaaaa">
-						<!-- <view class="t-icon t-icon-daojishi"></view> -->
-						<view class="btn-text">未开始</view>
-					</view>
-				</view>
-				<!-- 下下节 -->
-				<view class="class-block" v-if="classCurrent === 1">
-					<view class="block-title">{{classList[classCurrent+1].name}}</view>
-					<view class="block-tag-box">
-						<view class="block-tag">{{classList[classCurrent+1].teacher}}</view>
-					</view>
-					<view class="block-subtitle">更晚</view>
-					<view class="block-title">{{classList[classCurrent+1].time}}</view>
-					<view class="btn" style="background-color: #aaaaaa">
-						<!-- <view class="t-icon t-icon-daojishi"></view> -->
-						<view class="btn-text">未开始</view>
-					</view>
-				</view>
-			</view>
-
-		</view>
-
-	</view>
-</template>
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		name: "todayclass-box",
-		computed: {
-			...mapState('m_children', ['classList']),
-		},
-		props: {
-			classCurrent: {
-				type: Number,
-				default () {
-					return -1
-				}
-			},
-		},
-		data() {
-			return {
-				image: {
-					none: 'https://image.meiye.art/pic_1631411820764Vm5iw82gnV2lVKWRokFmU',
-					class: 'https://image.meiye.art/pic_1631411821366fqhkuMI110LbOlAIdv1SV',
-				},
-			};
-		},
-		watch: {
-			classCurrent() {
-				this.setClassCurrent()
-			}
-		},
-		methods: {
-			...mapMutations('m_children',['updateClassCurrent']),
-			//获取首页课程数据
-			setClassCurrent() {
-				this.updateClassCurrent(this.classCurrent)
-			},
-			navClass() {
-				uni.navigateTo({
-					url: '/subpkg/classlist/classlist'
-				})
-			},
-			navVideoBefore(index) {
-				uni.navigateTo({
-					url: `/subpkg/video/videopage?info=${index}`
-				})
-			},
-			navVideoNow(index) {
-				uni.navigateTo({
-					url: `/subpkg/video/livepage?info=${index}`
-				})
-			},
-		},
-		created() {
-			this.setClassCurrent()
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/pages/common/blockmsg.scss';
-
-	.detail-image {
-		margin-top: -50rpx;
-		width: 100%;
-		height: 450rpx;
-		background-size: 100%;
-		background-repeat: no-repeat;
-	}
-
-	.block-index {
-		font-size: 22rpx;
-		color: $color-mixblue;
-	}
-
-	.t-icon {
-		width: 46rpx;
-		height: 46rpx;
-	}
-	.btn{
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		background-color: $color-green;
-		width: 120rpx;
-		height: 60rpx;
-		border-radius: 8rpx;
-		.btn-text{
-			color: #FFF;
-			font-weight: bold;
-			font-size: 30rpx;
-		}
-	}
-</style>

+ 0 - 206
components/top-box/top-box.vue

@@ -1,206 +0,0 @@
-<template>
-	<view>
-		<!-- 头部信息 -->
-		<view class="home-topinfo">
-			<!-- 更新时间戳 -->
-			<view class="refresh-time"
-				:style="'top:'+ capsuleBottom + 'px;left:'+ capsuleMiddle + 'px;'+'width:'+capsuleWidth+ 'px'">
-				<text class="time-text">更新于: {{timeStamp}}</text>
-				<!-- 订阅版本 -->
-				<button class="estate" :style="{backgroundImage:`url(${backgroundImage})`}"
-					@click="navSubscribe">{{myData.subscribeLevel}}</button>
-			</view>
-		</view>
-		<view style="display: flex;margin-top: -450rpx;
-    margin-bottom: 120rpx;">
-			<image class="children-avatar" :src="childreninfo.avatar"></image>
-			<view class="children-name">
-				<text class="name">{{childreninfo.name}}</text>
-				<!-- 暂时不需切换学期 -->
-				<view class="detail-box" style="display: none;">
-					<text class="detail" @click="setSemesterPicker = true">{{semester}}</text>
-					<!-- 选择学期 -->
-					<view class="select-icon">
-						<u-icon name="arrow-down" color="#FFF" @click="setSemesterPicker = true"></u-icon>
-					</view>
-				</view>
-				<!-- 班级 -->
-				<view class="detail-box">
-					<text class="detail">{{childreninfo.class}}</text>
-				</view>
-			</view>
-		</view>
-
-		<u-picker class="picker" :show="setSemesterPicker" :closeOnClickOverlay="true" :columns="semesterList"
-			ref="uPicker" @confirm="pickerConfirm" @cancel="pickerCancel" :immediateChange="true"></u-picker>
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-
-	export default {
-		name: "top-box",
-		props: {
-			timeStamp: {
-				type: String,
-				default: false
-			}
-		},
-		watch: {
-			setSemesterPicker(newValue) {
-				if (newValue === true) {
-					uni.hideTabBar({})
-				}
-				if (newValue === false) {
-					setTimeout(function() {
-						uni.showTabBar({})
-					}, 400)
-				}
-			}
-		},
-		created() {
-			this.getCapsuleSite()
-		},
-		data() {
-			return {
-				setSemesterPicker: false,
-				//胶囊坐标
-				capsuleBottom: 0,
-				capsuleMiddle: 0,
-				capsuleWidth: 0,
-				//订阅背景图片
-				backgroundImage: 'https://tse1-mm.cn.bing.net/th/id/OIP-C.Vg_hgwLC0hRD46zTHmCD8wHaHr?pid=ImgDet&rs=1',
-				//是否正在加载
-				isLoading: false,
-			};
-		},
-		computed: {
-			...mapState('m_children', ['childreninfo', 'semester', 'semesterList']),
-			...mapState('m_parent', ['parentdetail', 'myData'])
-		},
-		methods: {
-			...mapMutations('m_children', ['updateChildrenInfo', 'updateChildrenSemester']),
-			getCapsuleSite() {
-				let res = uni.getMenuButtonBoundingClientRect()
-				this.capsuleBottom = res.bottom + 5
-				this.capsuleMiddle = res.left
-				this.capsuleWidth = res.width
-			},
-			//学期选择
-			pickerConfirm(e) {
-				if (e.value[0] != this.semester) {
-					this.isLoading = true
-					//拼接图表数据
-					this.updateChildrenSemester(e.value[0])
-					console.log(e.value[0], this.childreninfo.tmdid);
-					this.$initGrade(e.value[0], this.childreninfo.tmdid)
-					this.setSemesterPicker = false
-					this.isLoading = false
-				} else {
-					this.setSemesterPicker = false
-				}
-
-			},
-			//取消选择
-			pickerCancel() {
-				uni.$showMsg('取消选择', 1000)
-				this.setSemesterPicker = false
-			},
-			switchChildren(item) {
-				this.updateChildrenInfo(item)
-				this.show = false
-			},
-			//订阅页面
-			navSubscribe() {
-				uni.navigateTo({
-					url: '/subpkg/mydata/subscribepage'
-				})
-			}
-
-		}
-	}
-</script>
-
-<style lang="scss">
-	.home-topinfo {
-		height: 600rpx;
-		background: linear-gradient($color-blue, $page-background-color);
-	}
-
-	.children-avatar {
-		margin-left: 40rpx;
-		width: 100rpx;
-		height: 100rpx;
-		border-radius: 100%;
-		border: 4rpx solid #FFFFFF;
-		box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.2);
-	}
-
-	.children-name {
-		margin-left: 25rpx;
-		padding-top: 5rpx;
-		display: flex;
-		flex-direction: column;
-		justify-content: center;
-
-		.name {
-			color: #3B4144;
-			font-size: 36rpx;
-			font-weight: bold;
-		}
-
-		.detail-box {
-			display: flex;
-
-			.detail {
-				color: #FFFFFF;
-				font-weight: bold;
-				font-size: 30rpx;
-			}
-
-			.select-icon {
-				margin: 7rpx 0 0 10rpx;
-				width: 30rpx;
-				height: 30rpx;
-			}
-		}
-	}
-
-	.refresh-time {
-		height: auto;
-		position: relative;
-		display: flex;
-		flex-direction: column;
-
-		.time-text {
-			margin: 0 auto;
-			font-size: 24rpx;
-			color: #FFFFFF;
-			font-weight: bold;
-		}
-
-		.estate {
-			margin: 5rpx auto;
-			font-size: 22rpx;
-			line-height: 40rpx;
-			height: 40rpx;
-			width: 100%;
-			color: #FFFFFF;
-			font-weight: bold;
-			border-radius: 20rpx;
-			border: none;
-			background-size: cover;
-			background-repeat: no-repeat;
-		}
-	}
-
-	.t-icon {
-		width: 40rpx;
-		height: 40rpx;
-	}
-</style>

+ 147 - 0
components/top-info/top-info.vue

@@ -0,0 +1,147 @@
+<template>
+	<view>
+		<view class="info_box">
+			<image class="avatar" v-if="childInfo.avatar === '默认'"
+				:src="childInfo.gender==='男'?'/static/default_icons/boy_avatar.svg':'/static/default_icons/girl_avatar.svg'">
+			</image>
+			<image class="avatar" v-if="childInfo.avatar != '默认'" :src="childInfo.avatar"></image>
+			<view class="flex_cloumn">
+				<view class="content_name">{{childInfo.name}}</view>
+				<view class="content_class">{{childInfo.class}}</view>
+			</view>
+			<view class="user_data">
+
+				<view class="time_stamp">
+					{{timeStamp}}更新
+				</view>
+
+				<view class="subscribe_tag" @click="navSubscribe">
+					<view class="t-icon t-icon-huangguan1"></view>
+					<view class="subscribe_tag_text">
+						{{userData.subscribeLevel}}
+					</view>
+				</view>
+
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+
+	export default {
+		name: "top-info",
+		props: {
+			timeStamp: {
+				type: String,
+				default: false
+			}
+		},
+		computed: {
+			...mapState('m_children', ['childInfo']),
+			...mapState('m_parent', ['userData'])
+		},
+		data() {
+			return {
+				capsuleWidth: ''
+			};
+		},
+		created() {
+			this.getCapsuleSite()
+		},
+		methods: {
+			getCapsuleSite() {
+				let res = uni.getMenuButtonBoundingClientRect()
+				this.capsuleWidth = res.width - 14
+			},
+			navSubscribe() {
+				uni.navigateTo({
+					url: '/subpkg/mine/subscribeinfo'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.info_box {
+		margin: 560rpx 50rpx 0 50rpx;
+		display: flex;
+		align-items: center;
+		z-index: 3;
+
+		.avatar {
+			width: 112rpx;
+			height: 112rpx;
+			border-radius: 100%;
+			border: 4rpx solid #FFF;
+			box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.2);
+			z-index: 55;
+		}
+
+		.flex_cloumn {
+			margin-left: 40rpx;
+			width: 200rpx;
+			height: 120rpx;
+			justify-content: space-around;
+
+			.content_name {
+				font-size: 55rpx;
+				font-family: YSfont;
+				color: #FFF;
+				z-index: 99;
+			}
+
+			.content_class {
+				font-size: 40rpx;
+				font-family: YSfont;
+				color: #FFF;
+				z-index: 99;
+			}
+		}
+
+		.user_data {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: space-around;
+			margin-left: auto;
+			height: 120rpx;
+
+			.subscribe_tag {
+				display: flex;
+				align-items: center;
+				border-radius: 6rpx;
+				padding: 2rpx 12rpx;
+				transform: skew(-5deg);
+				background: #2f3137;
+				z-index: 99;
+
+				.subscribe_tag_text {
+					margin-left: 2rpx;
+					font-size: 28rpx;
+					font-family: YSfont;
+					color: #d0a97e;
+					z-index: 99;
+				}
+
+				.t-icon {
+					width: 28rpx;
+					height: 28rpx;
+					margin-top: -2rpx;
+					margin-right: 2rpx;
+				}
+			}
+
+			.time_stamp {
+				color: #FFF;
+				font-size: 24rpx;
+				font-family: YSfont;
+			}
+		}
+	}
+</style>

+ 90 - 0
components/top-return/top-return.vue

@@ -0,0 +1,90 @@
+<template>
+	<view class="back" :style="{height: capsuleHeight+ 'px',top:capsuleTop+'px'}">
+		<view v-if="!refresh">
+			<u-icon name="arrow-left" v-if="show === 'back'" :color="color" size="24" @click="backIconHandler"></u-icon>
+			<u-icon name="home-fill" v-if="show === 'home'" :color="color" size="24" @click="backHomeHandler"></u-icon>
+		</view>
+		
+		<view v-if="refresh">
+			<u-icon name="arrow-left" v-if="show === 'back'" :color="color" size="24" @click="backIconHandlerRefresh"></u-icon>
+			<u-icon name="home-fill" v-if="show === 'home'" :color="color" size="24" @click="backIconHandlerRefresh"></u-icon>
+		</view>
+		<view class="back-text" :style="{color: color}">{{ text }}</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "top-return",
+		props: {
+			text: {
+				type: String,
+				default: ''
+			},
+			color: {
+				type: String,
+				default: '#303133'
+			},
+			show: {
+				type: String,
+				default: 'back'
+			},
+			refresh: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				//胶囊
+				capsuleHeight: 0,
+				capsuleTop: 0,
+			};
+		},
+		created() {
+			this.getCapsuleSite()
+		},
+		methods: {
+			backIconHandler() {
+				uni.navigateBack()
+			},
+			backIconHandlerRefresh() {
+				let pages = getCurrentPages(); // 当前页面
+				let beforePage = pages[pages.length - 2]; // 上一页
+				uni.navigateBack({
+					success: function() {
+						beforePage.onLoad()// 执行上一页的onLoad方法
+					}
+				})
+			},
+			backHomeHandler() {
+				uni.switchTab({
+					url: '/pages/tab_home/tab_home'
+				})
+			},
+			//获取胶囊位置信息
+			getCapsuleSite() {
+				let res = uni.getMenuButtonBoundingClientRect()
+				this.capsuleHeight = res.height
+				this.capsuleTop = res.top
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.back {
+		position: relative;
+		padding: 0 0 0 20rpx;
+		display: flex;
+		align-items: center;
+		z-index: 999;
+
+		.back-text {
+			margin:0 0 5rpx 20rpx;
+			font-size: 40rpx;
+			font-weight: bold;
+			z-index: 999;
+		}
+	}
+</style>

+ 86 - 0
components/top-semester/top-semester.vue

@@ -0,0 +1,86 @@
+<template>
+	<view>
+		<!-- 页面标题内容 -->
+		<view class="flex_row" style="margin: 140rpx 40rpx 0 40rpx;">
+			<view class="flex_cloumn">
+				<view class="flex_baseline">
+					<view class="content_title">{{childInfo.semester.split('学年')[0]}}</view>
+					<view class="content_title" style="margin-left: 20rpx;font-size: 40rpx;">学年</view>
+					<view class="content_title" style="margin-left: 20rpx;">
+						{{childInfo.semester.split('学年')[1].split('学期')[0]}}
+					</view>
+					<view class="content_title" style="margin-left: 20rpx;font-size: 40rpx;">学期</view>
+
+				</view>
+
+				<view class="flex_baseline">
+
+					<view class="tag" style="margin-left: 0;">
+						<view class="tag_text">{{childInfo.school}}</view>
+					</view>
+					<view class="tag">
+						<view class="tag_text">{{childInfo.class}}</view>
+					</view>
+					<view class="tag">
+						<view class="tag_text">{{childInfo.name}}同学</view>
+					</view>
+
+				</view>
+			</view>
+			<!-- <image class="avatar" :src="childInfo.avatar"></image> -->
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: "top-semester",
+		computed: {
+			...mapState('m_children', ['childInfo']),
+		},
+		data() {
+			return {
+
+			};
+		},
+		onLoad() {},
+		methods: {
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	.flex_cloumn {
+		height: 170rpx;
+		justify-content: space-around;
+
+		.content_title {
+			font-size: 70rpx;
+			font-family: YSfont;
+			color: #FFF;
+			z-index: 2;
+			text-shadow: 1px -1px 0px #c0c0c0, 2px -2px 0px #b0b0b0, 1px -1px 0px #a0a0a0, 2px -2px 0px #909090;
+		}
+	}
+
+	.tag {
+		margin-left: 20rpx;
+		border-radius: 6rpx;
+		border: 2px solid #FFF;
+		padding: 0 6rpx;
+		z-index: 9;
+
+		.tag_text {
+			font-size: 32rpx;
+			font-family: YSfont;
+			color: #FFF;
+			z-index: 9;
+		}
+	}
+</style>

+ 0 - 6
subpkg/z-calendar/dateBox.vue

@@ -20,13 +20,7 @@
 </template>
 
 <script>
-	import {
-		mapState,
-	} from 'vuex'
 	export default {
-		computed: {
-			...mapState('m_children', ['records']),
-		},
 		props: {
 			dates: {
 				type: Array, //日期列表

subpkg/z-calendar/js/utils.js → components/z-calendar/js/utils.js


+ 3 - 3
subpkg/z-calendar/zsy-calendar.vue

@@ -90,7 +90,7 @@
 			}
 		},
 		computed: {
-			...mapState('m_children', ['records']),
+			...mapState('m_children', ['clockData']),
 			/* 获取指定日期信息
 			isCurDate: 是否获取当天的信息还是选中日期的信息
 			index: 0 表示年份 1 表示月份 2 表示日期 */
@@ -299,7 +299,7 @@
 				//判断是否打卡和时间对比并修改数据
 				let todayDate = Date.now() //毫秒数
 				calendarDate.forEach(item => {
-					if (this.records.find(x => x.month === item.month && x.year === item.year && x.date === item.date)) {
+					if (this.clockData.find(x => x.month === item.month && x.year === item.year && x.date === item.date)) {
 						item.isAttend = 1 //已打卡
 					}
 					//判断是否在当前日期之后
@@ -434,7 +434,7 @@
 	.calendar_info .title {
 		font-size: 32rpx;
 		font-weight: bold;
-		color: $color-title;
+		color: #303133;
 	}
 
 	.calendar_info .desc {

+ 0 - 13
components/z-table/table-render.js

@@ -1,13 +0,0 @@
-import Vue from 'vue'
-
-Vue.mixin({
-	methods: {
-		tableNameRender(h, {
-			row,
-			col
-		}) {
-			console.log(row)
-			return h('view', row.name)
-		}
-	}
-})

+ 0 - 784
components/z-table/z-table.vue

@@ -1,784 +0,0 @@
-<template>
-	<view class="z-table">
-		<view class="z-table-main" :style="compluteHeight">
-			<view v-if="!tableLoaded && (!tableData || !columns)" :class="['z-loading', {ztableLoading: tableShow}]">
-				<view class="z-loading-animate"></view>
-			</view>
-			<view class="z-table-container">
-				<view class="z-table-pack">
-					<view class="z-table-title">
-						<view class="z-table-title-item" :class="{ 'z-table-stick-side': stickSide && index == 0 }" :style="{ width: item.width ? item.width + 'rpx' : '25%' }"
-						 v-for="(item, index) in columns" :key="index" @click="sort(item.key, index)">
-							<view v-if="showSelect && !singleSelect && index === 0" class="select-box" @click="doSelect(true)">
-								<view :class="['select-tip', {'selected': selectAll}]"></view>
-							</view>
-							<view :class="['z-table-col-text', {'text-left': titleTextAlign === 'left', 'text-center': titleTextAlign === 'center', 'text-right': titleTextAlign === 'right'}]">
-								<view v-html="getTitleText(item.title)"></view>
-								<view v-if="item.hasOwnProperty('key') && item.hasOwnProperty('sort') && tableData.length" class="sort">
-									<view class="up-arrow" :class="{ action: nowSortKey == item.key && sortType == 'asc' }"></view>
-									<view class="down-arrow" :class="{ action: nowSortKey == item.key && sortType == 'desc' }"></view>
-								</view>
-							</view>
-						</view>
-					</view>
-					<view v-if="tableData.length" :class="['table-container-box', {'short-table': !longTable && showBottomSum}]">
-						<view class="z-table-container-row" :class="{ 'z-table-has-bottom': showBottomSum }" v-for="(row, iIndex) in tableData"
-						 :key="iIndex">
-							<view :class="['z-table-container-col', { 'z-table-stick-side': stickSide && jIndex == 0 }]" :style="{ width: col.width ? col.width + 'rpx' : '25%' }"
-							 v-for="(col, jIndex) in columns" :key="jIndex" @click="itemClick(row, col)">
-								<view v-if="showSelect && jIndex === 0" class="select-box" @click="doSelect(false, iIndex)">
-									<view :class="['select-tip', {'selected': selectArr.includes(iIndex)}]"></view>
-								</view>
-								<view :class="['z-table-col-text', {'text-left': textAlign === 'left', 'text-center': textAlign === 'center', 'text-right': textAlign === 'right'}]">
-									<view v-if="!col.isLink" v-html="getRowContent(row, col)">
-										<!-- <view v-if="!col.render" v-html="getRowContent(row, col)"></view> -->
-										<!-- <renderComponents v-else :row="row" :col="col" /> -->
-									</view>
-									<!-- #ifdef H5 -->
-									<router-link v-else-if="setUrl(row, col).indexOf('http') != 0" :to="setUrl(row, col)" v-html="getRowContent(row, col)"></router-link>
-									<a v-else-if="col.isLink" :href="setUrl(row, col)" v-html="getRowContent(row, col)"></a>
-									<!-- #endif -->
-									<!-- #ifndef H5 -->
-									<navigator v-else-if="col.isLink" :url="setUrl(row, col)" v-html="getRowContent(row, col)"></navigator>
-									<!-- #endif -->
-								</view>
-							</view>
-						</view>
-					</view>
-					<view :class="['z-table-bottom', {'long-table': longTable}]" v-if="showBottomSum && tableData.length">
-						<view class="z-table-bottom-col" :class="{ 'z-table-stick-side': stickSide && sumIndex == 0 }" :style="{ width: sumCol.width ? sumCol.width + 'rpx' : '25%' }"
-						 v-for="(sumCol, sumIndex) in columns" :key="sumIndex">
-							<view class="z-table-bottom-text">
-								<!-- <view v-if="sumIndex != 0" class="z-table-bottom-text-title">{{ sumCol.title }}</view> -->
-								<text :class="{ sum: sumIndex == 0 }">{{ sumIndex == 0 ? '总计' : dosum(sumCol) }}</text>
-							</view>
-						</view>
-					</view>
-				</view>
-			</view>
-			<view v-if="tableData && tableData.length == 0 && !tableLoaded" class="table-empty">
-				<!-- image v-if="!showLoading" class="empty-img" src="../static/empty.png"></image -->
-				<view v-html="showLoading ? '' : emptyText"></view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	/*
-	 * 表格使用
-	 * 注意如果需要异步加载,需要把tableData初始值设为false,当没有数据的时候值为空数组
-	 * props: tableData [Array | Boolean] | 表格数据 如果为false则显示loading
-	 * 		 columns [Array | Boolean] | 数据映射表 如果为false则显示loading 每列params => title(表头文字可以是html字符串模版), width(每列宽度) [, key(对应tableData的字段名) || format(自定义内容), sort(是否要排序), isLink(是否显示为超链接Object)]
-	 * 										   format格式: {template: 字符串模版用#key#表示需要被替换的数据,names: 对应template属性内要被替换的内容的key}
-	 * 										   isLink格式: {url: 链接地址, params: 地址带的参数Array[key|value, key|value, ...]每一项都是key和value以'|'链接,如果不带'|'默认键值同名
-	 * 										   listenerClick(是否监听点击事件Boolean)}
-	 * 		 stickSide Boolean | 是否固定右侧首栏 默认不显示
-	 * 		 showBottomSum Boolean | 是否显示底部统计 默认不显示
-	 * 		 showLoading Boolean | 是否首次加载首次加载不显示暂无数据内容
-	 * 		 emptyText String | 空数据显示的文字内容
-	 *		 tableHeight Number | 设置表格高度会滚动
-	 *		 sort Boolean | 开启排序
-	 * 		 showSelect Boolean | 开启选择
-	 *		 singleSelect Boolean | 在开启选择的状态下是否开起单选
-	 * 		 textAlign String | 内容对齐方式 left center right
-	 * 		 titleTextAlign String | 表头对齐方式 left center right
-	 *
-	 * event: onSort | 排序事件 返回{key: 被排序列的字段名, type: 正序'asc'/倒序'desc'}
-	 *		  onSelect | 选中时触发 返回选择的行的下标
-	 * 		  onClick | 单元格点击事件 返回点击单元格所属行的数据
-	 *
-	 * function: resetSort | 调用后重置排序 *注意:不会触发sort事件
-	 *
-	 * */
-	import Vue from 'vue'
-	// import tableRender from './table-render'
-
-	export default {
-		data() {
-			return {
-				version: '1.1.3',
-				nowSortKey: '',
-				sortType: 'desc', // asc/desc 升序/降序
-				longTable: true,
-				lineHeight: uni.upx2px(64),
-				tableLoaded: false,
-				tableShow: true,
-				selectAll: false,
-				selectArr: []
-			}
-		},
-		// mixin: [tableRender],
-		computed: {
-			compluteHeight() {
-				return this.tableHeight ?
-					'height: ' + uni.upx2px(this.tableHeight) + 'px' :
-					''
-			}
-		},
-		props: {
-			tableData: {
-				type: [Array, Boolean],
-				default () {
-					return false
-				}
-			},
-			columns: {
-				/*
-				 *
-				 * [{title: xxx, key: 当前列展示对象名, width: 列宽, render: function}]
-				 *
-				 * */
-				type: [Array, Boolean],
-				required: true
-			},
-			stickSide: {
-				type: Boolean,
-				default: false
-			},
-			showBottomSum: {
-				type: Boolean,
-				default: false
-			},
-			showLoading: {
-				type: Boolean,
-				default: true
-			},
-			emptyText: {
-				type: String,
-				default: '暂无数据'
-			},
-			tableHeight: {
-				type: [Number, Boolean],
-				default: 0
-			},
-			showSelect: {
-				type: Boolean,
-				default: false
-			},
-			singleSelect: {
-				type: Boolean,
-				default: false
-			},
-			textAlign: {
-				type: String,
-				default: 'left' // right|center|left
-			},
-			titleTextAlign: {
-				type: String,
-				default: 'left' // right|center|left
-			}
-		},
-		mounted() {
-			this.init()
-		},
-		// components: {
-		// 	renderComponents: {
-		// 		functional: true,
-		// 		props: {
-		// 			row: {
-		// 				type: Object,
-		// 				required: true
-		// 			},
-		// 			col: {
-		// 				type: Object,
-		// 				required: true
-		// 			}
-		// 		},
-		// 		render: function(h, ctx) {
-		// 			return _this[ctx.props.col.render](h, ctx.props)
-		// 		}
-		// 	}
-		// },
-		watch: {
-			columns() {
-				this.init()
-			},
-			tableData() {
-				this.init()
-			}
-		},
-		methods: {
-			async init() {
-				// 重置选择内容
-				this.selectAll = false
-				this.selectArr = []
-				this.tableLoaded = false
-				this.tableShow = true
-				let _this = this
-				let container = await _this.getPageSize('.z-table-container'),
-					pack = await _this.getPageSize('.z-table-pack')
-				_this.timer && clearTimeout(_this.timer)
-				if (container && pack) {
-					_this.$nextTick(function() {
-						if (_this.tableData && _this.tableData.length) {
-							_this.tableShow = false
-							_this.timer = setTimeout(function() {
-								_this.tableLoaded = true
-							}, 300)
-						}
-					})
-					if (container.height != pack.height) {
-						_this.longTable = true
-					} else {
-						_this.longTable = false
-					}
-				} else {
-					_this.tableLoaded = false
-					_this.$nextTick(function() {
-						_this.tableShow = true
-					})
-				}
-			},
-			getPageSize(selecter) {
-				// 获取元素信息
-				let query = uni.createSelectorQuery().in(this),
-					_this = this
-				return new Promise((resolve, reject) => {
-					query
-						.select(selecter)
-						.boundingClientRect(res => {
-							resolve(res)
-						})
-						.exec()
-				})
-			},
-			dosum({key, noSum = false, formatNum = true}) {
-				let sum = '-'
-				if (noSum) return sum
-				if (this.tableData) {
-					if (
-						this.tableData.every(item => {
-							return !Number.isNaN(item[key] - 0)
-						})
-					) {
-						sum = 0
-						this.tableData.map((item, index) => {
-							if (!key && index != 0) {
-								sum = '-'
-							} else {
-								let val = item[key] - 0
-								if (Number.isNaN(val)) {
-									sum += 0
-								} else {
-									sum += val
-								}
-							}
-						})
-					}
-				}
-				// sum = sum == 0 ? "-" : sum
-				return formatNum ? this.numTransform(sum) : sum
-			},
-			getRowContent(row, col) {
-				// 表格值处理函数
-				// 如果columns带了key则显示对应的key
-				// 如果columns带的format则按规定返回format后的html
-				// format规定: params names <Array> 对应tableData的键名,作为匹配template中两个#之间动态内容的名字
-				//			   params template <String> html字符串模版
-				let tempHTML = ''
-				let rowKey = row[col.key]
-				if ([null, ''].includes(rowKey)) {
-					rowKey = '-'
-				}
-				let { formatNum = true } = col
-				if (rowKey || rowKey === 0) {
-					tempHTML = isNaN(rowKey - 0) || !formatNum ?
-						rowKey :
-						this.numTransform(rowKey - 0)
-					// tempHTML = tempHTML == 0 ? "-" : tempHTML
-				} else if (!!col.format) {
-					let tempFormat = col.format.template
-					col.format.names.map(item => {
-						let regexp = new RegExp(`\#${item}\#`, 'mg')
-						tempFormat = tempFormat.replace(regexp, row[item])
-					})
-					tempHTML = tempFormat
-				} else if (!col.render) {
-					let error = new Error('数据的key或format值至少一个不为空')
-					throw error
-				}
-				// console.log(tempHTML)
-				return tempHTML.toString()
-			},
-			sort(key, index) {
-				if (!key || !this.columns[index].sort) {
-					return
-				}
-				// 排序功能: 如果点击的排序按钮是原先的 那么更改排序类型
-				//			如果点击的另一个排序按钮 那么选择当前排序并且排序类型改为降序(desc)
-				if (key != this.nowSortKey) {
-					this.nowSortKey = key
-					this.sortType = 'desc'
-				} else {
-					this.toggleSort()
-				}
-				this.$emit('onSort', {
-					key: this.nowSortKey,
-					type: this.sortType
-				})
-			},
-			toggleSort() {
-				this.sortType = this.sortType == 'asc' ? 'desc' : 'asc'
-			},
-			numTransform(n) {
-				if (Number.isNaN(n - 0)) {
-					return n
-				}
-				if (Math.abs(n) >= 100000000) {
-					n = Number((n / 100000000).toFixed(1)) + '亿'
-				} else if (Math.abs(n) >= 10000) {
-					n = Number((n / 10000).toFixed(1)) + '万'
-				}
-				return n.toString()
-			},
-			resetSort() {
-				// 重置排序状态
-				this.nowSortKey = ''
-				this.sortType = 'desc'
-			},
-			setUrl(row, col) {
-				if (!col.isLink) {
-					return
-				}
-				let urlParam = {}
-				let {
-					isLink: {
-						url,
-						params = []
-					}
-				} = col
-				params.forEach(item => {
-					if (~item.indexOf('|')) {
-						let temp = item.split('|')
-						urlParam[temp[0]] = row[temp[1]]
-					} else {
-						urlParam[item] = row[item]
-					}
-				})
-				url = this.setUrlParams(url, urlParam)
-				return url
-			},
-			setUrlParams(url, params) {
-				let tempUrl = url,
-					keyArr = Object.keys(params)
-				keyArr.forEach(item => {
-					tempUrl += `&${item}=${params[item]}`
-				})
-				tempUrl = tempUrl.replace(/\&/, '?')
-				return tempUrl
-			},
-			itemClick(row, col) {
-				if (col.listenerClick) {
-					this.$emit('onClick', row)
-				}
-			},
-			doSelect(isAll = false, index) {
-				let temp = new Set()
-				if (isAll) {
-					// 全选
-					if (!this.selectAll) {
-						for (let i = 0; i < this.tableData.length; i++) {
-							temp.add(i)
-						}
-					}
-				} else {
-					// if (!this.singleSelect) {
-					// 	this.selectArr.forEach(item => {
-					// 		temp.add(item)
-					// 	})
-					// }
-					this.selectArr.forEach(item => {
-						temp.add(item)
-					})
-					if (temp.has(index)) {
-						temp.delete(index)
-					} else {
-						if (this.singleSelect) {
-							temp.clear()
-						}
-						temp.add(index)
-					}
-				}
-				this.selectArr = Array.from(temp)
-				// console.log(this.selectArr)
-				if (this.selectArr.length == this.tableData.length) {
-					this.selectAll = true
-				} else {
-					this.selectAll = false
-				}
-				
-				this.$emit('onSelect', this.selectArr)
-			},
-			// 1.1.1
-			getTitleText(title) {
-				// 自定义表头
-				let tempHTML = title
-				return tempHTML.toString()
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.navigator-hover {
-		background: transparent;
-		opacity: 1;
-	}
-
-	@mixin ellipsis($num: 1) {
-		overflow: hidden;
-		text-overflow: ellipsis;
-
-		@if $num==1 {
-			white-space: nowrap;
-		}
-
-		@else {
-			display: -webkit-box;
-			-webkit-line-clamp: $num;
-			/* autoprefixer: off */
-			-webkit-box-orient: vertical;
-			/* autoprefixer: on */
-		}
-	}
-
-	// 三角形
-	%triangle-basic {
-		content: '';
-		height: 0;
-		width: 0;
-		overflow: hidden;
-	}
-
-	@mixin triangle($direction, $size, $borderColor) {
-		@extend %triangle-basic;
-
-		@if $direction==top {
-			border-bottom: $size solid $borderColor;
-			border-left: $size dashed transparent;
-			border-right: $size dashed transparent;
-			border-top: 0;
-		}
-
-		@else if $direction==right {
-			border-left: $size solid $borderColor;
-			border-top: $size dashed transparent;
-			border-bottom: $size dashed transparent;
-			border-right: 0;
-		}
-
-		@else if $direction==bottom {
-			border-top: $size solid $borderColor;
-			border-left: $size dashed transparent;
-			border-right: $size dashed transparent;
-			border-bottom: 0;
-		}
-
-		@else if $direction==left {
-			border-right: $size solid $borderColor;
-			border-top: $size dashed transparent;
-			border-bottom: $size dashed transparent;
-			border-left: 0;
-		}
-	}
-
-	a {
-		text-decoration: none;
-	}
-
-	.z-table {
-		position: relative;
-		display: inline-block;
-		height: 100%;
-		min-height: 130rpx;
-		width: 100%;
-		background: #fff;
-		border: solid 1px #DCDCDC;
-		font-size: $uni-font-size-sm;
-		box-sizing: border-box;
-		transform: translateZ(0);
-
-		.z-table-main {
-			height: 100%;
-			box-sizing: border-box;
-		}
-
-		.z-table-container {
-			height: 100%;
-			overflow: scroll;
-			box-sizing: border-box;
-		}
-
-		.z-table-pack {
-			position: relative;
-			min-height: 100%;
-			width: 100% !important;
-		}
-
-		.z-table-title {
-			position: sticky;
-			top: 0;
-			height: 64rpx;
-			z-index: 1;
-			width: 100% !important;
-
-			.z-table-title-item {
-				border-bottom: solid 1rpx #DCDCDC;
-				background: $color-mixblue;
-				color: #FFFFFF;
-			}
-
-			.z-table-stick-side {
-				position: sticky;
-				top: 0;
-				left: 0;
-				border-right: solid 1rpx #DCDCDC;
-				box-sizing: border-box;
-			}
-		}
-
-		.table-container-box.short-table {
-			padding-bottom: 48rpx;
-		}
-
-		.z-table-title,
-		.z-table-container-row {
-			display: flex;
-			width: 100%;
-			white-space: nowrap;
-			box-sizing: border-box;
-			
-
-			.z-table-title-item,
-			.z-table-container-col {
-				@include ellipsis();
-				display: flex;
-				height: 64rpx;
-				line-height: 64rpx;
-				box-sizing: border-box;
-			}
-		}
-
-		.z-table-container-row {
-			z-index: 0;
-			border-bottom: solid 1rpx #DCDCDC;
-			box-sizing: border-box;
-		}
-
-		.z-table-stick-side {
-			position: sticky;
-			left: 0;
-			background: #f7f9ff;
-			border-right: solid 1rpx #DCDCDC;
-			box-sizing: border-box;
-		}
-
-		.z-table-bottom {
-			position: absolute;
-			bottom: 0;
-			z-index: 9;
-			display: flex;
-			justify-items: center;
-			width: 100%;
-			background: $color-mixblue !important;
-			color: #fff !important;
-			white-space: nowrap;
-			box-sizing: border-box;
-
-			&.long-table {
-				position: sticky;
-			}
-
-			.z-table-stick-side {
-				background: $color-mixblue !important;
-				box-sizing: border-box;
-
-			}
-
-			.z-table-bottom-col {
-				align-items: center;
-				text-align: center;
-				box-sizing: border-box;
-				padding: 16rpx;
-			}
-
-			.z-table-bottom-text {
-				line-height: 100%;
-				box-sizing: border-box;
-			}
-
-			.z-table-bottom-text-title {
-				margin-bottom: 10rpx;
-				font-size: 22rpx;
-				color: #aad0ff;
-				box-sizing: border-box;
-			}
-
-			.sum {
-				font-size: 28rpx;
-				box-sizing: border-box;
-			}
-		}
-
-		.table-empty {
-			position: absolute;
-			top: 64rpx;
-			height: 64rpx;
-			line-height: 64rpx;
-			width: 100%;
-			text-align: center;
-		}
-
-		.sort {
-			display: flex;
-			padding: 5rpx;
-			flex-direction: column;
-			justify-content: center;
-
-			.up-arrow {
-				@include triangle(top, 10rpx, #ccc);
-				display: block;
-				margin-bottom: 5rpx;
-
-				&.action {
-					@include triangle(top, 10rpx, #4298f7);
-				}
-			}
-
-			.down-arrow {
-				@include triangle(bottom, 10rpx, #ccc);
-				display: block;
-
-				&.action {
-					@include triangle(bottom, 10rpx, #4298f7);
-				}
-			}
-		}
-
-		// 1.0.5
-		.z-loading {
-			position: absolute;
-			top: 0;
-			left: 0;
-			z-index: 2;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			height: 100%;
-			width: 100%;
-			background: #fff;
-			opacity: 0;
-			transition: all 0.3s;
-
-			&.ztableLoading {
-				opacity: 1;
-			}
-
-			.z-loading-animate {
-				position: relative;
-				display: inline-block;
-				width: 30rpx;
-				height: 30rpx;
-				margin-right: 20rpx;
-				border-radius: 100%;
-				border: solid 6rpx #ccc;
-				vertical-align: middle;
-				animation: rotate 1s ease-in-out infinite;
-
-				&::after {
-					content: '';
-					display: block;
-					position: absolute;
-					top: -10rpx;
-					z-index: 1;
-					background: #fff;
-					width: 20rpx;
-					height: 20rpx;
-					border-radius: 10rpx;
-				}
-			}
-
-			@keyframes rotate {
-				from {
-					transform: rotate(0deg);
-				}
-
-				to {
-					transform: rotate(360deg);
-				}
-			}
-		}
-
-		// 1.1.0
-		.select-box {
-			display: inline-block;
-			width: 26rpx;
-			height: 26rpx;
-			line-height: 14rpx;
-			margin-right: 15rpx;
-			border: solid 2rpx #4298f7;
-			border-radius: 4rpx;
-			background: #fff;
-			text-align: center;
-		}
-
-		.select-tip {
-			display: inline-block;
-			opacity: 0;
-			transform: rotate(90deg);
-			transition: all .3s;
-
-			&.selected {
-				position: relative;
-				top: 4rpx;
-				left: -4rpx;
-				height: 4rpx;
-				background: #4298f7;
-				width: 10rpx;
-				opacity: 1;
-				transform: rotate(45deg);
-
-				&:before,
-				&:after {
-					content: '';
-					position: absolute;
-					display: block;
-					height: 4rpx;
-					background: #4298f7;
-				}
-
-				&:before {
-					bottom: -2rpx;
-					left: -4rpx;
-					width: 8rpx;
-					transform: rotate(-90deg);
-				}
-
-				&:after {
-					bottom: 16rpx;
-					right: -16rpx;
-					width: 34rpx;
-					transform: rotate(-90deg);
-				}
-			}
-		}
-		
-		// 1.1.1
-		.z-table-col-text {
-			display: flex;
-			width: 100%;
-			flex: 1;
-			justify-content: center;
-			align-content: center;
-			
-			&.text-center {
-				justify-content: center;
-			}
-			
-			&.text-right {
-				justify-content: flex-end;
-			}
-		}
-	}
-</style>

+ 0 - 148
gradepkg/ability-chart/ability-chart.vue

@@ -1,148 +0,0 @@
-<template>
-	<view class="page-box">
-		<back text="考试能力"></back>
-
-		<view class="children-box">
-			<image class="children-avatar" :src="childreninfo.avatar"></image>
-			<view class="children-msg">
-				<view class="children-name">{{childreninfo.name}}</view>
-				<view class="children-class">{{childreninfo.class}}</view>
-			</view>
-		</view>
-
-		<!-- 数据分析模块 -->
-		<view class="data-box">
-			<view class="data-box-item" style="background-color: #4169E1;">
-				<view class="item-text">成绩波动对比:</view>
-				
-				<view style="display: flex;align-items: baseline;">
-					<view class="item-text" style="font-size: 50rpx;">{{mainExamUndulate>=quizExamUndulate?'小考':'大考'}}</view>
-					<view class="item-text" style="margin-left: 0;">发挥稳定</view>
-				</view>
-				
-				<view class="module-item-box">
-					<view v-if="mainExamUndulate>=quizExamUndulate" class="t-icon t-icon-a-bianzu7"></view>
-					<view v-if="mainExamUndulate<quizExamUndulate" class="t-icon t-icon-a-bianzu6"></view>
-				</view>
-			</view>
-
-			<view class="data-box-item" style="background-color: #ff8caf;">
-				<view class="item-text">得分能力对比:</view>
-				
-				
-				<view style="display: flex;align-items: baseline;">
-					<view class="item-text" style="font-size: 50rpx;">{{avgMain>=avgquiz?'大考':'小考'}}</view>
-					<view class="item-text" style="margin-left: 0;">得分能力强</view>
-				</view>
-				
-				<view class="module-item-box">
-					<view v-if="avgMain<avgquiz" class="t-icon t-icon-a-bianzu7"></view>
-					<view v-if="avgMain>=avgquiz" class="t-icon t-icon-a-bianzu6"></view>
-				</view>
-			</view>
-		</view>
-
-		<!-- 图表列表 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">重要考试对比</text>
-			</view>
-			<!-- 图表 -->
-			<view class="charts-box">
-				<qiun-data-charts type="column" :chartData="gradeData.abilityChart.importantAnalyse"
-					:loadingType="4" tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="canvasId876898"/>
-			</view>
-		</view>
-
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">普通测验记录</text>
-			</view>
-			<!-- 图表 -->
-			<view class="charts-box">
-				<qiun-data-charts type="column" :chartData="gradeData.abilityChart.commonAnalyse" :loadingType="4"
-					tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="canvasId931238"/>
-			</view>
-		</view>
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState
-	} from 'vuex'
-
-	export default {
-		computed: {
-			...mapState('m_children', ['childreninfo', 'semester']),
-			...mapState('m_chart', ['gradeData'])
-		},
-
-		data() {
-			return {
-				//查询参数
-				queryObj: {},
-				//成绩波动参数(标准差)
-				mainExamUndulate: 0,
-				quizExamUndulate: 0,
-				//大小考每次考试平均成绩
-				avgMain: 0,
-				avgquiz: 0,
-			};
-		},
-		methods: {
-			//成绩波动数据(标准差)
-			getExamUndulate() {
-				//求和函数封装
-				function arrSum(array) {
-					let cont = 0
-					for (let i = 0; i < array.length; i++) {
-						cont += array[i]
-					}
-					return cont;
-				}
-				const mainArr = []
-				const quizArr = []
-				//统计每次考试总成绩并存为数组
-				for (let item of this.gradeData.abilityChart.importantAnalyse.series) {
-					mainArr.push(arrSum(item.data))
-				}
-				for (let item of this.gradeData.abilityChart.commonAnalyse.series) {
-					quizArr.push(arrSum(item.data))
-				}
-				//大小考试平均成绩
-				this.avgMain = arrSum(mainArr) / mainArr.length
-				this.avgquiz = arrSum(quizArr) / quizArr.length
-				//标准差函数
-				function standardDeviation(arr) {
-					let length = arr.length;
-					let sum = arrSum(arr);
-					let avg = sum / length;
-					let temp = [];
-					for (let i = 0; i < length; i++) {
-
-						let dev = (arr[i]) - avg; //计算数组元素与平均值的差
-
-						temp[i] = Math.pow(dev, 2); //计算差的平方
-					}
-					let powSum = arrSum(temp); //差的平方和
-					let standardDeviation = parseFloat(Math.sqrt(powSum / length).toFixed(2)); //标准差
-					return standardDeviation
-				}
-				this.mainExamUndulate = standardDeviation(mainArr)
-				this.quizExamUndulate = standardDeviation(quizArr)
-			},
-
-		},
-		onLoad() {
-			this.getExamUndulate()
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/gradepkg/common/chartpage.scss';
-</style>

+ 0 - 152
gradepkg/common/chartpage.scss

@@ -1,152 +0,0 @@
-.page-box {
-		background: linear-gradient(#a5c6ff, $page-background-color);
-		height: 675rpx;
-		//数据分析模块
-		.data-box {
-			display: flex;
-			flex-direction: row;
-			flex-wrap: wrap;
-			margin: 20rpx 20rpx 10rpx 20rpx;
-			justify-content: space-between;
-			
-			.data-box-item {
-				margin: 2% 0;
-				display: flex;
-				flex-direction: column;
-				width: 48%;
-				border-radius: $card-border-radius;
-				overflow: hidden;
-				padding: 20rpx 0;
-		
-				.item-text {
-					margin-left: 20rpx;
-					font-size: 30rpx;
-					font-weight: bold;
-					color: #FFFFFF;
-					z-index: 2;
-					padding: 15rpx 10rpx;
-				}
-				.module-item-box{
-					width: 0rpx;
-					height: 0rpx;
-				}
-				.t-icon {
-					position: relative;
-					width: 200rpx;
-					height: 200rpx;
-					top: -220rpx;
-					right: -165rpx;
-					z-index: 1;
-					background-repeat: no-repeat;
-				}		
-				.icon-text-item {
-					width: 180rpx;
-					font-size: 35rpx;
-					font-weight: bold;
-					color: #FFFFFF;
-					margin-left: 20rpx;
-					margin-right: 20rpx;
-					z-index: 2;
-				}
-			}
-		}
-	.tooltip {
-		position: absolute;
-		width: auto;
-		height: auto;
-		z-index: 99;
-		padding: 15rpx;
-		top: 220rpx;
-		right: 20rpx;
-		background-color: #FFF;
-		border-radius: $card-border-radius;
-			
-		.tooltip-text {
-			font-size: 24rpx;
-			color: $color-title;
-			font-weight: bold;
-		}
-	}
-		//头像区域
-		.children-box {
-			display: flex;
-			align-items: center;
-			margin-bottom: 40rpx;
-			
-			.children-avatar {
-				margin-left: 40rpx;
-				width: 96rpx;
-				height: 96rpx;
-				border-radius: 50rpx;
-				border: 4rpx solid #FFFFFF;
-				box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.2);
-			}
-
-			.children-msg {
-				margin-left: 30rpx;
-
-				.children-name {
-					color: $color-title;
-					font-size: 32rpx;
-					font-weight: bold;
-					margin-bottom: 10rpx;
-				}
-
-				.children-class {
-					color: #FFF;
-					font-size: 32rpx;
-					font-weight: bold;
-					margin-top: 10rpx;
-				}
-			}
-		}
-		//图表区域
-		.chart-container {
-			margin: 20rpx;
-			border-radius: $card-border-radius;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			flex-direction: column;
-			background-color: #FFFFFF;
-			overflow: hidden;
-		
-			.chart-name {
-				width: 100%;
-				display: flex;
-				justify-content: flex-start;
-				align-items: center;
-				margin-left: 45rpx;
-				margin-top: 25rpx;
-		
-				.chart-name-text {
-					line-height: 45rpx;
-					font-size: 32rpx;
-					font-weight: bold;
-					color: $color-title;
-					margin-left: 15rpx;
-				}
-		
-				.btn-box {
-					display: flex;
-					margin-left: auto;
-					margin-right: 45rpx;
-					.btn {
-						margin-right: 10rpx;
-						line-height: 45rpx;
-						color: $color-mixblue;
-						font-size: 28rpx;
-					}
-					.t-icon{
-						width: 45rpx; 
-						height: 45rpx;
-					}
-				}
-			}
-		
-			.charts-box {
-				width: 100%;
-				height: 550rpx;
-			}
-		}
-	}

+ 0 - 199
gradepkg/general-chart/general-chart.vue

@@ -1,199 +0,0 @@
-<template>
-	<view class="page-box">
-
-		<!-- 返回按钮 -->
-		<back text="成绩走势"></back>
-
-		<!-- 学生信息头部 -->
-		<view class="children-box">
-			<image class="children-avatar" :src="childreninfo.avatar"></image>
-			<view class="children-msg">
-				<view class="children-name">{{childreninfo.name}}</view>
-				<view class="children-class">{{childreninfo.class}}</view>
-			</view>
-		</view>
-		<!-- 提示框 -->
-		<view class="tooltip" v-if="msgBox">
-			<view class="tooltip-text">点击图表显示内容</view>
-		</view>
-		<!-- 图表区域 -->
-		<!-- 总成绩图表 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">{{semester}} 总成绩对比</text>
-				<!-- 按钮区域 -->
-				<view class="btn-box">
-					<view class="t-icon t-icon-tishi2"  @click="showMsgBox"></view>
-				</view>
-			</view>
-			<view class="charts-box">
-				<qiun-data-charts type="area" :chartData="gradeData.semesterLineChart.generalComparison"
-					:loadingType="4" tooltipFormat='tooltipScore' :canvas2d="true" canvasId="canvasId9999" />
-			</view>
-		</view>
-		<!-- 单科与平均成绩对比 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">{{semester}} 单科与平均对比</text>
-				<!-- 按钮区域 -->
-				<view class="btn-box" @click="setSubjectPicker = true">
-					<text class="btn">{{subjectCurrent}}</text>
-					<view class="t-icon t-icon-xia"></view>
-				</view>
-			</view>
-			<!-- 图表 -->
-			<view class="charts-box">
-				<qiun-data-charts type="area" :chartData="gradeData.semesterLineChart.singleAverageComparison"
-					:loadingType="4" background="none" tooltipFormat='tooltipScore' :canvas2d="true"
-					canvasId="canvasId99999" />
-			</view>
-		</view>
-		<!-- 单科成绩走势 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">{{semester}} 单科走势对比</text>
-				<!-- 按钮 -->
-				<view class="btn-box" @click="switchScoreTypePicker = true">
-					<text class="btn">{{scoreTypeCurrent}}</text>
-					<view class="t-icon t-icon-xia"></view>
-				</view>
-			</view>
-			<!-- 图表 -->
-			<view class="charts-box" v-if="scoreTypeCurrent === '得分'">
-				<qiun-data-charts type="area" :chartData="gradeData.semesterLineChart.subjectComparison"
-					:loadingType="4" tooltipFormat='tooltipScore' :canvas2d="true" canvasId="canvasId99998" />
-			</view>
-			<view class="charts-box" v-if="scoreTypeCurrent === '得分率'">
-				<qiun-data-charts type="area" :chartData="gradeData.semesterLineChart.subjectComparison"
-					:loadingType="4" tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="canvasId991398" />
-			</view>
-		</view>
-
-
-		<!-- 选择器 -->
-		<!-- 科目选择 -->
-		<u-picker :show="setSubjectPicker" :columns="subjectList" @confirm="pickerConfirm" @cancel="pickerCancel"
-			:closeOnClickOverlay="true" :immediateChange="true">
-		</u-picker>
-		<!-- 得分展示模式选择 -->
-		<u-picker :show="switchScoreTypePicker" :columns="scoreTypeList" @confirm="scoreTypeConfirm"
-			@cancel="pickerCancel" :closeOnClickOverlay="true" :immediateChange="true">
-		</u-picker>
-
-
-	</view>
-</template>
-
-<script>
-	import getdata from '../../common/data.js'
-	import {
-		mapState,
-		mapMutations,
-		mapGetters
-	} from 'vuex'
-
-	export default {
-		computed: {
-			...mapState('m_children', ['childreninfo', 'semester']),
-			...mapState('m_chart', ['gradeData']),
-		},
-		//picker选择科目的变化通过监听器,监听变化并做出对应图表的整体变化
-		watch: {
-			//对象形式监听subjectCurrent的变化
-			subjectCurrent: {
-				//newValue为变化后的新值
-				handler(newValue) {
-					//拿到对应图表数据
-					let subjectChartData = this.data.find(x => x.series[0].name.includes(newValue))
-					this.updateSubjectComparison(subjectChartData)
-				},
-				//immediate 属性用来声明此监听器是否在页面初次加载完毕后立即调用
-				immediate: true
-			},
-		},
-		data() {
-			return {
-				//模拟数据
-				data: getdata.subjectData,
-				//提示框
-				msgBox: false,
-				//科目切换
-				setSubjectPicker: false,
-				//数据展示切换
-				switchScoreTypePicker: false,
-				//科目列表
-				subjectList: [],
-				//数据维度列表
-				scoreTypeList: [
-					['得分', '得分率']
-				],
-				//主科图表展示方式
-				scoreTypeCurrent: '',
-				//当前选择科目
-				subjectCurrent: '',
-			};
-		},
-		onLoad() {
-			this.setSubject()
-			this.setScoreType()
-		},
-		methods: {
-			...mapMutations('m_chart', ['updateSubjectComparison']),
-			//设置孩子科目
-			setSubject() {
-				//通过table获取孩子考试科目
-				if (this.subjectList.length === 0) {
-					this.subjectList = [["语文","数学","英语","思品","体育","科学"]]
-					if (this.subjectCurrent === '')
-						this.subjectCurrent = this.subjectList[0][0]
-				}
-				console.log('科目列表',this.subjectList);
-				console.log('当前科目',this.subjectCurrent);
-			},
-			//设置默认图表模式
-			setScoreType() {
-				if (this.scoreTypeCurrent == '')
-					this.scoreTypeCurrent = this.scoreTypeList[0][0]
-			},
-			//图表模式
-			scoreTypeConfirm(e) {
-				this.scoreTypeCurrent = e.value[0]
-				uni.$showMsg('切换完成', 1000)
-				this.switchScoreTypePicker = false
-			},
-			//切换科目
-			pickerConfirm(e) {
-				//改变subjectCurrent并由监听器处理数据图表同步改变
-				this.subjectCurrent = e.value[0]
-				uni.$showMsg('切换完成', 1000)
-				this.setSubjectPicker = false
-			},
-			//取消picker
-			pickerCancel() {
-				this.setSubjectPicker = false
-				this.switchScoreTypePicker = false
-			},
-			//提示信息
-			showMsgBox() {
-				this.msgBox = true
-				console.log(this.msgBox);
-				let that = this;
-				setTimeout(function() {
-					that.msgBox = false;
-					console.log(that.msgBox);
-				}, 3000)
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/gradepkg/common/chartpage.scss';
-
-	.page-box {
-		background: linear-gradient($color-blue, $page-background-color);
-	}
-</style>

+ 0 - 163
gradepkg/rank-chart/rank-chart.vue

@@ -1,163 +0,0 @@
-<template>
-	<view class="page-box">
-		<back text="排行占比"></back>
-
-		<view class="children-box">
-			<image class="children-avatar" :src="childreninfo.avatar"></image>
-			<view class="children-msg">
-				<view class="children-name">{{childreninfo.name}}</view>
-				<view class="children-class">{{childreninfo.class}}</view>
-			</view>
-		</view>
-
-		<!-- 数据分析模块 -->
-		<view class="data-box">
-			<view class="data-box-item" v-for="(item,index) in analysisData" :key="index"
-				:style="{background: item.color}">
-				<view class="item-text">{{item.title}}</view>
-				
-				<view style="display: flex;align-items: baseline;">
-					<view class="item-text" style="font-size: 50rpx;">{{item.data}}%</view>
-					<view class="item-text" style="margin-left: 0;">的学生</view>
-				</view>
-				
-				<view class="module-item-box">
-					<view :class="item.data>=40?(item.data>=70?'t-icon t-icon-a-bianzu6':'t-icon t-icon-a-bianzu7'): 't-icon t-icon-a-bianzu8'"></view>
-				</view>
-			</view>
-		</view>
-
-		<!-- 图表列表 -->
-		<!-- 总成绩排行走势 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">{{semester}} 排行占比走势对比</text>
-			</view>
-			<view class="charts-box">
-				<qiun-data-charts type="area" :chartData="gradeData.rankChart.semesterRank" :loadingType="4"
-					tooltipFormat='subjectRankColum' :canvas2d="true" canvasId="canvasId931234" />
-			</view>
-		</view>
-		<!-- 单科排行走势 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">单科排行占比走势对比</text>
-				<!-- 按钮区域 -->
-				<view class="btn-box" @click="setSubjectPicker = true">
-					<text class="btn">{{subjectCurrent}}</text>
-					<view class="t-icon t-icon-xia"></view>
-				</view>
-			</view>
-			<view class="charts-box">
-				<qiun-data-charts type="area" :chartData="gradeData.rankChart.semesterSubjectRank" :loadingType="4"
-					tooltipFormat='subjectRankColum' :canvas2d="true" canvasId="canvasId931870" />
-			</view>
-		</view>
-		
-		<!-- 科目选择 -->
-		<u-picker :show="setSubjectPicker" :columns="subjectList" @confirm="pickerConfirm" @cancel="setSubjectPicker = false"
-			:closeOnClickOverlay="true" :immediateChange="true">
-		</u-picker>
-	</view>
-</template>
-
-<script>
-	import getdata from '../../common/data.js'
-	import {
-		mapState,
-		mapMutations,
-		mapGetters
-	} from 'vuex'
-
-	export default {
-		computed: {
-			...mapState('m_children', ['childreninfo', 'semester']),
-			...mapState('m_chart', ['gradeData']),
-		},
-		watch: {
-			subjectCurrent:{
-				handler(newValue){
-					let subjectChartData = this.data.find(x=>x.name.includes(newValue))
-					let Data = {categories:[],series:[],}
-					Data.categories = subjectChartData.categories
-					Data.series = subjectChartData.series
-					this.updateSemesterSubjectRank(Data)
-				},
-				immediate: true
-			}
-		},
-		data() {
-			return {
-				//模拟数据
-				data: getdata.rankData,
-				//科目切换
-				setSubjectPicker: false,
-				//当前选择科目
-				subjectCurrent: '',
-				//科目列表
-				subjectList: [],
-				//分析模块数据
-				analysisData: 
-				[{
-					title: '学期平均排行超年级:',
-					data: '',
-					color: '#4169E1',
-				}, {
-					title: '学期平均排行超班级:',
-					data: '',
-					color: '#ff8caf',
-				}],
-				
-				
-			};
-		},
-		onLoad() {
-			this.setSubject()
-			this.getData()
-		},
-		methods: {
-			...mapMutations('m_chart', ['updateSemesterSubjectRank']),
-			//设置孩子科目
-			setSubject() {
-				if (this.subjectList.length === 0) {
-					this.subjectList = [["语文","数学","英语","思品","体育","科学"]]
-					if (this.subjectCurrent === '')
-						this.subjectCurrent = this.subjectList[0][0]
-				}
-				console.log('科目列表',this.subjectList);
-				console.log('当前科目',this.subjectCurrent);
-			},
-			//切换科目
-			pickerConfirm(e) {
-				//改变subjectCurrent并由监听器处理数据图表同步改变
-				this.subjectCurrent = e.value[0]
-				uni.$showMsg('切换完成', 1000)
-				this.setSubjectPicker = false
-			},
-			//获得分析模块数据
-			getData() {
-				//学期平均排行占比
-				//求和函数封装
-				function arrSum(array) {
-					let cont = 0
-					for (let i = 0; i < array.length; i++) {
-						cont += array[i]
-					}
-					return cont;
-				}
-				//平均超班级
-				this.analysisData[1].data = parseInt(arrSum(this.gradeData.rankChart.semesterRank.series[1].data) / this.gradeData
-					.rankChart.semesterRank.series[1].data.length)
-				//平均超年级
-				this.analysisData[0].data = parseInt(arrSum(this.gradeData.rankChart.semesterRank.series[0].data) / this.gradeData
-					.rankChart.semesterRank.series[0].data.length)
-			}
-		},
-	}
-</script>
-
-<style lang="scss">
-	@import '@/gradepkg/common/chartpage.scss';
-</style>

+ 0 - 104
gradepkg/single-chart/single-chart.vue

@@ -1,104 +0,0 @@
-<template>
-	<view class="page-box">
-		<back text="单次考试"></back>
-
-		<view class="children-box">
-			<image class="children-avatar" :src="childreninfo.avatar"></image>
-			<view class="children-msg">
-				<view class="children-name">{{childreninfo.name}}</view>
-				<view class="children-class">{{childreninfo.class}}</view>
-			</view>
-		</view>
-
-		<!-- 数据分析模块 -->
-		<view class="data-box">
-			<view class="data-box-item" v-for="(item,index) in analysisData" :key="index"
-				:style="{background: item.color}">
-				<view class="item-text">{{item.title}}</view>
-				
-				<view style="display: flex;align-items: baseline;">
-					<view class="item-text" style="font-size: 50rpx;">{{item.data/0.01}}%</view>
-					<view class="item-text" style="margin-left: 0;">的学生</view>
-				</view>
-				
-				<view class="module-item-box">
-					<view :class="item.data>=0.4?(item.data>=0.7?'t-icon t-icon-a-bianzu6':'t-icon t-icon-a-bianzu7'): 't-icon t-icon-a-bianzu8'"></view>
-				</view>
-			</view>
-		</view>
-
-
-		<!-- 图表列表 -->
-		<!-- 近期成绩对比自身 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">近期成绩对比</text>
-			</view>
-			<view class="charts-box">
-				<qiun-data-charts type="column" :chartData="gradeData.recentTestChart.recentComparison" :loadingType="4"
-					tooltipFormat='tooltipScore' :canvas2d="true" canvasId="canvasId19998" />
-			</view>
-		</view>
-		<!-- 单次排行分析 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">近期单科排行</text>
-			</view>
-			<view class="charts-box">
-				<qiun-data-charts type="column" :chartData="gradeData.recentTestChart.recentRankComparison" :loadingType="4"
-					tooltipFormat='subjectRankColum' :canvas2d="true" canvasId="canvasId1931238" />
-			</view>
-		</view>
-
-
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState
-	} from 'vuex'
-
-	export default {
-		computed: {
-			...mapState('m_children', ['childreninfo']),
-			...mapState('m_chart', ['gradeData'])
-		},
-
-		data() {
-			return {
-				//分析模块数据
-				analysisData: [{
-					title: '总成绩超过年级中:',
-					data: '',
-					color: '#4169E1',
-				}, {
-					title: '总成绩超过班级中:',
-					data: '',
-					color: '#ff8caf',
-				}],
-
-
-			};
-		},
-		methods: {
-			//获得分析模块数据
-			getData() {
-				this.analysisData[0].data =
-					this.gradeData.recentTestChart.recentRank.series[0].data
-				this.analysisData[1].data =
-					this.gradeData.recentTestChart.recentRank.series[1].data
-			}
-		},
-		onLoad() {
-			this.getData()
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/gradepkg/common/chartpage.scss';
-</style>

+ 0 - 104
gradepkg/subject-chart/subject-chart.vue

@@ -1,104 +0,0 @@
-<template>
-	<view class="page-box">
-		<back text="优劣科目"></back>
-
-		<view class="children-box">
-			<image class="children-avatar" :src="childreninfo.avatar"></image>
-			<view class="children-msg">
-				<view class="children-name">{{childreninfo.name}}</view>
-				<view class="children-class">{{childreninfo.class}}</view>
-			</view>
-		</view>
-		<!-- 数据分析模块 -->
-		<view class="data-box">
-			<view class="data-box-item" v-for="(item,index) in analysisData" :key="index" :style="{background: item.color}">
-				<view class="item-text">{{item.title}} {{item.data.name}}</view>
-				
-					<view style="display: flex;align-items: baseline;">
-						<view class="item-text" style="font-size: 50rpx;">{{item.data.value}}%</view>
-						<view class="item-text" style="margin-left: 0;">得分率</view>
-					</view>
-				
-				<view class="module-item-box">
-					<view :class="item.data.value>=40?(item.data.value>=70?'t-icon t-icon-a-bianzu6':'t-icon t-icon-a-bianzu7'): 't-icon t-icon-a-bianzu8'"></view>
-				</view>
-			</view>
-		</view>
-
-		<!-- 图表列表 -->
-		<!-- 单次考试 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">最近考试科目得分率分析</text>
-			</view>
-			<view class="charts-box">
-				<qiun-data-charts type="rose" :chartData="gradeData.advantageRoseChart.recentAdvantage" :loadingType="4"
-					:tapLegend="true" tooltipFormat='tooltipScoreShort'/>
-			</view>
-		</view>
-		<!-- 学期平均 -->
-		<view class="chart-container">
-			<view class="chart-name">
-				<view class="start-tag"></view>
-				<text class="chart-name-text">{{semester}} 科目得分率平均值分析</text>
-			</view>
-			<view class="charts-box">
-				<qiun-data-charts type="rose" :chartData="gradeData.advantageRoseChart.semesterAdvantage" :loadingType="4"
-					:tapLegend="true" tooltipFormat='tooltipScoreShort'/>
-			</view>
-		</view>
-		
-
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState
-	} from 'vuex'
-
-	export default {
-		computed: {
-			...mapState('m_children', ['childreninfo', 'semester']),
-			...mapState('m_chart', ['gradeData'])
-		},
-
-		data() {
-			return {
-				//分析模块数据
-				analysisData: 
-				[{
-					title: '学期优势科:',
-					data: '',
-					color: '#4169E1'
-				},{
-					title: '学期劣势科:',
-					data: '',
-					color: '#ff8caf',
-				}]
-			};
-		},
-		onLoad() {
-			this.getGradeDetail()
-		},
-		methods: {
-			getGradeDetail() {
-				//获取成绩最好科目
-				this.analysisData[0].data = this.gradeData.advantageRoseChart.semesterAdvantage.series[0].data.reduce((pre, cur) =>
-					pre.value > cur.value ? pre :
-					cur)
-				//劣势科目
-				this.analysisData[1].data = this.gradeData.advantageRoseChart.semesterAdvantage.series[0].data.reduce((pre, cur) =>
-					pre.value < cur.value ? pre :
-					cur)
-			}
-		}
-
-	}
-</script>
-
-<style lang="scss">
-	@import '@/gradepkg/common/chartpage.scss';
-</style>

+ 29 - 96
main.js

@@ -1,96 +1,29 @@
-// #ifndef VUE3
-import Vue from 'vue'
-import App from './App'
-//导入网络请求包
-import {$http} from '@escook/request-miniprogram'
-//5.导入store的自定义模块
-import store from '@/store/store.js'
-//导入uView组件库
-import uView from '@/uni_modules/uview-ui'
-//导入公共方法
-import Common from './utils/Common.js'
-import APIHandler from './utils/APIHandler.js'
-//挂载公共方法实例
-Vue.prototype.$getRecentDateArray = Common.getRecentDateArray;
-Vue.prototype.$timestampToTime = Common.timestampToTime;
-//API数据获取与处理
-Vue.prototype.$initGrade = APIHandler.initGrade;
-Vue.prototype.$initHomework = APIHandler.initHomework;
-Vue.prototype.$initHome = APIHandler.initHome;
-Vue.prototype.$initApp = APIHandler.initApp;
-//格式化处理日期时间的方法
-Date.prototype.format = function(fmt) {
-	let o = {
-		"M+": this.getMonth() + 1, //月份
-		"d+": this.getDate(), //日
-		"h+": this.getHours(), //小时
-		"m+": this.getMinutes(), //分
-		"s+": this.getSeconds(), //秒
-		"q+": Math.floor((this.getMonth() + 3) / 3), //季度
-		"S": this.getMilliseconds() //毫秒
-	};
-	if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
-	for (let k in o)
-		if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) :
-			(("00" + o[k]).substr(("" + o[k]).length)));
-	return fmt;
-}
-
-//挂载到uni.$http上方便调用
-uni.$http = $http
-//请求根路径
-// $http.baseUrl = 'https://www.uinav.com'
-
-//挂载请求拦截器
-$http.beforeRequest = function(options) {
-	uni.showLoading({
-		title: '数据加载中...'
-	})
-	//挂载请求头
-	//判断当前请求的是否为有权限的接口
-	// if(options.url.indexOf('/pages/login/login') !== -1){
-	//为header中添加必要信息(权限字段)
-	// options.header = {
-	// }
-	//}
-}
-
-//挂载响应拦截器
-$http.afterRequest = function() {
-	uni.hideLoading()
-}
-
-//封装的展示消息提示方法
-uni.$showMsg = function(title = '请求失败', duration = 1500) {
-	uni.showToast({
-		title,
-		duration,
-		icon: 'none'
-	})
-}
-
-Vue.config.productionTip = false
-
-App.mpType = 'app'
-
-//app实例对象
-const app = new Vue({
-	...App,
-	//6.挂载到app实例对象里
-	store
-})
-app.$mount()
-// #endif
-
-// #ifdef VUE3
-import {
-	createSSRApp
-} from 'vue'
-import App from './App.vue'
-export function createApp() {
-	const app = createSSRApp(App)
-	return {
-		app
-	}
-}
-// #endif
+import App from './App';
+import Vue from 'vue';
+import uView from '@/uni_modules/uview-ui';
+import store from '@/store/store.js';
+import Common from '@/utils/CommonMethods.js'
+import Request from '@/utils/RequestHandler.js'
+//挂载全局方法
+Vue.prototype.$noMultipleClicks = Common.noMultipleClicks
+Vue.prototype.$getRecentDateArray = Common.getRecentDateArray
+Vue.prototype.$timeStampToTime = Common.timeStampToTime
+Date.prototype.format = Common.dateUtil
+
+Vue.prototype.$initStart = Request.initStart
+Vue.prototype.$initTab = Request.initTab
+Vue.prototype.$initHome = Request.initHome
+Vue.prototype.$initExam = Request.initExam
+Vue.prototype.$initWork = Request.initWork
+Vue.prototype.$initSwap = Request.initSwap
+//挂载使用
+Vue.use(uView);
+
+
+Vue.config.productionTip = false;
+App.mpType = 'app';
+const app = new Vue({
+  ...App,
+	store
+});
+app.$mount();

+ 35 - 27
manifest.json

@@ -1,26 +1,32 @@
 {
-    "name" : "MiniPrograms",
-    "appid" : "__UNI__AEEE422",
+    "name" : "teammodelwxapp",
+    "appid" : "__UNI__74CA2D5",
     "description" : "",
     "versionName" : "1.0.0",
     "versionCode" : "100",
     "transformPx" : false,
+    /* 5+App特有相关 */
     "app-plus" : {
-        /* 5+App特有相关 */
         "usingComponents" : true,
-        "nvueCompiler" : "uni-app",
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
         "splashscreen" : {
             "alwaysShowBeforeRender" : true,
             "waiting" : true,
             "autoclose" : true,
             "delay" : 0
         },
-        "modules" : {},
+        "optimization" : {
+            "subPackages" : true
+        },
+        "runmode" : "liberate",
+        // 开启分包优化后,必须配置资源释放模式
         /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
         "distribute" : {
-            /* 应用发布信息 */
+            /* android打包配置 */
             "android" : {
-                /* android打包配置 */
                 "permissions" : [
                     "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
@@ -39,35 +45,37 @@
                     "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                 ]
             },
-            "ios" : {},
             /* ios打包配置 */
-            "sdkConfigs" : {
-                "share" : {
-                    "weixin" : {
-                        "appid" : "",
-                        "UniversalLinks" : ""
-                    }
-                }
-            }
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
         }
     },
-    /* SDK配置 */
-    "quickapp" : {},
     /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
     "mp-weixin" : {
-        /* 小程序特有相关 */
         "appid" : "wx5705da8747c77cfe",
         "setting" : {
-            "urlCheck" : false,
-            "checkSiteMap" : false,
-            "postcss" : true,
+            "urlCheck" : true,
             "es6" : true,
+            "postcss" : true,
             "minified" : true
         },
         "usingComponents" : true,
-        "optimization" : {
-            "subPackages" : true
-        },
-        "runmode" : "liberate"
-    }
+        "permission" : {}
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
 }

+ 0 - 16
package-lock.json

@@ -1,16 +0,0 @@
-{
-	"packages": {
-		"node_modules/@escook/request-miniprogram": {
-			"version": "0.2.1",
-			"resolved": "https://registry.npmjs.org/@escook/request-miniprogram/-/request-miniprogram-0.2.1.tgz",
-			"integrity": "sha512-ueWV5YsaEm/ycQZuEjMiA88GFMhfBQSjy9GrP9omy4xAQajkGTbYIlnhzsDfWzRPmRC1fKmAiKMrCVcgS+SHcQ=="
-		}
-	},
-	"dependencies": {
-		"@escook/request-miniprogram": {
-			"version": "0.2.1",
-			"resolved": "https://registry.npmjs.org/@escook/request-miniprogram/-/request-miniprogram-0.2.1.tgz",
-			"integrity": "sha512-ueWV5YsaEm/ycQZuEjMiA88GFMhfBQSjy9GrP9omy4xAQajkGTbYIlnhzsDfWzRPmRC1fKmAiKMrCVcgS+SHcQ=="
-		}
-	}
-}

+ 0 - 15
package.json

@@ -1,15 +0,0 @@
-{
-    "id": "zsy-calendar",
-    "name": "zsy-calendar 仿钉钉打卡统计日历 支持周与月的滑动切换",
-    "version": "1.0.4",
-    "description": "仿钉钉打卡统计日历、支持周与月的滑动切换",
-    "keywords": [
-        "兼容多端、源码注释清晰方便二次开发"
-    ],
-    "dcloudext": {
-        "category": [
-            "前端组件",
-            "通用组件"
-        ]
-    }
-}

+ 163 - 170
pages.json

@@ -5,270 +5,263 @@
 				"enablePullDownRefresh": false,
 				"navigationStyle": "custom"
 			}
-
 		},
 		{
-			"path": "pages/home/home",
+			"path": "pages/tab_home/tab_home",
 			"style": {
-				// "navigationBarTitleText": "",
 				"enablePullDownRefresh": true,
 				"navigationStyle": "custom"
 			}
-
-		}, {
-			"path": "pages/grade/grade",
+		},
+		{
+			"path": "pages/tab_exam/tab_exam",
 			"style": {
 				"enablePullDownRefresh": true,
 				"navigationStyle": "custom"
 			}
-
-		}, {
-			"path": "pages/interactive/interactive",
+		},
+		{
+			"path": "pages/tab_work/tab_work",
 			"style": {
 				"enablePullDownRefresh": true,
 				"navigationStyle": "custom"
 			}
-
-		}, {
-			"path": "pages/my/my",
+		},
+		{
+			"path": "pages/tab_swap/tab_swap",
 			"style": {
-				"enablePullDownRefresh": false,
-				"navigationStyle": "custom",
-				"disableScroll": true
+				"enablePullDownRefresh": true,
+				"navigationStyle": "custom"
 			}
-		}, {
-			"path": "pages/homework/homework",
+		},
+		{
+			"path": "pages/tab_mine/tab_mine",
 			"style": {
-				"enablePullDownRefresh": true,
+				"enablePullDownRefresh": false,
 				"navigationStyle": "custom"
 			}
-
 		}
 	],
-	//分包配置
 	"subPackages": [{
 		"root": "subpkg",
 		"pages": [{
-				"path": "login/login",
+				"path": "startup/login",
 				"style": {
 					"enablePullDownRefresh": false,
 					"navigationStyle": "custom",
 					"disableScroll": true
 				}
-
 			},
 			{
-				"path": "guide/accesspage",
+				"path": "startup/guide",
 				"style": {
 					"enablePullDownRefresh": false,
 					"navigationStyle": "custom",
 					"disableScroll": true
 				}
-			}, {
-				"path": "info/childrenpage",
+			},
+			{
+				"path": "startup/options",
 				"style": {
-					"navigationStyle": "custom",
 					"enablePullDownRefresh": false,
+					"navigationStyle": "custom",
 					"disableScroll": true
 				}
-
-			}, {
-				"path": "mydata/notificationpage",
+			},
+			{
+				"path": "home/classlist",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": true
+					"enablePullDownRefresh": true,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "info/parentpage",
+			},
+			{
+				"path": "mine/messagelist",
+				"style": {
+					"enablePullDownRefresh": true,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "mine/childinfo",
 				"style": {
-					"navigationStyle": "custom",
 					"enablePullDownRefresh": false,
+					"navigationStyle": "custom",
 					"disableScroll": true
 				}
-
-			}, {
-				"path": "guide/childrenlist",
+			},
+			{
+				"path": "mine/parentinfo",
 				"style": {
 					"enablePullDownRefresh": false,
 					"navigationStyle": "custom",
 					"disableScroll": true
 				}
-
-			}, {
-				"path": "calendar/calendar",
+			},
+			{
+				"path": "mine/subscribeinfo",
 				"style": {
+					"enablePullDownRefresh": false,
 					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"disableScroll": true
 				}
-
-			}, {
-				"path": "classlist/classlist",
+			},
+			{
+				"path": "gradelist/total",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "video/videopage",
+			},
+			{
+				"path": "gradelist/single",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "detail/exam",
+			},
+			{
+				"path": "gradelist/ranking",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "detail/homework",
+			},
+			{
+				"path": "gradelist/subject",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "detail/activity",
+			},
+			{
+				"path": "gradelist/level",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "detaillist/examlist",
+			},	
+			{
+				"path": "work/workstats",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "detaillist/homeworklist",
+			},
+			{
+				"path": "swap/swapstats",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "detaillist/activitylist",
+			},
+			{
+				"path": "home/clockstats",
 				"style": {
+					"enablePullDownRefresh": false,
 					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"disableScroll": true
 				}
-
-			}, {
-				"path": "mydata/subscribepage",
+			},
+			{
+				"path": "datalist/examdata",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}, {
-				"path": "video/livepage",
+			},
+			{
+				"path": "datalist/workdata",
 				"style": {
-					"navigationStyle": "custom",
-					"enablePullDownRefresh": false
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "datalist/swapdata",
+				"style": {
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "datalist/examlist",
+				"style": {
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "datalist/worklist",
+				"style": {
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "datalist/swaplist",
+				"style": {
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "exam/exercisesinfo",
+				"style": {
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "home/recommendinfo",
+				"style": {
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "work/wrongbookinfo",
+				"style": {
+					"enablePullDownRefresh": false,
+					"navigationStyle": "custom"
 				}
-
-			}
-		]
-	}, {
-		"root": "gradepkg",
-		"pages": [{
-			"path": "subject-chart/subject-chart",
-			"style": {
-				"navigationBarTitleText": "",
-				"enablePullDownRefresh": false,
-				//"navigationBarBackgroundColor":"#f97f41"
-				"navigationStyle": "custom"
-			}
-		}, {
-			"path": "ability-chart/ability-chart",
-			"style": {
-				"navigationBarTitleText": "",
-				"enablePullDownRefresh": false,
-				//"navigationBarBackgroundColor":"#c1cbf7"
-				"navigationStyle": "custom"
-			}
-
-		}, {
-			"path": "general-chart/general-chart",
-			"style": {
-				"navigationBarTitleText": "",
-				"enablePullDownRefresh": false,
-				//"navigationBarBackgroundColor":"#5fb7ff"
-				"navigationStyle": "custom"
-			}
-
-		}, {
-			"path": "single-chart/single-chart",
-			"style": {
-				"navigationBarTitleText": "",
-				"enablePullDownRefresh": false,
-				//"navigationBarBackgroundColor":"#f9cd98"
-				"navigationStyle": "custom"
-			}
-
-		}, {
-			"path": "rank-chart/rank-chart",
-			"style": {
-				"navigationBarTitleText": "",
-				"enablePullDownRefresh": false,
-				// "navigationBarBackgroundColor":"#419eea"
-				"navigationStyle": "custom"
 			}
 
-		}]
+		]
 	}],
-	"preloadRule": {
-		"subpkg/login/login": {
-			"network": "all",
-			"packages": ["__APP__"]
-		},
-		"subpkg/guide/accesspage": {
-			"network": "all",
-			"packages": ["subpkg"]
-		}
-	},
-
-
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
-		"navigationBarBackgroundColor": "#f5f5f5",
-		"backgroundColor": "#f5f5f5"
+		"navigationBarBackgroundColor": "#f7f7f7",
+		"backgroundColor": "#f7f7f7"
 	},
 	"tabBar": {
 		"backgroundColor": "#FFFFFF",
 		"borderStyle": "white",
-		"color": "#b5b9c4",
-		"selectedColor": "#4169E1",
 
 		"list": [{
-				"pagePath": "pages/home/home",
-				"iconPath": "static/tab-icons/home.png",
-				"selectedIconPath": "static/tab-icons/homeselect.png"
+				"pagePath": "pages/tab_home/tab_home",
+				"iconPath": "static/tab_icons/home.png",
+				"selectedIconPath": "static/tab_icons/homeselect.png"
 			},
 			{
-				"pagePath": "pages/grade/grade",
-				"iconPath": "static/tab-icons/grade.png",
-				"selectedIconPath": "static/tab-icons/gradeselect.png"
+				"pagePath": "pages/tab_exam/tab_exam",
+				"iconPath": "static/tab_icons/exam.png",
+				"selectedIconPath": "static/tab_icons/examselect.png"
 			},
 			{
-				"pagePath": "pages/homework/homework",
-				"iconPath": "static/tab-icons/homework.png",
-				"selectedIconPath": "static/tab-icons/homeworkselect.png"
+				"pagePath": "pages/tab_work/tab_work",
+				"iconPath": "static/tab_icons/work.png",
+				"selectedIconPath": "static/tab_icons/workselect.png"
 			},
 			{
-				"pagePath": "pages/interactive/interactive",
-				"iconPath": "static/tab-icons/interactive.png",
-				"selectedIconPath": "static/tab-icons/interactiveselect.png"
+				"pagePath": "pages/tab_swap/tab_swap",
+				"iconPath": "static/tab_icons/swap.png",
+				"selectedIconPath": "static/tab_icons/swapselect.png"
 			},
 			{
-				"pagePath": "pages/my/my",
-				"iconPath": "static/tab-icons/my.png",
-				"selectedIconPath": "static/tab-icons/myselect.png"
+				"pagePath": "pages/tab_mine/tab_mine",
+				"iconPath": "static/tab_icons/mine.png",
+				"selectedIconPath": "static/tab_icons/mineselect.png"
 			}
 		]
 	}

+ 0 - 43
pages/common/blockmsg.scss

@@ -1,43 +0,0 @@
-	.block-box{
-		display: flex;
-		align-items: center;
-	}
-	.class-block {
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		margin: 10rpx auto 10rpx auto;
-		width: 90%;
-		height: 120rpx;
-		padding: 5rpx 25rpx;
-		border-radius: 15rpx;
-		background: linear-gradient(90deg,#f6f6f6, #FFF);
-	
-		.block-title {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: $color-title;
-		}
-	
-		.block-subtitle {
-			font-size: 22rpx;
-			color: $color-title;
-		}
-		.block-tag-box{
-			border-radius: 50rpx;
-			border: 1rpx solid $color-mixblue;
-			padding: 5rpx 14rpx;
-			.block-tag{
-				font-size: 22rpx;
-				color: $color-mixblue;
-			}
-		}
-	}
-
-	.tag-index {
-		width: 1%;
-		height: 120rpx;
-		border-radius: $card-border-radius;
-		margin-left: 20rpx;
-		background-image: linear-gradient($color-mixblue, #FFF);
-	}

+ 0 - 70
pages/common/mainpage.scss

@@ -1,70 +0,0 @@
-.home-container {
-		width: 100%;
-		height: 100%;
-		overflow-x: hidden; //隐藏多余的页面
-
-		.notice {
-			margin: -70rpx 20rpx 20rpx 20rpx;
-		}
-
-		.card-box {
-			display: flex;
-			flex-flow: row wrap;
-			margin: 0 20rpx 10rpx 20rpx;
-			justify-content: space-between;
-
-			.card-item {
-				margin: 2% 0;
-				width: 48%;
-				height: auto;
-				display: flex;
-				flex-direction: column;
-				background-color: #FFF;
-				border-radius: $card-border-radius;
-				
-
-				.card-info {
-					display: flex;
-					align-items: center;
-					padding: 20rpx;
-					z-index: 3;
-
-					.info-text {
-						font-size: 30rpx;
-						font-weight: bold;
-						color: #3B4144;
-						margin-left: 10rpx;
-					}
-				}
-			}
-		}
-	}
-	.card-content {
-		font-size: 38rpx;
-		margin: 10rpx 0 10rpx 25rpx;
-		color: $u-primary;
-		font-weight: bold;
-	}
-	
-	.home-title-text {
-		display: flex;
-		align-items: center;
-		flex-wrap: wrap;
-		margin: -10rpx 0 10rpx 0;
-	}
-	.msg {
-		color: $color-title;
-		margin-left: 30rpx;
-		font-size: 26rpx;
-	}
-	.charts-box {
-		width: 100%;
-		height: 310rpx;
-		padding-bottom: 10rpx;
-	}
-
-	.t-icon {
-		width: 40rpx;
-		height: 40rpx;
-	}
-	

+ 0 - 232
pages/grade/grade.vue

@@ -1,232 +0,0 @@
-<template>
-	<view class="home-container">
-		<!-- 头部区域 -->
-		<top-box v-bind:timeStamp="timeStamp"></top-box>
-		<!-- 活动内容 -->
-		<task-box :current="0">
-			<!-- 记录模块 -->
-			<template #center-slot>
-				<!-- 缩略图区域 -->
-				<view class="mini-chart-list">
-					<!-- 成绩走势 -->
-					<view class="mini-chart-item" style="width: 100%;">
-						<view class="chart-container" @click="navGeneral">
-							<view class="chart-name">
-								<view :class="icon.General"></view>
-								<text class="chart-name-text">成绩走势</text>
-							</view>
-							<view class="charts-box">
-								<qiun-data-charts class="chart" :canvas2d='true' canvasId='canvans1' type="mainline"
-									:chartData="gradeData.semesterLineChart.generalComparison" :loadingType="4"
-									tooltipFormat='tooltipScore' />
-							</view>
-						</view>
-					</view>
-					<!-- 单次考试 -->
-					<view class="mini-chart-item">
-						<view class="chart-container" @click="navSingle">
-							<view class="chart-name">
-								<view :class="icon.RecentTest"></view>
-								<text class="chart-name-text">单次考试分析</text>
-							</view>
-							<view class="charts-box">
-								<qiun-data-charts type="mini-column" :chartData="gradeData.recentTestChart.recentComparison"
-									:loadingType="4" :tapLegend="false" :canvas2d='true' canvasId='canvans2' />
-							</view>
-						</view>
-					</view>
-					<!-- 成绩占比 -->
-					<view class="mini-chart-item">
-						<view class="chart-container" @click="navRank">
-							<view class="chart-name">
-								<view :class="icon.Rank"></view>
-								<text class="chart-name-text">排行占比分析</text>
-							</view>
-							<view class="charts-box">
-								<qiun-data-charts type="mini-area" :chartData="gradeData.rankChart.semesterRank"
-									:loadingType="4" :tapLegend="false" :canvas2d='true' canvasId='canvans3' />
-							</view>
-						</view>
-					</view>
-					<!-- 优劣科目分析 -->
-					<view class="mini-chart-item">
-						<view class="chart-container" @click="navSubject">
-							<view class="chart-name">
-								<view :class="icon.Advantage"></view>
-								<text class="chart-name-text">优劣科目分析</text>
-							</view>
-							<view class="charts-box">
-								<qiun-data-charts type="mini-rose" :chartData="gradeData.advantageRoseChart.recentAdvantage"
-									:loadingType="4" :tapLegend="false" :canvas2d='true' canvasId='canvans4' />
-							</view>
-						</view>
-					</view>
-					<!-- 考试能力分析 -->
-					<view class="mini-chart-item">
-						<view class="chart-container" @click="navAbility">
-							<view class="chart-name">
-								<view :class="icon.Ability"></view>
-								<text class="chart-name-text">考试能力分析</text>
-							</view>
-							<view class="charts-box">
-								<qiun-data-charts type="mini-column" :chartData="gradeData.abilityChart.importantAnalyse"
-									:loadingType="4" :tapLegend="false" :canvas2d='true' canvasId='canvans5' />
-							</view>
-						</view>
-					</view>
-				</view>
-			</template>
-		</task-box>
-		
-	</view>
-</template>
-
-<script>
-	import {
-		mapState
-	} from 'vuex'
-
-	export default {
-		computed: {
-			...mapState('m_children', ['childreninfo', 'semester']),
-			...mapState('m_chart', ['gradeData'])
-		},
-		data() {
-			return {
-				//图标
-				icon: {
-					General: 't-icon t-icon-pingjia',
-					RecentTest: 't-icon t-icon-zhishi',
-					Rank: 't-icon t-icon-fengxianpinggu',
-					Advantage: 't-icon t-icon-gaishuai',
-					Ability: 't-icon t-icon-tongji',
-				},
-				//时间戳
-				timeStamp: '',
-
-			}
-		},
-		onLoad() {
-			this.init()
-		},
-		//刷新页面
-		onPullDownRefresh() {
-			setTimeout(function() {
-				this.init()
-				uni.stopPullDownRefresh();
-			}, 1000);
-		},
-		methods: {
-			init() {
-				//获取当前时间
-				this.timeStamp = (new Date()).format("hh:mm")
-				//获取成绩数据
-				this.$initGrade()
-			},
-			//导航成绩走势
-			navGeneral(e) {
-				uni.navigateTo({
-					url: "/gradepkg/general-chart/general-chart"
-				})
-			},
-			//导航单次考试
-			navSingle(e) {
-				uni.navigateTo({
-					url: "/gradepkg/single-chart/single-chart"
-				})
-			},
-			//导航排行占比
-			navRank(e) {
-				uni.navigateTo({
-					url: "/gradepkg/rank-chart/rank-chart"
-				})
-			},
-			//导航优劣科目
-			navSubject(e) {
-				uni.navigateTo({
-					url: "/gradepkg/subject-chart/subject-chart"
-				})
-			},
-			//导航考试能力
-			navAbility(e) {
-				uni.navigateTo({
-					url: "/gradepkg/ability-chart/ability-chart"
-				})
-			},
-
-		},
-
-	}
-</script>
-
-<style lang="scss">
-	.home-container {
-		width: 100%;
-		height: 100%;
-		overflow-x: hidden; //隐藏多余的页面
-
-		.home-topinfo {
-			background: linear-gradient($color-pink, $page-background-color);
-		}
-
-		//缩略图列表
-		.mini-chart-list {
-			display: flex;
-			align-items: center;
-			flex-wrap: wrap;
-			margin: -10rpx 20rpx -20rpx 20rpx;
-			justify-content: space-between;
-
-			.mini-chart-item {
-				margin: 2% 0;
-				width: 48%;
-				display: flex;
-				flex-direction: column;
-			}
-		}
-	}
-
-	//图表卡片
-	.chart-container {
-		border-radius: $card-border-radius;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		flex-direction: column;
-		background-color: #FFFFFF;
-		// box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.05);
-		width: 100%;
-		height: 345rpx;
-
-		.chart-name {
-			display: flex;
-			align-items: center;
-			justify-content: flex-start;
-			width: 100%;
-			margin: 20rpx 0 20rpx 40rpx;
-
-			.chart-name-text {
-				margin-left: 15rpx;
-				font-size: 30rpx;
-				font-weight: bold;
-				color: $color-title;
-			}
-		}
-
-		.charts-box {
-			width: 100%;
-			height: 265rpx;
-		}
-	}
-
-	.table {
-		margin-bottom: 20rpx;
-		width: 93%;
-		height: 100%;
-	}
-
-	.t-icon {
-		width: 40rpx;
-		height: 40rpx;
-	}
-</style>

+ 0 - 340
pages/home/home.vue

@@ -1,340 +0,0 @@
-<template>
-	<view class="home-container">
-		<!-- 头部区域 -->
-		<top-box v-bind:timeStamp="timeStamp"></top-box>
-		<!-- 滚动条 -->
-		<view class="notice">
-			<u-notice-bar :text="noticeMsg" mode="closable" bgColor="#4169e140" color="#FFF"
-				url="/subpkg/mydata/notificationpage"></u-notice-bar>
-		</view>
-		<!-- 卡片区域 -->
-		<view class="card-box">
-
-			<!-- 今日课程 -->
-			<view class="card-item" style="width: 100%;">
-				<view class="card-info" style="padding-bottom: 20rpx;">
-					<view :class="icon.class"></view>
-					<text class="info-text">今日课程</text>
-					<view style="display: flex; align-items: center;margin: 0 5rpx 0 auto;" @click="navClass"
-						v-if="classCurrent != -1">
-						<view class="t-icon t-icon-fenlei"></view>
-						<view class="msg" style="font-size: 30rpx; margin-left: 5px;color: #4169E1;">课程列表</view>
-					</view>
-				</view>
-				<todayclass-box :classCurrent="classCurrent"></todayclass-box>
-			</view>
-
-			<!-- 今日打卡 -->
-			<view class="card-item" style="overflow: hidden;height: 400rpx;" @click="navCalendar">
-				<view class="card-info">
-					<view class="t-icon t-icon-daka"></view>
-					<text class="info-text">今日出勤</text>
-				</view>
-				<view class="flex" style="flex-direction: column;">
-					<!-- 是否打卡 -->
-					<view class="flex">
-						<view class="start-tag-isattend" v-if="attendance==='已打卡'"></view>
-						<view class="start-tag-noattend" v-else></view>
-						<view class="text-content" style="z-index: 2;">打卡记录</view>
-					</view>
-					<view class="flex">
-						<view
-							:class="attendance==='已打卡'?'t-icon t-icon-weizhidaka-dakachenggong':'t-icon t-icon-weizhidaka-dakacuowu'"
-							style="width:60rpx;height: 60rpx;margin-left: 20rpx;z-index: 2;"></view>
-						<view class="text-info" style="margin: 20rpx;">{{attendance}}</view>
-					</view>
-					<view class="image"
-						:style="{backgroundImage: attendance==='已打卡'?`url(${image02})`:`url(${image01})`}"></view>
-					<!-- 打卡时间 -->
-					<view class="flex">
-						<view class="start-tag-isattend" v-if="attendance==='已打卡'"></view>
-						<view class="start-tag-noattend" v-else></view>
-						<view class="text-content">打卡时间</view>
-					</view>
-					<view class="flex">
-						<view class="flex" v-if="attendance==='未打卡'" style="align-items: baseline;">
-							<view class="text-info" style="margin-left: 30rpx;font-size: 30rpx;">时间</view>
-							<view class="text-info">未记录</view>
-						</view>
-						<view class="flex" v-else style="align-items: baseline;">
-							<view class="text-info" style="margin-left: 30rpx;font-size: 30rpx;">上午</view>
-							<view class="text-info">{{attendanceTime.split(':')[0].replace('0','')}}</view>
-							<view class="text-info" style="font-size: 30rpx;">点</view>
-							<view class="text-info">{{attendanceTime.split(':')[1]}}</view>
-							<view class="text-info" style="font-size: 30rpx;">分</view>
-						</view>
-					</view>
-				</view>
-			</view>
-
-
-			<!-- 评测 -->
-			<view class="card-item" @click="navTask(0)">
-				<view class="card-info">
-					<view :class="icon.evaluation"></view>
-					<text class="info-text">今日评测</text>
-				</view>
-				<view class="charts-box">
-					<qiun-data-charts type="arcbar" :chartData="homeData.evaluationArcbar" :loadingType="4"
-						:canvas2d='true' canvasId='canvans9313111' :opts="evaluationOpts" />
-				</view>
-			</view>
-			<!-- 作业 -->
-			<view class="card-item" @click="navTask(1)">
-				<view class="card-info">
-					<view :class="icon.homework"></view>
-					<text class="info-text">今日作业</text>
-				</view>
-				<view class="charts-box">
-					<qiun-data-charts type="arcbar" :chartData="homeData.homeworkArcbar" :loadingType="4"
-						:canvas2d='true' canvasId='canvans9327676' :opts="homeworkOpts" />
-				</view>
-			</view>
-			<!-- 问卷 -->
-			<view class="card-item" @click="navTask(2)">
-				<view class="card-info">
-					<view :class="icon.activity"></view>
-					<text class="info-text">今日活动</text>
-				</view>
-				<view class="charts-box">
-					<qiun-data-charts type="arcbar" :chartData="homeData.activityArcbar" :loadingType="4"
-						:canvas2d='true' canvasId='canvans9313176' :opts="activityOpts" />
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mapState
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_chart', ['homeData']),
-			...mapState('m_children', ['classList', 'records']),
-			...mapState('m_parent', ['myData'])
-		},
-		data() {
-			return {
-				//滚动通知
-				noticeMsg: '',
-				//当前课程索引
-				classCurrent: '',
-				attendance: '',
-				attendanceTime: '',
-				//属性(不修改)
-				//评测进度条属性
-				evaluationOpts: {},
-				//作业进度条属性
-				homeworkOpts: {},
-				//活动进度条属性
-				activityOpts: {},
-				//时间戳
-				timeStamp: '',
-				//图标
-				icon: {
-					class: 't-icon t-icon-banji',
-					evaluation: 't-icon t-icon-ceping',
-					homework: 't-icon t-icon-bianji1',
-					activity: 't-icon t-icon-huodong'
-				},
-				image01: 'https://ouch-cdn2.icons8.com/2farWQUdLe8J4mb4oQoEvJpl5OFXtM5P7AZi8nhuOxk/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9zdmcvOTYz/L2VkZGEwNzAzLTAw/MWYtNGZiZS1hY2I3/LTVlNjRhZGYzNTAx/Mi5zdmc.png',
-				image02: 'https://ouch-cdn2.icons8.com/6CkTSZQdyBYaGiqmNJRhbqoYi8QDcLFn-04VEQyQaCo/rs:fit:962:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9zdmcvNzMz/LzlhYmUzYjIyLTRl/ZGQtNDVkMi1iYWEw/LTVjYjk2NThmNDJi/OC5zdmc.png'
-			}
-		},
-		onLoad() {
-			this.init()
-		},
-		onPullDownRefresh() {
-			this.init()
-			setTimeout(function() {
-				uni.stopPullDownRefresh()
-			}, 1000);
-		},
-		methods: {
-			//页面方法初始化
-			init() {
-				this.timeStamp = (new Date()).format("hh:mm")
-				this.$initHome()
-				this.setOpts()
-				this.getNoticeMsg()
-				this.getClassCurrent()
-				this.getAttendance()
-			},
-			//获取滚动通知
-			getNoticeMsg() {
-				this.noticeMsg = `您有 ${this.myData.msgList.length} 个通知,请点击查看`
-			},
-			//计算出当前课程
-			getClassCurrent() {
-				//当前时间戳是否在课程时间段内
-				function CompareDate(start, finish) {
-					//获得当前时间时间戳
-					let timeNow = (new Date()).format("yyyy-MM-dd hh:mm").replace(new RegExp("-", "gm"), "/")
-					let timeHaoMiao = (new Date(timeNow)).getTime()
-					//获得课程开始结束时间戳
-					let today = (new Date()).format("yyyy-MM-dd ")
-					let classStart = (today + start).replace(new RegExp("-", "gm"), "/")
-					let classFinish = (today + finish).replace(new RegExp("-", "gm"), "/")
-					let classStartHaoMiao = (new Date(classStart)).getTime()
-					let classFinishHaoMiao = (new Date(classFinish)).getTime()
-					//比较
-					if (timeHaoMiao < classFinishHaoMiao) {
-						if (classStartHaoMiao < timeHaoMiao)
-							return true
-					}
-					return false
-				}
-				//获取当前课程索引值
-				let i = 1
-				for (let item of this.classList) {
-					let timeArr = item.time.split("-")
-					let res = CompareDate(timeArr[0], timeArr[1])
-					if (res) {
-						break
-					}
-					i++
-				}
-				//判断是否不在任意一个时间段内
-				if (i > this.classList.length) {
-					i = -1
-				}
-				this.classCurrent = i
-				i = 0
-			},
-			//获得今日是否打卡
-			getAttendance() {
-				//获得当前时间时间戳
-				let timeNow = (new Date()).format("yyyy-M-dd")
-				let timeArr = timeNow.split("-")
-				let info = this.records.filter(x => x.year == timeArr[0] && x.month == timeArr[1] && x.date == timeArr[2])
-				if (info.length != 0) {
-					this.attendance = '已打卡'
-					this.attendanceTime = info[0].time
-				} else {
-					this.attendance = '未打卡'
-					this.attendanceTime = '未记录'
-				}
-			},
-			//设置圆环图描述更新
-			setOpts() {
-				//圆环图标题和副标题动态变化
-				let evaluation = {
-					title: {
-						name: this.homeData.evaluationArcbar.series[0].data * 100 + "%",
-						color: this.homeData.evaluationArcbar.series[0].color
-					},
-					subtitle: {
-						name: this.homeData.evaluationArcbar.series[0].name
-					},
-				}
-				let homework = {
-					title: {
-						name: this.homeData.homeworkArcbar.series[0].data * 100 + "%",
-						color: this.homeData.homeworkArcbar.series[0].color
-					},
-					subtitle: {
-						name: this.homeData.homeworkArcbar.series[0].name
-					},
-				}
-				let activity = {
-					title: {
-						name: this.homeData.activityArcbar.series[0].data * 100 + "%",
-						color: this.homeData.activityArcbar.series[0].color
-					},
-					subtitle: {
-						name: this.homeData.activityArcbar.series[0].name
-					},
-				}
-				this.evaluationOpts = evaluation;
-				this.homeworkOpts = homework;
-				this.activityOpts = activity;
-			},
-			//导航
-			navTask(index) {
-				if(index === 0){
-					uni.reLaunch({
-						url: `/pages/grade/grade`
-					})
-				}
-				if(index === 1){
-					uni.reLaunch({
-						url: `/pages/homework/homework`
-					})
-				}
-				if(index === 2){
-					uni.reLaunch({
-						url: `/pages/interactive/interactive`
-					})
-				}
-			},
-			navCalendar() {
-				uni.navigateTo({
-					url: '/subpkg/calendar/calendar'
-				})
-			},
-			navClass() {
-				uni.navigateTo({
-					url: '/subpkg/classlist/classlist'
-				})
-			},
-		},
-	}
-</script>
-
-<style lang="scss">
-	@import '@/pages/common/mainpage.scss';
-
-	.flex {
-		display: flex;
-		align-items: center;
-		width: 100%;
-	}
-
-	.text-content {
-		font-size: 30rpx;
-		font-weight: bold;
-		color: $color-title;
-		margin: 10rpx 0 10rpx 15rpx;
-		z-index: 2;
-	}
-
-	.text-info {
-		margin: 10rpx 0 0 10rpx;
-		font-size: 45rpx;
-		font-weight: bold;
-		color: $color-title;
-		z-index: 2;
-	}
-
-	.t-icon {
-		background-repeat: no-repeat;
-	}
-
-	.start-tag-isattend {
-		height: 30rpx;
-		width: 10rpx;
-		border-radius: 100rpx;
-		margin-left: 30rpx;
-		background-image: linear-gradient($color-mixblue 60%, #FFF);
-	}
-	.start-tag-noattend {
-		height: 30rpx;
-		width: 10rpx;
-		border-radius: 100rpx;
-		margin-left: 30rpx;
-		background-image: linear-gradient($color-yellow 60%, #FFF);
-	}
-
-	.image {
-		position: absolute;
-		margin: 20rpx 0 0 50rpx;
-		height: 300rpx;
-		width: 300rpx;
-		background-size: 100%;
-		background-repeat: no-repeat;
-		opacity: 0.25;
-		z-index: 1;
-	}
-</style>

+ 0 - 46
pages/homework/homework.vue

@@ -1,46 +0,0 @@
-<template>
-	<view>
-		<!-- 头部区域 -->
-		<top-box :timeStamp="timeStamp" />
-		<!-- 作业模块 -->
-		<task-box :current="1"></task-box>
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		data() {
-			return {
-				//时间戳
-				timeStamp: '',
-			};
-		},
-		onLoad() {
-			this.init()
-		},
-		//刷新页面
-		onPullDownRefresh() {
-			this.init()
-			setTimeout(function() {
-				uni.stopPullDownRefresh();
-			}, 1000);
-		},
-		methods: {
-			//初始化页面
-			init() {
-				this.timeStamp = (new Date()).format("hh:mm")
-			},
-			
-		}
-	}
-</script>
-
-<style lang="scss">
-	.home-topinfo {
-		background: linear-gradient($color-yellow, $page-background-color) !important;
-	}
-</style>

+ 52 - 28
pages/init/init.vue

@@ -1,37 +1,61 @@
-<template>
-	<view>
-		<u-loading-page :loading="true" bgColor="#FFF" loadingText="别着急,正在加载中" loadingMode="semicircle"></u-loading-page>
-	</view>
-</template>
-
+<template>
+	<view>
+		<loading></loading>
+	</view>
+</template>
+
 <script>
-	import {mapState,mapMutations} from 'vuex'
+	import {
+		mapState
+	} from 'vuex'
 	export default {
 		computed: {
-			...mapState('m_children', ['semesterList'])
-		},
-		data() {
-			return {
-				
-			};
+			...mapState('m_children', ['examData', 'workData', 'swapData'])
 		},
 		onLoad() {
 			//缓存中同步token
-			if(!uni.getStorageSync('token')){
-				uni.redirectTo({
-					url:'/subpkg/login/login'
-				})
-			} else{
-				uni.switchTab({
-					url:'/pages/home/home'
-				})
+			if (!uni.getStorageSync('token')) {
+				console.log('无Token跳转登录');
+				setTimeout(function() {
+					uni.redirectTo({
+						url: '/subpkg/startup/login'
+					})
+				}, 1500);
+
+			} else {
+				if (!uni.getStorageSync('phoneNumber')) {
+					uni.redirectTo({
+						url: '/subpkg/startup/guide'
+					})
+					return console.log('有Token无手机号跳转引导页');
+				}
+				if (!uni.getStorageSync('childInfo')) {
+					uni.redirectTo({
+						url: '/subpkg/startup/options'
+					})
+					return console.log('有Token有手机号无孩子信息跳转选择页');
+				}
+				console.log('有Token跳转首页');
+				this.allTasks()
 			}
 		},
-		methods:{
-		}
-	}
-</script>
-
-<style lang="scss">
-
+		methods: {
+			//获得异步请求返回值
+			async allTasks() {
+				try {
+					await this.$initTab()
+					uni.switchTab({
+						url: '/pages/tab_home/tab_home'
+					})
+				} catch (e) {
+					console.log(e);
+				}
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss">
+
 </style>

+ 0 - 77
pages/interactive/interactive.vue

@@ -1,77 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 头部区域 -->
-		<top-box :timeStamp="timeStamp"></top-box>
-		<!-- 活动内容 -->
-		<task-box :current="2">
-			<!-- 记录模块 -->
-			<template #end-slot>
-				<interactive-box></interactive-box>
-			</template>
-		</task-box>
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_parent', ['parentinfo'])
-		},
-		data() {
-			return {
-				//时间戳
-				timeStamp: '',
-
-			}
-		},
-		onLoad() {
-			this.timeStamp = (new Date()).format("hh:mm")
-		},
-		//刷新页面
-		onPullDownRefresh() {
-			this.timeStamp = (new Date()).format("hh:mm")
-			console.log('refresh');
-			setTimeout(function() {
-				uni.stopPullDownRefresh();
-			}, 1000);
-		},
-		methods: {
-	
-		},
-	}
-</script>
-
-<style lang="scss">
-	@import '@/pages/common/mainpage.scss';
-	.home-topinfo {
-		background: linear-gradient($color-green, $page-background-color) !important;
-	}
-	.container {
-		width: 100%;
-		height: 100%;
-		overflow-x: hidden; //隐藏多余的页面
-		.card-box {
-			display: flex;
-			flex-direction: row;
-			flex-wrap: wrap;
-			margin: 0 20rpx 20rpx 20rpx;
-			justify-content: space-between;
-
-			.card-item {
-				margin: 10rpx 0;
-				display: flex;
-				flex-direction: column;
-				justify-content: space-between;
-				background-size: cover;
-				box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.06);
-				border-radius: $card-border-radius;
-				width: 100%;
-				height: 300rpx;
-			}
-		}
-	}
-</style>

+ 0 - 361
pages/my/my.vue

@@ -1,361 +0,0 @@
-<template>
-	<view class="my-container">
-		<view class="bg1"></view>
-		<view class="bg2"></view>
-		<!-- 家长信息头部 -->
-		<view class="userinfo-topinfo">
-			<image class="parent-avatar" :src="parentinfo.avatarUrl"></image>
-			<view class="parent-name">
-				<text class="name">{{parentinfo.nickName}}</text>
-				<u-tag :text="childreninfo.name + '家长'" shape="circle" plain plainFill></u-tag>
-			</view>
-		</view>
-
-		<!-- 功能组件 -->
-		<view class="userinfo-container">
-			<!-- 面板区域 -->
-			<view class="box-cart">
-				<view class="box-cart-item left-box" @click="chooseChildren">
-					<view class="t-icon t-icon-a-boshimaojiaoyu"></view>
-					<view class="card-text">
-						孩子管理
-						<view class="card-des">
-							查看您的孩子
-						</view>
-					</view>
-				</view>
-				<view class="box-cart-item right-box" @click="childrenInfo">
-					<view class="t-icon t-icon-a-jiangpaijiangzhang"></view>
-					<view class="card-text">
-						孩子名片
-						<view class="card-des">
-							晒出TA的优秀表现
-						</view>
-					</view>
-				</view>
-			</view>
-
-			<!-- 用户功能 -->
-			<view class="com-item">
-				<view class="com-box">
-					<view class="cell" @click="navInfo">
-						<view class="cell-left">
-							<view class="t-icon t-icon-zhanghu"></view>
-							<view class="cell-text">个人信息</view>
-						</view>
-						<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
-					</view>
-					<view class="cell" @click="navMsg">
-						<view class="cell-left">
-							<view class="t-icon t-icon-a-liaotianpingluntaolunduihua"></view>
-							<view class="cell-text">我的消息</view>
-						</view>
-						<view class="cell-right">
-							<view style="margin-right: 20rpx;">
-								<u-badge type="warning" shape="horn" :value="myData.msgList.length"></u-badge>
-							</view>
-							<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
-						</view>
-					</view>
-					<view class="cell" @click="logout">
-						<view class="cell-left">
-							<view class="t-icon t-icon-a-tuichulikai"></view>
-							<view class="cell-text">退出登录</view>
-						</view>
-						<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
-					</view>
-				</view>
-			</view>
-			<!-- 用户服务 -->
-			<view class="com-item">
-				<view class="com-box">
-					<view class="cell" @click="mySubscribe">
-						<view class="cell-left">
-							<view class="t-icon t-icon-shoucang"></view>
-							<view class="cell-text">订阅中心</view>
-						</view>
-						<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
-					</view>
-					<view class="cell">
-						<view class="cell-left">
-							<view class="t-icon t-icon-a-appyingyongchengxukaifa"></view>
-							<view class="cell-text">帮助中心</view>
-						</view>
-						<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
-					</view>
-					<view class="cell">
-						<view class="cell-left">
-							<view class="t-icon t-icon-shuji"></view>
-							<view class="cell-text">用户协议</view>
-						</view>
-						<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
-					</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-
-	export default {
-		computed: {
-			...mapState('m_parent', ['token', 'parentdetail', 'parentinfo', 'myData']),
-			...mapState('m_children', ['childreninfo', 'semesterList'])
-		},
-
-		data() {
-			return {
-				show: false,
-			};
-		},
-		onLoad() {},
-		methods: {
-			...mapMutations('m_parent', ['updateParentDetail', 'updateParentInfo', 'updateToken','updateMyData']),
-			...mapMutations('m_children', ['updateChildrenInfo', 'updateChildrenSemester','updateChildrenSemesterList']),
-			//退出登录事件
-			async logout() {
-				const [err, succ] = await uni.showModal({
-					title: '提示',
-					content: '确认退出登录吗?'
-				}).catch(err => err)
-				if (succ && succ.confirm) {
-					this.updateChildrenInfo()
-					this.updateChildrenSemester()
-					this.updateParentDetail()
-					this.updateParentInfo()
-					this.updateToken()
-					this.updateMyData()
-					this.updateChildrenSemesterList()
-
-					uni.reLaunch({
-						url: '/subpkg/login/login'
-					})
-				}
-			},
-			//切换孩子
-			chooseChildren() {
-				// if(parentdetail.childrenList.length == 1)
-				// return uni.showMsg('您只有一个孩子,不能切换')
-				// if(uni.getStorageSync('parentdetail')){
-				// 	uni.setStorageSync('parentdetail',)
-				// }
-				uni.navigateTo({
-					url: '/subpkg/guide/childrenlist'
-				})
-			},
-			//孩子名片
-			childrenInfo() {
-				uni.navigateTo({
-					url: '/subpkg/info/childrenpage'
-				})
-			},
-			//我的消息
-			navMsg() {
-				uni.navigateTo({
-					url: '/subpkg/mydata/notificationpage'
-				})
-			},
-			//我的信息
-			navInfo() {
-				uni.navigateTo({
-					url: '/subpkg/info/parentpage'
-				})
-			},
-			mySubscribe(){
-				uni.navigateTo({
-					url: '/subpkg/mydata/subscribepage'
-				})
-			}
-
-		}
-	}
-</script>
-
-<style lang="scss">
-	.my-container {
-		height: 100%;
-
-		.bg1 {
-			position: fixed;
-			top: -320rpx;
-			right: -300rpx;
-			width: 800rpx;
-			height: 800rpx;
-			margin-right: 500rpx;
-			border-radius: 50%;
-			background-color: #6495ed;
-			z-index: -1;
-		}
-
-		.bg2 {
-			position: fixed;
-			top: -200rpx;
-			right: -300rpx;
-			width: 800rpx;
-			height: 800rpx;
-			border-radius: 100%;
-			background-color: $color-mixblue;
-			z-index: -2;
-		}
-
-		.userinfo-topinfo {
-			height: 350rpx;
-			display: flex;
-			justify-content: flex-start;
-			align-items: center;
-
-			.parent-avatar {
-				margin-top: 40rpx;
-				margin-left: 40rpx;
-				width: 120rpx;
-				height: 120rpx;
-				border-radius: 100%;
-				border: 6rpx solid #FFFFFF;
-				box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.2);
-			}
-
-			.parent-name {
-				margin-top: 40rpx;
-				margin-left: 20rpx;
-				display: flex;
-				flex-direction: column;
-				font-weight: bold;
-
-				.name {
-					color: $color-title;
-					font-size: 36rpx;
-					font-weight: bold;
-					margin-left: 10rpx;
-				}
-
-				.u-tag {
-					margin-top: 10rpx !important;
-					height: 40rpx;
-					line-height: 36rpx;
-
-					.u-tag__text {
-						font-size: 24rpx !important;
-					}
-				}
-
-				.detail {
-					height: 20rpx;
-					font-size: 24rpx;
-					margin: 10rpx 0 0 10rpx;
-				}
-			}
-		}
-
-		.userinfo-container {
-			height: 100%;
-
-			.box-cart {
-				height: 180rpx;
-				padding: 0 4%;
-				display: flex;
-				justify-content: space-between;
-				align-items: center;
-
-				.box-cart-item {
-					width: 48%;
-					height: 100%;
-					padding-left: 20rpx;
-					border-radius: $card-border-radius;
-					background-color: #fff;
-					display: flex;
-					align-items: center;
-					box-sizing: border-box;
-
-					.t-icon {
-						width: 60rpx !important;
-						height: 60rpx !important;
-						margin-right: 20rpx;
-					}
-
-					.card-text {
-						font-size: 32rpx;
-						font-weight: bolder;
-						margin: 20rpx 0;
-						color: #576064;
-
-						.card-des {
-							margin-top: 10rpx;
-							font-weight: 400;
-							font-size: 24rpx;
-							color: $color-subtitle;
-						}
-					}
-				}
-
-				.left-box {
-					background-image: linear-gradient(to top, #d7e4ff 0%, #d7e4ff 100%);
-				}
-
-				.right-box {
-					background-image: linear-gradient(to top, #ffe1e7 0%, #ffe1e7 100%);
-				}
-			}
-
-			// 功能列表
-			.com-item {
-				width: 92%;
-				margin: 20rpx 4% 0 4%;
-
-				.com-box {
-					overflow: hidden;
-					border-radius: $card-border-radius;
-				}
-			}
-
-			.cell {
-				height: 100rpx;
-				padding-left: 20rpx;
-				padding-right: 20rpx;
-				display: flex;
-				justify-content: space-between;
-				align-items: center;
-				background: #fff;
-				border-bottom: 1px solid #f8f8f8;
-
-				&:active {
-					background: #f2f2f2;
-				}
-
-				&:last-child {
-					border-bottom: none !important;
-				}
-
-				.cell-left {
-					display: flex;
-					align-items: center;
-					padding-left: 20rpx;
-
-					.t-icon {
-						width: 40rpx;
-						height: 40rpx;
-					}
-
-					.cell-text {
-						color: #666;
-						font-size: 28rpx;
-						margin-left: 20rpx;
-					}
-				}
-
-				.cell-right {
-					display: flex;
-					align-items: center;
-
-					.u-badge {
-						margin-right: 10rpx;
-					}
-				}
-			}
-		}
-	}
-</style>

+ 242 - 0
pages/style/tab_pages.scss

@@ -0,0 +1,242 @@
+	//头部背景
+	.bg1 {
+		display: flex;
+		flex-direction: column;
+		margin-top: -400rpx;
+		// width: 1000rpx;
+		height: 1200rpx;
+		border-radius: 100rpx;
+		border-bottom-right-radius: 0;
+		background-color: $color-blue;
+		z-index: 2;
+	
+		.scroll_view {
+			white-space: nowrap;
+			height: 400rpx;
+			margin: 70rpx 0 50rpx 0;
+	
+			.view_box{
+				margin: 0 50rpx;
+				.scroll_view_item {
+					position: relative;
+					display: inline-block;
+					vertical-align: top;
+					margin: 0 50rpx 0 0rpx;
+					width: 380rpx;
+					height: 400rpx;
+					border-radius: 30rpx;
+					background-color: #FFF;
+					
+					.card_info {
+						position: relative;
+						display: flex;
+						align-items: center;
+						padding: 20rpx;
+					
+						.title {
+							font-size: 30rpx;
+							line-height: 40rpx;
+							margin-left: 20rpx;
+						}
+					}
+					
+					.chart_box {
+						width: 100%;
+						height: 300rpx;
+					}
+				}
+			}
+		}
+	}
+	//课程表列
+	.class_list {
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		margin: 0 30rpx 20rpx 30rpx;
+
+		.class_item {
+			display: flex;
+			flex-direction: column;
+			justify-content: space-around;
+			margin: 10rpx 0;
+			padding: 6rpx 0;
+			height: 120rpx;
+			border-bottom: 4rpx solid #f3f4f9;
+			border-top: 4rpx solid #f3f4f9;
+
+			&_title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: $title;
+			}
+
+			&_subtitle {
+				font-size: 30rpx;
+				font-weight: bold;
+				color: $subtitle; 
+				overflow: hidden;    
+				text-overflow:ellipsis;    
+				white-space: nowrap;
+			}
+
+			&_detail {
+				margin-left: 40rpx;
+				line-height: 30rpx;
+				font-size: 26rpx;
+				font-weight: bold;
+				color: $subtitle;
+			}
+		}
+	}
+	//统计卡片
+	.total_card{
+		display: flex;
+		justify-content: space-around;
+		margin: 2% 0;
+		width: 100%;
+		height: 220rpx;
+		background-color: $color-pink;
+		border-radius: $border-radius;
+	}
+	// 卡片图片
+	.image {
+		position: relative;
+		top: -40rpx;
+		right: -40rpx;
+		height: 300rpx;
+		width: 300rpx;
+		background-size: cover;
+		background-repeat: no-repeat;
+		z-index: 2;
+	}
+	// 卡片字体
+	._title{
+		font-size: 54rpx;	
+		font-family: YSfont;
+		color: #FFF;
+	}
+	._subtitle{
+		font-size: 34rpx;
+		font-family: YSfont;
+		color: #FFF;
+	}
+	._unit{
+		margin-left: 20rpx;
+		font-size: 30rpx;
+		font-family: YSfont;
+		opacity: 0.7;
+		color: #FFF;
+	}
+	.scroll_view_bottom{
+		white-space: nowrap;
+		height: 370rpx;
+		._item_box{
+			margin: 0 20rpx;
+			display: inline-block;
+			vertical-align: top;
+			height: 600rpx;
+			width: 84%;
+			.column_item_box{
+				height: 180rpx;
+				width: 100%;
+				margin-bottom: 20rpx;
+				border-radius: $border-radius;
+				background-color: #FFF;
+				overflow: hidden;
+				.image_item{
+					width: 180rpx;
+					height: 180rpx;
+					border-radius: $border-radius;
+					background-size: cover; //背景图片自适应
+					background-repeat: no-repeat;
+					z-index: 50;
+				}
+			}
+			.desc{
+				line-height: 26rpx;
+				font-size: 26rpx;
+				color: #909399;
+				white-space: nowrap;
+				overflow: hidden;
+				text-overflow: ellipsis;
+			}
+		}
+		._item{
+			margin: 0 20rpx;
+			display: inline-block;
+			vertical-align: top;
+			background-color: #FFF;
+			border-radius: $border-radius;
+			height: 320rpx;
+			width: 280rpx;
+			overflow: hidden;
+			z-index: 55;
+			.t-icon {
+				width: 120rpx;
+				height: 120rpx;
+			}
+			.image_box{
+				height: 220rpx;
+				width: 100%;
+				border-radius: $border-radius;
+				background-size: cover; //背景图片自适应
+				background-repeat: no-repeat;
+				z-index: 50;
+			}
+		}
+	}
+	.circle_line1 {
+		position: absolute;
+		width: 352rpx;
+		height: 352rpx;
+		margin-top: 440rpx;
+		margin-left: -70rpx;
+		border: 4rpx solid transparent;
+		border-radius: 100%;
+		background-clip: padding-box, border-box;
+		background-origin: padding-box, border-box;
+		background-image: linear-gradient(to right, #4169E1, #4169E1), linear-gradient(90deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+	.circle_line2 {
+		position: absolute;
+		width: 232rpx;
+		height: 232rpx;
+		margin-top: 500rpx;
+		margin-left: -10rpx;
+		border: 4rpx solid transparent;
+		border-radius: 100%;
+		background-clip: padding-box, border-box;
+		background-origin: padding-box, border-box;
+		background-image: linear-gradient(to right, #4169E1, #4169E1), linear-gradient(0deg, #FFF -75%, rgba(255, 255, 255, 0.0));
+		z-index: 2;
+	}
+	.circle_line3 {
+		position: absolute;
+		width: 176rpx;
+		height: 176rpx;
+		margin-top: 530rpx;
+		margin-left: 20rpx;
+		border: 2rpx solid transparent;
+		border-radius: 100%;
+		background-clip: padding-box, border-box;
+		background-origin: padding-box, border-box;
+		background-image: linear-gradient(to right, #4169E1, #4169E1), linear-gradient(-90deg, #FFF -100%, rgba(255, 255, 255, 0.0));
+		z-index: 3;
+	}
+	
+	.image_box{
+		display: flex;
+		flex-direction: column;
+		height: 100%;
+		align-items: center;
+		margin-bottom: 30rpx;
+	}
+	.detail_image_none {
+		margin-top: -50rpx;
+	  width: 100%;
+	  height: 450rpx;
+	  background-size: cover; //背景图片自适应
+	  background-repeat: no-repeat;
+	  z-index: 50;
+	}

+ 299 - 0
pages/tab_exam/tab_exam.vue

@@ -0,0 +1,299 @@
+<template>
+	<view class="page_view">
+		<!-- 统计 -->
+		<view class="bg1">
+			<view class="circle_line1"></view>
+			<view class="circle_line2"></view>
+			<view class="circle_line3"></view>
+			<top-info :timeStamp="timeStamp"></top-info>
+			<scroll-view class="scroll_view" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+				<view class="view_box">
+					<view class="scroll_view_item" v-for="(item,index) in cardList" :key="index"
+						@click="navGradeList(index)">
+						<view class="card_info">
+							<view :class="item.icon"></view>
+							<view class="title">{{item.title}}</view>
+						</view>
+						<view class="chart_box">
+							<qiun-data-charts :type="item.type" :chartData="item.data" />
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+
+		<!-- 统计卡片 -->
+		<view class="card_view">
+			<view class="total_card">
+				<view class="flex_cloumn" style="justify-content: space-around;margin: 20rpx 0 20rpx 20rpx;">
+					<view class="flex_baseline">
+						<text class="_title">今日评测</text>
+						<text class="_title" style="margin-left: 20rpx;">{{examData.length}}</text>
+						<text class="_unit">例</text>
+					</view>
+					<view class="flex_baseline">
+						<text class="_subtitle">已完成</text>
+						<text class="_subtitle" style="margin-left: 20rpx;">{{finishData.length}}</text>
+						<text class="_unit">例</text>
+					</view>
+					<view class="flex_baseline">
+						<text class="_subtitle">完成情况</text>
+						<text class="_subtitle" style="margin-left: 20rpx;">{{performance}}</text>
+					</view>
+				</view>
+				<view class="image" :style="{backgroundImage:`url(${image})`}"></view>
+			</view>
+			<!-- 列表卡片 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">今日评测</view>
+					<view class="flex_row" style="margin: 0 0 0 auto;" @click="navExamList" v-if="examData.length != 0">
+						<view class="t-icon t-icon-fenlei"></view>
+						<view class="title" style="color: #4169E1;margin-left: 10rpx;">评测列表</view>
+					</view>
+				</view>
+				<view class="class_list">
+					<view class="class_item"
+						:style="{borderImage: none}"
+						v-for="(item,index) in examData" :key="index" @click="navExamData(index)"
+						v-if="examData.length != 0">
+						<view class="flex_row" style="margin: 0 20rpx;">
+							<view class="t-icon t-icon-examicon" style="width: 60rpx; height: 60rpx;"></view>
+							<view class="flex_cloumn" style="height:92rpx;justify-content: space-between;">
+								<view class="flex_row" style="margin-left: 20rpx;">
+									<view class="class_item_title">{{item.examInfo.name}}</view>
+								</view>
+								<view class="flex_row">
+									<view class="tag_fill">
+										<view class="tag_text">{{item.examInfo.subjects[0].name}}</view>
+									</view>
+									<view class="tag_fill">
+										<view class="tag_text">{{item.examInfo.examType.name}}</view>
+									</view>
+									<view class="tag_fill"
+										:style="{backgroundColor: item.examInfo.progress === 'finish'? '#23b46c':'#ff5959'}">
+										<view class="tag_text">{{item.examInfo.progress === 'finish' ? '已完成' : '进行中'}}
+										</view>
+									</view>
+
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="image_box" v-if="examData.length === 0">
+						<view class="detail_image_none" :style="{backgroundImage:`url(${image1})`}"></view>
+						<view class="subtitle">今日孩子暂无评测活动</view>
+					</view>
+				</view>
+			</view>
+
+			<view class="flex_cloumn" style="margin: 15rpx 0 10rpx 20rpx;">
+				<view class="title" style="font-size: 32rpx;">评测练习</view>
+				<view class="bottom_tag"></view>
+			</view>
+
+			<view class="flex_row" style="width: 70%;"></view>
+		</view>
+		<scroll-view class="scroll_view_bottom" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+			<view class="_item" v-for="(item,index) in examPractice" :key="index" @click="navExercisesInfo(index)">
+				<view class="flex_cloumn" style="height: 320rpx;">
+					<view class="flex_row" style="margin: 10rpx;">
+						<view class="t-icon t-icon-yuwen" v-if="item.subject === '语文'"></view>
+						<view class="t-icon t-icon-shuxue" v-if="item.subject === '数学'"></view>
+						<view class="t-icon t-icon-yingyu" v-if="item.subject === '英语'"></view>
+						<view class="t-icon t-icon-tiyu" v-if="item.subject === '体育'"></view>
+						<view class="t-icon t-icon-tianwen" v-if="item.subject === '科学'"></view>
+						<view class="t-icon t-icon-zuixinkecheng" v-if="item.subject === '思品'"></view>
+						<view class="t-icon t-icon-wuli" v-if="item.subject === '物理'"></view>
+						<view class="t-icon t-icon-huaxue" v-if="item.subject === '化学'"></view>
+						<view class="t-icon t-icon-meishu" v-if="item.subject === '美术'"></view>
+						<view class="t-icon t-icon-yinle" v-if="item.subject === '音乐'"></view>
+						<view class="t-icon t-icon-dili" v-if="item.subject === '地理'"></view>
+						<view class="t-icon t-icon-lishi" v-if="item.subject === '历史'"></view>
+						<view class="flex_cloumn" style="height: 100rpx;justify-content: space-around;">
+							<view class="YS_title" style="font-size: 40rpx;">{{item.subject}}</view>
+							<view class="tag_fill"
+								style="background-color: #d8deff;width:fit-content;margin-left: 0;padding: 5rpx 10rpx;">
+								<view class="t-icon t-icon-zhengceguizhang"
+									style="width: 30rpx;height: 30rpx;margin-right: 5rpx;"></view>
+								<view class="tag_text" style="color: #4169E1;">{{item.type}}</view>
+							</view>
+						</view>
+					</view>
+					<view class="flex_cloumn" style="height: 100%;justify-content: space-around;margin: 0 30rpx 20rpx 30rpx;">
+						<view class="YS_title">{{item.title}}</view>
+						<view class="YS_title" style="font-size: 30rpx;">「 {{item.modality}} 」</view>
+						<view class="flex_baseline">
+								<view class="subtitle" style="font-weight: 400;font-size: 28rpx;">评测题量,共</view>
+								<view class="subtitle" style="font-weight: 400;font-size: 40rpx;margin-left: 4rpx;">{{item.amount}}</view>
+								<view class="subtitle" style="font-weight: 400;font-size: 28rpx;margin-left: 4rpx;">题</view>
+						</view>
+
+					</view>
+				</view>
+
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_chart', ['examChartData']),
+			...mapState('m_children', ['examData', 'examPractice'])
+		},
+		data() {
+			return {
+				cardList: [{
+					icon: 't-icon t-icon-zoushi',
+					title: '总成绩走势',
+					type: 'mini-area',
+					data: ''
+				}, {
+					icon: 't-icon t-icon-shuju',
+					title: '单次考试分析',
+					type: 'mini-column',
+					data: ''
+				}, {
+					icon: 't-icon t-icon-jiangzhang',
+					title: '排行占比分析',
+					type: 'mini-area',
+					data: ''
+				}, {
+					icon: 't-icon t-icon-yingyong',
+					title: '优劣科目分析',
+					type: 'mini-rose',
+					data: ''
+				}, {
+					icon: 't-icon t-icon-yunwei',
+					title: '考试能力分析',
+					type: 'mini-column',
+					data: ''
+				}],
+				image: 'https://ouch-cdn2.icons8.com/yFl5NWU3aVehLBlQf9ctvnZPqtm5U0hqM3IzWvFDCaQ/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvNzY5/LzY1ZTQxZmZjLTg1/YWQtNDYyMi1hYzU0/LWQ3NDEzZmY2NGI1/YS5wbmc.png',
+				//完成情况
+				performance: '',
+				//完成数据
+				finishData: '',
+				finishRate: '',
+				timeStamp: '',
+				image1: 'https://image.meiye.art/pic_1631411821365LA63Wc70BLbmyHhj2XjiL',
+			};
+		},
+		onLoad() {
+			this.init()
+		},
+		//刷新页面
+		onPullDownRefresh() {
+			this.init()
+			setTimeout(function() {
+				uni.stopPullDownRefresh();
+			}, 1000);
+		},
+		methods: {
+			//初始化
+			init() {
+				this.timeStamp = (new Date()).format("hh:mm")
+				this.$initExam()
+				this.getChartData()
+				this.getPerformance()
+			},
+			//初始化cardList数据
+			getChartData() {
+				this.cardList[0].data = this.examChartData.totalChartData[0]
+				this.cardList[1].data = this.examChartData.singleChartData[0]
+				this.cardList[2].data = this.examChartData.rankingChartData[0]
+				this.cardList[3].data = this.examChartData.subjectChartData[0]
+				this.cardList[4].data = this.examChartData.levelChartData[0]
+			},
+			//获得评判信息
+			getPerformance() {
+				if (this.examData.length != 0) {
+					this.finishData = this.examData.filter(x => x.examInfo.progress === 'finish')
+					this.finishRate = (this.finishData.length * 100 / this.examData.length).toFixed(0)
+					this.performance = this.finishData.length / this.examData.length >= 0.4 ?
+						(this.finishData.length / this.examData.length >= 0.7 ? '优秀' : '良好') : '较差'
+				} else {
+					this.finishData = []
+					this.finishRate = 0
+					this.performance = '无评测'
+				}
+
+			},
+			//导航
+			navGradeList(index) {
+				if (index === 0) {
+					uni.navigateTo({
+						url: '/subpkg/gradelist/total'
+					})
+				}
+				if (index === 1) {
+					uni.navigateTo({
+						url: '/subpkg/gradelist/single'
+					})
+				}
+				if (index === 2) {
+					uni.navigateTo({
+						url: '/subpkg/gradelist/ranking'
+					})
+				}
+				if (index === 3) {
+					uni.navigateTo({
+						url: '/subpkg/gradelist/subject'
+					})
+				}
+				if (index === 4) {
+					uni.navigateTo({
+						url: '/subpkg/gradelist/level'
+					})
+				}
+			},
+			navExamList() {
+				let value = this.finishRate
+				uni.navigateTo({
+					url: `/subpkg/datalist/examlist?value=${value}`
+				})
+			},
+			navExamData(index) {
+				uni.navigateTo({
+					url: `/subpkg/datalist/examdata?index=${index}`
+				})
+			},
+			navExercisesInfo(index){
+				uni.navigateTo({
+					url: `/subpkg/exam/exercisesinfo?index=${index}`
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import '@/pages/style/tab_pages.scss';
+
+	.bg1 {
+		background-color: $color-pink;
+	}
+
+	.tag_fill {
+		background-color: $color-pink;
+		margin-left: 20rpx;
+	}
+
+	.circle_line1 {
+		background-image: linear-gradient(to right, #ff8caf, #ff8caf), linear-gradient(90deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+
+	.circle_line2 {
+		background-image: linear-gradient(to right, #ff8caf, #ff8caf), linear-gradient(180deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+
+	.circle_line3 {
+		background-image: linear-gradient(to right, #ff8caf, #ff8caf), linear-gradient(0deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+</style>

+ 800 - 0
pages/tab_home/tab_home.vue

@@ -0,0 +1,800 @@
+<template>
+	<view>
+		<view v-if="!isHomeLoad">
+			<loading></loading>
+		</view>
+		<view class="page_view" v-if="isHomeLoad">
+			<!-- 成绩统计 -->
+			<view class="bg1">
+				<view class="circle_line1"></view>
+				<view class="circle_line2"></view>
+				<view class="circle_line3"></view>
+				<top-info :timeStamp="timeStamp"></top-info>
+				<scroll-view class="scroll_view" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+					<view class="view_box">
+						<view class="scroll_view_item" v-for="(item,index) in cardList" :key="index"
+							@click="navTab(index)">
+							<view class="card_info">
+								<view :class="item.icon"></view>
+								<view class="title">{{item.title}}</view>
+							</view>
+							<view class="chart_box">
+								<qiun-data-charts type="arcbar" :chartData="item.data" :canvas2d='true'
+									:canvasId='item.canvasId' :opts="item.chartOpts" />
+							</view>
+						</view>
+					</view>
+
+				</scroll-view>
+			</view>
+			<!-- 通知 -->
+			<view class="bg2">
+				<view class="notice">
+					<u-notice-bar :text="noticeData" bgColor="rgba(65,105,225,0.4)" color="#FFF"
+						url="/subpkg/mine/messagelist"></u-notice-bar>
+				</view>
+			</view>
+			<!-- 课程 -->
+			<view class="card_view">
+				<!-- 今日课程模块 -->
+				<view class="card_item" style="width: 100%;" v-if="classCurrent != -1">
+					<view class="card_title">
+						<view class="front_tag"></view>
+						<view class="title">今日课程</view>
+						<view class="flex_row" style="margin: 0 0 0 auto;" @click="navClassList">
+							<view class="t-icon t-icon-fenlei"></view>
+							<view class="title" style="color: #4169E1;margin-left: 10rpx;">课程列表</view>
+						</view>
+					</view>
+					<view class="class_list">
+						<!-- 上上节 -->
+						<view class="class_item" v-if="classCurrent === classList.length">
+							<view class="flex_row">
+								<view class="t-icon t-icon-classicon-copy" style="width: 60rpx; height: 60rpx;"></view>
+								<view class="flex_cloumn">
+									<view class="flex_row_home">
+										<view class="class_item_title">{{classList[classCurrent - 3].title}}</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent - 3].name}}</view>
+										</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent - 3].teacher}}</view>
+										</view>
+									</view>
+									<view class="flex_row_home">
+										<view class="class_item_subtitle">上节</view>
+										<view class="class_item_detail" style="font-size: 32rpx;">
+											{{classList[classCurrent - 3].time}}
+										</view>
+									</view>
+								</view>
+
+								<view class="class_btn">
+									<view class="_text">{{classList[classCurrent - 3].attendance?'已出勤':'未出勤'}}</view>
+								</view>
+
+							</view>
+						</view>
+						<!-- 上节 -->
+						<view class="class_item" v-if="classCurrent >= 2">
+							<view class="flex_row">
+								<view class="t-icon t-icon-classicon-copy" style="width: 60rpx; height: 60rpx;"></view>
+								<view class="flex_cloumn">
+									<view class="flex_row_home">
+										<view class="class_item_title">{{classList[classCurrent - 2].title}}</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent - 2].name}}</view>
+										</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent - 2].teacher}}</view>
+										</view>
+									</view>
+									<view class="flex_row_home">
+										<view class="class_item_subtitle">上节</view>
+										<view class="class_item_detail" style="font-size: 32rpx;">
+											{{classList[classCurrent - 2].time}}
+										</view>
+									</view>
+								</view>
+
+								<view class="class_btn">
+									<view class="_text">{{classList[classCurrent - 2].attendance?'已出勤':'未出勤'}}</view>
+								</view>
+
+							</view>
+						</view>
+						<!-- 当前 -->
+						<view class="class_item" style="border-image: linear-gradient(to right, #4169E1, #FFF) 1;">
+							<view class="flex_row">
+								<view class="t-icon t-icon-classicon-copy" style="width: 60rpx; height: 60rpx;"></view>
+								<view class="flex_cloumn">
+									<view class="flex_row_home">
+										<view class="class_item_title" style="color: #4169E1;">
+											{{classList[classCurrent - 1].title}}
+										</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent - 1].name}}</view>
+										</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent - 1].teacher}}</view>
+										</view>
+									</view>
+									<view class="flex_row_home">
+										<view class="class_item_subtitle" style="color: #4169E1;">当前</view>
+										<view class="class_item_detail" style="font-size: 32rpx;color: #4169E1;">
+											{{classList[classCurrent - 1].time}}
+										</view>
+									</view>
+								</view>
+
+								<view class="class_btn" style="background-color: #ff5959;">
+									<view class="_text">{{classList[classCurrent - 1].attendance?'课程中':'未出勤'}}</view>
+								</view>
+
+							</view>
+						</view>
+						<!-- 下节 -->
+						<view class="class_item" v-if="classCurrent != classList.length">
+							<view class="flex_row">
+								<view class="t-icon t-icon-classicon-noarrive" style="width: 60rpx; height: 60rpx;">
+								</view>
+								<view class="flex_cloumn">
+									<view class="flex_row_home">
+										<view class="class_item_title">{{classList[classCurrent].title}}</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent].name}}</view>
+										</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent].teacher}}</view>
+										</view>
+									</view>
+									<view class="flex_row_home">
+										<view class="class_item_subtitle">下节</view>
+										<view class="class_item_detail" style="font-size: 32rpx;">
+											{{classList[classCurrent].time}}
+										</view>
+									</view>
+								</view>
+
+								<view class="class_btn" style="background-color: #909399;">
+									<view class="_text">未开始</view>
+								</view>
+
+							</view>
+						</view>
+						<!-- 下下节 -->
+						<view class="class_item" v-if="classCurrent === 1">
+							<view class="flex_row">
+								<view class="t-icon t-icon-classicon-noarrive" style="width: 60rpx; height: 60rpx;">
+								</view>
+								<view class="flex_cloumn">
+									<view class="flex_row_home">
+										<view class="class_item_title">{{classList[classCurrent+1].title}}</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent+1].name}}</view>
+										</view>
+										<view class="tag">
+											<view class="tag_text">{{classList[classCurrent+1].teacher}}</view>
+										</view>
+									</view>
+									<view class="flex_row_home">
+										<view class="class_item_subtitle">下节</view>
+										<view class="class_item_detail" style="font-size: 32rpx;">
+											{{classList[classCurrent+1].time}}
+										</view>
+									</view>
+								</view>
+
+								<view class="class_btn" style="background-color: #909399;">
+									<view class="_text">未开始</view>
+								</view>
+
+							</view>
+						</view>
+					</view>
+				</view>
+				<!-- 插画模块 -->
+				<view class="card_item" style="width: 100%;" v-if="classCurrent === -1">
+					<view class="card_title">
+						<view class="front_tag"></view>
+						<view class="title">今日课程</view>
+					</view>
+					<view class="detail_image_none" :style="{backgroundImage:`url(${image})`}"></view>
+					<view class="class_list">
+						<view class="class_item" style="height: 120rpx;">
+							<view class="flex_row" style="justify-content: space-between;">
+								<view class="class_item_title" v-if="!isAfterDayClass">
+									{{classList.length === 0 ? '假期充电' : '课间休息'}}
+								</view>
+								<view class="class_item_title" v-if="isAfterDayClass">课程完成</view>
+								<view class="tag" style="margin: 0;">
+									<view class="tag_text" v-if="!isAfterDayClass">
+										{{classList.length === 0 ? '无课' : '下课'}}
+									</view>
+									<view class="tag_text" v-if="isAfterDayClass">放学</view>
+								</view>
+								<view class="class_item_subtitle" style="font-weight: 400;font-size: 26rpx;"
+									v-if="!isAfterDayClass">
+									{{classList.length === 0 ? '合理规划' : '预习下节'}}
+								</view>
+								<view class="class_item_subtitle" style="font-weight: 400;font-size: 26rpx;"
+									v-if="isAfterDayClass">巩固所学</view>
+								<view class="flex_row" @click="navClassList">
+									<view class="t-icon t-icon-fenlei"></view>
+									<view class="class_item_title" style="color: #4169E1;margin-left: 10rpx;">课程列表
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				<!-- 今日打卡模块 -->
+				<view class="card_item" style="height: 300rpx;" @click="navClockStats">
+					<view class="flex_row" style="margin: 20rpx 20rpx 0 20rpx;">
+						<view class="icon_box" style="width: 110rpx;height: 110rpx; background-color: #d8deff;">
+							<view class="t-icon t-icon-a-rilidaka" style="width: 60rpx;height: 60rpx;"></view>
+						</view>
+						<view class="item_block">
+							<view class="subtitle">打卡记录</view>
+							<view class="flex_baseline">
+								<view class="YS_title">{{dayTime.split('月')[0]}}</view>
+								<view class="YS_title" style="font-size: 28rpx; margin-left: 6rpx;">月</view>
+								<view class="YS_title" style="margin-left: 4rpx;">
+									{{dayTime.split('月')[1]}}
+								</view>
+								<view class="YS_title" style="font-size: 28rpx; margin-left: 6rpx;">日</view>
+							</view>
+						</view>
+					</view>
+					<view class="flex_row" style="margin: auto 20rpx 20rpx 20rpx;justify-content: space-between;">
+						<view class="item_block" style="margin-left: -10rpx;">
+							<view class="subtitle">打卡时间</view>
+							<view class="YS_title" v-if="clockTime === '无记录'">
+								{{clockTime}}
+							</view>
+							<view class="flex_baseline" v-if="clockTime != '无记录'">
+								<view class="YS_title">
+									{{clockTime.split(':')[0].replace('0','')}}
+								</view>
+								<view class="YS_title" style="font-size: 28rpx; margin-left: 6rpx;">点</view>
+								<view class="YS_title" style="margin-left: 6rpx;">
+									{{clockTime.split(':')[1]}}
+								</view>
+								<view class="YS_title" style="font-size: 28rpx; margin-left: 6rpx;">分</view>
+							</view>
+						</view>
+						<view class="icon_box" style="width: 110rpx;height: 110rpx;"
+							:style="{backgroundColor: clockState === '未打卡' ? '#ff5959':'#4169E1'}">
+							<view class="YS_title" style="color: #FFF;font-size: 32rpx;">
+								{{clockState}}
+							</view>
+						</view>
+					</view>
+					<view style="width: 0;height: 0;">
+						<view class="image"
+							:style="{backgroundImage: clockState === '已打卡'?`url(${image2})`:`url(${image1})`}">
+						</view>
+					</view>
+				</view>
+				<!-- 今日出席模块 -->
+				<view class="card_item" style="background-color: #f3f4f9;justify-content: space-between;">
+					<!-- 当前课程 -->
+					<view class="item_box1">
+						<view class="icon_box" style="background-color: #d8deff; margin-left: 20rpx;">
+							<view class="t-icon t-icon-shangke-"></view>
+						</view>
+						<view class="flex_cloumn"
+							style="align-items: center; justify-content: space-around;height: 80rpx;">
+							<view class="subtitle" style="font-size: 24rpx;">当前课程</view>
+							<view class="YS_title" v-if="classCurrent!=-1">
+								{{classList[classCurrent - 1].name}}
+							</view>
+							<view class="YS_title" v-if="classCurrent===-1">无课程</view>
+						</view>
+						<view v-if="classCurrent != -1">
+							<view class="icon_box" style="margin-right: 20rpx;"
+								:style="{backgroundColor: classList[classCurrent - 1].attendance ? '#23b46c':'#ff5959'}">
+								<view class="YS_title" style="color: #FFF;font-size: 32rpx;">
+									{{classList[classCurrent - 1].attendance ? '出勤':'缺勤'}}
+								</view>
+							</view>
+						</view>
+						<view v-if="classCurrent === -1">
+							<view class="icon_box" style="margin-right: 20rpx;background-color: #f9c752;">
+								<view class="YS_title" style="color: #FFF;font-size: 32rpx;">休息</view>
+							</view>
+						</view>
+					</view>
+					<!-- 出勤课程统计 -->
+					<view class="item_box2">
+						<view class="icon_box" style="background-color: #d8deff;margin-left: 20rpx;">
+							<view class="t-icon t-icon-shangkejilu"></view>
+						</view>
+						<view class="flex_cloumn"
+							style="align-items: center;justify-content: space-around;height: 80rpx;">
+							<view class="subtitle" style="font-size: 24rpx;">出勤课程</view>
+							<view class="YS_title" v-if="classList">{{finishClassNum}}节课</view>
+							<view class="YS_title" v-if="!classList">0 节</view>
+						</view>
+						<view v-if="classList">
+							<view class="icon_box" style="margin-right: 20rpx;"
+								:style="{backgroundColor: classAttendanceQuality === '全勤' ? '#23b46c':'#ff5959'}">
+								<view class="YS_title" style="color: #FFF;font-size: 32rpx;">{{classAttendanceQuality}}</view>
+							</view>
+						</view>
+						<view v-if="!classList">
+							<view class="icon_box" style="margin-right: 20rpx;background-color: #f9c752;">
+								<view class="YS_title" style="color: #FFF;font-size: 32rpx;">休息</view>
+							</view>
+						</view>
+					</view>
+				</view>
+
+				<!-- 推荐课例列表 -->
+				<view class="flex_cloumn" style="margin: 15rpx 0 10rpx 20rpx;">
+					<view class="title" style="font-size: 32rpx;">课程推荐</view>
+					<view class="bottom_tag"></view>
+				</view>
+				<view class="flex_row" style="width: 70%;"></view>
+			</view>
+			<scroll-view class="scroll_view_bottom" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+				<view class="_item_box" v-for="(item,index) in classData" :key="index" @click="navRecommendInfo(index)">
+
+					<view class="column_item_box" v-for="(classItem,i) in item" :key="i">
+						<view style="display: flex; width: 100%;height: 100%;">
+							<view class="image_item" :style="{backgroundImage: `url(${classItem.coverImage})`}">
+							</view>
+							<view class="flex_cloumn"
+								style="margin: 20rpx 20rpx 20rpx 30rpx;justify-content: space-between;width: 400rpx;">
+								<view class="title" style="font-size: 32rpx;">{{classItem.title}}</view>
+								<view style="display: flex;align-items: center;">
+									<view class="tag_fill" style="background-color: #d8deff;width:fit-content;">
+										<view class="t-icon t-icon-a-wangluokechengzaixianjiaoyu"
+											style="width: 30rpx;height: 30rpx;margin-right: 5rpx;"></view>
+										<view class="tag_text" style="color: #4169E1;">{{classItem.classHour}} 学时</view>
+									</view>
+									<view class="tag_fill"
+										style="background-color: #d8deff;width:fit-content;margin-left: 20rpx;">
+										<view class="t-icon t-icon-xiaoyuanredian"
+											style="width: 30rpx;height: 30rpx;margin-right: 5rpx;"></view>
+										<view class="tag_text" style="color: #4169E1;">{{classItem.learnNum}} 已学</view>
+									</view>
+								</view>
+								<view class="desc">{{classItem.description}}</view>
+							</view>
+						</view>
+					</view>
+
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+
+	export default {
+		computed: {
+			...mapState('m_children', ['classList', 'examData', 'workData', 'swapData', 'clockData']),
+			...mapState('m_parent', ['userData', 'classData'])
+		},
+		data() {
+			return {
+				cardList: [{
+					icon: 't-icon t-icon-chakandingdan',
+					title: '今日评测',
+					canvasId: 'tab_home_chart1',
+					data: {
+						"series": [{
+							"name": "评测完成率",
+							"data": '无评测',
+							"color": "#ff8caf"
+						}]
+					},
+					chartOpts: {}
+				}, {
+					icon: 't-icon t-icon-renwu',
+					title: '今日作业',
+					canvasId: 'tab_home_chart2',
+					data: {
+						"series": [{
+							"name": "作业完成率",
+							"data": '无作业',
+							"color": "#f9c752"
+						}]
+					},
+					chartOpts: {}
+				}, {
+					icon: 't-icon t-icon-wenjian',
+					title: '今日活动',
+					canvasId: 'tab_home_chart3',
+					data: {
+						"series": [{
+							"name": "活动完成率",
+							"data": '无活动',
+							"color": "#FF6D31"
+						}]
+					},
+					chartOpts: {}
+				}],
+				noticeData: '',
+				//当前课程索引
+				classCurrent: '',
+				//已上课程
+				finishClassNum: '',
+				//课程缺省image
+				image: 'https://image.meiye.art/pic_1631411821366fqhkuMI110LbOlAIdv1SV',
+				//时间戳
+				timeStamp: '',
+				//今日时间
+				dayTime: '',
+				//打卡状态
+				clockState: '',
+				//打卡时间
+				clockTime: '',
+				//出勤课程统计信息
+				classAttendanceQuality: '',
+				//打卡状态image
+				image1: 'https://ouch-cdn2.icons8.com/2farWQUdLe8J4mb4oQoEvJpl5OFXtM5P7AZi8nhuOxk/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9zdmcvOTYz/L2VkZGEwNzAzLTAw/MWYtNGZiZS1hY2I3/LTVlNjRhZGYzNTAx/Mi5zdmc.png',
+				image2: 'https://ouch-cdn2.icons8.com/6CkTSZQdyBYaGiqmNJRhbqoYi8QDcLFn-04VEQyQaCo/rs:fit:962:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9zdmcvNzMz/LzlhYmUzYjIyLTRl/ZGQtNDVkMi1iYWEw/LTVjYjk2NThmNDJi/OC5zdmc.png',
+				//当前页面加载是否完成
+				isHomeLoad: false,
+				//今日课程是否上完
+				isAfterDayClass: false
+			};
+		},
+		onLoad() {
+			this.init()
+		},
+		//刷新页面
+		onPullDownRefresh() {
+			this.init()
+			setTimeout(function() {
+				uni.stopPullDownRefresh();
+			}, 1000);
+		},
+		methods: {
+			//初始化页面
+			async init() {
+				await this.$initHome()
+				this.dayTime = (new Date()).format('M-d').replace('-', '月')
+				this.timeStamp = (new Date()).format("hh:mm")
+				this.getClassCurrent()
+				this.getChartData()
+				this.getNoticeData()
+				this.getClockData()
+				this.getClassAttendance()
+				this.isHomeLoad = true
+			},
+
+			//计算出当前课程
+			getClassCurrent() {
+				//当前时间戳是否在课程时间段内
+				function CompareDate(start, finish) {
+					//获得当前时间时间戳
+					let timeNow = (new Date()).format("yyyy-MM-dd hh:mm").replace(new RegExp("-", "gm"), "/")
+					let timeHaoMiao = (new Date(timeNow)).getTime()
+					//获得课程开始结束时间戳
+					let today = (new Date()).format("yyyy-MM-dd ")
+					let classStart = (today + start).replace(new RegExp("-", "gm"), "/")
+					let classFinish = (today + finish).replace(new RegExp("-", "gm"), "/")
+					let classStartHaoMiao = (new Date(classStart)).getTime()
+					let classFinishHaoMiao = (new Date(classFinish)).getTime()
+					//比较
+					if (timeHaoMiao < classFinishHaoMiao) {
+						if (classStartHaoMiao < timeHaoMiao)
+							return true
+					}
+					return false
+				}
+				//当前时间戳是否在课程开始时间之前
+				function CompareDateStart(start) {
+					//获得当前时间时间戳
+					let timeNow = (new Date()).format("yyyy-MM-dd hh:mm").replace(new RegExp("-", "gm"), "/")
+					let timeHaoMiao = (new Date(timeNow)).getTime()
+					//获得课程开始结束时间戳
+					let today = (new Date()).format("yyyy-MM-dd ")
+					let classStart = (today + start).replace(new RegExp("-", "gm"), "/")
+					let classStartHaoMiao = (new Date(classStart)).getTime()
+					//比较
+					if (timeHaoMiao < classStartHaoMiao)
+						return true
+					return false
+				}
+				//今日有课程
+				if (this.classList.length != 0) {
+					//当前课程索引
+					let classIndex = -100
+					//完成课程数目
+					let finishNum = -100
+					//是否在课堂中
+					let isInClass = false
+					//判断是否在课程中,若是则赋值为当前课程索引
+					this.classList.some((item, index) => {
+						let timeArr = item.time.split("-")
+						//在课堂中
+						let res = CompareDate(timeArr[0], timeArr[1])
+						if (res) {
+							classIndex = index + 1
+							finishNum = index + 1
+							return isInClass = true
+						}
+					})
+					if (isInClass) {
+						//当前课程赋值
+						this.classCurrent = classIndex
+						//已上课程赋值
+						this.finishClassNum = finishNum
+					} else {
+						//是否放学
+						this.classList.some((item, index) => {
+							let timeArr = item.time.split("-")
+							//没在课堂中
+							let value = CompareDateStart(timeArr[0])
+							//课间时间
+							if (value) {
+								classIndex = -1
+								finishNum = index - 1
+								this.isAfterDayClass = false
+							} else {
+								//放学时间(有课程但已上完状态)
+								classIndex = -1
+								finishNum = this.classList.length
+								this.isAfterDayClass = true
+							}
+						})
+						//当前课程赋值
+						this.classCurrent = classIndex
+						//已上课程赋值
+						this.finishClassNum = finishNum
+					}
+					//无课程,放假时间
+				} else {
+					//当前课程赋值
+					this.classCurrent = -1
+					//已上课程赋值
+					this.finishClassNum = 0
+				}
+			},
+			//更新图表数据
+			getChartData() {
+				//完成数据
+				if (this.examData.length != 0) {
+					let examFinishData = this.examData.filter(x => x.examInfo.progress === 'finish')
+					this.cardList[0].data.series[0].data = parseFloat((examFinishData.length / this.examData.length)
+						.toFixed(2))
+				}
+				if (this.workData.length != 0) {
+					let workFinishData = this.workData.filter(x => x.work.progress === 'finish')
+					this.cardList[1].data.series[0].data = parseFloat((workFinishData.length / this.workData.length)
+						.toFixed(2))
+				}
+				if (this.swapData.length != 0) {
+					let swapFinishData = this.swapData.filter(x => x.vote && x.vote.progress === 'finish')
+					swapFinishData.push(...this.swapData.filter(x => x.survey && x.survey.progress === 'finish'))
+					this.cardList[2].data.series[0].data = parseFloat((swapFinishData.length / this.swapData.length)
+						.toFixed(2))
+				}
+				//完成率传入图表
+				for (let i = 0; i < 3; i++) {
+					if (typeof(this.cardList[i].data.series[0].data) === typeof(0)) {
+						let opt = {
+							title: {
+								name: (this.cardList[i].data.series[0].data * 100).toFixed(0) + '%',
+								color: this.cardList[i].data.series[0].color
+							},
+							subtitle: {
+								name: this.cardList[i].data.series[0].name
+							},
+						}
+						this.cardList[i].chartOpts = JSON.parse(JSON.stringify(opt))
+					} else {
+						let opt = {
+							title: {
+								name: this.cardList[i].data.series[0].data,
+								color: this.cardList[i].data.series[0].color
+							},
+							subtitle: {
+								name: this.cardList[i].data.series[0].name
+							},
+						}
+						this.cardList[i].chartOpts = JSON.parse(JSON.stringify(opt))
+					}
+				}
+			},
+			//日历数据获取
+			getClockData() {
+				//获得当前时间时间戳
+				let today = (new Date()).format("yyyy-M-dd")
+				let timeArr = today.split("-")
+				if (this.clockData.length != 0) {
+					let val = this.clockData.filter(x => x.year == timeArr[0] && x.month == timeArr[1] && x.date ==
+						timeArr[2])
+					if (val.length != 0) {
+						this.clockState = '已打卡'
+						this.clockTime = val[0].time
+					} else {
+						this.clockState = '未打卡'
+						this.clockTime = '无记录'
+					}
+				} else {
+					this.clockState = '未打卡'
+					this.clockTime = '无记录'
+				}
+				// let isWeekend = new Date(today).getDay()
+				// if(isWeekend === 0 || isWeekend === 6){
+				// 	this.clockState = '放假中'
+				// 	this.clockTime = '无需打卡'
+				// }
+			},
+			//获取滚动通知
+			getNoticeData() {
+				if (this.userData.msgList)
+					this.noticeData = `您有 ${this.userData.msgList.length} 条通知,请点击查看`
+				if (!this.userData.msgList)
+					this.noticeData = `您已查看全部通知`
+			},
+			//获取出勤课程统计
+			getClassAttendance() {
+				let finishClassData = []
+				for (let i = 0; i < this.finishClassNum; i++) {
+					finishClassData.push(this.classList[i])
+				}
+				if (finishClassData.length != 0) {
+					let isAttendArr = finishClassData.filter(x => x.attendance === true)
+					this.classAttendanceQuality = isAttendArr.length === this.finishClassNum ? '全勤' : '缺勤'
+				}
+			},
+			//导航
+			navClassList() {
+				let current = this.classCurrent
+				uni.navigateTo({
+					url: `/subpkg/home/classlist?index=${current}`
+				})
+			},
+			navTab(index) {
+				if (index === 0) {
+					uni.switchTab({
+						url: '/pages/tab_exam/tab_exam'
+					})
+				}
+				if (index === 1) {
+					uni.switchTab({
+						url: '/pages/tab_work/tab_work'
+					})
+				}
+				if (index === 2) {
+					uni.switchTab({
+						url: '/pages/tab_swap/tab_swap'
+					})
+				}
+			},
+			navClockStats() {
+				uni.navigateTo({
+					url: '/subpkg/home/clockstats'
+				})
+			},
+			navRecommendInfo(index){
+				uni.navigateTo({
+					url: `/subpkg/home/recommendinfo?index=${index}`
+				})
+			}
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import '@/pages/style/tab_pages.scss';
+
+	.bg2 {
+		margin-top: -1065rpx;
+		height: 1200rpx;
+		border-radius: 100rpx;
+		border-bottom-left-radius: 0;
+		background-color: #FFF;
+		z-index: 1;
+
+		.notice {
+			margin: 1095rpx 50rpx 20rpx 50rpx;
+			width: 650rpx;
+		}
+	}
+
+	.flex_row_home {
+		display: flex;
+		align-items: center;
+		margin: 10rpx 20rpx;
+	}
+
+	.tag {
+		margin-left: 20rpx;
+	}
+
+	.item_box1 {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		width: 100%;
+		height: 140rpx;
+		background-color: #FFF;
+		border-radius: $border-radius;
+	}
+
+	.item_box2 {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		width: 100%;
+		height: 140rpx;
+		background-color: #FFF;
+		border-radius: $border-radius;
+	}
+
+
+	.icon_box {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		width: 80rpx;
+		height: 80rpx;
+		border-radius: 12rpx;
+		z-index: 9;
+
+		.t-icon {
+			width: 50rpx;
+			height: 50rpx;
+		}
+	}
+
+	.item_block {
+		display: flex;
+		flex-direction: column;
+		width: 190rpx;
+		height: 110rpx;
+		justify-content: space-around;
+		align-items: center;
+	}
+
+	.class_btn {
+		display: flex;
+		align-items: center;
+		margin-left: auto;
+		border-radius: $border-radius;
+		background-color: $color-green;
+		padding: 24rpx 12rpx;
+
+		.t-icon {
+			width: 32rpx;
+			height: 32rpx;
+		}
+
+		._text {
+			color: #FFF;
+			font-size: 24rpx;
+			font-weight: bold;
+			transform: skew(-10deg);
+		}
+	}
+
+	.image {
+		margin-top: -130rpx;
+		margin-left: -20rpx;
+		height: 170rpx;
+		width: 170rpx;
+		background-size: 100%;
+		background-repeat: no-repeat;
+		opacity: 0.25;
+		z-index: 1;
+	}
+
+	.scroll_view_bottom {
+		white-space: nowrap;
+		height: 630rpx;
+	}
+</style>

+ 288 - 0
pages/tab_mine/tab_mine.vue

@@ -0,0 +1,288 @@
+<template>
+	<view>
+		<view class="content">
+			<view class="bg1"></view>
+			<view class="bg2"></view>
+			<view class="bg3"></view>
+			<!-- 个人信息 -->
+			<view class="info_box">
+				<image class="avatar" :src="parentInfo.avatarUrl"></image>
+				<view class="flex_cloumn">
+					<view class="YS_title" style="font-size: 55rpx;">{{parentInfo.nickName}}</view>
+					<view class="YS_title" style="font-size: 40rpx;color: #909399;">{{childInfo.name}}家长</view>
+				</view>
+			</view>
+			<!-- 卡片列表 -->
+			<view class="card_view" style="margin-top: 50rpx;">
+				<view class="card_item" style="background-color: #d7e4ff;" @click="navChooseChild">
+					<view class="flex_row">
+						<view class="t-icon t-icon-a-boshimaojiaoyu"
+							style="width: 60rpx;height: 60rpx;margin-left: 25rpx;"></view>
+						<view class="flex_cloumn" style="margin: 30rpx 0 30rpx 25rpx;">
+							<view class="YS_title" style="margin: 20rpx 0;font-size: 40rpx;font-size: 300">孩子切换</view>
+							<view class="YS_title" style="font-size:30rpx;margin: 10rpx 0;color: #909399;">查看更多信息</view>
+						</view>
+					</view>
+				</view>
+				<view class="card_item" style="background-color: #ffe1e7;" @click="navChildInfo">
+					<view class="flex_row">
+						<view class="t-icon t-icon-a-jiangpaijiangzhang"
+							style="width: 60rpx;height: 60rpx;margin-left: 25rpx;"></view>
+						<view class="flex_cloumn" style="margin: 30rpx 0 30rpx 25rpx;">
+							<view class="YS_title" style="margin: 20rpx 0;font-size: 40rpx;font-size: 300;">孩子名片</view>
+							<view class="YS_title" style="font-size:30rpx;margin: 10rpx 0;color: #909399;">晒出优秀表现</view>
+						</view>
+					</view>
+				</view>
+				<!-- 功能模块 -->
+				<view class="card_item" style="width: 100%;">
+					<view class="com-box">
+						<view class="cell" @click="navInfo">
+							<view class="cell-left">
+								<view class="t-icon t-icon-zhanghu"></view>
+								<view class="cell-text">个人信息</view>
+							</view>
+							<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
+						</view>
+						<view class="cell" @click="navMsg">
+							<view class="cell-left">
+								<view class="t-icon t-icon-a-liaotianpingluntaolunduihua"></view>
+								<view class="cell-text">我的消息</view>
+							</view>
+							<view class="cell-right" v-if="userData.msgList.length != 0">
+								<view style="margin-right: 20rpx;">
+									<u-badge type="warning" shape="horn" :value="userData.msgList.length"></u-badge>
+								</view>
+								<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
+							</view>
+						</view>
+						<view class="cell" @click="navSubscribe">
+							<view class="cell-left">
+								<view class="t-icon t-icon-shoucang"></view>
+								<view class="cell-text">订阅中心</view>
+							</view>
+							<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
+						</view>
+					</view>
+				</view>
+				<!-- 功能模块 -->
+				<view class="card_item" style="width: 100%;">
+					<view class="com-box">
+						<view class="cell" @click="logOut">
+							<view class="cell-left">
+								<view class="t-icon t-icon-a-tuichulikai"></view>
+								<view class="cell-text">退出登录</view>
+							</view>
+							<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
+						</view>
+						<view class="cell">
+							<view class="cell-left">
+								<view class="t-icon t-icon-a-appyingyongchengxukaifa"></view>
+								<view class="cell-text">帮助中心</view>
+							</view>
+							<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
+						</view>
+						<view class="cell">
+							<view class="cell-left">
+								<view class="t-icon t-icon-shuji"></view>
+								<view class="cell-text">用户协议</view>
+							</view>
+							<view class="t-icon t-icon-you" style="width: 45rpx;height: 45rpx;"></view>
+						</view>
+					</view>
+				</view>
+				<!-- 功能模块 -->
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_parent', ['parentInfo', 'userData','childrenData']),
+			...mapState('m_children', ['childInfo'])
+		},
+		data() {
+			return {
+			};
+		},
+		methods:{
+			...mapMutations('m_parent', ['updateToken', 'updateParentInfo', 'updatePhoneNumber','updateChildrenData','updateUserData']),
+			...mapMutations('m_children', ['updateChildInfo']),
+			//退出登录事件
+			async logOut() {
+				const [err, succ] = await uni.showModal({
+					title: '提示',
+					content: '确认退出登录吗?'
+				}).catch(err => err)
+				if (succ && succ.confirm) {
+					this.updateToken()
+					this.updateParentInfo()
+					this.updatePhoneNumber()
+					this.updateChildrenData()
+					this.updateUserData()
+					this.updateChildInfo()
+					uni.reLaunch({
+						url: '/subpkg/startup/login'
+					})
+				}
+			},
+			//切换孩子
+			navChooseChild() {
+				uni.navigateTo({
+					url: '/subpkg/startup/options'
+				})
+			},
+			//孩子名片
+			navChildInfo() {
+				let tmdidArr = this.childrenData.map(x=>{return x.tmdid})
+				let index = tmdidArr.indexOf(this.childInfo.tmdid)
+				uni.navigateTo({
+					url: `/subpkg/mine/childinfo?index=${index}`
+				})
+			},
+			//家长信息
+			navInfo() {
+				uni.navigateTo({
+					url: '/subpkg/mine/parentinfo'
+				})
+			},
+			//我的消息
+			navMsg() {
+				uni.navigateTo({
+					url: '/subpkg/mine/messagelist'
+				})
+			},
+			//订阅信息
+			navSubscribe(){
+				uni.navigateTo({
+					url: '/subpkg/mine/subscribeinfo'
+				})
+			}
+			
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	//登录页面
+	.content {
+		height: 100%;
+		width: 100%;
+		overflow-x: hidden;
+
+		.bg1 {
+			position: fixed;
+			top: -250rpx;
+			right: -250rpx;
+			width: 680rpx;
+			height: 680rpx;
+			border-radius: 100%;
+			background-color: $color-blue;
+			z-index: 5;
+		}
+
+		.bg2 {
+			position: fixed;
+			right: -300rpx;
+			top: 200rpx;
+			width: 600rpx;
+			height: 600rpx;
+			border-radius: 100%;
+			background-color: $color-red;
+			z-index: 4;
+		}
+
+		.bg3 {
+			position: fixed;
+			top: 500rpx;
+			right: 450rpx;
+			width: 600rpx;
+			height: 600rpx;
+			border-radius: 100%;
+			background-color: $color-yellow;
+			z-index: 4;
+		}
+
+		.info_box {
+			width: 100%;
+			margin-top: 200rpx;
+			margin-left: 40rpx;
+			display: flex;
+			align-items: center;
+			z-index: 10;
+
+			.avatar {
+				width: 120rpx;
+				height: 120rpx;
+				border-radius: 100%;
+				border: 4rpx solid #FFFFFF;
+				box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.2);
+			}
+
+			.flex_cloumn {
+				margin-left: 40rpx;
+				width: 200rpx;
+				height: 120rpx;
+				justify-content: space-around;
+			}
+		}
+
+		// 功能按钮模块
+		.com-box {
+			overflow: hidden;
+			border-radius: $border-radius;
+
+			.cell {
+				height: 100rpx;
+				padding-left: 20rpx;
+				padding-right: 20rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				background: #fff;
+				border-bottom: 1px solid #f8f8f8;
+
+				&:active {
+					background: #f2f2f2;
+				}
+
+				&:last-child {
+					border-bottom: none !important;
+				}
+
+				.cell-left {
+					display: flex;
+					align-items: center;
+					padding-left: 20rpx;
+
+					.t-icon {
+						width: 40rpx;
+						height: 40rpx;
+					}
+
+					.cell-text {
+						color: #666;
+						font-size: 28rpx;
+						margin-left: 20rpx;
+					}
+				}
+
+				.cell-right {
+					display: flex;
+					align-items: center;
+
+					.u-badge {
+						margin-right: 10rpx;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 277 - 0
pages/tab_swap/tab_swap.vue

@@ -0,0 +1,277 @@
+<template>
+	<view class="page_view">
+		<!-- 统计 -->
+		<view class="bg1">
+			<view class="circle_line1"></view>
+			<view class="circle_line2"></view>
+			<view class="circle_line3"></view>
+			<top-info :timeStamp="timeStamp"></top-info>
+			<scroll-view class="scroll_view" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+				<view class="view_box">
+					<view class="scroll_view_item" v-for="(item,index) in cardList" :key="index" @click="navSwapStats">
+						<view class="card_info">
+							<view :class="item.icon"></view>
+							<view class="title">{{item.title}}</view>
+						</view>
+						<view class="chart_box">
+							<qiun-data-charts :type="item.type" :chartData="item.data" :opts="{legend:{show: false}}" />
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+		<!-- 统计卡片 -->
+		<view class="card_view">
+			<view class="total_card" style="background-color:#FF6D31">
+				<view class="flex_cloumn" style="justify-content: space-around;margin: 20rpx 0 20rpx 20rpx;">
+					<view class="flex_baseline">
+						<text class="_title">今日活动</text>
+						<text class="_title" style="margin-left: 20rpx;">{{swapData.length}}</text>
+						<text class="_unit">例</text>
+					</view>
+					<view class="flex_baseline">
+						<text class="_subtitle">已完成</text>
+						<text class="_subtitle" style="margin-left: 20rpx;">{{finishData.length}}</text>
+						<text class="_unit">例</text>
+					</view>
+					<view class="flex_baseline">
+						<text class="_subtitle">完成情况</text>
+						<text class="_subtitle" style="margin-left: 20rpx;">{{performance}}</text>
+					</view>
+				</view>
+				<view class="image" :style="{backgroundImage:`url(${image})`}"></view>
+			</view>
+			<!-- 列表卡片 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">今日活动</view>
+					<view class="flex_row" style="margin: 0 0 0 auto;" @click="navSwapList" v-if="swapData.length != 0">
+						<view class="t-icon t-icon-fenlei"></view>
+						<view class="title" style="color: #4169E1;margin-left: 10rpx;">活动列表</view>
+					</view>
+				</view>
+				<view class="class_list">
+					<view class="class_item" :style="{borderImage: none}" v-for="(item,index) in swapData" :key="index" @click="navSwapData(index)" v-if="swapData.length != 0">
+						<view class="flex_row" style="margin: 0 20rpx;">
+							<view class="t-icon t-icon-swapfont" style="width: 60rpx; height: 60rpx;"></view>
+							<view class="flex_cloumn">
+								<view class="flex_row">
+									<view class="class_item_title">{{item.survey.name || item.vote.name}}</view>
+									<view class="tag_fill" style="background-color: #FF6D31;">
+										<view class="tag_text">
+											{{item.survey.scope === 'private' ? '个人':'学校' || item.vote.scope === 'private' ? '个人':'学校'}}
+										</view>
+									</view>
+									<view class="tag_fill"
+										:style="{backgroundColor: item.survey.progress === 'finish' || item.vote.progress === 'finish'? '#23b46c':'#ff5959'}">
+										<view class="tag_text">
+											{{item.survey.progress === 'finish' || item.vote.progress === 'finish' ? '已完成' : '进行中'}}
+										</view>
+									</view>
+								</view>
+								<view class="flex_row"
+									style="width:510rpx;overflow: hidden;white-space: nowrap;text-overflow: ellipsis">
+									<view class="class_item_subtitle" style="font-size: 26rpx;font-weight: 400;">
+										{{item.vote.description || item.survey.description}}
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="image_box" v-if="swapData.length === 0">
+						<view class="detail_image_none" :style="{backgroundImage:`url(${image1})`}"></view>
+						<view class="subtitle">今日暂无投票问卷活动</view>
+					</view>
+				</view>
+			</view>
+
+			<view class="flex_cloumn" style="margin: 15rpx 0 10rpx 20rpx;">
+				<view class="title" style="font-size: 32rpx;">家校互动</view>
+				<view class="bottom_tag"></view>
+			</view>
+
+			<view class="flex_row" style="width: 70%;"></view>
+		</view>
+		<scroll-view class="scroll_view_bottom" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+			<view class="_item">
+				<view class="_item_inner"></view>
+			</view>
+			<view class="_item"></view>
+			<view class="_item"></view>
+			<view class="_item"></view>
+			<view class="_item"></view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children', ['swapData']),
+			...mapState('m_parent', ['childDailyData'])
+		},
+		data() {
+			return {
+				//图表卡片列表
+				cardList: [{
+					icon: 't-icon t-icon-zoushi1',
+					title: '近期学习对比',
+					type: 'mini-column',
+					data: '',
+				}, {
+					icon: 't-icon t-icon-lishijilu',
+					title: '近期运动记录',
+					type: 'pie',
+					data: '',
+				}, {
+					icon: 't-icon t-icon-naozhong',
+					title: '近期睡眠记录',
+					type: 'ring',
+					data: '',
+				}],
+				image: 'https://ouch-cdn2.icons8.com/LW70TMgW1cGfYeGNSTEp7__kiKVgIhwdZwUmykdLYMY/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvOTI0/LzU3MWU4ZDZkLTg0/NzEtNGM5YS04MDJk/LTEzNTM5YmZmZTM2/YS5wbmc.png',
+				//完成情况
+				performance: '',
+				//完成数据
+				finishData: '',
+				finishRate: '',
+				timeStamp: '',
+				image1: 'https://image.meiye.art/pic_1631411820764Vm5iw82gnV2lVKWRokFmU'
+			};
+		},
+		onLoad() {
+			this.init()
+		},
+		//刷新页面
+		onPullDownRefresh() {
+			this.init()
+			setTimeout(function() {
+				uni.stopPullDownRefresh();
+			}, 1000);
+		},
+		methods: {
+			...mapMutations('m_chart', ['updateSwapChartData']),
+			//初始化
+			init() {
+				this.timeStamp = (new Date()).format("hh:mm")
+				this.getPerformance()
+				this.$initSwap()
+				this.getSwapChartData()
+			},
+			//获得统计图表信息
+			getSwapChartData() {
+				let recentDate = this.$getRecentDateArray(this.childDailyData.study.length);
+				let swapChartData = [];
+				let studyColumn = {
+					categories: recentDate,
+					series: [{
+							name: '自主学习',
+							data: this.childDailyData.study
+						},
+						{
+							name: '娱乐放松',
+							data: this.childDailyData.rest
+						}
+					]
+				};
+				//运动记录表
+				let exercisePie = {
+					series: [{
+						data: [{}, {}, {}, {}, {}, {}, {}]
+					}]
+				};
+				//睡眠记录表
+				let sleepRing = {
+					series: [{
+						data: [{}, {}, {}, {}, {}, {}, {}]
+					}]
+				};
+				studyColumn.categories.forEach((value, index) => {
+					exercisePie.series[0].data[index].name = value;
+					exercisePie.series[0].data[index].value = parseFloat((this.childDailyData.exercise[index]));
+					sleepRing.series[0].data[index].name = value;
+					sleepRing.series[0].data[index].value = this.childDailyData.sleep[index];
+				});
+				swapChartData.push(studyColumn);
+				swapChartData.push(exercisePie);
+				swapChartData.push(sleepRing);
+				this.updateSwapChartData(swapChartData)
+				this.cardList[0].data = studyColumn
+				this.cardList[1].data = exercisePie
+				this.cardList[2].data = sleepRing
+			},
+			//获得评判信息
+			getPerformance() {
+				if (this.swapData.length != 0) {
+					this.finishData = this.swapData.filter(x => x.vote && x.vote.progress === 'finish')
+					this.finishData.push(...this.swapData.filter(x => x.survey && x.survey.progress === 'finish'))
+					this.finishRate = (this.finishData.length * 100 / this.swapData.length).toFixed(0)
+					this.performance = this.finishData.length / this.swapData.length >= 0.4 ?
+						(this.finishData.length / this.swapData.length >= 0.7 ? '优秀' : '良好') : '较差'
+				} else {
+					this.finishData = []
+					this.finishRate = 0
+					this.performance = '无活动'
+				}
+			},
+			navSwapStats() {
+				uni.navigateTo({
+					url: '/subpkg/swap/swapstats'
+				})
+			},
+			navSwapList() {
+				let value = this.finishRate
+				uni.navigateTo({
+					url: `/subpkg/datalist/swaplist?value=${value}`
+				})
+			},
+			navSwapData(index) {
+				uni.navigateTo({
+					url: `/subpkg/datalist/swapdata?index=${index}`
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import '@/pages/style/tab_pages.scss';
+
+	.bg1 {
+		background-color: $color-orange;
+	}
+
+	.flex_row {
+		margin: 5rpx 20rpx;
+	}
+
+	.tag_fill {
+		background-color: $color-orange;
+		margin-left: 20rpx;
+	}
+	.circle_line1 {
+		background-image: linear-gradient(to right, #FF6D31, #FF6D31), linear-gradient(90deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+	.circle_line2 {
+		background-image: linear-gradient(to right, #FF6D31, #FF6D31), linear-gradient(180deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+	.circle_line3 {
+		background-image: linear-gradient(to right, #FF6D31, #FF6D31), linear-gradient(0deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+	._item{
+		background-color: #ccc;
+		background-image: radial-gradient(#fff 50%, transparent 50%);
+		background-position: -5px -5px;
+		background-repeat: repeat;
+		background-size: 10px 10px;
+		padding: 5px;
+		._item_inner{
+			background-color: #ccc;
+		}
+	}
+</style>

+ 301 - 0
pages/tab_work/tab_work.vue

@@ -0,0 +1,301 @@
+<template>
+	<view class="page_view">
+		<!-- 统计 -->
+		<view class="bg1">
+			<view class="circle_line1"></view>
+			<view class="circle_line2"></view>
+			<view class="circle_line3"></view>
+			<top-info :timeStamp="timeStamp"></top-info>
+			<scroll-view class="scroll_view" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+				<view class="view_box">
+					<view class="scroll_view_item" v-for="(item,index) in cardList" :key="index" @click="navWorkStats">
+						<view class="card_info">
+							<view :class="item.icon"></view>
+							<view class="title">{{item.title}}</view>
+						</view>
+						<view class="chart_box">
+							<qiun-data-charts :type="item.type" :chartData="item.data" />
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+		<!-- 统计卡片 -->
+		<view class="card_view">
+			<view class="total_card" style="background-color:#f9c752">
+				<view class="flex_cloumn" style="justify-content: space-around;margin: 20rpx 0 20rpx 20rpx;">
+					<view class="flex_baseline">
+						<text class="_title">今日作业</text>
+						<text class="_title" style="margin-left: 20rpx;">{{workData.length}}</text>
+						<text class="_unit">例</text>
+					</view>
+					<view class="flex_baseline">
+						<text class="_subtitle">已完成</text>
+						<text class="_subtitle" style="margin-left: 20rpx;">{{finishData.length}}</text>
+						<text class="_unit">例</text>
+					</view>
+					<view class="flex_baseline">
+						<text class="_subtitle">完成情况</text>
+						<text class="_subtitle" style="margin-left: 20rpx;">{{performance}}</text>
+					</view>
+				</view>
+				<view class="image" :style="{backgroundImage:`url(${image})`}"></view>
+			</view>
+			<!-- 列表卡片 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">今日作业</view>
+					<view class="flex_row" style="margin: 0 0 0 auto;" @click="navWorkList" v-if="workData.length != 0">
+						<view class="t-icon t-icon-fenlei"></view>
+						<view class="title" style="color: #4169E1;margin-left: 10rpx;">作业列表</view>
+					</view>
+				</view>
+				<view class="class_list">
+					<view class="class_item"
+						:style="{borderImage: none}"
+						v-for="(item,index) in workData" :key="index" @click="navWorkData(index)"
+						v-if="workData.length != 0">
+						<view class="flex_row" style="margin: 0 20rpx;">
+							<view class="t-icon t-icon-workicon" style="width: 60rpx; height: 60rpx;"></view>
+							<view class="flex_cloumn">
+								<view class="flex_row">
+									<view class="class_item_title">{{item.work.name}}</view>
+									<view class="tag_fill" style="background-color: #f9c752;">
+										<view class="tag_text">{{item.work.scope === 'private' ? '个人':'学校'}}</view>
+									</view>
+									<view class="tag_fill"
+										:style="{backgroundColor: item.work.progress === 'finish'? '#23b46c':'#ff5959'}">
+										<view class="tag_text">{{item.work.progress === 'finish' ? '已完成' : '进行中'}}
+										</view>
+									</view>
+								</view>
+								<view class="flex_row"
+									style="width:510rpx;overflow: hidden;white-space: nowrap;text-overflow: ellipsis">
+									<view class="class_item_subtitle" style="font-size: 26rpx;font-weight: 400;">
+										{{item.work.description}}
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="image_box" v-if="workData.length === 0">
+						<view class="detail_image_none" :style="{backgroundImage:`url(${image1})`}"></view>
+						<view class="subtitle">今日孩子暂无作业活动</view>
+					</view>
+				</view>
+			</view>
+
+			<view class="flex_cloumn" style="margin: 15rpx 0 10rpx 20rpx;">
+				<view class="title" style="font-size: 32rpx;">错题本</view>
+				<view class="bottom_tag"></view>
+			</view>
+
+			<view class="flex_row" style="width: 70%;"></view>
+		</view>
+		<scroll-view class="scroll_view_bottom" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+			<view class="_item" v-for="(item,index) in mistakeData" :key="index" @click="navWrongBookInfo(index)">
+				<view class="flex_cloumn_book" :style="{backgroundColor: item.color}">
+					<view class="book_shadow"></view>
+
+					<view class="book_title">{{item.subject}}</view>
+
+					<view class="flex_cloumn_box">
+						<view class="YS_title" style="color: #FFF;font-size: 60rpx;margin-left: auto;">{{item.subject}}
+						</view>
+						<view class="flex_baseline" style="margin-left: auto;">
+							<view class="subtitle" style="font-size: 28rpx;color: #FFF;font-weight: 400;">收录错题</view>
+							<view class="subtitle"
+								style="color: #FFF;font-weight: 400;font-size: 40rpx;margin-left: 4rpx;">
+								{{item.amount}}
+							</view>
+							<view class="subtitle"
+								style="font-size: 28rpx;color: #FFF;font-weight: 400;margin-left: 4rpx;">道</view>
+						</view>
+					</view>
+
+				</view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children', ['workData', 'mistakeData']),
+			...mapState('m_chart', ['workChartData'])
+		},
+		data() {
+			return {
+				cardList: [{
+					icon: 't-icon t-icon-gongzuo',
+					title: '近期作业完成率',
+					type: 'mini-column',
+					data: ''
+				}, {
+					icon: 't-icon t-icon-renzheng',
+					title: '近期作业得分率',
+					type: 'mini-area',
+					data: ''
+				}],
+				image: 'https://ouch-cdn2.icons8.com/AVOwJ9emg_ZOeHvQaunQAZlgeLsG-b1cGhiYvgoJ06g/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvNTAw/LzI5YjU1YWQ4LWMw/YTEtNDE1MS1iYmQw/LWIyMDdhYmRkOTE0/Mi5wbmc.png',
+				//完成情况
+				performance: '',
+				//完成数据
+				finishData: '',
+				finishRate: '',
+				timeStamp: '',
+				image1: 'https://image.meiye.art/pic_16314118207650DBDbJB8Ao3fE8_1bY3Fj',
+			};
+		},
+		onLoad() {
+			this.init()
+		},
+		//刷新页面
+		onPullDownRefresh() {
+			this.init()
+			setTimeout(function() {
+				uni.stopPullDownRefresh();
+			}, 1000);
+		},
+		methods: {
+			//初始化
+			init() {
+				this.timeStamp = (new Date()).format("hh:mm")
+				this.$initWork()
+				this.getWorkChartData()
+				this.getPerformance()
+			},
+			//获得作业图表信息
+			getWorkChartData() {
+				this.cardList[0].data = this.workChartData[0]
+				this.cardList[1].data = this.workChartData[1]
+			},
+			//获得评判信息
+			getPerformance() {
+				if (this.workData.length != 0) {
+					this.finishData = this.workData.filter(x => x.work.progress === 'finish')
+					this.finishRate = (this.finishData.length * 100 / this.workData.length).toFixed(0)
+					this.performance = this.finishData.length / this.workData.length >= 0.4 ?
+						(this.finishData.length / this.workData.length >= 0.7 ? '优秀' : '良好') : '较差'
+				} else {
+					this.finishData = []
+					this.finishRate = 0
+					this.performance = '无作业'
+				}
+			},
+			navWorkStats() {
+				uni.navigateTo({
+					url: '/subpkg/work/workstats'
+				})
+			},
+			navWorkList() {
+				let value = this.finishRate
+				uni.navigateTo({
+					url: `/subpkg/datalist/worklist?value=${value}`
+				})
+			},
+			navWorkData(index) {
+				uni.navigateTo({
+					url: `/subpkg/datalist/workdata?index=${index}`
+				})
+			},
+			navWrongBookInfo(index){
+				uni.navigateTo({
+					url: `/subpkg/work/wrongbookinfo?index=${index}`
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import '@/pages/style/tab_pages.scss';
+
+	.bg1 {
+		background-color: $color-yellow;
+	}
+
+	.flex_row {
+		margin: 5rpx 20rpx;
+	}
+
+	.tag_fill {
+		background-color: $color-pink;
+		margin-left: 20rpx;
+	}
+
+	.image {
+		top: -50rpx;
+	}
+
+	.circle_line1 {
+		background-image: linear-gradient(to right, #f9c752, #f9c752), linear-gradient(90deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+
+	.circle_line2 {
+		background-image: linear-gradient(to right, #f9c752, #f9c752), linear-gradient(180deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+
+	.circle_line3 {
+		background-image: linear-gradient(to right, #f9c752, #f9c752), linear-gradient(0deg, #FFF -50%, rgba(255, 255, 255, 0.0));
+	}
+
+	.scroll_view_bottom {
+		white-space: nowrap;
+		height: 350rpx;
+
+		._item {
+			margin: 4rpx 20rpx 0 20rpx;
+			display: inline-block;
+			vertical-align: top;
+			background-color: #FFF;
+			border-radius: $border-radius;
+			height: 300rpx;
+			width: 240rpx;
+			z-index: 55;
+			box-shadow: 1px 0px 2px #ffffff, 2px -1px 2px #d2d2d2, 3px -2px 2px #b4b4b4;
+		}
+	}
+
+	.flex_cloumn_book {
+		display: flex;
+		flex-direction: column;
+		height: 100%;
+		width: 100%;
+		overflow: hidden;
+	}
+
+	.book_title {
+		position: absolute;
+		margin-top: 60rpx;
+		margin-left: 80rpx;
+		font-size: 130rpx;
+		font-weight: 600;
+		color: #FFF;
+		opacity: 0.2;
+		writing-mode: vertical-lr;
+	}
+
+	.book_shadow {
+		position: absolute;
+		margin-left: 20rpx;
+		height: 300rpx;
+		width: 20rpx;
+		background-image: linear-gradient(to right, rgba(105, 105, 105, 0.1), rgba(255, 255, 255, 0.1));
+	}
+
+	.flex_cloumn_box {
+		display: flex;
+		flex-direction: column;
+		height: 100rpx;
+		width: 200rpx;
+		margin: 160rpx 20rpx 40rpx 20rpx;
+		justify-content: space-between;
+		z-index: 99;
+	}
+</style>

BIN
static/default-icons/boy.png


BIN
static/default-icons/girl.png


+ 58 - 0
static/default_icons/boy_avatar.svg

@@ -0,0 +1,58 @@
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1024 1024" height="1024px" width="1024px">
+    <title>头像-男学生4</title>
+    <defs>
+        <circle r="512" cy="512" cx="512" id="path-1"></circle>
+        <rect height="133" width="94" y="0" x="0" id="path-3"></rect>
+        <path id="path-5" d="M347.567605,-5.73763259e-13 C457.803482,42.9842549 538,174.063276 538,329.095567 C538,519.081521 417.564598,673.095567 269,673.095567 C120.435402,673.095567 9.43064043e-15,519.081521 2.10639249e-14,329.095567 C3.05569149e-14,174.063276 80.1965178,42.9842549 190.432395,-5.77315973e-13 L190.433606,0.010785417 C209.979969,14.8222948 237.944984,24.095567 269,24.095567 C299.729123,24.095567 327.432759,15.0159017 346.948258,0.475249013 Z"></path>
+    </defs>
+    <g fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="头像-男学生4">
+        <rect height="1024" width="1024" y="0" x="0" fill="#FFFFFF"></rect>
+        <g id="编组-3">
+            <mask fill="white" id="mask-2">
+                <use xlink:href="#path-1"></use>
+            </mask>
+            <use xlink:href="#path-1" fill="#77C4F9" fill-opacity="0.2" id="蒙版"></use>
+            <g mask="url(#mask-2)" id="编组-2">
+                <g id="编组" transform="translate(208.927982, 153.975009)">
+                    <path fill="#489AD2" id="形状结合" d="M303.072018,627.024991 C330.404969,627.024991 356.785783,632.238171 381.639622,641.929424 L381.638412,641.940209 C362.092048,656.751719 334.127034,666.024991 303.072018,666.024991 C272.017239,666.024991 244.052415,656.75186 224.506072,641.940549 L224.505016,641.929189 C249.358679,632.238087 275.739287,627.024991 303.072018,627.024991 Z"></path>
+                    <rect rx="112" height="324" width="580" y="116.024991" x="13.0720177" fill="#110D2E" id="矩形"></rect>
+                    <path fill="#FBB4B4" id="椭圆形备份-4" d="M66.5219796,475.850124 C83.9796604,467.270421 86.6032391,443.317655 72.3819068,422.350124 C58.1605745,401.382594 32.4796604,391.340276 15.0219796,399.91998 C-2.43570115,408.499683 -5.05927994,432.452449 9.16205237,453.41998 C23.3833847,474.38751 49.0642988,484.429828 66.5219796,475.850124 Z"></path>
+                    <path fill="#FBB4B4" id="椭圆形备份-12" d="M539.02198,475.850124 C521.564299,467.270421 518.94072,443.317655 533.162052,422.350124 C547.383385,401.382594 573.064299,391.340276 590.52198,399.91998 C607.97966,408.499683 610.603239,432.452449 596.381907,453.41998 C582.160575,474.38751 556.47966,484.429828 539.02198,475.850124 Z"></path>
+                    <line stroke-linejoin="round" stroke-linecap="round" opacity="0.106926328" stroke-width="7" stroke="#000000" id="路径-6" y2="885.661003" x2="144.572018" y1="799.524991" x1="170.572018"></line>
+                    <line transform="translate(448.572018, 842.362677) scale(-1, 1) translate(-448.572018, -842.362677)" stroke-linejoin="round" stroke-linecap="round" opacity="0.106926328" stroke-width="7" stroke="#000000" id="路径-6备份" y2="885.661003" x2="435.572018" y1="799.524991" x1="461.572018"></line>
+                    <g transform="translate(256.072018, 558.024991)" id="椭圆形备份-11">
+                        <mask fill="white" id="mask-4">
+                            <use xlink:href="#path-3"></use>
+                        </mask>
+                        <use xlink:href="#path-3" fill="#FFCACA" id="蒙版"></use>
+                        <ellipse ry="47" rx="79" cy="5" cx="47" mask="url(#mask-4)" opacity="0.214906238" style="mix-blend-mode: multiply;" fill="#EC8484"></ellipse>
+                    </g>
+                    <ellipse ry="225" rx="255" cy="370.024991" cx="303.072018" fill="#FFCACA" id="椭圆形"></ellipse>
+                    <path stroke-linejoin="round" stroke-linecap="round" stroke-width="8" stroke="#FF9494" id="路径-5备份" d="M293.072018,440.024991 L293.072018,466.024991 C293.072018,473.756977 299.340031,480.024991 307.072018,480.024991 L313.904967,480.024991 L313.904967,480.024991"></path>
+                    <circle r="19" cy="413.024991" cx="206.072018" fill="#110D2E" id="椭圆形"></circle>
+                    <circle r="19" cy="413.024991" cx="400.072018" fill="#110D2E" id="椭圆形备份-7"></circle>
+                    <path stroke-linejoin="round" stroke-linecap="round" stroke-width="10" stroke="#EC8484" id="路径-35" d="M260.072018,526.524991 L266.696357,529.386852 C289.575079,539.270966 315.706543,538.21795 337.715776,526.524991 L337.715776,526.524991 L337.715776,526.524991"></path>
+                    <path stroke-linejoin="round" stroke-linecap="round" stroke-width="6" stroke="#110D2E" id="路径-4备份" d="M171.072018,365.653731 C185.19021,361.901238 196.679672,360.024991 205.540404,360.024991 C214.401137,360.024991 226.163897,361.901238 240.828686,365.653731"></path>
+                    <path transform="translate(399.950352, 362.839361) scale(-1, 1) translate(-399.950352, -362.839361)" stroke-linejoin="round" stroke-linecap="round" stroke-width="6" stroke="#110D2E" id="路径-4备份-2" d="M365.072018,365.653731 C379.19021,361.901238 390.679672,360.024991 399.540404,360.024991 C408.401137,360.024991 420.163897,361.901238 434.828686,365.653731"></path>
+                    <rect rx="112.5" height="225" width="545" y="69.0249907" x="31.0720177" fill="#110D2E" id="矩形"></rect>
+                    <ellipse ry="69.5" rx="36.5" cy="66.3599272" cx="296.822018" transform="translate(296.822018, 66.359927) rotate(-300.000000) translate(-296.822018, -66.359927)" fill="#110D2E" id="椭圆形"></ellipse>
+                    <ellipse ry="69.5" rx="36.5" cy="69.3599272" cx="361.822018" transform="translate(361.822018, 69.359927) rotate(-300.000000) translate(-361.822018, -69.359927)" fill="#110D2E" id="椭圆形备份"></ellipse>
+                    <ellipse ry="69.5" rx="36.5" cy="66.3599272" cx="475.822018" transform="translate(475.822018, 66.359927) rotate(-300.000000) translate(-475.822018, -66.359927)" fill="#110D2E" id="椭圆形备份-2"></ellipse>
+                    <ellipse ry="69.5" rx="36.5" cy="115.359927" cx="492.822018" transform="translate(492.822018, 115.359927) rotate(-300.000000) translate(-492.822018, -115.359927)" fill="#110D2E" id="椭圆形备份-3"></ellipse>
+                    <g transform="translate(34.072018, 641.929424)" id="矩形-+-矩形备份-2-+-矩形备份-蒙版">
+                        <mask fill="white" id="mask-6">
+                            <use xlink:href="#path-5"></use>
+                        </mask>
+                        <use xlink:href="#path-5" fill="#77C4F9" id="蒙版"></use>
+                        <rect height="182" width="44" y="19.095567" x="110" mask="url(#mask-6)" fill="#1A82C9" id="矩形"></rect>
+                        <rect height="182" width="318" y="130.095567" x="110" mask="url(#mask-6)" fill="#1A82C9" id="矩形备份-2"></rect>
+                        <rect height="182" width="44" y="19.095567" x="384" mask="url(#mask-6)" fill="#1A82C9" id="矩形备份"></rect>
+                    </g>
+                    <circle r="8" cy="695.024991" cx="303.072018" fill="#1A82C9" id="椭圆形"></circle>
+                    <circle r="8" cy="753.024991" cx="303.072018" fill="#1A82C9" id="椭圆形备份-5"></circle>
+                    <circle r="8" cy="724.024991" cx="303.072018" fill="#1A82C9" id="椭圆形备份-6"></circle>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 69 - 0
static/default_icons/girl_avatar.svg

@@ -0,0 +1,69 @@
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1024 1024" height="1024px" width="1024px">
+    <title>头像-女学生5</title>
+    <defs>
+        <circle r="512" cy="512" cx="512" id="path-1"></circle>
+        <rect height="133" width="94" y="0" x="0" id="path-3"></rect>
+        <ellipse ry="269" rx="344" cy="344" cx="269" id="path-5"></ellipse>
+    </defs>
+    <g fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="头像-女学生5">
+        <rect height="1024" width="1024" y="0" x="0" fill="#FFFFFF"></rect>
+        <g id="编组-3">
+            <mask fill="white" id="mask-2">
+                <use xlink:href="#path-1"></use>
+            </mask>
+            <use xlink:href="#path-1" fill="#1C8784" fill-opacity="0.2" id="蒙版"></use>
+            <g mask="url(#mask-2)" id="编组-2">
+                <g transform="translate(77.482128, 130.947862)">
+                    <ellipse ry="123.5" rx="72.5" cy="425.552138" cx="189.017872" fill-rule="evenodd" fill="#110D2E" stroke="none" id="椭圆形"></ellipse>
+                    <ellipse ry="123.5" rx="72.5" cy="425.552138" cx="680.017872" fill-rule="evenodd" fill="#110D2E" stroke="none" id="椭圆形备份-9"></ellipse>
+                    <g transform="translate(0.000000, 473.052138)" fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="编组">
+                        <circle r="72.5" cy="72.5" cx="189.017872" fill="#110D2E" id="椭圆形备份-5"></circle>
+                        <circle r="49.5" cy="141.5" cx="133.017872" fill="#110D2E" id="椭圆形备份-6"></circle>
+                        <circle r="39" cy="186" cx="92.5178719" fill="#110D2E" id="椭圆形备份-8"></circle>
+                        <path transform="translate(56.735254, 219.960819) rotate(-16.000000) translate(-56.735254, -219.960819)" fill="#110D2E" id="路径-41" d="M109.735254,198.960819 L41.9068525,234.461905 C34.9170394,238.120343 26.2879493,235.738986 22.163787,229.013443 L16.6126387,219.960819 C12.631122,213.467897 14.6670182,204.976687 21.15994,200.99517 C23.3292811,199.664911 25.8243878,198.960819 28.3691137,198.960819 L109.735254,198.960819 L109.735254,198.960819 Z"></path>
+                    </g>
+                    <g transform="translate(738.758936, 600.430185) scale(-1, 1) translate(-738.758936, -600.430185) translate(608.000000, 473.052138)" fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="编组备份">
+                        <circle r="72.5" cy="72.5" cx="189.017872" fill="#110D2E" id="椭圆形备份-5"></circle>
+                        <circle r="49.5" cy="141.5" cx="133.017872" fill="#110D2E" id="椭圆形备份-6"></circle>
+                        <circle r="39" cy="186" cx="92.5178719" fill="#110D2E" id="椭圆形备份-8"></circle>
+                        <path transform="translate(56.735254, 219.960819) rotate(-16.000000) translate(-56.735254, -219.960819)" fill="#110D2E" id="路径-41" d="M109.735254,198.960819 L41.9068525,234.461905 C34.9170394,238.120343 26.2879493,235.738986 22.163787,229.013443 L16.6126387,219.960819 C12.631122,213.467897 14.6670182,204.976687 21.15994,200.99517 C23.3292811,199.664911 25.8243878,198.960819 28.3691137,198.960819 L109.735254,198.960819 L109.735254,198.960819 Z"></path>
+                    </g>
+                    <path fill-rule="evenodd" fill="#FBB4B4" stroke="none" id="椭圆形备份-4" d="M197.967834,498.877271 C215.425515,490.297567 218.049093,466.344802 203.827761,445.377271 C189.606429,424.409741 163.925515,414.367423 146.467834,422.947127 C129.010153,431.52683 126.386574,455.479596 140.607907,476.447127 C154.829239,497.414657 180.510153,507.456975 197.967834,498.877271 Z"></path>
+                    <path fill-rule="evenodd" fill="#FBB4B4" stroke="none" id="椭圆形备份-12" d="M670.467834,498.877271 C653.010153,490.297567 650.386574,466.344802 664.607907,445.377271 C678.829239,424.409741 704.510153,414.367423 721.967834,422.947127 C739.425515,431.52683 742.049093,455.479596 727.827761,476.447127 C713.606429,497.414657 687.925515,507.456975 670.467834,498.877271 Z"></path>
+                    <line stroke-linejoin="round" stroke-linecap="round" opacity="0.106926328" fill="none" stroke-width="7" stroke="#000000" id="路径-6" y2="908.68815" x2="276.017872" y1="822.552138" x1="302.017872"></line>
+                    <line transform="translate(580.017872, 865.389824) scale(-1, 1) translate(-580.017872, -865.389824)" stroke-linejoin="round" stroke-linecap="round" opacity="0.106926328" fill="none" stroke-width="7" stroke="#000000" id="路径-6备份" y2="908.68815" x2="567.017872" y1="822.552138" x1="593.017872"></line>
+                    <g transform="translate(387.517872, 581.052138)" fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="椭圆形备份-11">
+                        <mask fill="white" id="mask-4">
+                            <use xlink:href="#path-3"></use>
+                        </mask>
+                        <use xlink:href="#path-3" fill="#FFCACA" id="蒙版"></use>
+                        <ellipse ry="47" rx="79" cy="5" cx="47" mask="url(#mask-4)" opacity="0.214906238" style="mix-blend-mode: multiply;" fill="#EC8484"></ellipse>
+                    </g>
+                    <ellipse ry="225" rx="255" cy="393.052138" cx="434.517872" fill-rule="evenodd" fill="#FFCACA" stroke="none" id="椭圆形"></ellipse>
+                    <path stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-width="8" stroke="#FF9494" id="路径-5备份" d="M424.517872,463.052138 L424.517872,489.052138 C424.517872,496.784124 430.785885,503.052138 438.517872,503.052138 L445.350822,503.052138 L445.350822,503.052138"></path>
+                    <circle r="19" cy="436.052138" cx="337.517872" fill-rule="evenodd" fill="#110D2E" stroke="none" id="椭圆形"></circle>
+                    <circle r="19" cy="436.052138" cx="531.517872" fill-rule="evenodd" fill="#110D2E" stroke="none" id="椭圆形备份-7"></circle>
+                    <path stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-width="10" stroke="#EC8484" id="路径-35" d="M391.517872,549.552138 L398.142211,552.413999 C421.020933,562.298113 447.152397,561.245097 469.16163,549.552138 L469.16163,549.552138 L469.16163,549.552138"></path>
+                    <path stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-width="6" stroke="#110D2E" id="路径-4备份" d="M302.517872,388.680878 C316.636064,384.928385 328.125526,383.052138 336.986258,383.052138 C345.846991,383.052138 357.609751,384.928385 372.27454,388.680878"></path>
+                    <path transform="translate(531.396206, 385.866508) scale(-1, 1) translate(-531.396206, -385.866508)" stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-width="6" stroke="#110D2E" id="路径-4备份-2" d="M496.517872,388.680878 C510.636064,384.928385 522.125526,383.052138 530.986258,383.052138 C539.846991,383.052138 551.609751,384.928385 566.27454,388.680878"></path>
+                    <g transform="translate(165.517872, 650.052138)" fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="路径-23备份-+-路径-23备份-蒙版">
+                        <mask fill="white" id="mask-6">
+                            <use xlink:href="#path-5"></use>
+                        </mask>
+                        <use xlink:href="#path-5" transform="translate(269.000000, 344.000000) rotate(-90.000000) translate(-269.000000, -344.000000)" fill="#FFFFFF" id="蒙版"></use>
+                        <rect height="362" width="191" y="-1.8189894e-12" x="1.8189894e-12" mask="url(#mask-6)" fill="#1C8784" id="矩形"></rect>
+                        <rect height="362" width="191" y="-1.8189894e-12" x="341" mask="url(#mask-6)" fill="#1C8784" id="矩形备份"></rect>
+                        <ellipse ry="24" rx="72" cy="2" cx="269" mask="url(#mask-6)" fill="#FFCACA" id="椭圆形"></ellipse>
+                    </g>
+                    <circle r="8" cy="740.052138" cx="434.517872" fill-rule="evenodd" fill="#1C8784" stroke="none" id="椭圆形"></circle>
+                    <circle r="8" cy="803.052138" cx="434.517872" fill-rule="evenodd" fill="#1C8784" stroke="none" id="椭圆形备份-2"></circle>
+                    <circle r="8" cy="866.052138" cx="434.517872" fill-rule="evenodd" fill="#1C8784" stroke="none" id="椭圆形备份-3"></circle>
+                    <line stroke-linejoin="round" stroke-linecap="round" opacity="0.106926328" fill="none" stroke-width="7" stroke="#000000" id="路径-6" y2="908.68815" x2="276.017872" y1="822.552138" x1="302.017872"></line>
+                    <line transform="translate(580.017872, 865.389824) scale(-1, 1) translate(-580.017872, -865.389824)" stroke-linejoin="round" stroke-linecap="round" opacity="0.106926328" fill="none" stroke-width="7" stroke="#000000" id="路径-6备份" y2="908.68815" x2="567.017872" y1="822.552138" x1="593.017872"></line>
+                    <ellipse ry="206.5" rx="135" cy="241.476966" cx="284.828502" transform="translate(284.828502, 241.476966) rotate(-315.000000) translate(-284.828502, -241.476966)" fill-rule="evenodd" fill="#110D2E" stroke="none" id="椭圆形"></ellipse>
+                    <ellipse ry="206.5" rx="135" cy="241.476966" cx="584.828502" transform="translate(584.828502, 241.476966) scale(-1, 1) rotate(-315.000000) translate(-584.828502, -241.476966)" fill-rule="evenodd" fill="#110D2E" stroke="none" id="椭圆形备份"></ellipse>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

File diff suppressed because it is too large
+ 4 - 0
static/iconfont/iconfont-font.css


File diff suppressed because it is too large
+ 623 - 0
static/iconfont/iconfont-weapp-icon.css


static/tab-icons/grade.png → static/tab_icons/exam.png


static/tab-icons/gradeselect.png → static/tab_icons/examselect.png


static/tab-icons/home.png → static/tab_icons/home.png


static/tab-icons/homeselect.png → static/tab_icons/homeselect.png


static/tab-icons/my.png → static/tab_icons/mine.png


static/tab-icons/myselect.png → static/tab_icons/mineselect.png


static/tab-icons/interactive.png → static/tab_icons/swap.png


static/tab-icons/interactiveselect.png → static/tab_icons/swapselect.png


static/tab-icons/homework.png → static/tab_icons/work.png


static/tab-icons/homeworkselect.png → static/tab_icons/workselect.png


+ 21 - 30
store/chart.js

@@ -4,47 +4,38 @@ export default {
 	namespaced: true,
 	//模块数据
 	state: () => ({
-		//首页图表数据
-		homeData: '',
 		//成绩图表数据
-		gradeData: '',
+		examChartData: '',
 		//作业图表数据
-		taskData: '',
-
+		workChartData: '',
+		//家校图表数据
+		swapChartData: '',
+		//考试与科目信息
+		subjectExamData: '',
 	}),
 	//模块方法(修改数据)
 	mutations: {
-		updateHomeChart(state, homeData) {
-			state.homeData = homeData
-		},
 		//更新成绩图表数据
-		updateGradeChart(state, gradeData) {
-			state.gradeData = gradeData
+		updateExamChartData(state, examChartData) {
+			state.examChartData = examChartData
 		},
-
-
-		//更新单个图表数据
-		updateSubjectComparison(state, singleAverageComparison) {
-			state.gradeData.semesterLineChart.singleAverageComparison = singleAverageComparison
+		//更新作业图表数据
+		updateWorkChartData(state, workChartData) {
+			state.workChartData = workChartData
 		},
-		updateSemesterSubjectRank(state, semesterSubjectRank) {
-			state.gradeData.rankChart.semesterSubjectRank = semesterSubjectRank
+		//更新家校图表数据
+		updateSwapChartData(state, swapChartData){
+			state.swapChartData = swapChartData
+		},
+		//更新考试与科目信息
+		updateSubjectExamData(state, subjectExamData){
+			state.subjectExamData = subjectExamData
 		},
-		//更新作业图表数据
-		updateHomeworkFinChart(state, taskData) {
-			state.taskData = taskData
-		}
+
 
 	},
 	//模块属性(数据包装)
 	getters: {
-		//学科科目
-		// getSubjectList(state) {
-		// 	let {
-		// 		考试,
-		// 		...subject
-		// 	} = state.gradeData.tableData[0]
-		// 	return Object.keys(subject)
-		// }
+
 	}
-}
+}

+ 46 - 79
store/children.js

@@ -1,96 +1,63 @@
-//导出学生信息存储模块
 export default {
-	//开启命名空间
 	namespaced: true,
-
-	//模块数据
+	
 	state: () => ({
-		childreninfo: JSON.parse(uni.getStorageSync('childreninfo') || '{}'),
-		semesterList: JSON.parse(uni.getStorageSync('semesterList') || '{}'),
-		semester: uni.getStorageSync('semester') || '请选择学期',
-		//课程列表
+		//当前孩子信息
+		childInfo: JSON.parse(uni.getStorageSync('childInfo') || '{}'),
+		//当日课程数据
 		classList: '',
-		//当前课程
-		classCurrent: '',
-		//打卡记录
-		records: '',
-		//日历打卡统计数据
-		calendar: {
-			isAttendNum: '',
-			noAttendNum: '',
-		},
-		//评测作业活动内容
-		detailList: '',
-		//评测作业活动单个详情
-		singleDetail: '',
+		//评测数据
+		examData: '',
+		//作业数据
+		workData: '',
+		//活动数据
+		swapData: '',
+		//打卡数据
+		clockData: '',
+		//勋章数据
+		medalData: '',
+		//评测练习
+		examPractice: '',
+		//错题数据
+		mistakeData: '',
 	}),
-	//模块方法(修改数据)
 	mutations: {
-		//更新学生信息
-		updateChildrenInfo(state, childreninfo) {
-			state.childreninfo = childreninfo
-			this.commit('m_children/saveChildrenInfoToStorage')
-		},
-		//更新学期列表信息
-		updateChildrenSemesterList(state, semesterList) {
-			state.semesterList = semesterList
-			this.commit('m_children/saveChildrenSemesterListToStorage')
-		},
-		//更新学期信息
-		updateChildrenSemester(state, semester) {
-			state.semester = semester
-			this.commit('m_children/saveChildrenSemesterToStorage')
+		//更新当前孩子信息
+		updateChildInfo(state, childInfo){
+			state.childInfo = childInfo
+			uni.setStorageSync('childInfo',JSON.stringify(state.childInfo))
 		},
-		//更新课程列表
+		//更新今日课程信息
 		updateClassList(state, classList){
 			state.classList = classList
 		},
-		//更新打卡数据
-		updateRecords(state, records){
-			state.records = records
-		},
-		//更新评测作业活动列表信息
-		updateDetailList(state, detailList) {
-			state.detailList = detailList
-		},
-		//更新评测作业活动单个详情信息
-		updateDetail(state, singleDetail) {
-			state.singleDetail = singleDetail
-		},
-		//更新当前课程
-		updateClassCurrent(state, classCurrent){
-			state.classCurrent = classCurrent
+		//更新评测
+		updateExamData(state, examData){
+			state.examData = examData
 		},
-
-		
-		
-		//持久化存储
-		//学生信息
-		saveChildrenInfoToStorage(state) {
-			uni.setStorageSync('childreninfo', JSON.stringify(state.childreninfo))
+		//更新作业
+		updateWorkData(state, workData){
+			state.workData = workData
 		},
-		//学期信息
-		saveChildrenSemesterToStorage(state) {
-			uni.setStorageSync('semester', state.semester)
+		//更新活动
+		updateSwapData(state, swapData){
+			state.swapData = swapData
 		},
-		//学期列表信息
-		saveChildrenSemesterListToStorage(state) {
-			uni.setStorageSync('semesterList', JSON.stringify(state.semesterList))
+		//更新打卡记录
+		updateClockData(state, clockData){
+			state.clockData = clockData
 		},
-		
-		//更新日历页未打卡数据
-		updateNoAttendNum(state, noAttendNum) {
-			state.calendar.noAttendNum = noAttendNum
+		//更新勋章数据
+		updateMedalData(state, medalData){
+			state.medalData = medalData
 		},
-		//更新日历页已打卡数据
-		updateIsAttendNum(state, isAttendNum) {
-			state.calendar.isAttendNum = isAttendNum
+		//更新评测练习
+		updateExamPractice(state, examPractice){
+			state.examPractice = examPractice
 		},
-		
-
-	},
-	//模块属性(数据包装)
-	getters: {
-		
+		//更新错题数据
+		updateMistakeData(state, mistakeData){
+			state.mistakeData = mistakeData
+		}
 	}
-}
+}

+ 41 - 51
store/parent.js

@@ -1,70 +1,60 @@
-//导出家长信息存储模块
 export default {
-	//开启命名空间
 	namespaced: true,
-
-	//模块数据
+	
 	state: () => ({
-
-		token: uni.getStorageSync('token') || '',//openid和session_key
-
-		parentinfo: JSON.parse(uni.getStorageSync('parentinfo') || '{}'),
-
-		parentdetail: JSON.parse(uni.getStorageSync('parentdetail') || '{}'),
+		//登录凭证openid和session_key
+		token: uni.getStorageSync('token') || '',
+		//家长信息
+		parentInfo: JSON.parse(uni.getStorageSync('parentInfo') || '{}'),
+		//家长手机号
+		phoneNumber: uni.getStorageSync('phoneNumber') || '',
+		//家长所有孩子信息
+		childrenData: JSON.parse(uni.getStorageSync('childrenData') || '{}'),
 		//个人数据
-		myData: JSON.parse(uni.getStorageSync('myData') || '{}'),
-
+		userData: JSON.parse(uni.getStorageSync('userData') || '{}'),
+		//已购课程数据
+		classData: JSON.parse(uni.getStorageSync('classData') || '{}'),
+		//孩子日常记录数据
+		childDailyData: JSON.parse(uni.getStorageSync('childDailyData') || '{}'),
 	}),
-	//模块方法(修改数据)
 	mutations: {
-		//更新token字符串
-		updateToken(state, token) {
+		//更新登录凭证
+		updateToken(state, token){
 			state.token = token
-			this.commit('m_parent/saveTokenToStorage')
+			uni.setStorageSync('token',state.token)
 		},
 		//更新用户信息
-		updateParentInfo(state, parentinfo) {
-			state.parentinfo = parentinfo
-			this.commit('m_parent/saveParentInfoToStorage')
-		},
-		//更新家长详细信息
-		updateParentDetail(state,parentdetail){
-			state.parentdetail = parentdetail
-			this.commit('m_parent/saveParentDetailToStorage')
+		updateParentInfo(state, parentInfo) {
+			state.parentInfo = parentInfo
+			uni.setStorageSync('parentInfo', JSON.stringify(state.parentInfo))
 		},
-		//更新我的消息
-		updateMyMsg(state,msgList) {
-			state.msgList = msgList
+		//更新家长手机号
+		updatePhoneNumber(state, phoneNumber){
+			state.phoneNumber = phoneNumber
+			uni.setStorageSync('phoneNumber', state.phoneNumber)
 		},
-		//更新订阅信息
-		updateSubscribe(state,subscribe){
-			state.subscribe = subscribe
+		//更新家长所有孩子信息
+		updateChildrenData(state, childrenData){
+			state.childrenData = childrenData
+			uni.setStorageSync('childrenData', JSON.stringify(state.childrenData))
 		},
 		//更新个人数据
-		updateMyData(state,myData){
-			state.myData = myData
-			this.commit('m_parent/saveMyDataToStorage')
-		},
-		
-		
-		//持久化存储
-		//token持久化存储
-		saveTokenToStorage(state) {
-			uni.setStorageSync('token',state.token)
+		updateUserData(state,userData){
+			state.userData = userData
+			uni.setStorageSync('userData', JSON.stringify(state.userData))
 		},
-		saveParentInfoToStorage(state) {
-			uni.setStorageSync('parentinfo', JSON.stringify(state.parentinfo))
+		//更新已购课程数据
+		updateClassData(state,classData){
+			state.classData = classData
+			uni.setStorageSync('classData', JSON.stringify(state.classData))
 		},
-		saveParentDetailToStorage(state){
-			uni.setStorageSync('parentdetail', JSON.stringify(state.parentdetail))
+		//更新孩子日常记录数据
+		updateChildDailyData(state,childDailyData){
+			state.childDailyData = childDailyData
+			uni.setStorageSync('childDailyData', JSON.stringify(state.childDailyData))
 		},
-		saveMyDataToStorage(state){
-			uni.setStorageSync('myData', JSON.stringify(state.myData))
-		}
-
 	},
-	//模块属性(数据包装)
-	getters: {
+	getters:{
 		
 	}
-}
+}

+ 3 - 5
store/store.js

@@ -1,15 +1,13 @@
-//1.导入Vue和Vuex
 import Vue from 'vue'
 import Vuex from 'vuex'
-//1.导入应用模块
+
 import moduleparent from './parent.js'
 import modulechildren from './children.js'
 import modulechart from './chart.js'
 
-//2.将Vuex安装为Vue的插件
 Vue.use(Vuex)
 
-//3.创建Store的实例对象
+//创建Store的实例对象
 const store = new Vuex.Store({
 	//挂载应用模块
 	modules:{
@@ -19,5 +17,5 @@ const store = new Vuex.Store({
 	},
 })
 
-//4.向外共享Store的实例对象
+//向外共享Store的实例对象
 export default store

+ 0 - 347
subpkg/calendar/calendar.vue

@@ -1,347 +0,0 @@
-<template>
-	<view>
-		<back :text="'打卡详情'"></back>
-
-		<view class="card-box">
-
-			<view class="card-item">
-				<view class="total">
-					<view class="total-title">本月打卡</view>
-					<view class="total-content">
-						<view class="number-box">
-							<view class="number" style="color: #4169E1;">{{calendar.isAttendNum}}</view>
-							<view class="number-detail">打卡次数</view>
-						</view>
-						<view class="number-box">
-							<view class="number" style="color: #ff5959;">{{calendar.noAttendNum}}</view>
-							<view class="number-detail">缺卡次数</view>
-						</view>
-						<view class="number-box">
-							<text class="number"
-								:style="{color: monthAttendQuality==='优秀'?'#4169E1':(monthAttendQuality === '较差'?'#ff5959':'#f9c752')}">{{monthAttendQuality}}</text>
-							<view class="number-detail">本月出勤</view>
-						</view>
-					</view>
-				</view>
-			</view>
-
-			<view class="card-item">
-				<view class="calendar_container">
-					<zsyCalendar :sundayIndex="6" @chooseDate="chooseDate" @change="change" />
-				</view>
-				<view class="state-box">
-					<view class="state"
-						:style="{backgroundColor: attendance==='已打卡'?'#4169E1':(attendance === '未打卡'?'#ff5959':'#bebebe')}">
-						<view class="state-text">{{attendance}}</view>
-					</view>
-					<view class="msg-box">
-						<view class="flex">
-							<text class="msg-text" style="font-weight: normal;font-size: 28rpx;">打卡时间:</text>
-							<text class="msg-text">{{attendanceTime.replace('0','')}}</text>
-						</view>
-						<view class="flex">
-							<text class="msg-text" style="font-weight: normal;font-size: 28rpx;">出勤效率:</text>
-							<text class="msg-text"
-								:style="{color: attendanceQuality==='优秀'?'#4169E1':(attendanceQuality === '良好'?'#f9c752':'#3B4144')}">{{attendanceQuality}}</text>
-						</view>
-					</view>
-					<!-- 图片信息 -->
-					<view class="image" v-if="currentTodayData.isAttend === 1" :style="{backgroundImage:`url(${imageWorkday})`}"></view>
-					<view class="image" v-if="currentTodayData.isAttend === 7" :style="{backgroundImage:`url(${imageWeekend})`}"></view>
-					<view class="image" v-if="currentTodayData.isAttend === 0" :style="{backgroundImage:`url(${imageNoAttend})`}"></view>
-					<view class="image" v-if="currentTodayData.isAttend === -1" :style="{backgroundImage:`url(${imageNoArrive})`}"></view>
-				</view>
-			</view>
-		</view>
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	import zsyCalendar from '@/subpkg/z-calendar/zsy-calendar.vue'
-	export default {
-		name: 'Calendar',
-		components: {
-			zsyCalendar
-		},
-		computed: {
-			...mapState('m_children', ['records', 'calendar']),
-		},
-		data() {
-			return {
-				//当日打卡信息
-				attendance: '',
-				attendanceTime: '',
-				attendanceQuality: '',
-				monthAttendQuality: '',
-				//点击当日信息
-				currentTodayData: '',
-				//日历月份
-				calendarMonth: '',
-				//控制事件参数
-				isFirst: false,
-				//当日时间参数
-				todayData: '',
-				imageWorkday: 'https://ouch-cdn2.icons8.com/z39mAYlsJUS2hKCBbkK_ktOIjma_qhkc5J0ANdyfiKU/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9zdmcvMTA3/L2FlZjQ4NmM4LTAz/NTYtNGRhNS04ZWQ2/LTBhMGIzMzdhZjNm/Mi5zdmc.png',
-				imageWeekend: 'https://ouch-cdn2.icons8.com/NJDdGibHzZkGZzgqe55ESzJ6_BrcgHO2bkz_vFG6PoY/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9zdmcvNTg2/L2RlMmJhZDI4LTAz/NTQtNDMwNS1hNmQ2/LTU3Y2Y1ODJjNjc3/YS5zdmc.png',
-				imageNoAttend: 'https://ouch-cdn2.icons8.com/ehPeP69ypvrLonk6YkqIzV_WfKM1G-Ls9J7PuZvxRr8/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9zdmcvMzY3/L2QzZGNmODA5LTY3/ODUtNGFkOC1hOWVi/LWI4OWYyM2ZiMzNi/Yi5zdmc.png',
-				imageNoArrive: 'https://ouch-cdn2.icons8.com/WfSBIzy4iTGDtprvhW0wA2S8lPNRoqeZqvFsNbKsraw/rs:fit:912:912/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9zdmcvODQ3/LzI1NDY1ZDdhLTVj/NDEtNGIzMy1iN2Q1/LTRhYjgwOGU2NDk5/OS5zdmc.png'
-			};
-		},
-		watch: {
-			calendarMonth() {
-				this.getMonthAttendQuality()
-			}
-		},
-		onLoad(options) {
-			this.getTodayAttendance()
-			this.getMonthAttendQuality()
-		},
-		methods: {
-			...mapMutations('m_children', ['updateNoAttendNum', 'updateIsAttendNum']),
-			//选中日期改变回调
-			change(e) {
-				//存入当前时间
-				if (this.isFirst === false) {
-					this.todayData = e
-					this.isFirst = true
-				}
-				//点击当日信息
-				this.currentTodayData = e
-				console.log("日历点击",this.currentTodayData);
-				//日历月份
-				this.calendarMonth = e.month
-				//当前日历月份打卡数
-				let isAttendArr = this.records.filter(x => x.month === e.month && x.year === e.year).length
-				// 当前日历月统计
-				this.updateIsAttendNum(isAttendArr)
-				// 当前日历月天数
-				let monthDays = new Date(e.year, e.month, 0).getDate()
-				//在本年当前月之前
-				if (e.year === this.todayData.year && e.month < this.todayData.month) {
-					let weekendDates = 0
-					for (let i = 1; i <= monthDays; i++) {
-						if (new Date(`${e.year}-${e.month}-${i}`).getDay() === 0 ||
-							new Date(`${e.year}-${e.month}-${i}`).getDay() === 6) {
-							weekendDates++
-						}
-					}
-					let noAttendArr = monthDays - isAttendArr - weekendDates
-					this.updateNoAttendNum(noAttendArr)
-				}
-				//之前年份
-				if (e.year < this.todayData.year) {
-					let weekendDates = 0
-					for (let i = 1; i <= monthDays; i++) {
-						if (new Date(`${e.year}-${e.month}-${i}`).getDay() === 0 ||
-							new Date(`${e.year}-${e.month}-${i}`).getDay() === 6) {
-							weekendDates++
-						}
-					}
-					let noAttendArr = monthDays - isAttendArr - weekendDates
-					this.updateNoAttendNum(noAttendArr)
-				}
-				//在本月
-				if (e.year === this.todayData.year && e.month === this.todayData.month) {
-					let weekendDates = 0
-					for (let i = 1; i <= this.todayData.date; i++) {
-						if (new Date(`${e.year}-${e.month}-${i}`).getDay() === 0 ||
-							new Date(`${e.year}-${e.month}-${i}`).getDay() === 6) {
-							weekendDates++
-						}
-					}
-					let noAttendArr = this.todayData.date - isAttendArr - weekendDates
-					this.updateNoAttendNum(noAttendArr)
-				}
-				//在本年当月之后
-				if (e.year === this.todayData.year && e.month > this.todayData.month) {
-					this.updateNoAttendNum('暂无')
-					this.updateIsAttendNum('暂无')
-				}
-				//之后年份
-				if (e.year > this.todayData.year) {
-					this.updateNoAttendNum('暂无')
-					this.updateIsAttendNum('暂无')
-				}
-
-			},
-			//今日打卡
-			getTodayAttendance() {
-				//获得当前时间时间戳
-				let timeNow = (new Date()).format("yyyy-M-dd")
-				let timeArr = timeNow.split("-")
-				let info = this.records.filter(x => x.year == timeArr[0] && x.month == timeArr[1] && x.date == timeArr[2])
-				if (info.length === 0) {
-					//出勤状况
-					this.attendance = '未打卡',
-						//打卡时间
-						this.attendanceTime = '无记录',
-						//出勤质量
-						this.attendanceQuality = '无记录'
-				} else {
-					this.attendance = '已打卡'
-					this.attendanceTime = info[0].time
-					this.attendanceQuality = info[0].time <= '08:15' ? '优秀' : (info[0].time <= '08:25' ? '良好' : '较差')
-				}
-			},
-			//判断本月出勤质量
-			getMonthAttendQuality() {
-				this.monthAttendQuality = this.calendar.noAttendNum / 30 <= 0.1 ? '优秀' : (this.calendar.noAttendNum / 30 <=
-					0.2 ? '良好' : '较差')
-				if (this.calendar.noAttendNum === '暂无' && this.calendar.isAttendNum === '暂无') {
-					this.monthAttendQuality = '暂无'
-				}
-			},
-			//选择日期
-			chooseDate(dateInfo, dateIndex) {
-				if (dateInfo.isAttend === 1) {
-					this.attendance = '已打卡'
-					this.attendanceTime = this.records.filter(x => x.date === dateInfo.date && x.month === dateInfo
-						.month && x.year === x.year)[0].time
-					this.attendanceQuality = this.attendanceTime <= '08:15' ? '优秀' : (this.attendanceTime <= '08:25' ?
-						'良好' : '较差')
-				}
-				if (dateInfo.isAttend === 0) {
-					this.attendance = '未打卡'
-					this.attendanceTime = '无记录'
-					this.attendanceQuality = '无记录'
-				}
-				if (dateInfo.isAttend === -1) {
-					this.attendance = '时间未到'
-					this.attendanceTime = '无记录'
-					this.attendanceQuality = '无记录'
-				}
-				if (dateInfo.isAttend === 7) {
-					this.attendance = '周末休息'
-					this.attendanceTime = '无记录'
-					this.attendanceQuality = '无记录'
-				}
-			},
-
-		}
-	}
-</script>
-
-<style lang="scss">
-	.card-box {
-		display: flex;
-		flex-flow: column wrap;
-		margin: 0 20rpx 0 20rpx;
-		justify-content: space-between;
-
-		.card-item {
-			margin: 2% 0;
-			width: 100%;
-			height: auto;
-			display: flex;
-			flex-direction: column;
-			justify-content: space-around;
-			background-color: #FFF;
-			border-radius: $card-border-radius;
-
-			//日历组件
-			.calendar_container {
-				height: 100%;
-				width: 100%;
-				background-color: #FFF;
-				margin: 0 auto;
-				box-sizing: border-box;
-				border-radius: $card-border-radius;
-			}
-		}
-	}
-
-	.total {
-		height: 250rpx;
-		width: 100%;
-
-		.total-title {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: $color-title;
-			margin: 30rpx 30rpx 0rpx 30rpx;
-		}
-
-		.total-content {
-			display: flex;
-			align-items: center;
-			justify-content: space-around;
-			height: 175rpx;
-
-			.number-box {
-				display: flex;
-				flex-direction: column;
-				align-items: center;
-
-				.number {
-					font-size: 46rpx;
-					font-weight: bold;
-					color: $color-title;
-				}
-
-				.number-detail {
-					margin-top: 10rpx;
-					font-size: 28rpx;
-					color: #afafaf;
-				}
-			}
-
-		}
-	}
-
-	.state-box {
-		display: flex;
-		align-items: center;
-		height: 200rpx;
-		width: 100%;
-
-		.state {
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			border-radius: 100%;
-			margin: 20rpx;
-			height: 150rpx;
-			width: 150rpx;
-
-			.state-text {
-				font-size: 32rpx;
-				font-weight: bold;
-				color: #FFF;
-			}
-		}
-
-		.msg-box {
-			display: flex;
-			flex-direction: column;
-			justify-content: space-around;
-			height: 150rpx;
-			width: auto;
-
-			.msg-text {
-				color: $color-title;
-				font-weight: bold;
-				font-size: 36rpx;
-				margin-left: 20rpx;
-			}
-		}
-	}
-
-	.flex {
-		display: flex;
-		align-items: center;
-	}
-
-	.image {
-		margin-left: 30rpx;
-		width: 200rpx;
-		height: 200rpx;
-		border-radius: $card-border-radius;
-		background-size: 100%;
-		background-repeat: no-repeat;
-	}
-</style>

+ 0 - 218
subpkg/classlist/classlist.vue

@@ -1,218 +0,0 @@
-<template>
-	<view>
-		<back :text="'课程列表'"></back>
-
-		<view class="card-box">
-			<view class="card-item" style="width: 100%;">
-				<view class="card-info">
-					<view class="t-icon t-icon-shuji1"></view>
-					<text class="info-text">今日课程列表</text>
-				</view>
-
-				<view class="home-title-text">
-					<view class="msg">课程数:</view>
-					<view class="card-content">{{classList.length}}</view>
-					<view style="display: flex; align-items: center; margin-left: auto; margin-right: 30rpx;">
-						<view class="t-icon t-icon-yuyue-lishi-shijian"></view>
-						<view class="msg" style="margin-left: 10rpx;">{{today}}</view>
-						<view class="msg" style="margin-left: 10rpx;">{{week}}</view>
-					</view>
-				</view>
-				<!-- 课程列表 -->
-				<view style="margin-bottom: 20rpx;">
-					<view class="block-box" v-for="(item,index) in classList" :key="index">
-						<view class="tag-index"></view>
-						<view class="class-block" style="width: 85%;">
-							<view class="block-title">{{item.name}}</view>
-							<view class="block-tag-box">
-								<view class="block-tag">{{item.teacher}}</view>
-							</view>
-							<view class="block-subtitle">{{item.timeFrame}}</view>
-							<view class="block-title">{{item.time}}</view>
-						</view>
-					</view>
-				</view>
-				
-			</view>
-
-			<view class="card-item" style="width: 100%;">
-				<view class="card-info">
-					<view class="t-icon t-icon-zhishi"></view>
-					<text class="info-text">本周课程表</text>
-				</view>
-				<z-table class="table" :tableData="weekClassTable" :columns="columns">
-				</z-table>
-			</view>
-		</view>
-
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_children', ['classList'])
-		},
-		data() {
-			return {
-				columns: [{
-						'title': '课程表',
-						'key': '课程表',
-						'width': 220,
-					},
-					{
-						'title': '周一',
-						'key': '周一',
-					},
-					{
-						'title': '周二',
-						'key': '周二',
-					},
-					{
-						'title': '周三',
-						'key': '周三',
-					},
-					{
-						'title': '周四',
-						'key': '周四',
-					},
-					{
-						'title': '周五',
-						'key': '周五',
-					},
-				],
-				weekClassTable: [{
-						'课程表': '上午一节',
-						'周一': '语文',
-						'周二': '数学',
-						'周三': '外语',
-						'周四': '语文',
-						'周五': '数学',
-					},
-					{
-						'课程表': '上午二节',
-						'周一': '数学',
-						'周二': '外语',
-						'周三': '语文',
-						'周四': '数学',
-						'周五': '外语',
-					},
-					{
-						'课程表': '上午三节',
-						'周一': '外语',
-						'周二': '语文',
-						'周三': '数学',
-						'周四': '外语',
-						'周五': '语文',
-					},
-					{
-						'课程表': '下午一节',
-						'周一': '思品',
-						'周二': '体育',
-						'周三': '科学',
-						'周四': '思品',
-						'周五': '体育',
-					},
-					{
-						'课程表': '下午二节',
-						'周一': '体育',
-						'周二': '科学',
-						'周三': '思品',
-						'周四': '体育',
-						'周五': '科学',
-					},
-					{
-						'课程表': '下午三节',
-						'周一': '科学',
-						'周二': '思品',
-						'周三': '体育',
-						'周四': '科学',
-						'周五': '思品',
-					}
-				],
-				today: '',
-				week: ''
-			};
-		},
-		onLoad() {
-			this.getToday()
-		},
-		methods: {
-			getToday(){
-				this.today = (new Date()).format('M-d').replace('-','月')+'日'
-				this.week = "星期" + "日一二三四五六".charAt(new Date().getDay());
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/pages/common/blockmsg.scss';
-
-	.card-box {
-		display: flex;
-		flex-flow: column wrap;
-		margin: 0 20rpx 0 20rpx;
-		justify-content: space-between;
-
-		.card-item {
-			margin: 2% 0;
-			width: 48%;
-			height: auto;
-			display: flex;
-			flex-direction: column;
-			justify-content: space-around;
-			background-color: #FFF;
-			// box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.05);
-			border-radius: $card-border-radius;
-
-			.card-info {
-				display: flex;
-				align-items: center;
-				padding: 20rpx;
-
-				.info-text {
-					font-size: 30rpx;
-					font-weight: bold;
-					color: #3B4144;
-					margin-left: 10rpx;
-				}
-			}
-		}
-	}
-
-	.card-content {
-		font-size: 35rpx;
-		margin: 10rpx 0 10rpx 25rpx;
-		color: $u-primary;
-		font-weight: bold;
-	}
-
-	.home-title-text {
-		display: flex;
-		align-items: center;
-		flex-wrap: wrap;
-		margin: 10rpx 0 10rpx 0;
-	}
-
-	.msg {
-		color: $color-title;
-		margin-left: 30rpx;
-		font-size: 30rpx;
-	}
-
-	.t-icon {
-		width: 40rpx;
-		height: 40rpx;
-	}
-	//表格
-	.table {
-		margin: 0 auto 20rpx auto;
-		width: 93%;
-		height: 100%;
-	}
-</style>

+ 0 - 91
subpkg/common/detaillistpage.scss

@@ -1,91 +0,0 @@
-.detail-box {
-		margin: -30rpx 20rpx 20rpx 20rpx;
-
-		.detail-item {
-			display: flex;
-			flex-direction: column;
-			border-radius: $card-border-radius;
-			margin-bottom: 20rpx;
-			background-color: #fff;
-			padding: 20rpx;
-				.index{
-					height: 36rpx;
-					width: 10rpx;
-					border-radius: 100rpx;
-					margin-left: -5rpx;
-				}
-				.name {
-					font-size: 36rpx;
-					line-height: 36rpx;
-					font-weight: bold;
-					margin-left: 15rpx;
-					margin-bottom: 4rpx;
-				}
-			}
-
-		.content-box {
-			display: flex;
-			flex-direction: column;
-
-			.subtitle {
-				font-size: 26rpx;
-				color: $color-subtitle;
-			}
-			.subtitle-info{
-				font-size: 30rpx;
-				font-weight: bold;
-				color: $color-title;
-			}
-			
-			.content-detail-box{
-				margin: 40rpx 0 0 0;
-				padding: 20rpx;
-				background-color: #f6f6f6;
-				border-radius: 10rpx;
-				.title-box{
-					position: relative;
-					top: -35rpx;
-					width:fit-content;
-					height: 36rpx;
-					border-radius: 10rpx;
-					padding: 5rpx 20rpx;
-				}
-				.content-detail {
-					font-size: 30rpx;
-					font-weight: bold;
-					color: $color-title;
-					word-break: break-all;
-				}
-				.option-box{
-					display: flex;
-					align-items: center;
-					justify-content: center;
-					width:120rpx;
-					height: 50rpx;
-					border-radius: 10rpx;
-					padding: 5rpx;
-				}
-				.content-subtitle {
-					font-size: 25rpx;
-					font-weight: bold;
-					color: #FFF;
-				}
-			}
-		}
-	}
-
-	.flex {
-		display: flex;
-		align-items: center;
-	}
-
-	.block-tag-box {
-		border-radius: 6rpx;
-		border: 1rpx solid $color-mixblue;
-		padding: 5rpx 14rpx;
-
-		.block-tag {
-			font-size: 22rpx;
-			color: $color-mixblue;
-		}
-	}

+ 0 - 85
subpkg/common/detailpage.scss

@@ -1,85 +0,0 @@
-.detail-item {
-		display: flex;
-		flex-direction: column;
-		margin-bottom: 20rpx;
-		background-color: #fff;
-		padding: 20rpx;
-			.index{
-				height: 36rpx;
-				width: 10rpx;
-				border-radius: 100rpx;
-				margin-left: -5rpx;
-			}
-			.name {
-				font-size: 36rpx;
-				line-height: 36rpx;
-				font-weight: bold;
-				margin-left: 15rpx;
-				margin-bottom: 4rpx;
-			}
-		}
-	
-	.content-box {
-		display: flex;
-		flex-direction: column;
-	
-		.subtitle {
-			font-size: 26rpx;
-			color: $color-subtitle;
-		}
-		.subtitle-info{
-			font-size: 30rpx;
-			font-weight: bold;
-			color: $color-title;
-		}
-		
-		.content-detail-box{
-			margin: 40rpx 0 0 0;
-			padding: 20rpx;
-			background-color: #f6f6f6;
-			border-radius: 10rpx;
-			.title-box{
-				position: relative;
-				top: -35rpx;
-				width:fit-content;
-				height: 36rpx;
-				border-radius: 10rpx;
-				padding: 5rpx 20rpx;
-			}
-			.content-detail {
-				font-size: 30rpx;
-				font-weight: bold;
-				color: $color-title;
-				word-break: break-all;
-			}
-			.option-box{
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				width:120rpx;
-				height: 50rpx;
-				border-radius: 10rpx;
-				padding: 5rpx;
-			}
-			.content-subtitle {
-				font-size: 25rpx;
-				font-weight: bold;
-				color: #FFF;
-			}
-		}
-	}
-	.flex {
-		display: flex;
-		align-items: center;
-	}
-	
-	.block-tag-box {
-		border-radius: 6rpx;
-		border: 1rpx solid $color-mixblue;
-		padding: 5rpx 14rpx;
-	
-		.block-tag {
-			font-size: 22rpx;
-			color: $color-mixblue;
-		}
-	}

File diff suppressed because it is too large
+ 0 - 611
subpkg/common/iconfont-weapp-icon.css


+ 0 - 98
subpkg/common/infopage.scss

@@ -1,98 +0,0 @@
-.container {
-		height: 600rpx;
-		background: linear-gradient($color-pink, $page-background-color);
-
-		.top-info {
-			display: flex;
-			align-items: center;
-			margin-top: 10rpx;
-
-			.top-avatar {
-				margin-left: 50rpx;
-				width: 140rpx;
-				height: 140rpx;
-				border-radius: 100%;
-				border: 6rpx solid #FFF;
-				box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.2);
-			}
-
-			.top-name {
-				margin-left: 50rpx;
-				display: flex;
-				flex-direction: column;
-				font-weight: bold;
-
-				.name {
-					color: $color-title;
-					font-size: 45rpx;
-					font-weight: bold;
-				}
-
-				.detail {
-					color: #FFF;
-					font-size: 32rpx;
-					font-weight: bold;
-				}
-			}
-		}
-		//背景大卡片
-		.card-box {
-			position: relative;
-			background-color: #FFF;
-			top: 50rpx;
-			left: 50rpx;
-			border-radius: 50rpx;
-			width: 750rpx;
-			height: 100vh;
-
-			.i-item {
-				display: flex;
-				align-items: center;
-				margin-left: 35rpx;
-			}
-		}
-		.title-box-name{
-			margin: 10rpx 0 0 60rpx;
-			font-size: 35rpx;
-			font-weight: bold;
-			color: $color-title;
-		}
-
-		.data-box-item {
-			display: flex;
-			flex-direction: column;
-			margin: 20rpx;
-			background-color: #FFF;
-			border-radius: $card-border-radius;
-			width: 280rpx;
-			height: 280rpx;
-			box-shadow: 0 6rpx 10rpx rgba(0, 0, 0, 0.1);
-
-			.item-text {
-				font-weight: bold;
-				font-size: 30rpx;
-				line-height: 30rpx;
-				color: $color-title;
-				margin-left: 15rpx;
-			}
-
-			.t-icon {
-				width: 130rpx;
-				height: 130rpx;
-			}
-
-			.item-number {
-				font-size: 60rpx;
-				margin: 20rpx 0 10rpx 30rpx;
-				color: #FFF;
-				font-weight: bold;
-			}
-		}
-
-		.flex{
-			display: flex;
-			align-items: center;
-			margin: 20rpx;
-		}
-
-	}

+ 0 - 157
subpkg/common/videopage.scss

@@ -1,157 +0,0 @@
-.container{
-	width: 100%;
-		
-		.video-box {
-			width: 100%;
-		
-			.video {
-				width: 100%;
-			}
-		}
-		
-		.block-tag-box{
-			border-radius: 6rpx;
-			border: 1rpx solid $color-mixblue;
-			padding: 5rpx 14rpx;
-			.block-tag{
-				font-size: 22rpx;
-				color: $color-mixblue;
-			}
-		}
-		
-		.info-box {
-			width: 650rpx;
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-			padding: 30rpx 50rpx;
-			height: 145rpx;
-			background-color: #FFF;
-		
-		
-			.info-name {
-				font-size: 40rpx;
-				font-weight: bold;
-				color: $color-title;
-			}
-		
-			.info-time {
-				font-size: 28rpx;
-				color: $color-subtitle;
-			}
-			
-			.info-msg{
-				font-weight: bold;
-				font-size: 30rpx;
-				color: $color-subtitle;
-			}
-		}
-		.list-name-box{
-			display: flex; 
-			align-items: center; 
-			margin:20rpx 0 20rpx 50rpx;
-			
-			.list-name{
-				margin-left:15rpx; 
-				margin-bottom: 4rpx; 
-				font-size: 36rpx; 
-				font-weight: bold;
-				color: #3B4144; 
-				line-height: 40rpx;
-			}
-		}
-		.video-list{
-			margin: 16rpx 0;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-
-			.class-block{
-				display: flex;
-				flex-direction: column;
-				justify-content: center;
-				background-color: #FFF;
-				padding: 16rpx 30rpx;
-				height: 110rpx;
-				width: 100%;
-				
-				.content-box{
-					width: 100%;
-					display: flex;
-					align-items: center; 
-					justify-content: space-between;
-					// margin-top: -32rpx;
-				}
-				.content-info {
-					font-size: 30rpx;
-					font-weight: bold;
-					color: $color-title;
-				}
-				.info-time {
-					font-size: 22rpx;
-					color: $color-subtitle;
-				}
-			}
-			.btn{
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				margin-left: 20rpx;
-				height: 70rpx;
-				width: 140rpx;
-				border-radius: 10rpx;
-			}
-		}
-		.flex-box{
-			display: flex;
-			justify-content: space-between;
-			flex-direction: column;
-		}
-		.flex{
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-		}
-		.t-icon {
-			size: 60rpx;
-		}
-		.start-tag{
-			height: 40rpx;
-		}
-		.content-subtitle {
-			font-size: 25rpx;
-			font-weight: bold;
-			color: #FFF;
-		}
-		.title-box{
-			position: relative;
-			top: -45rpx;
-			width:fit-content;
-			height: 36rpx;
-			border-radius: 10rpx;
-			padding: 5rpx 20rpx;
-		}
-		.u-action-sheet__header__title.data-v-b62b882e{
-			color: $color-title !important;
-		}
-		.flex-icon{
-			display: flex;
-			justify-content: space-between;
-			padding: 50rpx 100rpx 70rpx 100rpx;
-			.t-icon{
-				width: 80rpx;
-				height: 80rpx;
-			}
-			.text{
-				margin-top: 20rpx;
-				color: $color-title;
-				font-size:30rpx;
-			}
-		}
-		.timeInfo{
-			font-weight: bold;
-			font-size: 40rpx;
-			color: #aaaaaa;
-		}
-	}
-	

+ 94 - 0
subpkg/datalist/examdata.vue

@@ -0,0 +1,94 @@
+<template>
+	<view class="page_view">
+		<top-return color="#FFF"></top-return>
+		<view class="flex_row">
+			<view class="flex_cloumn" style="margin: 120rpx 0 0 50rpx;">
+				<view class="page_title">评测</view>
+				<view class="page_title">分析报告</view>
+				<view class="page_subtitle" style="margin-top: 30rpx;">{{examData[index].examInfo.name}}</view>
+			</view>
+			<view class="bg1"></view>
+			<view class="detail_image1" :style="{backgroundImage:`url(${image1})`}"></view>
+			<view class="detail_image2" :style="{backgroundImage:`url(${image2})`}"></view>
+		</view>
+
+
+		<view class="card_view">
+			<view class="card_item" style="width: 100%;height: 2300rpx;opacity: 0.9;"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children', ['examData'])
+		},
+		data() {
+			return {
+				index: '',
+				image1: 'https://ouch-cdn2.icons8.com/PvGwCISfYx-NAQwl4UsdY2QXtMMiNDB6LllqLZ4jGoA/rs:fit:367:456/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvNzg1/LzhiM2MwZWU2LWFl/ODMtNDM2Mi05MGQy/LTBmMDk0N2M4N2E1/OC5wbmc.png',
+				image2: 'https://ouch-cdn2.icons8.com/I-PEjM-V1LXrgVE1_yaPi7LY2XrgFXgKmEvBD3r1h_Y/rs:fit:484:456/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvMzcy/LzA0ZDY3Y2NlLTM3/YTUtNGE3OC1iZTVi/LTY4MzgyYTQ2YmUz/Zi5wbmc.png'
+			};
+		},
+		onLoad(param) {
+			this.index = param.index
+		},
+		methods: {
+
+		},
+	}
+</script>
+
+<style lang="scss">
+	.page_view {
+		background-color: $color-pink;
+	}
+
+	.page_title {
+		font-size: 75rpx;
+		font-family: YSfont;
+		color: #FFF;
+	}
+
+	.page_subtitle {
+		font-size: 40rpx;
+		font-family: YSfont;
+		color: #FFF;
+	}
+
+	.bg1 {
+		position: absolute;
+		top: 200rpx;
+		left: 450rpx;
+		width: 430rpx;
+		height: 430rpx;
+		border-radius: 50%;
+		background-color: #ffb2c9;
+	}
+
+	.detail_image1 {
+		position: absolute;
+		top: 180rpx;
+		left: 580rpx;
+		width: 300rpx;
+		height: 350rpx;
+		background-size: 100%;
+		background-repeat: no-repeat;
+		z-index: 51;
+	}
+
+	.detail_image2 {
+		position: absolute;
+		top: 230rpx;
+		left: 380rpx;
+		width: 300rpx;
+		height: 350rpx;
+		background-size: 100%;
+		background-repeat: no-repeat;
+		z-index: 50;
+	}
+</style>

+ 189 - 0
subpkg/datalist/examlist.vue

@@ -0,0 +1,189 @@
+<template>
+	<view class="page_view">
+		<top-return :color="'#FFF'" text="评测列表"></top-return>
+
+		<view class="bg_card"></view>
+
+		<!-- 页面标题内容 -->
+		<view class="flex_cloumn">
+			<view class="flex_baseline">
+				<view class="content_title" style="font-size: 70rpx;">{{dayTime.split('月')[0]}}</view>
+				<view class="content_title" style="margin-left: 10rpx;">月</view>
+				<view class="content_title" style="font-size: 70rpx; margin-left: 10rpx;">{{dayTime.split('月')[1]}}
+				</view>
+				<view class="content_title" style="margin-left: 10rpx;">日</view>
+				<view class="content_title" style="font-size: 40rpx;margin-left: 20rpx;">已完成</view>
+				<view class="content_title" style="margin-left: 10rpx;font-size: 70rpx;">{{value}}%</view>
+			</view>
+			<view class="flex_baseline">
+				<view class="content_subtitle" style="opacity: 0.8;">孩子今日共</view>
+				<view class="content_subtitle" style="margin-left: 20rpx;font-size: 60rpx;">
+					{{examData.length}}
+				</view>
+				<view class="content_subtitle" style="margin-left: 20rpx;opacity: 0.8;">例评测</view>
+			</view>
+		</view>
+
+		<!-- 卡片内容 -->
+		<view class="card_view">
+
+<!-- 			<view style="margin: -88rpx 0 20rpx auto;">
+				<u-tabs :list="tabList" lineWidth="30" lineColor="#ff8caf" :activeStyle="{
+            color: '#FFF',
+            fontWeight: 'bold',
+            transform: 'scale(1.07)'
+        }" :inactiveStyle="{
+            color: 'rgb(255,255,255,0.8)',
+            transform: 'scale(1)'
+        }" itemStyle="padding-left: 10px; padding-right: 10px; height: 34px;"></u-tabs>
+			</view> -->
+
+			<view class="card_item" style="width: 100%;" v-for="(item,index) in examData" :key="index" @click="navExamData(index)">
+				<view class="card_title" style="padding: 40rpx;height: 40rpx;">
+					<view class="t-icon t-icon-examicon" style="height: 40rpx;width: 40rpx;margin-right: 10rpx;">
+					</view>
+					<view class="YS_title" style="font-size: 45rpx;">{{item.examInfo.name}}</view>
+					<view
+						:class="item.examInfo.progress === 'finish'?'t-icon t-icon-yiwancheng1':'t-icon t-icon-jinhangzhong'"
+						style="width: 55px;height: 55px;margin-left: auto;margin-right: -20rpx;">
+					</view>
+				</view>
+				<view class="cloumn" style="margin: 0 40rpx 40rpx 40rpx;">
+					<view class="flex_row">
+						<view class="tag_fill" :style="{backgroundColor: item.examInfo.progress === 'finish'? '#23b46c': '#ff8caf' }">
+							<view class="tag_text">{{item.examInfo.subjects[0].name}}</view>
+						</view>
+						<view class="tag_fill" style="margin-left: 20rpx;" :style="{backgroundColor: item.examInfo.progress === 'finish'? '#23b46c': '#ff8caf' }">
+							<view class="tag_text">{{item.examInfo.examType.name}}</view>
+						</view>
+					</view>
+					<view class="flex_baseline" style="margin-top: 20rpx;">
+						<view class="subtitle">布置老师:</view>
+						<view class="YS_title" style="margin-left: 10rpx;">{{item.examInfo.creatorId}}
+						</view>
+						<view class="subtitle" style="margin-left: 20rpx;">截止时间:</view>
+						<view class="YS_title" style="margin-left: 10rpx;">
+							{{$timeStampToTime(item.examInfo.endTime)}}
+						</view>
+					</view>
+				</view>
+
+				<view class="content_box">
+					<view class="title_box"
+						:style="{backgroundColor: item.examInfo.progress === 'finish'? '#23b46c': '#ff8caf' }">
+						<view class="title_text">{{item.examInfo.papers[0].name}}</view>
+					</view>
+					<view class="content_detail"></view>
+				</view>
+
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children', ['examData'])
+		},
+		data() {
+			return {
+				// tabList: [{
+				// 	name: '已完成'
+				// }, {
+				// 	name: '未完成'
+				// }],
+				value: '',
+				dayTime: ''
+			}
+		},
+		onLoad(parameter) {
+			this.value = parameter.value
+			this.dayTime = (new Date()).format('M-d').replace('-', '月')
+		},
+		methods: {
+			navExamData(index) {
+				uni.navigateTo({
+					url: `/subpkg/datalist/examdata?index=${index}`
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.subtitle {
+		font-weight: 400;
+		font-size: 26rpx;
+	}
+
+	.tag_fill {
+		background-color: $color-pink;
+	}
+
+	.content_box {
+		margin: 20rpx;
+		padding: 0 20rpx;
+		background-color: #f6f6f6;
+		border-radius: 10rpx;
+
+		.title_box {
+			position: relative;
+			top: -20rpx;
+			width: fit-content;
+			height: 36rpx;
+			border-radius: 6rpx;
+			padding: 5rpx 20rpx;
+
+			.title_text {
+				font-size: 25rpx;
+				font-weight: bold;
+				color: #FFF;
+			}
+		}
+
+		.content_detail {
+			font-size: 30rpx;
+			font-weight: bold;
+			color: $title;
+			word-break: break-all;
+		}
+
+		.content_subtitle {
+			font-size: 25rpx;
+			font-weight: bold;
+			color: $subtitle;
+		}
+	}
+
+	.flex_cloumn {
+		margin: 140rpx 0 0 50rpx;
+		height: 170rpx;
+		justify-content: space-around;
+
+		.content_title {
+			font-size: 40rpx;
+			font-family: YSfont;
+			color: #FFF;
+			z-index: 2;
+			text-shadow: 1px -1px 0px #c0c0c0, 2px -2px 0px #b0b0b0, 1px -1px 0px #a0a0a0, 2px -2px 0px #909090;
+		}
+
+		.content_subtitle {
+			font-size: 40rpx;
+			font-family: YSfont;
+			color: #FFF;
+			z-index: 2;
+		}
+	}
+
+	.cloumn {
+		display: flex;
+		flex-direction: column;
+		margin: 20rpx 50rpx;
+	}
+</style>

+ 81 - 0
subpkg/datalist/swapdata.vue

@@ -0,0 +1,81 @@
+<template>
+	<view class="page_view">
+		<top-return color="#FFF"></top-return>
+		<view class="flex_row">
+			<view class="flex_cloumn" style="margin: 120rpx 0 0 50rpx;">
+				<view class="page_title">活动</view>
+				<view class="page_title">详情信息</view>
+				<view class="page_subtitle" style="margin-top: 30rpx;">{{swapData[index].survey.name||swapData[index].vote.name}}</view>
+			</view>
+			<view class="bg1"></view>
+			<view class="detail_image" :style="{backgroundImage:`url(${image})`}"></view>
+		</view>
+
+
+		<view class="card_view">
+			<view class="card_item" style="width: 100%;height: 2300rpx;opacity: 0.9;"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children', ['swapData'])
+		},
+		data() {
+			return {
+				index: '',
+				image: 'https://ouch-cdn2.icons8.com/09Q_OTq1lYT1dr5CbEAtnG8KH-WNnh3fIkoN8Ehg8D8/rs:fit:256:277/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvODc3/LzUyODcyMGM0LTI0/MTEtNGU5MS04ZWM0/LTQ0ODVhOGQzMDcw/YS5wbmc.png'
+			};
+		},
+		onLoad(param) {
+			this.index = param.index
+		},
+		methods: {
+
+		},
+	}
+</script>
+
+<style lang="scss">
+	.page_view {
+		background-color: $color-orange;
+	}
+
+	.page_title {
+		font-size: 75rpx;
+		font-family: YSfont;
+		color: #FFF;
+	}
+
+	.page_subtitle {
+		font-size: 40rpx;
+		font-family: YSfont;
+		color: #FFF;
+	}
+
+	.bg1 {
+		position: absolute;
+		top: 200rpx;
+		left: 450rpx;
+		width: 430rpx;
+		height: 430rpx;
+		border-radius: 50%;
+		background-color: #ff9c5a;
+	}
+
+	.detail_image {
+		position: absolute;
+		top: 140rpx;
+		left: 430rpx;
+		width: 370rpx;
+		height: 350rpx;
+		background-size: 100%;
+		background-repeat: no-repeat;
+		z-index: 50;
+	}
+</style>

+ 166 - 0
subpkg/datalist/swaplist.vue

@@ -0,0 +1,166 @@
+<template>
+	<view class="page_view">
+		<top-return :color="'#FFF'" text="活动列表"></top-return>
+		
+		<view class="bg_card"></view>
+		
+		<!-- 页面标题内容 -->
+		<view class="cloumn">
+			<view class="flex_baseline">
+				<view class="content_title" style="font-size: 70rpx;">{{dayTime.split('月')[0]}}</view>
+				<view class="content_title" style="margin-left: 10rpx;">月</view>
+				<view class="content_title" style="font-size: 70rpx; margin-left: 10rpx;">{{dayTime.split('月')[1]}}</view>
+				<view class="content_title" style="margin-left: 10rpx;">日</view>
+				<view class="content_title" style="font-size: 40rpx;margin-left: 20rpx;">已完成</view>
+				<view class="content_title" style="font-size: 70rpx; margin-left: 10rpx;">{{value}}%</view>
+			</view>
+			<view class="flex_baseline">
+				<view class="content_subtitle" style="opacity: 0.8;">当前共</view>
+					<view class="content_subtitle" style="margin-left: 20rpx;font-size: 60rpx;">{{swapData.length}}</view>
+				<view class="content_subtitle" style="margin-left: 20rpx;opacity: 0.8;">场活动</view>
+			</view>
+		</view>
+		
+		<view class="card_view">
+			<view class="card_item" style="width: 100%;" v-for="(item,index) in swapData" :key="index" @click="navSwapData(index)">
+				<view class="card_title" style="padding: 40rpx;height: 40rpx;">
+					<view class="t-icon t-icon-swapfont" style="height: 40rpx;width: 40rpx;margin-right: 10rpx;">
+					</view>
+					<view class="YS_title" style="font-size: 45rpx;">{{item.survey.name||item.vote.name}}</view>
+					<view :class="item.survey.progress === 'finish'||item.vote.progress === 'finish'?'t-icon t-icon-yiwancheng1':'t-icon t-icon-jinhangzhong-copy'" style="width: 55px;height: 55px;margin-left: auto;margin-right: -20rpx;"></view>
+				</view>
+				<view class="flex_cloumn" style="margin: 0 40rpx 40rpx 40rpx;">
+					<view class="flex_baseline">
+						<view class="subtitle">布置老师:</view>
+						<view class="YS_title" style="margin-left: 10rpx;">{{item.survey.creatorId||item.vote.creatorId}}</view>
+						<view class="subtitle" style="margin-left: 20rpx;">截至时间:</view>
+						<view class="YS_title" style="margin-left: 10rpx;" v-if="item.survey">{{$timeStampToTime(item.survey.endTime)}}</view>
+						<view class="YS_title" style="margin-left: 10rpx;" v-if="item.vote">{{$timeStampToTime(item.vote.endTime)}}</view>
+					</view>
+					<view class="flex_row" style="margin-top: 20rpx;">
+						<u-parse class="YS_title" style="font-size: 30rpx;" :content="item.survey.description||item.vote.description" :selectable="true"></u-parse>
+					</view>
+				</view>
+				<!-- 正文 -->
+				<view class="content_box">
+					<!-- 问卷 -->
+					<view class="title_box" :style="{backgroundColor: item.survey.progress === 'finish'? '#23b46c': '#FF6D31' }" v-if="item.survey">
+						<view class="title_text">问卷详情</view>
+					</view>
+					<view class="flex_row" style="justify-content: space-around;">
+						<view class="option_box" :style="{backgroundColor: item.survey.progress === 'finish'? '#23b46c': '#FF6D31' }" v-for="(option,i) in item.survey.answers[0]" :key="i">
+							<view class="content_subtitle">{{option}}</view>
+						</view>
+					</view>
+					<!-- 投票 -->
+					<view class="title_box" :style="{backgroundColor: item.vote.progress === 'finish'? '#23b46c': '#FF6D31' }" v-if="item.vote">
+						<view class="title_text">{{item.vote.secret ? '匿名投票':'普通投票'}}</view>
+					</view>
+					<view class="flex_row" style="justify-content: space-around;">
+						<view class="flex_cloumn" style="align-items: center;" v-for="(option,j) in item.vote.options" :key="j">
+							<u-parse class="title" style="font-size: 30rpx;margin-bottom: 15rpx;" :content="option.value"></u-parse>
+							<view class="option_box" :style="{backgroundColor: item.vote.progress === 'finish'? '#23b46c': '#FF6D31' }">
+								<view class="content_subtitle">{{option.code}}</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children',['swapData'])
+		},
+		data(){
+			return {
+				value: '',
+				dayTime: ''
+			}
+		},
+		onLoad(parameter) {
+			this.value = parameter.value
+			this.dayTime = (new Date()).format('M-d').replace('-', '月')
+		},
+		methods: {
+			fixNum(num){
+				return num.toFixed(2)
+			},
+			navSwapData(index){
+				uni.navigateTo({
+					url: `/subpkg/datalist/swapData?index=${index}`
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.subtitle{
+		font-weight: 400;
+		font-size: 26rpx;
+	}
+	.content_box{
+		margin: 20rpx;
+		padding: 0 20rpx 20rpx 20rpx;
+		background-color: #f6f6f6;
+		border-radius: 10rpx;
+		.title_box{
+			position: relative;
+			top: -20rpx;
+			width:fit-content;
+			height: 36rpx;
+			border-radius: 6rpx;
+			padding: 5rpx 20rpx;
+			.title_text{
+				font-size: 25rpx;
+				font-weight: bold;
+				color: #FFF;
+			}
+		}
+		.content_subtitle {
+			font-size: 30rpx;
+			font-weight: bold;
+			color: #FFF;
+		}
+		.option_box{
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			width:120rpx;
+			height: 50rpx;
+			border-radius: 10rpx;
+			padding: 5rpx;
+		}
+	}
+	.cloumn {
+		display: flex;
+		flex-direction: column;
+		margin: 140rpx 0 0 50rpx;
+		height: 170rpx;
+		justify-content: space-around;
+	
+		.content_title {
+			font-size: 40rpx;
+			font-family: YSfont;
+			color: #FFF;
+			z-index: 2;
+			text-shadow: 1px -1px 0px #c0c0c0, 2px -2px 0px #b0b0b0, 1px -1px 0px #a0a0a0, 2px -2px 0px #909090;
+		}
+
+		.content_subtitle {
+			font-size: 40rpx;
+			font-family: YSfont;
+			color: #FFF;
+			z-index: 2;
+		}
+	}
+</style>

+ 80 - 0
subpkg/datalist/workdata.vue

@@ -0,0 +1,80 @@
+<template>
+	<view class="page_view">
+		<top-return color="#FFF"></top-return>
+		<view class="flex_row">
+			<view class="flex_cloumn" style="margin: 120rpx 0 0 50rpx;">
+				<view class="page_title">作业</view>
+				<view class="page_title">分析报告</view>
+				<view class="page_subtitle" style="margin-top: 30rpx;">{{workData[index].work.name}}</view>
+			</view>
+			<view class="bg1"></view>
+			<view class="detail_image" :style="{backgroundImage:`url(${image})`}"></view>
+		</view>
+
+		<view class="card_view">
+			<view class="card_item" style="width: 100%;height: 2300rpx;opacity: 0.9;"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children', ['workData'])
+		},
+		data() {
+			return {
+				index: '',
+				image: 'https://ouch-cdn2.icons8.com/L7XZ0sgjVoRcfTOPCIQaYDAjSFWSuLHiH__hrCVy_CQ/rs:fit:439:456/czM6Ly9pY29uczgu/b3VjaC1wcm9kLmFz/c2V0cy9wbmcvNTM2/L2M3ZmQyOTdiLTgz/ODEtNGQzYy1hNzk1/LWY1MmY3ZWUyMjIw/YS5wbmc.png'
+			};
+		},
+		onLoad(param) {
+			this.index = param.index
+		},
+		methods: {
+
+		},
+	}
+</script>
+
+<style lang="scss">
+	.page_view {
+		background-color: $color-yellow;
+	}
+
+	.page_title {
+		font-size: 75rpx;
+		font-family: YSfont;
+		color: #FFF;
+	}
+
+	.page_subtitle {
+		font-size: 40rpx;
+		font-family: YSfont;
+		color: #FFF;
+	}
+
+	.bg1 {
+		position: absolute;
+		top: 200rpx;
+		left: 450rpx;
+		width: 430rpx;
+		height: 430rpx;
+		border-radius: 50%;
+		background-color: #f9da7a;
+	}
+
+	.detail_image {
+		position: absolute;
+		top: 170rpx;
+		left: 430rpx;
+		width: 330rpx;
+		height: 360rpx;
+		background-size: 100%; //背景图片自适应
+		background-repeat: no-repeat;
+		z-index: 50;
+	}
+</style>

+ 203 - 0
subpkg/datalist/worklist.vue

@@ -0,0 +1,203 @@
+<template>
+	<view class="page_view">
+		<top-return :color="'#FFF'" text="作业列表"></top-return>
+
+		<view class="bg_card"></view>
+
+		<!-- 页面标题内容 -->
+		<view class="flex_cloumn">
+			<view class="flex_baseline">
+				<view class="content_title" style="font-size: 70rpx;">{{dayTime.split('月')[0]}}</view>
+				<view class="content_title" style="margin-left: 10rpx;">月</view>
+				<view class="content_title" style="font-size: 70rpx; margin-left: 10rpx;">{{dayTime.split('月')[1]}}
+				</view>
+				<view class="content_title" style="margin-left: 10rpx;">日</view>
+				<view class="content_title" style="margin-left: 20rpx;">已完成</view>
+				<view class="content_title" style="margin-left: 10rpx;font-size: 70rpx;">{{value}}%</view>
+			</view>
+			<view class="flex_baseline">
+				<view class="content_subtitle" style="opacity: 0.8;">孩子今日共</view>
+				<view class="content_subtitle" style="margin-left: 20rpx;font-size: 60rpx;">
+					{{workData.length}}
+				</view>
+				<view class="content_subtitle" style="margin-left: 20rpx;opacity: 0.8;">份作业</view>
+			</view>
+		</view>
+
+		<view class="card_view">
+			<view class="card_item" style="width: 100%;" v-for="(item,index) in workData" :key="index"
+				@click="navWorkData(index)">
+				<view class="card_title" style="padding: 40rpx;height: 40rpx;">
+					<view class="t-icon t-icon-workicon" style="height: 40rpx;width: 40rpx;margin-right: 10rpx;">
+					</view>
+					<view class="YS_title" style="font-size: 45rpx;">{{item.work.name}}</view>
+					<view
+						:class="item.work.progress === 'finish'?'t-icon t-icon-yiwancheng1':'t-icon t-icon-jinhangzhong-copy1'"
+						style="width: 55px;height: 55px;margin-left: auto;margin-right: -20rpx;">
+					</view>
+				</view>
+				<view class="cloumn" style="margin: 0 40rpx 40rpx 40rpx;">
+					<view class="flex_baseline" >
+						<view class="subtitle">布置老师:</view>
+						<view class="YS_title" style="margin-left: 10rpx;">{{item.work.creatorId}}</view>
+						<view class="subtitle" style="margin-left: 20rpx;">截止时间:</view>
+						<view class="YS_title" style="margin-left: 10rpx;">
+							{{$timeStampToTime(item.work.endTime)}}
+						</view>
+					</view>
+					<view class="flex_row" style="margin-top: 20rpx;">
+						<u-parse class="YS_title" style="font-size: 30rpx;" :content="item.work.description"
+							:selectable="true"></u-parse>
+					</view>
+				</view>
+				<!-- 正文 -->
+				<view class="content_box">
+					<view class="title_box"
+						:style="{backgroundColor: item.work.progress === 'finish'? '#23b46c': '#f9c752' }">
+						<view class="title_text">作业附件</view>
+					</view>
+					<view v-for="(attachment,i) in item.work.attachments" :key="i">
+						<view class="attachment_box">
+							<view v-if="attachment.type == 'word'" class="t-icon t-icon-WORD"></view>
+							<view v-if="attachment.type == 'excel'" class="t-icon t-icon-ECEL"></view>
+							<view v-if="attachment.type == 'pdf'" class="t-icon t-icon-PDF"></view>
+							<view v-if="attachment.type == 'image'" class="t-icon t-icon-tupianziliao"></view>
+							<view v-if="attachment.type == 'ppt'" class="t-icon t-icon-PPT"></view>
+							<view class="cloumn" style="margin-left: 20rpx;">
+								<view class="content_detail">文件名: {{attachment.name}}</view>
+								<view class="content_subtitle">文件大小: {{fixNum(attachment.size/8/1024)}}KB</view>
+							</view>
+						</view>
+					</view>
+				</view>
+
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children', ['workData'])
+		},
+		data() {
+			return {
+				value: '',
+				dayTime: ''
+			}
+		},
+		onLoad(parameter) {
+			this.value = parameter.value
+			this.dayTime = (new Date()).format('M-d').replace('-', '月')
+		},
+		methods: {
+			fixNum(num) {
+				return num.toFixed(2)
+			},
+			navWorkData(index) {
+				uni.navigateTo({
+					url: `/subpkg/datalist/workdata?index=${index}`
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.subtitle {
+		font-weight: 400;
+		font-size: 26rpx;
+	}
+
+	.tag {
+		border-radius: 6rpx;
+		border: 1rpx solid $color-blue;
+		padding: 5rpx 16rpx;
+
+		.tag_text {
+			font-size: 22rpx;
+			color: $color-blue;
+		}
+	}
+
+	.content_box {
+		margin: 20rpx;
+		padding: 0 20rpx;
+		background-color: #f6f6f6;
+		border-radius: 10rpx;
+
+		.title_box {
+			position: relative;
+			top: -20rpx;
+			width: fit-content;
+			height: 36rpx;
+			border-radius: 6rpx;
+			padding: 5rpx 20rpx;
+
+			.title_text {
+				font-size: 25rpx;
+				font-weight: bold;
+				color: #FFF;
+			}
+		}
+
+		.content_detail {
+			font-size: 35rpx;
+			font-family: YSfont;
+			color: $title;
+			word-break: break-all;
+		}
+
+		.content_subtitle {
+			font-size: 25rpx;
+			font-weight: bold;
+			color: $subtitle;
+		}
+	}
+
+	.attachment_box {
+		display: flex;
+		margin-bottom: 20rpx;
+		align-items: center;
+		padding: 6rpx 20rpx;
+		background-color: #FFF;
+		border-radius: 10rpx;
+
+		.t-icon {
+			width: 60rpx;
+			height: 60rpx;
+		}
+	}
+
+	.flex_cloumn {
+		margin: 140rpx 0 0 50rpx;
+		height: 170rpx;
+		justify-content: space-around;
+
+		.content_title {
+			font-size: 40rpx;
+			font-family: YSfont;
+			color: #FFF;
+			z-index: 2;
+			text-shadow: 1px -1px 0px #c0c0c0, 2px -2px 0px #b0b0b0, 1px -1px 0px #a0a0a0, 2px -2px 0px #909090;
+		}
+
+		.content_subtitle {
+			font-size: 40rpx;
+			font-family: YSfont;
+			color: #FFF;
+			z-index: 2;
+		}
+	}
+
+	.cloumn {
+		display: flex;
+		flex-direction: column;
+		margin: 20rpx 50rpx;
+	}
+</style>

+ 0 - 111
subpkg/detail/activity.vue

@@ -1,111 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 返回按钮 -->
-		<back text="活动详情"></back>
-		<!-- 单个数据详情 -->
-		<view class="detail-item">
-			<view class="flex" style="width: 100%;height: 90rpx;">
-				<view class="flex" style="margin: -30rpx 0 0 10rpx;">
-					<view class="index"
-						:style="{backgroundColor: singleDetail.survey.progress === 'finish'||singleDetail.vote.progress === 'finish'? '#23b46c': '#f9c752' }">
-					</view>
-					<view class="name">{{singleDetail.survey.name||singleDetail.vote.name}}</view>
-				</view>
-		
-				<view class="t-icon t-icon-yiwancheng1"
-					v-if="singleDetail.survey.progress === 'finish'||singleDetail.vote.progress === 'finish'"
-					style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-				<view class="t-icon t-icon-jinhangzhong-copy"
-					v-if="singleDetail.survey.progress === 'going'||singleDetail.vote.progress === 'going'"
-					style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-			</view>
-			<!-- 正文 -->
-			<view class="content-box">
-				<view style="display:flex;flex-direction: column;padding: 0 30rpx;">
-					<rich-text class="subtitle-info" style="margin-bottom: 15rpx;"
-						:nodes="singleDetail.survey.description||singleDetail.vote.description">
-					</rich-text>
-					<view class="flex">
-						<view class="subtitle">布置老师:</view>
-						<view class="subtitle-info" style="margin-left: 10rpx;">
-							{{singleDetail.survey.creatorId||singleDetail.vote.creatorId}}
-						</view>
-						<view class="subtitle" style="margin-left: 20rpx;">截止时间:</view>
-						<view class="subtitle-info" style="margin-left: 10rpx;" v-if="singleDetail.survey">
-							{{$timestampToTime(singleDetail.survey.endTime)}}
-						</view>
-						<view class="subtitle-info" style="margin-left: 10rpx;" v-if="singleDetail.vote">
-							{{$timestampToTime(singleDetail.vote.endTime)}}
-						</view>
-					</view>
-				</view>
-				<!-- 内容 -->
-				<view class="content-detail-box">
-					<!-- 问卷 -->
-					<view class="title-box"
-						:style="{backgroundColor: singleDetail.survey.progress === 'finish'? '#23b46c': '#f9c752' }"
-						v-if="singleDetail.survey">
-						<view class="content-subtitle">问卷详情</view>
-					</view>
-					<view class="flex" style="justify-content: space-around;">
-						<view class="option-box"
-							:style="{backgroundColor: singleDetail.survey.progress === 'finish'? '#23b46c': '#f9c752' }"
-							v-for="(option,i) in singleDetail.survey.answers[0]" :key="i">
-							<view class="content-subtitle" style="font-size: 30rpx;">{{option}}</view>
-						</view>
-					</view>
-					
-					<!-- 投票 -->
-					<view class="title-box"
-						:style="{backgroundColor: singleDetail.vote.progress === 'finish'? '#23b46c': '#f9c752' }"
-						v-if="singleDetail.vote">
-						<view class="content-subtitle">{{singleDetail.vote.secret ? '匿名投票':'普通投票'}}</view>
-					</view>
-					<view class="flex" style="justify-content: space-around;">
-						<view class="flex-colum" v-for="(option,j) in singleDetail.vote.options" :key="j">
-							<rich-text class="subtitle-info" style="margin-bottom: 15rpx;" :nodes="option.value">
-							</rich-text>
-							<view class="option-box"
-								:style="{backgroundColor: singleDetail.vote.progress === 'finish'? '#23b46c': '#f9c752' }">
-								<view class="content-subtitle" style="font-size: 30rpx;">{{option.code}}</view>
-							</view>
-						</view>
-					</view>
-		
-		
-				</view>
-			</view>
-		
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_children', ['singleDetail'])
-		},
-		data(){
-			return{
-			};
-		},
-		onLoad() {
-		},
-		methods:{
-
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/subpkg/common/detailpage.scss';
-	.flex-colum{
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-	}
-</style>

+ 0 - 72
subpkg/detail/exam.vue

@@ -1,72 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 返回按钮 -->
-		<back text="评测详情"></back>
-		<!-- 单个详情 -->
-		<view class="detail-item">
-			<view class="flex" style="width: 100%;height: 90rpx;">
-				<view class="flex" style="margin: -30rpx 0 0 10rpx;">
-					<view class="index" :style="{backgroundColor: singleDetail.examInfo.progress === 'finish'? '#23b46c': '#4169E1' }">
-					</view>
-					<view class="name">{{singleDetail.examInfo.name}}</view>
-				</view>
-		
-				<view :class="singleDetail.examInfo.progress === 'finish'?'t-icon t-icon-yiwancheng1':'t-icon t-icon-jinhangzhong'" style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-		
-			</view>
-			<!-- 正文 -->
-			<view class="content-box">
-				<view style="display:flex;flex-direction: column;padding: 0 30rpx;">
-					<view class="flex" style="margin-bottom: 15rpx;">
-						<view class="block-tag-box">
-							<view class="block-tag">{{singleDetail.examInfo.subjects[0].name}}</view>
-						</view>
-						<view class="block-tag-box" style="margin-left: 20rpx;">
-							<view class="block-tag">{{singleDetail.examInfo.examType.name}}</view>
-						</view>
-					</view>
-					<view class="flex">
-						<view class="subtitle">布置老师:</view>
-						<view class="subtitle-info" style="margin-left: 10rpx;">{{singleDetail.examInfo.creatorId}}</view>
-						<view class="subtitle" style="margin-left: 20rpx;">截止时间:</view>
-						<view class="subtitle-info" style="margin-left: 10rpx;">
-							{{$timestampToTime(singleDetail.examInfo.endTime)}}</view>
-					</view>
-				</view>
-		
-				<view class="content-detail-box">
-					<view class="title-box" :style="{backgroundColor: singleDetail.examInfo.progress === 'finish'? '#23b46c': '#4169E1' }">
-						<view class="content-subtitle">{{singleDetail.examInfo.papers[0].name}}</view>
-					</view>
-					<view class="content-detail"></view>
-				</view>
-			</view>
-		
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_children', ['singleDetail'])
-		},
-		data(){
-			return{
-			};
-		},
-		onLoad() {
-		},
-		methods:{
-
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/subpkg/common/detailpage.scss';
-</style>

+ 0 - 107
subpkg/detail/homework.vue

@@ -1,107 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 返回按钮 -->
-		<back text="作业详情"></back>
-		<view class="detail-item">
-			<view class="flex" style="width: 100%;height: 90rpx;">
-				<view class="flex" style="margin: -30rpx 0 0 10rpx;">
-					<view class="index" :style="{backgroundColor: singleDetail.work.progress === 'finish'? '#23b46c': '#ff8caf' }"></view>
-					<view class="name">{{singleDetail.work.name}}</view>
-				</view>
-			
-				<view class="t-icon t-icon-yiwancheng1" v-if="singleDetail.work.progress === 'finish'"
-					style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-				<view class="t-icon t-icon-jinhangzhong-copy1" v-if="singleDetail.work.progress === 'going'"
-					style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-			</view>
-			<!-- 正文 -->
-			<view class="content-box">
-		
-				<view class="flex-colum" style="padding: 0 30rpx;">
-					<rich-text class="subtitle-info" style="margin-bottom: 15rpx;" :nodes="singleDetail.work.description"></rich-text>
-					<view class="flex">
-						<view class="subtitle">布置老师:</view>
-						<view class="subtitle-info" style="margin-left: 10rpx;">{{singleDetail.work.creatorId}}</view>
-						<view class="subtitle" style="margin-left: 20rpx;">截止时间:</view>
-						<view class="subtitle-info" style="margin-left: 10rpx;">{{$timestampToTime(singleDetail.work.endTime)}}</view>
-					</view>
-					
-				</view>
-		
-				<view class="content-detail-box" style="padding: 0 20rpx;">
-					<view class="title-box" :style="{backgroundColor: singleDetail.work.progress === 'finish'? '#23b46c': '#ff8caf',top: -15 +'rpx' }">
-						<view class="content-subtitle">作业附件</view>
-					</view>
-					<view v-for="(attachment,i) in singleDetail.work.attachments" :key="i" style="margin-bottom: 20rpx;">
-						<view class="attachment-box" @click="openDocument(attachment.url)">
-							<view v-if="attachment.type == 'word'" class="t-icon t-icon-WORD"></view>
-							<view v-if="attachment.type == 'excel'" class="t-icon t-icon-ECEL"></view>
-							<view v-if="attachment.type == 'pdf'" class="t-icon t-icon-PDF"></view>
-							<view v-if="attachment.type == 'image'" class="t-icon t-icon-tupianziliao"></view>
-							<view class="flex-colum" style="margin-left: 20rpx;">
-								<view class="content-detail">文件名: {{attachment.name}}</view>
-								<view class="content-subtitle" style="color: #aaa;">文件大小: {{fixNum(attachment.size/8/1024)}}KB</view>
-							</view>
-						</view>
-					</view>
-					
-				</view>
-			</view>
-		
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_children', ['singleDetail'])
-		},
-		data(){
-			return{
-			};
-		},
-		onLoad() {
-		},
-		methods:{
-			fixNum(num){
-				return num.toFixed(2)
-			},
-			openDocument(url) {
-				//下载并打开文档
-				uni.downloadFile({
-					url: url,
-					success: function(res) {
-						var filePath = res.tempFilePath;
-						uni.openDocument({
-							filePath: filePath,
-							success: function(res) {
-								console.log('打开文档成功');
-							}
-						});
-					}
-				})
-			},
-			
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/subpkg/common/detailpage.scss';
-	.attachment-box{
-		display: flex;
-		align-items: center;
-		padding: 15rpx 20rpx;
-		background-color: #FFF;
-		border-radius: 10rpx;
-	}
-	.flex-colum{
-		display: flex;
-		flex-direction: column;
-	}
-</style>

+ 0 - 132
subpkg/detaillist/activitylist.vue

@@ -1,132 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 返回按钮 -->
-		<back text="详情列表"></back>
-
-		<view style="margin: 20rpx;">
-			<u-skeleton :rows="detailList.length" :rowsHeight="height" :loading="loading">
-			</u-skeleton>
-		</view>
-
-		<view class="detail-box" v-if="!loading">
-			<view class="detail-item" v-for="(item,index) in detailList" :key="index" @click="navSingleData(item)">
-				<view class="flex" style="width: 100%;height: 90rpx;">
-					<view class="flex" style="margin: -30rpx 0 0 10rpx;">
-						<view class="index"
-							:style="{backgroundColor: item.survey.progress === 'finish'||item.vote.progress === 'finish'? '#23b46c': '#f9c752' }">
-						</view>
-						<view class="name">{{item.survey.name||item.vote.name}}</view>
-					</view>
-
-					<view class="t-icon t-icon-yiwancheng1"
-						v-if="item.survey.progress === 'finish'||item.vote.progress === 'finish'"
-						style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-					<view class="t-icon t-icon-jinhangzhong-copy"
-						v-if="item.survey.progress === 'going'||item.vote.progress === 'going'"
-						style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-				</view>
-				<!-- 正文 -->
-				<view class="content-box">
-					<view style="display:flex;flex-direction: column;padding: 0 30rpx;">
-						<rich-text class="subtitle-info" style="margin-bottom: 15rpx;"
-							:nodes="item.survey.description||item.vote.description">
-						</rich-text>
-						<view class="flex">
-							<view class="subtitle">布置老师:</view>
-							<view class="subtitle-info" style="margin-left: 10rpx;">
-								{{item.survey.creatorId||item.vote.creatorId}}
-							</view>
-							<view class="subtitle" style="margin-left: 20rpx;">截止时间:</view>
-							<view class="subtitle-info" style="margin-left: 10rpx;" v-if="item.survey">
-								{{$timestampToTime(item.survey.endTime)}}
-							</view>
-							<view class="subtitle-info" style="margin-left: 10rpx;" v-if="item.vote">
-								{{$timestampToTime(item.vote.endTime)}}
-							</view>
-						</view>
-					</view>
-					<!-- 内容 -->
-					<view class="content-detail-box">
-						<!-- 问卷 -->
-						<view class="title-box"
-							:style="{backgroundColor: item.survey.progress === 'finish'? '#23b46c': '#f9c752' }"
-							v-if="item.survey">
-							<view class="content-subtitle">问卷详情</view>
-						</view>
-						<view class="flex" style="justify-content: space-around;">
-							<view class="option-box"
-								:style="{backgroundColor: item.survey.progress === 'finish'? '#23b46c': '#f9c752' }"
-								v-for="(option,i) in item.survey.answers[0]" :key="i">
-								<view class="content-subtitle" style="font-size: 30rpx;">{{option}}</view>
-							</view>
-						</view>
-						
-						<!-- 投票 -->
-						<view class="title-box"
-							:style="{backgroundColor: item.vote.progress === 'finish'? '#23b46c': '#f9c752' }"
-							v-if="item.vote">
-							<view class="content-subtitle">{{item.vote.secret ? '匿名投票':'普通投票'}}</view>
-						</view>
-						<view class="flex" style="justify-content: space-around;">
-							<view class="flex-colum" v-for="(option,j) in item.vote.options" :key="j">
-								<rich-text class="subtitle-info" style="margin-bottom: 15rpx;" :nodes="option.value">
-								</rich-text>
-								<view class="option-box"
-									:style="{backgroundColor: item.vote.progress === 'finish'? '#23b46c': '#f9c752' }">
-									<view class="content-subtitle" style="font-size: 30rpx;">{{option.code}}</view>
-								</view>
-							</view>
-						</view>
-
-
-					</view>
-				</view>
-
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_children', ['detailList'])
-		},
-		data() {
-			return {
-				//骨架页配置
-				loading: true,
-				height: ['200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px'],
-			};
-		},
-		onLoad(options) {
-			uni.$u.sleep(1500).then(() => {
-				this.loading = false
-			})
-		},
-		methods: {
-			...mapMutations('m_children', ['updateDetail']),
-			//导航到详情页面
-			navSingleData(item){
-				this.updateDetail(item)
-				uni.navigateTo({
-					url: `/subpkg/detail/activity`
-				})
-			},
-
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/subpkg/common/detaillistpage.scss';
-	.flex-colum{
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-	}
-</style>

+ 0 - 97
subpkg/detaillist/examlist.vue

@@ -1,97 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 返回按钮 -->
-		<back text="详情列表"></back>
-
-		<view style="margin: 20rpx;">
-			<u-skeleton :rows="detailList.length" :rowsHeight="height" :loading="loading">
-			</u-skeleton>
-		</view>
-
-		<view class="detail-box" v-if="!loading">
-			<view class="detail-item" v-for="(item,index) in detailList" :key="index" @click="navSingleData(item)">
-				<view class="flex" style="width: 100%;height: 90rpx;">
-					<view class="flex" style="margin: -30rpx 0 0 10rpx;">
-						<view class="index"
-							:style="{backgroundColor: item.examInfo.progress === 'finish'? '#23b46c': '#4169E1' }">
-						</view>
-						<view class="name">{{item.examInfo.name}}</view>
-					</view>
-
-					<view
-						:class="item.examInfo.progress === 'finish'?'t-icon t-icon-yiwancheng1':'t-icon t-icon-jinhangzhong'"
-						style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-
-				</view>
-				<!-- 正文 -->
-				<view class="content-box">
-					<view style="display:flex;flex-direction: column;padding: 0 30rpx;">
-						<view class="flex" style="margin-bottom: 15rpx;">
-							<view class="block-tag-box">
-								<view class="block-tag">{{item.examInfo.subjects[0].name}}</view>
-							</view>
-							<view class="block-tag-box" style="margin-left: 20rpx;">
-								<view class="block-tag">{{item.examInfo.examType.name}}</view>
-							</view>
-						</view>
-						<view class="flex">
-							<view class="subtitle">布置老师:</view>
-							<view class="subtitle-info" style="margin-left: 10rpx;">{{item.examInfo.creatorId}}</view>
-							<view class="subtitle" style="margin-left: 20rpx;">截止时间:</view>
-							<view class="subtitle-info" style="margin-left: 10rpx;">
-								{{$timestampToTime(item.examInfo.endTime)}}</view>
-						</view>
-					</view>
-
-					<view class="content-detail-box">
-						<view class="title-box" :style="{backgroundColor: item.examInfo.progress === 'finish'? '#23b46c': '#4169E1' }">
-							<view class="content-subtitle">{{item.examInfo.papers[0].name}}</view>
-						</view>
-						<view class="content-detail"></view>
-					</view>
-				</view>
-
-			</view>
-		</view>
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_children', ['detailList'])
-		},
-		data() {
-			return {
-				//骨架页配置
-				loading: true,
-				height: ['200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px'],
-			};
-		},
-		onLoad(options) {
-			uni.$u.sleep(1500).then(() => {
-				this.loading = false
-			})
-		},
-		methods: {
-			...mapMutations('m_children', ['updateDetail']),
-			//导航到详情页面
-			navSingleData(item){
-				this.updateDetail(item)
-				uni.navigateTo({
-					url: `/subpkg/detail/exam`
-				})
-			},
-			
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/subpkg/common/detaillistpage.scss';
-</style>

+ 0 - 131
subpkg/detaillist/homeworklist.vue

@@ -1,131 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 返回按钮 -->
-		<back text="详情列表"></back>
-
-		<view style="margin: 20rpx;">
-			<u-skeleton :rows="detailList.length" :rowsHeight="height" :loading="loading">
-			</u-skeleton>
-		</view>
-
-		<view class="detail-box" v-if="!loading">
-			<view class="detail-item" v-for="(item,index) in detailList" :key="index" @click="navSingleData(item)">
-				<view class="flex" style="width: 100%;height: 90rpx;">
-					<view class="flex" style="margin: -30rpx 0 0 10rpx;">
-						<view class="index" :style="{backgroundColor: item.work.progress === 'finish'? '#23b46c': '#ff8caf' }"></view>
-						<view class="name">{{item.work.name}}</view>
-					</view>
-				
-					<view class="t-icon t-icon-yiwancheng1" v-if="item.work.progress === 'finish'"
-						style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-					<view class="t-icon t-icon-jinhangzhong-copy1" v-if="item.work.progress === 'going'"
-						style="margin-left: auto; width: 90rpx; height: 90rpx;"></view>
-				</view>
-				<!-- 正文 -->
-				<view class="content-box">
-
-					<view class="flex-colum" style="padding: 0 30rpx;">
-						<rich-text class="subtitle-info" style="margin-bottom: 15rpx;" :nodes="item.work.description"></rich-text>
-						<view class="flex">
-							<view class="subtitle">布置老师:</view>
-							<view class="subtitle-info" style="margin-left: 10rpx;">{{item.work.creatorId}}</view>
-							<view class="subtitle" style="margin-left: 20rpx;">截止时间:</view>
-							<view class="subtitle-info" style="margin-left: 10rpx;">{{$timestampToTime(item.work.endTime)}}</view>
-						</view>
-						
-					</view>
-
-					<view class="content-detail-box" style="padding: 0 20rpx;">
-						<view class="title-box" :style="{backgroundColor: item.work.progress === 'finish'? '#23b46c': '#ff8caf',top: -15 +'rpx' }">
-							<view class="content-subtitle">作业附件</view>
-						</view>
-						<view v-for="(attachment,i) in item.work.attachments" :key="i" style="margin-bottom: 20rpx;">
-							<view class="attachment-box">
-								<view v-if="attachment.type == 'word'" class="t-icon t-icon-WORD"></view>
-								<view v-if="attachment.type == 'excel'" class="t-icon t-icon-ECEL"></view>
-								<view v-if="attachment.type == 'pdf'" class="t-icon t-icon-PDF"></view>
-								<view v-if="attachment.type == 'image'" class="t-icon t-icon-tupianziliao"></view>
-								<view class="flex-colum" style="margin-left: 20rpx;">
-									<view class="content-detail">文件名: {{attachment.name}}</view>
-									<view class="content-subtitle" style="color: #aaa;">文件大小: {{fixNum(attachment.size/8/1024)}}KB</view>
-								</view>
-							</view>
-						</view>
-						
-					</view>
-				</view>
-
-			</view>
-		</view>
-
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapMutations
-	} from 'vuex'
-	export default {
-		computed: {
-			...mapState('m_children', ['detailList'])
-		},
-		data() {
-			return {
-				//骨架页配置
-				loading: true,
-				height: ['200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px', '200px'],
-			};
-		},
-		onLoad(options) {
-			uni.$u.sleep(1500).then(() => {
-				this.loading = false
-			})
-		},
-		methods: {
-			...mapMutations('m_children', ['updateDetail']),
-			fixNum(num){
-				return num.toFixed(2)
-			},
-			//导航到详情页面
-			navSingleData(item){
-				this.updateDetail(item)
-				uni.navigateTo({
-					url: `/subpkg/detail/homework`
-				})
-			},
-			// openDocument(url) {
-			// 	//下载并打开文档
-			// 	uni.downloadFile({
-			// 		url: url,
-			// 		success: function(res) {
-			// 			var filePath = res.tempFilePath;
-			// 			uni.openDocument({
-			// 				filePath: filePath,
-			// 				success: function(res) {
-			// 					console.log('打开文档成功');
-			// 				}
-			// 			});
-			// 		}
-			// 	})
-			// }
-			
-			
-		}
-	}
-</script>
-
-<style lang="scss">
-	@import '@/subpkg/common/detaillistpage.scss';
-	.attachment-box{
-		display: flex;
-		align-items: center;
-		padding: 15rpx 20rpx;
-		background-color: #FFF;
-		border-radius: 10rpx;
-	}
-	.flex-colum{
-		display: flex;
-		flex-direction: column;
-	}
-</style>

+ 48 - 0
subpkg/exam/exercisesinfo.vue

@@ -0,0 +1,48 @@
+<template>
+	<view>
+		<top-return text="评测练习"></top-return>
+		<!-- 天数选择 -->
+<!-- 		<scroll-view class="week_view" scroll-x="true" :scroll-with-animation="true" scroll-left="0">
+			<view style="margin-top:20rpx;">
+				<view v-for="(item,index) in examPractice[index]" :key="index"
+					:class="isactive == index ? 'week_item_select' : 'week_item' " @click='chooseDay(index,item)'>
+					<view class="item_box">
+						<view class="_title">{{item.weekNum}}</view>
+						<view class="_day">{{item.dayNum}}</view>
+						<view class="tag_fill" v-if="isactive == index">
+							<view class="tag_text" v-if="isactive == index && currentClassList.length != 0">
+								{{currentClassList.length}} 节课
+							</view>
+							<view class="tag_text" v-if="isactive == index && currentClassList.length === 0">无课程</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view> -->
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_children', ['examPractice'])
+		},
+		data() {
+			return {
+				index: ''
+			}
+		},
+		onLoad(param) {
+			this.index = param.index
+		},
+		methods:{
+			
+		}
+	}
+</script>
+
+<style>
+</style>

+ 41 - 0
subpkg/gradelist/gradelist_pages.scss

@@ -0,0 +1,41 @@
+	.chart_box{
+		width: 100%;
+		height: 550rpx;
+	}
+	.analysis_box {
+		padding: 20rpx 25rpx;
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-around;
+		overflow: hidden;
+	}
+	.analysis_text {
+		font-size: 30rpx;
+		font-weight: bold;
+		color: #FFF;
+		z-index: 5;
+	}
+	
+	.analysis_data {
+		font-size: 50rpx;
+		color: #FFF;
+		font-family: YSfont;
+		z-index: 5;
+	}
+	
+	.icon_box {
+		width: 0rpx;
+		height: 0rpx;
+	
+		.t-icon {
+			position: relative;
+			top: -230rpx;
+			left: 160rpx;
+			width: 200rpx;
+			height: 200rpx;
+			z-index: 1;
+			background-repeat: no-repeat;
+			background-size: 100%;
+		}
+	}

+ 131 - 0
subpkg/gradelist/level.vue

@@ -0,0 +1,131 @@
+<template>
+	<view class="page_view">
+		<top-return color="#FFF" text="考试能力"></top-return>
+		<!-- 背景 -->
+		<view class="bg_box"></view>
+		<!-- 头部学期信息 -->
+		<top-semester></top-semester>
+		<!-- 分析列表 -->
+		<view class="card_view">
+			<view class="card_item" style="background-color: #4169E1;height: 200rpx;">
+				<view class="analysis_box">
+					<view class="analysis_text">成绩波动对比</view>
+					<view class="flex_baseline">
+						<view class="analysis_data">{{mainExamUndulate>=quizExamUndulate?'小考':'大考'}}</view>
+						<view class="analysis_text" style="margin-left: 20rpx;">发挥稳定</view>
+					</view>
+				</view>
+				<view class="icon_box">
+					<view v-if="mainExamUndulate>=quizExamUndulate" class="t-icon t-icon-a-bianzu7"></view>
+					<view v-if="mainExamUndulate<quizExamUndulate" class="t-icon t-icon-a-bianzu6"></view>
+				</view>
+			</view>
+			<view class="card_item" style="background-color: #ff8caf;height: 200rpx;">
+				<view class="analysis_box">
+					<view class="analysis_text">得分能力对比</view>
+					<view class="flex_baseline">
+						<view class="analysis_data">{{avgMain>=avgquiz?'大考':'小考'}}</view>
+						<view class="analysis_text" style="margin-left: 20rpx;">得分能力强</view>
+					</view>
+				</view>
+				<view class="icon_box">
+					<view v-if="avgMain<avgquiz" class="t-icon t-icon-a-bianzu7"></view>
+					<view v-if="avgMain>=avgquiz" class="t-icon t-icon-a-bianzu6"></view>
+				</view>
+			</view>
+			<!-- 图表 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">重要考试对比</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="column" ontouch="true" :chartData="examChartData.levelChartData[0]"
+						tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="level_chart1" />
+				</view>
+			</view>
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">普通测验记录</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="column" ontouch="true" :chartData="examChartData.levelChartData[1]"
+						tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="level_chart2" />
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	
+	export default {
+		computed: {
+			...mapState('m_chart', ['examChartData']),
+		},
+		data() {
+			return {
+				//成绩波动参数(标准差)
+				mainExamUndulate: 0,
+				quizExamUndulate: 0,
+				//大小考每次考试平均成绩
+				avgMain: 0,
+				avgquiz: 0,
+			}
+		},
+		onLoad() {
+			this.getExamUndulate()
+		},
+		methods: {
+			//成绩波动数据(标准差)
+			getExamUndulate(){
+				function arrSum(array) {
+					let cont = 0
+					for (let i = 0; i < array.length; i++) {
+						cont += array[i]
+					}
+					return cont;
+				}
+				const mainArr = []
+				const quizArr = []
+				//统计每次考试总成绩并存为数组
+				for (let item of this.examChartData.levelChartData[0].series) {
+					mainArr.push(arrSum(item.data))
+				}
+				for (let item of this.examChartData.levelChartData[1].series) {
+					quizArr.push(arrSum(item.data))
+				}
+				//大小考试平均成绩
+				this.avgMain = arrSum(mainArr) / mainArr.length
+				this.avgquiz = arrSum(quizArr) / quizArr.length
+				//标准差函数
+				function standardDeviation(arr) {
+					let length = arr.length;
+					let sum = arrSum(arr);
+					let avg = sum / length;
+					let temp = [];
+					for (let i = 0; i < length; i++) {
+				
+						let dev = (arr[i]) - avg; //计算数组元素与平均值的差
+				
+						temp[i] = Math.pow(dev, 2); //计算差的平方
+					}
+					let powSum = arrSum(temp); //差的平方和
+					let standardDeviation = parseFloat(Math.sqrt(powSum / length).toFixed(2)); //标准差
+					return standardDeviation
+				}
+				this.mainExamUndulate = standardDeviation(mainArr)
+				this.quizExamUndulate = standardDeviation(quizArr)
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import 'gradelist_pages.scss';
+</style>

+ 143 - 0
subpkg/gradelist/ranking.vue

@@ -0,0 +1,143 @@
+<template>
+	<view class="page_view">
+		<top-return color="#FFF" text="排行占比"></top-return>
+		<!-- 背景 -->
+		<view class="bg_box"></view>
+		<!-- 头部学期信息 -->
+		<top-semester></top-semester>
+		<!-- 分析列表 -->
+		<view class="card_view">
+			<view class="card_item" v-for="(item,index) in analysisData" :key="index"
+				:style="{background: item.color,height: 200+ 'rpx'}">
+				<view class="analysis_box">
+					<view class="analysis_text">{{item.title}}</view>
+					<view class="flex_baseline">
+						<view class="analysis_data">{{item.data}}%</view>
+						<view class="analysis_text" style="margin-left: 20rpx;">的学生</view>
+					</view>
+				</view>
+				<view class="icon_box">
+					<view :class="item.data>=40?(item.data>=70?'t-icon t-icon-a-bianzu6':'t-icon t-icon-a-bianzu7'): 't-icon t-icon-a-bianzu8'"></view>
+				</view>
+			</view>
+			<!-- 图表 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">总成绩排行对比</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="area" ontouch="true" :chartData="examChartData.rankingChartData[0]"
+						tooltipFormat='subjectRankArea' :canvas2d="true" canvasId="ranking_chart1" />
+				</view>
+			</view>
+			
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">{{subjectCurrent}}排行对比</view>
+					<view class="flex_row" style="margin-left: auto;" @click="subjectPicker = true">
+						<text class="title" style="color: #4169E1;font-weight: 400;">{{subjectCurrent}}</text>
+						<view class="t-icon t-icon-xia"></view>
+					</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="area" ontouch="true" :chartData="examChartData.rankingChartData[1]"
+						tooltipFormat='subjectRankArea' :canvas2d="true" canvasId="ranking_chart2" />
+				</view>
+			</view>
+			
+			<!-- 科目选择 -->
+			<u-picker :show="subjectPicker" :columns="subjectList" @confirm="subjectConfirm" @cancel="cancel">
+			</u-picker>
+		</view>
+	</view>
+</template>
+
+<script>
+	import MockData from '@/common/global_js/MockData.js'
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_chart', ['examChartData','subjectExamData']),
+		},
+		watch: {
+			subjectCurrent: {
+				handler(newValue) {
+					let subjectChartData = this.mockData.find(x=>x.name.includes(newValue))
+					let temp = this.examChartData
+					temp.rankingChartData[1] = subjectChartData
+					this.updateExamChartData(temp)
+				},
+				immediate: false
+			},
+		},
+		data() {
+			return {
+				mockData: MockData.rankData,
+				subjectPicker: false,
+				subjectCurrent: '',
+				subjectList: '',
+				//分析模块数据
+				analysisData: [{
+					title: '平均排行超年级',
+					data: '',
+					color: '#4169E1',
+				}, {
+					title: '平均排行超班级',
+					data: '',
+					color: '#ff8caf',
+				}],
+			}
+		},
+		onLoad() {
+			this.init()
+		},
+		methods: {
+			...mapMutations('m_chart',['updateExamChartData']),
+			init() {
+				this.getAnalysisData()
+				this.setChartOptions()
+			},
+			getAnalysisData() {
+				function arrSum(array) {
+					let cont = 0
+					for (let i = 0; i < array.length; i++) {
+						cont += array[i]
+					}
+					return cont;
+				}
+				//平均超班级
+				this.analysisData[1].data = parseInt(arrSum(this.examChartData.rankingChartData[0].series[1].data) / this
+					.examChartData.rankingChartData[0].series[1].data.length)
+				//平均超年级
+				this.analysisData[0].data = parseInt(arrSum(this.examChartData.rankingChartData[0].series[0].data) / this
+					.examChartData.rankingChartData[0].series[0].data.length)
+			},
+			//图表配置
+			setChartOptions(){
+				if (this.subjectList === '') {
+					let arr = []
+					arr.push(this.subjectExamData.subjectList)
+					this.subjectList = arr
+					if (this.subjectCurrent === '')
+						this.subjectCurrent = this.subjectList[0][0]
+				}
+			},
+			subjectConfirm(e){
+				this.subjectCurrent = e.value[0]
+				this.subjectPicker = false
+			},
+			cancel(){
+				this.subjectPicker = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import 'gradelist_pages.scss';
+</style>

+ 97 - 0
subpkg/gradelist/single.vue

@@ -0,0 +1,97 @@
+<template>
+	<view class="page_view">
+		<top-return color="#FFF" text="单次考试"></top-return>
+		<!-- 背景 -->
+		<view class="bg_box"></view>
+		<!-- 头部学期信息 -->
+		<top-semester></top-semester>
+		<!-- 分析列表 -->
+		<view class="card_view">
+			<view class="card_item" v-for="(item,index) in analysisData" :key="index" :style="{background: item.color,height: 200+ 'rpx'}">
+				<view class="analysis_box">
+					<view class="analysis_text">{{item.title}}</view>
+					<view class="flex_baseline">
+						<view class="analysis_data">{{item.data/0.01}}%</view>
+						<view class="analysis_text" style="margin-left: 20rpx;">的学生</view>
+					</view>
+				</view>
+				<view class="icon_box">
+					<view :class="item.data>=0.4?(item.data>=0.7?'t-icon t-icon-a-bianzu6':'t-icon t-icon-a-bianzu7'): 't-icon t-icon-a-bianzu8'"></view>
+				</view>
+			</view>
+			<!-- 图表 -->
+
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">最近考试单科对比</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="column" ontouch="true" :chartData="examChartData.singleChartData[0]"
+						tooltipFormat='tooltipScore' />
+				</view>
+			</view>
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">最近单科平均对比</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="column" ontouch="true" :chartData="examChartData.singleChartData[1]"
+						tooltipFormat='tooltipScore' />
+				</view>
+			</view>
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">最近考试单科排行</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="column" ontouch="true" :chartData="examChartData.singleChartData[2]"
+						tooltipFormat='subjectRankColum' />
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_chart', ['examChartData']),
+		},
+		data() {
+			return {
+				//分析模块数据
+				analysisData: [{
+					title: '总成绩超过年级中',
+					data: '',
+					color: '#4169E1',
+				}, {
+					title: '总成绩超过班级中',
+					data: '',
+					color: '#ff8caf',
+				}],
+			}
+		},
+		onLoad() {
+			this.init()
+		},
+		methods: {
+			init() {
+				this.getAnalysisData()
+			},
+			getAnalysisData() {
+				this.analysisData[0].data = 0.53
+				this.analysisData[1].data = 0.72
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import 'gradelist_pages.scss';
+</style>

+ 99 - 0
subpkg/gradelist/subject.vue

@@ -0,0 +1,99 @@
+<template>
+	<view class="page_view">
+		<top-return color="#FFF" text="优劣科目"></top-return>
+		<!-- 背景 -->
+		<view class="bg_box"></view>
+		<!-- 头部学期信息 -->
+		<top-semester></top-semester>
+		<!-- 分析列表 -->
+		<view class="card_view">
+			<view class="card_item" v-for="(item,index) in analysisData" :key="index"
+				:style="{background: item.color,height: 200+ 'rpx'}">
+				<view class="analysis_box">
+					<view class="flex_baseline">
+						<view class="analysis_text">{{item.title}}</view>
+						<view class="analysis_text" style="font-size: 40rpx; margin-left: 20rpx;"> {{item.data.name}}
+						</view>
+					</view>
+					<view class="flex_baseline">
+						<view class="analysis_data">{{item.data.value}}%</view>
+						<view class="analysis_text" style="margin-left: 20rpx;">得分率</view>
+					</view>
+				</view>
+				<view class="icon_box">
+					<view :class="item.data.value>=40?(item.data.value>=70?'t-icon t-icon-a-bianzu6':'t-icon t-icon-a-bianzu7'): 't-icon t-icon-a-bianzu8'"></view>
+				</view>
+			</view>
+			<!-- 图表 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">最近考试得分率对比</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="rose" :chartData="examChartData.subjectChartData[0]" :tapLegend="true"
+						tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="subject_chart1"/>
+				</view>
+			</view>
+
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">学期平均得分率对比</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="rose" :chartData="examChartData.subjectChartData[1]" :tapLegend="true"
+						tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="subject_chart2"/>
+				</view>
+			</view>
+		</view>
+
+	</view>
+
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+
+	export default {
+		computed: {
+			...mapState('m_chart', ['examChartData']),
+		},
+		data() {
+			return {
+				//分析模块数据
+				analysisData: [{
+					title: '优势科目',
+					data: '',
+					color: '#4169E1'
+				}, {
+					title: '劣势科目',
+					data: '',
+					color: '#ff8caf',
+				}]
+			}
+		},
+		onLoad() {
+			this.init()
+		},
+		methods: {
+			init() {
+				this.getAnalysisData()
+			},
+			getAnalysisData() {
+				//获取成绩最好科目
+				this.analysisData[0].data = this.examChartData.subjectChartData[1].series[0].data.reduce((pre, cur) => pre
+					.value > cur.value ? pre : cur)
+				//劣势科目
+				this.analysisData[1].data = this.examChartData.subjectChartData[1].series[0].data.reduce((pre, cur) => pre
+					.value < cur.value ? pre : cur)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import 'gradelist_pages.scss';
+</style>

+ 279 - 0
subpkg/gradelist/total.vue

@@ -0,0 +1,279 @@
+<template>
+	<view class="page_view">
+		<top-return color="#FFF" text="成绩走势"></top-return>
+		<!-- 背景 -->
+		<view class="bg_box"></view>
+		<!-- 头部学期信息 -->
+		<top-semester></top-semester>
+		<!-- 分析列表 -->
+		<view class="card_view">
+
+			<view class="card_item" style="background-color: #4169E1;height: 200rpx;">
+				<view class="analysis_box">
+					<view class="analysis_text">{{analysisData[0].title}}</view>
+
+					<view class="flex_baseline">
+						<view class="analysis_data" style="font-size: 44rpx;">{{totalSemAvg}}</view>
+						<view class="analysis_text" style="margin-right: 20rpx;font-size: 26rpx;">分</view>
+						<view class="analysis_text" style="font-size: 26rpx;" v-if="analysisData[0].data != 'btm'">超过
+						</view>
+						<view class="analysis_text" style="font-size: 26rpx;" v-if="analysisData[0].data === 'btm'">未超过
+						</view>
+					</view>
+
+					<view class="flex_baseline">
+						<view class="analysis_text">
+							{{analysisData[0].data === 'top' ? '班级和年级学期平均':(analysisData[0].data === 'midClass'? '班级学期平均分':(analysisData[0].data === 'midGrade'?'年级学期平均分':'班级和年级学期平均'))}}
+						</view>
+					</view>
+				</view>
+				<view class="icon_box">
+					<view v-if="analysisData[0].data==='top'" class="t-icon t-icon-a-bianzu6"></view>
+					<view v-if="analysisData[0].data==='midGrade'||analysisData[0].data === 'midClass'"
+						class="t-icon t-icon-a-bianzu7">
+					</view>
+					<view v-if="analysisData[0].data==='btm'" class="t-icon t-icon-a-bianzu8"></view>
+				</view>
+			</view>
+
+			<view class="card_item" style="background-color: #ff8caf;height: 200rpx;">
+				<view class="analysis_box">
+					<view class="analysis_text">{{analysisData[1].title}}</view>
+
+					<view class="flex_baseline">
+						<view class="analysis_data" style="font-size: 44rpx;">{{singleSemAvg}}</view>
+						<view class="analysis_text" style="margin-right: 20rpx;font-size: 26rpx;">分</view>
+						<view class="analysis_text" style="font-size: 26rpx;" v-if="analysisData[1].data != 'btm'">超过
+						</view>
+						<view class="analysis_text" style="font-size: 26rpx;" v-if="analysisData[1].data === 'btm'">未超过
+						</view>
+					</view>
+
+					<view class="flex_baseline">
+						<view class="analysis_text">
+							{{analysisData[1].data === 'top' ? '班级和年级学期平均':(analysisData[1].data === 'midClass'? '班级学期平均分':(analysisData[1].data === 'midGrade'?'年级学期平均分':'班级和年级学期平均'))}}
+						</view>
+					</view>
+				</view>
+				<view class="icon_box">
+					<view v-if="analysisData[1].data==='top'" class="t-icon t-icon-a-bianzu6"></view>
+					<view v-if="analysisData[1].data==='midGrade'||analysisData[1].data === 'midClass'"
+						class="t-icon t-icon-a-bianzu7">
+					</view>
+					<view v-if="analysisData[1].data==='btm'" class="t-icon t-icon-a-bianzu8"></view>
+				</view>
+			</view>
+
+			<!-- 总成绩对比 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">总成绩趋势</view>
+					<view class="t-icon t-icon-tishi2" style="margin-left: auto;" @click="isShowHint = true"></view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="area" ontouch="true" :chartData="examChartData.totalChartData[0]"
+						tooltipFormat='tooltipScore' :canvas2d="true" canvasId="total_chart1" />
+				</view>
+			</view>
+			<!-- 单科与平均对比 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">单科成绩趋势</view>
+					<view class="flex_row" style="margin-left: auto;" @click="subjectPicker = true">
+						<text class="title" style="color: #4169E1;font-weight: 400;">{{subjectCurrent}}</text>
+						<view class="t-icon t-icon-xia"></view>
+					</view>
+				</view>
+				<view class="chart_box">
+					<qiun-data-charts type="area" ontouch="true" :chartData="examChartData.totalChartData[1]"
+						tooltipFormat='tooltipScore' :canvas2d="true" canvasId="total_chart2" />
+				</view>
+			</view>
+			<!-- 个人单科对比 -->
+			<view class="card_item" style="width: 100%;">
+				<view class="card_title">
+					<view class="front_tag"></view>
+					<view class="title">单科对比趋势</view>
+					<view class="flex_row" style="margin-left: auto;" @click="scoreTypePicker = true">
+						<text class="title" style="color: #4169E1;font-weight: 400;">{{scoreTypeCurrent}}</text>
+						<view class="t-icon t-icon-xia"></view>
+					</view>
+				</view>
+				<view class="chart_box" v-if="scoreTypeCurrent === '得分'">
+					<qiun-data-charts type="line" ontouch="true" :chartData="examChartData.totalChartData[2]"
+						tooltipFormat='tooltipScore' :canvas2d="true" canvasId="total_chart3" />
+				</view>
+				<view class="chart_box" v-if="scoreTypeCurrent === '得分率'">
+					<qiun-data-charts type="line" ontouch="true" :chartData="examChartData.totalChartData[2]"
+						tooltipFormat='tooltipScoreShort' :canvas2d="true" canvasId="total_chart4" />
+				</view>
+			</view>
+		</view>
+		<!-- 选择器 -->
+		<!-- 科目选择 -->
+		<u-picker :show="subjectPicker" :columns="subjectList" @confirm="subjectConfirm" @cancel="cancel" />
+		<!-- 模式选择 -->
+		<u-picker :show="scoreTypePicker" :columns="scoreTypeList" @confirm="scoreTypeConfirm" @cancel="cancel" />
+		<!-- 模态框 -->
+		<u-modal :content="content" title="数据图表的基础使用" :show="isShowHint" :zoom="false"
+			@confirm="() => isShowHint = false"></u-modal>
+
+	</view>
+</template>
+
+<script>
+	import MockData from '@/common/global_js/MockData.js'
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		computed: {
+			...mapState('m_chart', ['examChartData', 'subjectExamData']),
+		},
+		watch: {
+			subjectCurrent: {
+				handler(newValue) {
+					let subjectChartData = this.mockData.find(x => x.series[0].name.includes(newValue))
+					let temp = this.examChartData
+					temp.totalChartData[1] = subjectChartData
+					this.updateExamChartData(temp)
+					this.chooseAnalysisSubject()
+				},
+				immediate: false
+			},
+		},
+		data() {
+			return {
+				mockData: MockData.subjectData,
+				//选择器显示
+				subjectPicker: false,
+				scoreTypePicker: false,
+				//选择器内容
+				subjectList: '',
+				scoreTypeList: [
+					['得分', '得分率']
+				],
+				//当前选中
+				subjectCurrent: '',
+				scoreTypeCurrent: '',
+				//分析模块数据
+				analysisData: [{
+					title: '学期平均总得分',
+					data: '',
+					color: '#4169E1',
+				}, {
+					title: '学期平均分',
+					data: '',
+					color: '#ff8caf',
+				}],
+				//学期平均总得分
+				totalSemAvg: '',
+				//单科学期平均得分
+				singleSemAvg: '',
+				isShowHint: false,
+				content: '点击图表展示详细内容\n点击上方数据名可以隐藏或显示数据\n信息过多可以试试左右滑动查看'
+			}
+		},
+		onLoad() {
+			this.init()
+		},
+		methods: {
+			...mapMutations('m_chart', ['updateExamChartData']),
+			init() {
+				this.setChartOptions()
+				this.getAnalysisData()
+			},
+			//获得分析数据
+			getAnalysisData() {
+				function arrSum(array) {
+					let cont = 0
+					for (let i = 0; i < array.length; i++) {
+						cont += array[i]
+					}
+					return cont;
+				}
+				let totalSemAvg = parseInt((arrSum(this.examChartData.totalChartData[0].series[0].data) / this
+					.examChartData.totalChartData[0].series[0].data.length).toFixed(0))
+				this.totalSemAvg = totalSemAvg
+				let classSemAvg = parseInt((arrSum(this.examChartData.totalChartData[0].series[1].data) / this
+					.examChartData.totalChartData[0].series[1].data.length).toFixed(0))
+				console.log('班级平均总分', classSemAvg);
+				let gradeSemAvg = parseInt((arrSum(this.examChartData.totalChartData[0].series[2].data) / this
+					.examChartData.totalChartData[0].series[2].data.length).toFixed(0))
+				console.log('年级平均总分', gradeSemAvg);
+				if (totalSemAvg > classSemAvg && totalSemAvg > gradeSemAvg) {
+					this.analysisData[0].data = 'top'
+				} else if (totalSemAvg > classSemAvg && totalSemAvg >= gradeSemAvg) {
+					this.analysisData[0].data = 'midClass'
+				} else if (totalSemAvg > gradeSemAvg && totalSemAvg >= classSemAvg) {
+					this.analysisData[0].data = 'midGrade'
+				} else {
+					this.analysisData[0].data = 'btm'
+				}
+			},
+			chooseAnalysisSubject() {
+				function arrSum(array) {
+					let cont = 0
+					for (let i = 0; i < array.length; i++) {
+						cont += array[i]
+					}
+					return cont;
+				}
+				this.analysisData[1].title = this.subjectCurrent + '学期平均分'
+				console.log(this.examChartData.totalChartData[1]);
+				let singleSemAvg = parseInt((arrSum(this.examChartData.totalChartData[1].series[0].data) / this
+					.examChartData.totalChartData[1].series[0].data.length).toFixed(0))
+				this.singleSemAvg = singleSemAvg
+				let classSemSinAvg = parseInt((arrSum(this.examChartData.totalChartData[1].series[1].data) / this
+					.examChartData.totalChartData[1].series[1].data.length).toFixed(0))
+				console.log('班级平均单科总分', classSemSinAvg);
+				let gradeSemSinAvg = parseInt((arrSum(this.examChartData.totalChartData[1].series[2].data) / this
+					.examChartData.totalChartData[1].series[2].data.length).toFixed(0))
+				console.log('年级平均单科总分', gradeSemSinAvg);
+				if (singleSemAvg > classSemSinAvg && singleSemAvg > gradeSemSinAvg) {
+					this.analysisData[1].data = 'top'
+				} else if (singleSemAvg > classSemSinAvg && singleSemAvg >= gradeSemSinAvg) {
+					this.analysisData[1].data = 'midClass'
+				} else if (singleSemAvg > gradeSemSinAvg && singleSemAvg >= classSemSinAvg) {
+					this.analysisData[1].data = 'midGrade'
+				} else {
+					this.analysisData[1].data = 'btm'
+				}
+			},
+			//初始化选择器内容(图表配置)
+			setChartOptions() {
+				if (this.scoreTypeCurrent === '')
+					this.scoreTypeCurrent = this.scoreTypeList[0][0]
+				if (this.subjectList === '') {
+					let arr = []
+					arr.push(this.subjectExamData.subjectList)
+					this.subjectList = arr
+					this.subjectCurrent = this.subjectList[0][0]
+				} else {
+					this.subjectCurrent = this.subjectList[0][0]
+				}
+			},
+			//切换科目
+			subjectConfirm(e) {
+				this.subjectCurrent = e.value[0]
+				this.subjectPicker = false
+			},
+			//切换模式
+			scoreTypeConfirm(e) {
+				this.scoreTypeCurrent = e.value[0]
+				this.scoreTypePicker = false
+			},
+			cancel() {
+				this.subjectPicker = false
+				this.scoreTypePicker = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import 'gradelist_pages.scss';
+</style>

+ 0 - 0
subpkg/guide/accesspage.vue


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