Browse Source

1、新增知识点grpc,双向流保存或修改接口,服务器流查询接口,一元删除接口
2、新增课程grpc,服务器流查询接口
3、补充知识点,课程相关类注释,方便自动生成protobuf文件时有自动注解

李思淳 5 years ago
parent
commit
7a57f95d7e

+ 172 - 0
TEAMModelGrpc/Models/Dict.cs

@@ -0,0 +1,172 @@
+using Google.Protobuf;
+using Microsoft.Azure.Cosmos.Linq;
+using ProtoBuf;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+
+namespace TEAMModelGrpc.Models
+{
+    /// <summary>
+    /// 请求参数Dict
+    /// </summary>
+    [ProtoContract]
+    public class Dict
+    {
+        /// <summary>
+        /// 数字Dict
+        /// </summary>
+        [ProtoMember(1)]
+        public Dictionary<string, double> NMap { get; set; }
+        /// <summary>
+        /// 字符串Dict
+        /// </summary>
+        [ProtoMember(2)]
+        public Dictionary<string, string> SMap { get; set; }
+        /// <summary>
+        /// 布尔Dict
+        /// </summary>
+        [ProtoMember(3)] 
+        public Dictionary<string, bool> BMap { get; set; }
+        /// <summary>
+        /// 字符串ListMap
+        /// </summary>
+        [ProtoMember(4)]
+        public List<LSMap> LSMap { get; set; }
+        /// <summary>
+        /// 数字ListMap
+        /// </summary>
+        [ProtoMember(5)]
+        public List<LNMap> LNMap { get; set; }
+        /// <summary>
+        /// Byte ListMap
+        /// </summary>
+        [ProtoMember(6)]
+        public List<LBMap> LBMap { get; set; }
+
+        
+
+
+    }
+    /// <summary>
+    /// 字符串ListMap
+    /// </summary>
+    [ProtoContract]
+    public class LSMap
+    {
+        /// <summary>
+        /// 数字Dict
+        /// </summary>
+        [ProtoMember(1)]
+        public string Key { get; set; }
+        /// <summary>
+        /// 字符串数组
+        /// </summary>
+        [ProtoMember(2)]
+        public List<string> Value {get;set;}
+    }
+    /// <summary>
+    /// 数字ListMap
+    /// </summary>
+    [ProtoContract]
+    public class LNMap
+    {
+        /// <summary>
+        /// Key
+        /// </summary>
+        [ProtoMember(1)]
+        public string Key { get; set; }
+        /// <summary>
+        /// 数字数组
+        /// </summary>
+        [ProtoMember(2)]
+        public List<double> Value { get; set; }
+    }
+     
+    /// <summary>
+    /// Byte[] Map
+    /// </summary>
+    [ProtoContract]
+    public class LBMap
+    {
+        /// <summary>
+        /// Key
+        /// </summary>
+        [ProtoMember(1)]
+        public string Key { get; set; }
+        /// <summary>
+        /// byte数组
+        /// </summary>
+        [ProtoMember(2)]
+        public byte[] Value { get; set; }
+    }
+    /// <summary>
+    ///  Dict扩展
+    /// </summary>
+    public static class DictExt {
+        /// <summary>
+        ///  Dict扩展方法
+        /// </summary>
+        /// <param name="dict"></param>
+        /// <returns></returns>
+        public static Dictionary<string, object> ToDict(this Dict dict)
+        {
+
+            Dictionary<string, object> keyValues = new Dictionary<string, object>();
+            if (dict.SMap != null && dict.SMap.Keys.Count > 0)
+            {
+                foreach (string key in dict.SMap.Keys)
+                {
+                    keyValues[key] = dict.SMap[key];
+                }
+            }
+            if (dict.NMap != null && dict.NMap.Keys.Count > 0)
+            {
+                foreach (string key in dict.NMap.Keys)
+                {
+                    keyValues[key] = dict.NMap[key];
+                }
+            }
+            if (dict.BMap != null && dict.BMap.Keys.Count > 0)
+            {
+                foreach (string key in dict.BMap.Keys)
+                {
+                    keyValues[key] = dict.BMap[key];
+                }
+            }
+            if (dict.LSMap.IsNotEmpty())
+            {
+                foreach (LSMap map in dict.LSMap)
+                {
+                    if (!string.IsNullOrWhiteSpace(map.Key)&& map.Value.IsNotEmpty()) {
+                        keyValues[map.Key] = map.Value;
+                    }
+                }
+            }
+
+            if (dict.LNMap.IsNotEmpty())
+            {
+                foreach (LNMap map in dict.LNMap)
+                {
+                    if (!string.IsNullOrWhiteSpace(map.Key) && map.Value.IsNotEmpty())
+                    {
+                        keyValues[map.Key] = map.Value;
+                    }
+                }
+            }
+            if (dict.LBMap.IsNotEmpty())
+            {
+                foreach (LBMap map in dict.LBMap)
+                {
+                    if (!string.IsNullOrWhiteSpace(map.Key) && map.Value.IsNotEmpty())
+                    {
+                        keyValues[map.Key] = map.Value;
+                    }
+                }
+            }
+            return keyValues;
+        }
+    }
+}

+ 25 - 0
TEAMModelGrpc/Models/ListPid.cs

@@ -0,0 +1,25 @@
+using ProtoBuf;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+
+namespace TEAMModelGrpc.Models
+{
+    [ProtoContract]
+    public class ListPid
+    {
+        /// <summary>
+        /// key 是pk ,value 是id
+        /// </summary>
+        [ProtoMember(1)]
+        public List<KeyValuePair<string, string>> ids { set; get; }
+
+        /// <summary>
+        /// 返回 删除结果
+        /// </summary>
+        [ProtoMember(2)]
+        public List<IdPk> idPks { set; get; }
+    }
+}

+ 78 - 0
TEAMModelGrpc/Protos/CourseService.proto

