CrazyIter 5 лет назад
Родитель
Сommit
2aebed538c
42 измененных файлов с 719 добавлено и 320 удалено
  1. 0 205
      TEAMModelOS.API/Controllers/Core/FileController.cs
  2. 0 26
      TEAMModelOS.API/Controllers/Syllabus/SyllabusController.cs
  3. 0 24
      TEAMModelOS.API/Models/Syllabus/Volume.cs
  4. 0 4
      TEAMModelOS.API/TEAMModelOS.API.csproj
  5. 27 0
      TEAMModelOS.Grpc/Program.cs
  6. 12 0
      TEAMModelOS.Grpc/Properties/launchSettings.json
  7. 21 0
      TEAMModelOS.Grpc/Protos/greet.proto
  8. 28 0
      TEAMModelOS.Grpc/Services/GreeterService.cs
  9. 43 0
      TEAMModelOS.Grpc/Startup.cs
  10. 15 0
      TEAMModelOS.Grpc/TEAMModelOS.Grpc.csproj
  11. 10 0
      TEAMModelOS.Grpc/appsettings.Development.json
  12. 14 0
      TEAMModelOS.Grpc/appsettings.json
  13. 12 10
      TEAMModelOS.SDK/Module/AzureCosmosDB/Implements/AzureCosmosDBRepository.cs
  14. 2 2
      TEAMModelOS.SDK/Module/AzureCosmosDB/Interfaces/IAzureCosmosDBRepository.cs
  15. 1 1
      TEAMModelOS.API/Models/Core/Classroom.cs
  16. 1 1
      TEAMModelOS.API/Models/Core/Grade.cs
  17. 1 1
      TEAMModelOS.API/Models/Core/Period.cs
  18. 1 1
      TEAMModelOS.API/Models/Core/School.cs
  19. 1 1
      TEAMModelOS.API/Models/Core/Semester.cs
  20. 1 1
      TEAMModelOS.API/Models/Core/Student.cs
  21. 1 1
      TEAMModelOS.API/Models/Core/Subject.cs
  22. 48 0
      TEAMModelOS.Service/Models/Syllabus/KnowledgeBlock.cs
  23. 40 0
      TEAMModelOS.Service/Models/Syllabus/KnowledgePoint.cs
  24. 17 23
      TEAMModelOS.API/Models/Syllabus/SyllabusNode.cs
  25. 38 0
      TEAMModelOS.Service/Models/Syllabus/Volume.cs
  26. 15 0
      TEAMModelOS.Service/TEAMModelOS.Service.csproj
  27. 12 6
      TEAMModelOS.sln
  28. 1 1
      TEAMModelOS.API/Controllers/BaseController.cs
  29. 2 2
      TEAMModelOS.API/Controllers/Core/ClassroomController.cs
  30. 1 1
      TEAMModelOS.API/Controllers/Core/CommonController.cs
  31. 134 0
      TEAMModelOS/Controllers/Core/FileController.cs
  32. 2 2
      TEAMModelOS.API/Controllers/Core/SchoolController.cs
  33. 2 2
      TEAMModelOS.API/Controllers/Core/StudentController.cs
  34. 15 0
      TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs
  35. 80 0
      TEAMModelOS/Controllers/Syllabus/SyllabusController.cs
  36. 113 0
      TEAMModelOS/Controllers/Syllabus/VolumeController.cs
  37. 1 1
      TEAMModelOS/Controllers/IdentityController.cs
  38. 1 1
      TEAMModelOS/Controllers/TestController.cs
  39. 1 1
      TEAMModelOS/Controllers/WeatherForecast.cs
  40. 1 1
      TEAMModelOS/Controllers/WeatherForecastController.cs
  41. 2 0
      TEAMModelOS/Startup.cs
  42. 2 1
      TEAMModelOS/TEAMModelOS.csproj

Разница между файлами не показана из-за своего большого размера
+ 0 - 205
TEAMModelOS.API/Controllers/Core/FileController.cs


+ 0 - 26
TEAMModelOS.API/Controllers/Syllabus/SyllabusController.cs

@@ -1,26 +0,0 @@
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Threading.Tasks;
-using TEAMModelOS.API.Models.Core;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
-using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
-using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
-using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
-
-namespace TEAMModelOS.API.Controllers.Syllabus
-{
-    [Route("api/[controller]")]
-    [ApiController]
-    [Authorize]
-    public class SyllabusController : BaseController
-    {
-        private readonly IAzureCosmosDBRepository azureCosmosDBRepository;
-        public SyllabusController(IAzureCosmosDBRepository _azureCosmosDBRepository)
-        {
-            azureCosmosDBRepository = _azureCosmosDBRepository;
-        }
-    }
-}

+ 0 - 24
TEAMModelOS.API/Models/Syllabus/Volume.cs

@@ -1,24 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using TEAMModelOS.SDK.Context.Attributes.Azure;
-
-namespace TEAMModelOS.API.Models.Syllabus
-{
-    public class Volume
-    { 
-        /// <summary>
-        /// id生成规则
-        /// </summary>
-        public string id { get; set; }
-        [PartitionKey]
-        public string schoolCode { get; set; }
-        public string periodCode { get; set; }
-        public string subjectCode { get; set; }
-        public string gradeCode { get; set; }
-        public string semesterCode { get; set; }
-        public int status { get; set; }
-        public string volumeName { get; set; }
-        public string volumeCode { get; set; }
-    }
-}

+ 0 - 4
TEAMModelOS.API/TEAMModelOS.API.csproj

@@ -6,9 +6,5 @@
   <ItemGroup>
     <ProjectReference Include="..\TEAMModelOS.SDK\TEAMModelOS.SDK.csproj" />
   </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Controllers\Evaluation\" />
-    <Folder Include="Services\" />
-  </ItemGroup>
 
 </Project>

+ 27 - 0
TEAMModelOS.Grpc/Program.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Hosting;
+
+namespace TEAMModelOS.Grpc
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            CreateHostBuilder(args).Build().Run();
+        }
+
+        // Additional configuration is required to successfully run gRPC on macOS.
+        // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
+        public static IHostBuilder CreateHostBuilder(string[] args) =>
+            Host.CreateDefaultBuilder(args)
+                .ConfigureWebHostDefaults(webBuilder =>
+                {
+                    webBuilder.UseStartup<Startup>();
+                });
+    }
+}

+ 12 - 0
TEAMModelOS.Grpc/Properties/launchSettings.json

@@ -0,0 +1,12 @@
+{
+  "profiles": {
+    "TEAMModelOS.Grpc": {
+      "commandName": "Project",
+      "launchBrowser": false,
+      "applicationUrl": "https://localhost:5001",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  }
+}

+ 21 - 0
TEAMModelOS.Grpc/Protos/greet.proto

@@ -0,0 +1,21 @@
+syntax = "proto3";
+
+option csharp_namespace = "TEAMModelOS.Grpc";
+
+package Greet;
+
+// The greeting service definition.
+service Greeter {
+  // Sends a greeting
+  rpc SayHello (HelloRequest) returns (HelloReply);
+}
+
+// The request message containing the user's name.
+message HelloRequest {
+  string name = 1;
+}
+
+// The response message containing the greetings.
+message HelloReply {
+  string message = 1;
+}

+ 28 - 0
TEAMModelOS.Grpc/Services/GreeterService.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Grpc.Core;
+using Microsoft.Extensions.Logging;
+
+namespace TEAMModelOS.Grpc
+{
+    public class GreeterService : Greeter.GreeterBase
+    {
+        private readonly ILogger<GreeterService> _logger;
+        public GreeterService(ILogger<GreeterService> logger  )
+        {
+            _logger = logger;
+        }
+
+        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
+        {
+
+
+            return Task.FromResult(new HelloReply
+            {
+                Message = "Hello " + request.Name
+            });
+        }
+    }
+}

+ 43 - 0
TEAMModelOS.Grpc/Startup.cs

@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+
+namespace TEAMModelOS.Grpc
+{
+    public class Startup
+    {
+        // This method gets called by the runtime. Use this method to add services to the container.
+        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
+        public void ConfigureServices(IServiceCollection services)
+        {
+            services.AddGrpc();
+        }
+
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+        {
+            if (env.IsDevelopment())
+            {
+                app.UseDeveloperExceptionPage();
+            }
+
+            app.UseRouting();
+
+            app.UseEndpoints(endpoints =>
+            {
+                endpoints.MapGrpcService<GreeterService>();
+
+                endpoints.MapGet("/", async context =>
+                {
+                    await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
+                });
+            });
+        }
+    }
+}

+ 15 - 0
TEAMModelOS.Grpc/TEAMModelOS.Grpc.csproj

@@ -0,0 +1,15 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp3.0</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Grpc.AspNetCore" Version="2.23.1" />
+  </ItemGroup>
+
+</Project>

+ 10 - 0
TEAMModelOS.Grpc/appsettings.Development.json

@@ -0,0 +1,10 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Debug",
+      "System": "Information",
+      "Grpc": "Information",
+      "Microsoft": "Information"
+    }
+  }
+}

+ 14 - 0
TEAMModelOS.Grpc/appsettings.json

@@ -0,0 +1,14 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Warning",
+      "Microsoft.Hosting.Lifetime": "Information"
+    }
+  },
+  "AllowedHosts": "*",
+  "Kestrel": {
+    "EndpointDefaults": {
+      "Protocols": "Http2"
+    }
+  }
+}

+ 12 - 10
TEAMModelOS.SDK/Module/AzureCosmosDB/Implements/AzureCosmosDBRepository.cs

@@ -146,16 +146,18 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
                 else { throw new BizException("PartitionKey can only be single!"); }
             }
         }
-        public async Task<T> Save<T>(T entity) //where T : object, new()
+        public async Task<T> Save<T>(T entity)  //where T : object, new()
         {
-            Type t = typeof(T);
-            DocumentCollection documentCollection = await InitializeCollection<T>();
-            ResourceResponse<Document> doc =
-                await CosmosClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(Database, t.Name), entity);
-            //Console.WriteLine(doc.ActivityId);
-
-
-            return entity;
+            try {
+                Type t = typeof(T);
+                DocumentCollection documentCollection = await InitializeCollection<T>();
+                ResourceResponse<Document> doc =
+                    await CosmosClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(Database, t.Name), entity);
+                //Console.WriteLine(doc.ActivityId);
+                return entity;
+            } catch (Exception e ) {
+                throw  new  BizException(e.Message);
+            }
         }
 
         public async Task<T> Update<T>(T entity)
@@ -512,7 +514,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Implements
             }
             return list;
         }
-        public async Task<List<T>> DeleteALl<T>(Dictionary<string, object> dict)
+        public async Task<List<T>> DeleteAll<T>(Dictionary<string, object> dict)
         {
             DocumentCollection dataCollection = await InitializeCollection<T>();
             List<T> list = await FindByParams<T>(dict);

+ 2 - 2
TEAMModelOS.SDK/Module/AzureCosmosDB/Interfaces/IAzureCosmosDBRepository.cs

@@ -8,7 +8,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces
 {
     public interface IAzureCosmosDBRepository
     {
-        Task<T> Save<T>(T entity);
+        Task<T> Save<T>(T entity)  ;
         Task<T> Update<T>(T entity);
         Task<string> ReplaceObject<T>(T entity, string key);
         Task<string> ReplaceObject<T>(T entity, string key, string partitionKey);
@@ -22,6 +22,6 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces
         Task<List<T>> FindByParams<T>(Dictionary<string, object> dict);
         Task<List<T>> SaveAll<T>(List<T> enyites);
         Task<List<T>> UpdateAll<T>(Dictionary<string, object> dict, Dictionary<string, object> updateFilters, List<string> deleteKeys = null);
-        Task<List<T>> DeleteALl<T>(Dictionary<string, object> dict);
+        Task<List<T>> DeleteAll<T>(Dictionary<string, object> dict);
     }
 }

+ 1 - 1
TEAMModelOS.API/Models/Core/Classroom.cs

@@ -4,7 +4,7 @@ using System.Text;
 using System.Text.Json.Serialization;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 
-namespace TEAMModelOS.API.Models.Core
+namespace TEAMModelOS.Service.Models.Core
 {
    public class Classroom
     {

+ 1 - 1
TEAMModelOS.API/Models/Core/Grade.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.API.Models.Core
+namespace TEAMModelOS.Service.Models.Core
 {
     public class Grade
     {

+ 1 - 1
TEAMModelOS.API/Models/Core/Period.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.API.Models.Core
+namespace TEAMModelOS.Service.Models.Core
 {
     public class Period
     {

+ 1 - 1
TEAMModelOS.API/Models/Core/School.cs

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 using System.Text;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 
-namespace TEAMModelOS.API.Models.Core
+namespace TEAMModelOS.Service.Models.Core
 {
     public class School
     {

+ 1 - 1
TEAMModelOS.API/Models/Core/Semester.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.API.Models.Core
+namespace TEAMModelOS.Service.Models.Core
 {
     public class Semester
     {

+ 1 - 1
TEAMModelOS.API/Models/Core/Student.cs

@@ -4,7 +4,7 @@ using System.Collections.Generic;
 using System.Text;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 
-namespace TEAMModelOS.API.Models.Core
+namespace TEAMModelOS.Service.Models.Core
 {
     public class Student
     {

+ 1 - 1
TEAMModelOS.API/Models/Core/Subject.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.API.Models.Core
+namespace TEAMModelOS.Service.Models.Core
 {
     public class Subject
     {

+ 48 - 0
TEAMModelOS.Service/Models/Syllabus/KnowledgeBlock.cs

@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+
+namespace TEAMModelOS.Service.Models.Syllabus
+{
+    public class KnowledgeBlock
+    {
+        public string id { get; set; }
+        /// <summary>
+        /// 0 标准,1自建,2.....
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public int type { get; set; } = 0;
+        /// <summary>
+        /// 名称
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string Name { get; set; }
+        /// <summary>
+        /// 描述
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string Alias { get; set; }
+        /// <summary>
+        /// 学科
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string SubjectCode { get; set; }
+        /// <summary>
+        /// 学校编码
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        [PartitionKey]
+        public string SchoolCode { get; set; }
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public int Order { get; set; }
+        /// <summary>
+        /// 删除状态0 删除 1 有效
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public int Status { get; set; } = 1;
+    }
+
+    
+}

+ 40 - 0
TEAMModelOS.Service/Models/Syllabus/KnowledgePoint.cs

@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace TEAMModelOS.Service.Models.Syllabus
+{
+    public class KnowledgePoint
+    {  
+        public string id { get; set; }
+
+        /// <summary>
+        /// 名称
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string name { get; set; }
+        /// <summary>
+        /// 描述
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string alias { get; set; }
+        /// <summary>
+        /// 学科
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string subjectCode { get; set; }
+        /// <summary>
+        /// 学校编码
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string schoolCode { get; set; }
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public int order { get; set; }
+        /// <summary>
+        /// 删除状态0 删除 1 有效
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public int status { get; set; } = 1;
+    }
+}

+ 17 - 23
TEAMModelOS.API/Models/Syllabus/SyllabusNode.cs

@@ -1,49 +1,43 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
-using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
 
-namespace TEAMModelOS.API.Models.Syllabus
+namespace TEAMModelOS.Service.Models.Syllabus
 {
     public class SyllabusNode
     {
         /// <summary>
-        /// 语言分区
+        /// 
         /// </summary>
-        public string PartitionKey { get; set; }
-        /// <summary>
-        /// 唯一主键
-        /// </summary>
-        public string RowKey { get; set; }
-
+        public string id { get; set; }
         /// <summary>
         /// 标题
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
-        public string Title { get; set; }
+        public string title { get; set; }
         /// <summary>
         /// 是否展开
         /// </summary>
-        public bool Expand { get; set; }
+        public bool expand { get; set; }
         /// <summary>
         /// 排序
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
-        public int Order { get; set; }
+        public int order { get; set; }
         /// <summary>
         /// 类型
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
-        public int Type { get; set; }
+        public int type { get; set; }
         /// <summary>
         /// 备注
         /// </summary>
-        public string Remark { get; set; }
+        public string remark { get; set; }
         /// <summary>
         /// 节点Key
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
-        public string NodeKey { get; set; }
+        public string nodeKey { get; set; }
         ///// <summary>
         /////主键
         ///// </summary>
@@ -53,22 +47,22 @@ namespace TEAMModelOS.API.Models.Syllabus
         /// 父级
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
-        public string Pid { get; set; }
+        public string pid { get; set; }
         public SyllabusNode()
         {
-            Children = new List<SyllabusNode>();
+            children = new List<SyllabusNode>();
         }
-        public List<SyllabusNode> Children { get; set; }
+        public List<SyllabusNode> children { get; set; }
         /// <summary>
         /// 册别编码
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
-        public string VolumeCode { get; set; }
-
+        [PartitionKey]
+        public string volumeCode { get; set; }
         /// <summary>
         /// 数据状态
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
-        public int Status { get; set; } = 1;
+        public int status { get; set; } = 1;
     }
 }

+ 38 - 0
TEAMModelOS.Service/Models/Syllabus/Volume.cs

@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+using System.Text.Json.Serialization;
+using System.ComponentModel.DataAnnotations;
+
+namespace TEAMModelOS.Service.Models.Syllabus
+{
+    public class Volume
+    { 
+        /// <summary>
+        /// id生成规则
+        /// </summary>
+        public string id { get; set; }
+        /// <summary>
+        /// 0默认教学课纲的册别 1个人或单独的专题课纲册别
+        /// </summary>
+        public int type { get; set; }
+        /// <summary>
+        /// Type 如果为0 则是学校编码  如果为1 则是seminar 专题/研讨/培训
+        /// </summary>
+        [PartitionKey]
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string schoolCode { get; set; }
+        public string periodCode { get; set; }
+        public string subjectCode { get; set; }
+        public string gradeCode { get; set; }
+        public string semesterCode { get; set; }
+        public int status { get; set; } = 1;
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string volumeName { get; set; }
+        public string volumeCode { get; set; }
+        [JsonPropertyName("TEAMModelId")]
+        public string TEAMModelId { get; set; }
+        public string[] editors { get; set; }
+    }
+}

+ 15 - 0
TEAMModelOS.Service/TEAMModelOS.Service.csproj

@@ -0,0 +1,15 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp3.0</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Folder Include="Services\" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\TEAMModelOS.SDK\TEAMModelOS.SDK.csproj" />
+  </ItemGroup>
+
+</Project>

+ 12 - 6
TEAMModelOS.sln

@@ -5,9 +5,11 @@ VisualStudioVersion = 16.0.29418.71
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TEAMModelOS.SDK", "TEAMModelOS.SDK\TEAMModelOS.SDK.csproj", "{E804B5FA-8D72-4ED4-AF9E-8AA48C17CE76}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TEAMModelOS.API", "TEAMModelOS.API\TEAMModelOS.API.csproj", "{0447112F-4F4B-4BE0-B2AE-577984D97258}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TEAMModelOS", "TEAMModelOS\TEAMModelOS.csproj", "{4FA680FB-FFF6-4EC5-ACCF-C3C2653FDB48}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TEAMModelOS", "TEAMModelOS\TEAMModelOS.csproj", "{4FA680FB-FFF6-4EC5-ACCF-C3C2653FDB48}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TEAMModelOS.Service", "TEAMModelOS.Service\TEAMModelOS.Service.csproj", "{04508AB6-CD54-46B4-B96D-9672EB66761B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TEAMModelOS.Grpc", "TEAMModelOS.Grpc\TEAMModelOS.Grpc.csproj", "{75C46F80-6FDB-4589-A045-1C10F3FCD225}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -19,14 +21,18 @@ Global
 		{E804B5FA-8D72-4ED4-AF9E-8AA48C17CE76}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{E804B5FA-8D72-4ED4-AF9E-8AA48C17CE76}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E804B5FA-8D72-4ED4-AF9E-8AA48C17CE76}.Release|Any CPU.Build.0 = Release|Any CPU
-		{0447112F-4F4B-4BE0-B2AE-577984D97258}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{0447112F-4F4B-4BE0-B2AE-577984D97258}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{0447112F-4F4B-4BE0-B2AE-577984D97258}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{0447112F-4F4B-4BE0-B2AE-577984D97258}.Release|Any CPU.Build.0 = Release|Any CPU
 		{4FA680FB-FFF6-4EC5-ACCF-C3C2653FDB48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{4FA680FB-FFF6-4EC5-ACCF-C3C2653FDB48}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{4FA680FB-FFF6-4EC5-ACCF-C3C2653FDB48}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{4FA680FB-FFF6-4EC5-ACCF-C3C2653FDB48}.Release|Any CPU.Build.0 = Release|Any CPU
+		{04508AB6-CD54-46B4-B96D-9672EB66761B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{04508AB6-CD54-46B4-B96D-9672EB66761B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{04508AB6-CD54-46B4-B96D-9672EB66761B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{04508AB6-CD54-46B4-B96D-9672EB66761B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{75C46F80-6FDB-4589-A045-1C10F3FCD225}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{75C46F80-6FDB-4589-A045-1C10F3FCD225}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{75C46F80-6FDB-4589-A045-1C10F3FCD225}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{75C46F80-6FDB-4589-A045-1C10F3FCD225}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 1 - 1
TEAMModelOS.API/Controllers/BaseController.cs

@@ -6,7 +6,7 @@ using TEAMModelOS.SDK.Extension.JwtAuth.Models;
 using TEAMModelOS.SDK.Context.Constant.Common;
 using System.Security.Claims;
 
-namespace TEAMModelOS.API.Controllers
+namespace TEAMModelOS.Controllers
 {
     public class BaseController : Controller
     {

+ 2 - 2
TEAMModelOS.API/Controllers/Core/ClassroomController.cs

@@ -3,13 +3,13 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
-using TEAMModelOS.API.Models.Core;
+using TEAMModelOS.Service.Models.Core;
 using TEAMModelOS.SDK.Context.Exception;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 
-namespace TEAMModelOS.API.Controllers.Core
+namespace TEAMModelOS.Controllers.Syllabus
 {
     [Route("api/[controller]")]
     [ApiController]

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

@@ -13,7 +13,7 @@ using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper.JsonPath;
 using static System.Text.Json.JsonElement;
 
-namespace TEAMModelOS.API.Controllers.Core
+namespace TEAMModelOS.Controllers.Syllabus
 {
     [Route("api/[controller]")]
     [ApiController]

+ 134 - 0
TEAMModelOS/Controllers/Core/FileController.cs

@@ -0,0 +1,134 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Helper.Common.JsonHelper;
+using TEAMModelOS.SDK.Helper.Common.XmlHelper;
+using TEAMModelOS.SDK.Module.AzureBlob.Container;
+using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
+using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
+using TEAMModelOS.SDK.Module.PowerPointX.Model;
+
+namespace TEAMModelOS.Controllers.Syllabus
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    public class FileController:BaseController
+    {
+        private readonly IAzureTableDBRepository azureTableDBRepository;
+        private readonly IAzureBlobDBRepository _azureBlobDBRepository;
+        public FileController(IAzureTableDBRepository _azureTableDBRepository, IAzureBlobDBRepository azureBlobDBRepository)
+        {
+            azureTableDBRepository = _azureTableDBRepository;
+            _azureBlobDBRepository = azureBlobDBRepository;
+        }
+
+
+        [HttpPost("uploadFiles")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<BaseJosnRPCResponse> BlobSaveFile([FromForm] IFormFile[] files)
+        {
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+            FileTypeMap fileTypeMap = new FileTypeMap();
+            fileTypeMap.GetFileTypes().TryGetValue(FileType.GetExtention(files[0].FileName).ToLower(), out FileType fileTpye);
+            string type = "";
+            if (fileTpye != null)
+            {
+                type = fileTpye.Type;
+            }
+
+            List<AzureBlobModel> list = await _azureBlobDBRepository.UploadFiles(files);
+            await azureTableDBRepository.SaveAll<AzureBlobModel>(list);
+            return responseBuilder.Data(list).build();
+        }
+        [HttpPost("uploadFile")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<BaseJosnRPCResponse> BlobSaveFile([FromForm] IFormFile file)
+        {
+            //IFormFileCollection s =  Request.Form.Files;
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+            FileTypeMap fileTypeMap = new FileTypeMap();
+            fileTypeMap.GetFileTypes().TryGetValue(FileType.GetExtention(file.FileName).ToLower(), out FileType fileTpye);
+            string type = "";
+            if (fileTpye != null)
+            {
+                type = fileTpye.Type;
+            }
+            List<IFormFile> files = new List<IFormFile>();
+            files.Add(file);
+            List<AzureBlobModel> list = await _azureBlobDBRepository.UploadFiles(files.ToArray());
+            await azureTableDBRepository.SaveAll<AzureBlobModel>(list);
+            return responseBuilder.Data(list).build();
+        }
+       
+        [HttpPost("uploadWangEditor")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<Dictionary<string, Object>> uploadWangEditor([FromForm] IFormFile[] files)
+        {
+            //IFormFileCollection s =  Request.Form.Files;
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+            FileTypeMap fileTypeMap = new FileTypeMap();
+            fileTypeMap.GetFileTypes().TryGetValue(FileType.GetExtention(files[0].FileName).ToLower(), out FileType fileTpye);
+            string type = "";
+            if (fileTpye != null)
+            {
+                type = fileTpye.Type;
+            }
+            List<AzureBlobModel> list = await _azureBlobDBRepository.UploadFiles(files.ToArray());
+            await azureTableDBRepository.SaveAll<AzureBlobModel>(list);
+            return new Dictionary<string, object> { { "errno", 0 }, { "data", list.Select(x => x.BlobUrl) } };
+        }
+       
+
+ 
+
+
+        /// <summary>
+        /// {"Sha1Code":"1111","Length":233444}
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("uploaded")]
+        public async Task<BaseJosnRPCResponse> uploaded(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+            List<AzureBlobModel> models = await azureTableDBRepository.FindListByDict<AzureBlobModel>(request.@params);
+            if (models.IsNotEmpty())
+            {
+                return responseBuilder.Data(models.First()).build();
+            }
+            else
+            {
+                return responseBuilder.Data(null).build();
+            }
+        }
+
+
+
+        /// <summary>
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("saveBlob")]
+        public async Task<BaseJosnRPCResponse> saveBlob(JosnRPCRequest<AzureBlobModel> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+            AzureBlobModel model = await azureTableDBRepository.SaveOrUpdate<AzureBlobModel>(request.@params);
+            if (model != null && !string.IsNullOrEmpty(model.RowKey))
+            {
+                return responseBuilder.Data(model).build();
+            }
+            else
+            {
+                return responseBuilder.Data(null).build();
+            }
+        }
+    }
+}

+ 2 - 2
TEAMModelOS.API/Controllers/Core/SchoolController.cs

@@ -3,12 +3,12 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
-using TEAMModelOS.API.Models.Core;
+using TEAMModelOS.Service.Models.Core;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 
-namespace TEAMModelOS.API.Controllers.Core
+namespace TEAMModelOS.Controllers.Syllabus
 {
     [Route("api/[controller]")]
     [ApiController]

+ 2 - 2
TEAMModelOS.API/Controllers/Core/StudentController.cs

@@ -4,13 +4,13 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using TEAMModelOS.API.Models.Core;
+using TEAMModelOS.Service.Models.Core;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
 using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 
-namespace TEAMModelOS.API.Controllers.Core
+namespace TEAMModelOS.Controllers.Syllabus
 {
     [Route("api/[controller]")]
     [ApiController]

+ 15 - 0
TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs

@@ -0,0 +1,15 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.Controllers.Syllabus
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    //[Authorize]
+    public class KnowledgeController : BaseController
+    {
+
+    }
+}

+ 80 - 0
TEAMModelOS/Controllers/Syllabus/SyllabusController.cs

@@ -0,0 +1,80 @@
+using Microsoft.AspNetCore.Mvc;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK.Extension.SnowFlake;
+using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
+
+namespace TEAMModelOS.Controllers.Syllabus
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    //[Authorize]
+    public class SyllabusController : BaseController
+    {
+        private readonly IAzureCosmosDBRepository azureCosmosDBRepository;
+        public SyllabusController(IAzureCosmosDBRepository _azureCosmosDBRepository)
+        {
+            azureCosmosDBRepository = _azureCosmosDBRepository;
+        }
+        /// <summary>
+        /// 批量保存或更新课纲
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("SaveOrUpdateAll")]
+        public async Task<BaseJosnRPCResponse> SaveOrUpdateAll(JosnRPCRequest<SyllabusNode> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            if (string.IsNullOrEmpty(request.@params.id))
+            {
+                string key = IdWorker.getInstance().NextId() + "";
+            }
+            List<SyllabusNode> nodes = new List<SyllabusNode>();
+            nodes.Add(request.@params);
+            List<SyllabusNode> data = await azureCosmosDBRepository.SaveAll(nodes);
+            return builder.Data(data).build();
+        }
+        /// <summary>
+        /// 删除课纲
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("Delete")]
+        public async Task<BaseJosnRPCResponse> Delete(JosnRPCRequest<SyllabusNode> request)
+        {
+            bool flag = false;
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            if (string.IsNullOrEmpty(request.@params.id))
+            {
+                await azureCosmosDBRepository.DeleteAsync<SyllabusNode>(request.@params.id, request.@params.volumeCode);
+                flag = true;
+            }
+            return builder.Data(flag).build();
+        }
+        /// <summary>
+        /// 查找课纲
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("Find")]
+        public async Task<BaseJosnRPCResponse> Find(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+            bool flag = false;
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            if (request.@params.TryGetValue("volumeCode", out _))
+            {
+                await azureCosmosDBRepository.FindByParams<SyllabusNode>(request.@params);
+                flag = true;
+            }
+            else
+            {
+                throw new BizException("volumeCode is  null!");
+            }
+            return builder.Data(flag).build();
+        }
+    }
+}

+ 113 - 0
TEAMModelOS/Controllers/Syllabus/VolumeController.cs

@@ -0,0 +1,113 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.Service.Models.Core;
+using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+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;
+
+namespace TEAMModelOS.Controllers.Syllabus
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    public class VolumeController : BaseController
+    {
+        private readonly IAzureCosmosDBRepository azureCosmosDBRepository;
+        public VolumeController(IAzureCosmosDBRepository _azureCosmosDBRepository)
+        {
+            azureCosmosDBRepository = _azureCosmosDBRepository;
+        }
+
+        /// <summary>
+        /// 新增册别
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("SaveOrUpdate")]
+        public async Task<BaseJosnRPCResponse> SaveOrUpdate(JosnRPCRequest<Volume> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            if (request.@params.editors != null && request.@params.editors.Length > 5)
+            {
+                throw new BizException("共编人数大于5人!");
+            }
+            if (string.IsNullOrEmpty(request.@params.id))
+            {
+                if (request.@params.type == 0)
+                {
+                    string key = ShaHashHelper.GetSHA1(request.@params.schoolCode + request.@params.periodCode + request.@params.subjectCode + request.@params.gradeCode + request.@params.semesterCode);
+                    request.@params.id = key;
+                    request.@params.volumeCode = key;
+                }
+                else
+                {
+                    string key = ShaHashHelper.GetSHA1(request.@params.schoolCode + request.@params.TEAMModelId + IdWorker.getInstance().NextId());
+                    request.@params.id = key;
+                    request.@params.volumeCode = key;
+                }
+            }
+            List<Volume> volumes = new List<Volume>();
+            volumes.Add(request.@params);
+            List<Volume> volume = await azureCosmosDBRepository.SaveAll<Volume>(volumes);
+            return builder.Data(volume.IsEmpty() ? null : volume[0]).build();
+        }
+        /// <summary>
+        /// 删除册别
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("Delete")]
+        public async Task<BaseJosnRPCResponse> Delete(JosnRPCRequest<Volume> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            bool flag = false;
+            if (string.IsNullOrEmpty(request.@params.id))
+            {
+                if (request.@params.type == 0)
+                {
+                    request.@params.status = 0;
+                    List<Volume> volumes = new List<Volume>();
+                    volumes.Add(request.@params);
+                    List<Volume> volume = await azureCosmosDBRepository.SaveAll<Volume>(volumes);
+                    flag = true;
+                }
+                else
+                {
+                    await azureCosmosDBRepository.DeleteAsync<Volume>(request.@params.id, request.@params.schoolCode);
+                    List<SyllabusNode> syllabusNodes = await azureCosmosDBRepository.DeleteAll<SyllabusNode>(new Dictionary<string, object>() { { "volumeCode", request.@params.id } });
+                    flag = true;
+                }
+            }
+            return builder.Data(flag).build();
+        }
+        /// <summary>
+        /// 查找册别
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("Find")]
+        public async Task<BaseJosnRPCResponse> Find(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            List<Volume> volumes = null;
+            if (request.@params.TryGetValue("schoolCode", out _))
+            {
+                volumes = await azureCosmosDBRepository.FindByParams<Volume>(request.@params);
+            }
+            else
+            {
+                throw new BizException("schoolCode is  null!");
+            }
+            return builder.Data(volumes).build();
+        }
+    }
+}

+ 1 - 1
TEAMModelOS/Controllers/IdentityController.cs

@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 
-namespace Api.Controllers
+namespace TEAMModelOS.Controllers.Test
 {
     [Authorize(Roles = "DaemonAppRole")] //之後設置金鑰權限身分
     [Route("[controller]")]

+ 1 - 1
TEAMModelOS/Controllers/TestController.cs

@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 
-namespace Api.Controllers
+namespace TEAMModelOS.Controllers.Test
 {
     [Authorize]
     [Route("[controller]")]

+ 1 - 1
TEAMModelOS/Controllers/WeatherForecast.cs

@@ -1,6 +1,6 @@
 using System;
 
-namespace TEAMModelOS
+namespace TEAMModelOS.Controllers.Test
 {
     public class WeatherForecast
     {

+ 1 - 1
TEAMModelOS/Controllers/WeatherForecastController.cs

@@ -5,7 +5,7 @@ using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Logging;
 
-namespace TEAMModelOS.Controllers
+namespace TEAMModelOS.Controllers.Test
 {
     [ApiController]
     [Route("[controller]")]

+ 2 - 0
TEAMModelOS/Startup.cs

@@ -12,6 +12,7 @@ using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using Microsoft.IdentityModel.Tokens;
 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;
@@ -114,6 +115,7 @@ namespace TEAMModelOS
             app.UseStaticFiles();
             //app.UseSpaStaticFiles(); //使用中間件不開
             app.UseRouting();
+            app.UseMiddleware<HttpGlobalExceptionInvoke>();
             //app.UseCors(MyAllowSpecificOrigins); //使用跨域設定
             //app.UseHttpsRedirection(); //開發中暫時關掉
             app.UseAuthentication();

+ 2 - 1
TEAMModelOS/TEAMModelOS.csproj

@@ -23,13 +23,14 @@
   </ItemGroup>
 
   <ItemGroup>
+    <Folder Include="Controllers\Evaluation\" />
     <Folder Include="JsonFile\Subject\" />
     <Folder Include="wwwroot\" />
   </ItemGroup>
   
   <ItemGroup>
     <ProjectReference Include="..\TEAMModelOS.SDK\TEAMModelOS.SDK.csproj" />
-    <ProjectReference Include="..\TEAMModelOS.API\TEAMModelOS.API.csproj" />
+    <ProjectReference Include="..\TEAMModelOS.Service\TEAMModelOS.Service.csproj" />
   </ItemGroup>
 
   <Target Name="DebugEnsureNodeEnv" BeforeTargets="Build">