Browse Source

Merge branch 'develop3.0' of http://106.12.23.251:10080/TEAMMODEL/TEAMModelOS into develop3.0

zhouj1203@hotmail.com 5 years ago
parent
commit
1be56876e1
69 changed files with 3505 additions and 1776 deletions
  1. 5 4
      TEAMModelOS.SDK/Module/AzureBlob/Implements/AzureBlobDBRepository.cs
  2. 2 2
      TEAMModelOS.SDK/Module/AzureBlob/Interfaces/IAzureBlobDBRepository.cs
  3. 793 0
      TEAMModelOS.SDK/Module/AzureCosmosDB/Configuration/SQLHelper.cs
  4. 5 620
      TEAMModelOS.SDK/Module/AzureCosmosDB/Implements/AzureCosmosDBRepository.cs
  5. 1 1
      TEAMModelOS.Service/Models/Evaluation/Models/ExamPaper.cs
  6. 6 1
      TEAMModelOS.Service/Models/Evaluation/Models/ItemInfo.cs
  7. 2 1
      TEAMModelOS.Service/Models/Evaluation/Models/SimpleExam.cs
  8. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Border.cs
  9. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Chart.cs
  10. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Connector.cs
  11. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Diagram.cs
  12. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Fill.cs
  13. 1 1
      TEAMModelOS.Service/Models/PowerPoint/FontStyle.cs
  14. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Group.cs
  15. 9 8
      TEAMModelOS.Service/Models/PowerPoint/Pptx.cs
  16. 2 2
      TEAMModelOS.Service/Models/PowerPoint/Inner/WarpObj.cs
  17. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Item.cs
  18. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Math.cs
  19. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Media.cs
  20. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Paragraph.cs
  21. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Position.cs
  22. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Shape.cs
  23. 7 30
      TEAMModelOS.Service/Models/PowerPoint/Slide.cs
  24. 1 1
      TEAMModelOS.Service/Models/PowerPoint/Table.cs
  25. 1 1
      TEAMModelOS.Service/Models/Syllabus/Volume.cs
  26. 1 1
      TEAMModelOS.Service/Services/Analysis/Implements/AchievementService.cs
  27. 1 1
      TEAMModelOS.Service/Services/Analysis/Interfaces/IAchievementService.cs
  28. 4 1
      TEAMModelOS.Service/Services/Evaluation/Implements/HtmlAnalyzeService.cs
  29. 2 0
      TEAMModelOS.Service/Services/Evaluation/Interfaces/IHtmlAnalyzeService.cs
  30. 45 25
      TEAMModelOS.Service/Services/PowerPoint/Implement/PowerPointService.cs
  31. 1 2
      TEAMModelOS.Service/Services/PowerPoint/Implement/ShapeHelper.cs
  32. 1 2
      TEAMModelOS.Service/Services/PowerPoint/Implement/ShapeSvg.cs
  33. 16 0
      TEAMModelOS.Service/Services/PowerPoint/Interface/IHtexService.cs
  34. 0 14
      TEAMModelOS.Service/Services/PowerPoint/Interface/IPowerPointService.cs
  35. 11 16
      TEAMModelOS/ClientApp/src/common/UploadFile.vue
  36. 12 0
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseEntryBar.vue
  37. 6 5
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeRadar.vue
  38. 7 6
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLineBar.vue
  39. 11 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue
  40. 1 1
      TEAMModelOS/ClientApp/src/filters/http.js
  41. 198 189
      TEAMModelOS/ClientApp/src/locale/lang/en-US/totalAnalysis.js
  42. 199 189
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js
  43. 198 189
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js
  44. 172 184
      TEAMModelOS/ClientApp/src/router/routes.js
  45. 1 1
      TEAMModelOS/ClientApp/src/static/examList.json
  46. 1389 0
      TEAMModelOS/ClientApp/src/static/questions.json
  47. 3 3
      TEAMModelOS/ClientApp/src/store/module/totalAnalysis.js
  48. 0 12
      TEAMModelOS/ClientApp/src/utils/azure-storage-blob.js
  49. 1 1
      TEAMModelOS/ClientApp/src/view/coursemgmt/CourseSyllabus.vue
  50. 3 2
      TEAMModelOS/ClientApp/src/view/evaluation/index/ExercisesList.vue
  51. 65 57
      TEAMModelOS/ClientApp/src/view/student-account/Index.less
  52. 1 6
      TEAMModelOS/ClientApp/src/view/student-account/IndexIview.less
  53. 8 6
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue
  54. 2 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/EvaluationList.css
  55. 2 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue
  56. 3 3
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue
  57. 3 0
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.css
  58. 84 79
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue
  59. 11 5
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.css
  60. 26 23
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue
  61. 3 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue
  62. 35 17
      TEAMModelOS/ClientApp/src/view/teachcontent/index.vue
  63. 1 1
      TEAMModelOS/Controllers/Analysis/AchievementController.cs
  64. 1 1
      TEAMModelOS/Controllers/Analysis/ChangeController.cs
  65. 17 24
      TEAMModelOS/Controllers/Core/FileController.cs
  66. 39 2
      TEAMModelOS/Controllers/Evaluation/ImportExerciseController.cs
  67. 12 12
      TEAMModelOS/Controllers/Syllabus/VolumeController.cs
  68. 62 0
      TEAMModelOS/JsonFile/Core/BaseDataDefault.json
  69. 0 5
      TEAMModelOS/Startup.cs

+ 5 - 4
TEAMModelOS.SDK/Module/AzureBlob/Implements/AzureBlobDBRepository.cs

@@ -534,7 +534,7 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Implements
         /// <param name="container"></param>
         /// <param name="storedPolicyName"></param>
         /// <returns></returns>
-        public  string GetContainerSasUri(string containerName = null, string storedPolicyName = null)
+        public  (string, string) GetContainerSasUri(string containerName = null, string storedPolicyName = null)
         {
             string sasContainerToken;
            
@@ -567,9 +567,10 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Implements
             }
 
             // Return the URI string for the container, including the SAS token.
-            return sasContainerToken;
+            
+            return (blobContainer.Uri.ToString() , sasContainerToken);
         }
-        public string GetContainerSasUriRead(string containerName, string storedPolicyName = null)
+        public (string, string) GetContainerSasUriRead(string containerName, string storedPolicyName = null)
         {
             string sasContainerToken;
 
@@ -602,7 +603,7 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Implements
             }
 
             // Return the URI string for the container, including the SAS token.
-            return sasContainerToken;
+            return (blobContainer.Uri.ToString(), sasContainerToken);
         }
 
 

+ 2 - 2
TEAMModelOS.SDK/Module/AzureBlob/Interfaces/IAzureBlobDBRepository.cs

@@ -19,8 +19,8 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Interfaces
         AzureBlobModel UploadFileByFolderNAsyn(Stream fileSteam, string folder, string fileName, string fileSpace = "pptx", bool contentTypeDefault = true);
         string GetBlobSasUri(string blobName, string containerName=null,  string policyName = null);
         string GetBlobSasUriRead(string containerName, string blobName, string policyName = null);
-        string GetContainerSasUri(string containerName=null, string policyName = null);
-        string GetContainerSasUriRead(string containerName, string policyName = null);
+        (string, string) GetContainerSasUri(string containerName=null, string policyName = null);
+        (string, string) GetContainerSasUriRead(string containerName, string policyName = null);
         Task<bool> CreateSharedAccessPolicyAsync(string policyName , string  containerName = null);
         Task DeleteSharedAccessPolicyAsync(string policyName, string  containerName = null);
         Task Deleteblob(string sasUri);

+ 793 - 0
TEAMModelOS.SDK/Module/AzureCosmosDB/Configuration/SQLHelper.cs

@@ -0,0 +1,793 @@
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using TEAMModelOS.SDK.Context.Exception;
+
+namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Configuration
+{
+    public class SQLHelper
+    {
+
+        static readonly string[] LogicOpers = new string[] { " and ", " or " };
+        static readonly string[] CompareOpers = new string[] { " > ", " < ", " <= ", " >= ", " = ", " != ", " like ", " not like ", " in " };
+
+
+        public static void ReplaceKeyWords(ref StringBuilder sql) {
+            sql.Replace(".order.", "['order'].");
+            sql.Replace(".order ", "['order'] ");
+
+            sql.Replace(".group.", "['group'].");
+            sql.Replace(".group ", "['group'] ");
+
+            sql.Replace(".end.", "['end'].");
+            sql.Replace(".end ", "['end'] ");
+
+            sql.Replace(".having.", "['having'].");
+            sql.Replace(".having ", "['having'] ");
+        }
+
+
+        public static void GetSQL(Dictionary<string, object> dict, ref StringBuilder sql)
+        {
+
+            if (dict != null)
+            {
+                int offsetNum = 0;
+                int limitNum = 0;
+                bool pageBool = false;
+                GetPageNum(dict, ref offsetNum, ref limitNum, ref pageBool);
+
+                //处理顺序
+                Stack<KeyValuePair<string, object>> stack = new Stack<KeyValuePair<string, object>>();
+
+                foreach (string item in dict.Keys)
+                {
+                    if (item.EndsWith(".|"))
+                    {
+                        stack.Push(new KeyValuePair<string, object>(item, dict[item]));
+                    }
+
+                }
+                foreach (string item in dict.Keys)
+                {
+                    if (!item.EndsWith(".|"))
+                    {
+                        stack.Push(new KeyValuePair<string, object>(item, dict[item]));
+                    }
+
+                }
+
+
+                string Join = " join ";
+                string instring = " in ";
+                Dictionary<string, string> keyValues = new Dictionary<string, string>();
+                StringBuilder WhereString = new StringBuilder();
+                int heada = 0;
+                string[] sqlHead = new string[] { "A", "B", "C", "D", "E", "F" };
+                int kslength = 0;
+                int logicOperNum = 0;
+
+                bool keyListValueList = true;
+                string distinctHead = "select distinct value(c) from c ";
+
+
+                int stackCount = stack.Count;
+                //foreach (KeyValuePair<string, object> item in newDict)
+                for (int k = 0; k < stackCount; k++)
+                {
+                    KeyValuePair<string, object> item = stack.Pop();
+                    bool isLikeSQL = false;
+                    if (item.Key.StartsWith("$.") || item.Key.StartsWith("!$."))
+                    {
+                        isLikeSQL = true;
+                    }
+
+
+                    string key = item.Key;
+                    string[] keyHead = key.Split(".");
+                    int index = 0;
+                    int compareOper = 4;
+                    int logicOper = 0;
+
+                    if (key.EndsWith(".&"))
+                    {
+                        logicOper = (int)LogicOper.and;
+                        key = key.Replace(".&", "");
+                    }
+                    else if (key.EndsWith(".|"))
+                    {
+                        logicOper = (int)LogicOper.or;
+                        key = key.Replace(".|", "");
+                    }
+                    CompareOperSwitch(keyHead[0], ref key, ref compareOper);
+                    string[] keyBody = key.Split("[*]");
+                    if (keyBody.Length > 1)
+                    {
+                        kslength += keyBody.Length;
+                        if (kslength < (7 + heada))
+                        {
+                            StringBuilder sqlitem = new StringBuilder();
+                            for (int i = 0; i < keyBody.Length - 1; i++)
+                            {
+                                //Console.WriteLine(ks[i]);
+                                if (i == 0)
+                                {
+                                    sqlitem.Append(Join);
+                                    string a = sqlHead[heada] + index;
+                                    sqlitem.Append(a + " ");
+                                    //keyValues.Add(ks[i], a);
+                                    keyValues[keyBody[i]] = a;
+                                    sqlitem.Append(instring);
+                                    sqlitem.Append("c.");
+                                    sqlitem.Append(keyBody[i]);
+                                }
+                                else
+                                {
+                                    sqlitem.Append(Join);
+                                    string a = sqlHead[heada] + index;
+                                    sqlitem.Append(a + " ");
+                                    //keyValues.Add(ks[i], a);
+                                    keyValues[keyBody[i]] = a;
+                                    sqlitem.Append(instring);
+                                    sqlitem.Append(keyValues[keyBody[i - 1]]);
+                                    sqlitem.Append(keyBody[i]);
+                                }
+                                index += 1;
+                            }
+                            sql.Append(sqlitem);
+                            string s = "";
+                            if (isLikeSQL)
+                            {
+                                if (item.Value is JArray array)
+                                {
+                                    s = ValueIsLike(sqlHead[heada] + (keyBody.Length - 2) + keyBody[index] + "", array, LogicOpers[logicOper], logicOperNum, compareOper, ref keyListValueList);
+                                }
+                                else if (item.Value is IEnumerable enumerable && !(item.Value is String))
+                                {
+                                    s = ValueIsLike(sqlHead[heada] + (keyBody.Length - 2) + keyBody[index] + "", enumerable, LogicOpers[logicOper], logicOperNum, compareOper, ref keyListValueList);
+                                }
+                                else if (item.Value is JsonElement jsonElement1)
+                                {
+                                    if (jsonElement1.ValueKind is JsonValueKind.Object)
+                                    {
+
+                                        string compareOperBool = " true ";
+                                        compareOperBool = CompareBoolSwitch(compareOper);
+                                        string logicOperString = " and ";
+                                        if (logicOperNum != 0) logicOperString = LogicOpers[logicOper];
+                                        s = logicOperString + "Contains(" + sqlHead[heada] + (keyBody.Length - 2) + keyBody[index] + " , \'" + item.Value.ToString() + "\') = " + compareOperBool + " ";
+                                    }
+                                    else
+                                    {
+                                        s = ValueIsLike(sqlHead[heada] + (keyBody.Length - 2) + keyBody[index] + "", jsonElement1, LogicOpers[logicOper], logicOperNum, compareOper, ref keyListValueList);
+                                    }
+
+                                }
+                                else
+                                {
+                                    s = ValueIsLike(sqlHead[heada] + (keyBody.Length - 2) + keyBody[index] + "", item.Value, LogicOpers[logicOper], logicOperNum, compareOper, ref keyListValueList);
+                                }
+                            }
+                            else
+                            {
+                                s = ValueNotLike(sqlHead[heada] + (keyBody.Length - 2) + keyBody[index], item.Value, LogicOpers[logicOper], logicOperNum, compareOper, ref keyListValueList);
+                            }
+                            WhereString.Append(s);
+
+                            if (keyListValueList)
+                            {
+                                sql = sql.Replace("select ", "select distinct ");
+                               // sql.Append(sqlitem);
+                            }
+                        }
+                        else
+                        {
+                            throw new BizException("数组总共深度不能超过5层", ResponseCode.PARAMS_ERROR);
+                        }
+                        heada += 1;
+
+                    }
+                    else
+                    {
+
+                        WhereString.Append(KeyNotElement(dict[item.Key], item.Key, LogicOpers[logicOper], logicOperNum, compareOper));
+
+                    }
+                    //heada += 1;
+                    logicOperNum += 1;
+                }
+                sql.Append(" where 1=1 ").Append(WhereString);
+                if (pageBool)
+                {
+                    sql.Append(" OFFSET " + offsetNum + " LIMIT " + limitNum);
+                }
+
+                ReplaceKeyWords(ref sql);
+            }
+        }
+
+        private static void GetPageNum(Dictionary<string, object> dict, ref int offsetNum, ref int limitNum, ref bool pageBool)
+        {
+            dict.TryGetValue("OFFSET", out object offset);
+            dict.Remove("OFFSET");
+            dict.TryGetValue("LIMIT", out object limit);
+            dict.Remove("LIMIT");
+            if (offset != null && limit != null)
+            {
+                pageBool = true;
+                offsetNum = int.Parse(offset.ToString());
+                limitNum = int.Parse(limit.ToString());
+            }
+        }
+
+        private static void CompareOperSwitch(string keyHead, ref string key, ref int compareOper)
+        {
+            switch (keyHead)
+            {
+
+                case ">":
+                    compareOper = (int)CompareOper.moreThan;
+                    key = key.Replace(">.", "");
+                    break;
+                case "<":
+                    compareOper = (int)CompareOper.lessThan;
+                    key = key.Replace("<.", "");
+                    break;
+                case "<=":
+                    compareOper = (int)CompareOper.notMoreThan;
+                    key = key.Replace("<=.", "");
+                    break;
+                case ">=":
+                    compareOper = (int)CompareOper.notLessThan;
+                    key = key.Replace(">=.", "");
+                    break;
+                case "=":
+                    compareOper = (int)CompareOper.equal;
+                    key = key.Replace("=.", "");
+                    break;
+                case "!=":
+                    compareOper = (int)CompareOper.notEqual;
+                    key = key.Replace("!=.", "");
+                    break;
+                case "$":
+                    compareOper = (int)CompareOper.like;
+                    key = key.Replace("$.", "");
+                    break;
+                case "!$":
+                    compareOper = (int)CompareOper.notLike;
+                    key = key.Replace("!$.", "");
+                    break;
+                default:
+                    compareOper = 4;
+                    break;
+            }
+        }
+
+        private static string ValueNotLike(string key, object value, string logicOperParams, int logicOperNum, int compareOperNum, ref bool keyListValueList)
+        {
+
+            string logicOper = " and ";
+            string compareOper = " = ";
+            if (compareOperNum != 4) compareOper = CompareOpers[compareOperNum];
+            if (logicOperNum != 0) logicOper = logicOperParams;
+            StringBuilder sql = new StringBuilder(logicOper + key + " in (");
+            if (value is JArray array)
+            {
+                foreach (JValue obja in array)
+                {
+                    if (obja.Value is string a)
+                    {
+                        sql.Append("\'" + a + "\',");
+                    }
+                    if (obja.Value is int b)
+                    {
+                        sql.Append(b + ",");
+                    }
+                    if (obja.Value is double c)
+                    {
+                        sql.Append(c + ",");
+                    }
+                    if (obja.Value is bool d)
+                    {
+                        sql.Append(d + ",");
+                    }
+                    if (obja.Value is long e)
+                    {
+                        sql.Append(e + ",");
+                    }
+                    if (obja.Value is DateTime f)
+                    {
+                        sql.Append(f + ",");
+                    }
+                }
+                string sqls = sql.ToString().Substring(0, sql.Length - 1);
+                sqls += " ) ";
+                return sqls;
+            }
+            else if (value is IEnumerable enumerable && !(value is String))
+            {
+                foreach (object obja in enumerable)
+                {
+                    if (obja is string a)
+                    {
+                        sql.Append("\'" + a + "\',");
+                    }
+                    if (obja is int b)
+                    {
+                        sql.Append(" " + b + " ,");
+
+                    }
+                    if (obja is double c)
+                    {
+                        sql.Append(" " + c + " ,");
+                    }
+                    if (obja is bool d)
+                    {
+                        sql.Append(" " + d + " ,");
+
+                    }
+                    if (obja is long e)
+                    {
+                        sql.Append(" " + e + " ,");
+                    }
+                    if (obja is DateTime f)
+                    {
+                        sql.Append(" " + f + " ,");
+                    }
+                }
+                string sqls = sql.ToString().Substring(0, sql.Length - 1);
+                sqls += ") ";
+                return sqls;
+            }
+            else if (value is JsonElement jsonElement)
+            {
+                foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
+                {
+                    if (obja.ValueKind is JsonValueKind.String)
+                    {
+                        sql.Append("\'" + obja.ToString() + "\',");
+                    }
+                    if (obja.ValueKind is JsonValueKind.Number)
+                    {
+                        sql.Append(" " + int.Parse(obja.ToString()) + " ,");
+                    }
+                    if (obja.ValueKind is JsonValueKind.True)
+                    {
+                        sql.Append(" " + bool.Parse(obja.ToString()) + " ,");
+                    }
+                    if (obja.ValueKind is JsonValueKind.False)
+                    {
+                        sql.Append(" " + bool.Parse(obja.ToString()) + " ,");
+                    }
+                }
+                string sqls = sql.ToString().Substring(0, sql.Length - 1);
+                sqls += ") ";
+                return sqls;
+            }
+            else
+            {
+                Type s = value.GetType();
+                TypeCode typeCode = Type.GetTypeCode(s);
+                if (compareOperNum == 4) keyListValueList = false;
+                return typeCode switch
+                {
+                    TypeCode.String => logicOper + key + compareOper + "\'" + value.ToString() + "\'",
+                    TypeCode.Char => logicOper + key + compareOper + "\'" + value.ToString() + "\'",
+                    TypeCode.Int32 => logicOper + key + compareOper + int.Parse(value.ToString()),
+                    TypeCode.Double => logicOper + key + compareOper + double.Parse(value.ToString()),
+                    //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
+                    TypeCode.Boolean => logicOper + key + compareOper + bool.Parse(value.ToString()),
+                    TypeCode.DateTime => logicOper + key + compareOper + (DateTime)value,
+                    TypeCode.Int64 => logicOper + key + compareOper + long.Parse(value.ToString()),
+                    _ => null,
+                };
+            }
+        }
+
+        private static string ValueIsLike(string key, object value, string logicOperParams, int logicOperNum, int compareOperNum, ref bool keyListValueList)
+        {
+            string compareOperBool = " true ";
+            compareOperBool = CompareBoolSwitch(compareOperNum);
+            string logicOper = " and ";
+            if (logicOperNum != 0) logicOper = logicOperParams;
+            StringBuilder s = new StringBuilder(logicOper + " ( Contains( ");
+
+            if (value is JArray array)
+            {
+                int aa = 0;
+                foreach (JValue obja in array)
+                {
+                    if (aa != 0) s.Append("or Contains(");
+                    if (obja.Value is string a)
+                    {
+                        s.Append(key + "," + "\'" + a + "\') = " + compareOperBool + " ");
+                    }
+                    else if (obja.Value is int b)
+                    {
+                        s.Append(key + "," + " " + b + " ) = " + compareOperBool + " ");
+
+                    }
+                    else if (obja.Value is double c)
+                    {
+                        s.Append(key + "," + " " + c + " ) = " + compareOperBool + " ");
+                    }
+                    else if (obja.Value is bool d)
+                    {
+                        s.Append(key + "," + " " + d + " ) = " + compareOperBool + " ");
+
+                    }
+                    else if (obja.Value is long e)
+                    {
+                        s.Append(key + "," + " " + e + " ) = " + compareOperBool + " ");
+                    }
+                    else if (obja.Value is DateTime f)
+                    {
+                        s.Append(key + "," + " " + f + " ) = " + compareOperBool + " ");
+                    }
+                    aa++;
+                }
+            }
+            else if (value is IEnumerable enumerable && !(value is String))
+            {
+                int aa = 0;
+                foreach (object obja in enumerable)
+                {
+                    if (aa != 0) s.Append("or Contains(");
+                    if (obja is string a)
+                    {
+                        s.Append(key + "," + "\'" + a + "\') = " + compareOperBool + " ");
+                    }
+                    if (obja is int b)
+                    {
+                        s.Append(key + "," + " " + b + " ) = " + compareOperBool + " ");
+
+                    }
+                    if (obja is double c)
+                    {
+                        s.Append(key + "," + " " + c + " ) = " + compareOperBool + " ");
+                    }
+                    if (obja is bool d)
+                    {
+                        s.Append(key + "," + " " + d + " ) = " + compareOperBool + " ");
+
+                    }
+                    if (obja is long e)
+                    {
+                        s.Append(key + "," + " " + e + " ) = " + compareOperBool + " ");
+                    }
+                    if (obja is DateTime f)
+                    {
+                        s.Append(key + "," + " " + f + " ) = " + compareOperBool + " ");
+                    }
+                    aa++;
+                }
+
+            }
+            else if (value is JsonValueKind.Array && value is JsonElement jsonElement)
+            {
+                int aa = 0;
+                //jsonElement.EnumerateArray().ToArray();
+                foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
+                {
+                    if (aa != 0) s.Append("or Contains(");
+                    if (obja.ValueKind is JsonValueKind.String)
+                    {
+                        s.Append(key + "," + "\'" + obja.ToString() + "\') = " + compareOperBool + " ");
+                    }
+                    if (obja.ValueKind is JsonValueKind.Number)
+                    {
+                        s.Append(key + "," + " " + int.Parse(obja.ToString()) + " ) = " + compareOperBool + " ");
+                    }
+                    if (obja.ValueKind is JsonValueKind.True)
+                    {
+                        s.Append(key + "," + " " + bool.Parse(obja.ToString()) + " ) = " + compareOperBool + " ");
+                    }
+                    if (obja.ValueKind is JsonValueKind.False)
+                    {
+                        s.Append(key + "," + " " + bool.Parse(obja.ToString()) + " ) = " + compareOperBool + " ");
+                    }
+                    aa++;
+                }
+            }
+            else
+            {
+                Type stype = value.GetType();
+                TypeCode typeCode = Type.GetTypeCode(stype);
+                keyListValueList = false;
+                return typeCode switch
+                {
+                    TypeCode.String => logicOper + "Contains( " + key + " , \'" + value.ToString() + "\') = " + compareOperBool + " ",
+                    TypeCode.Char => logicOper + "Contains( " + key + " , \'" + value.ToString() + "\') = " + compareOperBool + " ",
+                    TypeCode.Object => logicOper + "Contains( " + key + " , \'" + value.ToString() + "\') = " + compareOperBool + " ",
+                    TypeCode.Int32 => logicOper + "Contains( " + key + " , " + int.Parse(value.ToString()) + ") = " + compareOperBool + " ",
+                    TypeCode.Double => logicOper + "Contains( " + key + " , " + double.Parse(value.ToString()) + ") = " + compareOperBool + " ",
+                    //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
+                    TypeCode.Boolean => logicOper + "Contains( " + key + " , " + bool.Parse(value.ToString()) + ") = " + compareOperBool + " ",
+                    TypeCode.DateTime => logicOper + "Contains( " + key + " , " + (DateTime)value + ") = " + compareOperBool + " ",
+                    TypeCode.Int64 => logicOper + "Contains( " + key + " , " + long.Parse(value.ToString()) + ") = " + compareOperBool + " ",
+                    _ => null,
+                };
+            }
+            s.Append(" )");
+            return s.ToString();
+        }
+
+        private static string CompareBoolSwitch(int compareOperNum)
+        {
+            return compareOperNum switch
+            {
+                6 => " true ",
+                7 => " false ",
+                _ => " true ",
+            };
+
+        }
+
+        private static string KeyNotElement(object value, string key, string logicOperParams, int logicOperNum, int compareOperNum)
+        {
+            string compareOperBool = " true ";
+            compareOperBool = CompareBoolSwitch(compareOperNum);
+            string logicOper = " and ";
+            int compareOper = 4;
+            if (logicOperNum != 0) logicOper = logicOperParams;
+            if (key.EndsWith(".&"))
+            {
+                key = key.Replace(".&", "");
+            }
+            else if (key.EndsWith(".|"))
+            {
+                key = key.Replace(".|", "");
+            }
+            string[] keyHead = key.Split(".");
+            CompareOperSwitch(keyHead[0], ref key, ref compareOper);
+
+            if (compareOper == 6 || compareOper == 7)
+            {
+                StringBuilder sql = new StringBuilder(logicOper + " ( Contains( ");
+                if (value is JArray jarray)
+                {
+                    int aa = 0;
+                    foreach (JValue obja in jarray)
+                    {
+                        if (aa != 0) sql.Append("or Contains(");
+                        if (obja.Value is string a)
+                        {
+                            sql.Append(" c." + key + ",\'" + a + "\')= " + compareOperBool + "  ");
+                        }
+                        if (obja.Value is int b)
+                        {
+                            sql.Append(" c." + key + ", " + b + " )= " + compareOperBool + "  ");
+                        }
+                        if (obja.Value is double c)
+                        {
+                            sql.Append(" c." + key + ", " + c + " ) = " + compareOperBool + "  ");
+                        }
+                        if (obja.Value is bool d)
+                        {
+                            sql.Append(" c." + key + ", " + d + " ) = " + compareOperBool + "  ");
+
+                        }
+                        if (obja.Value is long e)
+                        {
+                            sql.Append(" c." + key + ", " + e + " ) = " + compareOperBool + "  ");
+                        }
+                        if (obja.Value is DateTime f)
+                        {
+                            sql.Append(" c." + key + ", " + f + " ) = " + compareOperBool + "  ");
+                        }
+                        aa++;
+                    }
+                }
+                else if (value is IEnumerable enumerable && !(value is String))
+                {
+                    int aa = 0;
+                    foreach (object obja in enumerable)
+                    {
+                        if (aa != 0) sql.Append("or Contains(");
+                        if (obja is string a)
+                        {
+                            sql.Append(" c." + key + "," + "\'" + a + "\') = " + compareOperBool + "  ");
+                        }
+                        if (obja is int b)
+                        {
+                            sql.Append(" c." + key + "," + " " + b + " ) = " + compareOperBool + "  ");
+                        }
+                        if (obja is double c)
+                        {
+                            sql.Append(" c." + key + "," + " " + c + " ) = " + compareOperBool + "  ");
+                        }
+                        if (obja is bool d)
+                        {
+                            sql.Append(" c." + key + "," + " " + d + " ) = " + compareOperBool + "  ");
+                        }
+                        if (obja is long e)
+                        {
+                            sql.Append(" c." + key + "," + " " + e + " ) = " + compareOperBool + "  ");
+                        }
+                        if (obja is DateTime f)
+                        {
+                            sql.Append(" c." + key + "," + " " + f + " ) = " + compareOperBool + "  ");
+                        }
+                        aa++;
+                    }
+                }
+                else if (value is JsonElement jsonElement)
+                {
+                    int aa = 0;
+                    foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
+                    {
+                        if (aa != 0) sql.Append("or Contains(");
+                        if (obja.ValueKind is JsonValueKind.String)
+                        {
+                            sql.Append(" c." + key + "," + "\'" + obja.ToString() + "\') = " + compareOperBool + "  ");
+                        }
+                        if (obja.ValueKind is JsonValueKind.Number)
+                        {
+                            sql.Append(" c." + key + "," + " " + int.Parse(obja.ToString()) + " ) = " + compareOperBool + "  ");
+                        }
+                        if (obja.ValueKind is JsonValueKind.True)
+                        {
+                            sql.Append(" c." + key + "," + " " + bool.Parse(obja.ToString()) + " ) = " + compareOperBool + "  ");
+                        }
+                        if (obja.ValueKind is JsonValueKind.False)
+                        {
+                            sql.Append(" c." + key + "," + " " + bool.Parse(obja.ToString()) + " ) = " + compareOperBool + "  ");
+                        }
+                        aa++;
+                    }
+                }
+                else
+                {
+                    Type s = value.GetType();
+                    TypeCode typeCode = Type.GetTypeCode(s);
+
+                    return typeCode switch
+                    {
+                        TypeCode.String => logicOper + "Contains( c." + key + " , \'" + value.ToString() + "\') = " + compareOperBool + "  ",
+                        TypeCode.Char => logicOper + "Contains( c." + key + " , \'" + value.ToString() + "\') = " + compareOperBool + "  ",
+                        TypeCode.Int32 => logicOper + "Contains( c." + key + " , " + int.Parse(value.ToString()) + ") = " + compareOperBool + "  ",
+                        TypeCode.Double => logicOper + "Contains( c." + key + " , " + double.Parse(value.ToString()) + ") = " + compareOperBool + "  ",
+                        //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
+                        TypeCode.Boolean => logicOper + "Contains( c." + key + " , " + bool.Parse(value.ToString()) + ") = " + compareOperBool + "  ",
+                        TypeCode.DateTime => logicOper + "Contains( c." + key + " , " + (DateTime)value + ") = " + compareOperBool + "  ",
+                        TypeCode.Int64 => logicOper + "Contains( c." + key + " , " + long.Parse(value.ToString()) + ") = " + compareOperBool + "  ",
+                        _ => null,
+                    };
+                }
+
+                sql.Append(")");
+                return sql.ToString();
+            }
+            else
+            {
+                StringBuilder sql = new StringBuilder(logicOper + " c." + key + " in (");
+                if (value is JArray array)
+                {
+
+                    foreach (JValue obja in array)
+                    {
+                        if (obja.Value is string a)
+                        {
+                            sql.Append("\'" + a + "\',");
+                        }
+                        if (obja.Value is int b)
+                        {
+                            sql.Append(b + ",");
+                        }
+                        if (obja.Value is double c)
+                        {
+                            sql.Append(c + ",");
+                        }
+                        if (obja.Value is bool d)
+                        {
+                            sql.Append(d + ",");
+                        }
+                        if (obja.Value is long e)
+                        {
+                            sql.Append(e + ",");
+                        }
+                        if (obja.Value is DateTime f)
+                        {
+                            sql.Append(f + ",");
+                        }
+                    }
+                    string sqls = sql.ToString().Substring(0, sql.Length - 1);
+                    sqls += " ) ";
+                    return sqls;
+                }
+                else if (value is IEnumerable enumerable && !(value is String))
+                {
+                    foreach (object obja in enumerable)
+                    {
+                        if (obja is string a)
+                        {
+                            sql.Append("\'" + a + "\',");
+                        }
+                        if (obja is int b)
+                        {
+                            sql.Append(" " + b + " ,");
+                        }
+                        if (obja is double c)
+                        {
+                            sql.Append(" " + c + " ,");
+                        }
+                        if (obja is bool d)
+                        {
+                            sql.Append(" " + d + " ,");
+
+                        }
+                        if (obja is long e)
+                        {
+                            sql.Append(" " + e + " ,");
+                        }
+                        if (obja is DateTime f)
+                        {
+                            sql.Append(" " + f + " ,");
+                        }
+                    }
+                    string sqls = sql.ToString().Substring(0, sql.Length - 1);
+                    sqls += ") ";
+                    return sqls;
+                }
+                else if (value is JsonElement jsonElement)
+                {
+                    foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
+                    {
+                        if (obja.ValueKind is JsonValueKind.String)
+                        {
+                            sql.Append("\'" + obja.ToString() + "\',");
+                        }
+                        if (obja.ValueKind is JsonValueKind.Number)
+                        {
+                            sql.Append(" " + int.Parse(obja.ToString()) + " ,");
+                        }
+                        if (obja.ValueKind is JsonValueKind.True)
+                        {
+                            sql.Append(" " + bool.Parse(obja.ToString()) + " ,");
+                        }
+                        if (obja.ValueKind is JsonValueKind.False)
+                        {
+                            sql.Append(" " + bool.Parse(obja.ToString()) + " ,");
+                        }
+                    }
+                    string sqls = sql.ToString().Substring(0, sql.Length - 1);
+                    sqls += ") ";
+                    return sqls;
+                }
+                else
+                {
+                    Type s = value.GetType();
+                    TypeCode typeCode = Type.GetTypeCode(s);
+
+                    return typeCode switch
+                    {
+                        TypeCode.String => logicOper + " c." + key + CompareOpers[compareOperNum] + "\'" + value.ToString() + "\'",
+                        TypeCode.Char => logicOper + " c." + key + CompareOpers[compareOperNum] + "\'" + value.ToString() + "\'",
+                        TypeCode.Int32 => logicOper + "  c." + key + CompareOpers[compareOperNum] + int.Parse(value.ToString()),
+                        TypeCode.Double => logicOper + "  c." + key + CompareOpers[compareOperNum] + double.Parse(value.ToString()),
+                        //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
+                        TypeCode.Boolean => logicOper + "  c." + key + CompareOpers[compareOperNum] + bool.Parse(value.ToString()),
+                        TypeCode.DateTime => logicOper + "  c." + key + CompareOpers[compareOperNum] + (DateTime)value,
+                        TypeCode.Int64 => logicOper + "  c." + key + CompareOpers[compareOperNum] + long.Parse(value.ToString()),
+                        _ => null,
+                    };
+                }
+            }
+        }
+
+
+        public enum LogicOper : int
+        {
+            and = 0, or = 1
+        }
+        public enum CompareOper : int
+        {
+            moreThan = 0, lessThan = 1, notMoreThan = 2, notLessThan = 3, equal = 4, notEqual = 5, like = 6, notLike = 7, IN = 8
+        }
+
+    }
+}

+ 5 - 620
TEAMModelOS.SDK/Module/AzureCosmosDB/Implements/AzureCosmosDBRepository.cs

@@ -694,7 +694,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
             // List<T> objs = new List<T>();
             DocumentCollection collection=   await InitializeCollection<T>();
             StringBuilder sql = new StringBuilder("select value(c) from c");
-            GetSQL(dict, sql);
+            SQLHelper.GetSQL(dict,ref sql);
             //查询条数 -1是全部
             FeedOptions queryOptions = new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = IsPk };
             var query = CosmosClient.CreateDocumentQuery<T>(UriFactory.CreateDocumentCollectionUri(Database, collection.Id), sql.ToString(), queryOptions);
@@ -796,7 +796,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
                         }
                     }*/
                 StringBuilder sql = new StringBuilder("select value(c) from c");
-                GetSQL(dict, sql);
+                SQLHelper.GetSQL(dict,ref sql);
                 FeedOptions queryOptions;
                 if (collection.PartitionKey.Paths.Count > 0)
                 {
@@ -816,66 +816,15 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
             
         }
 
-        private static void GetSQL(Dictionary<string, object> dict, StringBuilder sql)
-        {
-            if (dict != null)
-            {
-                int offsetNum = 0;
-                int limitNum = 0;
-                bool pageBool = false;
-                GetPageNum(dict, ref offsetNum, ref limitNum, ref pageBool);
-
-                string Join = " join ";
-                string instring = "in ";
-                Dictionary<string, string> keyValues = new Dictionary<string, string>();
-                StringBuilder whereSting = new StringBuilder();
-                int heada = 0;
-                string[] sqlHead = new string[] { "A", "B", "C", "D", "E", "F" };
-                int kslength = 0;
-                foreach (KeyValuePair<string, object> item in dict)
-                {
-                    bool isLikeSQL = false;
-                    if (item.Key.StartsWith("$."))
-                    {
-                        isLikeSQL = true;
-                    }
-                    int index = 0;
-                    string[] ks = item.Key.Split("[*]");
-
-                    if (ks.Length > 1)
-                    {
-                        KeyIsElement(sql, Join, instring, keyValues, whereSting, heada, sqlHead, ref kslength, item, isLikeSQL, ref index, ks);
-                    }
-                    else
-                    {
-                        whereSting.Append(KeyNotElement(dict[item.Key], item.Key));
-                    }
-                    heada += 1;
-                }
-                sql.Append(" where 1=1 ").Append(whereSting);
-                if (pageBool)
-                {
-                    sql.Append(" OFFSET " + offsetNum + " LIMIT " + limitNum);
-                }
-
-            }
-        }
+     
 
         public IQueryable<dynamic> FindCountByDict(string CollectionName, Dictionary<string, object> dict)
         {
             if (DocumentCollectionDict.TryGetValue(CollectionName, out DocumentCollection collection))
             {
-                //  collection = await InitializeCollection(CollectionName, "");
-                /*    StringBuilder sql = new StringBuilder("select * from " + CollectionName + " c where 1=1 ");
-                    if (dict != null)
-                    {
-                        foreach (string key in dict.Keys)
-                        {
-                            sql.Append(GenSql(dict[key], key));
-                        }
-                    }*/
+                
                 StringBuilder sql = new StringBuilder("select value count(c) from c");
-                GetSQL(dict, sql);
+                SQLHelper.GetSQL(dict, ref sql);
                 FeedOptions queryOptions;
                 if (collection.PartitionKey.Paths.Count > 0)
                 {
@@ -908,569 +857,5 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
                 limitNum = int.Parse(limit.ToString());
             }
         }
-
-        private static void KeyIsElement(StringBuilder sql, string Join, string instring, Dictionary<string, string> keyValues, StringBuilder whereSting, int heada, string[] sqlHead, ref int kslength, KeyValuePair<string, object> item, bool isLikeSQL, ref int index, string[] ks)
-        {
-            kslength += ks.Length;
-            if (kslength < (7 + heada))
-            {
-                StringBuilder sqlitem = new StringBuilder();
-                for (int i = 0; i < ks.Length - 1; i++)
-                {
-
-                    //Console.WriteLine(ks[i]);
-                    if (i == 0)
-                    {
-                        sqlitem.Append(Join);
-                        string a = sqlHead[heada] + index;
-                        sqlitem.Append(a + " ");
-                        //keyValues.Add(ks[i], a);
-                        keyValues[ks[i]] = a;
-                        sqlitem.Append(instring);
-                        sqlitem.Append("c.");
-                        if (isLikeSQL)
-                        {
-                            sqlitem.Append(ks[i].Replace("$.", ""));
-                        }
-                        else
-                        {
-                            sqlitem.Append(ks[i]);
-                        }
-                    }
-                    else
-                    {
-                        sqlitem.Append(Join + " ");
-                        string a = sqlHead[heada] + index;
-                        sqlitem.Append(a + " ");
-                        //keyValues.Add(ks[i], a);
-                        keyValues[ks[i]] = a;
-                        sqlitem.Append(instring);
-                        sqlitem.Append(keyValues[ks[i - 1]]);
-                        sqlitem.Append(ks[i]);
-                    }
-                    index += 1;
-                }
-                // Console.WriteLine(sqlitem);
-                sql.Append(sqlitem);
-                string s = "";
-                if (isLikeSQL)
-                {
-                    if (item.Value is JArray array)
-                    {
-                        s = ValueIsLike(sqlHead[heada] + (ks.Length - 2) + ks[index] + "", array);
-                        //s = GenSql(array, sqlHead[heada] + (ks.Length - 2) + ks[index] + "");
-                    }
-                    else if (item.Value is IEnumerable enumerable && !(item.Value is String))
-                    {
-                        s = ValueIsLike(sqlHead[heada] + (ks.Length - 2) + ks[index] + "", enumerable);
-                        //s = GenSql(enumerable, sqlHead[heada] + (ks.Length - 2) + ks[index] + "");
-                    }
-                    else if (item.Value is JsonElement jsonElement1)
-                    {
-                        if (jsonElement1.ValueKind is JsonValueKind.Object)
-                        {
-                            s = "and " + "Contains(" + sqlHead[heada] + (ks.Length - 2) + ks[index] + " , \'" + item.Value.ToString() + "\') = true ";
-                        }
-                        else if (jsonElement1.ValueKind is JsonValueKind.Array)
-                        {
-                            s = ValueIsLike(sqlHead[heada] + (ks.Length - 2) + ks[index] + "", jsonElement1);
-                            // s = GenSql(jsonElement1, sqlHead[heada] + (ks.Length - 2) + ks[index] + "");
-                        }
-                    }
-                    else
-                    {
-                        //s = "and " + "Contains(" + sqlHead[heada] + (ks.Length - 2) + ks[index] + " , \'" + item.Value.ToString() + "\') = true ";
-                        s = ValueIsLike(sqlHead[heada] + (ks.Length - 2) + ks[index] + "", item.Value);
-                    }
-                }
-                else
-                {
-                    //s = "and " + sqlHead[heada] + (ks.Length - 2) + ks[index] + " = " + "\"" + item.Value.ToString() + "\"";
-                    s = ValueNotLike(sqlHead[heada] + (ks.Length - 2) + ks[index], item.Value);
-                }
-                whereSting.Append(s);
-            }
-            else
-            {
-                // throw new BizException("数组总共深度不能超过5层", ResponseCode.PARAMS_ERROR);
-            }
-        }
-
-        private static string ValueNotLike(string key, object value)
-        {
-
-            StringBuilder sql = new StringBuilder(" and  " + key + " in (");
-            if (value is JArray array)
-            {
-                foreach (JValue obja in array)
-                {
-                    if (obja.Value is string a)
-                    {
-                        sql.Append("\'" + a + "\',");
-                    }
-                    if (obja.Value is int b)
-                    {
-                        sql.Append(b + ",");
-                    }
-                    if (obja.Value is double c)
-                    {
-                        sql.Append(c + ",");
-                    }
-                    if (obja.Value is bool d)
-                    {
-                        sql.Append(d + ",");
-                    }
-                    if (obja.Value is long e)
-                    {
-                        sql.Append(e + ",");
-                    }
-                    if (obja.Value is DateTime f)
-                    {
-                        sql.Append(f + ",");
-                    }
-                }
-                string sqls = sql.ToString().Substring(0, sql.Length - 1);
-                sqls += " ) ";
-                return sqls;
-            }
-            else if (value is IEnumerable enumerable && !(value is String))
-            {
-                foreach (object obja in enumerable)
-                {
-                    if (obja is string a)
-                    {
-                        sql.Append("\'" + a + "\',");
-                    }
-                    if (obja is int b)
-                    {
-                        sql.Append(" " + b + " ,");
-
-                    }
-                    if (obja is double c)
-                    {
-                        sql.Append(" " + c + " ,");
-                    }
-                    if (obja is bool d)
-                    {
-                        sql.Append(" " + d + " ,");
-
-                    }
-                    if (obja is long e)
-                    {
-                        sql.Append(" " + e + " ,");
-                    }
-                    if (obja is DateTime f)
-                    {
-                        sql.Append(" " + f + " ,");
-                    }
-                }
-                string sqls = sql.ToString().Substring(0, sql.Length - 1);
-                sqls += ") ";
-                return sqls;
-            }
-            else if (value is JsonElement jsonElement)
-            {
-                foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
-                {
-                    if (obja.ValueKind is JsonValueKind.String)
-                    {
-                        sql.Append("\'" + obja.ToString() + "\',");
-                    }
-                    if (obja.ValueKind is JsonValueKind.Number)
-                    {
-                        sql.Append(" " + int.Parse(obja.ToString()) + " ,");
-                    }
-                    if (obja.ValueKind is JsonValueKind.True)
-                    {
-                        sql.Append(" " + bool.Parse(obja.ToString()) + " ,");
-                    }
-                    if (obja.ValueKind is JsonValueKind.False)
-                    {
-                        sql.Append(" " + bool.Parse(obja.ToString()) + " ,");
-                    }
-                }
-                string sqls = sql.ToString().Substring(0, sql.Length - 1);
-                sqls += ") ";
-                return sqls;
-            }
-            else
-            {
-                Type s = value.GetType();
-                TypeCode typeCode = Type.GetTypeCode(s);
-                return typeCode switch
-                {
-                    TypeCode.String => " and " + key + " = " + "\'" + value.ToString() + "\'",
-                    TypeCode.Char => " and " + key + " = " + "\'" + value.ToString() + "\'",
-                    TypeCode.Int32 => " and " + key + " = " + int.Parse(value.ToString()),
-                    TypeCode.Double => " and " + key + " = " + double.Parse(value.ToString()),
-                    //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
-                    TypeCode.Boolean => " and " + key + " = " + bool.Parse(value.ToString()),
-                    TypeCode.DateTime => " and " + key + " = " + (DateTime)value,
-                    TypeCode.Int64 => " and " + key + " = " + long.Parse(value.ToString()),
-                    _ => null,
-                };
-            }
-        }
-
-        private static string ValueIsLike(string key, object value)
-        {
-            StringBuilder s = new StringBuilder("and ( Contains( ");
-
-            if (value is JArray array)
-            {
-                int aa = 0;
-                foreach (JValue obja in array)
-                {
-                    if (aa != 0) s.Append("or Contains(");
-                    if (obja.Value is string a)
-                    {
-                        s.Append(key + "," + "\'" + a + "\') = true ");
-                    }
-                    else if (obja.Value is int b)
-                    {
-                        s.Append(key + "," + " " + b + " ) = true ");
-
-                    }
-                    else if (obja.Value is double c)
-                    {
-                        s.Append(key + "," + " " + c + " ) = true ");
-                    }
-                    else if (obja.Value is bool d)
-                    {
-                        s.Append(key + "," + " " + d + " ) = true ");
-
-                    }
-                    else if (obja.Value is long e)
-                    {
-                        s.Append(key + "," + " " + e + " ) = true ");
-                    }
-                    else if (obja.Value is DateTime f)
-                    {
-                        s.Append(key + "," + " " + f + " ) = true ");
-                    }
-                    aa++;
-                }
-            }
-            else if (value is IEnumerable enumerable && !(value is String))
-            {
-                int aa = 0;
-                foreach (object obja in enumerable)
-                {
-                    if (aa != 0) s.Append("or Contains(");
-                    if (obja is string a)
-                    {
-                        s.Append(key + "," + "\'" + a + "\') = true ");
-                    }
-                    if (obja is int b)
-                    {
-                        s.Append(key + "," + " " + b + " ) = true ");
-
-                    }
-                    if (obja is double c)
-                    {
-                        s.Append(key + "," + " " + c + " ) = true ");
-                    }
-                    if (obja is bool d)
-                    {
-                        s.Append(key + "," + " " + d + " ) = true ");
-
-                    }
-                    if (obja is long e)
-                    {
-                        s.Append(key + "," + " " + e + " ) = true ");
-                    }
-                    if (obja is DateTime f)
-                    {
-                        s.Append(key + "," + " " + f + " ) = true ");
-                    }
-                    aa++;
-                }
-
-            }
-            else if (value is JsonElement jsonElement)
-            {
-                int aa = 0;
-                //jsonElement.EnumerateArray().ToArray();
-                foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
-                {
-                    if (aa != 0) s.Append("or Contains(");
-                    if (obja.ValueKind is JsonValueKind.String)
-                    {
-                        s.Append(key + "," + "\'" + obja.ToString() + "\') = true ");
-                    }
-                    if (obja.ValueKind is JsonValueKind.Number)
-                    {
-                        s.Append(key + "," + " " + int.Parse(obja.ToString()) + " ) = true ");
-                    }
-                    if (obja.ValueKind is JsonValueKind.True)
-                    {
-                        s.Append(key + "," + " " + bool.Parse(obja.ToString()) + " ) = true ");
-                    }
-                    if (obja.ValueKind is JsonValueKind.False)
-                    {
-                        s.Append(key + "," + " " + bool.Parse(obja.ToString()) + " ) = true ");
-                    }
-                    aa++;
-                }
-            }
-            else
-            {
-                Type stype = value.GetType();
-                TypeCode typeCode = Type.GetTypeCode(stype);
-                return typeCode switch
-                {
-                    TypeCode.String => "and " + "Contains( " + key + " , \'" + value.ToString() + "\') = true ",
-                    TypeCode.Char => "and " + "Contains( " + key + " , \'" + value.ToString() + "\') = true ",
-                    TypeCode.Int32 => "and " + "Contains( " + key + " , " + int.Parse(value.ToString()) + ") = true ",
-                    TypeCode.Double => "and " + "Contains( " + key + " , " + double.Parse(value.ToString()) + ") = true ",
-                    //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
-                    TypeCode.Boolean => "and " + "Contains( " + key + " , " + bool.Parse(value.ToString()) + ") = true ",
-                    TypeCode.DateTime => "and " + "Contains( " + key + " , " + (DateTime)value + ") = true ",
-                    TypeCode.Int64 => "and " + "Contains( " + key + " , " + long.Parse(value.ToString()) + ") = true ",
-                    _ => null,
-                };
-            }
-            s.Append(" )");
-            return s.ToString();
-        }
-
-        private static string KeyNotElement(object value, string key)
-        {
-
-            if (key.StartsWith("$."))
-            {
-                string keyLike = key.Replace("$.", "");
-                StringBuilder sql = new StringBuilder(" and ( Contains( ");
-                if (value is JArray jarray)
-                {
-                    int aa = 0;
-                    foreach (JValue obja in jarray)
-                    {
-                        if (aa != 0) sql.Append("or Contains(");
-                        if (obja.Value is string a)
-                        {
-                            sql.Append(" c." + keyLike + ",\'" + a + "\')");
-                        }
-                        if (obja.Value is int b)
-                        {
-                            sql.Append(" c." + keyLike + ", " + b + " )");
-                        }
-                        if (obja.Value is double c)
-                        {
-                            sql.Append(" c." + keyLike + ", " + c + " )");
-                        }
-                        if (obja.Value is bool d)
-                        {
-                            sql.Append(" c." + keyLike + ", " + d + " )");
-
-                        }
-                        if (obja.Value is long e)
-                        {
-                            sql.Append(" c." + keyLike + ", " + e + " )");
-                        }
-                        if (obja.Value is DateTime f)
-                        {
-                            sql.Append(" c." + keyLike + ", " + f + " )");
-                        }
-                        aa++;
-                    }
-                }
-                else if (value is IEnumerable enumerable && !(value is String))
-                {
-                    int aa = 0;
-                    foreach (object obja in enumerable)
-                    {
-                        if (aa != 0) sql.Append("or Contains(");
-                        if (obja is string a)
-                        {
-                            sql.Append(" c." + keyLike + "," + "\'" + a + "\') = true ");
-                        }
-                        if (obja is int b)
-                        {
-                            sql.Append(" c." + keyLike + "," + " " + b + " ) = true ");
-                        }
-                        if (obja is double c)
-                        {
-                            sql.Append(" c." + keyLike + "," + " " + c + " ) = true ");
-                        }
-                        if (obja is bool d)
-                        {
-                            sql.Append(" c." + keyLike + "," + " " + d + " ) = true ");
-                        }
-                        if (obja is long e)
-                        {
-                            sql.Append(" c." + keyLike + "," + " " + e + " ) = true ");
-                        }
-                        if (obja is DateTime f)
-                        {
-                            sql.Append(" c." + keyLike + "," + " " + f + " ) = true ");
-                        }
-                        aa++;
-                    }
-                }
-                else if (value is JsonElement jsonElement)
-                {
-                    int aa = 0;
-                    foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
-                    {
-                        if (aa != 0) sql.Append("or Contains(");
-                        if (obja.ValueKind is JsonValueKind.String)
-                        {
-                            sql.Append(" c." + keyLike + "," + "\'" + obja.ToString() + "\') = true ");
-                        }
-                        if (obja.ValueKind is JsonValueKind.Number)
-                        {
-                            sql.Append(" c." + keyLike + "," + " " + int.Parse(obja.ToString()) + " ) = true ");
-                        }
-                        if (obja.ValueKind is JsonValueKind.True)
-                        {
-                            sql.Append(" c." + keyLike + "," + " " + bool.Parse(obja.ToString()) + " ) = true ");
-                        }
-                        if (obja.ValueKind is JsonValueKind.False)
-                        {
-                            sql.Append(" c." + keyLike + "," + " " + bool.Parse(obja.ToString()) + " ) = true ");
-                        }
-                        aa++;
-                    }
-                }
-                else
-                {
-                    Type s = value.GetType();
-                    TypeCode typeCode = Type.GetTypeCode(s);
-                    return typeCode switch
-                    {
-                        TypeCode.String => "and " + "Contains( c." + keyLike + " , \'" + value.ToString() + "\') = true ",
-                        TypeCode.Char => "and " + "Contains( c." + keyLike + " , \'" + value.ToString() + "\') = true ",
-                        TypeCode.Int32 => "and " + "Contains( c." + keyLike + " , " + int.Parse(value.ToString()) + ") = true ",
-                        TypeCode.Double => "and " + "Contains( c." + keyLike + " , " + double.Parse(value.ToString()) + ") = true ",
-                        //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
-                        TypeCode.Boolean => "and " + "Contains( c." + keyLike + " , " + bool.Parse(value.ToString()) + ") = true ",
-                        TypeCode.DateTime => "and " + "Contains( c." + keyLike + " , " + (DateTime)value + ") = true ",
-                        TypeCode.Int64 => "and " + "Contains( c." + keyLike + " , " + long.Parse(value.ToString()) + ") = true ",
-                        _ => null,
-                    };
-                }
-
-                sql.Append(")");
-                return sql.ToString();
-            }
-            else
-            {
-                StringBuilder sql = new StringBuilder(" and  c." + key + " in (");
-                if (value is JArray array)
-                {
-
-                    foreach (JValue obja in array)
-                    {
-                        if (obja.Value is string a)
-                        {
-                            sql.Append("\'" + a + "\',");
-                        }
-                        if (obja.Value is int b)
-                        {
-                            sql.Append(b + ",");
-
-                        }
-                        if (obja.Value is double c)
-                        {
-                            sql.Append(c + ",");
-                        }
-                        if (obja.Value is bool d)
-                        {
-                            sql.Append(d + ",");
-
-                        }
-                        if (obja.Value is long e)
-                        {
-                            sql.Append(e + ",");
-                        }
-                        if (obja.Value is DateTime f)
-                        {
-                            sql.Append(f + ",");
-                        }
-                    }
-                    string sqls = sql.ToString().Substring(0, sql.Length - 1);
-                    sqls += " ) ";
-                    return sqls;
-                }
-                else if (value is IEnumerable enumerable && !(value is String))
-                {
-                    foreach (object obja in enumerable)
-                    {
-                        if (obja is string a)
-                        {
-                            sql.Append("\'" + a + "\',");
-                        }
-                        if (obja is int b)
-                        {
-                            sql.Append(" " + b + " ,");
-
-                        }
-                        if (obja is double c)
-                        {
-                            sql.Append(" " + c + " ,");
-                        }
-                        if (obja is bool d)
-                        {
-                            sql.Append(" " + d + " ,");
-
-                        }
-                        if (obja is long e)
-                        {
-                            sql.Append(" " + e + " ,");
-                        }
-                        if (obja is DateTime f)
-                        {
-                            sql.Append(" " + f + " ,");
-                        }
-                    }
-                    string sqls = sql.ToString().Substring(0, sql.Length - 1);
-                    sqls += ") ";
-                    return sqls;
-                }
-                else if (value is JsonElement jsonElement)
-                {
-                    foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
-                    {
-                        if (obja.ValueKind is JsonValueKind.String)
-                        {
-                            sql.Append("\'" + obja.ToString() + "\',");
-                        }
-                        if (obja.ValueKind is JsonValueKind.Number)
-                        {
-                            sql.Append(" " + int.Parse(obja.ToString()) + " ,");
-                        }
-                        if (obja.ValueKind is JsonValueKind.True)
-                        {
-                            sql.Append(" " + bool.Parse(obja.ToString()) + " ,");
-                        }
-                        if (obja.ValueKind is JsonValueKind.False)
-                        {
-                            sql.Append(" " + bool.Parse(obja.ToString()) + " ,");
-                        }
-                    }
-                    string sqls = sql.ToString().Substring(0, sql.Length - 1);
-                    sqls += ") ";
-                    return sqls;
-                }
-                else
-                {
-                    Type s = value.GetType();
-                    TypeCode typeCode = Type.GetTypeCode(s);
-                    return typeCode switch
-                    {
-                        TypeCode.String => " and c." + key + " = " + "\'" + value.ToString() + "\'",
-                        TypeCode.Char => " and c." + key + " = " + "\'" + value.ToString() + "\'",
-                        TypeCode.Int32 => " and c." + key + " = " + int.Parse(value.ToString()),
-                        TypeCode.Double => " and c." + key + " = " + double.Parse(value.ToString()),
-                        //case TypeCode.Byte: return "and c." + key + "=" + (Byte)obj ;   
-                        TypeCode.Boolean => " and c." + key + " = " + bool.Parse(value.ToString()),
-                        TypeCode.DateTime => " and c." + key + " = " + (DateTime)value,
-                        TypeCode.Int64 => " and c." + key + " = " + long.Parse(value.ToString()),
-                        _ => null,
-                    };
-                }
-            }
-        }
     }
 }

+ 1 - 1
TEAMModelOS.Service/Models/Evaluation/Models/ExamPaper.cs

@@ -17,6 +17,6 @@ namespace TEAMModelOS.Service.Models.Evaluation.Models
         [PartitionKey]
         public string code { get; set; }
         public List<ItemInfo> item { get; set; }       
-        //public string Subject { get; set; }
+        public string Subject { get; set; }
     }
 }

+ 6 - 1
TEAMModelOS.Service/Models/Evaluation/Models/ItemInfo.cs

@@ -21,9 +21,14 @@ namespace TEAMModelOS.Service.Models.Evaluation.Models
         public string explain { get; set; }
         public string type { get; set; }
         public string pShaCode { get; set; }
+        //管理知识点
         public List<string> points { get; set; }
+        //认知层次
         public string field { get; set; }
         public List<ItemInfo> children { get; set; }
-
+        /// <summary>
+        /// 配分
+        /// </summary>
+        public double score { get; set; }
     }
 }

+ 2 - 1
TEAMModelOS.Service/Models/Evaluation/Models/SimpleExam.cs

@@ -4,7 +4,7 @@ using System.Collections.Generic;
 using System.Text;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 
-namespace TEAMModelOS.Model.Evaluation.Models
+namespace TEAMModelOS.Service.Model.Evaluation.Models
 {
     [CosmosDB(RU = 400, Name = "SimpleExam")]
     public class SimpleExam
@@ -21,6 +21,7 @@ namespace TEAMModelOS.Model.Evaluation.Models
         public string Name { get; set; }
         public string Time { get; set; }
         [PartitionKey]
+        public string SubjectCode { get; set; }
         public string Subject { get; set; }
 
         public List<Dictionary<string, int[]>> Classes { get; set; }

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Border.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public  class Border
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Chart.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public   class Chart : Item
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Connector.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
 
     public class Connector : Item

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Diagram.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public class Diagram :Item
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Fill.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public class Fill
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/FontStyle.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public  class FontStyle
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Group.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public  class Group : Item
     {

+ 9 - 8
TEAMModelOS.Service/Models/PowerPoint/Pptx.cs

@@ -2,12 +2,12 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
-    public class Pptx
+    public class Htex
     {
-        public Pptx() {
-            //slides = new List<Slide>();
+        public Htex() {
+            Slides = new List<string>();
             //size = new PptSize();
             //FontStyles = new Dictionary<string, FontStyle>();
             //Fills = new Dictionary<string, Fill>();
@@ -16,14 +16,14 @@ namespace HiTeachCC.Model.PowerPoint
             //Borders = new Dictionary<string, Border>();
 
         }
-        public PptSize Size { get; set; }
+        public HtexSize Size { get; set; }
         //缩略图
         public string Thumbnail { get; set; }
         //PPT幻灯片集合
         //  public List<string> HiXmls { get; set; }
-        public List<Slide> Slides { get; set; }
+        public List<string> Slides { get; set; }
         // public string PptUrl { get; set; }
-        public string Sha1Code { get; set; }
+        // public string Sha1Code { get; set; }
         //页数
         public int Page { get; set; }
 
@@ -33,7 +33,8 @@ namespace HiTeachCC.Model.PowerPoint
         //public Dictionary<string, BuChar> BuChars { get; set; }
         //public Dictionary<string, Border> Borders { get; set; }
     }
-    public class PptSize {
+    public class HtexSize
+    {
         //宽度
         public double Width { get; set; }
         //高度

+ 2 - 2
TEAMModelOS.Service/Models/PowerPoint/Inner/WarpObj.cs

@@ -1,4 +1,4 @@
-using HiTeachCC.Model.PowerPoint;
+using TEAMModelOS.Service.Model.PowerPoint;
 using System;
 using System.Collections.Generic;
 using System.Text;
@@ -19,7 +19,7 @@ namespace TEAMModelOS.Service.Models.PowerPoint.Inner
         public XmlNode slideMasterContent { get; set; }
         public XmlNode themeContent { get; set; }
         public XmlNode tableStyles { get; set; }
-        public Pptx pptx { get; set; }
+        public Htex htex { get; set; }
     }
 
 

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Item.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public abstract class Item
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Math.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public class Math : Item
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Media.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public   class Media : Item
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Paragraph.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public class Paragraph
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Position.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public class Position
     {

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Shape.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
      public class Shape : Item
     { 

+ 7 - 30
TEAMModelOS.Service/Models/PowerPoint/Slide.cs

@@ -2,18 +2,12 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using TEAMModelOS.Service.Models.Core;
+using TEAMModelOS.Service.Models.Evaluation.Models;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public class Slide
     {
-        public Slide()
-        {
-            Item = new List<Item>();
-            Answer = new List<string>();
-            Points = new List<string>();
-            Option = new List<CodeValue>();
-        }
         public List<Item> Item { get; set; }
         public Fill Fill { get; set; }
         public int Index { get; set; }
@@ -21,29 +15,12 @@ namespace HiTeachCC.Model.PowerPoint
         public double Width { get; set; }
         //高度
         public double Height { get; set; }
-        //问题
-        public string Question { get; set; }
-        //答案
-        public List<string> Answer { get; set; }
-        //解析
-        public string Explain { get; set; }
-        //题目类型
-        public string Type { get; set; }
-        //知识点
-        public List<string> Points { get; set; }
-        // 选项
-        public List<CodeValue> Option { get; set; }
-        //认知层次
-        public string Cognition { get; set; }
-        //PPTX  WORD  来源
-        public string Source { get; set; }
+        public ItemInfo Exercise { get; set; }
+        //1 PPTX  2 HTML  来源
+        public int Source { get; set; }
         /// <summary>
-        /// 0 默认为普通页面,1为题目
+        /// 1默认为普通页面,2为题目
         /// </summary>
-        public int Flag { get; set; }
+        public int Flag { get; set; } 
     }
-    public class Question { 
-    
-    }
-
 }

+ 1 - 1
TEAMModelOS.Service/Models/PowerPoint/Table.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HiTeachCC.Model.PowerPoint
+namespace TEAMModelOS.Service.Model.PowerPoint
 {
     public class Table :Item
     {

+ 1 - 1
TEAMModelOS.Service/Models/Syllabus/Volume.cs

@@ -9,7 +9,7 @@ using Newtonsoft.Json;
 namespace TEAMModelOS.Service.Models.Syllabus
 {
     [CosmosDB(RU = 400, Name = "SyllabusVolume")]
-    public class Volume
+    public class SyllabusVolume
     { 
         /// <summary>
         /// id生成规则

+ 1 - 1
TEAMModelOS.Service/Services/Analysis/Implements/AchievementService.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using TEAMModelOS.Model.Evaluation.Models;
+using TEAMModelOS.Service.Model.Evaluation.Models;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.Service.Analysis.Interfaces;

+ 1 - 1
TEAMModelOS.Service/Services/Analysis/Interfaces/IAchievementService.cs

@@ -1,5 +1,5 @@
 using System.Collections.Generic;
-using TEAMModelOS.Model.Evaluation.Models;
+using TEAMModelOS.Service.Model.Evaluation.Models;
 using TEAMModelOS.SDK.Context.Configuration;
 using TEAMModelOS.Service.Models.Core;
 

+ 4 - 1
TEAMModelOS.Service/Services/Evaluation/Implements/HtmlAnalyzeService.cs

@@ -14,6 +14,7 @@ using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Common.FileHelper;
 using TEAMModelOS.SDK.Helper.Common.StringHelper;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;
+using TEAMModelOS.Service.Model.PowerPoint;
 using TEAMModelOS.Service.Models.Core;
 using TEAMModelOS.Service.Models.Evaluation.Models;
 using TEAMModelOS.Service.Services.Evaluation.Interfaces;
@@ -36,7 +37,7 @@ namespace TEAMModelOS.Service.Services.Evaluation.Implements
             { "Judge", "【判断题】|【结束】" }, { "Complete", "【填空题】|【结束】" },
             { "Subjective", "【问答题】|【结束】" } , { "Compose", "【综合题】|【完结】" }};
         public List<ItemInfo> AnalyzeWordAsync(string html, string Lang)
-        {
+        { 
             //去除class 以及span标签"
             string classpattern = "class=\"([^\"]*)\"";
             html = Regex.Replace(html, classpattern, "");
@@ -343,6 +344,8 @@ namespace TEAMModelOS.Service.Services.Evaluation.Implements
             }
             return TestInType;
         }
+
+       
     }
     class ReplaceDto
     {

+ 2 - 0
TEAMModelOS.Service/Services/Evaluation/Interfaces/IHtmlAnalyzeService.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.Service.Model.PowerPoint;
 using TEAMModelOS.Service.Models.Evaluation.Models;
 
 namespace TEAMModelOS.Service.Services.Evaluation.Interfaces
@@ -9,5 +10,6 @@ namespace TEAMModelOS.Service.Services.Evaluation.Interfaces
     public interface IHtmlAnalyzeService: IBusinessService
     {
         List<ItemInfo> AnalyzeWordAsync(string htmlString, string Lang);
+  
     }
 }

+ 45 - 25
TEAMModelOS.Service/Services/PowerPoint/Implement/PowerPointService.cs

@@ -1,6 +1,5 @@
 using DocumentFormat.OpenXml.Packaging;
-using HiTeachCC.Model.PowerPoint;
-using HiTeachCC.Service.PowerPoint.Interface;
+using TEAMModelOS.Service.Model.PowerPoint;
 using Microsoft.AspNetCore.Http;
 using System;
 using System.Collections.Generic;
@@ -13,19 +12,21 @@ using TEAMModelOS.SDK.Context.Constant;
 using TEAMModelOS.SDK.Context.Constant.Common;
 using TEAMModelOS.SDK.Context.Exception;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
-using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;
 using TEAMModelOS.SDK.Module.AzureBlob.Container;
 using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
-using TEAMModelOS.Service.Models.PowerPoint.Inner;
-using TEAMModelOS.Service.Services.PowerPoint.Implement;
-using Fill = HiTeachCC.Model.PowerPoint.Fill;
-using Media = HiTeachCC.Model.PowerPoint.Media;
-using Position = HiTeachCC.Model.PowerPoint.Position;
+using TEAMModelOS.Service.Models.PowerPoint.Inner; 
+using Fill = TEAMModelOS.Service.Model.PowerPoint.Fill;
+using Media = TEAMModelOS.Service.Model.PowerPoint.Media;
+using Position = TEAMModelOS.Service.Model.PowerPoint.Position;
+using TEAMModelOS.Service.Services.PowerPoint.Interface;
+using TEAMModelOS.Service.Models.Evaluation.Models;
+using TEAMModelOS.Service.Services.Evaluation.Interfaces;
+using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 
-namespace HiTeachCC.Service.PowerPoint.Implement
+namespace TEAMModelOS.Service.Services.PowerPoint.Implement
 {
-    public class PowerPointService : IPowerPointService
+    public class HtexService : IHtexService
     {
         private string fileShaCode { get; set; }
         private Dictionary<string, string> slideLayoutClrOvride { get; set; }
@@ -34,13 +35,29 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         private const double px96 = 96.00, px72 = 72.00, px914400 = 914400.00, px12700 = 12700.00;
         private const double rot60000 = 60000.00;
         public readonly IAzureBlobDBRepository azureBlobDBRepository;
-
-        public PowerPointService(IAzureBlobDBRepository _azureBlobDBRepository)
+        public readonly IHtmlAnalyzeService htmlAnalyzeService;
+        public HtexService(IAzureBlobDBRepository _azureBlobDBRepository, IHtmlAnalyzeService _htmlAnalyzeService)
         {
             azureBlobDBRepository = _azureBlobDBRepository;
+            htmlAnalyzeService = _htmlAnalyzeService;
         }
-
-        public async Task<Dictionary<string, object>> LoadPresentation(IFormFile file)
+        public async Task<Htex> AnalyzeHtmlToHtex(string htmlString, string Lang)
+        {
+            Htex htex = new Htex();
+            List<ItemInfo> items = htmlAnalyzeService.AnalyzeWordAsync(htmlString, Lang);
+            string sha=  ShaHashHelper.GetSHA1(htmlString);
+            int index = 0;
+            foreach (ItemInfo item in items)
+            {
+                Slide slide = new Slide { Exercise = item, Index = index, Source = 2, Flag = 2 };
+                index++;
+                AzureBlobModel model=  await azureBlobDBRepository.UploadTextByFolder(slide.ToJson(), sha, index+".json","htex",false);
+                htex.Slides.Add(model.BlobUrl);
+            }
+            htex.Page = items.Count;
+            return htex;
+        }
+        public async Task<Dictionary<string, object>> LoadDoc(IFormFile file)
         {
             Dictionary<string, object> resdict = new Dictionary<string, object>();
 
@@ -102,9 +119,9 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         /// </summary>
         /// <param name="presentationFile"></param>
         /// <returns></returns>
-        public async Task<Pptx> ProcessPPTX(XmlDocument xdoc, string shaCode)
+        public async Task<Htex> ProcessPPTX(XmlDocument xdoc, string shaCode)
         {
-            Pptx pptx = new Pptx();
+            Htex pptx = new Htex();
           //  List<Dictionary<string, object>> post_ary = new List<Dictionary<string, object>>();
             Dictionary<string, object> post_ary = new Dictionary<string, object>();
             var dateBefore = DateTimeOffset.Now.UtcTicks;
@@ -118,7 +135,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
             var slideLayoutNodes = xdoc.GetTextByPathList("//pkg:part[@pkg:contentType='application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml']");
             //获取ppt的宽高
             var slideSize = ShapeHelper.GetSlideSize(xdoc);
-            pptx.Size = new PptSize { Width = slideSize.width, Height = slideSize.height };
+            pptx.Size = new HtexSize { Width = slideSize.width, Height = slideSize.height };
          //   post_ary.Add( "slideSize", slideSize  );
             //加载当前PPT使用到的PPT节点
             var themeContent = LoadTheme(xdoc);
@@ -134,14 +151,17 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 string filename = node.GetTextByPath("@pkg:name").Value;
                 //处理当前页的幻灯片
                 Slide slide = await ProcessSingleSlide(xdoc, node, filename, i, slideSize, themeContent, tableStyles, pptx);
+               
+                slide.Source = 1;
+                slide.Flag = 1;
+                AzureBlobModel model = await azureBlobDBRepository.UploadTextByFolder(slide.ToJson(), shaCode, (i + 1) + ".json", "htex", false);
+                pptx.Slides.Add(model.BlobUrl);
                 slides.Add(slide);
-              //  post_ary.Add(new Dictionary<string, object> { { "slide", slideHtml } });
-               // post_ary.Add(new Dictionary<string, object> { { "progress-update", (i + 1) * 100 / numOfSlides } });
+                //  post_ary.Add(new Dictionary<string, object> { { "slide", slideHtml } });
+                // post_ary.Add(new Dictionary<string, object> { { "progress-update", (i + 1) * 100 / numOfSlides } });
 
             }
-
-            pptx.Slides = slides;
-            pptx.Sha1Code = shaCode;
+           // pptx.Sha1Code = shaCode;
             pptx.Page = slides.Count;
             //post_ary.Add( "slide", slides );
             //post_ary.Add(  "globalCSS", GenGlobalCSS()  );
@@ -163,7 +183,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
         //    return cssText;
         //}
 
-        public async Task<Slide> ProcessSingleSlide(XmlDocument xdoc, XmlNode xnode, string sldFileName, int index, dynamic slideSize, XmlNode themeContent, XmlNode tableStyles,Pptx pptx)
+        public async Task<Slide> ProcessSingleSlide(XmlDocument xdoc, XmlNode xnode, string sldFileName, int index, dynamic slideSize, XmlNode themeContent, XmlNode tableStyles,Htex pptx)
         {
 
             var resName = sldFileName.Replace("slides/slide", "slides/_rels/slide") + ".rels";
@@ -294,7 +314,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                 slideMasterContent = slideMasterContent,
                 themeContent = themeContent,
                 tableStyles = tableStyles,
-                pptx = pptx
+                htex = pptx
             };
             var bgColor = await GetSlideBackgroundFill(slideContent, index, warpObj);
             //string sha = null;
@@ -1400,7 +1420,7 @@ namespace HiTeachCC.Service.PowerPoint.Implement
                     spY = System.Math.Round(double.Parse(startPoint.GetTextByPath("@y").Value) * 96 / 914400,degree);
                 }
                 var d = "M" + spX + "," + spY;
-                // List<HiTeachCC.Model.PowerPoint.Path> Paths = new List<Model.PowerPoint.Path>();
+                // List<TEAMModelOS.Service.Model.PowerPoint.Path> Paths = new List<Model.PowerPoint.Path>();
                 XmlNodeList pathChildNodes = pathLstNode.GetTextByPath("a:path").ChildNodes;
                 foreach (XmlNode childNode in pathChildNodes)
                 {

+ 1 - 2
TEAMModelOS.Service/Services/PowerPoint/Implement/ShapeHelper.cs

@@ -1,5 +1,4 @@
-using HiTeachCC.Model.PowerPoint;
-using HiTeachCC.Service.PowerPoint.Implement;
+using TEAMModelOS.Service.Model.PowerPoint;
 using System;
 using System.Collections.Generic;
 using System.Drawing;

+ 1 - 2
TEAMModelOS.Service/Services/PowerPoint/Implement/ShapeSvg.cs

@@ -1,5 +1,4 @@
-using HiTeachCC.Model.PowerPoint;
-using HiTeachCC.Service.PowerPoint.Implement;
+using TEAMModelOS.Service.Model.PowerPoint; 
 using System;
 using System.Collections.Generic;
 using System.Text;

+ 16 - 0
TEAMModelOS.Service/Services/PowerPoint/Interface/IHtexService.cs

@@ -0,0 +1,16 @@
+using Microsoft.AspNetCore.Http;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.Service.Model.PowerPoint;
+
+namespace TEAMModelOS.Service.Services.PowerPoint.Interface
+{
+    public interface IHtexService : IBusinessService
+    {
+        Task<Dictionary<string, object>> LoadDoc(IFormFile file);
+        Task<Htex> AnalyzeHtmlToHtex(string htmlString, string Lang);
+    }
+}

+ 0 - 14
TEAMModelOS.Service/Services/PowerPoint/Interface/IPowerPointService.cs

@@ -1,14 +0,0 @@
-using Microsoft.AspNetCore.Http;
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK.Context.Configuration;
-
-namespace HiTeachCC.Service.PowerPoint.Interface
-{
-    public interface IPowerPointService : IBusinessService
-    {
-        Task<Dictionary<string, object>> LoadPresentation(IFormFile file);
-    }
-}

+ 11 - 16
TEAMModelOS/ClientApp/src/common/UploadFile.vue

@@ -21,6 +21,7 @@
   export default {
     data() {
       return {
+        urlString:'',
         containerURL: undefined,
         sasString: '',
         uploadedList: [],
@@ -56,7 +57,8 @@
       },
       initBlob() {
         this.containerURL = new window.azblob.ContainerURL(
-          `https://${this.accountName}.blob.core.chinacloudapi.cn/${this.containerName}/${this.pathName}?${this.sasString}`,
+          //`https://${this.accountName}.blob.core.chinacloudapi.cn/${this.containerName}/${this.pathName}?${this.sasString}`,
+          this.urlString+ '/'+ this.pathName+this.sasString ,
           window.azblob.StorageURL.newPipeline(new window.azblob.AnonymousCredential())
         )
       },
@@ -99,7 +101,8 @@
                 options
               ).then(
                 res => {
-                  fileInfo['compressUrl'] = `https://${this.accountName}.blob.core.chinacloudapi.cn/${this.containerName}/${this.pathName}/compress${file.name}`
+                  //fileInfo['compressUrl'] = `https://${this.accountName}.blob.core.chinacloudapi.cn/${this.containerName}/${this.pathName}/compress${file.name}`
+                  fileInfo['compressUrl'] = this.urlString  + '/' + this.pathName + '/compress' + file.name
                   this.$emit("successData", fileInfo)
                 },
                 err => {
@@ -116,10 +119,6 @@
           video.setAttribute("crossOrigin",'*')
           video.setAttribute("src", fileInfo.blobUrl + this.sasString)
           video.addEventListener('loadeddata', () => {
-            console.log(video.width)
-            console.log(video.height)
-            console.log(video.videoWidth)
-            console.log(video.videoHeight)
             let canvas = document.createElement('canvas')
             canvas.width = 300
             canvas.height = 300 * video.videoHeight / video.videoWidth
@@ -139,7 +138,8 @@
               compressBlobURL
             ).then(
               res => {
-                fileInfo['compressUrl'] = `https://${this.accountName}.blob.core.chinacloudapi.cn/${this.containerName}/${this.pathName}/${posterName}`
+                //fileInfo['compressUrl'] = `https://${this.accountName}.blob.core.chinacloudapi.cn/${this.containerName}/${this.pathName}/${posterName}`
+                fileInfo['compressUrl'] = this.urlString + '/' + this.pathName + '/' + posterName
                 this.$emit("successData", fileInfo)
               },
               err => {
@@ -157,7 +157,8 @@
         )
         let fileItem = {}
         fileItem['fileName'] = file.name
-        fileItem['blobUrl'] = `https://${this.accountName}.blob.core.chinacloudapi.cn/${this.containerName}/${this.pathName}/${file.name}`
+        //fileItem['blobUrl'] = `https://${this.accountName}.blob.core.chinacloudapi.cn/${this.containerName}/${this.pathName}/${file.name}`
+        fileItem['blobUrl'] = this.urlString + '/' + this.pathName + '/'+ file.name
         fileItem['extension'] = file.name.substring(file.name.lastIndexOf('.') + 1)
         fileItem['size'] = file.size
         fileItem['status'] = 0
@@ -202,12 +203,6 @@
                 this.uploadedList[index]['sha1Code'] = str
                 if (this.uploadedList[index].type == 'picture' || this.uploadedList[index].type == 'video') {
                   this.compressFile(file,this.uploadedList[index])
-                  //if (this.uploadedList[index].type == 'video') {
-                  //  console.log('bug is here!!!')
-                  //} else {
-                  //  this.compressFile(file,this.uploadedList[index])
-                  //}
-                  
                 } else {
                   this.$emit("successData", this.uploadedList[index])
                 }
@@ -215,7 +210,6 @@
                 console.log(e)
               }
             }
-            
           },
           err => {
             fileItem['status'] = 2
@@ -229,7 +223,8 @@
         this.$api.uploadFile.getContainerSAS().then(
           (res) => {
             if (res.error == null) {
-              this.sasString = res.result.data
+              this.sasString = res.result.data.SAS
+              this.urlString = res.result.data.Url
               this.initBlob()
               this.uploadToBlob(file)
             } else {

+ 12 - 0
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseEntryBar.vue

@@ -39,6 +39,18 @@
                             // 提示框内容的样式
                             color: '#fff'
                         },
+                        formatter: function (params) {
+                            var results = params[0].name + '<br>';
+                            for (var i = 0; i < params.length; i++) {
+                                if (params[i].seriesType === 'line') {
+                                    results += params[i].marker + params[i].seriesName + ':' + params[i].data + '%<br>';
+                                } else {
+                                    results += params[i].marker + params[i].seriesName + ':' + params[i].data + '<br>';
+                                }
+                                
+                            }
+                            return results;
+                        }
                     },
                     grid: {
                         show: false,

+ 6 - 5
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeRadar.vue

@@ -7,7 +7,7 @@
 <script>
     export default {
         name: 'helloLine',
-        props:['echartsId'],
+        props: ['echartsId'],
         data() {
             return {
                 radarData: []
@@ -18,7 +18,7 @@
             this.drawLine(this.radarData)
         },
         methods: {
-            drawLine(indicator,data) {
+            drawLine(indicator, data) {
                 // 基于准备好的dom,初始化echarts实例
                 let that = this
                 let myRadar = this.$echarts.init(document.getElementById(this.echartsId), 'chalk')
@@ -32,7 +32,8 @@
                                 results += indicator[i].name + ':' + params.value[i] + '%<br>';
                             }
                             return results;
-                        }},
+                        }
+                    },
                     radar: {
                         triggerEvent: true,
                         name: {
@@ -45,7 +46,7 @@
                         },
                         center: ['50%', '50%'],
                         tooltip: {
-                            
+
                         },
                         indicator: indicator,
                         splitArea: {
@@ -124,7 +125,7 @@
                 list.pointList.forEach(item => {
                     indicator.push({
                         name: item,
-                        max:100
+                        max: 100
                     })
                 })
                 this.drawLine(indicator, list.per.map(item => (Number(item) * 100).toFixed(2)))

+ 7 - 6
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLineBar.vue

@@ -58,12 +58,13 @@
                         textStyle: {
                             color: '#fff'
                         },
-                        //formatter: function (params) {
-                        //    return params[0].name + '<br>' +
-                        //        params[0].marker + params[0].seriesName + ':' + params[0].data + '%<br>' +
-                        //        params[1].marker + params[1].seriesName + ':' + params[1].data + '%<br>' +
-                        //        params[2].marker + params[2].seriesName + ':' + params[2].data + '%<br>'
-                        //}
+                        formatter: function (params) {
+                            let result = params[0].name
+                            for (let i = 0; i < params.length; i++) {
+                                result += '<br>' + params[i].marker + params[i].seriesName + ':' + params[i].data + '%'
+                            }
+                            return result
+                        }
                     },
                     grid: {
                         show: false,

+ 11 - 2
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue

@@ -25,7 +25,16 @@
 
                 // 指定图表的配置项和数据
                 var option = {
-                    tooltip: {},
+                    tooltip: {
+                        formatter: function (params) {
+                            let result = params.name
+                            let pointList = that.getKnowledgeData.pointList
+                            for (let i = 0; i < pointList.length; i++) {
+                                result += '<br>' + params.marker + pointList[i] + ':' + params.value[i] + '%'
+                            }
+                            return result
+                        }
+                    },
                     radar: {
                         triggerEvent: true,
                         name: {
@@ -71,7 +80,7 @@
                             name: '',
                             type: 'radar',
                             itemStyle: {
-                                color: 'red'
+                                color: '#15B8C3'
                             },
                             areaStyle: {
                                 color: {

+ 1 - 1
TEAMModelOS/ClientApp/src/filters/http.js

@@ -1,7 +1,7 @@
 import axios from 'axios'
 import { Message } from 'view-design'
 import router from '@/router/index'
-axios.defaults.timeout = 10000 // 设置超时时长
+axios.defaults.timeout = 30000 // 设置超时时长
 axios.defaults.baseURL = ''
 
 // http request 拦截器

+ 198 - 189
TEAMModelOS/ClientApp/src/locale/lang/en-US/totalAnalysis.js

@@ -1,192 +1,201 @@
 export default {
-  // EvaluationList.vue
-  text1: 'Summary of previous examinations',
-  text2: 'times',
-  text3: 'More screening',
-  text4: 'Enter test name...',
-  text5: 'Current filter criteria',
-  text6: 'Current quantity',
-  text7: 'Participants',
-  text8: 'Date',
-  text9: 'None',
-  condition1: 'Period',
-  condition2: 'Grade',
-  condition3: 'Term',
-  condition4: 'Type',
-  condition5: 'Range',
-  condition6: 'Feedback',
-  condition7: 'Subject',
-
-  // Base Info
-  base_name: 'Name',
-  base_class: 'Class',
-  base_id: 'Seat Number',
-  base_score: 'Score',
-
-  // ExamList.vue
-  newest: 'Newest Exams',
-  more: 'View More ',
-
-  // index.vue
-  module1: 'Score Analysis',
-  module2: 'Point Analysis',
-  module3: 'Item Analysis',
-  module4: 'Knowledge Point Mastery',
-  exportTable: 'Export Table',
-  currentSubject: 'Current Subject',
-
-  // AchievementAnalysis.vue
-  ach_title1: 'Pass Rate Statistics',
-  ach_title2: 'Equipartition Analysis',
-  ach_title3: 'Entry Number Statistics',
-  ach_title4: 'Entry State Statistics',
-  ach_title5: 'Entry Rate Statistics',
-  ach_title6: 'Early Warning Statistics',
-  ach_title7: 'Ranking Statistics',
-  ach_title8: 'Equipartition Analysis',
-  ach_text1: 'Pass Rate',
-  ach_text2: 'Grade',
-  ach_text3: 'District',
-  ach_text4: 'Class Average',
-  ach_text5: 'School Average',
-  ach_text6: 'District Average',
-  ach_text7: 'Total Number',
-  ach_text8: 'Entry Number',
-  ach_text9: 'Entry Rate',
-  ach_text10: 'Currently Class',
-  ach_text11: 'Total Number',
-  ach_text12: 'Back',
-
-  ach_table_text1: 'Grade Ranking',
-  ach_table_text2: 'Total Score',
-  ach_table_text3: 'Average Score',
-  ach_table_text4: 'Standard Deviation',
-  ach_table_text5: 'Super Average Rate',
-  ach_table_text6: 'Incoming Line',
-  ach_table_text7: 'Planted Line',
-  ach_table_text8: 'Class Ranking',
-  ach_table_text9: 'Grade Ranking',
-  ach_table_text10: 'District Ranking',
-  ach_table_text11: 'Class PR Ranking',
-  ach_table_text12: 'Grade PR Ranking',
-  ach_table_text13: 'District PR Ranking',
-  ach_table_text14: 'Progressive Class',
-  ach_table_text15: 'Step Back Class',
-  ach_table_text16: 'Stable Class',
-
-  ach_chart_text1: 'Sort by',
-  ach_chart_text2: 'default sort',
-  ach_chart_text3: 'score from high to low',
-  ach_chart_text4: 'score from low to high',
-
-  // ScatterAnalysis.vue
-  sca_title1: 'Learning Ability Distribution',
-  sca_title2: 'Student Stability Table',
-  sca_text1: 'Region',
-  sca_text2: 'Regional Characteristics',
-  sca_text3: 'Number',
-  sca_text4: 'Student',
-  sca_text5: 'good learning, high stability',
-  sca_text6: 'carelessness and carelessness lead to mistakes',
-  sca_text7: 'learning is still stable and requires further study',
-  sca_text8: 'occasional carelessness, insufficient preparation',
-  sca_text9: 'learning is not enough, more efforts are needed',
-  sca_text10: 'learning is very unstable, not fully prepared for the exam',
-  sca_chart_text1: 'Pass Rate',
-  sca_chart_text2: 'Stability',
-  sca_table_text1: 'Correct Answers Number',
-  sca_table_text2: 'Wrong Answers Number',
-  sca_table_text3: 'Be Tried No.',
-  sca_table_text4: 'Be Careful No.',
-  sca_table_text5: 'Stability',
-  sca_table_text6: 'Drop Area',
-
-  // TestAnalysis.vue
-  ta_title1: 'Test Scatter Analysis',
-  ta_title2: 'Score Rate of Single Question in Grade',
-  ta_title3: 'Test Analysis Summary Table',
-  ta_title4: 'Test Score Rate Table',
-
-  ta_text1: 'Region',
-  ta_text2: 'Regional Characteristics',
-  ta_text3: 'Number',
-  ta_text4: 'Question No.',
-  ta_text5: 'Selected No.',
-  ta_text6: 'The test questions are quite appropriate, which can be used to distinguish different students',
-  ta_text7: 'The test questions may contain heterogeneous components and need local correction',
-  ta_text8: 'The difficulty of test questions is high, which is suitable for distinguishing students with high achievement',
-  ta_text9: 'The test questions contain heterogeneous components, which may be wrong in data or unclear in meaning, and must be modified',
-
-  ta_chart_text1: 'Question',
-  ta_chart_text2: 'Correct Answer Rate',
-  ta_chart_text3: 'Stability',
-  ta_chart_text4: 'Class Scoring Rate',
-  ta_chart_text5: 'Grade Scoring Rate',
-  ta_chart_text6: 'District Scoring Rate',
-
-  ta_table_text1: 'No.',
-  ta_table_text2: 'Type',
-  ta_table_text3: 'Knowledge Point',
-  ta_table_text4: 'Score',
-  ta_table_text5: 'Difficulty',
-  ta_table_text6: 'Identification Degree',
-  ta_table_text7: 'Class',
-  ta_table_text8: 'Grade',
-  ta_table_text9: 'District',
-  ta_table_text10: 'High Grouping',
-  ta_table_text11: 'Low Grouping',
-
-  ta_table_tip1: '* Unit:Scoring Rate',
-  ta_table_tip2: '* R1-R6:Ranking Range',
-
-  // KnowledgeAnalysis.vue
-  ka_title1: 'Proportion of Knowledge Points',
-  ka_title2: 'Cognitive Hierarchy Distribution',
-  ka_title3: 'Score Rate Relation Table',
-  ka_title4: 'Statistics of Score Rate of Knowledge Points',
-  ka_title5: 'Knowledge Point Score Details',
-  ka_title6: 'Relation Table of Error Rate',
-
-  ka_text1: 'Current knowledge block',
-  ka_text2: 'Current knowledge point',
-
-  ka_chart_text1: 'Switch histogram',
-  ka_chart_text2: 'Switch radar',
-
-  ka_radar_text1: 'Knowledge',
-  ka_radar_text2: 'Application',
-  ka_radar_text3: 'Analysis',
-  ka_radar_text4: 'Synthesis',
-  ka_radar_text5: 'Evaluation',
-  ka_radar_text6: 'Understanding',
-
-  ka_table_text1: 'Knowledge Point',
-  ka_table_text2: 'Cognitive Level',
-  ka_table_text3: 'Grade Scoring Rate',
-  ka_table_text4: 'Score',
-  ka_table_text5: 'Score in this section',
-  ka_table_text6: 'Scoring rate',
-  ka_table_text7: 'Question Number Involved',
-  ka_table_text8: 'Average Score Rate',
-  ka_table_text9: 'Number of Wrong Questions',
-  ka_table_text10: 'RH Number of Wrong Questions',
-  ka_table_text11: 'RL Number of Wrong Questions',
-
-  ka_tip1: '* RH: High partition / RL:Low partition',
-
-  // QuestionList.vue
-  ql_text1: 'Total Score',
-  ql_text2: 'Single Question',
-  ql_text3: 'Multiple Question',
-  ql_text4: 'Judgement Question',
-  ql_text5: 'Complete Question',
-  ql_text6: 'Subjective Question',
-  ql_text7: 'Compose Question',
-  ql_text8: ' points',
-  ql_text9: 'View Answer and Explain',
-  ql_text10: 'View Data Analysis',
-  ql_text11: 'Answer',
-  ql_text12: 'Explain',
-  ql_text13: '      Return'
+    // EvaluationList.vue
+    text1: 'Summary of previous examinations',
+    text2: 'times',
+    text3: 'More screening',
+    text4: 'Enter test name...',
+    text5: 'Current filter criteria',
+    text6: 'Current quantity',
+    text7: 'Participants',
+    text8: 'Date',
+    text9: 'None',
+    condition1: 'Period',
+    condition2: 'Grade',
+    condition3: 'Term',
+    condition4: 'Type',
+    condition5: 'Range',
+    condition6: 'Feedback',
+    condition7: 'Subject',
+
+    // Base Info
+    base_name: 'Name',
+    base_class: 'Class',
+    base_id: 'Seat Number',
+    base_score: 'Score',
+
+    // ExamList.vue
+    newest: 'Newest Exams',
+    more: 'View More ',
+
+    // index.vue
+    module1: 'Score Analysis',
+    module2: 'Point Analysis',
+    module3: 'Item Analysis',
+    module4: 'Knowledge Point Mastery',
+    module5: 'Cognitive level Mastery',
+    exportTable: 'Export Table',
+    currentSubject: 'Current Subject',
+
+    // AchievementAnalysis.vue
+    ach_title1: 'Pass Rate Statistics',
+    ach_title2: 'Equipartition Analysis',
+    ach_title3: 'Entry Number Statistics',
+    ach_title4: 'Entry State Statistics',
+    ach_title5: 'Entry Rate Statistics',
+    ach_title6: 'Early Warning Statistics',
+    ach_title7: 'Ranking Statistics',
+    ach_title8: 'Equipartition Analysis',
+    ach_text1: 'Pass Rate',
+    ach_text2: 'Grade',
+    ach_text3: 'District',
+    ach_text4: 'Class Average',
+    ach_text5: 'School Average',
+    ach_text6: 'District Average',
+    ach_text7: 'Total Number',
+    ach_text8: 'Entry Number',
+    ach_text9: 'Entry Rate',
+    ach_text10: 'Currently Class',
+    ach_text11: 'Total Number',
+    ach_text12: 'Back',
+
+    ach_table_text1: 'Grade Ranking',
+    ach_table_text2: 'Total Score',
+    ach_table_text3: 'Average Score',
+    ach_table_text4: 'Standard Deviation',
+    ach_table_text5: 'Super Average Rate',
+    ach_table_text6: 'Incoming Line',
+    ach_table_text7: 'Planted Line',
+    ach_table_text8: 'Class Ranking',
+    ach_table_text9: 'Grade Ranking',
+    ach_table_text10: 'District Ranking',
+    ach_table_text11: 'Class PR Ranking',
+    ach_table_text12: 'Grade PR Ranking',
+    ach_table_text13: 'District PR Ranking',
+    ach_table_text14: 'Progressive Class',
+    ach_table_text15: 'Step Back Class',
+    ach_table_text16: 'Stable Class',
+
+    ach_chart_text1: 'Sort by',
+    ach_chart_text2: 'default sort',
+    ach_chart_text3: 'score from high to low',
+    ach_chart_text4: 'score from low to high',
+
+    // ScatterAnalysis.vue
+    sca_title1: 'Learning Ability Distribution',
+    sca_title2: 'Student Stability Table',
+    sca_text1: 'Region',
+    sca_text2: 'Regional Characteristics',
+    sca_text3: 'Number',
+    sca_text4: 'Student',
+    sca_text5: 'good learning, high stability',
+    sca_text6: 'carelessness and carelessness lead to mistakes',
+    sca_text7: 'learning is still stable and requires further study',
+    sca_text8: 'occasional carelessness, insufficient preparation',
+    sca_text9: 'learning is not enough, more efforts are needed',
+    sca_text10: 'learning is very unstable, not fully prepared for the exam',
+    sca_chart_text1: 'Pass Rate',
+    sca_chart_text2: 'Stability',
+    sca_table_text1: 'Correct Answers Number',
+    sca_table_text2: 'Wrong Answers Number',
+    sca_table_text3: 'Be Tried No.',
+    sca_table_text4: 'Be Careful No.',
+    sca_table_text5: 'Stability',
+    sca_table_text6: 'Drop Area',
+
+    // TestAnalysis.vue
+    ta_title1: 'Test Scatter Analysis',
+    ta_title2: 'Score Rate of Single Question in Grade',
+    ta_title3: 'Test Analysis Summary Table',
+    ta_title4: 'Test Score Rate Table',
+
+    ta_text1: 'Region',
+    ta_text2: 'Regional Characteristics',
+    ta_text3: 'Number',
+    ta_text4: 'Question No.',
+    ta_text5: 'Selected No.',
+    ta_text6: 'The test questions are quite appropriate, which can be used to distinguish different students',
+    ta_text7: 'The test questions may contain heterogeneous components and need local correction',
+    ta_text8: 'The difficulty of test questions is high, which is suitable for distinguishing students with high achievement',
+    ta_text9: 'The test questions contain heterogeneous components, which may be wrong in data or unclear in meaning, and must be modified',
+
+    ta_chart_text1: 'Question',
+    ta_chart_text2: 'Correct Answer Rate',
+    ta_chart_text3: 'Stability',
+    ta_chart_text4: 'Class Scoring Rate',
+    ta_chart_text5: 'Grade Scoring Rate',
+    ta_chart_text6: 'District Scoring Rate',
+
+    ta_table_text1: 'No.',
+    ta_table_text2: 'Type',
+    ta_table_text3: 'Knowledge Point',
+    ta_table_text4: 'Score',
+    ta_table_text5: 'Difficulty',
+    ta_table_text6: 'Identification Degree',
+    ta_table_text7: 'Class',
+    ta_table_text8: 'Grade',
+    ta_table_text9: 'District',
+    ta_table_text10: 'High Grouping',
+    ta_table_text11: 'Low Grouping',
+
+    ta_table_tip1: '* Unit:Scoring Rate',
+    ta_table_tip2: '* R1-R6:Ranking Range',
+
+    // KnowledgeAnalysis.vue
+    ka_title1: 'Proportion of Knowledge Points',
+    ka_title2: 'Cognitive Hierarchy Distribution',
+    ka_title3: 'Score Rate Relation Table',
+    ka_title4: 'Statistics of Score Rate of Knowledge Points',
+    ka_title5: 'Knowledge Point Score Details',
+    ka_title6: 'Relation Table of Error Rate',
+
+    ka_text1: 'Current knowledge block',
+    ka_text2: 'Current knowledge point',
+
+    ka_chart_text1: 'Switch histogram',
+    ka_chart_text2: 'Switch radar',
+
+    ka_radar_text1: 'Knowledge',
+    ka_radar_text2: 'Application',
+    ka_radar_text3: 'Analysis',
+    ka_radar_text4: 'Synthesis',
+    ka_radar_text5: 'Evaluation',
+    ka_radar_text6: 'Understanding',
+
+    ka_table_text1: 'Knowledge Point',
+    ka_table_text2: 'Cognitive Level',
+    ka_table_text3: 'Grade Scoring Rate',
+    ka_table_text4: 'Score',
+    ka_table_text5: 'Score in this section',
+    ka_table_text6: 'Scoring rate',
+    ka_table_text7: 'Question Number Involved',
+    ka_table_text8: 'Average Score Rate',
+    ka_table_text9: 'Number of Wrong Questions',
+    ka_table_text10: 'RH Number of Wrong Questions',
+    ka_table_text11: 'RL Number of Wrong Questions',
+
+    ka_tip1: '* RH: High partition / RL:Low partition',
+
+    // LevelAnalysis.vue
+    le_title1: 'Proportion of Cognitive Level',
+    le_title2: 'Cognitive Hierarchy Distribution',
+    le_title3: 'Score Rate Relation Table',
+    le_title4: 'Statistics of Score Rate of cognitive level',
+    le_title5: 'Cognitive Level Score Details',
+    le_title6: 'Relation Table of Error Rate',
+
+    // QuestionList.vue
+    ql_text1: 'Total Score',
+    ql_text2: 'Single Question',
+    ql_text3: 'Multiple Question',
+    ql_text4: 'Judgement Question',
+    ql_text5: 'Complete Question',
+    ql_text6: 'Subjective Question',
+    ql_text7: 'Compose Question',
+    ql_text8: ' points',
+    ql_text9: 'View Answer and Explain',
+    ql_text10: 'View Data Analysis',
+    ql_text11: 'Answer',
+    ql_text12: 'Explain',
+    ql_text13: '      Return'
 
 }

+ 199 - 189
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js

@@ -1,192 +1,202 @@
 export default {
-  // EvaluationList.vue
-  text1: '历次考试汇总',
-  text2: '次数',
-  text3: '更多筛选',
-  text4: '输入考试名称...',
-  text5: '当前筛选条件',
-  text6: '当前数量',
-  text7: '参与人数',
-  text8: '考试日期',
-  text9: '无',
-  condition1: '关注学段',
-  condition2: '关注年级',
-  condition3: '学年期',
-  condition4: '考试类型',
-  condition5: '考试范围',
-  condition6: '反馈类型',
-  condition7: '考试学科',
-
-  // Base Info
-  base_name: '姓名',
-  base_class: '班级',
-  base_id: '座号',
-  base_score: '分数',
-
-  // ExamList.vue
-  newest: '最新测验',
-  more: '查看更多',
-
-  // index.vue
-  module1: '成绩分析',
-  module2: '落点分析',
-  module3: '试题分析',
-  module4: '知识点掌握',
-  exportTable: '导出表格',
-  currentSubject: '当前科目',
-
-  // AchievementAnalysis.vue
-  ach_title1: '及格率统计',
-  ach_title2: '均分分析',
-  ach_title3: '进线人数统计',
-  ach_title4: '进线情况统计',
-  ach_title5: '进线率统计',
-  ach_title6: '预警统计',
-  ach_title7: '排名统计(PR/成绩)',
-  ach_title8: '均分分析',
-  ach_text1: '及格率',
-  ach_text2: '年级',
-  ach_text3: '区级',
-  ach_text4: '班级平均分',
-  ach_text5: '校级平均分',
-  ach_text6: '区级平均分',
-  ach_text7: '班级总人数',
-  ach_text8: '进线总人数',
-  ach_text9: '进线率',
-  ach_text10: '当前班级',
-  ach_text11: '总人数',
-  ach_text12: '返回',
-
-  ach_table_text1: '年级排名',
-  ach_table_text2: '总分',
-  ach_table_text3: '平均分',
-  ach_table_text4: '标准差',
-  ach_table_text5: '超均率',
-  ach_table_text6: '进线',
-  ach_table_text7: '踩线',
-  ach_table_text8: '班级排名',
-  ach_table_text9: '年级排名',
-  ach_table_text10: '区级排名',
-  ach_table_text11: '班级PR排名',
-  ach_table_text12: '年级PR排名',
-  ach_table_text13: '区级PR排名',
-  ach_table_text14: '进步班级',
-  ach_table_text15: '退步班级',
-  ach_table_text16: '稳定班级',
-
-  ach_chart_text1: '排序方式',
-  ach_chart_text2: '默认排序',
-  ach_chart_text3: '分数从高到低',
-  ach_chart_text4: '分数从低到高',
-
-  // ScatterAnalysis.vue
-  sca_title1: '学生学习力分布',
-  sca_title2: '学生稳定度统计表',
-  sca_text1: '区域',
-  sca_text2: '区域特性',
-  sca_text3: '所占人数',
-  sca_text4: '学生',
-  sca_text5: '学习良好,稳定度高',
-  sca_text6: '粗心大意,不细心造成错误',
-  sca_text7: '学习尚且稳定,需要再用功',
-  sca_text8: '偶尔粗心,准备不够充分',
-  sca_text9: '学习不够充分,需要更加努力',
-  sca_text10: '学习极不稳定, 对考试没有充分准备',
-  sca_chart_text1: '通过率',
-  sca_chart_text2: '稳定度',
-  sca_table_text1: '答对题数',
-  sca_table_text2: '答错题数',
-  sca_table_text3: '应努力题号',
-  sca_table_text4: '需小心题号',
-  sca_table_text5: '稳定程度',
-  sca_table_text6: '落点区域',
-
-  // TestAnalysis.vue
-  ta_title1: '试题落点分析',
-  ta_title2: '年级单题得分率统计',
-  ta_title3: '试题分析总表',
-  ta_title4: '试题得分率表',
-
-  ta_text1: '区域',
-  ta_text2: '区域特性',
-  ta_text3: '题数',
-  ta_text4: '题目编号',
-  ta_text5: '所选题号',
-  ta_text6: '试题相当适当,可以用来区分学生的不同',
-  ta_text7: '试题可能含有异质成分在内,需要局部修正',
-  ta_text8: '试题困难度较高,适合区分高成就者学生',
-  ta_text9: '试题含有异质成分,可能数据错误或者题意不清,必须加以修改',
-
-  ta_chart_text1: '试题',
-  ta_chart_text2: '答对率',
-  ta_chart_text3: '稳定度',
-  ta_chart_text4: '班级得分率',
-  ta_chart_text5: '年级得分率',
-  ta_chart_text6: '区级得分率',
-
-  ta_table_text1: '题号',
-  ta_table_text2: '题型',
-  ta_table_text3: '知识点',
-  ta_table_text4: '配分',
-  ta_table_text5: '难易度',
-  ta_table_text6: '鉴别度',
-  ta_table_text7: '班级',
-  ta_table_text8: '年级',
-  ta_table_text9: '区级',
-  ta_table_text10: '高分组',
-  ta_table_text11: '低分组',
-
-  ta_table_tip1: '* 单位:得分率',
-  ta_table_tip2: '* R1-R6:排名区间',
-
-  // KnowledgeAnalysis.vue
-  ka_title1: '知识点占比',
-  ka_title2: '认知层次分布',
-  ka_title3: '得分率关系表',
-  ka_title4: '知识点得分率统计',
-  ka_title5: '知识点得分详情',
-  ka_title6: '错题率关系表',
-
-  ka_text1: '当前知识块',
-  ka_text2: '当前知识点',
-
-  ka_chart_text1: '切换柱状图',
-  ka_chart_text2: '切换雷达图',
-
-  ka_radar_text1: '知识',
-  ka_radar_text2: '应用',
-  ka_radar_text3: '分析',
-  ka_radar_text4: '综合',
-  ka_radar_text5: '评鉴',
-  ka_radar_text6: '理解',
-
-  ka_table_text1: '知识点',
-  ka_table_text2: '认知层次',
-  ka_table_text3: '年级得分率',
-  ka_table_text4: '分值',
-  ka_table_text5: '本节得分',
-  ka_table_text6: '得分率',
-  ka_table_text7: '涉及题号',
-  ka_table_text8: '平均得分率',
-  ka_table_text9: '错题人数',
-  ka_table_text10: 'RH错题人数',
-  ka_table_text11: 'RL错题人数',
-
-  ka_tip1: '* RH:高分区段 / RL:低分区段',
-
-  // QuestionList.vue
-  ql_text1: '试卷总分',
-  ql_text2: '单项选择题',
-  ql_text3: '多项选择器',
-  ql_text4: '判断题',
-  ql_text5: '填空题',
-  ql_text6: '问答题',
-  ql_text7: '综合题',
-  ql_text8: '分',
-  ql_text9: '查看答案与解析',
-  ql_text10: '查看数据分析',
-  ql_text11: '参考答案',
-  ql_text12: '答题解析',
-  ql_text13: '返回'
+    // EvaluationList.vue
+    text1: '历次考试汇总',
+    text2: '次数',
+    text3: '更多筛选',
+    text4: '输入考试名称...',
+    text5: '当前筛选条件',
+    text6: '当前数量',
+    text7: '参与人数',
+    text8: '考试日期',
+    text9: '无',
+    condition1: '关注学段',
+    condition2: '关注年级',
+    condition3: '学年期',
+    condition4: '考试类型',
+    condition5: '考试范围',
+    condition6: '反馈类型',
+    condition7: '考试学科',
+
+    // Base Info
+    base_name: '姓名',
+    base_class: '班级',
+    base_id: '座号',
+    base_score: '分数',
+
+    // ExamList.vue
+    newest: '最新测验',
+    more: '查看更多',
+
+    // index.vue
+    module1: '成绩分析',
+    module2: '落点分析',
+    module3: '试题分析',
+    module4: '知识点掌握',
+    module5: '认知层次掌握',
+    exportTable: '导出表格',
+    currentSubject: '当前科目',
+
+    // AchievementAnalysis.vue
+    ach_title1: '及格率统计',
+    ach_title2: '均分分析',
+    ach_title3: '进线人数统计',
+    ach_title4: '进线情况统计',
+    ach_title5: '进线率统计',
+    ach_title6: '预警统计',
+    ach_title7: '排名统计(PR/成绩)',
+    ach_title8: '均分分析',
+    ach_text1: '及格率',
+    ach_text2: '年级',
+    ach_text3: '区级',
+    ach_text4: '班级平均分',
+    ach_text5: '校级平均分',
+    ach_text6: '区级平均分',
+    ach_text7: '班级总人数',
+    ach_text8: '进线总人数',
+    ach_text9: '进线率',
+    ach_text10: '当前班级',
+    ach_text11: '总人数',
+    ach_text12: '返回',
+
+    ach_table_text1: '年级排名',
+    ach_table_text2: '总分',
+    ach_table_text3: '平均分',
+    ach_table_text4: '标准差',
+    ach_table_text5: '超均率',
+    ach_table_text6: '进线',
+    ach_table_text7: '踩线',
+    ach_table_text8: '班级排名',
+    ach_table_text9: '年级排名',
+    ach_table_text10: '区级排名',
+    ach_table_text11: '班级PR排名',
+    ach_table_text12: '年级PR排名',
+    ach_table_text13: '区级PR排名',
+    ach_table_text14: '进步班级',
+    ach_table_text15: '退步班级',
+    ach_table_text16: '稳定班级',
+
+    ach_chart_text1: '排序方式',
+    ach_chart_text2: '默认排序',
+    ach_chart_text3: '分数从高到低',
+    ach_chart_text4: '分数从低到高',
+
+    // ScatterAnalysis.vue
+    sca_title1: '学生学习力分布',
+    sca_title2: '学生稳定度统计表',
+    sca_text1: '区域',
+    sca_text2: '区域特性',
+    sca_text3: '所占人数',
+    sca_text4: '学生',
+    sca_text5: '学习良好,稳定度高',
+    sca_text6: '粗心大意,不细心造成错误',
+    sca_text7: '学习尚且稳定,需要再用功',
+    sca_text8: '偶尔粗心,准备不够充分',
+    sca_text9: '学习不够充分,需要更加努力',
+    sca_text10: '学习极不稳定, 对考试没有充分准备',
+    sca_chart_text1: '通过率',
+    sca_chart_text2: '稳定度',
+    sca_table_text1: '答对题数',
+    sca_table_text2: '答错题数',
+    sca_table_text3: '应努力题号',
+    sca_table_text4: '需小心题号',
+    sca_table_text5: '稳定程度',
+    sca_table_text6: '落点区域',
+
+    // TestAnalysis.vue
+    ta_title1: '试题落点分析',
+    ta_title2: '年级单题得分率统计',
+    ta_title3: '试题分析总表',
+    ta_title4: '试题得分率表',
+
+    ta_text1: '区域',
+    ta_text2: '区域特性',
+    ta_text3: '题数',
+    ta_text4: '题目编号',
+    ta_text5: '所选题号',
+    ta_text6: '试题相当适当,可以用来区分学生的不同',
+    ta_text7: '试题可能含有异质成分在内,需要局部修正',
+    ta_text8: '试题困难度较高,适合区分高成就者学生',
+    ta_text9: '试题含有异质成分,可能数据错误或者题意不清,必须加以修改',
+
+    ta_chart_text1: '试题',
+    ta_chart_text2: '答对率',
+    ta_chart_text3: '稳定度',
+    ta_chart_text4: '班级得分率',
+    ta_chart_text5: '年级得分率',
+    ta_chart_text6: '区级得分率',
+
+    ta_table_text1: '题号',
+    ta_table_text2: '题型',
+    ta_table_text3: '知识点',
+    ta_table_text4: '配分',
+    ta_table_text5: '难易度',
+    ta_table_text6: '鉴别度',
+    ta_table_text7: '班级',
+    ta_table_text8: '年级',
+    ta_table_text9: '区级',
+    ta_table_text10: '高分组',
+    ta_table_text11: '低分组',
+
+    ta_table_tip1: '* 单位:得分率',
+    ta_table_tip2: '* R1-R6:排名区间',
+
+    // KnowledgeAnalysis.vue
+    ka_title1: '知识点占比',
+    ka_title2: '认知层次分布',
+    ka_title3: '得分率关系表',
+    ka_title4: '知识点得分率统计',
+    ka_title5: '知识点得分详情',
+    ka_title6: '错题率关系表',
+
+    ka_text1: '当前知识块',
+    ka_text2: '当前知识点',
+
+    ka_chart_text1: '切换柱状图',
+    ka_chart_text2: '切换雷达图',
+
+    ka_radar_text1: '知识',
+    ka_radar_text2: '应用',
+    ka_radar_text3: '分析',
+    ka_radar_text4: '综合',
+    ka_radar_text5: '评鉴',
+    ka_radar_text6: '理解',
+
+    ka_table_text1: '知识点',
+    ka_table_text2: '认知层次',
+    ka_table_text3: '年级得分率',
+    ka_table_text4: '分值',
+    ka_table_text5: '本节得分',
+    ka_table_text6: '得分率',
+    ka_table_text7: '涉及题号',
+    ka_table_text8: '平均得分率',
+    ka_table_text9: '错题人数',
+    ka_table_text10: 'RH错题人数',
+    ka_table_text11: 'RL错题人数',
+
+    ka_tip1: '* RH:高分区段 / RL:低分区段',
+
+    // LevelAnalysis.vue
+    le_title1: '认知层次占比',
+    le_title2: '认知层次分布',
+    le_title3: '得分率关系表',
+    le_title4: '认知层次得分率统计',
+    le_title5: '认知层次得分详情',
+    le_title6: '错题率关系表',
+
+
+    // QuestionList.vue
+    ql_text1: '试卷总分',
+    ql_text2: '单项选择题',
+    ql_text3: '多项选择器',
+    ql_text4: '判断题',
+    ql_text5: '填空题',
+    ql_text6: '问答题',
+    ql_text7: '综合题',
+    ql_text8: '分',
+    ql_text9: '查看答案与解析',
+    ql_text10: '查看数据分析',
+    ql_text11: '参考答案',
+    ql_text12: '答题解析',
+    ql_text13: '返回'
 
 }

+ 198 - 189
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js

@@ -1,192 +1,201 @@
 export default {
-  // EvaluationList.vue
-  text1: '歷次考試匯總',
-  text2: '次數',
-  text3: '更多篩選',
-  text4: '輸入考試名稱...',
-  text5: '當前篩選條件',
-  text6: '當前條數',
-  text7: '參與人數',
-  text8: '考試日期',
-  text9: '無',
-  condition1: '關註學段',
-  condition2: '關註年級',
-  condition3: '學年期',
-  condition4: '考試類型',
-  condition5: '考試範圍',
-  condition6: '反饋類型',
-  condition7: '考試學科',
-
-  // Base Info
-  base_name: '姓名',
-  base_class: '班级',
-  base_id: '座號',
-  base_score: '分數',
-
-  // ExamList.vue
-  newest: '最新測驗',
-  more: '查看更多',
-
-  // index.vue
-  module1: '成績分析',
-  module2: '落点分析',
-  module3: '試題分析',
-  module4: '知識点掌握',
-  exportTable: '匯出表格',
-  currentSubject: '當前科目',
-
-  // AchievementAnalysis.vue
-  ach_title1: '及格率統計',
-  ach_title2: '均分分析',
-  ach_title3: '進線人數統計',
-  ach_title4: '進線情况統計',
-  ach_title5: '進線率統計',
-  ach_title6: '預警統計',
-  ach_title7: '排名統計(PR/ 成績)',
-  ach_title8: '均分分析',
-  ach_text1: '及格率',
-  ach_text2: '年级',
-  ach_text3: '區級',
-  ach_text4: '班級平均分',
-  ach_text5: '校級平均分',
-  ach_text6: '區級平均分',
-  ach_text7: '班級總人數',
-  ach_text8: '進線總人數',
-  ach_text9: '進線率',
-  ach_text10: '當前班級',
-  ach_text11: '總人數',
-  ach_text12: '返回',
-
-  ach_table_text1: '年級排名',
-  ach_table_text2: '總分',
-  ach_table_text3: '平均分',
-  ach_table_text4: '標準差',
-  ach_table_text5: '超均率',
-  ach_table_text6: '進線',
-  ach_table_text7: '踩線',
-  ach_table_text8: '班級排名',
-  ach_table_text9: '年級排名',
-  ach_table_text10: '區級排名',
-  ach_table_text11: '班級PR排名',
-  ach_table_text12: '年級PR排名',
-  ach_table_text13: '區級PR排名',
-  ach_table_text14: '進步班級',
-  ach_table_text15: '退步班級',
-  ach_table_text16: '穩定班級',
-
-  ach_chart_text1: '排序方式',
-  ach_chart_text2: '默認排序',
-  ach_chart_text3: '分數從高到低',
-  ach_chart_text4: '分數從低到高',
-
-  // ScatterAnalysis.vue
-  sca_title1: '學生學習力分佈',
-  sca_title2: '學生穩定度統計表',
-  sca_text1: '區域',
-  sca_text2: '區域特性',
-  sca_text3: '所占人數',
-  sca_text4: '學生',
-  sca_text5: '學習良好,穩定度高',
-  sca_text6: '粗心大意,不細心造成錯誤',
-  sca_text7: '學習尚且穩定,需要再用功',
-  sca_text8: '偶爾粗心,準備不够充分',
-  sca_text9: '學習不够充分,需要更加努力',
-  sca_text10: '學習極不穩定,對考試沒有充分準備',
-  sca_chart_text1: '通過率',
-  sca_chart_text2: '穩定度',
-  sca_table_text1: '答對題數',
-  sca_table_text2: '答錯題數',
-  sca_table_text3: '應努力題號',
-  sca_table_text4: '需小心題號',
-  sca_table_text5: '穩定程度',
-  sca_table_text6: '落點區域',
-
-  // TestAnalysis.vue
-  ta_title1: '試題落點分析',
-  ta_title2: '年級單題得分率統計',
-  ta_title3: '試題分析總表',
-  ta_title4: '試題得分率錶',
-
-  ta_text1: '區域',
-  ta_text2: '區域特性',
-  ta_text3: '題數',
-  ta_text4: '題目編號',
-  ta_text5: '所選題號',
-  ta_text6: '試題相當適當,可以用來區分學生的不同',
-  ta_text7: '試題可能含有異質成分在內,需要局部修正',
-  ta_text8: '試題困難度較高,適合區分高成就者學生',
-  ta_text9: '試題含有異質成分,可能數據錯誤或者題意不清,必須加以修改',
-
-  ta_chart_text1: '試題',
-  ta_chart_text2: '答對率',
-  ta_chart_text3: '穩定度',
-  ta_chart_text4: '班級得分率',
-  ta_chart_text5: '年級得分率',
-  ta_chart_text6: '區級得分率',
-
-  ta_table_text1: '題號',
-  ta_table_text2: '題型',
-  ta_table_text3: '知識點',
-  ta_table_text4: '配分',
-  ta_table_text5: '難易度',
-  ta_table_text6: '鑒別度',
-  ta_table_text7: '班級',
-  ta_table_text8: '年級',
-  ta_table_text9: '區級',
-  ta_table_text10: '高分组',
-  ta_table_text11: '低分组',
-
-  ta_table_tip1: '* 組織:得分率',
-  ta_table_tip2: '* R1-R6:排名區間',
-
-  // KnowledgeAnalysis.vue
-  ka_title1: '知識點占比',
-  ka_title2: '認知層次分佈',
-  ka_title3: '得分率關係表',
-  ka_title4: '知識點得分率統計',
-  ka_title5: '知識點得分詳情',
-  ka_title6: '錯題率關係表',
-
-  ka_text1: '當前知識塊',
-  ka_text2: '當前知識點',
-
-  ka_chart_text1: '切換柱狀圖',
-  ka_chart_text2: '切換雷达圖',
-
-  ka_radar_text1: '知識',
-  ka_radar_text2: '應用',
-  ka_radar_text3: '分析',
-  ka_radar_text4: '綜合',
-  ka_radar_text5: '評鑒',
-  ka_radar_text6: '理解',
-
-  ka_table_text1: '知識點',
-  ka_table_text2: '認知層次',
-  ka_table_text3: '年級得分率',
-  ka_table_text4: '分值',
-  ka_table_text5: '本節得分',
-  ka_table_text6: '得分率',
-  ka_table_text7: '涉及題號',
-  ka_table_text8: '平均得分率',
-  ka_table_text9: '錯題人數',
-  ka_table_text10: 'RH錯題人數',
-  ka_table_text11: 'RL錯題人數',
-
-  ka_tip1: '* RH:高分區段 / RL:低分區段',
-
-  // QuestionList.vue
-  ql_text1: '試卷總分',
-  ql_text2: '單項選擇題',
-  ql_text3: '多項選擇題',
-  ql_text4: '判斷題',
-  ql_text5: '填空題',
-  ql_text6: '問答題',
-  ql_text7: '綜合題',
-  ql_text8: '分',
-  ql_text9: '查看答案與解析',
-  ql_text10: '查看資料分析',
-  ql_text11: '參考答案',
-  ql_text12: '答題解析',
-  ql_text13: '返回'
+    // EvaluationList.vue
+    text1: '歷次考試匯總',
+    text2: '次數',
+    text3: '更多篩選',
+    text4: '輸入考試名稱...',
+    text5: '當前篩選條件',
+    text6: '當前條數',
+    text7: '參與人數',
+    text8: '考試日期',
+    text9: '無',
+    condition1: '關註學段',
+    condition2: '關註年級',
+    condition3: '學年期',
+    condition4: '考試類型',
+    condition5: '考試範圍',
+    condition6: '反饋類型',
+    condition7: '考試學科',
+
+    // Base Info
+    base_name: '姓名',
+    base_class: '班级',
+    base_id: '座號',
+    base_score: '分數',
+
+    // ExamList.vue
+    newest: '最新測驗',
+    more: '查看更多',
+
+    // index.vue
+    module1: '成績分析',
+    module2: '落点分析',
+    module3: '試題分析',
+    module4: '知識点掌握',
+    module5: '認知層次掌握',
+    exportTable: '匯出表格',
+    currentSubject: '當前科目',
+
+    // AchievementAnalysis.vue
+    ach_title1: '及格率統計',
+    ach_title2: '均分分析',
+    ach_title3: '進線人數統計',
+    ach_title4: '進線情况統計',
+    ach_title5: '進線率統計',
+    ach_title6: '預警統計',
+    ach_title7: '排名統計(PR/ 成績)',
+    ach_title8: '均分分析',
+    ach_text1: '及格率',
+    ach_text2: '年级',
+    ach_text3: '區級',
+    ach_text4: '班級平均分',
+    ach_text5: '校級平均分',
+    ach_text6: '區級平均分',
+    ach_text7: '班級總人數',
+    ach_text8: '進線總人數',
+    ach_text9: '進線率',
+    ach_text10: '當前班級',
+    ach_text11: '總人數',
+    ach_text12: '返回',
+
+    ach_table_text1: '年級排名',
+    ach_table_text2: '總分',
+    ach_table_text3: '平均分',
+    ach_table_text4: '標準差',
+    ach_table_text5: '超均率',
+    ach_table_text6: '進線',
+    ach_table_text7: '踩線',
+    ach_table_text8: '班級排名',
+    ach_table_text9: '年級排名',
+    ach_table_text10: '區級排名',
+    ach_table_text11: '班級PR排名',
+    ach_table_text12: '年級PR排名',
+    ach_table_text13: '區級PR排名',
+    ach_table_text14: '進步班級',
+    ach_table_text15: '退步班級',
+    ach_table_text16: '穩定班級',
+
+    ach_chart_text1: '排序方式',
+    ach_chart_text2: '默認排序',
+    ach_chart_text3: '分數從高到低',
+    ach_chart_text4: '分數從低到高',
+
+    // ScatterAnalysis.vue
+    sca_title1: '學生學習力分佈',
+    sca_title2: '學生穩定度統計表',
+    sca_text1: '區域',
+    sca_text2: '區域特性',
+    sca_text3: '所占人數',
+    sca_text4: '學生',
+    sca_text5: '學習良好,穩定度高',
+    sca_text6: '粗心大意,不細心造成錯誤',
+    sca_text7: '學習尚且穩定,需要再用功',
+    sca_text8: '偶爾粗心,準備不够充分',
+    sca_text9: '學習不够充分,需要更加努力',
+    sca_text10: '學習極不穩定,對考試沒有充分準備',
+    sca_chart_text1: '通過率',
+    sca_chart_text2: '穩定度',
+    sca_table_text1: '答對題數',
+    sca_table_text2: '答錯題數',
+    sca_table_text3: '應努力題號',
+    sca_table_text4: '需小心題號',
+    sca_table_text5: '穩定程度',
+    sca_table_text6: '落點區域',
+
+    // TestAnalysis.vue
+    ta_title1: '試題落點分析',
+    ta_title2: '年級單題得分率統計',
+    ta_title3: '試題分析總表',
+    ta_title4: '試題得分率錶',
+
+    ta_text1: '區域',
+    ta_text2: '區域特性',
+    ta_text3: '題數',
+    ta_text4: '題目編號',
+    ta_text5: '所選題號',
+    ta_text6: '試題相當適當,可以用來區分學生的不同',
+    ta_text7: '試題可能含有異質成分在內,需要局部修正',
+    ta_text8: '試題困難度較高,適合區分高成就者學生',
+    ta_text9: '試題含有異質成分,可能數據錯誤或者題意不清,必須加以修改',
+
+    ta_chart_text1: '試題',
+    ta_chart_text2: '答對率',
+    ta_chart_text3: '穩定度',
+    ta_chart_text4: '班級得分率',
+    ta_chart_text5: '年級得分率',
+    ta_chart_text6: '區級得分率',
+
+    ta_table_text1: '題號',
+    ta_table_text2: '題型',
+    ta_table_text3: '知識點',
+    ta_table_text4: '配分',
+    ta_table_text5: '難易度',
+    ta_table_text6: '鑒別度',
+    ta_table_text7: '班級',
+    ta_table_text8: '年級',
+    ta_table_text9: '區級',
+    ta_table_text10: '高分组',
+    ta_table_text11: '低分组',
+
+    ta_table_tip1: '* 組織:得分率',
+    ta_table_tip2: '* R1-R6:排名區間',
+
+    // KnowledgeAnalysis.vue
+    ka_title1: '知識點占比',
+    ka_title2: '認知層次分佈',
+    ka_title3: '得分率關係表',
+    ka_title4: '知識點得分率統計',
+    ka_title5: '知識點得分詳情',
+    ka_title6: '錯題率關係表',
+
+    ka_text1: '當前知識塊',
+    ka_text2: '當前知識點',
+
+    ka_chart_text1: '切換柱狀圖',
+    ka_chart_text2: '切換雷达圖',
+
+    ka_radar_text1: '知識',
+    ka_radar_text2: '應用',
+    ka_radar_text3: '分析',
+    ka_radar_text4: '綜合',
+    ka_radar_text5: '評鑒',
+    ka_radar_text6: '理解',
+
+    ka_table_text1: '知識點',
+    ka_table_text2: '認知層次',
+    ka_table_text3: '年級得分率',
+    ka_table_text4: '分值',
+    ka_table_text5: '本節得分',
+    ka_table_text6: '得分率',
+    ka_table_text7: '涉及題號',
+    ka_table_text8: '平均得分率',
+    ka_table_text9: '錯題人數',
+    ka_table_text10: 'RH錯題人數',
+    ka_table_text11: 'RL錯題人數',
+
+    ka_tip1: '* RH:高分區段 / RL:低分區段',
+
+    // LevelAnalysis.vue
+    le_title1: '認知層次占比',
+    le_title2: '认知层次分布',
+    le_title3: '得分率關系表',
+    le_title4: '認知層次得分率統計',
+    le_title5: '認知層次得分詳情',
+    le_title6: '錯題率關系表',
+
+    // QuestionList.vue
+    ql_text1: '試卷總分',
+    ql_text2: '單項選擇題',
+    ql_text3: '多項選擇題',
+    ql_text4: '判斷題',
+    ql_text5: '填空題',
+    ql_text6: '問答題',
+    ql_text7: '綜合題',
+    ql_text8: '分',
+    ql_text9: '查看答案與解析',
+    ql_text10: '查看資料分析',
+    ql_text11: '參考答案',
+    ql_text12: '答題解析',
+    ql_text13: '返回'
 
 }

+ 172 - 184
TEAMModelOS/ClientApp/src/router/routes.js

@@ -5,193 +5,181 @@ import Main from '@/components/public/main'
 // import { resolve } from 'url'
 
 export const routes = [
-    { path: '*', redirect: '/404' },
-    { name: '404', path: '/404', component: resolve => require(['@/view/404'], resolve) },
-    { name: 'index', path: '', redirect: '/home' },
-    { name: 'selectModule', path: '/selectModule', redirect: '/home' },
-    { name: 'login', path: '/login', component: Login },
-    { name: 'ServerSideLogin', path: '/serverside/login', component: ServerSideLogin },
-    { name: 'smartschooldashboard', path: '/smartschooldashboard', component: resolve => require(['@/view/smartschooldashboard/Index.vue'], resolve) },
-    { name: 'smartclassdashboard', path: '/smartclassdashboard', component: resolve => require(['@/view/smartclassdashboard/Index.vue'], resolve) },
-    { name: 'embedschooldashboard', path: '/embedclassdashboard/:schoolshortcode', component: resolve => require(['@/view/smartclassdashboard/Index.vue'], resolve) }, // IES 呼叫專用
-    { // 共用組件試用
-        path: '/teachermgmt',
-        component: Main,
+  { path: '*', redirect: '/404' },
+  { name: '404', path: '/404', component: resolve => require(['@/view/404'], resolve) },
+  { name: 'index', path: '', redirect: '/home' },
+  { name: 'selectModule', path: '/selectModule', redirect: '/home' },
+  { name: 'login', path: '/login', component: Login },
+  { name: 'ServerSideLogin', path: '/serverside/login', component: ServerSideLogin },
+  { name: 'smartschooldashboard', path: '/smartschooldashboard', component: resolve => require(['@/view/smartschooldashboard/Index.vue'], resolve) },
+  { name: 'smartclassdashboard', path: '/smartclassdashboard', component: resolve => require(['@/view/smartclassdashboard/Index.vue'], resolve) },
+  { name: 'embedschooldashboard', path: '/embedclassdashboard/:schoolshortcode', component: resolve => require(['@/view/smartclassdashboard/Index.vue'], resolve) }, // IES 呼叫專用
+  { // 共用組件試用
+    path: '/teachermgmt',
+    component: Main,
+    children: [
+      {
+        path: '/',
+        component: () => import('@/view/teachermgmt/Index.vue')
+      }
+    ]
+  },
+
+  // 学生账号管理
+  {
+    path: '/studentAccount',
+    component: resolve => require(['@/view/student-account/Index.vue'], resolve)
+  },
+
+  // 整合功能
+  {
+    name: 'home',
+    path: '/home',
+    redirect: 'totalIndex',
+    component: resolve => require(['@/view/Home'], resolve),
+    children: [
+
+      {
+        name: 'totalIndex',
+        path: '/home',
+        component: resolve => require(['@/view/student-analysis/total-analysis/EvaluationList/EvaluationList.vue'], resolve),
+      },
+      {
+        name: 'total',
+        path: 'total',
+        component: resolve => require(['@/view/student-analysis/total-analysis/index.vue'], resolve),
         children: [
-            {
-                path: '/',
-                component: () => import('@/view/teachermgmt/Index.vue')
-            }
+          {
+            path: '/total',
+            component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue'], resolve)
+          },
+          {
+            path: '/total/evaluationList',
+            component: resolve => require(['@/view/student-analysis/total-analysis/EvaluationList/EvaluationList.vue'], resolve)
+          },
+          {
+            path: '/total/achievement',
+            component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue'], resolve)
+          },
+          {
+            path: '/total/achievement/entryTables',
+            component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue'], resolve)
+          },
+          {
+            name: 'earlyWarning',
+            path: '/total/achievement/earlyWarning',
+            component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue'], resolve)
+          },
+          {
+            path: '/total/scatter',
+            component: resolve => require(['@/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue'], resolve)
+          },
+          {
+            path: '/total/knowledge',
+            component: resolve => require(['@/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue'], resolve)
+          },
+          {
+            path: '/total/knowledge/details',
+            component: resolve => require(['@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'], resolve)
+          },
+          {
+            path: '/total/cognitionLevel',
+            component: resolve => require(['@/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue'], resolve)
+          },
+          {
+            path: '/total/cognitionLevel/details',
+            component: resolve => require(['@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'], resolve)
+          },
+          {
+            path: '/total/test',
+            component: resolve => require(['@/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue'], resolve)
+          },
+          {
+            path: '/total/questionList',
+            component: resolve => require(['@/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue'], resolve)
+          }
         ]
-    },
-    
-    // 学生账号管理
-    {
-        path: '/studentAccount',
+      },
+      {
+        name: 'system',
+        path: 'system',
+        component: resolve => require(['@/view/school-mgmt/SystemSetting/SystemSetting.vue'], resolve)
+      },
+      {
+        name: 'classroom',
+        path: 'classroom',
+        component: resolve => require(['@/view/school-mgmt/ClassroomSetting/ClassroomSetting.vue'], resolve)
+      },
+      {
+        name: 'studentAccount',
+        path: 'studentAccount',
         component: resolve => require(['@/view/student-account/Index.vue'], resolve)
-    },
-
-    // 整合功能
-    {
-        name: 'home',
-        path: '/home',
-        redirect: 'totalIndex',
-        component: resolve => require(['@/view/Home'], resolve),
+      },
+      {
+        path: 'evaluation',
+        name: 'evaluation',
+        redirect: '/home/evaluation/createTest',
+        component: resolve => require(['@/view/evaluation/index/index.vue'], resolve),
         children: [
-
-            {
-                name: 'totalIndex',
-                path: '/home',
-                component: resolve => require(['@/view/student-analysis/total-analysis/EvaluationList/EvaluationList.vue'], resolve),
-            },
-            {
-                name: 'total',
-                path: 'total',
-                component: resolve => require(['@/view/student-analysis/total-analysis/index.vue'], resolve),
-                children: [
-                    {
-                        path: '/total',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue'], resolve)
-                    },
-                    {
-                        path: '/total/evaluationList',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/EvaluationList/EvaluationList.vue'], resolve)
-                    },
-                    {
-                        path: '/total/achievement',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue'], resolve)
-                    },
-                    {
-                        path: '/total/achievement/entryTables',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue'], resolve)
-                    },
-                    {
-                        name: 'earlyWarning',
-                        path: '/total/achievement/earlyWarning',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue'], resolve)
-                    },
-                    {
-                        path: '/total/scatter',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue'], resolve)
-                    },
-                    {
-                        path: '/total/knowledge',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue'], resolve)
-                    },
-                    {
-                        path: '/total/knowledge/details',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'], resolve)
-                    },
-                    {
-                        path: '/total/cognitionLevel',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue'], resolve)
-                    },
-                    {
-                        path: '/total/cognitionLevel/details',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'], resolve)
-                    },
-                    {
-                        path: '/total/test',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue'], resolve)
-                    },
-                    {
-                        path: '/total/questionList',
-                        component: resolve => require(['@/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue'], resolve)
-                    }
-                ]
-            },
-            {
-                name: 'schoolIndex',
-                path: 'school',
-                component: resolve => require(['@/view/school-mgmt/Index.vue'], resolve),
-                children: [
-                    {
-                        name: 'school',
-                        path: 'school',
-                        redirect: 'system'
-                    },
-                    {
-                        name: 'system',
-                        path: 'system',
-                        component: resolve => require(['@/view/school-mgmt/SystemSetting/SystemSetting.vue'], resolve)
-                    },
-                    {
-                        name: 'classroom',
-                        path: 'classroom',
-                        component: resolve => require(['@/view/school-mgmt/ClassroomSetting/ClassroomSetting.vue'], resolve)
-                    }
-                ]
-            },
-            {
-                name: 'studentAccount',
-                path: 'studentAccount',
-                component: resolve => require(['@/view/student-account/Index.vue'], resolve)
-            },
-            {
-                path: 'evaluation',
-                name: 'evaluation',
-                redirect: '/home/evaluation/createTest',
-                component: resolve => require(['@/view/evaluation/index/index.vue'], resolve),
-                children: [
-                    {
-                        path: 'createExercises',
-                        name: 'createExercises',
-                        component: resolve => require(['@/view/evaluation/index/CreateExercises.vue'], resolve)
-                    },
-                    {
-                        path: 'exercisesList',
-                        name: 'exercisesList',
-                        component: resolve => require(['@/view/evaluation/index/ExercisesList.vue'], resolve)
-                    },
-                    {
-                        path: 'testPaper',
-                        name: 'testPaper',
-                        component: resolve => require(['@/view/evaluation/index/TestPaper.vue'], resolve)
-                    },
-                    {
-                        path: 'createTest',
-                        name: 'createTest',
-                        component: resolve => require(['@/view/evaluation/index/CreateTest.vue'], resolve)
-                    },
-                    {
-                        path: 'testPaperList',
-                        name: 'testPaperList',
-                        component: resolve => require(['@/view/evaluation/index/TestPaperList.vue'], resolve)
-                    },
-                    {
-                        path: 'createCompose',
-                        name: 'createCompose',
-                        component: resolve => require(['@/view/evaluation/index/CreateCompose.vue'], resolve)
-                    },
-                    {
-                        path: 'editChild',
-                        name: 'editChild',
-                        component: resolve => require(['@/view/evaluation/index/EditChild.vue'], resolve)
-                    }
-                ]
-            },
-            {
-                path: 'courseManage',
-                name: 'courseManage',
-                component: resolve => require(['@/view/coursemgmt/CourseManage.vue'], resolve)
-            },
-            // 新课纲管理
-            {
-                path: 'syllabus',
-                name: 'syllabus',
-                component: resolve => require(['@/view/syllabus/newSyllabus/Index.vue'], resolve)
-            },
-            {
-                path: 'teachcontent',
-                name: 'teachcontent',
-                component: resolve => require(['@/view/teachcontent/index.vue'], resolve)
-            },
-            // 知识点管理
-            {
-                path: 'knowledge',
-                name: 'knowledge',
-                component: resolve => require(['@/view/knowledge-point/index/Index.vue'], resolve)
-            }
+          {
+            path: 'createExercises',
+            name: 'createExercises',
+            component: resolve => require(['@/view/evaluation/index/CreateExercises.vue'], resolve)
+          },
+          {
+            path: 'exercisesList',
+            name: 'exercisesList',
+            component: resolve => require(['@/view/evaluation/index/ExercisesList.vue'], resolve)
+          },
+          {
+            path: 'testPaper',
+            name: 'testPaper',
+            component: resolve => require(['@/view/evaluation/index/TestPaper.vue'], resolve)
+          },
+          {
+            path: 'createTest',
+            name: 'createTest',
+            component: resolve => require(['@/view/evaluation/index/CreateTest.vue'], resolve)
+          },
+          {
+            path: 'testPaperList',
+            name: 'testPaperList',
+            component: resolve => require(['@/view/evaluation/index/TestPaperList.vue'], resolve)
+          },
+          {
+            path: 'createCompose',
+            name: 'createCompose',
+            component: resolve => require(['@/view/evaluation/index/CreateCompose.vue'], resolve)
+          },
+          {
+            path: 'editChild',
+            name: 'editChild',
+            component: resolve => require(['@/view/evaluation/index/EditChild.vue'], resolve)
+          }
         ]
-    }
+      },
+      {
+        path: 'courseManage',
+        name: 'courseManage',
+        component: resolve => require(['@/view/coursemgmt/CourseManage.vue'], resolve)
+      },
+      // 新课纲管理
+      {
+        path: 'syllabus',
+        name: 'syllabus',
+        component: resolve => require(['@/view/syllabus/newSyllabus/Index.vue'], resolve)
+      },
+      {
+        path: 'teachcontent',
+        name: 'teachcontent',
+        component: resolve => require(['@/view/teachcontent/index.vue'], resolve)
+      },
+      // 知识点管理
+      {
+        path: 'knowledge',
+        name: 'knowledge',
+        component: resolve => require(['@/view/knowledge-point/index/Index.vue'], resolve)
+      }
+    ]
+  }
 ]

+ 1 - 1
TEAMModelOS/ClientApp/src/static/examList.json

@@ -2,7 +2,7 @@
   {
     "id": "4",
     "name": "成都新川外国语学校2019年8月诊断测验",
-    "joinNum": "2580",
+    "joinNum": "2072",
     "date": "2019-08-15",
     "examType": "模拟测验",
     "examArea": "校内测验",

File diff suppressed because it is too large
+ 1389 - 0
TEAMModelOS/ClientApp/src/static/questions.json


+ 3 - 3
TEAMModelOS/ClientApp/src/store/module/totalAnalysis.js

@@ -2,14 +2,14 @@
 import apiTools from '@/api'
 import tools from '@/utils/public.js'
 import examList from '@/static/examList.json' // 模拟评测数据
-import questions from '@/static/questionList.json' // 模拟题目数据
+import questions from '@/static/questions.json' // 模拟题目数据
 import filter from '@/static/filter.json' // 模拟题目数据
 
 export default {
     state: {
         scrollTop: 0,
         examList: examList,
-        questions: questions,
+        questions: questions.item,
         filterData: filter,
         subjectList: [],
 
@@ -173,7 +173,7 @@ export default {
         getKnowledgeData(context) {
             let params = {
                 //Subject: context.state.currentSubject
-                Subject: 'Subject_Math'
+                Subject: '数学'
             }
             return new Promise((r, j) => {
                 if (context.state.knowledgeData) {

+ 0 - 12
TEAMModelOS/ClientApp/src/utils/azure-storage-blob.js

@@ -6,19 +6,15 @@
     if (typeof define === 'function' && define.amd) {
 
         // AMD
-
-        console.log('AMD')
         //define(['jquery', 'underscore'], factory);
     } else if (typeof exports === 'object') {
 
         // Node, CommonJS之类的
-        console.log('Node, CommonJS之类的')
         //module.exports = factory(require('jquery'), require('underscore'));
 
     } else {
 
         // 浏览器全局变量(root 即 window)
-        console.log('浏览器全局变量(root 即 window)')
         //root.returnExports = factory(root.jQuery, root._);
 
     }
@@ -17176,8 +17172,6 @@
      * @returns {Promise<BlobUploadCommonResponse>}
      */
     function uploadBrowserDataToBlockBlob(aborter, browserData, blockBlobURL, options) {
-        console.log('----------')
-        console.log(options)
         return __awaiter(this, void 0, void 0, function () {
             var browserBlob;
             return __generator(this, function (_a) {
@@ -17247,11 +17241,8 @@
                         if (size <= options.maxSingleShotSize) {
                             return [2 /*return*/, blockBlobURL.upload(aborter, blobFactory(0, size), size, options)];
                         }
-                        console.log(options)
                         let test = 10 * 1024 * 1024
                         numBlocks = Math.floor((size - 1) / test) + 1;
-                        //numBlocks = Math.floor((size - 1) / options.blockSize) + 1;
-                        console.log(numBlocks)
                         if (numBlocks > BLOCK_BLOB_MAX_BLOCKS) {
                             throw new RangeError("The buffer's size is too big or the BlockSize is too small;" +
                                 ("the number of blocks must be <= " + BLOCK_BLOB_MAX_BLOCKS));
@@ -17294,9 +17285,6 @@
                         for (i = 0; i < numBlocks; i++) {
                             _loop_1(i);
                         }
-                        
-                        console.log('blockList')
-                        console.log(blockList.length)
                         return [4 /*yield*/, batch.do()];
                     case 1:
                         _a.sent();

+ 1 - 1
TEAMModelOS/ClientApp/src/view/coursemgmt/CourseSyllabus.vue

@@ -27,7 +27,7 @@
         <div slot="left" class="demo-split-pane" style="padding-top:15px;">
           <vuescroll>
             <Collapse simple accordion @on-change="getVolumeCode" v-show="volumes.length > 0">
-              <Panel v-for="(item,index) in volumes" :name="item.volumeCode" :key="index">
+              <Panel v-for="(item,index) in volumes" :name="item.volumeCode" :key="index"> 
                 {{item.volumeName}}
                 <div slot="content">
                   <Tree ref="syllabusTree" :data="syllabus" show-checkbox multiple @on-check-change="getSelectSyllabus($event,index)"></Tree>

+ 3 - 2
TEAMModelOS/ClientApp/src/view/evaluation/index/ExercisesList.vue

@@ -648,8 +648,9 @@
 
         },
         mounted() {
-            this.getStandardList()
-            this.getSchoolPoints()
+          //this.getStandardList()
+          this.list = questions.result.data
+            //this.getSchoolPoints()
             // this.getAllPoints();
         },
         computed: {

+ 65 - 57
TEAMModelOS/ClientApp/src/view/student-account/Index.less

@@ -8,74 +8,82 @@
 @second-fontSize:16px;
 
 .sc {
-    &-container {
-        width: 100%;
-        height: 100%;
-        background-color: @first-bgColor;
-        padding-top: 10px;
+  &-container {
+    width: 100%;
+    height: 100%;
+    background-color: @first-bgColor;
+    padding-top: 10px;
+
+    .item-tools .ivu-icon {
+      cursor: pointer;
+
+      &:first-child {
+        margin-right: 20px;
+      }
     }
+  }
 
-    &-menu {
-        height: 45px;
-        width: ~"calc(100%-50px)";
-        width: ~"-webkit-calc(100%-50px)";
-        width: ~"-moz-calc(100%-50px)";
-        border-bottom: 1px solid @borderColor;
-        /*border-top: 1px solid @borderColor;*/
-        padding: 0px 35px 0px 15px;
-        /*margin-left: 35px;*/
-        box-sizing: content-box;
-        -webkit-box-sizing: content-box;
-        -moz-box-sizing: content-box;
-        background-color: @second-bgColor;
+  &-menu {
+    height: 45px;
+    width: ~"calc(100%-50px)";
+    width: ~"-webkit-calc(100%-50px)";
+    width: ~"-moz-calc(100%-50px)";
+    border-bottom: 1px solid @borderColor;
+    /*border-top: 1px solid @borderColor;*/
+    padding: 0px 35px 0px 15px;
+    /*margin-left: 35px;*/
+    box-sizing: content-box;
+    -webkit-box-sizing: content-box;
+    -moz-box-sizing: content-box;
+    background-color: @second-bgColor;
 
-        &-left {
-            float: left;
-            line-height: 45px;
-            height: 45px;
-            width: 49%;
-        }
+    &-left {
+      float: left;
+      line-height: 45px;
+      height: 45px;
+      width: 49%;
+    }
 
-        &-right {
-            float: right;
-            line-height: 45px;
-            height: 45px;
-            width: 50%;
+    &-right {
+      float: right;
+      line-height: 45px;
+      height: 45px;
+      width: 50%;
 
-            ul {
-                list-style: none;
-                color: @second-textColor;
-                width: 100%;
+      ul {
+        list-style: none;
+        color: @second-textColor;
+        width: 100%;
 
-                li {
-                    height: 45px;
-                    line-height: 45px;
-                    display: inline-block;
-                    margin-left: 30px;
-                    float: right;
-                    cursor: pointer;
-                }
+        li {
+          height: 45px;
+          line-height: 45px;
+          display: inline-block;
+          margin-left: 30px;
+          float: right;
+          cursor: pointer;
+        }
 
-                span {
-                    margin-left: 8px;
-                    display: inline-block;
-                }
-            }
+        span {
+          margin-left: 8px;
+          display: inline-block;
         }
+      }
     }
+  }
 
-    &-content {
-        width: 100%;
-        height: ~"calc(100% - 80px)";
-        /*padding-left: 35px;*/
-    }
+  &-content {
+    width: 100%;
+    height: ~"calc(100% - 80px)";
+    /*padding-left: 35px;*/
+  }
 
-    &-text-no-select {
-        -webkit-user-select: none;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        user-select: none;
-    }
+  &-text-no-select {
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+  }
 }
 
 .item-tools{

+ 1 - 6
TEAMModelOS/ClientApp/src/view/student-account/IndexIview.less

@@ -91,12 +91,7 @@
 th[rowspan="1"] {
     display: none;
 }
-.item-tools .ivu-icon{
-    cursor:pointer;
-    &:first-child{
-        margin-right:20px;
-    }
-}
+
 .ivu-table-tip td{
     background:#383838;
 }

+ 8 - 6
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue

@@ -215,12 +215,14 @@
                         textStyle: {
                             color: '#fff'
                         },
-                        //formatter: function (params) {
-                        //    let name = echartData[params[0].dataIndex].name
-                        //    return name + '<br>' + params[0].marker + that.$t('totalAnalysis.ach_table_text2') + ':' + params[0].data + '<br>' + params[1].marker + that.$t('totalAnalysis.ach_text4') + ':' +
-                        //        params[1].data + '<br>' + params[2].marker + that.$t('totalAnalysis.ach_text5') + ':' + params[2].data + '<br>' +
-                        //        params[3].marker + that.$t('totalAnalysis.ach_text6') + ':' + params[3].data
-                        //}
+                        formatter: function (params) {
+                            let name = echartData[params[0].dataIndex].name
+                            let result = name
+                            for (let i = 0; i < params.length; i++) {
+                                result += '<br>' + params[i].marker + params[i].seriesName + ':' + params[i].data
+                            }
+                            return result
+                        }
                     },
                     grid: {
                         show: false,

+ 2 - 1
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/EvaluationList.css

@@ -3,7 +3,8 @@
     width: 100%;
     color: #e4eadb;
     padding: 20px 50px;
-    user-select:none;
+    user-select: none;
+    font-family: '微軟正黑體', 'Heiti TC' !important;
 }
     .evaluation-list-container .el-title-wrap {
         width: 100%;

+ 2 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue

@@ -2,7 +2,7 @@
     <div class="scatter-container">
         <Row>
             <Col span="12">
-                <span class="component-title">{{$t('totalAnalysis.ka_title1')}}</span>
+                <span class="component-title">{{$t('totalAnalysis.le_title1')}}</span>
                 <BasePie pieId="levelPie"></BasePie>
             </Col>
             <Col span="12" style="position:relative">
@@ -13,7 +13,7 @@
         <Row>
 
             <span class="component-title">
-                {{$t('totalAnalysis.ka_title3')}}
+                {{$t('totalAnalysis.le_title3')}}
                 <!-- 当前知识块 : 全部 -->
                 <!--<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">
                     {{$t('totalAnalysis.ka_text1')}}:{{currentBlock}}

+ 3 - 3
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue

@@ -2,7 +2,7 @@
     <div class="scatter-container">
         <Row>
             <Col span="12">
-                <span class="component-title">{{$t('totalAnalysis.ka_title4')}}</span>
+                <span class="component-title">{{$t('totalAnalysis.le_title4')}}</span>
                 <span class="pie-to-bar" @click="changeRadarOrBar"><Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}</span>
                 <div v-show="!isShowRadar">
                     <BaseDetailBar echartsId="levelDetailBar" :echartData="knowledgeData" @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
@@ -12,7 +12,7 @@
                 </div>
             </Col>
             <Col span="12">
-                <span class="component-title">{{$t('totalAnalysis.ka_title5')}}<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span>
+            <span class="component-title">{{$t('totalAnalysis.le_title5')}}<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span>
                 <div style="padding:0 50px;">
                     <BaseMyTable :columns="detailsColumns" :tableDatas="tableData" ref="detailsTable"></BaseMyTable>
                 </div>
@@ -20,7 +20,7 @@
         </Row>
         <Divider />
         <Row>
-            <span class="component-title">{{$t('totalAnalysis.ka_title6')}}</span>
+            <span class="component-title">{{$t('totalAnalysis.le_title6')}}</span>
             <div style="padding:20px 50px;">
                 <BaseMyTable :columns="tableColumns" :tableDatas="numData" ref="numTable" :tips="$t('totalAnalysis.ka_tip1')"></BaseMyTable>
             </div>

+ 3 - 0
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.css

@@ -152,6 +152,7 @@
 
 .ql-right-box {
     width: 15%;
+    height:100%;
     position:fixed;
     right:20px;
     top:232px;
@@ -167,6 +168,8 @@
 
     .ql-right-box .ql-right-list {
         width: 100%;
+        max-height:70%;
+        overflow-y:scroll;
         padding: 20px;
         margin-top: 20px;
         background: #525252;

+ 84 - 79
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue

@@ -17,8 +17,8 @@
 
                     </div>
                     <div class="item-question-score">
-                        <span class="item-type">{{question.questionType}}</span>
-                        <span class="item-type" style="background: #05b454;">{{question.score}}{{$t('totalAnalysis.ql_text8')}}</span>
+                        <span class="item-type">{{question.type}}</span>
+                        <span class="item-type" style="background: #05b454;">{{question.score || 5}}{{$t('totalAnalysis.ql_text8')}}</span>
                     </div>
                 </div>
                 <div class="item-option-wrap">
@@ -28,7 +28,7 @@
                 </div>
 
                 <!-- 如果是组合题 -->
-                <div v-if="question.children.length">
+                <!--<div v-if="question.children.length">
                     <div v-for="(childQuestion,childIndex) in question.children" :key="childIndex">
                         <div class="item-question" style="margin-top:20px;">
                             <p>{{childIndex+1}} : <span v-html="childQuestion.question"></span></p>
@@ -49,7 +49,7 @@
                             <div v-html="childQuestion.explain"></div>
                         </div>
                     </div>
-                </div>
+                </div>-->
 
                 <Collapse simple @on-change="handleCollapseChange" v-model="activeCollapseIndex">
                     <Panel :name="index+'answer'">
@@ -73,10 +73,10 @@
                             <Table :columns="dataColumns" :data="tableData.filter((item,index2) => index2 === index)"></Table>
                             <Table :columns="optionColumns" :data="optionsData" style="margin-top:20px"></Table>
                             <!-- 每个题目的数据分析折线图 -->
-                            <div class="analysis-charts">
+                            <!--<div class="analysis-charts">
                                 <BaseLine :ids="'myLine' + index" :echartsData="tableData[index]"></BaseLine>
                                 <BaseRateLine :ids="'myRateLine' + index" :echartsData="optionsData"></BaseRateLine>
-                            </div>
+                            </div>-->
                         </div>
                     </Panel>
                 </Collapse>
@@ -90,42 +90,44 @@
                 {{$t('totalAnalysis.ql_text1')}} :<span>100 {{$t('totalAnalysis.ql_text8')}}</span>
             </div>
             <div class="ql-right-list">
-                <div class="ql-right-part" v-if="SingleList.length">
-                    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text2')}}({{sumArr(SingleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                    <div class="ql-right-items">
-                        <span class="ql-right-item" v-for="(item,index) in SingleList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
-                    </div>
-                </div>
-                <div class="ql-right-part" v-if="MultipleList.length">
-                    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text3')}}({{sumArr(MultipleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                    <div class="ql-right-items">
-                        <span class="ql-right-item" v-for="(item,index) in MultipleList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                <vuescroll>
+                    <div class="ql-right-part" v-if="SingleList.length">
+                        <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text2')}}({{sumArr(SingleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+                        <div class="ql-right-items">
+                            <span class="ql-right-item" v-for="(item,index) in SingleList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                        </div>
                     </div>
-                </div>
-                <div class="ql-right-part" v-if="JudgeList.length">
-                    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text4')}}({{sumArr(JudgeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                    <div class="ql-right-items">
-                        <span class="ql-right-item" v-for="(item,index) in JudgeList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                    <div class="ql-right-part" v-if="MultipleList.length">
+                        <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text3')}}({{sumArr(MultipleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+                        <div class="ql-right-items">
+                            <span class="ql-right-item" v-for="(item,index) in MultipleList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                        </div>
                     </div>
-                </div>
-                <div class="ql-right-part" v-if="CompleteList.length">
-                    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text5')}}({{sumArr(CompleteList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                    <div class="ql-right-items">
-                        <span class="ql-right-item" v-for="(item,index) in CompleteList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                    <div class="ql-right-part" v-if="JudgeList.length">
+                        <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text4')}}({{sumArr(JudgeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+                        <div class="ql-right-items">
+                            <span class="ql-right-item" v-for="(item,index) in JudgeList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                        </div>
                     </div>
-                </div>
-                <div class="ql-right-part" v-if="SubjectiveList.length">
-                    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text6')}}({{sumArr(SubjectiveList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                    <div class="ql-right-items">
-                        <span class="ql-right-item" v-for="(item,index) in SubjectiveList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                    <div class="ql-right-part" v-if="CompleteList.length">
+                        <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text5')}}({{sumArr(CompleteList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+                        <div class="ql-right-items">
+                            <span class="ql-right-item" v-for="(item,index) in CompleteList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                        </div>
                     </div>
-                </div>
-                <div class="ql-right-part" v-if="ComposeList.length">
-                    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text7')}}({{sumArr(ComposeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                    <div class="ql-right-items">
-                        <span class="ql-right-item" v-for="(item,index) in ComposeList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                    <div class="ql-right-part" v-if="SubjectiveList.length">
+                        <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text6')}}({{sumArr(SubjectiveList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+                        <div class="ql-right-items">
+                            <span class="ql-right-item" v-for="(item,index) in SubjectiveList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                        </div>
                     </div>
-                </div><div style="margin-top:30px">注:标红题号为班级易错题目</div>
+                    <div class="ql-right-part" v-if="ComposeList.length">
+                        <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text7')}}({{sumArr(ComposeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+                        <div class="ql-right-items">
+                            <span class="ql-right-item" v-for="(item,index) in ComposeList" :key="index" @click="handleItemClick(item,$event)">{{index + 1}}</span>
+                        </div>
+                    </div><div style="margin-top:30px">注:标红题号为班级易错题目</div>
+                </vuescroll>
             </div>
         </div>
     </div>
@@ -134,6 +136,7 @@
 <script>
     import BaseLine from '@/components/student-analysis/total/BaseLine.vue'
     import BaseRateLine from '@/components/student-analysis/total/BaseRateLine.vue'
+    import questions from '@/static/questions.json'
     import { setTimeout } from 'timers'
     export default {
         components: {
@@ -287,7 +290,8 @@
         },
         created() {
             this.rightTableData = this.$store.state.totalAnalysis.classList
-            this.questionList = this.$store.state.totalAnalysis.questions
+            this.questionList = questions.item
+            console.log(this.questionList)
             this.SingleList = this.questionList.filter(item => item.type === 'Single')
             this.MultipleList = this.questionList.filter(item => item.type === 'Multiple')
             this.JudgeList = this.questionList.filter(item => item.type === 'Judge')
@@ -306,43 +310,43 @@
             // console.log(JSON.stringify(testScatter));
 
             // 数据分析表格数据
-            let knowledgeArr = testScatter.map(item => item.tableData)
-            this.tableData = knowledgeArr
+            //let knowledgeArr = testScatter.map(item => item.tableData)
+            //this.tableData = knowledgeArr
 
-            this.optionsData = [
-                {
-                    option: 'A',
-                    isTrue: false,
-                    num: 12,
-                    rate: 40,
-                    PH: 10,
-                    PL: 60
-                },
-                {
-                    option: 'B',
-                    isTrue: false,
-                    num: 6,
-                    rate: 20,
-                    PH: 10,
-                    PL: 23
-                },
-                {
-                    option: 'C',
-                    isTrue: true,
-                    num: 9,
-                    rate: 30,
-                    PH: 70,
-                    PL: 10
-                },
-                {
-                    option: 'D',
-                    isTrue: false,
-                    num: 3,
-                    rate: 10,
-                    PH: 10,
-                    PL: 7
-                }
-            ]
+            //this.optionsData = [
+            //    {
+            //        option: 'A',
+            //        isTrue: false,
+            //        num: 12,
+            //        rate: 40,
+            //        PH: 10,
+            //        PL: 60
+            //    },
+            //    {
+            //        option: 'B',
+            //        isTrue: false,
+            //        num: 6,
+            //        rate: 20,
+            //        PH: 10,
+            //        PL: 23
+            //    },
+            //    {
+            //        option: 'C',
+            //        isTrue: true,
+            //        num: 9,
+            //        rate: 30,
+            //        PH: 70,
+            //        PL: 10
+            //    },
+            //    {
+            //        option: 'D',
+            //        isTrue: false,
+            //        num: 3,
+            //        rate: 10,
+            //        PH: 10,
+            //        PL: 7
+            //    }
+            //]
         },
 
         methods: {
@@ -361,7 +365,7 @@
 
             // 点击右边题序 获取到题目DOM 进行滚动操作
             handleItemClick(item, e) {
-                let parentVm = this.$root.$children[0]
+                let parentVm = this.$parent.$parent.$parent
                 let currentSpan = e.target || e
                 let allList = document.getElementsByClassName('ql-right-item')
                 let questionList = document.getElementsByClassName('ql-item')
@@ -388,7 +392,7 @@
             // 点击返回
             handleBackTo() {
                 this.$refs.btnBack.style.display = 'none'
-                this.$root.$children[0].isShowQuestions = false
+                this.$parent.$parent.$parent.isShowQuestions = false
                 this.$router.back(-1)
             },
 
@@ -411,17 +415,18 @@
 
             // 返回题目区域总分 字符串换算
             sumArr(arr) {
-                return eval(arr.join('+'))
+                //return eval(arr.join('+'))
             }
         },
 
         mounted() {
-            let parentVm = this.$root.$children[0]
+            let parentVm = this.$parent.$parent.$parent
             parentVm.isShowQuestions = true
             let that = this
 
+
             if (this.$route.query.QIndex) {
-                let index = this.$route.query.QIndex - 1
+                let index = +this.$route.query.QIndex - 1
                 let allList = document.getElementsByClassName('ql-right-item')
                 this.handleCollapseChange([index.toString()])
                 this.activeCollapseIndex.push(index + 'answer')

+ 11 - 5
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.css

@@ -21,7 +21,7 @@
 
 
 .scatter-statistics {
-    margin-top:60px;
+    margin-top:100px;
 }
 
 .scatter-container .index-wrap {
@@ -57,10 +57,16 @@
     /*border-bottom:1px solid #595959;*/
 }
 
-    .scatter-statistics .index-box {
-        width:150px;
-        word-break:break-all;
-    }
+.scatter-statistics .index-box {
+    width: 150px;
+    word-break: break-all;
+    text-overflow: -o-ellipsis-lastline;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 3;
+    -webkit-box-orient: vertical;
+}
 
 
     .scatter-statistics .scatter-table-line span {

+ 26 - 23
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue

@@ -18,28 +18,28 @@
                     <span>A</span>
                     <span class="scatter-explain" :title="$t('totalAnalysis.ta_text6')">{{$t('totalAnalysis.ta_text6')}}</span>
                     <span>{{A1List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in A1List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
+                    <div class="index-box"><span v-for="(item,index) in A1List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
                 </div>
                 <Divider />
                 <div class="scatter-table-line">
                     <span>A-</span>
                     <span class="scatter-explain" :title="$t('totalAnalysis.ta_text7')">{{$t('totalAnalysis.ta_text7')}}</span>
                     <span>{{A2List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in A2List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
+                    <div class="index-box"><span v-for="(item,index) in A2List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
                 </div>
                 <Divider />
                 <div class="scatter-table-line">
                     <span>B</span>
                     <span class="scatter-explain" :title="$t('totalAnalysis.ta_text8')">{{$t('totalAnalysis.ta_text8')}}</span>
                     <span>{{B1List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in B1List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
+                    <div class="index-box"><span v-for="(item,index) in B1List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
                 </div>
                 <Divider />
                 <div class="scatter-table-line">
                     <span>B-</span>
                     <span class="scatter-explain" :title="$t('totalAnalysis.ta_text9')">{{$t('totalAnalysis.ta_text9')}}</span>
                     <span>{{B2List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in B2List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
+                    <div class="index-box"><span v-for="(item,index) in B2List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
                 </div>
             </div>
             </Col>
@@ -276,24 +276,27 @@
 
             // 点击落点图某个点事件
             handleItemClick(item) {
-                // console.log(item);
                 let index = item.data[item.data.length - 1]
                 this.currentExerciseIndex = index > 9 ? '' + index : '0' + index
 
-                // 单题得分率联动
-
                 // 题目编号联动
-                //let indexDomList = Array.prototype.slice.call(document.getElementsByClassName('scatter-exercise-index'))
-                //let hignlightIndexDom = indexDomList.filter(item => +item.innerText === +this.currentExerciseIndex)
-                //indexDomList.forEach(item => {
-                //    item.style.background = 'transparent'
-                //})
-                //hignlightIndexDom[0].style.background = '#018b99'
-                //hignlightIndexDom[0].style.borderRadius = '50%'
+                this.$nextTick(() => {
+                    let indexDomList = Array.prototype.slice.call(document.getElementsByClassName('scatter-exercise-index'))
+                    let hignlightIndexDom = indexDomList.filter(item => +item.innerText === +this.currentExerciseIndex)
+                    indexDomList.forEach(item => {
+                        item.style.background = 'transparent'
+                    })
+                    if (hignlightIndexDom.length) {
+                        hignlightIndexDom[0].style.background = '#018b99'
+                        hignlightIndexDom[0].style.borderRadius = '50%'
+                    }
+                })
+                
+                
             },
 
             onIndexClick(item) {
-                this.currentExerciseIndex = +item > 9 ? '' + item : '0' + item
+                this.handleItemClick({ data: [+item] })
             },
 
             handleIndexClick(index) {
@@ -310,10 +313,10 @@
             if (list) {
                 this.renderClassColumns(this.$store.state.totalAnalysis.classExerciseData)
                 this.exerciseIndexList = list.map(item => item.id)
-                this.A1List = list.filter(item => item.areaName === 'A').slice(0,10)
-                this.A2List = list.filter(item => item.areaName === 'A-').slice(0,10)
-                this.B1List = list.filter(item => item.areaName === 'B').slice(0,10)
-                this.B2List = list.filter(item => item.areaName === 'A-').slice(0, 10)
+                this.A1List = list.filter(item => item.areaName === 'A')
+                this.A2List = list.filter(item => item.areaName === 'A-')
+                this.B1List = list.filter(item => item.areaName === 'B')
+                this.B2List = list.filter(item => item.areaName === 'B-')
                 this.tableData = JSON.parse(JSON.stringify(list))
             }
         },
@@ -329,10 +332,10 @@
                 if (!val) return
                 this.renderClassColumns(this.$store.state.totalAnalysis.classExerciseData)
                 this.exerciseIndexList = val.map(item => item.id)
-                this.A1List = val.filter(item => item.areaName === 'A').slice(0,10)
-                this.A2List = val.filter(item => item.areaName === 'A-').slice(0,10)
-                this.B1List = val.filter(item => item.areaName === 'B').slice(0,10)
-                this.B2List = val.filter(item => item.areaName === 'A-').slice(0, 10)
+                this.A1List = val.filter(item => item.areaName === 'A')
+                this.A2List = val.filter(item => item.areaName === 'A-')
+                this.B1List = val.filter(item => item.areaName === 'B')
+                this.B2List = val.filter(item => item.areaName === 'B-')
                 this.tableData = JSON.parse(JSON.stringify(val))
                 
             }

+ 3 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue

@@ -41,7 +41,7 @@
                             <span :class="this.$route.path.indexOf('/total/scatter') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('1')">{{$t('totalAnalysis.module2')}}</span>
                             <span :class="this.$route.path.indexOf('/total/test') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('2')">{{$t('totalAnalysis.module3')}}</span>
                             <span :class="this.$route.path.indexOf('/total/knowledge') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('3')">{{$t('totalAnalysis.module4')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/cognitionLevel') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('4')">认知层次掌握</span>
+                            <span :class="this.$route.path.indexOf('/total/cognitionLevel') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('4')">{{$t('totalAnalysis.module5')}}</span>
                         </div>
                         <span style="float:right;margin-bottom:4px;" v-show="dataSelectIndex !== '0'">
                             <span class="select-title">{{$t('totalAnalysis.currentSubject')}}:</span>
@@ -104,7 +104,7 @@
                     '诊断测验': '#baecff',
                     '全国测验': '#00ff8a'
                 },
-                scrollTopssss: 0
+                scrollTopssss: 0,
             }
         },
         created() {
@@ -264,6 +264,7 @@
         },
         mounted() {
 
+
             let examIndex = this.$route.query.index
 
             // 如果路由跳转到成绩分析页面带有考试序号参数则跳转到当前考试

+ 35 - 17
TEAMModelOS/ClientApp/src/view/teachcontent/index.vue

@@ -26,14 +26,14 @@
       </div>
       <div class="content-file-list-box">
         <div class="content-file-filter">
-          <CheckboxGroup v-model="model" style="display:inline-block;margin-left:38px;margin-top:13px;">
-            <Checkbox :label="item" v-for="(item ,index) in contentTypes[0]" v-show="activeTypeIndex === 1" :class="activeTypeIndex === 1 ? 'animated fadeIn' : 'animated fadeOut'">
+          <CheckboxGroup v-model="model" style="display:inline-block;margin-left:38px;margin-top:13px;" @on-change="filterFileByExtension">
+            <Checkbox :label="item" v-for="(item ,index) in contentTypes[0]" v-if="activeTypeIndex === 1" :class="activeTypeIndex === 1 ? 'animated fadeIn' : 'animated fadeOut'">
               <span>{{item}}</span>
             </Checkbox>
-            <Checkbox :label="item" v-for="(item ,index) in contentTypes[1]" v-show="activeTypeIndex === 2" :class="activeTypeIndex === 2 ? 'animated fadeIn' : 'animated fadeOut'">
+            <Checkbox :label="item" v-for="(item ,index) in contentTypes[1]" v-if="activeTypeIndex === 2" :class="activeTypeIndex === 2 ? 'animated fadeIn' : 'animated fadeOut'">
               <span>{{item}}</span>
             </Checkbox>
-            <Checkbox :label="item" v-for="(item ,index) in contentTypes[2]" v-show="activeTypeIndex === 3" :class="activeTypeIndex === 3 ? 'animated fadeIn' : 'animated fadeOut'">
+            <Checkbox :label="item" v-for="(item ,index) in contentTypes[2]" v-if="activeTypeIndex === 3" :class="activeTypeIndex === 3 ? 'animated fadeIn' : 'animated fadeOut'">
               <span>{{item}}</span>
             </Checkbox>
 
@@ -120,8 +120,8 @@
       <UploadFile @successData="getFileUrl" :uploadUrl="uploadUrl" :pathName="demoLoginInfo.TEAMModelId.replace('#','')" :quality="1"></UploadFile>
     </Modal>
     <Modal v-model="previewStatus"
-           :title="previewFile.fileName" width="800px" class="upload-modal">
-      <video v-if="previewFile.type == 'video'" :src="previewFile.blobUrl+sasString" width="780" controls="controls">
+           :title="previewFile.fileName" width="800px" class="upload-modal" @on-cancel="closePreview">
+      <video v-if="previewFile.type == 'video'" id="previewVideo" :src="previewFile.blobUrl+sasString" width="780" controls="controls">
         您的浏览器不支持 video 标签。
       </video>
       <img v-if="previewFile.type == 'picture'" :src="previewFile.blobUrl+sasString" width="780" style="border-radius:5px;" />
@@ -148,7 +148,8 @@
     },
     data() {
       return {
-        sasString:'',
+        sasString: '',
+        urlString:'',
         showType: true,
         model: [],
         fileColumns: [
@@ -166,7 +167,7 @@
           {
             title: '操作',
             slot: 'action',
-            width: 180,
+            width: 210,
             align: 'center'
           },
           {
@@ -286,15 +287,36 @@
     methods: {
       change() {
 
+      },
+      closePreview() {
+        if (this.previewFile.type == 'video') {
+          var myVideo = document.getElementById('previewVideo')   //获取视频video
+          myVideo.pause();
+        }
       },
       bindKnowledge(index) {
         this.bindStatus = true
       },
+      filterFileByExtension(filter) {
+        console.log(this.model)
+        if (filter.length === 0) {
+          this.fileListShow = this.searchBefore
+        } else {
+          let searchResult = this.searchBefore.filter(item => {
+            return this.model.indexOf(item.extension.toUpperCase()) !== -1
+          })
+
+          this.fileListShow = searchResult
+        }
+      },
       getSasStr() {
         this.$api.uploadFile.getContainerSAS().then(
           (res) => {
             if (res.error == null) {
-              this.sasString = res.result.data
+              this.sasString = res.result.data.SAS
+              this.urlString = res.result.data.Url
+              //this.uploadUrl = 'https://teammodelostest.blob.core.chinacloudapi.cn/spatest/' + this.demoLoginInfo.TEAMModelId.replace('#','')
+              this.uploadUrl = this.urlString + '/' + this.demoLoginInfo.TEAMModelId.replace('#', '')
             } else {
               alert("API error!")
             }
@@ -405,7 +427,7 @@
                 }, 0
               )
             } else {
-              alert('API error!')
+              this.$Message.warning(error.message)
             }
           },
           (err) => {
@@ -418,9 +440,8 @@
           (res) => {
             if (res.error == null) {
               this.$Message.success('文件上传成功!')
-              this.fileListShow.concat (this.uploadFileList)
-              this.fileList.concat (this.uploadFileList)
-              this.activeTypeIndex = 0
+              this.fileList.unshift(...this.uploadFileList)
+              this.selectFileType(this.activeTypeIndex)
               this.uploadFileList = []
             }
           },
@@ -478,13 +499,12 @@
           this.fileListShow = this.fileList;
           this.searchBefore = this.fileList
         } else if (index == 0) {
-          //this.fileListShow.length = 0
-          //this.searchBefore.length = 0;
           this.fileListShow = this.schoolFileList;
           this.searchBefore = this.schoolFileList
         }
       },
       selectFileType(index) {
+        this.model = []
         this.activeTypeIndex = index
         let type = this.contentTypeList[index].type;
         let files = [];
@@ -524,8 +544,6 @@
     },
     mounted() {
       this.findFileList()
-      //this.uploadUrl = '//' + window.location.host + '/api/File/uploadFile';
-      this.uploadUrl = 'https://teammodelostest.blob.core.chinacloudapi.cn/spatest/' + this.demoLoginInfo.TEAMModelId.replace('#','')
       let box = document.getElementsByClassName('content-file-list')
       this.boxWidth = box[0].clientWidth
       Date.prototype.toLocaleString = function () {

+ 1 - 1
TEAMModelOS/Controllers/Analysis/AchievementController.cs

@@ -4,7 +4,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using TEAMModelOS.Model.Evaluation.Models;
+using TEAMModelOS.Service.Model.Evaluation.Models;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;

+ 1 - 1
TEAMModelOS/Controllers/Analysis/ChangeController.cs

@@ -5,7 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using TEAMModelOS.Helper.Common.FileHelper;
-using TEAMModelOS.Model.Evaluation.Models;
+using TEAMModelOS.Service.Model.Evaluation.Models;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper.JsonPath;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;

+ 17 - 24
TEAMModelOS/Controllers/Core/FileController.cs

@@ -1,4 +1,3 @@
-using HiTeachCC.Service.PowerPoint.Interface;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using System;
@@ -14,6 +13,7 @@ using TEAMModelOS.SDK.Helper.Security.AESCrypt;
 using TEAMModelOS.SDK.Module.AzureBlob.Container;
 using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
 using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
+using TEAMModelOS.Service.Services.PowerPoint.Interface;
 
 namespace TEAMModelOS.Controllers.Syllabus
 {
@@ -23,15 +23,11 @@ namespace TEAMModelOS.Controllers.Syllabus
     {
         private readonly IAzureTableDBRepository azureTableDBRepository;
         private readonly IAzureBlobDBRepository _azureBlobDBRepository;
-        private readonly IPowerPointService powerPointService;
-        private readonly IPowerPointService shapeGenerator;
-        public FileController(IAzureTableDBRepository _azureTableDBRepository, IAzureBlobDBRepository azureBlobDBRepository , 
-            IPowerPointService _powerPointService, IPowerPointService _shapeGenerator)
+        public FileController(IAzureTableDBRepository _azureTableDBRepository, IAzureBlobDBRepository azureBlobDBRepository 
+        )
         {
             azureTableDBRepository = _azureTableDBRepository;
             _azureBlobDBRepository = azureBlobDBRepository;
-            powerPointService = _powerPointService;
-            shapeGenerator = _shapeGenerator;
         }
 
 
@@ -135,19 +131,7 @@ namespace TEAMModelOS.Controllers.Syllabus
             }
         }
 
-        /// <summary>
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [HttpPost("UploadDocument")]
-        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
-        public async Task<BaseJosnRPCResponse> UploadDocument([FromForm] IFormFile file)
-        {
-            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
-
-            Dictionary<string, object> model = await shapeGenerator.LoadPresentation(file);
-            return responseBuilder.Data(model).build();
-        }
+      
 
 
 
@@ -201,8 +185,12 @@ namespace TEAMModelOS.Controllers.Syllabus
         public BaseJosnRPCResponse GetContainerSAS(JosnRPCRequest<string> azureBlobSASDto)
         {
             JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
-            string SAS = _azureBlobDBRepository.GetContainerSasUri();
-            return responseBuilder.Data(SAS).build();
+            string Url = _azureBlobDBRepository.GetContainerSasUri().Item1;
+            string SAS = _azureBlobDBRepository.GetContainerSasUri().Item2;
+            return responseBuilder.Data(new Dictionary<string,object> { 
+                { "Url",Url },
+                { "SAS",SAS}
+            }).build();
         }
 
         /// <summary>
@@ -216,8 +204,13 @@ namespace TEAMModelOS.Controllers.Syllabus
             JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
             string azureBlobSAS = azureBlobSASDto.@params;
             string ContainerName = ContainerUrlString(azureBlobSAS);
-            string SAS = _azureBlobDBRepository.GetContainerSasUriRead(ContainerName);
-            return responseBuilder.Data(SAS).build();
+            string Url = _azureBlobDBRepository.GetContainerSasUriRead(ContainerName).Item1;
+            string SAS = _azureBlobDBRepository.GetContainerSasUriRead(ContainerName).Item2;
+
+            return responseBuilder.Data(new Dictionary<string, object> {
+                { "Url",Url },
+                { "SAS",SAS}
+            }).build();
         }
 
 

+ 39 - 2
TEAMModelOS/Controllers/Evaluation/ImportExerciseController.cs

@@ -7,9 +7,11 @@ using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Constant.Common;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.Service.Model.PowerPoint;
 using TEAMModelOS.Service.Models.Evaluation.Models;
 using TEAMModelOS.Service.Services.Evaluation.Implements;
 using TEAMModelOS.Service.Services.Evaluation.Interfaces;
+using TEAMModelOS.Service.Services.PowerPoint.Interface;
 
 namespace TEAMModelOS.Controllers.Evaluation
 {
@@ -19,12 +21,27 @@ namespace TEAMModelOS.Controllers.Evaluation
     {
         private readonly IImportExerciseService importExerciseService;
         private readonly IHtmlAnalyzeService htmlAnalyzeService;
-        public ImportExerciseController(IImportExerciseService _importExerciseService, IHtmlAnalyzeService _htmlAnalyzeService )
+        private readonly IHtexService htexService;
+
+        public ImportExerciseController(IImportExerciseService _importExerciseService, IHtmlAnalyzeService _htmlAnalyzeService , IHtexService _htexService)
         {
             importExerciseService = _importExerciseService;
             htmlAnalyzeService = _htmlAnalyzeService;
+            htexService = _htexService;
         }
+        /// <summary>
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("LoadDoc")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<BaseJosnRPCResponse> LoadDoc([FromForm] IFormFile file)
+        {
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
 
+            Dictionary<string, object> model = await htexService.LoadDoc(file);
+            return responseBuilder.Data(model).build();
+        }
         /// <summary>
         /// docUrl
         /// folder
@@ -32,7 +49,7 @@ namespace TEAMModelOS.Controllers.Evaluation
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
-        [HttpPost("uploadWord")]
+        [HttpPost("UploadWord")]
         [RequestSizeLimit(102_400_000_00)] //最大10000m左右
         public async Task<BaseJosnRPCResponse> UploadWord([FromForm] IFormFile file)
         {
@@ -66,5 +83,25 @@ namespace TEAMModelOS.Controllers.Evaluation
                 return builder.Data(null).build();
             }
         }
+        /// <summary>
+        /// htmlString 
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("HtmlToHtex")]
+        public async Task<BaseJosnRPCResponse> HtmlToHtex(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            bool flag = request.@params.TryGetValue("htmlString", out object htmlString);
+            if (flag && htmlString != null && !string.IsNullOrEmpty(htmlString.ToString()))
+            {
+                Htex exercises = await htexService.AnalyzeHtmlToHtex(htmlString.ToString(), request.lang);
+                return builder.Data(exercises).build();
+            }
+            else
+            {
+                return builder.Data(null).build();
+            }
+        }
     }
 }

+ 12 - 12
TEAMModelOS/Controllers/Syllabus/VolumeController.cs

@@ -34,7 +34,7 @@ namespace TEAMModelOS.Controllers.Syllabus
         /// <param name="request"></param>
         /// <returns></returns>
         [HttpPost("SaveOrUpdate")]
-        public async Task<BaseJosnRPCResponse> SaveOrUpdate(JosnRPCRequest<Volume> request)
+        public async Task<BaseJosnRPCResponse> SaveOrUpdate(JosnRPCRequest<SyllabusVolume> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             if (request.@params.editors != null && request.@params.editors.Length > 5)
@@ -45,7 +45,7 @@ namespace TEAMModelOS.Controllers.Syllabus
             {
                 if (request.@params.type == 0)
                 {
-                    List<Volume> volumesFind = await azureCosmosDBRepository.FindByDict<Volume>(new Dictionary<string, object>() {
+                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
                         { "schoolCode",request.@params.schoolCode},{ "periodCode", request.@params.periodCode},
                         { "subjectCode", request.@params.subjectCode},{ "gradeCode", request.@params.gradeCode},
                         { "semesterCode",request.@params.semesterCode},{ "volumeName",request.@params.volumeName}  ,
@@ -61,7 +61,7 @@ namespace TEAMModelOS.Controllers.Syllabus
                 }
                 else if (request.@params.type == 1)
                 {
-                    List<Volume> volumesFind = await azureCosmosDBRepository.FindByDict<Volume>(new Dictionary<string, object>() {
+                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
                         { "schoolCode",request.@params.schoolCode},{ "periodCode", request.@params.periodCode},
                         { "subjectCode", request.@params.subjectCode},{ "gradeCode", request.@params.gradeCode},
                         { "semesterCode",request.@params.semesterCode},{ "volumeName",request.@params.volumeName},
@@ -87,7 +87,7 @@ namespace TEAMModelOS.Controllers.Syllabus
             else {
                 if (request.@params.type == 0)
                 {
-                    List<Volume> volumesFind = await azureCosmosDBRepository.FindByDict<Volume>(new Dictionary<string, object>() {
+                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
                     { "schoolCode",request.@params.schoolCode},{ "periodCode", request.@params.periodCode},
                         { "subjectCode", request.@params.subjectCode},{ "gradeCode", request.@params.gradeCode},
                         { "semesterCode",request.@params.semesterCode},{ "volumeName",request.@params.volumeName}  ,
@@ -101,7 +101,7 @@ namespace TEAMModelOS.Controllers.Syllabus
                 }
                 else if (request.@params.type == 1)
                 {
-                    List<Volume> volumesFind = await azureCosmosDBRepository.FindByDict<Volume>(new Dictionary<string, object>() {
+                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
                         { "schoolCode",request.@params.schoolCode},{ "periodCode", request.@params.periodCode},
                         { "subjectCode", request.@params.subjectCode},{ "gradeCode", request.@params.gradeCode},
                         { "semesterCode",request.@params.semesterCode},{ "volumeName",request.@params.volumeName},
@@ -120,11 +120,11 @@ namespace TEAMModelOS.Controllers.Syllabus
                 }
 
             }
-            List<Volume> volumes = new List<Volume>
+            List<SyllabusVolume> volumes = new List<SyllabusVolume>
             {
                 request.@params
             };
-            List<Volume> volume = await azureCosmosDBRepository.SaveAll<Volume>(volumes);
+            List<SyllabusVolume> volume = await azureCosmosDBRepository.SaveAll<SyllabusVolume>(volumes);
             return builder.Data(volume.IsEmpty() ? null : volume[0]).build();
         }
         /// <summary>
@@ -133,7 +133,7 @@ namespace TEAMModelOS.Controllers.Syllabus
         /// <param name="request"></param>
         /// <returns></returns>
         [HttpPost("Delete")]
-        public async Task<BaseJosnRPCResponse> Delete(JosnRPCRequest<Volume> request)
+        public async Task<BaseJosnRPCResponse> Delete(JosnRPCRequest<SyllabusVolume> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             bool flag = false;
@@ -142,11 +142,11 @@ namespace TEAMModelOS.Controllers.Syllabus
                 //if (request.@params.type == 0)
                 //{
                     request.@params.status = 0;
-                    List<Volume> volumes = new List<Volume>
+                    List<SyllabusVolume> volumes = new List<SyllabusVolume>
                     {
                         request.@params
                     };
-                    await azureCosmosDBRepository.SaveAll<Volume>(volumes);
+                    await azureCosmosDBRepository.SaveAll<SyllabusVolume>(volumes);
                     flag = true;
                 //}
                 //else
@@ -167,10 +167,10 @@ namespace TEAMModelOS.Controllers.Syllabus
         public async Task<BaseJosnRPCResponse> Find(JosnRPCRequest<Dictionary<string, object>> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            List<Volume> volumes ;
+            List<SyllabusVolume> volumes ;
             if (request.@params.TryGetValue("schoolCode", out _))
             {
-                volumes = await azureCosmosDBRepository.FindByDict<Volume>(request.@params,true);
+                volumes = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(request.@params,true);
             }
             else
             {

+ 62 - 0
TEAMModelOS/JsonFile/Core/BaseDataDefault.json

@@ -120,6 +120,68 @@
     "lang": "zh-TW",
     "name": "中國台灣",
     "alias": "繁體中文",
+    "grades": [
+      {
+        "gradeCode": "1",
+        "gradeName": "一年級",
+        "alias": "小学一年级"
+      },
+      {
+        "gradeCode": "2",
+        "gradeName": "二年級",
+        "alias": "小学二年级"
+      },
+      {
+        "gradeCode": "3",
+        "gradeName": "三年級",
+        "alias": "小学三年级"
+      },
+      {
+        "gradeCode": "4",
+        "gradeName": "四年級",
+        "alias": "小学四年级"
+      },
+      {
+        "gradeCode": "5",
+        "gradeName": "五年級",
+        "alias": "小学五年级"
+      },
+      {
+        "gradeCode": "6",
+        "gradeName": "六年級",
+        "alias": "五四制初中一年级,六三制小学六年级"
+      },
+      {
+        "gradeCode": "7",
+        "gradeName": "七年級",
+        "alias": "五四制初中二年级,六三制初中一年级"
+      },
+      {
+        "gradeCode": "8",
+        "gradeName": "八年級",
+        "alias": "五四制初中三年级,六三制小学二年级"
+      },
+      {
+        "gradeCode": "9",
+        "gradeName": "九年級",
+        "alias": "五四制初中四年级,六三制小学三年级"
+      },
+      {
+        "gradeCode": "10",
+        "gradeName": "十年級",
+        "alias": "高中一年级"
+      },
+      {
+        "gradeCode": "11",
+        "gradeName": "十一年級",
+        "alias": "高中二年级"
+      },
+      {
+        "gradeCode": "12",
+        "gradeName": "十二年級",
+        "alias": "高中三年级"
+      }
+    ],
     "subjects": [
       {
         "subjectCode": "Subject_Chinese",

+ 0 - 5
TEAMModelOS/Startup.cs

@@ -4,8 +4,6 @@ using System.IdentityModel.Tokens.Jwt;
 using System.Linq;
 using System.Reflection;
 using System.Threading.Tasks;
-using HiTeachCC.Service.PowerPoint.Implement;
-using HiTeachCC.Service.PowerPoint.Interface;
 using Microsoft.AspNetCore.Authentication.JwtBearer;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
@@ -16,15 +14,12 @@ using Microsoft.AspNetCore.SpaServices;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
-using Microsoft.IdentityModel.Tokens;
-using Newtonsoft.Json;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 using TEAMModelOS.SDK.Context.Configuration;
 using TEAMModelOS.SDK.Context.Filter;
 using TEAMModelOS.SDK.Extension.JwtAuth;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Configuration;
-using TEAMModelOS.SDK.Module.AzureTable.Configuration;
 using TEAMModelOS.SDK.Module.AzureTable.Implements;
 using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
 using VueCliMiddleware;