@@ -0,0 +1,78 @@
+syntax = "proto3";
+option csharp_namespace = "TMDGrpc.CourseService";
+package math;
+
+
+service CourseService {
+   rpc FindCourseByDict(Dict) returns(stream Course);
+
+}
+
+
+
+//请求参数Dict
+message Dict {
+   //数字Dict
+   map<string,double> NMap = 1;
+   //字符串Dict
+   map<string,string> SMap = 2;
+   //布尔Dict
+   map<string,bool> BMap = 3;
+   //字符串ListMap
+   repeated LSMap LSMap = 4;
+   //数字ListMap
+   repeated LNMap LNMap = 5;
+   //Byte ListMap
+   repeated LBMap LBMap = 6;
+}
+
+//Byte[] Map
+message LBMap {
+   //Key
+   string Key = 1;
+   //byte数组
+   bytes Value = 2;
+}
+
+//数字ListMap
+message LNMap {
+   //Key
+   string Key = 1;
+   //数字数组
+   repeated double Value = 2 [packed = false];
+}
+
+//字符串ListMap
+message LSMap {
+   //数字Dict
+   string Key = 1;
+   //字符串数组
+   repeated string Value = 2;
+}
+
+message BaseInfo {
+   string courseCode = 1;
+   string courseName = 2;
+   string periodCode = 3;
+   string gradeCode = 4;
+   string subjectCode = 5;
+   string notice = 6;
+}
+
+message Course {
+   string scopeCode = 1;
+   BaseInfo baseInfo = 2;
+   repeated string assistTeacher = 3;
+   repeated CourseTime courseTime = 4;
+   repeated string classroom = 5;
+   repeated string syllabus = 6;
+   string id = 7;
+}
+
+message CourseTime {
+   string frequencyCode = 1;
+   string beginTime = 2;
+   string endTime = 3;
+   string classroomCode = 4;
+   string frequencyName = 5;
+}

+ 133 - 5
TEAMModelGrpc/Protos/KnowledgeService.proto

@@ -1,18 +1,57 @@
 syntax = "proto3";
-option csharp_namespace = "TMDGrpc";
+option csharp_namespace = "TMDGrpc.KnowledgeService";
 package math;
 
 
 service KnowledgeService {
-   rpc FinKnowledge(RequestDict) returns(stream Knowledge);
+   rpc FinKnowledge(Dict) returns(stream Knowledge);
+
+   rpc SaveKnowledge(stream Knowledge) returns(stream Knowledge);
+
+   rpc DeleteKnowledge(ListPid) returns(ListPid);
 
 }
 
 
 
-message RequestDict {
-   //查询dict
-   map<string,string> dict = 1;
+//请求参数Dict
+message Dict {
+   //数字Dict
+   map<string,double> NMap = 1;
+   //字符串Dict
+   map<string,string> SMap = 2;
+   //布尔Dict
+   map<string,bool> BMap = 3;
+   //字符串ListMap
+   repeated LSMap LSMap = 4;
+   //数字ListMap
+   repeated LNMap LNMap = 5;
+   //Byte ListMap
+   repeated LBMap LBMap = 6;
+}
+
+//Byte[] Map
+message LBMap {
+   //Key
+   string Key = 1;
+   //byte数组
+   bytes Value = 2;
+}
+
+//数字ListMap
+message LNMap {
+   //Key
+   string Key = 1;
+   //数字数组
+   repeated double Value = 2 [packed = false];
+}
+
+//字符串ListMap
+message LSMap {
+   //数字Dict
+   string Key = 1;
+   //字符串数组
+   repeated string Value = 2;
 }
 
 message Knowledge {
@@ -28,4 +67,93 @@ message Knowledge {
    string knowledgeId = 10;
    int32 source = 11;
    string period = 12;
+}
+
+enum HttpStatusCode {
+   option allow_alias = true;
+   ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything)
+   Continue = 100;
+   SwitchingProtocols = 101;
+   Processing = 102;
+   EarlyHints = 103;
+   OK = 200;
+   Created = 201;
+   Accepted = 202;
+   NonAuthoritativeInformation = 203;
+   NoContent = 204;
+   ResetContent = 205;
+   PartialContent = 206;
+   MultiStatus = 207;
+   AlreadyReported = 208;
+   IMUsed = 226;
+   Ambiguous = 300;
+   MultipleChoices = 300;
+   MovedPermanently = 301;
+   Moved = 301;
+   Found = 302;
+   Redirect = 302;
+   SeeOther = 303;
+   RedirectMethod = 303;
+   NotModified = 304;
+   UseProxy = 305;
+   Unused = 306;
+   TemporaryRedirect = 307;
+   RedirectKeepVerb = 307;
+   PermanentRedirect = 308;
+   BadRequest = 400;
+   Unauthorized = 401;
+   PaymentRequired = 402;
+   Forbidden = 403;
+   NotFound = 404;
+   MethodNotAllowed = 405;
+   NotAcceptable = 406;
+   ProxyAuthenticationRequired = 407;
+   RequestTimeout = 408;
+   Conflict = 409;
+   Gone = 410;
+   LengthRequired = 411;
+   PreconditionFailed = 412;
+   RequestEntityTooLarge = 413;
+   RequestUriTooLong = 414;
+   UnsupportedMediaType = 415;
+   RequestedRangeNotSatisfiable = 416;
+   ExpectationFailed = 417;
+   MisdirectedRequest = 421;
+   UnprocessableEntity = 422;
+   Locked = 423;
+   FailedDependency = 424;
+   UpgradeRequired = 426;
+   PreconditionRequired = 428;
+   TooManyRequests = 429;
+   RequestHeaderFieldsTooLarge = 431;
+   UnavailableForLegalReasons = 451;
+   InternalServerError = 500;
+   NotImplemented = 501;
+   BadGateway = 502;
+   ServiceUnavailable = 503;
+   GatewayTimeout = 504;
+   HttpVersionNotSupported = 505;
+   VariantAlsoNegotiates = 506;
+   InsufficientStorage = 507;
+   LoopDetected = 508;
+   NotExtended = 510;
+   NetworkAuthenticationRequired = 511;
+}
+
+message IdPk {
+   string id = 1;
+   string pk = 2;
+   HttpStatusCode StatusCode = 3;
+}
+
+message KeyValuePair_String_String {
+   string Key = 1;
+   string Value = 2;
+}
+
+message ListPid {
+   //key 是pk ,value 是id
+   repeated KeyValuePair_String_String ids = 1;
+   //返回 删除结果
+   repeated IdPk idPks = 2;
 }

+ 0 - 21
TEAMModelGrpc/Protos/greet.proto

@@ -1,21 +0,0 @@
-syntax = "proto3";
-
-option csharp_namespace = "TEAMModelGrpc";
-
-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;
-}

+ 39 - 0
TEAMModelGrpc/Services/CourseService.cs

@@ -0,0 +1,39 @@
+using Grpc.Core;
+using Grpc.Extension.Abstract;
+using Microsoft.AspNetCore.Authorization;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelGrpc.Models;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Courses;
+
+namespace TEAMModelGrpc.Services
+{
+    public class CourseService : IGrpcService
+    {
+        public IAzureCosmosDBV3Repository _cosmos;
+
+        public CourseService(IAzureCosmosDBV3Repository cosmosDBV3Repository)
+        {
+            this._cosmos = cosmosDBV3Repository;
+        }
+
+        [Authorize]
+        public async Task FindCourseByDict(Dict request, IServerStreamWriter<Course> responseStream, ServerCallContext context)
+        {
+
+            Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
+            keyValuePairs = request.ToDict();
+
+            List<Course> course = await _cosmos.FindByDict<Course>(keyValuePairs);
+            course.ForEach(x =>
+            {
+                responseStream.WriteAsync(x);
+            });
+
+
+        }
+    }
+}

