Bläddra i källkod

Merge branch 'develop' into PL/develop-BI

Li 2 år sedan
förälder
incheckning
7fc35205e2

+ 7 - 2
TEAMModelOS.SDK/Models/Cosmos/Student/Student.cs

@@ -45,7 +45,7 @@ namespace TEAMModelOS.SDK.Models
         public string groupName { get; set; }
         public string periodId { get; set; }
         /// <summary>
-        /// 性别 m( male,男) f (female 女)  n(secret 保密) 
+        /// 性别 M( male,男) F (female 女)  N(secret 保密) 
         /// </summary>
         public string gender { get; set; }
         
@@ -64,7 +64,8 @@ namespace TEAMModelOS.SDK.Models
     }
     public class Guardian : CosmosEntity
     {
-        // id = tmdid
+        //存 Student表
+        // id = uuid
         // code = "Base-Guardian"
 
         //绑定信息的key(手机号,邮箱,醍摩豆id)
@@ -103,6 +104,10 @@ namespace TEAMModelOS.SDK.Models
         /// 学生所在的学校
         /// </summary>
         public string code { get; set; }
+        /// <summary>
+        /// 是否认证通过 0 默认,未通过,1 通过 。
+        /// </summary>
+        public int auth { get; set; } = 0;
     }
     public class StudentGuardian
     {

+ 154 - 12
TEAMModelOS.SDK/Models/Service/StudentService.cs

@@ -478,7 +478,8 @@ namespace TEAMModelOS.SDK
         /// <param name="schoolId"></param>
         /// <param name="students"></param>
         /// <returns></returns>
-        private static (Dictionary<string, (string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear, string guardian, string gName, string gPhone,string imei, List<StudentGuardian> guardians)> studs,
+        private static (Dictionary<string, (string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear,
+            string guardian, string gName, string gPhone,string imei, List<StudentGuardian> guardians,string gender)> studs,
             Dictionary<string, (string className, string periodId, int year, string no)> classInfo,
             Dictionary<string, List<(string id, string no)>> classStudNo,
             List<string> errorYear,
@@ -487,8 +488,10 @@ namespace TEAMModelOS.SDK
             //批量匯入 檢查輸入數據 確認座號 確認教室(創建教室) 確認學生存不存在或是要不要更新
 
             //存放輸入的學生資訊 key:stud id value:學生詳細資料
-            Dictionary<string, (string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear,   string guardian, string gName, string gPhone, string imei, List<StudentGuardian> guardians) > dicStuds =
-                new Dictionary<string, (string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear, string guardian, string gName, string gPhone, string imei, List<StudentGuardian> guardians)>();
+            Dictionary<string, (string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear,
+                string guardian, string gName, string gPhone, string imei, List<StudentGuardian> guardians,string gender) > dicStuds =
+                new Dictionary<string, (string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear,
+                string guardian, string gName, string gPhone, string imei, List<StudentGuardian> guardians,string gender)>();
 
             //存放教室資訊用 key:classNo value:className
             Dictionary<string, (string className, string periodId, int year, string classNo)> dicClassInfo = new Dictionary<string, (string className, string periodId, int year, string classNo)>();
@@ -524,7 +527,9 @@ namespace TEAMModelOS.SDK
                         dicStuds.Remove(id);
                     }
 
-                    (string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear, string guardian, string gName, string gPhone, string imei, List<StudentGuardian> guardians) studentInfo = (null, null, 0, null, null, null, null, null, 0, null, null, null, null, null) ;
+                    (string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear, 
+                        string guardian, string gName, string gPhone, string imei, List<StudentGuardian> guardians, string gender) studentInfo =
+                        (null, null, 0, null, null, null, null, null, 0, null, null, null, null, null,null) ;
 
                     if (student.TryGetProperty("name", out var tmpName) && !string.IsNullOrWhiteSpace(tmpName.GetString())) studentInfo.name = tmpName.GetString();
 
@@ -590,6 +595,7 @@ namespace TEAMModelOS.SDK
                         studentInfo.guardians = guardians;
                     }
                     if (student.TryGetProperty("imei", out var tmpImei) && !string.IsNullOrWhiteSpace($"{tmpImei}")) studentInfo.imei = tmpImei.GetString();
+                    if (student.TryGetProperty("gender", out var tmpgender) && !string.IsNullOrWhiteSpace($"{tmpgender}")) studentInfo.gender = tmpgender.GetString();
                     //將最後結果加到字典內
                     dicStuds.Add(id, studentInfo);
                 }
@@ -766,7 +772,9 @@ namespace TEAMModelOS.SDK
                     writerNew.WriteString("pw", stud.Value.pw);
                     if (string.IsNullOrWhiteSpace(stud.Value.name)) writerNew.WriteNull("name");
                     else writerNew.WriteString("name", stud.Value.name);
-                    writerNew.WriteString("gender", "M");
+                    if (string.IsNullOrWhiteSpace(stud.Value.gender)) writerNew.WriteNull("gender");
+                    else writerNew.WriteString("gender", stud.Value.gender);
+
                     writerNew.WriteNull("picture");
                     writerNew.WriteNull("mail");
                     writerNew.WriteNull("mobile");
@@ -846,6 +854,10 @@ namespace TEAMModelOS.SDK
                             {
                                 student.no = stud.Value.no;
                             }
