qwj
2023-08-02 67965cce30e900f9b6091170745ecf115f64e23d
Merge branch 'master' of http://47.108.235.38:8080/r/DocumentService

# Conflicts:
# DocumentServiceAPI.sln
19个文件已修改
5个文件已删除
19个文件已添加
2897 ■■■■■ 已修改文件
.gitignore 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/DocumentServiceAPI.Application.csproj 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/DocumentServiceAPI.Application.xml 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/UserAndLogin/LogInController.cs 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/UserAndLogin/Services/Interfaces/ILoginVerifyService.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/UserAndLogin/Services/TokenService.cs 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/UserAndLogin/Services/UserService.cs 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/UserAndLogin/UserInfoController.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/UserAndLogin/ViewMode/Login.cs 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/UserAndLogin/dto/Mapper.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Application/applicationsettings.json 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Core/DbContext.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/DSFulResult.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/JwtInfo.cs 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/User/JobInfo.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/User/UnitInfo.cs 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/User/UserInfo.cs 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/User/UserUnitInfo.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/UserInfoModel/EmployeeAtTenant.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/UserInfoModel/EmployeeInfo.cs 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/UserInfoModel/TenantInfo.cs 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/cyDocumentModel/Document_EmployeeInfo.cs 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/cyDocumentModel/Document_EmployeeRole.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/cyDocumentModel/Document_PerformanceInfo.cs 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/cyDocumentModel/Document_TenderUnit.cs 487 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/cyDocumentModel/Document_UserInfo.cs 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Model/cyDocumentModel/库目录.md 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Services/DocumentServiceAPI.Services.csproj 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Services/IService/ICacheService.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Services/RedisCacheScService.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Utility/DocumentServiceAPI.Utility.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Core/DocumentServiceAPI.Web.Core.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Core/DocumentServiceAPI.Web.Core.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Core/Filter/EnumSchemaFilter .cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Core/Handlers/DSRESTfulResultProvider.cs 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Core/Handlers/JwtHandler.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Core/Startup.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Entry/AuthorizeHandler.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Entry/DocServiceApiStartup.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Entry/DocumentServiceAPI.Web.Entry.csproj 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Entry/HomeController.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.Web.Entry/appsettings.json 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DocumentServiceAPI.sln 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -27,3 +27,5 @@
/DocumentServiceAPI.Web.Entry/appsettings.json
/DocumentFile.Service/bin
/DocumentFile.Service/obj
/DocumentServiceAPI.Services/bin
/DocumentServiceAPI.Services/obj
DocumentServiceAPI.Application/DocumentServiceAPI.Application.csproj
@@ -24,10 +24,12 @@
    <ItemGroup>
        <ProjectReference Include="..\DocumentServiceAPI.Core\DocumentServiceAPI.Core.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Model\DocumentServiceAPI.Model.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Services\DocumentServiceAPI.Services.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Utility\DocumentServiceAPI.Utility.csproj" />
    </ItemGroup>
    <ItemGroup>
      <Folder Include="UserInfo\" />
      <Folder Include="GlobalServices\" />
    </ItemGroup>
</Project>
DocumentServiceAPI.Application/DocumentServiceAPI.Application.xml
@@ -14,5 +14,247 @@
            ç³»ç»ŸæœåŠ¡æŽ¥å£
            </summary>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.LogInController">
            <summary>
            ç™»å½•控制器
            </summary>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.LogInController.LogoIn(DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN)">
            <summary>
            ç™»å½• 1 è¾“入员工账户或者租户账户,2 é€‰æ‹©ç§Ÿæˆ·è´¦æˆ·ï¼Œ3 é€‰æ‹©å…¬å¸
            </summary>
            <returns>登录信息</returns>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.LogInController.GetUnitList">
            <summary>
            èŽ·å–å…¬å¸åˆ—è¡¨
            </summary>
            <returns>登录信息</returns>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.LogInController.GetTenantInfoList">
            <summary>
            èŽ·å–å…¬å¸åˆ—è¡¨
            </summary>
            <returns>登录信息</returns>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.Services.TokenService">
            <summary>
            token服务类
            </summary>
        </member>
        <member name="F:DocumentServiceAPI.Application.UserAndLogin.Services.TokenService.TokenKeys">
            <summary>
            Token是啥
            </summary>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.Services.TokenService.CreateToken(DocumentServiceAPI.Model.JwtInfo)">
            <summary>
            æ–°å»ºä¸€ä¸ªTOken
            </summary>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.Services.TokenService.CheckToken">
            <summary>
            æ ¡éªŒjwt信息是否有效,判决单端登录验证
            </summary>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.Services.TokenService.getTokenKey(DocumentServiceAPI.Model.JwtInfo)">
            <summary>
            èŽ·å–TokenKey
            </summary>
            <param name="jwt"></param>
            <returns></returns>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.Services.UserService">
            <summary>
            ç™»å½•验证服务
            </summary>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.Services.UserService.GetEmployeeInfo(System.Int32,System.Int32)">
            <summary>
            å‘˜å·¥è¯¦æƒ…
            </summary>
            <param name="ID"></param>
            <param name="TenantID"></param>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.Services.UserService.GetJwtInfo">
            <summary>
            èŽ·å–Jwt相关信息
            </summary>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.Services.UserService.GetUserUnitInfo(System.Int32)">
            <summary>
            èŽ·å–å•ä½åˆ—è¡¨
            </summary>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.Services.UserService.GetUserTenderList(System.String)">
            <summary>
            æ ¹æ®è´¦å·èŽ·å– Tender åˆ—表
            </summary>
            <param name="ItCode"></param>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.Services.UserService.CheckPsw(System.Int32,System.Nullable{System.Int32},System.String)">
            <summary>
            æ£€æŸ¥å¯†ç æ˜¯å¦ç™»å½•
            </summary>
            <param name="TenantID"> ç§Ÿæˆ·ID</param>
            <param name="employeeID">员工ID</param>
            <param name="PsW">密码</param>
            <returns></returns>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.UserInfoController">
            <summary>
            ç™»å½•控制器
            </summary>
        </member>
        <member name="M:DocumentServiceAPI.Application.UserAndLogin.UserInfoController.GetUserInfo">
            <summary>
            </summary>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN">
            <summary>
            è´¦æˆ·å¯†ç ç™»å½•
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN.ITCode">
            <summary>
            ç™»å½•账号
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN.PassWord">
            <summary>
            å¯†ç 
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN.Key">
            <summary>
            éªŒè¯ç key
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN.VerifyCoed">
            <summary>
            éªŒè¯ç ä»£ç 
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN.TenantId">
            <summary>
            TenantITCode ç§Ÿæˆ·ITCode
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN.employeeID">
            <summary>
            å‘˜å·¥ç™»å½• æ³¨æ„ å¦‚果不是首次登录,这个站好需要根据所选的租户登录返回结果来确定是否是用员工账号登录,如果为空,默认未选择租户账号登录
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN.UnitID">
            <summary>
            å•位ID
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.LoginPsWordIN.Form">
            <summary>
            æ¥æº
            </summary>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.ViewMode.EmployeeTenantInfo">
            <summary>
            ç§Ÿæˆ·è¯¦æƒ…模型
            </summary>
        </member>
        <member name="F:DocumentServiceAPI.Application.UserAndLogin.ViewMode.EmployeeTenantInfo._employeeInfo">
            <summary>
            å‘˜å·¥Info
            </summary>
        </member>
        <member name="F:DocumentServiceAPI.Application.UserAndLogin.ViewMode.EmployeeTenantInfo._tenantInfo">
            <summary>
            ç¥ç¦ Info
            </summary>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.ViewMode.UnitVM">
            <summary>
            å•位详情
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.UnitVM.UnitID">
            <summary>
            ID
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.UnitVM.UnitName">
            <summary>
            å•位名称
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.UnitVM.Remark">
            <summary>
            æ ‡æ³¨
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.UnitVM.UnitLogo">
            <summary>
            logo
            </summary>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.ViewMode.TenderVM">
            <summary>
             ç§Ÿæˆ·è¯¦æƒ…
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.TenderVM.TenderId">
            <summary>
            ID
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.TenderVM.ItCode">
            <summary>
            ç§Ÿæˆ·å
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.TenderVM.Name">
            <summary>
            åç§°
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.TenderVM.Description">
            <summary>
            æè¿°
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.TenderVM.EmployeeID">
            <summary>
            å‘˜å·¥ID
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.TenderVM.IsTender">
            <summary>
            æ˜¯å¦æ˜¯ä¸»è´¦å·
            </summary>
        </member>
        <member name="T:DocumentServiceAPI.Application.UserAndLogin.ViewMode.RetLoginVM">
            <summary>
            ç™»å½•返回
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.RetLoginVM.NeedNext">
            <summary>
             éœ€è¦é‡æ–°ç™»å½•
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.RetLoginVM.Units">
            <summary>
            å…¬å¸åˆ—表
            </summary>
        </member>
        <member name="P:DocumentServiceAPI.Application.UserAndLogin.ViewMode.RetLoginVM.Tenders">
            <summary>
            ç§Ÿæˆ·åˆ—表
            </summary>
        </member>
    </members>