+ 89 - 0
TEAMModelGrpc/Services/DataUtils.cs

@@ -0,0 +1,89 @@
+using ProtoBuf;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Threading.Tasks;
+
+namespace TEAMModelGrpc.Services
+{
+        public class DataUtils
+        {
+            public static byte[] ObjectToBytes<T>(T instance)
+            {
+                try
+                {
+                    byte[] array;
+                    if (instance == null)
+                    {
+                        array = new byte[0];
+                    }
+                    else
+                    {
+                        MemoryStream memoryStream = new MemoryStream();
+                        Serializer.Serialize(memoryStream, instance);
+                        array = new byte[memoryStream.Length];
+                        memoryStream.Position = 0L;
+                        memoryStream.Read(array, 0, array.Length);
+                        memoryStream.Dispose();
+                    }
+
+                    return array;
+
+                }
+                catch (Exception ex)
+                {
+
+                    return new byte[0];
+                }
+            }
+
+            public static T BytesToObject<T>(byte[] bytesData, int offset, int length)
+            {
+                if (bytesData.Length == 0)
+                {
+                    return default(T);
+                }
+                try
+                {
+                    MemoryStream memoryStream = new MemoryStream();
+                    memoryStream.Write(bytesData, 0, bytesData.Length);
+                    memoryStream.Position = 0L;
+                    T result = Serializer.Deserialize<T>(memoryStream);
+                    memoryStream.Dispose();
+                    return result;
+                }
+                catch (Exception ex)
+                {
+                    return default(T);
+                }
+            }
+        public static byte[] DictToBytes(Dictionary<string, object> dic)
+        {
+            if (dic == null || !dic.Any())
+            {
+                return null;
+            }
+            using (MemoryStream ms = new MemoryStream())
+            {
+                BinaryFormatter binFormatter = new BinaryFormatter();
+                binFormatter.Serialize(ms, dic);
+                byte[] dicBytes = ms.ToArray();
+                return dicBytes;
+            }
+        }
+
+        public static Dictionary<string, object> BytesToDict(byte[] dicBytes)
+        {
+            Dictionary<string, object> dic = new Dictionary<string, object>();
+            using (MemoryStream ms = new MemoryStream(dicBytes))
+            {
+                BinaryFormatter binFormatter = new BinaryFormatter();
+                dic = (Dictionary<string, object>)binFormatter.Deserialize(ms);
+            }
+            return dic;
+        }
+    }
+
+    }

+ 0 - 26
TEAMModelGrpc/Services/GreeterService.cs

@@ -1,26 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using Grpc.Core;
-using Microsoft.Extensions.Logging;
-
-namespace TEAMModelGrpc
-{
-    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
-            });
-        }
-    }
-}

+ 45 - 35
TEAMModelGrpc/Services/KnowledgeService.cs

@@ -3,12 +3,15 @@ using Grpc.Core;
 using Grpc.Extension.Abstract;
 using Microsoft.AspNetCore.Authorization;
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
+using TEAMModelGrpc.Models;
 using TEAMModelOS.SDK.Helper.Common.JsonHelper;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
 
 namespace TEAMModelGrpc.Services
 {
@@ -17,48 +20,55 @@ namespace TEAMModelGrpc.Services
     /// </summary>
     public class KnowledgeService : IGrpcService
     {
-        public IAzureCosmosDBV3Repository cosmosDBV3Repository;
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="cosmosDBV3Repository"></param>
-        public KnowledgeService(IAzureCosmosDBV3Repository cosmosDBV3Repository)
+        private IAzureCosmosDBV3Repository cosmosDBV3Repository;
+        private IKnowledgeService knowledgeService;
+
+        public KnowledgeService(IAzureCosmosDBV3Repository cosmosDBV3Repository, IKnowledgeService knowledgeService)
         {
             this.cosmosDBV3Repository = cosmosDBV3Repository;
+            this.knowledgeService = knowledgeService;
+        }
+
+        [Authorize]
+        public async Task FinKnowledge(Dict request, IServerStreamWriter<Knowledge> responseStream, ServerCallContext context)
+        {
+            Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
+            keyValuePairs = request.ToDict();
+            List<Knowledge> knowledges = await cosmosDBV3Repository.FindByDict<Knowledge>(keyValuePairs);
+            knowledges.ForEach(x =>
+            {
+                responseStream.WriteAsync(x);
+            });
         }
-     
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="request"></param>
-        /// <param name="context"></param>
-        /// <returns></returns>
-        public  Task<HelloReply> SayHello(Byte  request, ServerCallContext context)
+
+
+        [Authorize]
+        public async Task SaveKnowledge(IAsyncStreamReader<Knowledge> requestStream, IServerStreamWriter<Knowledge> responseStream, ServerCallContext context)
         {
-            return Task.FromResult(new HelloReply
+            //Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
+            //keyValuePairs = request.ToDict();
+            List<Knowledge> knowledges = new List<Knowledge>();
+            await foreach (var message in requestStream.ReadAllAsync())
             {
-                Message = "Hello " + request
+                knowledges.Add(message);
+            }
+
+            await knowledgeService.SaveOrUpdateKnowledge(knowledges);
+
+            knowledges.ForEach(x =>
+            {
+                responseStream.WriteAsync(x);
             });
         }
-        //[Authorize]
-        //public async Task FinKnowledge(string request, IServerStreamWriter<Family> responseStream, ServerCallContext context)
-        //{
-        //    Console.WriteLine("gRPC ");
-        //    string a = request.ToJson();
-        //    Dictionary<string, object> keyValuePairs = JsonNetHelper.FromJson<Dictionary<string, object>>(request);
-        //    List<Family> knowledges = await cosmosDBV3Repository.FindByDict<Family>(keyValuePairs);
-        //    ListKnowledge listKnowledge = new ListKnowledge();
-        //    listKnowledge.knowledges = knowledges;
-        //    knowledges.ForEach(x =>
-        //    {
-        //        responseStream.WriteAsync(x);
-        //    });
-        //    //foreach (Family family in knowledges)
-        //    //{
-        //    //    await responseStream.WriteAsync(family);
-        //    //}
-        //    //return await Task.FromResult(listKnowledge);
-        //}
+
+
+        public async Task<ListPid> DeleteKnowledge(ListPid listPid, ServerCallContext context)
+        {
+           List<IdPk> idPks = await cosmosDBV3Repository.DeleteAll<Knowledge>(listPid.ids);
+
+            listPid.idPks = idPks;
+            return listPid;
+        }
 
     }
 }

+ 13 - 1
TEAMModelGrpc/Startup.cs

@@ -16,6 +16,8 @@ using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Primitives;
 using Microsoft.IdentityModel.Tokens;
 using TEAMModelGrpc.Services;
+using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.SDK.Extension.JwtAuth;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
 using TEAMModelOS.SDK.Module.AzureCosmosDB.Configuration;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
@@ -68,6 +70,16 @@ namespace TEAMModelGrpc
             //使用CosmosDB
             services.AddAzureCosmosDBV3().AddCosmosDBV3Connection(_conf.GetSection("Azure:CosmosDB").Get<AzureCosmosDBOptions>())
                 .AddCosmosSerializer(new SystemTextJsonCosmosSerializer(new JsonSerializerOptions() { IgnoreNullValues = true }));
+ 
+            //注入CSRedis
+            var csredis = new CSRedis.CSRedisClient(_conf.GetSection("Azure:Redis:ConnectionString").Get<string>());
+            RedisHelper.Initialization(csredis);
+
+            //全局扫描基于IBusinessService接口的实现类
+            services.Scan(scan => scan.FromApplicationDependencies()
+               .AddClasses(classes => classes.AssignableTo<IBusinessService>())
+                   .AsImplementedInterfaces()
+                   .WithScopedLifetime());
 
         }
 
@@ -88,7 +100,7 @@ namespace TEAMModelGrpc
 
             app.UseEndpoints(endpoints =>
             {
-                endpoints.MapGrpcService<GreeterService>();
+                endpoints.MapGrpcService<KnowledgeService>();
 
                 endpoints.MapGet("/generateJwtToken", context =>
                 {

+ 2 - 5
TEAMModelGrpc/TEAMModelGrpc.csproj

@@ -9,6 +9,7 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <None Remove="Protos\CourseService.proto" />
     <None Remove="Protos\KnowledgeService.proto" />
   </ItemGroup>
 
@@ -26,12 +27,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
+    <Protobuf Include="Protos\CourseService.proto" GrpcServices="Server" />
     <Protobuf Include="Protos\KnowledgeService.proto" GrpcServices="Server" />
   </ItemGroup>
 
-  <ItemGroup>
-    <Folder Include="Models\" />
-  </ItemGroup>
-
 </Project>

+ 430 - 57
TEAMModelGrpc/TEAMModelOS.GRPC.xml

@@ -4,137 +4,510 @@
         <name>TEAMModelGrpc</name>
     </assembly>
     <members>
-        <member name="T:TEAMModelGrpc.Services.KnowledgeService">
+        <member name="T:TEAMModelGrpc.Models.Dict">
             <summary>
-            
+            请求参数Dict
             </summary>
         </member>
-        <member name="M:TEAMModelGrpc.Services.KnowledgeService.#ctor(TEAMModelOS.SDK.Module.AzureCosmosDBV3.IAzureCosmosDBV3Repository)">
+        <member name="P:TEAMModelGrpc.Models.Dict.NMap">
             <summary>
-            
+            数字Dict
             </summary>
-            <param name="cosmosDBV3Repository"></param>
         </member>
-        <member name="M:TEAMModelGrpc.Services.KnowledgeService.SayHello(System.Byte,Grpc.Core.ServerCallContext)">
+        <member name="P:TEAMModelGrpc.Models.Dict.SMap">
             <summary>
-            
+            字符串Dict
             </summary>
-            <param name="request"></param>
-            <param name="context"></param>
-            <returns></returns>
         </member>
-        <member name="T:TEAMModelGrpc.GreetReflection">
-            <summary>Holder for reflection information generated from Protos/greet.proto</summary>
+        <member name="P:TEAMModelGrpc.Models.Dict.BMap">
+            <summary>
+            布尔Dict
+            </summary>
         </member>
-        <member name="P:TEAMModelGrpc.GreetReflection.Descriptor">
-            <summary>File descriptor for Protos/greet.proto</summary>
+        <member name="P:TEAMModelGrpc.Models.Dict.LSMap">
+            <summary>
+            字符串ListMap
+            </summary>
         </member>
-        <member name="T:TEAMModelGrpc.HelloRequest">
+        <member name="P:TEAMModelGrpc.Models.Dict.LNMap">
             <summary>
-            The request message containing the user's name.
+            数字ListMap
             </summary>
         </member>
-        <member name="F:TEAMModelGrpc.HelloRequest.NameFieldNumber">
-            <summary>Field number for the "name" field.</summary>
+        <member name="P:TEAMModelGrpc.Models.Dict.LBMap">
+            <summary>
+            Byte ListMap
+            </summary>
+        </member>
+        <member name="T:TEAMModelGrpc.Models.LSMap">
+            <summary>
+            字符串ListMap
+            </summary>
         </member>
-        <member name="T:TEAMModelGrpc.HelloReply">
+        <member name="P:TEAMModelGrpc.Models.LSMap.Key">
             <summary>
-            The response message containing the greetings.
+            数字Dict
             </summary>
         </member>
-        <member name="F:TEAMModelGrpc.HelloReply.MessageFieldNumber">
-            <summary>Field number for the "message" field.</summary>
+        <member name="P:TEAMModelGrpc.Models.LSMap.Value">
+            <summary>
+            字符串数组
+            </summary>
         </member>
-        <member name="T:TEAMModelGrpc.Greeter">
+        <member name="T:TEAMModelGrpc.Models.LNMap">
             <summary>
-            The greeting service definition.
+            数字ListMap
             </summary>
         </member>
-        <member name="P:TEAMModelGrpc.Greeter.Descriptor">
-            <summary>Service descriptor</summary>
+        <member name="P:TEAMModelGrpc.Models.LNMap.Key">
+            <summary>
+            Key
+            </summary>
+        </member>
+        <member name="P:TEAMModelGrpc.Models.LNMap.Value">
+            <summary>
+            数字数组
+            </summary>
+        </member>
+        <member name="T:TEAMModelGrpc.Models.LBMap">
+            <summary>
+            Byte[] Map
+            </summary>
         </member>
-        <member name="T:TEAMModelGrpc.Greeter.GreeterBase">
-            <summary>Base class for server-side implementations of Greeter</summary>
+        <member name="P:TEAMModelGrpc.Models.LBMap.Key">
+            <summary>
+            Key
+            </summary>
+        </member>
+        <member name="P:TEAMModelGrpc.Models.LBMap.Value">
+            <summary>
+            byte数组
+            </summary>
+        </member>
+        <member name="T:TEAMModelGrpc.Models.DictExt">
+            <summary>
+             Dict扩展
+            </summary>
+        </member>
+        <member name="M:TEAMModelGrpc.Models.DictExt.ToDict(TEAMModelGrpc.Models.Dict)">
+            <summary>
+             Dict扩展方法
+            </summary>
+            <param name="dict"></param>
+            <returns></returns>
+        </member>
+        <member name="P:TEAMModelGrpc.Models.ListPid.ids">
+            <summary>
+            key 是pk ,value 是id
+            </summary>
         </member>
-        <member name="M:TEAMModelGrpc.Greeter.GreeterBase.SayHello(TEAMModelGrpc.HelloRequest,Grpc.Core.ServerCallContext)">
+        <member name="P:TEAMModelGrpc.Models.ListPid.idPks">
             <summary>
-            Sends a greeting
+            返回 删除结果
+            </summary>
+        </member>
+        <member name="T:TEAMModelGrpc.Services.KnowledgeService">
+            <summary>
+            
             </summary>
-            <param name="request">The request received from the client.</param>
-            <param name="context">The context of the server-side call handler being invoked.</param>
-            <returns>The response to send back to the client (wrapped by a task).</returns>
         </member>
-        <member name="M:TEAMModelGrpc.Greeter.BindService(TEAMModelGrpc.Greeter.GreeterBase)">
+        <member name="T:TMDGrpc.CourseService.CourseServiceReflection">
+            <summary>Holder for reflection information generated from Protos/CourseService.proto</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.CourseServiceReflection.Descriptor">
+            <summary>File descriptor for Protos/CourseService.proto</summary>
+        </member>
+        <member name="T:TMDGrpc.CourseService.Dict">
+             <summary>
+            请求参数Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Dict.NMapFieldNumber">
+            <summary>Field number for the "NMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.Dict.NMap">
+             <summary>
+            数字Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Dict.SMapFieldNumber">
+            <summary>Field number for the "SMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.Dict.SMap">
+             <summary>
+            字符串Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Dict.BMapFieldNumber">
+            <summary>Field number for the "BMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.Dict.BMap">
+             <summary>
+            布尔Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Dict.LSMapFieldNumber">
+            <summary>Field number for the "LSMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.Dict.LSMap">
+             <summary>
+            字符串ListMap
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Dict.LNMapFieldNumber">
+            <summary>Field number for the "LNMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.Dict.LNMap">
+             <summary>
+            数字ListMap
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Dict.LBMapFieldNumber">
+            <summary>Field number for the "LBMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.Dict.LBMap">
+             <summary>
+            Byte ListMap
+             </summary>
+        </member>
+        <member name="T:TMDGrpc.CourseService.LBMap">
+             <summary>
+            Byte[] Map
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.LBMap.KeyFieldNumber">
+            <summary>Field number for the "Key" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.LBMap.Key">
+             <summary>
+            Key
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.LBMap.ValueFieldNumber">
+            <summary>Field number for the "Value" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.LBMap.Value">
+             <summary>
+            byte数组
+             </summary>
+        </member>
+        <member name="T:TMDGrpc.CourseService.LNMap">
+             <summary>
+            数字ListMap
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.LNMap.KeyFieldNumber">
+            <summary>Field number for the "Key" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.LNMap.Key">
+             <summary>
+            Key
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.LNMap.ValueFieldNumber">
+            <summary>Field number for the "Value" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.LNMap.Value">
+             <summary>
+            数字数组
+             </summary>
+        </member>
+        <member name="T:TMDGrpc.CourseService.LSMap">
+             <summary>
+            字符串ListMap
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.LSMap.KeyFieldNumber">
+            <summary>Field number for the "Key" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.LSMap.Key">
+             <summary>
+            数字Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.LSMap.ValueFieldNumber">
+            <summary>Field number for the "Value" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.LSMap.Value">
+             <summary>
+            字符串数组
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.BaseInfo.CourseCodeFieldNumber">
+            <summary>Field number for the "courseCode" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.BaseInfo.CourseNameFieldNumber">
+            <summary>Field number for the "courseName" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.BaseInfo.PeriodCodeFieldNumber">
+            <summary>Field number for the "periodCode" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.BaseInfo.GradeCodeFieldNumber">
+            <summary>Field number for the "gradeCode" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.BaseInfo.SubjectCodeFieldNumber">
+            <summary>Field number for the "subjectCode" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.BaseInfo.NoticeFieldNumber">
+            <summary>Field number for the "notice" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Course.ScopeCodeFieldNumber">
+            <summary>Field number for the "scopeCode" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Course.BaseInfoFieldNumber">
+            <summary>Field number for the "baseInfo" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Course.AssistTeacherFieldNumber">
+            <summary>Field number for the "assistTeacher" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Course.CourseTimeFieldNumber">
+            <summary>Field number for the "courseTime" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Course.ClassroomFieldNumber">
+            <summary>Field number for the "classroom" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Course.SyllabusFieldNumber">
+            <summary>Field number for the "syllabus" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.Course.IdFieldNumber">
+            <summary>Field number for the "id" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.CourseTime.FrequencyCodeFieldNumber">
+            <summary>Field number for the "frequencyCode" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.CourseTime.BeginTimeFieldNumber">
+            <summary>Field number for the "beginTime" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.CourseTime.EndTimeFieldNumber">
+            <summary>Field number for the "endTime" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.CourseTime.ClassroomCodeFieldNumber">
+            <summary>Field number for the "classroomCode" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.CourseService.CourseTime.FrequencyNameFieldNumber">
+            <summary>Field number for the "frequencyName" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.CourseService.CourseService.Descriptor">
+            <summary>Service descriptor</summary>
+        </member>
+        <member name="T:TMDGrpc.CourseService.CourseService.CourseServiceBase">
+            <summary>Base class for server-side implementations of CourseService</summary>
+        </member>
+        <member name="M:TMDGrpc.CourseService.CourseService.BindService(TMDGrpc.CourseService.CourseService.CourseServiceBase)">
             <summary>Creates service definition that can be registered with a server</summary>
             <param name="serviceImpl">An object implementing the server-side handling logic.</param>
         </member>
-        <member name="M:TEAMModelGrpc.Greeter.BindService(Grpc.Core.ServiceBinderBase,TEAMModelGrpc.Greeter.GreeterBase)">
+        <member name="M:TMDGrpc.CourseService.CourseService.BindService(Grpc.Core.ServiceBinderBase,TMDGrpc.CourseService.CourseService.CourseServiceBase)">
             <summary>Register service method with a service binder with or without implementation. Useful when customizing the  service binding logic.
             Note: this method is part of an experimental API that can change or be removed without any prior notice.</summary>
             <param name="serviceBinder">Service methods will be bound by calling <c>AddMethod</c> on this object.</param>
             <param name="serviceImpl">An object implementing the server-side handling logic.</param>
         </member>
-        <member name="T:TMDGrpc.KnowledgeServiceReflection">
+        <member name="T:TMDGrpc.KnowledgeService.KnowledgeServiceReflection">
             <summary>Holder for reflection information generated from Protos/KnowledgeService.proto</summary>
         </member>
-        <member name="P:TMDGrpc.KnowledgeServiceReflection.Descriptor">
+        <member name="P:TMDGrpc.KnowledgeService.KnowledgeServiceReflection.Descriptor">
             <summary>File descriptor for Protos/KnowledgeService.proto</summary>
         </member>
-        <member name="F:TMDGrpc.RequestDict.DictFieldNumber">
-            <summary>Field number for the "dict" field.</summary>
+        <member name="F:TMDGrpc.KnowledgeService.HttpStatusCode.Zero">
+            <summary>
+            proto3 requires a zero value as the first item (it can be named anything)
+            </summary>
+        </member>
+        <member name="T:TMDGrpc.KnowledgeService.Dict">
+             <summary>
+            请求参数Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.Dict.NMapFieldNumber">
+            <summary>Field number for the "NMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.Dict.NMap">
+             <summary>
+            数字Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.Dict.SMapFieldNumber">
+            <summary>Field number for the "SMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.Dict.SMap">
+             <summary>
+            字符串Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.Dict.BMapFieldNumber">
+            <summary>Field number for the "BMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.Dict.BMap">
+             <summary>
+            布尔Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.Dict.LSMapFieldNumber">
+            <summary>Field number for the "LSMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.Dict.LSMap">
+             <summary>
+            字符串ListMap
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.Dict.LNMapFieldNumber">
+            <summary>Field number for the "LNMap" field.</summary>
         </member>
-        <member name="P:TMDGrpc.RequestDict.Dict">
+        <member name="P:TMDGrpc.KnowledgeService.Dict.LNMap">
              <summary>
-            查询dict
+            数字ListMap
              </summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.IdFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Dict.LBMapFieldNumber">
+            <summary>Field number for the "LBMap" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.Dict.LBMap">
+             <summary>
+            Byte ListMap
+             </summary>
+        </member>
+        <member name="T:TMDGrpc.KnowledgeService.LBMap">
+             <summary>
+            Byte[] Map
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.LBMap.KeyFieldNumber">
+            <summary>Field number for the "Key" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.LBMap.Key">
+             <summary>
+            Key
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.LBMap.ValueFieldNumber">
+            <summary>Field number for the "Value" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.LBMap.Value">
+             <summary>
+            byte数组
+             </summary>
+        </member>
+        <member name="T:TMDGrpc.KnowledgeService.LNMap">
+             <summary>
+            数字ListMap
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.LNMap.KeyFieldNumber">
+            <summary>Field number for the "Key" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.LNMap.Key">
+             <summary>
+            Key
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.LNMap.ValueFieldNumber">
+            <summary>Field number for the "Value" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.LNMap.Value">
+             <summary>
+            数字数组
+             </summary>
+        </member>
+        <member name="T:TMDGrpc.KnowledgeService.LSMap">
+             <summary>
+            字符串ListMap
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.LSMap.KeyFieldNumber">
+            <summary>Field number for the "Key" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.LSMap.Key">
+             <summary>
+            数字Dict
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.LSMap.ValueFieldNumber">
+            <summary>Field number for the "Value" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.LSMap.Value">
+             <summary>
+            字符串数组
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.IdFieldNumber">
             <summary>Field number for the "id" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.TypeFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.TypeFieldNumber">
             <summary>Field number for the "type" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.NameFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.NameFieldNumber">
             <summary>Field number for the "name" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.AliasFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.AliasFieldNumber">
             <summary>Field number for the "alias" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.SubjectCodeFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.SubjectCodeFieldNumber">
             <summary>Field number for the "subjectCode" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.ScopeCodeFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.ScopeCodeFieldNumber">
             <summary>Field number for the "scopeCode" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.OrderFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.OrderFieldNumber">
             <summary>Field number for the "order" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.StatusFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.StatusFieldNumber">
             <summary>Field number for the "status" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.PointsFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.PointsFieldNumber">
             <summary>Field number for the "points" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.KnowledgeIdFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.KnowledgeIdFieldNumber">
             <summary>Field number for the "knowledgeId" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.SourceFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.SourceFieldNumber">
             <summary>Field number for the "source" field.</summary>
         </member>
-        <member name="F:TMDGrpc.Knowledge.PeriodFieldNumber">
+        <member name="F:TMDGrpc.KnowledgeService.Knowledge.PeriodFieldNumber">
             <summary>Field number for the "period" field.</summary>
         </member>
-        <member name="P:TMDGrpc.KnowledgeService.Descriptor">
+        <member name="F:TMDGrpc.KnowledgeService.IdPk.IdFieldNumber">
+            <summary>Field number for the "id" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.IdPk.PkFieldNumber">
+            <summary>Field number for the "pk" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.IdPk.StatusCodeFieldNumber">
+            <summary>Field number for the "StatusCode" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.KeyValuePair_String_String.KeyFieldNumber">
+            <summary>Field number for the "Key" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.KeyValuePair_String_String.ValueFieldNumber">
+            <summary>Field number for the "Value" field.</summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.ListPid.IdsFieldNumber">
+            <summary>Field number for the "ids" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.ListPid.Ids">
+             <summary>
+            key 是pk ,value 是id
+             </summary>
+        </member>
+        <member name="F:TMDGrpc.KnowledgeService.ListPid.IdPksFieldNumber">
+            <summary>Field number for the "idPks" field.</summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.ListPid.IdPks">
+             <summary>
+            返回 删除结果
+             </summary>
+        </member>
+        <member name="P:TMDGrpc.KnowledgeService.KnowledgeService.Descriptor">
             <summary>Service descriptor</summary>
         </member>
-        <member name="T:TMDGrpc.KnowledgeService.KnowledgeServiceBase">
+        <member name="T:TMDGrpc.KnowledgeService.KnowledgeService.KnowledgeServiceBase">
             <summary>Base class for server-side implementations of KnowledgeService</summary>
         </member>
-        <member name="M:TMDGrpc.KnowledgeService.BindService(TMDGrpc.KnowledgeService.KnowledgeServiceBase)">
+        <member name="M:TMDGrpc.KnowledgeService.KnowledgeService.BindService(TMDGrpc.KnowledgeService.KnowledgeService.KnowledgeServiceBase)">
             <summary>Creates service definition that can be registered with a server</summary>
             <param name="serviceImpl">An object implementing the server-side handling logic.</param>
         </member>
-        <member name="M:TMDGrpc.KnowledgeService.BindService(Grpc.Core.ServiceBinderBase,TMDGrpc.KnowledgeService.KnowledgeServiceBase)">
+        <member name="M:TMDGrpc.KnowledgeService.KnowledgeService.BindService(Grpc.Core.ServiceBinderBase,TMDGrpc.KnowledgeService.KnowledgeService.KnowledgeServiceBase)">
             <summary>Register service method with a service binder with or without implementation. Useful when customizing the  service binding logic.
             Note: this method is part of an experimental API that can change or be removed without any prior notice.</summary>
             <param name="serviceBinder">Service methods will be bound by calling <c>AddMethod</c> on this object.</param>

+ 10 - 1
TEAMModelOS.SDK/Module/AzureCosmosDBV3/IdPk.cs

@@ -1,4 +1,5 @@
-using System;
+using ProtoBuf;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
@@ -7,12 +8,20 @@ using System.Threading.Tasks;
 
 namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
 {
+    [ProtoContract]
     public class IdPk
     {
+        [ProtoMember(1)]
         [Required(ErrorMessage = "{0} 必须填写")]
         public string id { get; set; }
 
+        [ProtoMember(2)]
         public string pk { get; set; }
+
+        /// <summary>
+        /// 删除状态 NoContent(删除成功),NotFound(未找到,删除失败)
+        /// </summary>
+        [ProtoMember(3)]
         public HttpStatusCode StatusCode { get;set;}
     }
 }

+ 58 - 5
TEAMModelOS.Service/Models/Courses/Course.cs

@@ -1,4 +1,5 @@
-using System;
+using ProtoBuf;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Text;
@@ -13,24 +14,29 @@ namespace TEAMModelOS.Service.Models.Courses
     /// 课程
     /// </summary>
     [CosmosDB(RU = 400, Name = "Course")]
+    [ProtoContract]
     public class Course : ID
     {
-        [Required(ErrorMessage = "{0} 必须填写")]
-        public string id { get; set; }
+   
 
         /// <summary>
         /// 学校编码 如果是教师私人知识点 则为 personal(写死) 否则为学校编码 
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
         [PartitionKey]
+        [ProtoMember(1)]
         public string scopeCode { get; set; }
-  
+
 
         //[Required(ErrorMessage = "{0} 必须填写")]
         //public string TEAMModelId { get; set; }
         //public string schoolCode { get; set; }
 
 
+        /// <summary>
+        /// 基础信息
+        /// </summary>
+        [ProtoMember(2)]
         public BaseInfo baseInfo { get; set; }
 
         ///// <summary>
@@ -42,70 +48,117 @@ namespace TEAMModelOS.Service.Models.Courses
         /// <summary>
         /// 协同教师
         /// </summary>
+        [ProtoMember(3)]
         public List<string> assistTeacher { get; set; }
 
         /// <summary>
         /// 上课时间表
         /// </summary>
+        [ProtoMember(4)]
         public List<CourseTime> courseTime { get; set; }
 
         /// <summary>
         /// 课程“教室” Classroom
         /// </summary>
+        [ProtoMember(5)]
         public List<string> classroom { get; set; }
 
         /// <summary>
         /// 关联课纲 SyllabusNode
         /// </summary>
+        [ProtoMember(6)]
         public List<string> syllabus { get; set; }
 
+        /// <summary>
+        /// id
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(7)]
+        public string id { get; set; }
+
     }
 
     /// <summary>
     /// 基础信息
     /// </summary>
+    [ProtoContract]
     public class BaseInfo
     {
+        /// <summary>
+        /// 课程编码
+        /// </summary>
+        [ProtoMember(1)]
         [Required(ErrorMessage = "{0} 必须填写")]
         public string courseCode { get; set; }//'T968475'
+        
+        /// <summary>
+        /// 课程名称
+        /// </summary>
+        [ProtoMember(2)]
         [Required(ErrorMessage = "{0} 必须填写")]
         public string courseName { get; set; }// '一次函数极其图像'
+        
+        /// <summary>
+        /// 学段编码
+        /// </summary>
+        [ProtoMember(3)]
         [Required(ErrorMessage = "{0} 必须填写")]
         public string periodCode { get; set; }
+        
+        /// <summary>
+        /// 年级编码
+        /// </summary>
+        [ProtoMember(4)]
         [Required(ErrorMessage = "{0} 必须填写")]
         public string gradeCode { get; set; }
+        
+        /// <summary>
+        /// 学科编码
+        /// </summary>
+        [ProtoMember(5)]
         [Required(ErrorMessage = "{0} 必须填写")]
         public string subjectCode { get; set; }
+        
+        /// <summary>
+        /// 课程公告
+        /// </summary>
+        [ProtoMember(6)]
         [Required(ErrorMessage = "{0} 必须填写")]
-        public string notice { get; set; }//课程公告
+        public string notice { get; set; }//
     }
 
 
     /// <summary>
     /// 上课时间表
     /// </summary>
+    [ProtoContract]
     public class CourseTime
     {
 
         /// <summary>
         /// 上课频率 每日、每周、每月、临时课程
         /// </summary>
+        [ProtoMember(1)]
         public string frequencyCode { get; set; }
         /// <summary>
         /// 课程开始时间
         /// </summary>
+        [ProtoMember(2)]
         public string beginTime { get; set; }
         /// <summary>
         /// 课程结束时间
         /// </summary>
+        [ProtoMember(3)]
         public string endTime { get; set; }
         /// <summary>
         /// 上课班级/教室
         /// </summary>
+        [ProtoMember(4)]
         public string classroomCode { get; set; } // Classroom
         /// <summary>
         /// 临时课程
         /// </summary>
+        [ProtoMember(5)]
         public string frequencyName { get; set; }
         /// <summary>
         /// 每月课程

+ 3 - 0
TEAMModelOS.Service/Models/Syllabus/Knowledge.cs

@@ -10,6 +10,9 @@ using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 
 namespace TEAMModelOS.Service.Models.Syllabus
 {
+    /// <summary>
+    /// 知识点
+    /// </summary>
     [CosmosDB(RU = 400, Name = "Knowledge", Cache = true)]
     [ProtoContract]
     public class Knowledge: ID

+ 55 - 0
TEAMModelOS.Service/Services/Syllabus/Implement/KnowledgeService.cs

@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
+
+namespace TEAMModelOS.Service.Services.Syllabus.Implement
+{
+    public class KnowledgeService : IKnowledgeService
+    {
+        private IAzureCosmosDBV3Repository _cosmos;
+
+        public KnowledgeService(IAzureCosmosDBV3Repository cosmos)
+        {
+            _cosmos = cosmos;
+        }
+
+        public async Task<List<Knowledge>> SaveOrUpdateKnowledge(List<Knowledge> request)
+        {
+            foreach (Knowledge item in request)
+            {
+                if (item.id == null)
+                {
+                    //if (item.scope == "personal")
+                    //{
+                    //    item.id = item.partitionKey + "-" + item.TEAMModelId + "-" + item.knowledgeId.Replace("-", "");
+                    //}
+                    //else {
+                    //    item.id = item.partitionKey + "-" + item.subjectCode + "-" + item.knowledgeId.Replace("-", "");
+                    //}
+                    item.id = Guid.NewGuid().ToString();
+                }
+                if (item.type == 1 && item.points.Count > 0)
+                {
+                    List<string> vs = item.points;
+                    foreach (string s in vs)
+                    {
+                        List<Knowledge> knowledges = await _cosmos.FindByDict<Knowledge>(new Dictionary<string, object>() { { "id", s } });
+                        foreach (Knowledge knowledge in knowledges)
+                        {
+                            knowledge.points.Remove(item.id);
+                            knowledge.points.Add(item.id);
+                        }
+                        await _cosmos.SaveOrUpdateAll(knowledges);
+                    }
+                    item.points.Clear();
+                }
+            }
+            List<Knowledge> ts = await _cosmos.SaveOrUpdateAll(request);
+            return ts;
+        }
+    }
+}

+ 15 - 0
TEAMModelOS.Service/Services/Syllabus/Interface/IKnowledgeService.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.Service.Models.Syllabus;
+
+namespace TEAMModelOS.Service.Services.Syllabus.Interface
+{
+    public interface IKnowledgeService : IBusinessService
+    {
+        public Task<List<Knowledge>> SaveOrUpdateKnowledge(List<Knowledge> request);
+
+    }
+}

+ 60 - 0
TEAMModelOS.Service/TEAMModelOS.Model.xml

@@ -65,6 +65,11 @@
             学校编码 如果是教师私人知识点 则为 personal(写死) 否则为学校编码 
             </summary>
         </member>
+        <member name="P:TEAMModelOS.Service.Models.Courses.Course.baseInfo">
+            <summary>
+            基础信息
+            </summary>
+        </member>
         <member name="P:TEAMModelOS.Service.Models.Courses.Course.assistTeacher">
             <summary>
             协同教师
@@ -85,11 +90,46 @@
             关联课纲 SyllabusNode
             </summary>
         </member>
+        <member name="P:TEAMModelOS.Service.Models.Courses.Course.id">
+            <summary>
+            id
+            </summary>
+        </member>
         <member name="T:TEAMModelOS.Service.Models.Courses.BaseInfo">
             <summary>
             基础信息
             </summary>
         </member>
+        <member name="P:TEAMModelOS.Service.Models.Courses.BaseInfo.courseCode">
+            <summary>
+            课程编码
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Courses.BaseInfo.courseName">
+            <summary>
+            课程名称
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Courses.BaseInfo.periodCode">
+            <summary>
+            学段编码
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Courses.BaseInfo.gradeCode">
+            <summary>
+            年级编码
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Courses.BaseInfo.subjectCode">
+            <summary>
+            学科编码
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Courses.BaseInfo.notice">
+            <summary>
+            课程公告
+            </summary>
+        </member>
         <member name="T:TEAMModelOS.Service.Models.Courses.CourseTime">
             <summary>
             上课时间表
@@ -285,6 +325,21 @@
             题目
             </summary>
         </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.ProcessRes.size">
+            <summary>
+            文件大小
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.ProcessRes.compressUrl">
+            <summary>
+            缩略图链接  图片视频有 文件没有
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.ProcessRes.type">
+            <summary>
+            文件类型
+            </summary>
+        </member>
         <member name="T:TEAMModelOS.Service.Models.Learn.LeanRecord">
             <summary>
             作答记录
@@ -330,6 +385,11 @@
             名称
             </summary>
         </member>
+        <member name="T:TEAMModelOS.Service.Models.Syllabus.Knowledge">
+            <summary>
+            知识点
+            </summary>
+        </member>
         <member name="P:TEAMModelOS.Service.Models.Syllabus.Knowledge.type">
             <summary>
             标记为知识块,0=知识块 ,1 知识点

+ 8 - 29
TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs

@@ -14,6 +14,7 @@ using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
 using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
 
 namespace TEAMModelOS.Controllers.Syllabus
 {
@@ -24,12 +25,15 @@ namespace TEAMModelOS.Controllers.Syllabus
     {
         private IAzureTableDBRepository _table;
         private IAzureCosmosDBV3Repository _cosmos;
+        private IKnowledgeService knowledgeService;
 
-        public KnowledgeController(IAzureTableDBRepository table, IAzureCosmosDBV3Repository cosmos)
+        public KnowledgeController(IAzureTableDBRepository table, IAzureCosmosDBV3Repository cosmos, IKnowledgeService knowledgeService)
         {
             _table = table;
             _cosmos = cosmos;
+            this.knowledgeService = knowledgeService;
         }
+
         /// <summary>
         /// 删除学校 知识点 或 知识块 代理
         /// </summary>
@@ -273,34 +277,7 @@ namespace TEAMModelOS.Controllers.Syllabus
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             if (request.@params.IsNotEmpty())
             {
-                List<Knowledge> schoolBlocks = request.@params;
-                foreach (Knowledge item in schoolBlocks)
-                {
-                    if (item.id == null)
-                    {
-                        //if (item.scope == "personal")
-                        //{
-                        //    item.id = item.partitionKey + "-" + item.TEAMModelId + "-" + item.knowledgeId.Replace("-", "");
-                        //}
-                        //else {
-                        //    item.id = item.partitionKey + "-" + item.subjectCode + "-" + item.knowledgeId.Replace("-", "");
-                        //}
-                        item.id = Guid.NewGuid().ToString();
-                    }
-                    if (item.type == 1 && item.points.Count > 0) {
-                        List<string> vs = item.points;
-                        foreach (string s in vs) {
-                        List<Knowledge> knowledges =  await _cosmos.FindByDict<Knowledge>(new Dictionary<string, object>() { { "id",s} });
-                            foreach (Knowledge knowledge  in knowledges) {
-                                knowledge.points.Remove(item.id);
-                                knowledge.points.Add(item.id);
-                            }
-                            await _cosmos.SaveOrUpdateAll(knowledges);
-                        }
-                        item.points.Clear();
-                    }
-                }
-                List<Knowledge> ts = await _cosmos.SaveOrUpdateAll(schoolBlocks);
+                List<Knowledge> ts = await knowledgeService.SaveOrUpdateKnowledge(request.@params);
                 if (ts.Count > 0) builder.Data(ts).Extend(new Dictionary<string, object> { { "count", ts.Count } });
                 else throw new BizException("失败", ResponseCode.FAILED);
                 //builder.Error(false, ResponseCode.FAILED, "失败");
@@ -308,6 +285,8 @@ namespace TEAMModelOS.Controllers.Syllabus
             return builder.build();
         }
 
+       
+
         /// <summary>
         /// 删除知识
         /// </summary>