+                            if (!string.IsNullOrWhiteSpace(stud.Value.gender))
+                            {
+                                student.gender = stud.Value.gender;
+                            }
                             if (!string.IsNullOrWhiteSpace(stud.Value.classNo))
                             {
                                 student.classId = classId;
@@ -862,11 +874,37 @@ namespace TEAMModelOS.SDK
                             }
                             tmpStudInfo.picture = student.picture;
                             if (!string.IsNullOrWhiteSpace(stud.Value.gPhone)) {
-                                var guardian = student.guardians.Find(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(stud.Value.gPhone));
-                                if (guardian != null)
+                                List<Guardian> guardians = new List<Guardian>();
+                                string sql = $"select distinct value (c) from c   where  c.mobile='{stud.Value.gPhone}' ";
+                                await foreach (var item in cosmosContainer.GetItemQueryIterator<Guardian>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base-Guardian") })) {
+                                    guardians.Add(item);
+                                }
+                                if (guardians.Any())
                                 {
-                                    guardian.name = stud.Value.gName;
-                                    guardian.relation = stud.Value.guardian;
+                                    guardians.ForEach(async x => {
+                                        GuardianStudent guardianStudent =  x.students.Find(s => s.id.Equals(stud.Key)  && s.code.Equals(schoolId));
+                                        if (guardianStudent == null) {
+                                            x.students.Add(new GuardianStudent { type=2,id=stud.Key,code=schoolId,name=stud.Value.name });
+                                        }
+                                       await cosmosContainer.ReplaceItemAsync(x, x.id, new PartitionKey(x.code));
+                                    });
+                                }
+                                else {
+                                    Guardian guardian = new Guardian {
+                                        id = Guid.NewGuid().ToString(),
+                                        code= "Base-Guardian",
+                                        pk= "Guardian",
+                                        mobile=stud.Value.gPhone,
+                                        name = stud.Value.gName,
+                                        students = new List<GuardianStudent> { new GuardianStudent { type = 2, id = stud.Key, code = schoolId, name = stud.Value.name } }
+                                    };
+                                    await  cosmosContainer.CreateItemAsync(guardian,   new PartitionKey(guardian.code));
+                                }
+                                var studentGuardian = student.guardians.Find(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(stud.Value.gPhone));
+                                if (studentGuardian != null)
+                                {
+                                    studentGuardian.name = stud.Value.gName;
+                                    studentGuardian.relation = stud.Value.guardian;
                                 }
                                 else
                                 {
@@ -1066,6 +1104,39 @@ namespace TEAMModelOS.SDK
                         writer.WriteEndObject();
                     }
                     writer.WriteEndArray();
+
+                    foreach (var studentGuardian in studCreateInfo.guardians) {
+                        List<Guardian> guardians = new List<Guardian>();
+                        string sql = $"select distinct value (c) from c   where  c.mobile='{studentGuardian.mobile}' ";
+                        await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS,Constant.Student).GetItemQueryIterator<Guardian>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base-Guardian") }))
+                        {
+                            guardians.Add(item);
+                        }
+                        if (guardians.Any())
+                        {
+                            guardians.ForEach(async x => {
+                                GuardianStudent guardianStudent = x.students.Find(s => s.id.Equals(studCreateInfo.id) && s.code.Equals(schoolId));
+                                if (guardianStudent == null)
+                                {
+                                    x.students.Add(new GuardianStudent { type = 2, id = studCreateInfo.id, code = schoolId, name = studCreateInfo.name });
+                                }
+                                await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).ReplaceItemAsync(x, x.id, new PartitionKey(x.code));
+                            });
+                        }
+                        else
+                        {
+                            Guardian guardian = new Guardian
+                            {
+                                id = Guid.NewGuid().ToString(),
+                                code = "Base-Guardian",
+                                pk = "Guardian",
+                                mobile = studentGuardian.mobile,
+                                name = studentGuardian.name,
+                                students = new List<GuardianStudent> { new GuardianStudent { type = 2, id = studCreateInfo.id, code = schoolId, name = studCreateInfo.name } }
+                            };
+                            await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).CreateItemAsync(guardian, new PartitionKey(guardian.code));
+                        }
+                    }
                 }
                 else
                 {
@@ -1834,7 +1905,8 @@ namespace TEAMModelOS.SDK
         /// <param name="schoolId"></param>
         /// <param name="students"></param>
         /// <returns></returns>
-        public static async Task<(List<object> studs, Dictionary<string, List<string>> classDuplNos, List<string> nonexistentIds, List<string> errorIds, Dictionary<string, List<string>> errorNos, List<string> errorClassId)>
+        public static async Task<(List<object> studs, Dictionary<string, List<string>> classDuplNos, List<string> nonexistentIds, List<string> errorIds,
+            Dictionary<string, List<string>> errorNos, List<string> errorClassId)>
             updateStudents(AzureCosmosFactory _azureCosmos, DingDing _dingDing, Option _option, string schoolId, JsonElement.ArrayEnumerator students)
         {
             try
@@ -1843,10 +1915,12 @@ namespace TEAMModelOS.SDK
 
                 //Key:id Value:學生基本資訊
                 var studentInfos
-                    = new Dictionary<string, (string salt, string pw, string name, int year, string picture, string gender, string mail, string mobile, string classId, string no, string periodId, string irs,string imei, List<StudentGuardian> guardians)>();
+                    = new Dictionary<string, (string salt, string pw, string name, int year, string picture, string gender, string mail, string mobile, 
+                    string classId, string no, string periodId, string irs,string imei, List<StudentGuardian> guardians)>();
                 //用於進行座號是否重複查詢時使用
                 var classStuds
-                    = new Dictionary<string, List<(string id, string salt, string pw, string name, int year, string picture, string gender, string mail, string mobile, string classId, string no, string periodId)>>();
+                    = new Dictionary<string, List<(string id, string salt, string pw, string name, int year, string picture, string gender, string mail, string mobile,
+                    string classId, string no, string periodId)>>();
                 //紀錄教室"輸入"的學生座號是否有重複
                 var impClassDuplNo = new Dictionary<string, List<string>>();
                 //紀錄不存在的學生id
@@ -2183,8 +2257,74 @@ namespace TEAMModelOS.SDK
                                                 break;
                                         }
                                     }