</doc>
DocumentServiceAPI.Application/UserAndLogin/LogInController.cs
New file
@@ -0,0 +1,175 @@
using DocumentServiceAPI.Application.UserAndLogin.Services;
using DocumentServiceAPI.Application.UserAndLogin.ViewMode;
using DocumentServiceAPI.Utility;
using Furion.DynamicApiController;
using Furion.JsonSerialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Application.UserAndLogin
{
    /// <summary>
    /// ç™»å½•控制器
    /// </summary>
    [ApiDescriptionSettings("LogInAndUser")]
    [DynamicApiController]
    public class LogInController
    {
     private   TokenService _tokenService;
        private UserService _userService;
        public LogInController(TokenService tokenService,UserService  userService) {
            _tokenService = tokenService;
            _userService = userService;
         }
        /// <summary>
        /// ç™»å½• 1 è¾“入员工账户或者租户账户,2 é€‰æ‹©ç§Ÿæˆ·è´¦æˆ·ï¼Œ3 é€‰æ‹©å…¬å¸
        /// </summary>
        /// <returns>登录信息</returns>
        [HttpPost("LogoIn")]
        public async Task<RetLoginVM> LogoIn (LoginPsWordIN Parma)
        {
              bool needtoken=false;
            if (Parma.TenantId==null)
            {
                //如果还没确定租户ID éœ€è¦å…ˆç¡®å®šç§Ÿæˆ·ID
                List<TenderVM>Tender = await _userService.GetUserTenderList(Parma.ITCode);
                switch (Tender.Count)
                {
                    case 0:
                        throw Oops.Oh($"账户或者密码错误");
                    case 1:
                         needtoken = await _userService.CheckPsw(Tender[0].TenderId, Tender[0].EmployeeID,Parma.PassWord);
                        if(!needtoken)
                            throw Oops.Oh($"账户或者密码错误");
                        if (Parma.UnitID == null)
                        {
                            var Units = await _userService.GetUserUnitInfo(Parma.TenantId ?? 0);
                            if (Units.Count == 0)
                            {
                                //没有公司
                                needtoken = true;
                            }
                            else if (Units.Count == 1)
                            {
                                Parma.UnitID = Units[0].UnitID;
                                needtoken = true;
                            }
                            else
                            {
                                //其他需要用户选择租户
                                return new RetLoginVM
                                {
                                    NeedNext = true,
                                    Units = Units,
                                };
                            }
                        }
                        Parma.TenantId = Tender[0].TenderId;
                        break;
                    default:
                        //其他需要用户选择租户
                        return new RetLoginVM
                        {
                            NeedNext = true,
                            Tenders = Tender,
                        };
                }
            }
            else if(Parma.UnitID==null)
            {
                var Units = await _userService.GetUserUnitInfo(Parma.TenantId??0);
                if(Units.Count==0)
                {
                    //没有公司
                    needtoken = true;
                }
                else if (Units.Count==1) {
                    Parma.UnitID= Units[0].UnitID;
                    needtoken = true;
                }
                else
                {
                    //其他需要用户选择租户
                    return new RetLoginVM
                    {
                        NeedNext = true,
                       Units = Units,
                    };
                }
            }
            if(needtoken|| Parma.UnitID!=null)
            {
                TenderVM Tender = (await _userService.GetUserTenderList(Parma.ITCode)).Where(x=>x.TenderId==Parma.TenantId&&x.EmployeeID==Parma.employeeID).SingleOrDefault();
                if(Tender==null)
                {
                    throw Oops.Oh($"账户密码或者租户选择错误");
                }
                needtoken = await _userService.CheckPsw(Tender. TenderId, Tender.EmployeeID, Parma.PassWord);
                if (!needtoken)
                    throw Oops.Oh($"账户或者密码错误");
              var token=  _tokenService.CreateToken(new Model.JwtInfo
                {
                    EID = Tender.EmployeeID,
                    LogInSource = Parma.Form,
                    TID = Tender.TenderId,
                    UID = Parma.UnitID,
                });
                return new RetLoginVM
                {
                    NeedNext = false,
                   Token = token,
                };
            }
            throw Oops.Oh($"参数错误");
        }
        /// <summary>
        /// èŽ·å–å…¬å¸åˆ—è¡¨
        /// </summary>
        /// <returns>登录信息</returns>
        public bool GetUnitList()
        {
            return true;
        }
        /// <summary>
        /// èŽ·å–å…¬å¸åˆ—è¡¨
        /// </summary>
        /// <returns>登录信息</returns>
        public bool GetTenantInfoList()
        {
            return true;
        }
        public string Get()
        {
            return $"Hello {nameof(Furion)}";
        }
    }
}
DocumentServiceAPI.Application/UserAndLogin/Services/Interfaces/ILoginVerifyService.cs
New file
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Application.UserAndLogin.Services.Interfaces
{
    public interface ILoginVerifyService
    {
    }
}
DocumentServiceAPI.Application/UserAndLogin/Services/TokenService.cs
New file
@@ -0,0 +1,96 @@
using DocumentServiceAPI.Model;
using DocumentServiceAPI.Services.IService;
using Furion.Authorization;
using Furion.DistributedIDGenerator;
using Furion.JsonSerialization;
using NetTaste;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Application.UserAndLogin.Services
{
    /// <summary>
    /// token服务类
    /// </summary>
    public  class TokenService: IScoped
    {
        /// <summary>
        /// Token是啥
        /// </summary>
        static string TokenKeys = "TokenKeys:";
        private ISqlSugarClient _db;
        private UserService _UserService;
        private IRedisCacheService _RedisCase;
        public TokenService(ISqlSugarClient db, UserService  UserInfoService, IRedisCacheService RedisCase ) {
            _db = db;
            _UserService = UserInfoService;
            _RedisCase = RedisCase;
        }
        /// <summary>
        /// æ–°å»ºä¸€ä¸ªTOken
        /// </summary>
        /// <returns></returns>
        public string  CreateToken(JwtInfo jwt)
        {
            string TokenKey=TokenKeys+ getTokenKey(jwt);
            IDictionary<string, object> propertyDictionary = new Dictionary<string, object>();
            PropertyInfo[] properties = jwt.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo property in properties)
            {
                string propertyName = property.Name;
                object propertyValue = property.GetValue(jwt);
                propertyDictionary.Add(propertyName.ToLower(), propertyValue);
            }
            var ID = IDGen.NextID();
             jwt.JID = ID;
         var token=   JWTEncryption.Encrypt(propertyDictionary, App.GetConfig<JWTSettingsOptions>("JWTSettings").ExpiredTime ?? 3600);
            if(jwt.LogInSource==LogInFrom.PC)
            _RedisCase.Add<string>(TokenKey, ID.ToString(), expireSeconds: (int )(App.GetConfig<JWTSettingsOptions>("JWTSettings").ExpiredTime??3600));
            return token;
        }
        /// <summary>
        /// æ ¡éªŒjwt信息是否有效,判决单端登录验证
        /// </summary>
        /// <returns></returns>
         public bool  CheckToken()
        {
       var Jwtinfo=     _UserService.GetJwtInfo();
        var Key=    getTokenKey(Jwtinfo);
        string T  = _RedisCase.Get<string>(Key);
            if (T == null)
                return true;
            if (T != Jwtinfo.JID.ToString())
                return false;
            return true;
        }
        /// <summary>
        /// èŽ·å–TokenKey
        /// </summary>
        /// <param name="jwt"></param>
        /// <returns></returns>
        private string getTokenKey(JwtInfo jwt)
        {
            string TokenKey = TokenKeys + jwt.EID?.ToString() + jwt.UID?.ToString()  + jwt.TID?.ToString();
            return TokenKey;
        }
    }
}
DocumentServiceAPI.Application/UserAndLogin/Services/UserService.cs
New file
@@ -0,0 +1,176 @@
using DocumentServiceAPI.Application.UserAndLogin.Services.Interfaces;
using DocumentServiceAPI.Application.UserAndLogin.ViewMode;
using DocumentServiceAPI.Model;
using DocumentServiceAPI.Model.cyDocumentModel;
using DocumentServiceAPI.Model.UserInfoModel;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Application.UserAndLogin.Services
{
    /// <summary>
    /// ç™»å½•验证服务
    /// </summary>
    public class UserService : ILoginVerifyService, IScoped
    {
        private ISqlSugarClient _db { get; set; }
        public UserService(ISqlSugarClient db)
        {
            _db = db;
        }
        /// <summary>
        /// å‘˜å·¥è¯¦æƒ…
        /// </summary>
        /// <param name="ID"></param>
        /// <param name="TenantID"></param>
        /// <returns></returns>
        public async Task<EmployeeTenantInfo> GetEmployeeInfo(int ID, int TenantID)
        {
            var ret = await _db.Queryable<EmployeeInfo, EmployeeAtTenant, TenantInfo>((ei, eiat, ti) =>
              new JoinQueryInfos(
      JoinType.Right, ei.Id == eiat.EmployeeID, //左连接 å·¦é“¾æŽ¥ å·¦è”
      JoinType.Right, ti.Id == eiat.TenantID
                              )).Where((ei, eiat, ti) => ei.Id == ID && TenantID == ti.Id)
                              .Select(expression: (ei, eiat, ti) => new EmployeeTenantInfo
                              {
                                  _employeeInfo = ei,
                                  _tenantInfo = ti
                              }).SingleAsync();
            return ret;
        }
        /// <summary>
        /// èŽ·å–Jwt相关信息
        /// </summary>
        public JwtInfo GetJwtInfo()
        {
            JwtInfo jwtInfo = new JwtInfo();
            jwtInfo.LogInSource = (LogInFrom)(App.User?.FindFirstValue("loginfrom")?.ObjToInt() ?? 0);
            jwtInfo.EID = App.User?.FindFirstValue("eid")?.ObjToInt();
            jwtInfo.UID = App.User?.FindFirstValue("uid")?.ObjToInt();
            jwtInfo.TID = App.User?.FindFirstValue("tid")?.ObjToInt();
            var guid = App.User?.FindFirstValue("jid");
            jwtInfo.JID = string.IsNullOrEmpty(guid) ? new Guid(guid) : null;
            return jwtInfo;
        }
        /// <summary>
        /// èŽ·å–å•ä½åˆ—è¡¨
        /// </summary>
        /// <returns></returns>
        public async Task<List<UnitVM>> GetUserUnitInfo(int  tid )
        {
            var list = await _db.Queryable<DocumentServiceAPI.Model.cyDocumentModel.Document_TenderUnit>()
                   .Where((tu) => tu.TenantId == tid && tu.IsEn == true && tu.IsDeled != true)
                   .Select((tu) => new UnitVM
                   {
                       UnitID = tu.UnitId,
                       UnitName = tu.UnitName,
                       Remark = tu.Remark,
                       UnitLogo = tu.UnitLogo,
                   })
                   .ToListAsync();
            return list;
        }
        /// <summary>
        /// æ ¹æ®è´¦å·èŽ·å– Tender åˆ—表
        /// </summary>
        /// <param name="ItCode"></param>
        /// <returns></returns>
        public async Task<List<TenderVM>> GetUserTenderList(string ItCode)
        {
            var tentlist= await _db.Queryable<TenantInfo, EmployeeAtTenant, Document_EmployeeInfo>((ti, et, ei) =>
              new JoinQueryInfos
              (
                 JoinType.Right, ti.Id == et.TenantID, //左连接 å·¦é“¾æŽ¥ å·¦è”
             JoinType.Right, ei.EmployeeId == et.EmployeeID
                  )
             )
                .Where((ti, et, ei) =>
              ( ei.UserName == ItCode) && (ti.IsEn == true) && (ti.IsDel != true) && (ei.IsWork == null || ei.IsWork == 1))
             .Select((ti, et, ei) => new TenderVM
             {
                 EmployeeID = ei.EmployeeId,
                 Description = ti.Description,
                 ItCode = ItCode,
                 Name = ti.Name,
                 TenderId = ti.Id
             }
              ).ToListAsync();
            var ten = await _db.Queryable<TenantInfo>().Where(x => x.IsEn == true && x.IsDel != true && x.ItCode == ItCode)
                   .Select(x => new TenderVM
                   {
                       Description = x.Description,
                       ItCode = ItCode,
                       Name = x.Name,
                       TenderId = x.Id,
                       IsTender = true
                   }
              ).ToListAsync()  ;
            ten.AddRange(tentlist);
            return ten;
        }
        /// <summary>
        /// æ£€æŸ¥å¯†ç æ˜¯å¦ç™»å½•
        /// </summary>
        /// <param name="TenantID"> ç§Ÿæˆ·ID</param>
        /// <param name="employeeID">员工ID</param>
        /// <param name="PsW">密码</param>
        /// <returns></returns>
        public async Task<bool> CheckPsw(int TenantID, int? employeeID, string PsW)
        {
            if (employeeID == null)
            {
                var psw = await _db.Queryable<TenantInfo>().Where(x => x.Id == TenantID).Select(x => x.PsW).SingleAsync();
                if (PsW == psw)
                    return true;
            }
            else
            {
                var psw = await _db.Queryable<Document_EmployeeInfo, EmployeeAtTenant, TenantInfo>((ei, et, ti) =>
             new JoinQueryInfos
             (
                JoinType.Left, ei.EmployeeId == et.EmployeeID, //左连接 å·¦é“¾æŽ¥ å·¦è”
            JoinType.Left, ti.Id == et.TenantID
                 )
            ).Where((ei, et, ti) =>
                ei.EmployeeId == employeeID && ti.Id == TenantID
            )
            .Select((ei, et, ti) => ei.UserPassWord)
            .SingleAsync();
                if (PsW == psw)
                    return true;
            }
            return false;
        }
    }
}
DocumentServiceAPI.Application/UserAndLogin/UserInfoController.cs
New file
@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Application.UserAndLogin
{
    /// <summary>
    /// ç™»å½•控制器
    /// </summary>
    [ApiDescriptionSettings("LogInAndUser")]
    [DynamicApiController]
    public class UserInfoController
    {
        /// <summary>
        ///
        /// </summary>
        public void  GetUserInfo()
        {
        }
    }
}
DocumentServiceAPI.Application/UserAndLogin/ViewMode/Login.cs
New file
@@ -0,0 +1,172 @@
using DocumentServiceAPI.Model;
using DocumentServiceAPI.Model.UserInfoModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Application.UserAndLogin.ViewMode
{
    /// <summary>
    /// è´¦æˆ·å¯†ç ç™»å½•
    /// </summary>
    public class LoginPsWordIN
    {
        /// <summary>
        /// ç™»å½•账号
        /// </summary>
        public string ITCode{ get; set; }
        /// <summary>
        /// å¯†ç 
        /// </summary>
        public string? PassWord { get; set; }
        /// <summary>
        /// éªŒè¯ç key
        /// </summary>
        public string? Key { get; set; }
        /// <summary>
        /// éªŒè¯ç ä»£ç 
        /// </summary>
        public string? VerifyCoed { get; set; }
        /// <summary>
        /// TenantITCode ç§Ÿæˆ·ITCode
        /// </summary>
        public int ? TenantId { get; set; }
        /// <summary>
        /// å‘˜å·¥ç™»å½• æ³¨æ„ å¦‚果不是首次登录,这个站好需要根据所选的租户登录返回结果来确定是否是用员工账号登录,如果为空,默认未选择租户账号登录
        /// </summary>
        public int? employeeID { get; set; }
        /// <summary>
        /// å•位ID
        /// </summary>
        public int ? UnitID { get; set; }
        /// <summary>
        /// æ¥æº
        /// </summary>
        public LogInFrom Form { get; set; }
    }
    /// <summary>
    /// ç§Ÿæˆ·è¯¦æƒ…模型
    /// </summary>
    public class EmployeeTenantInfo
    {
        /// <summary>
        /// å‘˜å·¥Info
        /// </summary>
      public  EmployeeInfo _employeeInfo;
        /// <summary>
        /// ç¥ç¦ Info
        /// </summary>
      public   TenantInfo _tenantInfo;
    }
    /// <summary>
    /// å•位详情
    /// </summary>
    public class UnitVM
    {
        /// <summary>
        /// ID
        /// </summary>
        public int UnitID { get; set; }
        /// <summary>
        /// å•位名称
        /// </summary>
        public string UnitName { get; set; }
        /// <summary>
        /// æ ‡æ³¨
        /// </summary>
        public string Remark { get; set; }
        /// <summary>
        /// logo
        /// </summary>
        public string UnitLogo { get; set; }
    }
    /// <summary>
    ///  ç§Ÿæˆ·è¯¦æƒ…
    /// </summary>
    public class  TenderVM
    {
        /// <summary>
        /// ID
        /// </summary>
        public int TenderId { get; set; }
        /// <summary>
        /// ç§Ÿæˆ·å
        /// </summary>
        public string ItCode { get; set; }
        /// <summary>
        /// åç§°
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// æè¿°
        /// </summary>
        public string Description { get; set; }
        /// <summary>
        /// å‘˜å·¥ID
        /// </summary>
       public int? EmployeeID { get; set; }
        /// <summary>
        /// æ˜¯å¦æ˜¯ä¸»è´¦å·
        /// </summary>
        public bool IsTender { get; set; } = false;
    }
    /// <summary>
    /// ç™»å½•返回
    /// </summary>
    public class RetLoginVM
    {
        /// <summary>
        ///  éœ€è¦é‡æ–°ç™»å½•
        /// </summary>
        public bool NeedNext { get; set; }=true;
        /// <summary>
        /// å…¬å¸åˆ—表
        /// </summary>
#nullable enable
        public List<UnitVM>? Units { get; set; }
        /// <summary>
        /// ç§Ÿæˆ·åˆ—表
        /// </summary>
#nullable enable
        public List<TenderVM>? Tenders { get; set; }
#nullable enable
        public string? Token { get; set; }
    }
}
DocumentServiceAPI.Application/UserAndLogin/dto/Mapper.cs
New file
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Application.UserAndLogin.dto
{
    public class Mapper : IRegister
    {
        public void Register(TypeAdapterConfig config)
        {
        }
    }
}
DocumentServiceAPI.Application/applicationsettings.json
@@ -3,25 +3,50 @@
  "SpecificationDocumentSettings": {
    "DocumentTitle": "Furion | è§„范化接口",
    "GroupOpenApiInfos": [
        {
          "Group": "Default",
          "Title": "标书管理系统服务",
          "Description": "这个一个很好用标书管理系统服务软件",
          "Version": "1.0.0",
          "Contact": {
            "Name": "政采咨询有限公司",
            "Url": "http://www.51zhengcai.com"
          },
          "License": {
            "Name": "政采咨询有限公司",
            "Url": "http://www.51zhengcai.com"
          }
      {
        "Group": "Default",
        "Title": "标书管理系统服务",
        "Description": "这个一个很好用标书管理系统服务软件",
        "Version": "1.0.0",
        "Contact": {
          "Name": "政采咨询有限公司",
          "Url": "http://www.51zhengcai.com"
        },
        "License": {
          "Name": "政采咨询有限公司",
          "Url": "http://www.51zhengcai.com"
        }
      }
    ]
  },
  //swags åç§°é…ç½® é»˜è®¤åˆ†ç»„
  "[openapi:LogInAndUser]": {
    "Title": "登录和用户",
    "Order": 0,
    "Description": "用户和登录相关",
    "Version": "1.0.0",
    "Contact": {
      "Name": "政采咨询有限公司",
      "Url": "http://www.51zhengcai.com"
    },
    "License": {
      "Name": "政采咨询有限公司",
      "Url": "http://www.51zhengcai.com"
    }
  },
  //配置路由风格
    "DynamicApiControllerSettings": {
      "KeepName": true,//保持路由一致
      "KeepVerb": true,//保持版本号一致
      "LowercaseRoute": false
    },
  "CorsAccessorSettings": {
    "WithExposedHeaders": [
      "access-token",
DocumentServiceAPI.Core/DbContext.cs
@@ -92,11 +92,12 @@
    /// <param name="ModeProjectName"></param>
    public static void DbCodeFirst(this IApplicationBuilder app, string ModeProjectName, string? Modenamespace = null, string? ConfigId = null)
    {
       var ddb= App.GetService<ISqlSugarClient>();
        var _db = app.ApplicationServices.GetService<ISqlSugarClient>();
        //切换数据库
        if (!string.IsNullOrEmpty(ConfigId))
            _db.AsTenant().ChangeDatabase(ConfigId);
        //建库
        _db.DbMaintenance.CreateDatabase();
        Type[]? types = UtilityFun.GetAllAssembly().Where(x => x.FullName.Contains(ModeProjectName + ",")).FirstOrDefault()?.GetTypes().WhereIF(!string.IsNullOrEmpty(Modenamespace), name => name.FullName.Contains(Modenamespace + ".")).ToArray().Where(x => x.IsSubclassOf(typeof(BaseModel))).ToArray();
@@ -104,4 +105,14 @@
        _db.CodeFirst.InitTables(types);//根据types创建表
    }
    public static void DbCodeFirst(this IApplicationBuilder app, Type Obj,  string? ConfigId = null)
    {
        var _db = app.ApplicationServices.GetService<ISqlSugarClient>();
        //切换数据库
        if (!string.IsNullOrEmpty(ConfigId))
            _db.AsTenant().ChangeDatabase(ConfigId);
        //建库
        _db.DbMaintenance.CreateDatabase();
        _db.CodeFirst.InitTables(Obj);//根据types创建表
    }
}
DocumentServiceAPI.Model/DSFulResult.cs
New file
@@ -0,0 +1,46 @@

namespace DocumentServiceAPI.Model
{
    /// <summary>
    /// ç»Ÿä¸€è¿”回类型模型定义
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DSFulResult<T>
    {
        /// <summary>
        /// çŠ¶æ€ç 
        /// </summary>
        public int? StatusCode { get; set; }
        /// <summary>
        /// çŠ¶æ€ç 
        /// </summary>
        public int? Code { get; set; }
        /// <summary>
        /// æ•°æ®
        /// </summary>
        public T? Data { get; set; }
        /// <summary>
        /// é”™è¯¯ä¿¡æ¯
        /// </summary>
        public object? Error { get; set; }
        /// <summary>
        /// é™„加数据
        /// </summary>
        public object? Extras { get; set; }
        /// <summary>
        /// æ—¶é—´æˆ³
        /// </summary>
        public long? Timestamp { get; set; }
        /// <summary>
        /// å…¶ä»–消息
        /// </summary>
        public string?  Message { get; set; }
    }
}
DocumentServiceAPI.Model/JwtInfo.cs
New file
@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Model
{
    /// <summary>
    /// Jwt信息
    /// </summary>
    public class JwtInfo
    {
        /// <summary>
        /// å‘˜å·¥ITCODE
        /// </summary>
        public int?   EID { get; set; }
        /// <summary>
        /// ç§Ÿæˆ·ID
        /// </summary>
        public int ?TID { get; set; }
        /// <summary>
        /// å…¬å¸ID
        /// </summary>
        public int? UID { get; set; }
        /// <summary>
        /// Id识别号,主要用于判断单端登录
        /// </summary>
        public  Guid? JID { get; set; }
        /// <summary>
        /// ç™»å½•源
        /// </summary>
        public LogInFrom LogInSource { get; set; }
    }
    /// <summary>
    /// ç™»å½•源 ç±»åž‹
    /// </summary>
    public enum LogInFrom
    {
        /// <summary>
        /// PCAPP登录
        /// </summary>
        [Description( "PCAPP登录")]
        PC,
        /// <summary>
        /// APP端登录
        /// </summary>
        [Description("APP端登录")]
        APP,
        /// <summary>
        /// å¾®ä¿¡å°ç¨‹åºç™»å½•
        /// </summary>
        [Description("微信小程序登录")]
        WeChat,
        /// <summary>
        /// é¡µé¢ç«¯ç™»å½•
        /// </summary>
          [Description("页面端登录")]
        Web
    }
}
DocumentServiceAPI.Model/User/JobInfo.cs
File was deleted
DocumentServiceAPI.Model/User/UnitInfo.cs
File was deleted
DocumentServiceAPI.Model/User/UserInfo.cs
File was deleted
DocumentServiceAPI.Model/User/UserUnitInfo.cs
File was deleted
DocumentServiceAPI.Model/UserInfoModel/EmployeeAtTenant.cs
New file
@@ -0,0 +1,37 @@
using DocumentServiceAPI.Enum;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Model.UserInfoModel
{
    /// <summary>
    /// å‘˜å·¥ç§Ÿæˆ· å…³ç³»è¡¨
    /// </summary>
    public class EmployeeAtTenant:BaseModel
    {
        /// <summary>
        /// ID
        /// </summary>
        [Display(Name = "ID ")]
        [SugarColumn(ColumnDescription = "ID ",IsPrimaryKey =true,IsIdentity =true)]
        public int ID { get; set; }
        /// <summary>
        /// å‘˜å·¥ID
        /// </summary>
        [Display(Name = "员工ID ")]
        [SugarColumn(ColumnDescription = "员工ID ")]
        public int EmployeeID { get; set; }
        /// <summary>
        /// ç§Ÿæˆ·ID
        /// </summary>
        [Display(Name = "租户ID ")]
        [SugarColumn(ColumnDescription = "租户ID ")]
        public int TenantID { get; set; }
    }
}
DocumentServiceAPI.Model/UserInfoModel/EmployeeInfo.cs
New file
@@ -0,0 +1,71 @@
using DocumentServiceAPI.Enum;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Model.UserInfoModel
{
    /// <summary>
    /// å‘˜å·¥
    /// </summary>
    [Display(Name = "员工 ")]
    [SugarTable(TableName = "EmployeeInfo", TableDescription = "员工")]
    public class EmployeeInfo
    {
        /// <summary>
        /// å‘˜å·¥ID
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        /// <summary>
        /// å‘˜å·¥åç§°
        /// </summary>
        public string EmployeeName { get; set; }
        /// <summary>
        /// ç”µè¯
        /// </summary>
        public string? Phone { get; set; }
        /// <summary>
        /// ç¦»å¼€æ—¶é—´
        /// </summary>
        public DateTime? LeaveTime { get; set; }
        /// <summary>
        /// è¯ä»¶æ­£é¢
        /// </summary>
        public string CardPositive { get; set; }
        /// <summary>
        /// è¯ä»¶æ­£é¢ç‰ˆæœ¬å·
        /// </summary>
        public string? CardPositiveVersionNo { get; set; }
        /// <summary>
        /// ç”¨æˆ·å
        /// </summary>
        public string ITCode { get; set; }
        /// <summary>
        /// ç”¨æˆ·å¯†ç 
        /// </summary>
        public string UserPassWord { get; set; }
        /// <summary>
        /// å»ºè®®æ ‡å¿—
        /// </summary>
        public int? AdviseFlag { get; set; }
        /// <summary>
        /// æè¿°
        /// </summary>
         public string? Description { get; set; }
    }
}
DocumentServiceAPI.Model/UserInfoModel/TenantInfo.cs
New file
@@ -0,0 +1,78 @@
using DocumentServiceAPI.Enum;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Model.UserInfoModel
{
    /// <summary>
    /// ç§Ÿæˆ·è¡¨
    /// </summary>
    [Display(Name = "租户表 ")]
    [SugarTable(TableName = "TenantInfo", TableDescription = "租户表")]
    public class TenantInfo : BaseModel
    {
        /// <summary>
        /// ID
        /// </summary>
        [Display(Name = "ID ")]
        [SugarColumn(ColumnDescription = "ID ",IsPrimaryKey =true,IsIdentity =true)]
        public int Id { get; set; }
        /// <summary>
        /// ç§Ÿæˆ·å
        /// </summary>
        [Display(Name = "租户名 ")]
        [SugarColumn(ColumnDescription = "租户名 ",Length =20)]
        public string ItCode { get; set; }
        /// <summary>
        /// åç§°
        /// </summary>
        [Display(Name = "名称 ")]
        [SugarColumn(ColumnDescription = "名称 ", Length = 200)]
        public string? Name { get; set; }
        /// <summary>
        /// æè¿°
        /// </summary>
        [Display(Name = "描述 ")]
        [SugarColumn(ColumnDescription = "描述 ")]
        public string? Description { get; set; }
        /// <summary>
        /// æ ‡æ³¨
        /// </summary>
        [Display(Name = "标注")]
        [SugarColumn(ColumnDescription = "标注")]
        public string? ReMark { get; set; }
        /// <summary>
        /// æ•°æ®åº“链接字符串 å¤‡ç”¨
        /// </summary>
        [Display(Name = "数据库链接字符串")]
        [SugarColumn(ColumnDescription = "数据库链接字符串")]
        public string? ConnectionString { get; set; }
        /// <summary>
        /// æ•°æ®åº“类型 å¤‡ç”¨
        /// </summary>
        [Display(Name = "数据库类型")]
        [SugarColumn(ColumnDescription = "数据库类型")]
        public string? DbType { get; set; }
        /// <summary>
        /// å¯†ç 
        /// </summary>
        [SugarColumn(Length =30)]
        public string? PsW { get; set; }
    }
}
DocumentServiceAPI.Model/cyDocumentModel/Document_EmployeeInfo.cs
@@ -5,135 +5,80 @@
namespace DocumentServiceAPI.Model.cyDocumentModel
{
    ///<summary>
    ///
    ///</summary>
    /// <summary>
    /// æ–‡æ¡£å‘˜å·¥ä¿¡æ¯
    /// </summary>
    [SugarTable("Document_EmployeeInfo")]
    public partial class Document_EmployeeInfo
    {
           public Document_EmployeeInfo(){
           }
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>
           [SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
           public int EmployeeId {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string EmployeeName {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string Job {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string Phone {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? IsWork {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public DateTime? LeaveTime {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string CardPositive {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string CardPositiveVersionNo {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? CardPositiveSize {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public DateTime? LastUpdateTime {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string LastUpdateName {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string UserName {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string UserPassWord {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public DateTime? LoginTime {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public bool? IsLogin {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? AdviseFlag {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? UserId {get;set;}
        /// <summary>
        /// å‘˜å·¥ID
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int EmployeeId { get; set; }
        /// <summary>
        /// å‘˜å·¥åç§°
        /// </summary>
        public string EmployeeName { get; set; }
        /// <summary>
        /// å·¥ä½œèŒä½
        /// </summary>
        public string Job { get; set; }
        /// <summary>
        /// ç”µè¯
        /// </summary>
        public string Phone { get; set; }
        /// <summary>
        /// æ˜¯å¦åœ¨å·¥ä½œ
        /// </summary>
        public int? IsWork { get; set; }
        /// <summary>
        /// ç¦»å¼€æ—¶é—´
        /// </summary>
        public DateTime? LeaveTime { get; set; }
        /// <summary>
        /// è¯ä»¶æ­£é¢
        /// </summary>
        public string CardPositive { get; set; }
        /// <summary>
        /// è¯ä»¶æ­£é¢ç‰ˆæœ¬å·
        /// </summary>
        public string CardPositiveVersionNo { get; set; }
        /// <summary>
        /// è¯ä»¶æ­£é¢å¤§å°
        /// </summary>
        public int? CardPositiveSize { get; set; }
        /// <summary>
        /// æœ€åŽæ›´æ–°æ—¶é—´
        /// </summary>
        public DateTime? LastUpdateTime { get; set; }
        /// <summary>
        /// æœ€åŽæ›´æ–°äºº
        /// </summary>
        public string LastUpdateName { get; set; }
        /// <summary>
        /// ç”¨æˆ·å
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// ç”¨æˆ·å¯†ç 
        /// </summary>
        public string UserPassWord { get; set; }
        /// <summary>
        /// ç™»å½•æ—¶é—´
        /// </summary>
        public DateTime? LoginTime { get; set; }
        /// <summary>
        /// æ˜¯å¦ç™»å½•
        /// </summary>
        public bool? IsLogin { get; set; }
        /// <summary>
        /// å»ºè®®æ ‡å¿—
        /// </summary>
        public int? AdviseFlag { get; set; }
        /// <summary>
        /// ç”¨æˆ·ID
        /// </summary>
        public int? UserId { get; set; }
    }
}
DocumentServiceAPI.Model/cyDocumentModel/Document_EmployeeRole.cs
@@ -6,36 +6,26 @@
namespace DocumentServiceAPI.Model.cyDocumentModel
{
    ///<summary>
    ///
    ///文档员工角色
    ///</summary>
    [SugarTable("Document_EmployeeRole")]
    public partial class Document_EmployeeRole
    {
           public Document_EmployeeRole(){
           }
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>
           [SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
           public int ID {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>
           public int EmployeeId {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>
           public int RoleType {get;set;}
        /// <summary>
        /// ID
        /// é»˜è®¤å€¼ï¼š
        /// å¯ç©ºï¼šFalse
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int ID { get; set; }
        /// <summary>
        /// å‘˜å·¥ID
        /// </summary>
        public int? EmployeeId { get; set; }
        /// <summary>
        /// è§’色类型
        /// </summary>
        public int? RoleType { get; set; }
    }
}
DocumentServiceAPI.Model/cyDocumentModel/Document_PerformanceInfo.cs
@@ -11,59 +11,50 @@
    [SugarTable("Document_PerformanceInfo")]
    public partial class Document_PerformanceInfo
    {
           public Document_PerformanceInfo(){
           }
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>
           [SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
           public int Id {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? EmployeeId {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string ProjectName {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string WorkItem {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public decimal? Price {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public DateTime? WorkTime {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string EmployeeName {get;set;}
        /// <summary>
        /// ID
        /// é»˜è®¤å€¼ï¼š
        /// å¯ç©ºï¼šFalse
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        /// <summary>
        /// å‘˜å·¥ID
        /// é»˜è®¤å€¼ï¼š
        /// å¯ç©ºï¼šTrue
        /// </summary>
        public int? EmployeeId { get; set; }
        /// <summary>
        /// é¡¹ç›®åç§°
        /// é»˜è®¤å€¼ï¼š
        /// å¯ç©ºï¼šTrue
        /// </summary>
        public string ProjectName { get; set; }
        /// <summary>
        /// å·¥ä½œé¡¹
        /// é»˜è®¤å€¼ï¼š
        /// å¯ç©ºï¼šTrue
        /// </summary>
        public string WorkItem { get; set; }
        /// <summary>
        /// ä»·æ ¼
        /// é»˜è®¤å€¼ï¼š
        /// å¯ç©ºï¼šTrue
        /// </summary>
        public decimal? Price { get; set; }
        /// <summary>
        /// å·¥ä½œæ—¶é—´
        /// é»˜è®¤å€¼ï¼š
        /// å¯ç©ºï¼šTrue
        /// </summary>
        public DateTime? WorkTime { get; set; }
        /// <summary>
        /// å‘˜å·¥å§“名
        /// é»˜è®¤å€¼ï¼š
        /// å¯ç©ºï¼šTrue
        /// </summary>
        public string EmployeeName { get; set; }
    }
}
DocumentServiceAPI.Model/cyDocumentModel/Document_TenderUnit.cs
@@ -5,310 +5,193 @@
namespace DocumentServiceAPI.Model.cyDocumentModel
{
    ///<summary>
    ///
    ///</summary>
    /// <summary>
    /// å•位
    /// </summary>
    [SugarTable("Document_TenderUnit")]
    public partial class Document_TenderUnit
    {
           public Document_TenderUnit(){
           }
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>
           [SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
           public int UnitId {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>
           public string UnitName {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string UnitType {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string Address {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string ZipCode {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string ContactPerson {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string ContactPhone {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string Fax {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string WebUrl {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string OrgStructure {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string Corporater {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string CorporaterPost {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string CorporaterTechnicalPost {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string CorporatePhone {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string TechnicalLeader {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string TechnicalPost {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string TechnicalPhone {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string CreatTime {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string StaffCount {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string FirmQualificationLevel {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string BusinessLicense {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string RegMoney {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string OpenBank {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string BankNum {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string ProjectManager {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string SeniorStaff {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string MiddleStaff {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string PrimaryStaff {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string Mechanicer {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string BusinessContent {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string Remark {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string UnitLogo {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string UnitLogoVersionNo {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? UnitLogoSize {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string CardPositive {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string CardPositiveVersionNo {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? CardPositiveSize {get;set;}
           /// <summary>
           /// Desc:
           /// Default:1
           /// Nullable:True
           /// </summary>
           public int? IsUsed {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public DateTime? LastUpdateTime {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string LastUpdateName {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? AdviseFlag {get;set;}
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public int? UserId {get;set;}
        /// <summary>
        /// ID
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int UnitId { get; set; }
        ///<summary>
        ///单位名称
        ///</summary>
        public string UnitName { get; set; }
        ///<summary>
        ///单位类型
        ///</summary>
        public string? UnitType { get; set; }
        ///<summary>
        ///地址
        ///</summary>
        public string? Address { get; set; }
        ///<summary>
        ///邮政编码
        ///</summary>
        public string? ZipCode { get; set; }
        ///<summary>
        ///联系人
        ///</summary>
        public string? ContactPerson { get; set; }
        ///<summary>
        ///联系电话
        ///</summary>
        public string? ContactPhone { get; set; }
        ///<summary>
        ///传真
        ///</summary>
        public string? Fax { get; set; }
        ///<summary>
        ///网址
        ///</summary>
        public string? WebUrl { get; set; }
        ///<summary>
        ///组织结构
        ///</summary>
        public string? OrgStructure { get; set; }
        ///<summary>
        ///法人代表
        ///</summary>
        public string? Corporater { get; set; }
        ///<summary>
        ///法人职务
        ///</summary>
        public string? CorporaterPost { get; set; }
        ///<summary>
        ///法人技术职务
        ///</summary>
        public string? CorporaterTechnicalPost { get; set; }
        ///<summary>
        ///法人联系电话
        ///</summary>
        public string? CorporatePhone { get; set; }
        ///<summary>
        ///技术负责人
        ///</summary>
        public string? TechnicalLeader { get; set; }
        ///<summary>
        ///技术职务
        ///</summary>
        public string? TechnicalPost { get; set; }
        ///<summary>
        ///技术联系电话
        ///</summary>
        public string? TechnicalPhone { get; set; }
        ///<summary>
        ///创建时间
        ///</summary>
        public string? CreatTime { get; set; }
        ///<summary>
        ///员工数量
        ///</summary>
        public string? StaffCount { get; set; }
        ///<summary>
        ///企业资质等级
        ///</summary>
        public string? FirmQualificationLevel { get; set; }
        ///<summary>
        ///营业执照
        ///</summary>
        public string? BusinessLicense { get; set; }
        ///<summary>
        ///注册资金
        ///</summary>
        public string? RegMoney { get; set; }
        ///<summary>
        ///开户银行
        ///</summary>
        public string? OpenBank { get; set; }
        ///<summary>
        ///银行账号
        ///</summary>
        public string? BankNum { get; set; }
        ///<summary>
        ///项目经理
        ///</summary>
        public string? ProjectManager { get; set; }
        ///<summary>
        ///高级职工
        ///</summary>
        public string? SeniorStaff { get; set; }
        ///<summary>
        ///中级职工
        ///</summary>
        public string? MiddleStaff { get; set; }
        ///<summary>
        ///初级职工
        ///</summary>
        public string ?PrimaryStaff { get; set; }
        ///<summary>
        ///高级工
        ///</summary>
        public string ?Mechanicer { get; set; }
        ///<summary>
        ///经营内容
        ///</summary>
        public string ?BusinessContent { get; set; }
        ///<summary>
        ///备注
        ///</summary>
        public string ?Remark { get; set; }
        ///<summary>
        ///单位Logo
        ///</summary>
        public string? UnitLogo { get; set; }
        ///<summary>
        ///单位Logo版本号
        ///</summary>
        public string? UnitLogoVersionNo { get; set; }
        ///<summary>
        ///单位Logo大小
        ///</summary>
        public int? UnitLogoSize { get; set; }
        ///<summary>
        ///身份证正面
        ///</summary>
        public string ?CardPositive { get; set; }
        ///<summary>
        ///身份证正面版本号
        ///</summary>
        public string ?CardPositiveVersionNo { get; set; }
        ///<summary>
        ///身份证正面大小
        ///</summary>
        public int? CardPositiveSize { get; set; }
        ///<summary>
        ///是否使用
        ///</summary>
        public int? IsUsed { get; set; }
        ///<summary>
        ///最后更新时间
        ///</summary>
        public DateTime? LastUpdateTime { get; set; }
        ///<summary>
        ///最后更新人
        ///</summary>
        public string? LastUpdateName { get; set; }
        ///<summary>
        ///建议标志
        ///</summary>
        public int? AdviseFlag { get; set; }
        ///<summary>
        ///租户ID
        ///</summary>
        [SugarColumn(DefaultValue ="0")]
        public int TenantId { get; set; }
        /// <summary>
        /// UserId
        /// </summary>
        public int? UserId { get; set; }
        /// <summary>
        /// æ˜¯å¦æœ‰æ•ˆ
        /// </summary>
        public bool? IsEn {  get; set; }
        /// <summary>
        ///  æ˜¯å¦åˆ é™¤
        /// </summary>
        public bool ? IsDeled { get; set; }
    }
}
DocumentServiceAPI.Model/cyDocumentModel/Document_UserInfo.cs
@@ -5,44 +5,39 @@
namespace DocumentServiceAPI.Model.cyDocumentModel
{
    ///<summary>
    ///
    ///</summary>
    /// <summary>
    /// æ–‡æ¡£ç”¨æˆ·
    /// </summary>
    [SugarTable("Document_UserInfo")]
    public partial class Document_UserInfo
    {
           public Document_UserInfo(){
        /// <summary>
        /// Desc: ç”¨æˆ·ID
        /// Default:
        /// Nullable: False
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int UserId { get; set; }
        /// <summary>
        /// Desc: ç”¨æˆ·å
        /// Default:
        /// Nullable: True
        /// </summary>
        public string UserName { get; set; }
           }
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:False
           /// </summary>
           [SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
           public int UserId {get;set;}
        /// <summary>
        /// Desc: æ˜¯å¦ç»ç†
        /// Default: 0
        /// Nullable: True
        /// </summary>
        public int? IsManager { get; set; }
           /// <summary>
           /// Desc:
           /// Default:
           /// Nullable:True
           /// </summary>
           public string UserName {get;set;}
           /// <summary>
           /// Desc:
           /// Default:0
           /// Nullable:True
           /// </summary>
           public int? IsManager {get;set;}
           /// <summary>
           /// Desc:
           /// Default:1
           /// Nullable:True
           /// </summary>
           public int? IsUsed {get;set;}
        /// <summary>
        /// Desc: æ˜¯å¦å·²ä½¿ç”¨
        /// Default: 1
        /// Nullable: True
        /// </summary>
        public int? IsUsed { get; set; }
    }
}
DocumentServiceAPI.Model/cyDocumentModel/¿âĿ¼.md
New file
@@ -0,0 +1,26 @@

Document_Adviselnfo.cs - æ–‡æ¡£å’¨è¯¢ä¿¡æ¯
Document_AptitudelMG.cs - æ–‡æ¡£èµ„质管理
Document_Aptitudelnfo.cs - æ–‡æ¡£èµ„质信息
Document_AptitudeType.cs - æ–‡æ¡£èµ„质类型
Document_CommonFile.cs - æ–‡æ¡£é€šç”¨æ–‡ä»¶
Document_DelegatePersonlnfo.cs - æ–‡æ¡£å§”托人信息
Document_Dictionary.cs - æ–‡æ¡£å­—å…¸
Document_DocumentTempletlnfo.cs - æ–‡æ¡£æ¨¡æ¿ä¿¡æ¯
Document_Employeelnfo.cs - æ–‡æ¡£å‘˜å·¥ä¿¡æ¯
Document_EmployeeRole.cs - æ–‡æ¡£å‘˜å·¥è§’色
Document_LayInfo.cs - æ–‡æ¡£å¸ƒå±€ä¿¡æ¯
Document_OtherCompanyTenderInfo.cs - æ–‡æ¡£å…¶ä»–公司投标信息
Document_Performancelnfo.cs - æ–‡æ¡£ç»©æ•ˆä¿¡æ¯
Document_ProjectComplainlnfo.cs - æ–‡æ¡£é¡¹ç›®æŠ•诉信息
Document_ProjectDocumentInfo.cs - æ–‡æ¡£é¡¹ç›®æ–‡æ¡£ä¿¡æ¯
Document_ProjectExpand.cs - æ–‡æ¡£é¡¹ç›®æ‰©å±•
Document_ProjectInfo.cs - æ–‡æ¡£é¡¹ç›®ä¿¡æ¯
Document_ProjectLitigationlnfo.cs - æ–‡æ¡£é¡¹ç›®è¯‰è®¼ä¿¡æ¯
Document_ProjectOppugninfo.cs - æ–‡æ¡£é¡¹ç›®è´¨ç–‘信息
Document_ProjectReviewInfo.cs - æ–‡æ¡£é¡¹ç›®è¯„审信息
Document_Synchrolnfo.cs - æ–‡æ¡£åŒæ­¥ä¿¡æ¯
Document_TenderUnit.cs - æ–‡æ¡£æ‹›æ ‡å•位
Document_Userlnfo.cs - æ–‡æ¡£ç”¨æˆ·ä¿¡æ¯
Document_WinInfo.cs - æ–‡æ¡£ä¸­æ ‡ä¿¡æ¯
Document_WorkRemind.cs - æ–‡æ¡£å·¥ä½œæé†’
DocumentServiceAPI.Services/DocumentServiceAPI.Services.csproj
New file
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="CSRedisCore" Version="3.8.670" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\DocumentServiceAPI.Core\DocumentServiceAPI.Core.csproj" />
  </ItemGroup>
</Project>
DocumentServiceAPI.Services/IService/ICacheService.cs
New file
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Services.IService
{
    /// <summary>
    /// ç¼“存服务
    /// ç›®å‰åªå†™äº†å¯¹redis的支持 ï¼Œå¦‚需要其他的,自行完善 è¯¥æŽ¥å£ä¸ºæŒ‰æ ‡å‡†æœåŠ¡æ³¨å…¥ï¼Œåœ¨æ³¨å…¥æ—¶åˆ¤å†³äº†å¯¹redis的配置。如果没有偶配置,者不注入服务
    /// </summary>
    public interface IRedisCacheService
    {
        /// <summary>
        /// è®¾ç½®ä¸€ä¸ªé”®å€¼
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="expireSeconds"></param>
        /// <returns></returns>
        bool Add<T>(string key, T value, int expireSeconds);
        /// <summary>
        /// èŽ·å–ä¸€ä¸ªé”®å€¼
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        T? Get<T>(string key);
        /// <summary>
        /// èŽ·å–é”®å€¼å‰©ä½™è¿‡æ—¶é—´ ç§’级
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public long GetTtl(string key);
    }
}
DocumentServiceAPI.Services/RedisCacheScService.cs
New file
@@ -0,0 +1,42 @@
using DocumentServiceAPI.Services.IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Furion.DependencyInjection;
namespace DocumentServiceAPI.Services
{
    /// <summary>
    /// redis缓存服务
    /// </summary>
    public class RedisCacheScService: IRedisCacheService, IScoped
    {
        /// <summary>
        /// è®¾ç½®ä¸€ä¸ªé”®å€¼
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool Add<T>(string key, T value, int expireSeconds = -1)
        {
            return RedisHelper.Set(key, value, expireSeconds);
        }
        public T? Get<T>(string key)
        {
            return RedisHelper.Get<T>(key);
        }
        /// <summary>
        /// èŽ·å–ç§’çº§è¿‡æœŸæ—¶é—´
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public long GetTtl(string key)
        {
            return RedisHelper.Ttl(key);
        }
    }
}
DocumentServiceAPI.Utility/DocumentServiceAPI.Utility.csproj
@@ -7,4 +7,8 @@
    <GenerateDocumentationFile>True</GenerateDocumentationFile>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
  </ItemGroup>
</Project>
DocumentServiceAPI.Web.Core/DocumentServiceAPI.Web.Core.csproj
@@ -15,6 +15,7 @@
    <ItemGroup>
        <ProjectReference Include="..\DocumentServiceAPI.Application\DocumentServiceAPI.Application.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Model\DocumentServiceAPI.Model.csproj" />
    </ItemGroup>
</Project>
DocumentServiceAPI.Web.Core/DocumentServiceAPI.Web.Core.xml
@@ -4,5 +4,53 @@
        <name>DocumentServiceAPI.Web.Core</name>
    </assembly>
    <members>
        <member name="T:DocumentServiceAPI.Web.Core.DSRESTFulResultProvider">
            <summary>
            ç»Ÿä¸€è¿”回
            </summary>
        </member>
        <member name="M:DocumentServiceAPI.Web.Core.DSRESTFulResultProvider.OnException(Microsoft.AspNetCore.Mvc.Filters.ExceptionContext,Furion.FriendlyException.ExceptionMetadata)">
            <summary>
            å¼‚常返回值
            </summary>
            <param name="context"></param>
            <param name="metadata"></param>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Web.Core.DSRESTFulResultProvider.OnSucceeded(Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext,System.Object)">
            <summary>
            æˆåŠŸè¿”å›žå€¼
            </summary>
            <param name="context"></param>
            <param name="data"></param>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Web.Core.DSRESTFulResultProvider.OnValidateFailed(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext,Furion.DataValidation.ValidationMetadata)">
            <summary>
            éªŒè¯å¤±è´¥è¿”回值
            </summary>
            <param name="context"></param>
            <param name="metadata"></param>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Web.Core.DSRESTFulResultProvider.OnResponseStatusCodes(Microsoft.AspNetCore.Http.HttpContext,System.Int32,Furion.UnifyResult.UnifyResultSettingsOptions)">
            <summary>
            ç‰¹å®šçŠ¶æ€ç è¿”å›žå€¼
            </summary>
            <param name="context"></param>
            <param name="statusCode"></param>
            <param name="unifyResultSettings"></param>
            <returns></returns>
        </member>
        <member name="M:DocumentServiceAPI.Web.Core.DSRESTFulResultProvider.DsFulResult(System.Int32,System.Int32,System.Object,System.Object)">
            <summary>
            è¿”回 RESTful é£Žæ ¼ç»“果集
            </summary>
            <param name="statusCode"></param>
            <param name="Code">成功状态码</param>
            <param name="data"></param>
            <param name="errors"></param>
            <returns></returns>
        </member>
    </members>
</doc>
DocumentServiceAPI.Web.Core/Filter/EnumSchemaFilter .cs
New file
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Web.Core.Filter
{
    internal class EnumSchemaFilter
    {
    }
}
DocumentServiceAPI.Web.Core/Handlers/DSRESTfulResultProvider.cs
New file
@@ -0,0 +1,110 @@
using DocumentServiceAPI.Model;
using Furion;
using Furion.DataValidation;
using Furion.FriendlyException;
using Furion.UnifyResult;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Threading.Tasks;
namespace DocumentServiceAPI.Web.Core
{
    /// <summary>
    /// ç»Ÿä¸€è¿”回
    /// </summary>
    [UnifyModel(typeof(DSFulResult<>))]
    public class DSRESTFulResultProvider : IUnifyResultProvider
    {
        /// <summary>
        /// å¼‚常返回值
        /// </summary>
        /// <param name="context"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
        {
            return new JsonResult(DsFulResult(metadata.StatusCode, Code:0, data: metadata.Data, errors: metadata.Errors)
                , UnifyContext.GetSerializerSettings(context)); // å½“前行仅限 Furion 4.6.6+ ä½¿ç”¨
        }
        /// <summary>
        /// æˆåŠŸè¿”å›žå€¼
        /// </summary>
        /// <param name="context"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public IActionResult OnSucceeded(ActionExecutedContext context, object data)
        {
            return new JsonResult(DsFulResult(StatusCodes.Status200OK, 1, data)
                , UnifyContext.GetSerializerSettings(context)); // å½“前行仅限 Furion 4.6.6+ ä½¿ç”¨
        }
        /// <summary>
        /// éªŒè¯å¤±è´¥è¿”回值
        /// </summary>
        /// <param name="context"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
        {
            //设置返回状态码
            return new JsonResult(DsFulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, Code: 0, data: metadata.Data, errors: metadata.ValidationResult)
                , UnifyContext.GetSerializerSettings(context)); // å½“前行仅限 Furion 4.6.6+ ä½¿ç”¨
        }
        /// <summary>
        /// ç‰¹å®šçŠ¶æ€ç è¿”å›žå€¼
        /// </summary>
        /// <param name="context"></param>
        /// <param name="statusCode"></param>
        /// <param name="unifyResultSettings"></param>
        /// <returns></returns>
        public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
        {
            // è®¾ç½®å“åº”状态码
            UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);
            switch (statusCode)
            {
                // å¤„理 401 çŠ¶æ€ç 
                case StatusCodes.Status401Unauthorized:
                    await context.Response.WriteAsJsonAsync(DsFulResult(statusCode,Code:0, errors: "401 Unauthorized")
                        , App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                    break;
                // å¤„理 403 çŠ¶æ€ç 
                case StatusCodes.Status403Forbidden:
                    await context.Response.WriteAsJsonAsync(DsFulResult(statusCode, Code: 0, errors: "403 Forbidden")
                        , App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                    break;
                default: break;
            }
        }
        /// <summary>
        /// è¿”回 RESTful é£Žæ ¼ç»“果集
        /// </summary>
        /// <param name="statusCode"></param>
        /// <param name="Code">成功状态码</param>
        /// <param name="data"></param>
        /// <param name="errors"></param>
        /// <returns></returns>
        private static DSFulResult<object> DsFulResult(int statusCode, int Code = 1, object data = default, object errors = default)
        {
            return new DSFulResult<object>
            {
                Code = Code,
                StatusCode= statusCode,
                Data = data,
                Error = errors,
                Extras = UnifyContext.Take(),
                Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
            };
        }
    }
}
DocumentServiceAPI.Web.Core/Handlers/JwtHandler.cs
@@ -1,4 +1,6 @@
using Furion.Authorization;
using DocumentServiceAPI.Application.UserAndLogin.Services;
using Furion;
using Furion.Authorization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
@@ -10,7 +12,8 @@
    public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
    {
        // è¿™é‡Œå†™æ‚¨çš„æŽˆæƒåˆ¤æ–­é€»è¾‘,授权通过返回 true,否则返回 false
      bool ret=    App.GetService<TokenService>().CheckToken();
        return Task.FromResult(true);
        return Task.FromResult(ret);
    }
}
DocumentServiceAPI.Web.Core/Startup.cs
@@ -1,9 +1,11 @@
using DocumentServiceAPI.Core;
using DocumentServiceAPI.Model;
using Furion;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Text.Json.Serialization;
namespace DocumentServiceAPI.Web.Core;
@@ -16,8 +18,10 @@
        services.AddCorsAccessor();
        services.AddControllers()
                .AddInjectWithUnifyResult();
        services.AddControllers().AddJsonOptions(options =>
            options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())); ;
         services.AddInjectWithUnifyResult<DSRESTFulResultProvider>();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
DocumentServiceAPI.Web.Entry/AuthorizeHandler.cs
New file
@@ -0,0 +1,40 @@
using Furion.Authorization;
using Microsoft.AspNetCore.Authorization;
namespace DocumentServiceAPI.Web.Entry
{
    /// <summary>
    /// é‰´æƒ
    /// </summary>
    public class AuthorizeHandler:AppAuthorizeHandler
    {
        /// <summary>
        /// è¯·æ±‚管道
        /// </summary>
        /// <param name="context"></param>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
        {
            // æ­¤å¤„已经自动验证 Jwt token的有效性了,无需手动验证
            // æ£€æŸ¥æƒé™ï¼Œå¦‚果方法是异步的就不用 Task.FromResult åŒ…裹,直接使用 async/await å³å¯
            return Task.FromResult(CheckAuthorzie(httpContext));
        }
        /// <summary>
        /// æ£€æŸ¥æƒé™
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        private static bool CheckAuthorzie(DefaultHttpContext httpContext)
        {
            // èŽ·å–æƒé™ç‰¹æ€§
            var securityDefineAttribute = httpContext.GetMetadata<SecurityDefineAttribute>();
            if (securityDefineAttribute == null) return true;
            return false;// "查询数据库返回是否有权限";
        }
    }
}
DocumentServiceAPI.Web.Entry/DocServiceApiStartup.cs
@@ -1,5 +1,11 @@
using DocumentServiceAPI.Core;
using CSRedis;
using DocumentServiceAPI.Core;
using DocumentServiceAPI.Model;
using DocumentServiceAPI.Services;
using DocumentServiceAPI.Services.IService;
using Furion;
using Mapster;
using System.Configuration;
namespace DocumentServiceAPI.Web.Entry
{
@@ -9,14 +15,33 @@
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSqlsugarSetup();
            var readisconnectionstring =  App.Configuration["RedisConfig:ConnectionString"];
            if (readisconnectionstring != null)
            //初始化redi配置
            {
                //有配置才注入
                RedisHelper.Initialization(new CSRedisClient(readisconnectionstring));
                //注入服务
                services.AddScoped<IRedisCacheService, RedisCacheScService>();
            }
        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.DbCodeFirst("DocumentServiceAPI.Model");
          var IsCodeFirst = App.GetConfig<bool>("isCodeFirst");
            if (IsCodeFirst)
            {
                //codefirst è¿å¾™æ•°æ®åº“设置
                app.DbCodeFirst("DocumentServiceAPI.Model");
                app.DbCodeFirst(typeof(DocumentServiceAPI.Model.cyDocumentModel.Document_TenderUnit));
            }
            //启动全局默认映射配置
            TypeAdapterConfig.GlobalSettings.Default.PreserveReference(true);
            app.UseStaticFiles(new StaticFileOptions
            {
                OnPrepareResponse = (stf) =>
@@ -25,6 +50,11 @@
                    stf.Context.Response.Headers["Access-Control-Allow-Headers"] = "*";
                }
            });
            App.Configuration.Get<WebHostBuilder>().ConfigureKestrel(x =>
            {
                x.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(20);
                x.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(20);
            });
        }
    }
}
DocumentServiceAPI.Web.Entry/DocumentServiceAPI.Web.Entry.csproj
@@ -16,6 +16,7 @@
        <ProjectReference Include="..\DocumentServiceAPI.Core\DocumentServiceAPI.Core.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Enum\DocumentServiceAPI.Enum.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Model\DocumentServiceAPI.Model.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Services\DocumentServiceAPI.Services.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Utility\DocumentServiceAPI.Utility.csproj" />
        <ProjectReference Include="..\DocumentServiceAPI.Web.Core\DocumentServiceAPI.Web.Core.csproj" />
    </ItemGroup>
@@ -25,6 +26,12 @@
    <ItemGroup>
      <Folder Include="新文件夹\" />
    </ItemGroup>
    <ItemGroup>
      <PackageReference Include="CSRedisCore" Version="3.8.670" />
    </ItemGroup>
    <ProjectExtensions>
        <VisualStudio>
            <UserProperties properties_4launchsettings_1json__JsonSchema="" />
DocumentServiceAPI.Web.Entry/HomeController.cs
File was deleted
DocumentServiceAPI.Web.Entry/appsettings.json
@@ -16,27 +16,21 @@
      "DbType": "SqlServer",
      "IsAutoCloseConnection": true
    }
  ],
  //swags åç§°é…ç½® é»˜è®¤åˆ†ç»„
  "[openapi:Default]": {
    "Title": "标书管理系统服务",
    "Order": 0,
    "Description": "这个一个很好用标书管理系统服务软件",
    "Version": "1.0.0",
    "TermsOfService": "http://www.51zhengcai.com",
    "Contact": {
      "Name": "政采咨询有限公司",
      "Url": "http://www.51zhengcai.com"
    },
    "License": {
      "Name": "政采咨询有限公司",
      "Url": "http://www.51zhengcai.com"
    }
  "isCodeFirst": false, //是否执行codefirst æ³¨æ„è¿™ä¸ªåœ¨è¿å¾™å®ŒæˆåŽåº”该设置为false é˜²æ­¢æ›´æ”¹æ•°æ®åº“
  //请保持redis为正常可用
  "RedisConfig": {
    // å¦‚果采用容器化部署Service è¦å†™æˆredis的服务名,否则写地址
    "ConnectionString": "127.0.0.1:6379,password=,connectTimeout=30000,responseTimeout=30000,abortConnect=false,connectRetry=1,syncTimeout=10000,DefaultDatabase=10" //redis数据库连接字符串
  },
  "JWTSettings": {
    "ValidateIssuerSigningKey": true, // æ˜¯å¦éªŒè¯å¯†é’¥ï¼Œbool ç±»åž‹ï¼Œé»˜è®¤true
    "IssuerSigningKey": "129(*dasd09213)*(*jKDl", // å¯†é’¥ï¼Œstring ç±»åž‹ï¼Œå¿…须是复杂密钥,长度大于16
DocumentServiceAPI.sln
@@ -19,6 +19,8 @@
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DocumentFile.Service", "DocumentFile.Service\DocumentFile.Service.csproj", "{F3449EF6-8E3F-492F-832F-F5F2E1F2503C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DocumentServiceAPI.Services", "DocumentServiceAPI.Services\DocumentServiceAPI.Services.csproj", "{3369F102-ABB2-42A4-B216-58D530AEE8BE}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
@@ -56,7 +58,10 @@
        {F3449EF6-8E3F-492F-832F-F5F2E1F2503C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {F3449EF6-8E3F-492F-832F-F5F2E1F2503C}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {F3449EF6-8E3F-492F-832F-F5F2E1F2503C}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {F3449EF6-8E3F-492F-832F-F5F2E1F2503C}.Release|Any CPU.Build.0 = Release|Any CPU
        {3369F102-ABB2-42A4-B216-58D530AEE8BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {3369F102-ABB2-42A4-B216-58D530AEE8BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {3369F102-ABB2-42A4-B216-58D530AEE8BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {3369F102-ABB2-42A4-B216-58D530AEE8BE}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE