Bladeren bron

Merge remote-tracking branch 'origin/develop3.0' into develop3.0

JAELYS 4 jaren geleden
bovenliggende
commit
a0d1b65c0f
75 gewijzigde bestanden met toevoegingen van 409 en 623 verwijderingen
  1. 2 2
      TEAMModelOS.SDK/Extension/DataResult/JsonRequest/AzureJsonRequest.cs
  2. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonRequest/BaseJosnRequest.cs
  3. 2 1
      TEAMModelOS.SDK/Extension/DataResult/JsonRequest/JosnRequest.cs
  4. 6 6
      TEAMModelOS.SDK/Extension/DataResult/JsonRequest/PaginationRequest.cs
  5. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/BaseResponse.cs
  6. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/DataJsonResponse.cs
  7. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/EmptyJosnResponse.cs
  8. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/ErrorJosnResponse.cs
  9. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/ErrorModel.cs
  10. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/JsonRPCResult.cs
  11. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/PageJosnResponse.cs
  12. 2 2
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/PageJsonResult.cs
  13. 2 2
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/ResponseBuilder.cs
  14. 1 1
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/TokenJosnResponse.cs
  15. 2 2
      TEAMModelOS.SDK/Extension/DataResult/JsonResponse/TokenJsonResult.cs
  16. 1 1
      TEAMModelOS.SDK/Extension/DataResult/PageToken/AzurePagination.cs
  17. 1 1
      TEAMModelOS.SDK/Extension/DataResult/PageToken/AzureTableToken.cs
  18. 1 1
      TEAMModelOS.SDK/Extension/DataResult/PageToken/Pagination.cs
  19. 2 2
      TEAMModelOS.SDK/Extension/DataResult/RequestData/AzureTokenRequest.cs
  20. 1 1
      TEAMModelOS.SDK/Extension/DataResult/RequestData/BaseRequest.cs
  21. 2 2
      TEAMModelOS.SDK/Extension/DataResult/RequestData/PaginationRequest.cs
  22. 1 1
      TEAMModelOS.SDK/Module/AzureTable/Configuration/HaBookTableContinuationToken.cs
  23. 1 1
      TEAMModelOS.SDK/Module/AzureTable/Implements/AzureTableDBRepository.cs
  24. 1 1
      TEAMModelOS.SDK/Module/AzureTable/Interfaces/IAzureTableDBRepository.cs
  25. 0 1
      TEAMModelOS.SDK/Module/Cache/CSRedisCacheService.cs
  26. 0 307
      TEAMModelOS.SDK/Module/Cache/RedisCacheService.cs
  27. 8 9
      TEAMModelOS.SDK/TEAMModelOS.SDK.csproj
  28. 12 7
      TEAMModelOS/ClientApp/src/components/learnactivity/ChooseContent.vue
  29. 19 0
      TEAMModelOS/ClientApp/src/components/learnactivity/QuestionList.vue
  30. 3 2
      TEAMModelOS/ClientApp/src/components/syllabus/DragTree.vue
  31. 12 7
      TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue
  32. 11 3
      TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.less
  33. 11 4
      TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.vue
  34. 3 4
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.less
  35. 116 57
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue
  36. 25 7
      TEAMModelOS/ClientApp/src/view/learnactivity/ManualCreate.vue
  37. 1 1
      TEAMModelOS/ClientApp/src/view/newcourse/CourseClassroom.vue
  38. 1 1
      TEAMModelOS/ClientApp/src/view/selfstudy/AnswerRecord.vue
  39. 4 4
      TEAMModelOS/ClientApp/src/view/selfstudy/PassBar.vue
  40. 1 0
      TEAMModelOS/ClientApp/src/view/syllabus/newSyllabus/operation/BaseResource.vue
  41. 1 2
      TEAMModelOS/Controllers/Analysis/AchievementController.cs
  42. 1 2
      TEAMModelOS/Controllers/Analysis/ChangeController.cs
  43. 1 1
      TEAMModelOS/Controllers/Analysis/ClassController.cs
  44. 30 0
      TEAMModelOS/Controllers/BaseController.cs
  45. 1 2
      TEAMModelOS/Controllers/Client/ClientController.cs
  46. 69 7
      TEAMModelOS/Controllers/Core/AuthController.cs
  47. 1 2
      TEAMModelOS/Controllers/Core/BlobController.cs
  48. 1 2
      TEAMModelOS/Controllers/Core/CommonController.cs
  49. 1 2
      TEAMModelOS/Controllers/Core/FileController.cs
  50. 1 2
      TEAMModelOS/Controllers/Core/LoginController.cs
  51. 1 2
      TEAMModelOS/Controllers/Exam/ExamController.cs
  52. 1 2
      TEAMModelOS/Controllers/Exam/ImportExerciseController.cs
  53. 1 2
      TEAMModelOS/Controllers/Exam/PaperController.cs
  54. 1 2
      TEAMModelOS/Controllers/School/ClassRoomController.cs
  55. 1 2
      TEAMModelOS/Controllers/School/ClassStudentController.cs
  56. 1 2
      TEAMModelOS/Controllers/School/CourseController.cs
  57. 1 2
      TEAMModelOS/Controllers/School/SchoolController.cs
  58. 1 2
      TEAMModelOS/Controllers/Student/StudentController.cs
  59. 1 2
      TEAMModelOS/Controllers/Syllabus/ItemInfoController.cs
  60. 1 2
      TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs
  61. 1 2
      TEAMModelOS/Controllers/Syllabus/ResourceController.cs
  62. 1 2
      TEAMModelOS/Controllers/Syllabus/SyllabusController.cs
  63. 1 3
      TEAMModelOS/Controllers/Syllabus/VolumeController.cs
  64. 1 2
      TEAMModelOS/Controllers/Task/HomeworkController.cs
  65. 1 2
      TEAMModelOS/Controllers/Task/LearnController.cs
  66. 1 2
      TEAMModelOS/Controllers/Task/SurveyController.cs
  67. 2 2
      TEAMModelOS/Controllers/Task/VoteController.cs
  68. 1 2
      TEAMModelOS/Controllers/Teacher/CommentController.cs
  69. 2 2
      TEAMModelOS/Controllers/Teacher/SchoolUserController.cs
  70. 1 2
      TEAMModelOS/Controllers/Test/TestAPIController.cs
  71. 1 2
      TEAMModelOS/Controllers/Test/TestController.cs
  72. 0 2
      TEAMModelOS/Startup.cs
  73. 7 2
      TEAMModelOS/TEAMModelOS.csproj
  74. 5 52
      TEAMModelOS/appsettings.Development.json
  75. 4 53
      TEAMModelOS/appsettings.json

+ 2 - 2
TEAMModelOS.SDK/Extension/DataResult/JsonRequest/AzureJsonRequest.cs

@@ -1,9 +1,9 @@
-using TEAMModelOS.SDK.Extension.DataResult.RequestData;
+using TEAMModelOS.SDK;
 using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest
+namespace TEAMModelOS.SDK
 {
     /// <summary>
     /// 

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonRequest/BaseJosnRequest.cs

@@ -1,7 +1,7 @@
 
 using System;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest
+namespace TEAMModelOS.SDK
 {
     
     public abstract class BaseJosnRequest

+ 2 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonRequest/JosnRequest.cs

@@ -3,11 +3,12 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest
+namespace TEAMModelOS.SDK
 {
     
     public class JosnRequest<T>:BaseJosnRequest
     {
+
         public T @params { get; set; }
     }
 }

+ 6 - 6
TEAMModelOS.SDK/Extension/DataResult/JsonRequest/PaginationRequest.cs

@@ -1,15 +1,15 @@
 
 
-using TEAMModelOS.SDK.Extension.DataResult.RequestData;
+using TEAMModelOS.SDK;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest
+namespace TEAMModelOS.SDK
 {
-    public  class PaginationRequest<T> : BaseJosnRequest
+    public  class PaginationJsonRequest<T> : BaseJosnRequest
     {
-        public PaginationRequest()
+        public PaginationJsonRequest()
         {
-            @params = new RequestData.PaginationRequest<T>();
+            @params = new PaginationRequest<T>();
         }
-        public RequestData.PaginationRequest<T> @params { get; set; }
+        public PaginationRequest<T> @params { get; set; }
     }
 }

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/BaseResponse.cs

@@ -1,7 +1,7 @@
 
 using Microsoft.VisualBasic;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
     public class BaseResponse 

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/DataJsonResponse.cs

@@ -3,7 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
     public class DataJsonResponse<T> : BaseResponse

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/EmptyJosnResponse.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     public class EmptyJosnResponse :BaseResponse
     {

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/ErrorJosnResponse.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
 
     public class ErrorJosnResponse : BaseResponse

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/ErrorModel.cs

@@ -2,7 +2,7 @@
 
 using System.Collections.Generic;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
    

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/JsonRPCResult.cs

@@ -3,7 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
     public class JsonRPCResult<T>

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/PageJosnResponse.cs

@@ -3,7 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
     public class PageJosnResponse<T> : BaseResponse

+ 2 - 2
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/PageJsonResult.cs

@@ -1,7 +1,7 @@
-using TEAMModelOS.SDK.Extension.DataResult.PageToken;
+using TEAMModelOS.SDK;
 
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
     public class PageJsonResult<T> : JsonRPCResult<T>

+ 2 - 2
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/ResponseBuilder.cs

@@ -1,10 +1,10 @@
-using TEAMModelOS.SDK.Extension.DataResult.PageToken;
+using TEAMModelOS.SDK;
 
 using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
     public  class ResponseBuilder

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/TokenJosnResponse.cs

@@ -3,7 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
     public class TokenJosnResponse<T>: BaseResponse

+ 2 - 2
TEAMModelOS.SDK/Extension/DataResult/JsonResponse/TokenJsonResult.cs

@@ -1,10 +1,10 @@
-using TEAMModelOS.SDK.Extension.DataResult.PageToken;
+using TEAMModelOS.SDK;
 
 using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
+namespace TEAMModelOS.SDK
 {
     
     public class TokenJsonResult<T> : JsonRPCResult<T>

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/PageToken/AzurePagination.cs

@@ -1,7 +1,7 @@
 
 using System.Collections.Generic;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.PageToken
+namespace TEAMModelOS.SDK
 {
     
     public class AzurePagination<T>

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/PageToken/AzureTableToken.cs

@@ -1,7 +1,7 @@
 
 using System.ComponentModel.DataAnnotations;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.PageToken
+namespace TEAMModelOS.SDK
 {
     
     public class AzureTableToken

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/PageToken/Pagination.cs

@@ -2,7 +2,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.PageToken
+namespace TEAMModelOS.SDK
 {
     
     public class Pagination

+ 2 - 2
TEAMModelOS.SDK/Extension/DataResult/RequestData/AzureTokenRequest.cs

@@ -1,9 +1,9 @@
-using TEAMModelOS.SDK.Extension.DataResult.PageToken;
+using TEAMModelOS.SDK;
 using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.RequestData
+namespace TEAMModelOS.SDK
 {
    public class AzureTokenRequest<T> :BaseRequest
    {

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/RequestData/BaseRequest.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.RequestData
+namespace TEAMModelOS.SDK
 {
     public class BaseRequest
     {

+ 2 - 2
TEAMModelOS.SDK/Extension/DataResult/RequestData/PaginationRequest.cs

@@ -1,6 +1,6 @@
-using TEAMModelOS.SDK.Extension.DataResult.PageToken;
+using TEAMModelOS.SDK;
 
-namespace TEAMModelOS.SDK.Extension.DataResult.RequestData
+namespace TEAMModelOS.SDK
 {
     public class PaginationRequest<T> : BaseRequest
     {

+ 1 - 1
TEAMModelOS.SDK/Module/AzureTable/Configuration/HaBookTableContinuationToken.cs

@@ -2,7 +2,7 @@
 using Microsoft.Azure.Cosmos.Table;
 using System;
 using System.ComponentModel.DataAnnotations;
-using TEAMModelOS.SDK.Extension.DataResult.PageToken;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
 
 namespace TEAMModelOS.SDK.Module.AzureTable.Configuration

+ 1 - 1
TEAMModelOS.SDK/Module/AzureTable/Implements/AzureTableDBRepository.cs

@@ -1,6 +1,6 @@
 using TEAMModelOS.SDK.Module.AzureTable.Configuration;
 using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
-using TEAMModelOS.SDK.Extension.DataResult.PageToken;
+using TEAMModelOS.SDK;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;

+ 1 - 1
TEAMModelOS.SDK/Module/AzureTable/Interfaces/IAzureTableDBRepository.cs

@@ -1,5 +1,5 @@
 using TEAMModelOS.SDK.Module.AzureTable.Configuration;
-using TEAMModelOS.SDK.Extension.DataResult.PageToken;
+using TEAMModelOS.SDK;
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using Microsoft.Azure.Cosmos.Table;

+ 0 - 1
TEAMModelOS.SDK/Module/Cache/CSRedisCacheService.cs

@@ -1,7 +1,6 @@
 using Microsoft.Extensions.Caching.Distributed;
 using Microsoft.Extensions.Caching.Redis;
  
-using StackExchange.Redis;
 using System;
 using System.Collections.Generic;
 using System.Linq;

+ 0 - 307
TEAMModelOS.SDK/Module/Cache/RedisCacheService.cs

@@ -1,307 +0,0 @@
-using Microsoft.Extensions.Caching.Redis;
-using Newtonsoft.Json;
-using StackExchange.Redis;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace TEAMModelOS.SDK.Module.Cache
-{
-    public class RedisCacheService : ICacheService,IDisposable
-    {
-        protected IDatabase _cache;
-
-        private ConnectionMultiplexer _connection;
-
-        private readonly string _instance;
-        public RedisCacheService(RedisCacheOptions options, int database = 0)
-        {
-            _connection = ConnectionMultiplexer.Connect(options.Configuration);
-            _cache = _connection.GetDatabase(database);
-            _instance = options.InstanceName;
-        }
-
-        public string GetKeyForRedis(string key)
-        {
-            return _instance + key;
-        }/// <summary>
-         /// 验证缓存项是否存在
-         /// </summary>
-         /// <param name="key">缓存Key</param>
-         /// <returns></returns>
-        public bool Exists(string key)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-            return _cache.KeyExists(GetKeyForRedis(key));
-        }/// <summary>
-         /// 添加缓存
-         /// </summary>
-         /// <param name="key">缓存Key</param>
-         /// <param name="value">缓存Value</param>
-         /// <returns></returns>
-        public bool Add(string key, object value)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-            return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)));
-        }
-        /// <summary>
-        /// 添加缓存
-        /// </summary>
-        /// <param name="key">缓存Key</param>
-        /// <param name="value">缓存Value</param>
-        /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间,Redis中无效)</param>
-        /// <param name="expiressAbsoulte">绝对过期时长</param>
-        /// <returns></returns>
-        public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-            return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), expiressAbsoulte);
-        }
-        /// <summary>
-        /// 添加缓存
-        /// </summary>
-        /// <param name="key">缓存Key</param>
-        /// <param name="value">缓存Value</param>
-        /// <param name="expiresIn">缓存时长</param>
-        /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间,Redis中无效)</param>
-        /// <returns></returns>
-        public bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-
-
-            return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), expiresIn);
-        }/// <summary>
-         /// 删除缓存
-         /// </summary>
-         /// <param name="key">缓存Key</param>
-         /// <returns></returns>
-        public bool Remove(string key)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-            return _cache.KeyDelete(GetKeyForRedis(key));
-        }
-        /// <summary>
-        /// 批量删除缓存
-        /// </summary>
-        /// <param name="key">缓存Key集合</param>
-        /// <returns></returns>
-        public void RemoveAll(IEnumerable<string> keys)
-        {
-            if (keys == null)
-            {
-                throw new ArgumentNullException(nameof(keys));
-            }
-
-            keys.ToList().ForEach(item => Remove(item));
-        }
-
-
-        /// <summary>
-        /// 获取缓存
-        /// </summary>
-        /// <param name="key">缓存Key</param>
-        /// <returns></returns>
-        public T Get<T>(string key) where T : class
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-
-            var value = _cache.StringGet(GetKeyForRedis(key));
-
-            if (!value.HasValue)
-            {
-                return default(T);
-            }
-
-            return JsonConvert.DeserializeObject<T>(value);
-        }
-
-        /// <summary>
-        /// 获取缓存
-        /// </summary>
-        /// <param name="key">缓存Key</param>
-        /// <returns></returns>
-        public object Get(string key)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-
-            var value = _cache.StringGet(GetKeyForRedis(key));
-
-            if (!value.HasValue)
-            {
-                return null;
-            }
-         
-
-            return JsonConvert.DeserializeObject(value);
-        }   /// <summary>
-            /// 获取缓存集合
-            /// </summary>
-            /// <param name="keys">缓存Key集合</param>
-            /// <returns></returns>
-        public IDictionary<string, object> GetAll(IEnumerable<string> keys)
-        {
-            if (keys == null)
-            {
-                throw new ArgumentNullException(nameof(keys));
-            }
-            var dict = new Dictionary<string, object>();
-
-            keys.ToList().ForEach(item => dict.Add(item, Get(GetKeyForRedis(item))));
-
-            return dict;
-        }
-
-        /// <summary>
-        /// 修改缓存
-        /// </summary>
-        /// <param name="key">缓存Key</param>
-        /// <param name="value">新的缓存Value</param>
-        /// <returns></returns>
-        public bool Replace(string key, object value)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-
-            if (Exists(key))
-                if (!Remove(key))
-                    return false;
-
-            return Add(key, value);
-
-        }
-        /// <summary>
-        /// 修改缓存
-        /// </summary>
-        /// <param name="key">缓存Key</param>
-        /// <param name="value">新的缓存Value</param>
-        /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
-        /// <param name="expiressAbsoulte">绝对过期时长</param>
-        /// <returns></returns>
-        public bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-
-            if (Exists(key))
-                if (!Remove(key))
-                    return false;
-
-            return Add(key, value, expiresSliding, expiressAbsoulte);
-        }
-        /// <summary>
-        /// 修改缓存
-        /// </summary>
-        /// <param name="key">缓存Key</param>
-        /// <param name="value">新的缓存Value</param>
-        /// <param name="expiresIn">缓存时长</param>
-        /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param>
-        /// <returns></returns>
-        public bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false)
-        {
-            if (key == null)
-            {
-                throw new ArgumentNullException(nameof(key));
-            }
-
-            if (Exists(key))
-                if (!Remove(key)) return false;
-
-            return Add(key, value, expiresIn, isSliding);
-        }
-        public void Dispose()
-        {
-            if (_connection != null)
-                _connection.Dispose();
-            GC.SuppressFinalize(this);
-        }
-
-
-        public async Task<bool> ExistsAsync(string key)
-        {
-            return await Task.Run(() => Exists(key));
-        }
-
-        public async Task<bool> AddAsync(string key, object value)
-        {
-            return await Task.Run(() => Add(key, value));
-        }
-
-        public async Task<bool> AddAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
-        {
-            return await Task.Run(() => Add(key, value, expiresSliding, expiressAbsoulte));
-        }
-
-        public async Task<bool> AddAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false)
-        {
-            return await Task.Run(() => Add(key, value, expiresIn, isSliding));
-        }
-
-        public async Task<bool> RemoveAsync(string key)
-        {
-            return await Task.Run(() => Remove(key));
-        }
-
-        public async Task RemoveAllAsync(IEnumerable<string> keys)
-        {
-            await Task.Run(() => RemoveAll(keys));
-        }
-
-        public async Task<T> GetAsync<T>(string key) where T : class
-        {
-            return await Task.Run(() => Get<T>(key));
-        }
-
-        public async Task<object> GetAsync(string key)
-        {
-            return await Task.Run(() => Get(key));
-        }
-
-        public async Task<IDictionary<string, object>> GetAllAsync(IEnumerable<string> keys)
-        {
-            return await Task.Run(() => GetAll(keys));
-        }
-
-        public async Task<bool> ReplaceAsync(string key, object value)
-        {
-            return await Task.Run(() => Replace(key, value));
-        }
-
-        public async Task<bool> ReplaceAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
-        {
-            return await Task.Run(() => Replace(key, value, expiresSliding, expiressAbsoulte));
-        }
-
-        public async Task<bool> ReplaceAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false)
-        {
-            return await Task.Run(() => Replace(key, value, expiresIn, isSliding));
-        }
-    }
-}

+ 8 - 9
TEAMModelOS.SDK/TEAMModelOS.SDK.csproj

@@ -20,19 +20,18 @@
     <PackageReference Include="Jaeger" Version="0.3.7" />
     <PackageReference Include="LiteDB" Version="5.0.5" />
     <PackageReference Include="log4net" Version="2.0.8" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.3" />
-    <PackageReference Include="Microsoft.AspNetCore.Authorization" Version="3.1.3" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.6" />
+    <PackageReference Include="Microsoft.AspNetCore.Authorization" Version="3.1.6" />
     <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
-    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.1.3" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.3" />
+    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.1.6" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.6" />
     <PackageReference Include="Microsoft.Azure.CosmosDB.BulkExecutor" Version="2.4.1-preview" />
     <PackageReference Include="Microsoft.Azure.DocumentDB.Core" Version="2.10.1" />
     <PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.3" />
     <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
-    <PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" />
-    <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.3" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.3" />
-    <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" />
+    <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.6" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.6" />
+    <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.6" />
     <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.5.0" />
     <PackageReference Include="OpenTracing" Version="0.12.1" />
     <PackageReference Include="protobuf-net" Version="2.4.6" />
@@ -41,7 +40,7 @@
     <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.5.0" />
     <PackageReference Include="WindowsAzure.Storage" Version="9.3.3" />
     <PackageReference Include="XC.Framework.Security.RSAUtil" Version="1.0.1" />
-    <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.8.0" />
+    <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.11.0" />
     <PackageReference Include="Microsoft.Azure.Cosmos.Table" Version="2.0.0-preview" />
     <PackageReference Include="Caching.CSRedis" Version="3.5.5" />
   </ItemGroup>

+ 12 - 7
TEAMModelOS/ClientApp/src/components/learnactivity/ChooseContent.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
     <div class="choose-content">
         <Tabs type="card" name="chooseContent">
             <!-- 选择课纲内容 -->
@@ -437,12 +437,17 @@
                     let list = res.result.data
                     list.forEach(async (i, index) => {
                         if (i.url) {
-                            let sasString = i.code === this.$store.state.userInfo.TEAMModelId ? privateSas : schoolSas
-                            let jsonInfo = await this.$tools.getFile(i.url + sasString.sas)
-                            let jsonData = JSON.parse(jsonInfo)
-                            jsonData.id = i.id
-                            jsonData.fileName = i.url.split('/')[i.url.split('/').length - 1].split('.json')[0]
-                            this.$set(list, index, jsonData)
+							try{
+								let sasString = i.code === this.$store.state.userInfo.TEAMModelId ? privateSas : schoolSas
+								let jsonInfo = await this.$tools.getFile(i.url + sasString.sas)
+								let jsonData = JSON.parse(jsonInfo)
+								jsonData.id = i.id
+								jsonData.fileName = i.url.split('/')[i.url.split('/').length - 1].split('.json')[0]
+								this.$set(list, index, jsonData)
+							}catch(e){
+								this.$Message.warning('存在试题读取异常!')
+							}
+                            
                         }
                     })
                     this.questionList = list

+ 19 - 0
TEAMModelOS/ClientApp/src/components/learnactivity/QuestionList.vue

@@ -43,6 +43,12 @@
                     return []
                 }
             },
+            selQue: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            },
             config: {
                 type: Object,
                 default: () => {
@@ -118,6 +124,19 @@
             }
         },
         mounted() {
+			// this.selectedId = this.selQue.map(i => i.id)
+        },
+        watch: {
+            selQue: {
+                handler(o, n){
+                    this.selectedId = this.selQue.map((item) => {
+                        return item.id
+                    })
+					console.log(this.selectedId)
+                }, 
+                deep: true,
+				immediate:true
+            }
         }
     }
 </script>

+ 3 - 2
TEAMModelOS/ClientApp/src/components/syllabus/DragTree.vue

@@ -218,11 +218,12 @@
             },
 
             onShowContent(val, data) {
+				console.log(data)
                 this.contentIndex = val
                 this.currentItems = []
                 this.currentResources = []
-                data.items && this.findQuestionById(data.items)
-                data.resources && this.findResourceById(data.resources)
+                data.items.length && this.findQuestionById(data.items)
+                data.resources.length && this.findResourceById(data.resources)
                 this.isShowContent = true
             },
 

+ 12 - 7
TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue

@@ -308,13 +308,18 @@
 					/* 拿到Summary的题目之后要通过每个题目的JSON URL 换取完整题目数据 */
 					list.forEach(async (i, index) => {
 						if (i.url) {
-							let sasString = i.code === this.$store.state.userInfo.TEAMModelId ? privateSas : schoolSas 
-							let jsonInfo = await this.$tools.getFile(i.url + sasString.sas)
-							let jsonData = JSON.parse(jsonInfo)
-							jsonData.id = i.id
-							jsonData.fileName = i.url.split('/')[i.url.split('/').length - 1].split('.json')[0]
-							console.log(jsonData.fileName)
-							this.$set(list, index, jsonData)
+							try{
+								let sasString = i.code === this.$store.state.userInfo.TEAMModelId ? privateSas : schoolSas
+								let jsonInfo = await this.$tools.getFile(i.url + sasString.sas)
+								let jsonData = JSON.parse(jsonInfo)
+								jsonData.id = i.id
+								jsonData.fileName = i.url.split('/')[i.url.split('/').length - 1].split('.json')[0]
+								console.log(jsonData.fileName)
+								this.$set(list, index, jsonData)
+							}catch(e){
+								this.$Message.warning('存在试题读取异常!')
+							}
+							
 						}
 					})
 					this.exerciseList = list

+ 11 - 3
TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.less

@@ -164,14 +164,22 @@
             height: 100%;
             right: 50px;
             top: 0;
-            font-size: 14px;
+            font-size: 16px;
             .fl-row-center;
             display: none;
+			
+			.ivu-icon{
+				margin-right: 5px;
+			}
 
-            span{
+            &-delete{
                 font-weight:bold;
-                color:red;
             }
+			
+			&-edit{
+				font-weight:bold;
+				margin-right: 30px;
+			}
         }
 
         &:hover {

+ 11 - 4
TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.vue

@@ -15,14 +15,14 @@
 
         <!-- 空数据展示 -->
         <div v-if="paperList.length === 0" class="no-data-text">
-            <img src="../../../assets/icon/no_data.svg" width="120" />
+            <img src="@/assets/icon/no_data.svg" width="120" />
             <span style="margin-top:15px;color:#808080">暂无数据</span>
         </div>
 
         <!-- 试卷列表页面 -->
         <div class="pl-content-wrap" v-else>
             <Loading :top="100" v-show="dataLoading" type="1"></Loading>
-            <div class="paper-item" v-for="(paper,index) in paperList" :key="index" @click="goToPaper(paper)">
+            <div class="paper-item" v-for="(paper,index) in paperList" :key="index">
                 <div class="paper-item-name">
                     <span class="paper-item-tag">{{ getSubjectName(paper.subjectCode) }}</span>
                     <span>{{ paper.name }}</span>
@@ -34,7 +34,14 @@
                     <span class="info-item">难度系数:<span class="info-bold">{{ paper.item ? handleDiffCalc(paper.item) : 0 }}</span></span>
                 </div>
                 <div class="paper-item-tools">
-                    <span @click.stop="onDeletePaper(paper)"  v-if="$access.can('admin.*|Paper_Edit')">删除</span>
+                    <span class="paper-item-tools-edit" @click="goToPaper(paper)"  v-if="$access.can('admin.*|Paper_Edit')">
+						<Icon type="ios-create" />
+						<span>编辑</span>
+					</span>
+                    <span class="paper-item-tools-delete"  @click.stop="onDeletePaper(paper)"  v-if="$access.can('admin.*|Paper_Edit')">
+						<Icon type="md-trash" />
+						<span>删除</span>
+					</span>
                 </div>
             </div>
 
@@ -166,7 +173,7 @@
                 paper.paperName = paper.name
                 paper.paperScore = paper.score
                 this.$router.push({
-                    name: 'testPaper',
+                    name: 'createPaper',
                     params: {
                         paper: paper
                     }

+ 3 - 4
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.less

@@ -30,11 +30,10 @@
         }
 
         .btn-save {
-            background: #19be6b;
-            float: right;
-            cursor: pointer;
             margin-top: 6px;
-            margin-right: 40px;
+            margin-right: 20px;
+			height: 28px;
+			line-height: 28px;
         }
     }
 

+ 116 - 57
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue

@@ -2,7 +2,10 @@
     <div class="create-evaluation-container">
         <div class="create-header">
             <p class="create-header-title">创建试卷</p>
-            <Button class="btn-save" type="success" :loading="isLoading" icon="ios-albums-outline" @click="saveTestPaper">保存试卷</Button>
+			<div style="float: right;">
+				<Button class="btn-save" type="info" @click="goBack">返回试卷库</Button>
+				<Button class="btn-save" type="success" :loading="isLoading" @click="saveTestPaper">保存试卷</Button>
+			</div>
         </div>
         <div class="create-body">
             <div class="evaluation-attr-wrap">
@@ -10,7 +13,7 @@
                 <div style="width:100%; height:calc(100% - 45px);padding-top:30px;">
                     <Form ref="evaluationInfo" :model="evaluationInfo" label-position="top" class="evaluation-attr-form" label-colon>
                         <FormItem label="试卷类型" prop="type">
-                            <Select v-model="evaluationInfo.type">
+                            <Select v-model="evaluationInfo.type" :disabled="evaluationInfo.id !== undefined">
 								<Option value="private">个人试卷库</Option>
                                 <Option value="school">学校公有库</Option>
                             </Select>
@@ -54,7 +57,7 @@
                             <AutoCreate :subjectCode="evaluationInfo.testPaper[currentSubjectIndex].subjectCode" :periodCode="evaluationInfo.testPaper[currentSubjectIndex].periodCode" @goToPreview="goToPreview" @autoQuestions="getAutoQuestions"></AutoCreate>
                         </TabPane>
                         <TabPane label="备选题目" name="manual" v-if="evaluationInfo.testPaper[currentSubjectIndex].createType == 'manual'" :index="2" tab="createTest">
-                            <ManualCreate :questionList="questionList" @goToPreview="goToPreview" @selectedQuestion="getSelectedQuestion"></ManualCreate>
+                            <ManualCreate :questionList="questionList" :selQue="evaluationInfo.item" @goToPreview="goToPreview" @selectedQuestion="getSelectedQuestion"></ManualCreate>
                         </TabPane>
                         <TabPane label="导入说明" name="import" v-if="evaluationInfo.testPaper[currentSubjectIndex].createType == 'import'" :index="3" tab="createTest">
                             <BaseImport @importFinish="onImportFinish"></BaseImport>
@@ -91,10 +94,8 @@
     import BaseImport from '../components/BaseImport.vue'
     import TestPaper from './TestPaper.vue'
     
-    import jsFn from '@/utils/js-fn.js'
     export default {
         components: {
-            
             AutoCreate,
             ManualCreate,
             TeacherPreview,
@@ -106,7 +107,6 @@
         },
         data() {
             return {
-                jsFn,
                 isLoading: false,
                 examAnalysisStatus: false,
                 comfirmPreviewStatus: false,
@@ -168,15 +168,11 @@
             }
         },
         created() {
-            let routerData = this.$route.params.evaluationInfo
-            if (routerData !== undefined) {
-                for (let i = 0; i < routerData.testPaper.length; i++) {
-                    routerData.testPaper[i].createType = 'auto'
-                }
-                this.evaluationInfo = routerData
-                this.activeTab = 'preview'
-            }
-            this.getSchoolBaseInfo()
+            
+            this.getSchoolBaseInfo().then(res => {
+				this.schoolInfo = res
+				this.onPeriodChange(0)
+			})
             this.questionList = questions.result.data
         },
         methods: {
@@ -187,9 +183,19 @@
             onPeriodChange(val) {
                 this.gradeList = this.schoolInfo.period[val].grades
                 this.subjectList = this.schoolInfo.period[val].subjects
+				this.evaluationInfo.paperGrade = []
                 this.paperGrade = 0
                 this.paperSubject = 0
             },
+			
+			goBack(){
+				this.$router.push({
+				    name: 'testPaperList',
+				    params: {
+				        tabName: 'paper'
+				    }
+				})
+			},
 
             /**
              * 导入试题结束
@@ -215,6 +221,7 @@
              * @param data
              */
             getSelectedQuestion(data) {
+				console.log(data)
 				data.questions.forEach(i => i.score = 0)
                 this.evaluationInfo.item = data.questions
             },
@@ -235,26 +242,31 @@
             
             /** 获取当前学校基础数据 */
             getSchoolBaseInfo() {
-                this.$store.dispatch('schoolBaseInfo/getSchoolBaseData').then(
-                    (res) => {
-                        if (res.code == 2) {
-                            alert('数据为空!')
-                        } else {
-                            this.schoolInfo = res.data
-                            this.gradeList = res.data.period[0].grades
-                            this.subjectList = res.data.period[0].subjects
-                        }
-                    },
-                    (err) => {
-                        alert('API error!')
-                    }
-                )
+				return new Promise((r,j) => {
+					this.$store.dispatch('schoolBaseInfo/getSchoolBaseData').then(
+					    (res) => {
+					        if (res.code == 2) {
+					            alert('数据为空!')
+					        } else {
+								r(res.data)
+					        }
+					    },
+					    (err) => {
+					        alert('API error!')
+					    }
+					)
+				})
+                
             },
            
             /** 保存当前试卷数据 */
             async saveTestPaper() {
+				
                 if (this.evaluationInfo.item.length) {
                     let code = this.evaluationInfo.type === 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId
+					let isEdit = Boolean(this.evaluationInfo.id)
+					let fileName = isEdit ? this.evaluationInfo.fileName : this.$tools.guid()
+					
                     this.isLoading = true
                     this.evaluationInfo.item.forEach(i => { i.code = code })
                     let requestData = {
@@ -269,38 +281,45 @@
                         score: this.evaluationInfo.score
                     }
 					console.log(requestData)
-					
+					if(this.evaluationInfo.id){
+						requestData.id = this.evaluationInfo.id
+					}
 					// 首先保存新题目的JSON文件到Blob 然后返回URL链接
-					let file = new File([JSON.stringify(requestData)], this.$tools.guid() + ".json", {type: ""});
+					let file = new File([JSON.stringify(requestData)], fileName + ".json", {type: ""});
 					// 根据题目类型 传到不同容器
 					let fileType = this.evaluationInfo.type
 					// 等待上传blob的返回结果
-					let blobFile = await uploadFile.uploadFile(file,'paper',fileType)
-					if(blobFile.blobUrl){
-						// 保存到COSMOS是不含base64图片编码的数据 避免数据量过大
-						requestData.url = blobFile.blobUrl
-						delete requestData.item
-						delete requestData.answers
-						this.$api.learnActivity.SaveExamPaper(requestData).then(
-						    res => {
-						        if (res.error == null) {
-						            this.$Message.success('添加成功')
-						            this.isLoading = false
-						            this.$router.push({
-						                name: 'testPaperList',
-						                params: {
-						                    tabName: 'paper'
-						                }
-						            })
-						        } else {
-						            this.$Message.error('API ERROR!')
-						        }
-						    },
-						    err => {
-						        this.$Message.error('API ERROR!')
-						    }
-						)
+					try{
+						let blobFile = await uploadFile.uploadFile(file,'paper',fileType)
+						if(blobFile.blobUrl){
+							// 保存到COSMOS是不含base64图片编码的数据 避免数据量过大
+							requestData.url = blobFile.blobUrl
+							delete requestData.item
+							delete requestData.answers
+							this.$api.learnActivity.SaveExamPaper(requestData).then(
+							    res => {
+							        if (res.error == null) {
+							            this.$Message.success( isEdit ? '编辑成功' : '保存成功')
+							            this.isLoading = false
+							            this.$router.push({
+							                name: 'testPaperList',
+							                params: {
+							                    tabName: 'paper'
+							                }
+							            })
+							        } else {
+							            this.$Message.error('API ERROR!')
+							        }
+							    },
+							    err => {
+							        this.$Message.error('API ERROR!')
+							    }
+							)
+						}
+					}catch(e){
+						this.$Message.error('上传失败!')
 					}
+					
                     
                 } else {
                     this.$Message.warning('未选择任何试题!')
@@ -334,10 +353,50 @@
 				return arr
 			},
             
+			
+			async doRender(paper){
+				console.log('传进来的paper')
+				console.log(paper)
+				this.schoolInfo = await this.getSchoolBaseInfo()
+				this.subjectList = this.schoolInfo.period.filter(i => i.periodCode === paper.periodCode)[0].subjects
+				
+				this.evaluationInfo = {
+					id:paper.id,
+					fileName:paper.fileName,
+					name: paper.name,
+					type: paper.code === this.$store.state.userInfo.TEAMModelId ?  'private' : 'school',
+					paperPeriod: this.schoolInfo.period.map(i => i.periodCode).indexOf(paper.periodCode),
+					paperGrade: paper.gradeCode,
+					paperSubject: this.subjectList.map(i => i.subjectCode).indexOf(paper.subjectCode),
+					score: paper.score,
+					item: paper.item,
+					markConfig: {
+						auto: false,
+						type: 0,
+						score: 0
+					},
+					startTime: 0,
+					endTime: 0,
+					testPaper: [
+					    {
+					        periodName: '小学',
+					        subjectName: '语文',
+					        createType: 'auto',//不需要保存
+					        filter: {},//前端用于区分创建试卷的方式,以及创建的一些过滤条件,不需要保存
+					        questions: []
+					    }
+					]
+				}
+				console.log(this.evaluationInfo)
+			}
         },
         
         mounted() {
-
+			let routerData = this.$route.params.paper
+			if (routerData) {
+			    this.doRender(routerData)
+			    this.activeTab = 'preview'
+			}
         }
     }
 </script>

+ 25 - 7
TEAMModelOS/ClientApp/src/view/learnactivity/ManualCreate.vue

@@ -99,7 +99,7 @@
             </div>
             <div class="question-list-wrap">
                 <Loading :top="100" v-show="isLoading"></Loading>
-                <QuestionList :class="isLoading ? '':'animated fadeIn'" v-show="!isLoading" :config="questionConfig" :questions="questionList" @deleteQuestion="deleteQuestion" @selectQuestion="selectQuestion"></QuestionList>
+                <QuestionList :selQue="selQue" :class="isLoading ? '':'animated fadeIn'" v-show="!isLoading" :config="questionConfig" :questions="questionList" @deleteQuestion="deleteQuestion" @selectQuestion="selectQuestion"></QuestionList>
                 <EmptyData style="margin-top:120px;" v-if="!isLoading && questionList.length == 0" textContent="没有查询到题目"></EmptyData>
                 <div class="page-wrap">
                     <Page :current.sync="pageNum" :total="totalNum" show-total :page-size="pageSize" size="small" show-sizer @on-change="getCurrentPageData" />
@@ -131,6 +131,14 @@
     
     import { setTimeout } from 'core-js'
     export default {
+        props: {
+            selQue: {
+                type: Array,
+                default: () => {
+                    return []
+                }
+            }
+        },
         components: {
             QuestionList,
             Loading
@@ -172,6 +180,11 @@
         mounted() {
             this.getResultCount()
             this.queryQuestionByPage()
+            this.shoppingQuestionList = JSON.parse(JSON.stringify(this.selQue))
+            let groupResult = this.$jsFn.groupBy(this.shoppingQuestionList, 'type')
+            for (let i = 0; i < groupResult.length; i++) {
+                this.groupQuestion[groupResult[i][0].type] = groupResult[i].length
+            }
         },
         methods: {
             /**
@@ -241,12 +254,17 @@
                     let list = res.result.data
                     list.forEach(async (i, index) => {
                         if (i.url) {
-                            let sasString = i.code === this.$store.state.userInfo.TEAMModelId ? privateSas : schoolSas
-                            let jsonInfo = await this.$tools.getFile(i.url + sasString.sas)
-                            let jsonData = JSON.parse(jsonInfo)
-                            jsonData.id = i.id
-                            jsonData.fileName = i.url.split('/')[i.url.split('/').length - 1].split('.json')[0]
-                            this.$set(list, index, jsonData)
+							try{
+								let sasString = i.code === this.$store.state.userInfo.TEAMModelId ? privateSas : schoolSas
+								let jsonInfo = await this.$tools.getFile(i.url + sasString.sas)
+								let jsonData = JSON.parse(jsonInfo)
+								jsonData.id = i.id
+								jsonData.fileName = i.url.split('/')[i.url.split('/').length - 1].split('.json')[0]
+								this.$set(list, index, jsonData)
+							}catch(e){
+								this.$Message.warning('存在试题读取异常!')
+							}
+                            
                         }
                     })
                     this.questionList = list

+ 1 - 1
TEAMModelOS/ClientApp/src/view/newcourse/CourseClassroom.vue

@@ -673,7 +673,7 @@
 
     }
 
-    .__view {
+    .course-classroom-box .__view {
         height: 100%;
     }
 </style>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/selfstudy/AnswerRecord.vue

@@ -245,12 +245,12 @@
                 )
             },
             checkBackTop(vertical, horizontal, nativeEvent) {
+                console.log('.......')
                 if (vertical.scrollTop > 100) {
                     this.showBack = true
                 } else {
                     this.showBack = false
                 }
-                //console.log(vertical, horizontal, nativeEvent)
             },
             closeAnswerDetail() {
                 this.$emit('closeAnswerDetail')

+ 4 - 4
TEAMModelOS/ClientApp/src/view/selfstudy/PassBar.vue

@@ -32,7 +32,7 @@
                             //$.get('detail?name=' + params.name, function (content) {
                             //    callback(ticket, toHTML(content));
                             //});
-                            return 'Loading';
+                            return '{b0}: {c0}<br />{b1}: {c1}';
                         }
                     },
                     legend: {
@@ -115,7 +115,7 @@
                         name: '一次通过',
                         type: 'bar',
                         itemStyle: {
-                            color: "#5cadff"
+                            color: "#19be6b"
                         },
                         label: {
                             normal: {
@@ -149,7 +149,7 @@
                         name: '未作答',
                         type: 'bar',
                         itemStyle: {
-                            color: "#AAAAAA"
+                            color: "#e8eaec"
                         },
                         label: this.seriesLabel,
                         data: []
@@ -174,7 +174,7 @@
                         name: '非一次通过',
                         type: 'bar',
                         itemStyle: {
-                            color: "#ff9900"
+                            color: "#5cadff"
                         },
                         label: this.seriesLabel,
                         data: []

+ 1 - 0
TEAMModelOS/ClientApp/src/view/syllabus/newSyllabus/operation/BaseResource.vue

@@ -287,6 +287,7 @@
                 handler: function(n, o) {
                     this.currentNodeInfo = n
                     this.onChangeOrigin(0)
+					console.log(n)
                     if (n.resources) {
                         this.getResourceObject(n.resources) // 用ID换知识点对象数据
                         // 切换数据源时 检测当前已选项 是否要设置选中状态

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

@@ -4,8 +4,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Common.StringHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;

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

@@ -7,8 +7,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using TEAMModelOS.Helper.Common.FileHelper;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;

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

@@ -8,7 +8,7 @@ using System.Linq;
 using System.Threading.Tasks;
 
 using TEAMModelOS.Helper.Common.FileHelper;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 
 namespace TEAMModelOS.Starter.CloudServer.Controllers.AnalysisControllers

+ 30 - 0
TEAMModelOS/Controllers/BaseController.cs

@@ -7,6 +7,11 @@ using TEAMModelOS.SDK.Context.Constant.Common;
 using System.Security.Claims;
 using TEAMModelOS.Service.Models;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;
+using System.IdentityModel.Tokens.Jwt;
+using Microsoft.IdentityModel.Tokens;
+using System.Text;
+using System;
+using System.Diagnostics;
 
 namespace TEAMModelOS.Controllers
 {
@@ -43,5 +48,30 @@ namespace TEAMModelOS.Controllers
             }
             return claimValues;
         }
+
+        public static bool ValidateIdToken(string token, string salt)
+        {
+            try
+            {
+                var handler = new JwtSecurityTokenHandler();
+                var validationParameters = new TokenValidationParameters
+                {
+                    RequireExpirationTime = true,
+                    ValidateIssuer = false,
+                    ValidateAudience = false,
+                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(salt)),
+                    ValidateLifetime = false,
+                    //LifetimeValidator = LifetimeValidator,
+                    ClockSkew = TimeSpan.Zero
+                };
+                ClaimsPrincipal principal = handler.ValidateToken(token, validationParameters, out SecurityToken securityToken);
+                return true;
+            }
+            catch (Exception ex)
+            {
+                Trace.WriteLine(ex.Message);
+                return false;
+            }
+        }
     }
 }

+ 1 - 2
TEAMModelOS/Controllers/Client/ClientController.cs

@@ -3,8 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 using TEAMModelOS.SDK.Helper.Common.LogHelper;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;

+ 69 - 7
TEAMModelOS/Controllers/Core/AuthController.cs

@@ -1,14 +1,22 @@
 using Microsoft.AspNetCore.Authentication;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Configuration;
+using Microsoft.IdentityModel.Tokens;
+using OpenXmlPowerTools;
 using System;
 using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
 using System.Linq;
+using System.Security.Claims;
+using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Context.Configuration;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 using TEAMModelOS.SDK.Helper.Network.HttpHelper;
+using TEAMModelOS.SDK.Helper.Security.AESCrypt;
+using TEAMModelOS.SDK.Helper.Security.DesCrypt;
 
 namespace TEAMModelOS.Controllers
 {
@@ -35,14 +43,68 @@ namespace TEAMModelOS.Controllers
             return new { url, refresh_token= JsonApiHelper.FromApiJson<JsonElement>(token) };
         }
 
-        [HttpPost("idToken")]
-        public object IdToken(string token)
+        [HttpPost("validateIdToken")]
+        public BaseResponse ValidateIdToken(JosnRequest<string> request)
         {
-             
-            string url = BaseConfigModel.Configuration["HaBookAuth:IES5Auth:url"];
-            Dictionary<string, object> refresh_token = BaseConfigModel.Configuration.GetSection("HaBookAuth:IES5Auth:refresh_token").Get<Dictionary<string, object>>();
-            token = refresh_token.ToApiJson().Replace("{access_token}", token);
-            return new { url, refresh_token = JsonApiHelper.FromApiJson<JsonElement>(token) };
+            ResponseBuilder builder = new ResponseBuilder();
+         //  bool b = CoreTokenExtensions.ValidateIdToken(request.@params, BaseConfigModel.Configuration["Option:IdTokenSalt"]);
+            var a = CreateToken("habook0001", BaseConfigModel.Configuration["Option:IdTokenSalt"],
+                new string[] { "admin","teacher"},new string []{"update","create" },
+                BaseConfigModel.Configuration.GetSection("Option:Exp").Get<int>());
+            return builder.Data(a).build();
+        }
+
+        public static string CreateToken(string userID, string salt, string[] roles = null, string[] permissions = null, int expire = 86400)
+        {
+            // 設定要加入到 JWT Token 中的聲明資訊(Claims)
+            var claims = new List<Claim>();
+            string iss = BaseConfigModel.Configuration["Option:Issuer"];
+            // 在 RFC 7519 規格中(Section#4),總共定義了 7 個預設的 Claims
+            claims.Add(new Claim(JwtRegisteredClaimNames.Iss, iss)); //發行者
+            claims.Add(new Claim(JwtRegisteredClaimNames.Sub, userID)); // 用戶ID            
+            claims.Add(new Claim(JwtRegisteredClaimNames.Exp, DateTimeOffset.UtcNow.AddHours(expire).ToUnixTimeSeconds().ToString())); // 到期的時間,必須為數字
+
+            // 擴充 "roles" 加入登入者的角色,角色類型 (USER、HABOOK)   
+            if (roles != null)
+            {
+                foreach (var role in roles)
+                {
+                    claims.Add(new Claim("roles", role));
+                }
+            }
+            // 擴充 "permissions" 加入登入者的權限請求  
+            if (permissions != null)
+            {
+                foreach (var role in permissions)
+                {
+                    claims.Add(new Claim("permissions", role));
+                }
+            }
+
+            var userClaimsIdentity = new ClaimsIdentity(claims);
+
+            // 建立一組對稱式加密的金鑰,主要用於 JWT 簽章之用
+            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(salt));
+
+            // HmacSha256 有要求必須要大於 128 bits,所以 salt 不能太短,至少要 16 字元以上
+            // https://stackoverflow.com/questions/47279947/idx10603-the-algorithm-hs256-requires-the-securitykey-keysize-to-be-greater
+            var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);
+
+            // 建立 SecurityTokenDescriptor
+            var tokenDescriptor = new SecurityTokenDescriptor
+            {
+                Issuer = iss,
+                Subject = userClaimsIdentity,
+                Expires = DateTime.Now.AddSeconds(expire),
+                SigningCredentials = signingCredentials
+            };
+
+            // 產出所需要的 JWT securityToken 物件,並取得序列化後的 Token 結果(字串格式)
+            var tokenHandler = new JwtSecurityTokenHandler();
+            var securityToken = tokenHandler.CreateToken(tokenDescriptor);
+            var serializeToken = tokenHandler.WriteToken(securityToken);
+
+            return serializeToken;
         }
     }
 }

+ 1 - 2
TEAMModelOS/Controllers/Core/BlobController.cs

@@ -7,8 +7,7 @@ using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Configuration;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 using TEAMModelOS.SDK.Helper.Network.HttpHelper;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;

+ 1 - 2
TEAMModelOS/Controllers/Core/CommonController.cs

@@ -10,8 +10,7 @@ using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper.JsonPath;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;

+ 1 - 2
TEAMModelOS/Controllers/Core/FileController.cs

@@ -8,8 +8,7 @@ using System.Threading.Tasks;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Constant.Common;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Security.AESCrypt;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;

+ 1 - 2
TEAMModelOS/Controllers/Core/LoginController.cs

@@ -10,8 +10,7 @@ using System.Threading.Tasks;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Constant.Common;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Extension.JwtAuth.JwtHelper;
 using TEAMModelOS.SDK.Extension.JwtAuth.Models;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;

+ 1 - 2
TEAMModelOS/Controllers/Exam/ExamController.cs

@@ -5,8 +5,7 @@ using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.Service.Models;

+ 1 - 2
TEAMModelOS/Controllers/Exam/ImportExerciseController.cs

@@ -6,8 +6,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Constant.Common;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.Service.Model.PowerPoint; 
 using TEAMModelOS.Service.Services.Exam.Implements;
 using TEAMModelOS.Service.Services.Exam.Interfaces;

+ 1 - 2
TEAMModelOS/Controllers/Exam/PaperController.cs

@@ -3,8 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.Service.Models;
 

+ 1 - 2
TEAMModelOS/Controllers/School/ClassRoomController.cs

@@ -5,8 +5,7 @@ using System.Text;
 using System.Threading.Tasks;
 using TEAMModelOS.Service.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.SDK.Helper.Common.ValidateHelper;

+ 1 - 2
TEAMModelOS/Controllers/School/ClassStudentController.cs

@@ -5,8 +5,7 @@ using System.Threading.Tasks;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;

+ 1 - 2
TEAMModelOS/Controllers/School/CourseController.cs

@@ -8,8 +8,7 @@ using OpenXmlPowerTools;
 using Org.BouncyCastle.Ocsp;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;

+ 1 - 2
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -4,8 +4,7 @@ using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
 using TEAMModelOS.Service.Models;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;

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

@@ -3,8 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Security.TmdCrypt;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;

+ 1 - 2
TEAMModelOS/Controllers/Syllabus/ItemInfoController.cs

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

+ 1 - 2
TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs

@@ -5,8 +5,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;

+ 1 - 2
TEAMModelOS/Controllers/Syllabus/ResourceController.cs

@@ -4,8 +4,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;

+ 1 - 2
TEAMModelOS/Controllers/Syllabus/SyllabusController.cs

@@ -2,8 +2,7 @@
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Extension.SnowFlake;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;

+ 1 - 3
TEAMModelOS/Controllers/Syllabus/VolumeController.cs

@@ -5,14 +5,12 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Extension.SnowFlake;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.Controllers;
-using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.Service.Services.Interface;
 using TEAMModelOS.Service.Models;

+ 1 - 2
TEAMModelOS/Controllers/Task/HomeworkController.cs

@@ -11,8 +11,7 @@ using System.Threading.Tasks;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Configuration;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;

+ 1 - 2
TEAMModelOS/Controllers/Task/LearnController.cs

@@ -4,8 +4,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
 using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;

+ 1 - 2
TEAMModelOS/Controllers/Task/SurveyController.cs

@@ -5,8 +5,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.Service.Models;

+ 2 - 2
TEAMModelOS/Controllers/Task/VoteController.cs

@@ -9,8 +9,8 @@ using Microsoft.Azure.Cosmos.Linq;
 using Microsoft.Azure.Documents.SystemFunctions;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.Service.Models;

+ 1 - 2
TEAMModelOS/Controllers/Teacher/CommentController.cs

@@ -5,8 +5,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.Service.Models;

+ 2 - 2
TEAMModelOS/Controllers/Teacher/SchoolUserController.cs

@@ -3,8 +3,8 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;

+ 1 - 2
TEAMModelOS/Controllers/Test/TestAPIController.cs

@@ -10,8 +10,7 @@ using System.Collections.Generic;
 using Microsoft.WindowsAzure.Storage.Table;
 using Microsoft.WindowsAzure.Storage;
 using Newtonsoft.Json;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 
 namespace TEAMModelOS.Controllers.Test
 {

+ 1 - 2
TEAMModelOS/Controllers/Test/TestController.cs

@@ -7,8 +7,7 @@ using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 
 namespace TEAMModelOS.Controllers.Test

+ 0 - 2
TEAMModelOS/Startup.cs

@@ -123,8 +123,6 @@ namespace TEAMModelOS
             //HttpContextAccessor,并用来访问HttpContext。
             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
             services.AddSingleton<IServiceBusReviceService, ServiceBusReviceService>();
-            //引入Jwt配置
-            //services.JwtAuth(Configuration.GetSection("JwtSetting"));
             //注入CSRedis
             var csredis = new CSRedis.CSRedisClient(Configuration.GetSection("Azure:Redis:ConnectionString").Get<string>());
             // CSRedis.CSRedisClient.Serialize = obj =>System.Text.Json.JsonSerializer.Serialize(obj);

+ 7 - 2
TEAMModelOS/TEAMModelOS.csproj

@@ -16,15 +16,21 @@
     <PackageReference Include="CoreSDK" Version="1.0.0" />
     <PackageReference Include="CSRedisCore" Version="3.5.5" />
     <PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.3" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.3" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.6" />
     <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.2" />
     <PackageReference Include="VueCliMiddleware" Version="3.0.0" />
   </ItemGroup>
   <ItemGroup>
     <!-- Don't publish the SPA source files, but do show them in the project files list -->
+    <Compile Remove="JsonFile\Subject\**" />
     <Content Remove="$(SpaRoot)**" />
+    <Content Remove="JsonFile\Subject\**" />
     <None Include="$(SpaRoot)**" Exclude="$(SpaRoot)node_modules\**" />
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Remove="JsonFile\Subject\**" />
+    <None Remove="JsonFile\Subject\**" />
+  </ItemGroup>
   <ItemGroup>
     <None Remove="ClientApp\src\static\BaseDataDefault.json" />
   </ItemGroup>
@@ -37,7 +43,6 @@
   </ItemGroup>
 
   <ItemGroup>
-    <Folder Include="JsonFile\Subject\" />
     <Folder Include="wwwroot\" />
     <Folder Include="JwtRsaFile\" />
     <Folder Include="logfile\" />

+ 5 - 52
TEAMModelOS/appsettings.Development.json

@@ -11,7 +11,11 @@
     "Location": "China",
     "LocationNum": "1",
     "HostName": "localhost:5001",
-    "AllowedHosts": [ "localhost", "*.teammodel.cn", "*.teammodel.net", "*.habookaclass.biz", "test" ]
+    "AllowedHosts": [ "localhost", "*.teammodel.cn", "*.teammodel.net", "*.habookaclass.biz", "test" ],
+    "Issuer": "www.teammodel.cn",
+    "JwtSecretKey": "fXO6ko/qyXeYrkecPeKdgXnuLXf9vMEtnBC9OB3s+aA=",
+    "Exp": 86400,
+    "IdTokenSalt": "8263692E2213497BB55E74792B7900B4"
   },
   "Azure": {
     "Table": {
@@ -20,14 +24,6 @@
     "Blob": {
       "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodelstorage;AccountKey=Yq7D4dE6cFuer2d2UZIccTA/i0c3sJ/6ITc8tNOyW+K5f+/lWw9GCos3Mxhj47PyWQgDL8YbVD63B9XcGtrMxQ==;EndpointSuffix=core.chinacloudapi.cn",
        "Container": "teammodelos"
-      //系统管理员 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
-     // "system": [ "res", "item", "htex", "task", "info", "room", "exam" ],
-      //资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
-      //"school": [ "res", "item", "htex", "task", "info", "room", "exam" ],
-      //资源,题目关联,htex关联,学习活动关联,教师基本信息关联
-      //"teacher": [ "res", "item", "htex", "task", "info" ],
-      //答案及学习活动上传的文件,学生基本信息关联
-     // "student": [ "stu/{studentId}/ans", "stu/{studentId}/task" ]
     },
     "CosmosDB": {
       "ConnectionString": "https://teammodelos.documents.azure.cn:443/",
@@ -76,48 +72,5 @@
     "SmsUser": "Chengdu",
     "SmsKey": "XaHPbnPLd0NPTfnUCUD5cRlhY2nEEUCj"
   },
-  "Language": [
-    {
-      "Name": "臺灣",
-      "CountryCode": "",
-      "SmsLang": "CHT",
-      "Language": "zh-tw"
-    },
-    {
-      "Name": "香港",
-      "CountryCode": "852",
-      "SmsLang": "CHT",
-      "Language": "zh-hk"
-    },
-    {
-      "Name": "澳門",
-      "CountryCode": "853",
-      "SmsLang": "CHT",
-      "Language": "zh-mo"
-    },
-    {
-      "Name": "大陆",
-      "CountryCode": "",
-      "SmsLang": "CHS",
-      "Language": "zh-ch"
-    },
-    {
-      "Name": "Other",
-      "CountryCode": "000",
-      "SmsLang": "EN",
-      "Language": "en"
-    }
-  ],
-  "JwtSetting": {
-    "Issuer": "HaBook", //签发者
-    "Audience": "TEAMModelOS",
-    "JwtClient": [
-      {
-        "Name": "WebApp",
-        "Project": "TEAMModelOS",
-        "Exp": 86400
-      }
-    ]
-  },
   "BasicRouter": "{\"data\":[{\"name\":\"testschooldashboard\",\"path\":\"testschooldashboard\",\"component\":\"smartschooldashboard/Index.vue\"},{\"name\":\"testschool\",\"path\":\"testschool\",\"component\":\"school-mgmt/Index.vue\",\"children\":[{\"name\":\"system\",\"path\":\"system\",\"component\":\"school-mgmt/SystemSetting/SystemSetting.vue\"},{\"name\":\"classroom\",\"path\":\"classroom\",\"component\":\"school-mgmt/ClassroomSetting/ClassroomSetting.vue\"}]}]}"
 }

+ 4 - 53
TEAMModelOS/appsettings.json

@@ -11,10 +11,12 @@
     "Location": "China",
     "LocationNum": "1",
     "HostName": "localhost:5001",
-    "AllowedHosts": [ "localhost", "*.teammodel.cn", "*.teammodel.net", "*.habookaclass.biz", "test" ],
-    "JwtSecretKey": null,
     "Authority": "https://login.chinacloudapi.cn/4807e9cf-87b8-4174-aa5b-e76497d7392b/v2.0", //China:"https://login.chinacloudapi.cn/4807e9cf-87b8-4174-aa5b-e76497d7392b/v2.0", //Global:"https://login.microsoftonline.com/73a2bcc5-fe99-4566-aa8a-07e7bb287df1/v2.0"
     "Audience": "72643704-b2e7-4b26-b881-bd5865e7a7a5" //China:"72643704-b2e7-4b26-b881-bd5865e7a7a5",Global:"8768b06f-c5c5-4b0c-abfb-d7ded354626d"
+    "Issuer": "www.teammodel.cn",
+    "JwtSecretKey": "fXO6ko/qyXeYrkecPeKdgXnuLXf9vMEtnBC9OB3s+aA=",
+    "Exp": 86400,
+    "IdTokenSalt": "8263692E2213497BB55E74792B7900B4"
   },
   "Azure": {
     "Table": {
@@ -23,14 +25,6 @@
     "Blob": {
       "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodelstorage;AccountKey=Yq7D4dE6cFuer2d2UZIccTA/i0c3sJ/6ITc8tNOyW+K5f+/lWw9GCos3Mxhj47PyWQgDL8YbVD63B9XcGtrMxQ==;EndpointSuffix=core.chinacloudapi.cn",
       "Container": "teammodelos"
-      //系统管理员 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
-      //"system": [ "res", "item", "htex", "task", "info", "room", "exam" ],
-      //资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
-     // "school": [ "res", "item", "htex", "task", "info", "room", "exam" ],
-      //资源,题目关联,htex关联,学习活动关联,教师基本信息关联
-     // "teacher": [ "res", "item", "htex", "task", "info" ],
-      //答案及学习活动上传的文件,学生基本信息关联
-      //"student": [ "ans/{studentId}", "stu/{studentId}" ]
     },
     "CosmosDB": {
       "ConnectionString": "https://teammodelos.documents.azure.cn:443/",
@@ -79,48 +73,5 @@
     "SmsUser": "Chengdu",
     "SmsKey": "XaHPbnPLd0NPTfnUCUD5cRlhY2nEEUCj"
   },
-  "Language": [
-    {
-      "Name": "臺灣",
-      "CountryCode": "886",
-      "SmsLang": "CHT",
-      "Language": "zh-tw"
-    },
-    {
-      "Name": "香港",
-      "CountryCode": "852",
-      "SmsLang": "CHT",
-      "Language": "zh-hk"
-    },
-    {
-      "Name": "澳門",
-      "CountryCode": "853",
-      "SmsLang": "CHT",
-      "Language": "zh-mo"
-    },
-    {
-      "Name": "大陆",
-      "CountryCode": "86",
-      "SmsLang": "CHS",
-      "Language": "zh-ch"
-    },
-    {
-      "Name": "Other",
-      "CountryCode": "000",
-      "SmsLang": "EN",
-      "Language": "en"
-    }
-  ],
-  "JwtSetting": {
-    "Issuer": "HaBook", //签发者
-    "Audience": "TEAMModelOS",
-    "JwtClient": [
-      {
-        "Name": "WebApp",
-        "Project": "TEAMModelOS",
-        "Exp": 86400
-      }
-    ]
-  },
   "BasicRouter": "{\"data\":[{\"name\":\"testschooldashboard\",\"path\":\"testschooldashboard\",\"component\":\"smartschooldashboard/Index.vue\"},{\"name\":\"testschool\",\"path\":\"testschool\",\"component\":\"school-mgmt/Index.vue\",\"children\":[{\"name\":\"system\",\"path\":\"system\",\"component\":\"school-mgmt/SystemSetting/SystemSetting.vue\"},{\"name\":\"classroom\",\"path\":\"classroom\",\"component\":\"school-mgmt/ClassroomSetting/ClassroomSetting.vue\"}]}]}"
 }