+                                    var stu = account.Deserialize<Student>();
+                                    if (stu.guardians.IsNotEmpty() && studentInfos[id].guardians!=null)
+                                    {
+                                        var  mobiles   = stu.guardians.Select(m => m.mobile);
+                                        var except = mobiles.Except(studentInfos[id].guardians.Select(x => x.mobile));
+                                        if (except.Any()) {
+                                            //清除移除的监护人
+                                            List<Guardian> guardians = new List<Guardian>();
+                                            string sql = $"select distinct value (c) from c   where  c.mobile in ({string.Join(",", except.Select(z => $"'{z}'"))} )";
+                                            await foreach (var guard in cosmosContainer.GetItemQueryIterator<Guardian>(queryText: sql,
+                                                requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base-Guardian") }))
+                                            {
+                                                guard.students.RemoveAll(s => s.id.Equals(id) && s.code.Equals(schoolId));
+                                                guardians.Add(guard);
+                                            }
+                                            guardians.ForEach(async x => {
+                                                if (x.students.IsNotEmpty())
+                                                {
+                                                    try{await cosmosContainer.ReplaceItemAsync(x, x.id, new PartitionKey(x.code));  } catch {}
+                                                }
+                                                else
+                                                {
+                                                    try {
+                                                        await cosmosContainer.DeleteItemStreamAsync(x.id, new PartitionKey(x.code));
+                                                    }
+                                                    catch{ 
+                                                    }
+                                                }
+                                                
+                                            });
+                                        }
+                                    }
                                     if (studentInfos[id].guardians.IsNotEmpty())
                                     {
+                                       
+                                        foreach (var gtudentGuardian in studentInfos[id].guardians)
+                                        {
+                                            List<Guardian> guardians = new List<Guardian>();
+                                            string sql = $"select distinct value (c) from c   where  c.mobile='{gtudentGuardian.mobile}' ";
+                                            await foreach (var guard in cosmosContainer.GetItemQueryIterator<Guardian>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base-Guardian") }))
+                                            {
+                                                guardians.Add(guard);
+                                            }
+                                            if (guardians.Any())
+                                            {
+                                                guardians.ForEach(async x => {
+                                                    GuardianStudent guardianStudent = x.students.Find(s => s.id.Equals(id) && s.code.Equals(schoolId));
+                                                    if (guardianStudent == null)
+                                                    {
+                                                        x.students.Add(new GuardianStudent { type = 2, id = id, code = schoolId, name = studentInfos[id].name });
+                                                    }
+                                                    try { await cosmosContainer.ReplaceItemAsync(x, x.id, new PartitionKey(x.code)); } catch { }
+                                                });
+                                            }
+                                            else
+                                            {
+                                                Guardian guardian = new Guardian
+                                                {
+                                                    id = Guid.NewGuid().ToString(),
+                                                    code = "Base-Guardian",
+                                                    pk = "Guardian",
+                                                    mobile = gtudentGuardian.mobile,
+                                                    name = gtudentGuardian.name,
+                                                    students = new List<GuardianStudent> { new GuardianStudent { type = 2, id = id, code = schoolId, name = studentInfos[id].name } }
+                                                };
+                                                try { await cosmosContainer.CreateItemAsync(guardian, new PartitionKey(guardian.code)); } catch { }
+                                            }
+                                        }
                                         writer.WriteStartArray("guardians");
 
                                         foreach (var guardian in studentInfos[id].guardians)
@@ -2199,6 +2339,8 @@ namespace TEAMModelOS.SDK
                                             writer.WriteEndObject();
                                         }
                                         writer.WriteEndArray();
+
+                                       
                                     }
                                     else
                                     {

+ 1 - 0
TEAMModelOS/ClientApp/package.json

@@ -60,6 +60,7 @@
     "vue": "^2.6.10",
     "vue-apexcharts": "^1.6.0",
     "vue-audio-native": "^0.1.41",
+    "vue-b2wordcloud": "^1.0.5",
     "vue-clipboard2": "^0.3.1",
     "vue-count-to": "^1.0.13",
     "vue-lazyload": "^1.3.3",

BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/icon-crown.png


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/DS-DIGIT.TTF


+ 2 - 0
TEAMModelOS/ClientApp/src/boot-app.js

@@ -48,6 +48,8 @@ import VueClipBoard from 'vue-clipboard2'
 import fabric from 'fabric'
 import VideoPlayer from 'vue-video-player'
 import NewChooseContent from '@/components/selflearn/NewChooseContent'
+import VueWordcloud from 'vue-b2wordcloud'
+Vue.use(VueWordcloud)
 
 
 jsFn.setLocalLang()

+ 3 - 3
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseLine.vue

@@ -227,9 +227,9 @@ export default {
       };
       myChart.clear()
       myChart.setOption(option)
-      window.addEventListener('resize', function () {
-        myChart.resize()
-      })
+      // window.addEventListener('resize', function () {
+      //   myChart.resize()
+      // })
 
     }
   },

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 146 - 0
TEAMModelOS/ClientApp/src/components/dashboard/studentAll/BaseGenderPie.vue


+ 199 - 0
TEAMModelOS/ClientApp/src/components/dashboard/studentAll/BaseRateLine.vue

@@ -0,0 +1,199 @@
+<template>
+  <div id="BaseRateLine" class="art-echart"></div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+    }
+  },
+  methods: {
+    doRender() {
+      let myChart = this.$echarts.init(document.getElementById('BaseRateLine'))
+      let xLabel = ["音乐",
+        "美术",
+        "体育"]
+      let incomeData = ["66", "76", "62",]
+      let incomeData2 = ["94", "86", "98"]
+      let option = {
+        tooltip: {
+          show: true,
+          trigger: 'axis'
+        },
+        title: {
+          text: ' ',
+          left: 'center',
+          top: 20,
+          textStyle: {
+            color: '#fff',
+          }
+        },
+        legend: {
+          show: true,
+          top: 0,
+          textStyle: {
+            color: '#FFF'
+          }
+        },
+        grid: {
+          top: '10%',
+          left: '10%',
+          right: '5%',
+          bottom: '15%'
+        },
+        xAxis: [{
+          type: 'category',
+          boundaryGap: false,
+          axisLine: {
+            show: true,
+            lineStyle: {
+              color: "rgba(76, 230, 231, 0.1)"
+            },
+          },
+          axisLabel: {
+            textStyle: {
+              color: '#FFF',
+              padding: 16,
+              fontSize: 12
+            },
+            formatter: function (data) {
+              return data
+            }
+          },
+          splitLine: {
+            show: false,
+          },
+          axisTick: {
+            show: false,
+          },
+          data: xLabel
+        }],
+        yAxis: [{
+          min: 0,
+          splitNumber: 5,
+          splitLine: {
+            show: true,
+            lineStyle: {
+              color: "rgba(76, 230, 231, 0.1)"
+            },
+          },
+          axisLine: {
+            show: false,
+          },
+          axisLabel: {
+            show: true,
+            textStyle: {
+              color: '#FFF',
+            },
+            formatter: '{value} %',
+          },
+          axisTick: {
+            show: false,
+          },
+        }],
+        series: [{
+          name: '优秀率',
+          type: 'line',
+          symbol: 'circle',
+          showAllSymbol: true,
+          symbolSize: 10,
+          lineStyle: {
+            normal: {
+              width: 2,
+              color: "rgba(76, 228, 230, 1)",
+            }
+          },
+          itemStyle: {
+            color: "rgba(76, 228, 230, 1)",
+            borderWidth: 2
+
+          },
+          tooltip: {
+            show: true
+          },
+          areaStyle: {
+            normal: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                offset: 0,
+                color: "rgba(76, 228, 230, 0.3)"
+              },
+              {
+                offset: 1,
+                color: "rgba(76, 228, 230, 0)"
+              }
+              ], false),
+              shadowColor: 'rgba(76, 228, 230, 0.5)',
+              shadowBlur: 20
+            }
+          },
+          data: incomeData
+        }, {
+          name: '及格率',
+          type: 'line',
+          symbol: 'circle',
+          showAllSymbol: true,
+          symbolSize: 10,
+          lineStyle: {
+            normal: {
+              width: 1,
+              color: "rgba(126, 207, 81,1)",
+            }
+          },
+          itemStyle: {
+            color: "rgba(126, 207, 81,1)",
+            borderWidth: 2
+          },
+          tooltip: {
+            show: true
+          },
+          areaStyle: {
+            normal: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                offset: 0,
+                color: "rgba(126, 207, 81, 0.3)"
+              },
+              {
+                offset: 1,
+                color: "rgba(126, 207, 81,0)"
+              }
+              ], false),
+              shadowColor: 'rgba(126, 207, 81, 0.5)',
+              shadowBlur: 20
+            }
+          },
+          data: incomeData2
+        }
+        ]
+      };
+      myChart.clear()
+      myChart.setOption(option)
+      window.addEventListener('resize', function () {
+        myChart.resize()
+      })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

+ 464 - 0
TEAMModelOS/ClientApp/src/components/dashboard/studentAll/BaseScoreBar.vue

@@ -0,0 +1,464 @@
+<template>
+  <div id="BaseScoreBar" class="art-echart"></div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+    }
+  },
+  methods: {
+    doRender() {
+      let myChart = this.$echarts.init(document.getElementById('BaseScoreBar'))
+      var yList = [61, 86, 67, 43, 52, 70, 28, 107];
+      var colors = [
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+        {
+          type: 'linear',
+          x: 0,
+          x2: 1,
+          y: 0,
+          y2: 0,
+          colorStops: [
+            {
+              offset: 0,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#00FFFF',
+            },
+            {
+              offset: 0.5,
+              color: '#11A6D0',
+            },
+            {
+              offset: 1,
+              color: '#11A6D0',
+            },
+            {
+              offset: 0,
+              color: '#83bac9',
+            },
+            {
+              offset: 0,
+              color: 'rgba(17,166,208,0.3)',
+            },
+          ],
+        },
+      ];
+      let option = {
+        grid: {
+          left: '10%',
+          right: '3%',
+          top: '16%',
+          bottom: '15%',
+        },
+        xAxis: {
+          nameTextStyle: {
+            color: '#00dcf1',
+            padding: [0, 0, 0, 20],
+          },
+          data: ['60分以下', '60分-70分', '70分-80分', '80分-90分', '90分以上'],
+          show: true,
+          type: 'category',
+          axisLabel: {
+            // rotate: -30, // 设置文字旋转
+            fontSize: 12,
+            lineHeight: 24,
+            fontFamily: 'siyuan',
+            // fontStyle: 'italic', // 设置文字斜体
+            textStyle: {
+              //改变刻度字体样式
+              color: '#fff',
+            },
+          },
+          axisTick: {
+            show: false,
+          },
+        },
+        yAxis: {
+          name: '单位:人',
+          nameTextStyle: {
+            fontSize: 12,
+            color: '#fff',
+          },
+          show: true,
+          splitNumber: 4,
+          splitLine: {
+            show: true,
+            lineStyle: {
+              type: 'dashed',
+              color: 'rgba(255,255,255,0.2)',
+            },
+          },
+          axisLabel: {
+            color: '#fff',
+          },
+
+          axisTick: {
+            //y轴刻度线
+            show: false,
+          },
+          axisLine: {
+            //y轴
+            show: false,
+          },
+        },
+        series: [
+          {
+            type: 'bar',
+            barWidth: '40',
+            showBackground: true,
+            backgroundStyle: {
+              color: 'none',
+            },
+            itemStyle: {
+              normal: {
+                color: function (params) {
+                  //console.log(params)
+                  return colors[params.dataIndex % 7];
+                },
+              },
+            },
+            label: {
+              show: true,
+              position: [20, -25],
+              color: '#fff',
+              fontSize: 12,
+              fontStyle: 'bold',
+              align: 'center',
+            },
+
+            data: yList,
+          },
+          {
+            z: 2,
+            type: 'pictorialBar',
+            data: yList,
+            symbol: 'diamond',
+            symbolOffset: [0, '50%'],
+            symbolSize: [40, 10],
+            itemStyle: {
+              normal: {
+                color: function (params) {
+                  return colors[params.dataIndex % 7];
+                },
+              },
+            },
+          },
+          {
+            z: 3,
+            type: 'pictorialBar',
+            symbolPosition: 'end',
+            data: yList,
+            symbol: 'diamond',
+            symbolOffset: [0, '-50%'],
+            symbolSize: [40, 40 * 0.25],
+            itemStyle: {
+              normal: {
+                borderWidth: 0,
+                color: function (params) {
+                  return colors[params.dataIndex % 7].colorStops[0].color;
+                },
+              },
+            },
+          },
+        ],
+      };
+
+      myChart.clear()
+      myChart.setOption(option)
+      window.addEventListener('resize', function () {
+        myChart.resize()
+      })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

+ 62 - 0
TEAMModelOS/ClientApp/src/components/dashboard/studentAll/BaseWordCloud.vue

@@ -0,0 +1,62 @@
+<template>
+  <vue-wordcloud style="width: 100%;height: 90%;background-color:transparent !important;" :options="options" />
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+      options: {
+        list: [
+          ['上课积极', 36], ['团结友爱', 32], ['助人为乐', 32], ['课堂认真', 46], ['文明礼貌', 36], ['上课积极', 36], ['团结友爱', 32], ['助人为乐', 32], ['课堂认真', 46], ['文明礼貌', 36]
+        ],
+        backgroundColor: 'transparent',
+        tooltip: {
+          show: true,
+          formatter: function (item) {
+            return '<div>' + item[0] + '</div>' + '<div>' + item[1] + '</div>'
+          }
+        },
+        shadowColor: 'rgba(0,0,0,0.9)',
+        shadowOffsetX: 2,
+        shadowOffsetY: 2,
+        shadowBlur: 5,
+        color: ['#2ca1ff', '#0adbfa', '#febe13', '#65e5dd', '#7b2cff', '#fd5151', '#f071ff', '#85f67a', '#0baefd', '#fdcd0b', '#0bfdab', '#ff5353', '#ff72cb', '#8488ff',]
+      }
+    }
+  },
+  methods: {
+    doRender() {
+      // let myChart = this.$echarts.init(document.getElementById('BaseProvincePie'))
+
+      // myChart.clear()
+      // myChart.setOption(option)
+      // window.addEventListener('resize', function () {
+      //   myChart.resize()
+      // })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

+ 5 - 0
TEAMModelOS/ClientApp/src/css/site.css

@@ -367,3 +367,8 @@ dot::before {
     font-family: yjsz;
     src:url('../assets/iconfont/NUMBER.ttf');
 }
+
+@font-face{
+    font-family: staticFont;
+    src:url('../assets/iconfont/DS-DIGIT.TTF');
+}

+ 9 - 0
TEAMModelOS/ClientApp/src/router/routes.js

@@ -1147,6 +1147,15 @@ export const routes = [{
 	{
 		name: 'stuDashboard',
 		path: '/stuDashboard',
+		component: resolve => require(['@/view/dashboard/StudentAll.vue'], resolve),
+		meta: {
+			activeName: 'Dashboard',
+			middleware: ['login', 'ability:admin,dashboard-read'],
+		}
+	},
+	{
+		name: 'stuDetails',
+		path: '/stuDetails',
 		component: resolve => require(['@/view/dashboard/Student.vue'], resolve),
 		meta: {
 			activeName: 'Dashboard',

+ 3 - 1
TEAMModelOS/ClientApp/src/view/dashboard/Art.less

@@ -8,7 +8,9 @@
   // transform-origin: left top;
   overflow: hidden;
   position: relative;
-
+  font-family: "微軟正黑體",
+    "Microsoft JhengHei UI",
+    "Microsoft JhengHei";
 
 
   .tools {

+ 1 - 201
TEAMModelOS/ClientApp/src/view/dashboard/Student.less

@@ -10,206 +10,6 @@
     "Microsoft JhengHei UI",
     "Microsoft JhengHei";
 
-  .dashboard-block {
-    position: relative;
-    width: 98%;
-    height: 97%;
-    margin: 1%;
-    padding: 1%;
-    display: inline-flex;
-    flex-direction: column;
-    border-radius: 10px;
-    background-color: #266ae70f;
-
-    .person {
-      position: absolute;
-      left: 0;
-      top: 0;
-      bottom: 0;
-      right: 0;
-      margin: auto;
-      width: 280px;
-    }
-
-    .block-title {
-      width: 100%;
-      display: flex;
-      padding: 10px;
-      font-size: 18px;
-      font-weight: bold;
-      align-items: center;
-
-
-      &::before {
-        content: '';
-        display: inline-block;
-        width: 5px;
-        height: 15px;
-        margin-right: 10px;
-        border-radius: 5px;
-        background-color: #6184ec;
-      }
-    }
-
-    .block-content {
-      width: 100%;
-      height: 100%;
-      display: flex;
-      padding: 10px;
-    }
-
-    .cicle2 {
-      width: 80%;
-      height: 100%;
-      background: url(./circle.png) no-repeat center;
-      background-size: 100%;
-      position: absolute;
-      top: 27%;
-      left: 10%;
-      transform-style: preserve-3d;
-      transform: translateX(-50%) rotateX(75deg);
-      animation: rotate2 15s linear infinite;
-    }
-
-    @keyframes rotate2 {
-      0% {
-        transform: rotateX(75deg) rotateZ(0);
-      }
-
-      100% {
-        transform: rotateX(75deg) rotateZ(360deg);
-      }
-    }
-  }
-
-
-
-  .tools {
-    position: absolute;
-    right: 30px;
-    top: 40px;
-    font-size: 26px;
-    font-weight: bold;
-    display: flex;
-    align-items: center;
-    cursor: pointer;
-
-    .time-text {
-      font-size: 30px;
-      margin-right: 20px;
-      font-weight: 200;
-      color: #9f9f9f;
-      font-family: 'yjsz';
-    }
-  }
-
-  .ivu-select,
-  .ivu-input,
-  .ivu-select-placeholder {
-    color: @mainColor  !important;
-  }
-
-  .ivu-select-selection,
-  .ivu-input {
-    background-color: #021f554a !important;
-    width: 130px;
-    border-color: @mainColor;
-    border-radius: 5px;
-    height: 30px;
-    margin-right: 10px;
-  }
-
-  .ivu-input {
-    width: 200px;
-    color: #fff !important;
-    font-weight: bold;
-  }
-
-  .ivu-cascader .ivu-cascader-menu-item {
-    color: #fff !important;
-  }
-
-  .ivu-cascader-menu {
-    border-right-color: #4f62b9;
-  }
-
-  .ivu-cascader .ivu-cascader-menu-item:hover,
-  .ivu-cascader-menu .ivu-cascader-menu-item-active {
-    background-color: #01928bd6;
-    color: #e3e6ebc2;
-  }
-
-  .ivu-select-dropdown {
-    // min-width: 200px !important;
-    background-color: #2761c5c2;
-  }
-
-  .ivu-select-item-focus {
-    background-color: #01928bd6;
-  }
-
-  .ivu-select-selected-value {
-    font-size: 18px;
-    color: #fff;
-  }
-
-  .ivu-select-item {
-    color: #fff;
-
-    &:hover {
-      background-color: #01928bd6;
-    }
-  }
-
-  .school-info {
-    position: absolute;
-    left: 30px;
-    top: 40px;
-    font-size: 20px;
-    font-weight: bold;
-    cursor: pointer;
-    display: flex;
-    align-items: center;
-
-
-
-    &-name {
-      margin: 0 10px;
-    }
-
-    &-period {
-      font-size: 12px;
-      background-color: #2d2d2d;
-      display: inline-block;
-      padding: 2px 10px;
-      border-radius: 4px;
-      margin-right: 5px;
-    }
-
-    &-semester {
-      font-size: 12px;
-      background-color: #2d2d2d;
-      display: inline-block;
-      padding: 2px 10px;
-      border-radius: 4px;
-      margin-right: 5px;
-    }
-
-    .dashboard-menu {
-      margin-left: 20px;
-      cursor: pointer;
-
-      &-active {
-        border-bottom: 2px solid #fff;
-      }
-    }
-
-    img {
-      border-radius: 50%;
-      width: 25px;
-    }
-  }
-
   .bg {
     width: 100%;
     height: 100%;
@@ -219,7 +19,7 @@
     background-position: center center;
   }
 
-  .host-body {
+  .single-student {
 
     .dv-dec-10,
     .dv-dec-10-s {

+ 8 - 4
TEAMModelOS/ClientApp/src/view/dashboard/Student.vue

@@ -2,10 +2,11 @@
   <div id="stuIndex" ref="appRef">
     <div class="bg">
       <dv-loading v-if="loading">{{ $t('researchCenter.dashboard.loading') }}</dv-loading>
-      <div v-else class="host-body">
+      <div v-else class="host-body single-student">
         <div class="tools">
           <span class="time-text">{{ dateYear }} <span style="display: inline-block; margin: 0 5px;color: #0fa2fe;">{{ dateDay }}</span> </span>
-          <span class="icon iconfont icon-tuichuquanping" style="font-size: 22px;" :title="$t('researchCenter.dashboard.quit')" @click="goBack"></span>
+          <span class="icon iconfont icon-tuichuquanping" style="font-size: 22px;" :title="$t('researchCenter.dashboard.quit')" @click="goQuit"></span>
+          <span class="icon iconfont icon-undo" style="font-size: 22px;margin-left:20px;" :title="$t('researchCenter.dashboard.quit')" @click="goBack"></span>
         </div>
         <div class="school-info">
           <img :src="schoolInfo.schoolLogo">
@@ -230,7 +231,7 @@ export default {
     BaseStuProfile,
   },
   mounted() {
-    this.$tools.fullScreen(document.getElementById('stuIndex'))
+    // this.$tools.fullScreen(document.getElementById('stuIndex'))
     this.timeFn()
     // this.cancelLoading()
   },
@@ -269,10 +270,13 @@ export default {
         this.cancelLoading()
       })
     },
-    goBack() {
+    goQuit() {
       this.$tools.exitFullscreen()
       this.$router.push('/home/Dashboard')
     },
+    goBack() {
+      this.$parent.isAll = true
+    },
     timeFn() {
       this.timing = setInterval(() => {
         this.dateDay = this.$tools.formatTime(new Date(), 'hh:mm:ss')

+ 471 - 0
TEAMModelOS/ClientApp/src/view/dashboard/StudentAll.less

@@ -0,0 +1,471 @@
+@mainColor: #568aea;
+
+#studentAllIndex {
+    color: #d3d6dd;
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+    position: relative;
+    font-family: "微軟正黑體",
+        "Microsoft JhengHei UI",
+        "Microsoft JhengHei";
+
+    .border-box-content {
+        padding: 15px;
+    }
+
+    .dashboard-block {
+        position: relative;
+        width: 100%;
+        height: 100%;
+        // margin: 10px;
+        // padding: 0px;
+        display: inline-flex;
+        flex-direction: column;
+        box-sizing: border-box;
+        border-radius: 10px;
+        background-color: #4685fa11;
+
+        .person {
+            position: absolute;
+            left: 0;
+            top: 0;
+            bottom: 0;
+            right: 0;
+            margin: auto;
+            width: 280px;
+        }
+
+        .block-title {
+            width: 100%;
+            display: flex;
+            padding: 10px;
+            font-size: 18px;
+            font-weight: bold;
+            align-items: center;
+
+
+            &::before {
+                content: '';
+                display: inline-block;
+                width: 5px;
+                height: 15px;
+                margin-right: 10px;
+                border-radius: 5px;
+                background-color: #6184ec;
+            }
+        }
+
+        .block-content {
+            width: 100%;
+            height: 100%;
+            display: flex;
+            padding: 10px;
+
+            .honor-avatar {
+                display: flex;
+                flex-wrap: wrap;
+                justify-content: center;
+                align-items: space-between;
+                width: 100%;
+
+                .honor-item {
+                    position: relative;
+                    display: flex;
+                    flex-direction: column;
+                    align-items: center;
+                    justify-content: space-around;
+                    width: 33.3%;
+
+                    .img-avatar {
+                        border-radius: 50%;
+                        border: 3px solid #58a8bb;
+                        cursor: pointer;
+                    }
+
+                    .img-crown {
+                        position: absolute;
+                        top: -17px;
+                        left: 28px;
+                    }
+                }
+            }
+
+            .static-wrap {
+                display: flex;
+                width: 100%;
+                justify-content: space-around;
+                align-items: center;
+
+                .item {
+                    display: flex;
+                    flex-direction: column;
+                    align-items: center;
+                    justify-content: center;
+
+                    .num {
+                        font-size: 46px;
+                        font-weight: bold;
+                        font-family: staticFont;
+                        color: #1dd86b;
+                    }
+
+
+                    .label {
+                        font-weight: bold;
+                        color: #a1a5a5;
+                    }
+                }
+            }
+        }
+
+        .cicle2 {
+            width: 80%;
+            height: 100%;
+            background: url(./circle.png) no-repeat center;
+            background-size: 100%;
+            position: absolute;
+            top: 27%;
+            left: 10%;
+            transform-style: preserve-3d;
+            transform: translateX(-50%) rotateX(75deg);
+            animation: rotate2 15s linear infinite;
+        }
+
+        @keyframes rotate2 {
+            0% {
+                transform: rotateX(75deg) rotateZ(0);
+            }
+
+            100% {
+                transform: rotateX(75deg) rotateZ(360deg);
+            }
+        }
+    }
+
+
+
+    .tools {
+        position: absolute;
+        right: 30px;
+        top: 40px;
+        font-size: 26px;
+        font-weight: bold;
+        display: flex;
+        align-items: center;
+        cursor: pointer;
+
+        .time-text {
+            font-size: 30px;
+            margin-right: 20px;
+            font-weight: 200;
+            color: #9f9f9f;
+            font-family: 'staticFont';
+        }
+    }
+
+    .ivu-select,
+    .ivu-input,
+    .ivu-select-placeholder {
+        color: @mainColor  !important;
+    }
+
+    .ivu-select-selection,
+    .ivu-input {
+        background-color: #021f554a !important;
+        width: 130px;
+        border-color: @mainColor;
+        border-radius: 5px;
+        height: 30px;
+        margin-right: 10px;
+    }
+
+    .ivu-input {
+        width: 200px;
+        color: #fff !important;
+        font-weight: bold;
+    }
+
+    .ivu-cascader .ivu-cascader-menu-item {
+        color: #fff !important;
+    }
+
+    .ivu-cascader-menu {
+        border-right-color: #4f62b9;
+    }
+
+    .ivu-cascader .ivu-cascader-menu-item:hover,
+    .ivu-cascader-menu .ivu-cascader-menu-item-active {
+        background-color: #01928bd6;
+        color: #e3e6ebc2;
+    }
+
+    .ivu-select-dropdown {
+        // min-width: 200px !important;
+        background-color: #2761c5c2;
+    }
+
+    .ivu-select-item-focus {
+        background-color: #01928bd6;
+    }
+
+    .ivu-select-selected-value {
+        font-size: 18px;
+        color: #fff;
+    }
+
+    .ivu-select-item {
+        color: #fff;
+
+        &:hover {
+            background-color: #01928bd6;
+        }
+    }
+
+    .school-info {
+        position: absolute;
+        left: 30px;
+        top: 40px;
+        font-size: 20px;
+        font-weight: bold;
+        cursor: pointer;
+        display: flex;
+        align-items: center;
+
+
+
+        &-name {
+            margin: 0 10px;
+        }
+
+        &-period {
+            font-size: 12px;
+            background-color: #2d2d2d;
+            display: inline-block;
+            padding: 2px 10px;
+            border-radius: 4px;
+            margin-right: 5px;
+        }
+
+        &-semester {
+            font-size: 12px;
+            background-color: #2d2d2d;
+            display: inline-block;
+            padding: 2px 10px;
+            border-radius: 4px;
+            margin-right: 5px;
+        }
+
+        .dashboard-menu {
+            margin-left: 20px;
+            cursor: pointer;
+
+            &-active {
+                border-bottom: 2px solid #fff;
+            }
+        }
+
+        img {
+            border-radius: 50%;
+            width: 25px;
+        }
+    }
+
+    .bg {
+        width: 100%;
+        height: 100%;
+        padding: 16px 16px 0 16px;
+        background-image: url("../../assets/image/pageBg.png");
+        background-size: cover;
+        background-position: center center;
+    }
+
+    .all-student {
+
+        .dv-dec-10,
+        .dv-dec-10-s {
+            width: 33.3%;
+            height: 5px;
+        }
+
+        .dv-dec-10-s {
+            transform: rotateY(180deg);
+        }
+
+        .dv-dec-8 {
+            width: 200px;
+            height: 50px;
+        }
+
+        .title {
+            position: relative;
+            width: 500px;
+            text-align: center;
+            background-size: cover;
+            background-repeat: no-repeat;
+
+            .title-text {
+                font-size: 24px;
+                font-weight: bold;
+                position: absolute;
+                bottom: 20px;
+                left: 50%;
+                transform: translate(-50%);
+            }
+
+            .dv-dec-6 {
+                position: absolute;
+                bottom: 0;
+                left: 50%;
+                width: 250px;
+                height: 8px;
+                transform: translate(-50%);
+            }
+        }
+
+        // 第二行
+        .aside-width {
+            width: 40%;
+        }
+
+        // 平行四边形
+        .react-right {
+            &.react-l-s {
+                text-align: left;
+                width: 500px;
+            }
+
+            font-size: 18px;
+            width: 300px;
+            line-height: 50px;
+            text-align: center;
+            transform: skewX(-45deg);
+
+            .react-after {
+                position: absolute;
+                right: -25px;
+                top: 0;
+                height: 50px;
+                width: 50px;
+                background-color: #0f1325;
+                transform: skewX(45deg);
+            }
+
+            .text {
+                display: inline-block;
+                transform: skewX(45deg);
+            }
+        }
+
+        .react-left {
+            &.react-l-s {
+                width: 500px;
+                text-align: left;
+            }
+
+            font-size: 18px;
+            width: 300px;
+            height: 50px;
+            line-height: 50px;
+            text-align: center;
+            transform: skewX(45deg);
+            background-color: #0f1325;
+
+            .react-before {
+                position: absolute;
+                left: -25px;
+                top: 0;
+                height: 50px;
+                width: 50px;
+                background-color: #0f1325;
+                transform: skewX(-45deg);
+            }
+
+            .text {
+                display: inline-block;
+                transform: skewX(-45deg);
+            }
+        }
+
+        .body-box {
+            margin-top: 20px;
+            display: flex;
+            justify-content: space-between;
+
+            //下方区域的布局
+            .left-box {
+                width: 75%;
+                display: flex;
+                flex-direction: column;
+
+                &-top {
+                    width: 100%;
+                    height: 15%;
+                }
+
+                &-bottom {
+                    width: 100%;
+                    height: 80%;
+                    display: flex;
+
+                    .left-bottom-left {
+                        display: flex;
+                        flex-direction: column;
+                        width: 40%;
+                    }
+
+                    .left-bottom-right {
+                        width: 60%;
+                    }
+                }
+            }
+
+            .mid-box {
+                width: 50%;
+                height: calc(100vh - 75px);
+                display: flex;
+                flex-direction: column;
+
+                &-top {
+                    width: 100%;
+                    height: 22%;
+                }
+
+                &-bottom {
+                    width: 100%;
+                    height: 73%;
+                    display: flex;
+                }
+            }
+
+            // 底部数据
+            .right-box {
+                width: 25%;
+                height: calc(100vh - 75px);
+                display: flex;
+                flex-direction: column;
+
+                &-top {
+                    width: 100%;
+                    height: 30%;
+                }
+
+                &-center {
+                    width: 100%;
+                    height: 35%;
+                }
+
+                &-bottom {
+                    width: 100%;
+                    height: 30%;
+                    display: flex;
+
+                    .right-bottom-single {
+                        width: 50%;
+                        height: 100%;
+                    }
+                }
+            }
+        }
+    }
+}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 381 - 0
TEAMModelOS/ClientApp/src/view/dashboard/StudentAll.vue


+ 15 - 0
TEAMModelOS/Controllers/Client/AClassONEController.cs

@@ -89,5 +89,20 @@ namespace TEAMModelOS.Controllers
                 return BadRequest(Content);
             }
         }
+
+
+        /// <summary>
+        /// js_code获取小程序用户信息
+        /// </summary>
+        /// <param name="json"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("get-students-phone")]
+        //[Authorize(Roles = "AClassONE")]
+        public async Task<IActionResult> GetStudentsByPhone(JsonElement json)
+        {
+            string sql = "";
+            return Ok();
+        }
     }
 }

TEAMModelOS/Controllers/OpenApi/Business/OpenApiConfigController.cs → TEAMModelOS/Controllers/OpenApi/Init/OpenApiConfigController.cs


+ 10 - 10
TEAMModelOS/Controllers/OpenApi/OpenApiService.cs

@@ -97,11 +97,11 @@ namespace TEAMModelOS.Controllers
         public static async Task<ResponseData<dynamic>> GetLessonRecordCount(AzureCosmosFactory _azureCosmos, IConfiguration _configuration, AzureServiceBusFactory _serviceBus,
            Option _option, DingDing _dingDing, string id, string school, JsonElement json)
         {
-            json.TryGetProperty("roles", out JsonElement _roles);
-            List<string> roles = new List<string>();
-            if (_roles.ValueKind.Equals(JsonValueKind.Array))
+            json.TryGetProperty("identity", out JsonElement _identity);
+            string identity = "";
+            if (!string.IsNullOrWhiteSpace($"{_identity}"))
             {
-                roles = _roles.ToJsonString().ToObject<List<string>>();
+                identity = $"{_identity}";
             }
             json.TryGetProperty("managePage", out JsonElement _managePage);
             bool managePage = false;
@@ -147,7 +147,7 @@ namespace TEAMModelOS.Controllers
             int count = 0;
 
             string sqlShow = "";
-            if (roles.Count == 1 && roles.Contains("student"))
+            if (identity.Equals("student"))
             {
                 string autoSql = "";
                 if (autoTch.Any())
@@ -235,11 +235,11 @@ namespace TEAMModelOS.Controllers
            Option _option,  DingDing _dingDing, string id, string school, JsonElement json)
         {
 
-            json.TryGetProperty("roles", out JsonElement _roles);
-            List<string> roles = new List<string>();
-            if (_roles.ValueKind.Equals(JsonValueKind.Array))
+            json.TryGetProperty("identity", out JsonElement _identity);
+            string identity = "";
+            if (!string.IsNullOrWhiteSpace($"{_identity}"))
             {
-                roles = _roles.ToJsonString().ToObject<List<string>>();
+                identity =$"{_identity}";
             }
            
             json.TryGetProperty("managePage", out JsonElement _managePage);
@@ -313,7 +313,7 @@ namespace TEAMModelOS.Controllers
             try
             {
                 string sqlShow = "";
-                if (roles.Count == 1 && roles.Contains("student"))
+                if (identity.Equals("student"))
                 {
                     string autoSql = "";
                     if (autoTch.Any())

+ 3 - 2
TEAMModelOS/Controllers/Student/StudentController.cs

@@ -88,7 +88,7 @@ namespace TEAMModelOS.Controllers
                         while (importStuds.MoveNext())
                         {
                             JsonElement currStud = importStuds.Current;
-                            string id = null, name = null, pw = null, no = null, classId = null, periodId = null, imei = null ;
+                            string id = null, name = null, pw = null, no = null, classId = null, periodId = null, imei = null , gender= null;
                             List<StudentGuardian> guardians = null;
                             int year = 0;
                             //讀取輸入的資料
@@ -100,6 +100,7 @@ namespace TEAMModelOS.Controllers
                             if (currStud.TryGetProperty("no", out var tmpNo)) no = tmpNo.GetString();
                             if (currStud.TryGetProperty("classId", out var tmpClassId)) classId = tmpClassId.GetString();
                             if (currStud.TryGetProperty("imei", out var tmpImei)) imei = $"{tmpImei}";
+                            if (currStud.TryGetProperty("gender", out var tmpGender)) gender = $"{tmpGender}";
                             if (currStud.TryGetProperty("guardians", out var tmpGuardians)) {
                                 guardians = tmpGuardians.Deserialize<List<StudentGuardian>>();
                             }
@@ -108,7 +109,7 @@ namespace TEAMModelOS.Controllers
                             if (existNo.Count != 0) return this.Ok(new { code = $"Base-{schoolId.GetString()}", existNo = existNo.Select(o => o.id).ToList() });
                             if (currStud.TryGetProperty("periodId", out var tempPeriodId)) periodId = tempPeriodId.GetString();
                             //建立學生
-                            studCreateInfo studCreateInfo = new studCreateInfo(id, name, "M", year, pw, classId, no, periodId,imei,guardians);
+                            studCreateInfo studCreateInfo = new studCreateInfo(id, name,  gender, year, pw, classId, no, periodId,imei,guardians);
                             var isCreateSuc = await createStudent(_azureCosmos, _dingDing, _option, schoolId.GetString(), studCreateInfo);
 
                             if (isCreateSuc)