using NCC.Common.Configuration; using NCC.Common.Const; using NCC.Common.Core.Manager; using NCC.Common.Enum; using NCC.Common.Extension; using NCC.Common.Util; using NCC.DataEncryption; using NCC.Dependency; using NCC.DynamicApiController; using NCC.EventBridge; using NCC.FriendlyException; using NCC.JsonSerialization; using NCC.OAuth.Service.Dto; using NCC.RemoteRequest.Extensions; using NCC.System.Entitys.Dto.Permission.User; using NCC.System.Entitys.Dto.System.SysConfig; using NCC.System.Entitys.Dto.System.SysLog; using NCC.System.Entitys.Permission; using NCC.System.Entitys.System; using NCC.System.Interfaces.Permission; using NCC.System.Interfaces.System; using NCC.UnifyResult; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using UAParser; using Yitter.IdGenerator; using NCC.Expand.Thirdparty.Sms; using NCC.Expand.Thirdparty.Sms.Model; using NCC.Core.Pay.Wechat; namespace NCC.OAuth.Service { /// /// 业务实现:身份认证模块 /// [ApiDescriptionSettings(Tag = "OAuth", Name = "OAuth", Order = 160)] [Route("api/[controller]")] public class OAuthService : IDynamicApiController, ITransient { private readonly IHttpContextAccessor _httpContextAccessor; private readonly ISqlSugarRepository _userRepository; // 用户表仓储 private readonly IUsersService _userService; // 用户表仓储 private readonly ISysConfigService _sysConfigService; //系统配置仓储 private readonly IModuleService _moduleService;//功能模块 private readonly IModuleColumnService _columnService; //功能列 private readonly IModuleButtonService _moduleButtonService;//功能按钮 private readonly IModuleFormService _formService;//表单 private readonly IModuleDataAuthorizeSchemeService _moduleDataAuthorizeSchemeService; private readonly IUserManager _userManager; // 用户管理 private readonly ISysCacheService _sysCacheService; private readonly IUserRelationService _userRelationService; // 用户关系表服务 private readonly SqlSugarScope _db; private readonly ITenant _tenant; /// /// 初始化一个类型的新实例 /// public OAuthService(IUsersService userService, ISqlSugarRepository userRepository, IHttpContextAccessor httpContextAccessor, ISysConfigService sysConfigService, IModuleService moduleService, IModuleColumnService columnService, IModuleButtonService moduleButtonService, IModuleFormService formService, IModuleDataAuthorizeSchemeService moduleDataAuthorizeSchemeService, IUserManager userManager, ISysCacheService sysCacheService, IUserRelationService userRelationService, ISqlSugarClient db) { _httpContextAccessor = httpContextAccessor; _userRepository = userRepository; _userService = userService; _sysConfigService = sysConfigService; _moduleService = moduleService; _columnService = columnService; _formService = formService; _moduleButtonService = moduleButtonService; _moduleDataAuthorizeSchemeService = moduleDataAuthorizeSchemeService; _userManager = userManager; _sysCacheService = sysCacheService; _userRelationService = userRelationService; _db = (SqlSugarScope)db; _tenant = (ITenant)_db; } /// /// 用户登录 /// /// 登录输入参数 /// [HttpPost("Login")] [AllowAnonymous] [Consumes("application/x-www-form-urlencoded")] public async Task Login([FromForm] LoginInput input) { string tenantDbName = App.Configuration["ConnectionStrings:DBName"]; string tenantId = App.Configuration["ConnectionStrings:ConfigId"]; string tenantAccout = string.Empty; if (KeyVariable.MultiTenancy) { //分割账号 var tenantAccount = input.account.Split('@'); tenantId = tenantAccount.FirstOrDefault(); if (tenantAccount.Length == 1) input.account = "admin"; else input.account = tenantAccount[1]; tenantAccout = input.account; var interFace = App.Configuration["NCC_App:MultiTenancyDBInterFace"] + tenantId; var response = await interFace.GetAsStringAsync(); var data = JSON.Deserialize>(response); if (data == null) throw NCCException.Oh(ErrorCode.D1024); else if (data.data == null) throw NCCException.Oh(ErrorCode.D1023); else tenantDbName = data.data.dotnet; _tenant.AddConnection(new ConnectionConfig() { DbType = (DbType)Enum.Parse(typeof(DbType), App.Configuration["ConnectionStrings:DBType"]), ConfigId = tenantId,//设置库的唯一标识 IsAutoCloseConnection = true, ConnectionString = string.Format($"{App.Configuration["ConnectionStrings:DefaultConnection"]}", tenantDbName) }); _tenant.ChangeDatabase(tenantId); } //根据用户账号获取用户秘钥 var user = await _userService.GetInfoByAccount(input.account); _ = user ?? throw NCCException.Oh(ErrorCode.D5002); bool isMoble = false; if (input.account == user.MobilePhone) isMoble = true; //获取加密后的密码 var encryptPasswod = MD5Encryption.Encrypt(input.password + user.Secretkey); var userAnyPwd = await _userService.GetInfoByLogin(input.account, encryptPasswod, isMoble); _ = userAnyPwd ?? throw NCCException.Oh(ErrorCode.D1000); // 验证账号是否未被激活 if (user.EnabledMark == null) throw NCCException.Oh(ErrorCode.D1018); // 验证账号是否被禁用 if (user.EnabledMark == 0) throw NCCException.Oh(ErrorCode.D1019); // 验证账号是否被删除 if (user.DeleteMark == 1) throw NCCException.Oh(ErrorCode.D1017); // app权限验证 if (NetUtil.isMobileBrowser && user.IsAdministrator == 0 && !ExistRoleByApp(user.RoleId)) throw NCCException.Oh(ErrorCode.D1022); //登录成功时 判断单点登录信息 //token过期时间 var tokenTimeout = await _sysConfigService.GetInfo("SysConfig", "tokentimeout"); var accessToken = string.Empty; // 生成Token令牌 if (KeyVariable.MultiTenancy) { accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.CLAINM_USERID, userAnyPwd.Id }, { ClaimConst.CLAINM_ACCOUNT, userAnyPwd.Account }, { ClaimConst.CLAINM_REALNAME, userAnyPwd.RealName }, { ClaimConst.CLAINM_ADMINISTRATOR, userAnyPwd.IsAdministrator }, { ClaimConst.TENANT_ID, tenantId }, { ClaimConst.TENANT_DB_NAME, tenantDbName } }, long.Parse(tokenTimeout.Value)); } else { accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.CLAINM_USERID, userAnyPwd.Id }, { ClaimConst.CLAINM_ACCOUNT, userAnyPwd.Account }, { ClaimConst.CLAINM_REALNAME, userAnyPwd.RealName }, { ClaimConst.CLAINM_ADMINISTRATOR, userAnyPwd.IsAdministrator }, { ClaimConst.TENANT_ID, tenantId }, { ClaimConst.TENANT_DB_NAME, tenantDbName } }, long.Parse(tokenTimeout.Value)); } var httpContext = _httpContextAccessor.HttpContext; // 设置Swagger自动登录 httpContext.SigninToSwagger(accessToken); // 生成刷新Token令牌 var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, 30); // 设置刷新Token令牌 httpContext.Response.Headers["x-access-token"] = refreshToken; var ip = httpContext.GetRemoteIpAddressToIPv4(); // 修改用户登录信息 await Event.EmitAsync("User:UpdateUserLoginInfo", new UserEventDealWithInput { tenantId = tenantId, tenantDbName = tenantDbName, entity = new UserEntity() { Id = user.Id, FirstLogIP = user.FirstLogIP ?? ip, FirstLogTime = user.FirstLogTime ?? DateTime.Now, PrevLogTime = user.LastLogTime, PrevLogIP = user.LastLogIP, LastLogTime = DateTime.Now, LastLogIP = ip, LogSuccessCount = user.LogSuccessCount + 1 } }); //登录时间 var clent = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]); // 增加登录日志 await Event.EmitAsync("Log:CreateVisLog", new LogEventBridgeCrInput { tenantId = tenantId, tenantDbName = tenantDbName, entity = new SysLogEntity { Id = YitIdHelper.NextId().ToString(), UserId = user.Id, UserName = user.RealName, Category = 1, IPAddress = ip, Abstracts = "登录成功", PlatForm = clent.String, CreatorTime = DateTime.Now } }); return new LoginOutput() { theme = user.Theme == null ? "classic" : user.Theme, token = "Bearer " + accessToken }; } /// /// 小程序用户登录 /// /// 登录输入参数 /// [HttpPost("AppleteLogin")] [AllowAnonymous] [Consumes("application/x-www-form-urlencoded")] public async Task AppleteLogin([FromForm] AppleteLoginInput input) { if (input == null || input.code.IsNullOrEmpty()) throw NCCException.Oh("访问异常!"); //var dd = App.GetConfig("PaymentSettings", true); var appuser = new AppleteHelper().GetUserOpenIdForCode(input.code); if (appuser == null || appuser.openid.IsNullOrEmpty()) throw NCCException.Oh("用户信息拉取失败!"); string tenantDbName = App.Configuration["ConnectionStrings:DBName"]; string tenantId = App.Configuration["ConnectionStrings:ConfigId"]; string tenantAccout = string.Empty; var user = await _userRepository.Entities.FirstAsync(o => (o.OpenId == appuser.OpenId || o.Account == appuser.OpenId) && (o.DeleteMark != 1 || o.DeleteMark == null)); if (user == null) { //注册 UserEntity adduser = new UserEntity { Account = appuser.OpenId, NickName = input.nickName, RealName = input.nickName, HeadIcon = input.HeadIcon, Password = "99999999", OpenId = appuser.openid, IsAdministrator = 0, OrganizeId = "274772725216576773" //小程序用户 }; var isExist = await _userRepository.AnyAsync(u => u.Account == adduser.Account && u.DeleteMark == null); if (isExist) throw NCCException.Oh(ErrorCode.D1003); var entity = adduser.Adapt(); #region 用户表单 entity.IsAdministrator = 0; entity.EntryDate = DateTime.Now; entity.Birthday = DateTime.Now; entity.Secretkey = Guid.NewGuid().ToString(); entity.Password = MD5Encryption.Encrypt(MD5Encryption.Encrypt(entity.Password ?? CommonConst.DEFAULT_PASSWORD) + entity.Secretkey); entity.EnabledMark = 1; #endregion //新增用户记录 user = await _userRepository.Context.Insertable(entity).CallEntityMethod(m => m.Creator()).ExecuteReturnEntityAsync(); } //登录成功时 判断单点登录信息 //token过期时间 var tokenTimeout = await _sysConfigService.GetInfo("SysConfig", "tokentimeout"); var accessToken = string.Empty; // 生成Token令牌 if (KeyVariable.MultiTenancy) { accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.CLAINM_USERID, user.Id }, { ClaimConst.CLAINM_ACCOUNT, user.Account }, { ClaimConst.CLAINM_REALNAME, user.RealName }, { ClaimConst.CLAINM_ADMINISTRATOR, user.IsAdministrator }, { ClaimConst.TENANT_ID, tenantId }, { ClaimConst.TENANT_DB_NAME, tenantDbName } }, long.Parse(tokenTimeout.Value)); } else { accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.CLAINM_USERID, user.Id }, { ClaimConst.CLAINM_ACCOUNT, user.Account }, { ClaimConst.CLAINM_REALNAME, user.RealName }, { ClaimConst.CLAINM_ADMINISTRATOR, user.IsAdministrator }, { ClaimConst.TENANT_ID, tenantId }, { ClaimConst.TENANT_DB_NAME, tenantDbName } }, long.Parse(tokenTimeout.Value)); } var httpContext = _httpContextAccessor.HttpContext; // 设置Swagger自动登录 //httpContext.SigninToSwagger(accessToken); // 生成刷新Token令牌 var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, 30); // 设置刷新Token令牌 httpContext.Response.Headers["x-access-token"] = refreshToken; var ip = httpContext.GetRemoteIpAddressToIPv4(); // 修改用户登录信息 await Event.EmitAsync("User:UpdateUserLoginInfo", new UserEventDealWithInput { tenantId = tenantId, tenantDbName = tenantDbName, entity = new UserEntity() { Id = user.Id, FirstLogIP = user.FirstLogIP ?? ip, FirstLogTime = user.FirstLogTime ?? DateTime.Now, PrevLogTime = user.LastLogTime, PrevLogIP = user.LastLogIP, LastLogTime = DateTime.Now, LastLogIP = ip, LogSuccessCount = user.LogSuccessCount + 1 } }); //登录时间 var clent = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]); // 增加登录日志 await Event.EmitAsync("Log:CreateVisLog", new LogEventBridgeCrInput { tenantId = tenantId, tenantDbName = tenantDbName, entity = new SysLogEntity { Id = YitIdHelper.NextId().ToString(), UserId = user.Id, UserName = user.RealName, Category = 1, IPAddress = ip, Abstracts = "登录成功", PlatForm = clent.String, CreatorTime = DateTime.Now } }); return new LoginOutput() { theme = user.Theme == null ? "classic" : user.Theme, token = "Bearer " + accessToken, user = new { id = user.Id, openid = user.OpenId, realname = user.RealName, headicon = user.HeadIcon } }; } /// /// 系统信息获取 /// /// [HttpPost("SystemInfo")] [AllowAnonymous] public object SystemInfo() { return new { //httpUrl = "http://disk.fengshiyun.com/api", httpUrl = "http://localhost:8061/api", Version = "1.0.1" }; } [HttpPost("PisLogin")] [AllowAnonymous] [Consumes("application/x-www-form-urlencoded")] public async Task PisLogin([FromForm] PisLoginInput input) { string tenantDbName = App.Configuration["ConnectionStrings:DBName"]; string tenantId = App.Configuration["ConnectionStrings:ConfigId"]; string tenantAccout = string.Empty; if (KeyVariable.MultiTenancy) { //分割账号 var tenantAccount = input.account.Split('@'); tenantId = tenantAccount.FirstOrDefault(); if (tenantAccount.Length == 1) input.account = "admin"; else input.account = tenantAccount[1]; tenantAccout = input.account; var interFace = App.Configuration["NCC_App:MultiTenancyDBInterFace"] + tenantId; var response = await interFace.GetAsStringAsync(); var data = JSON.Deserialize>(response); if (data == null) throw NCCException.Oh(ErrorCode.D1024); else if (data.data == null) throw NCCException.Oh(ErrorCode.D1023); else tenantDbName = data.data.dotnet; _tenant.AddConnection(new ConnectionConfig() { DbType = (DbType)Enum.Parse(typeof(DbType), App.Configuration["ConnectionStrings:DBType"]), ConfigId = tenantId,//设置库的唯一标识 IsAutoCloseConnection = true, ConnectionString = string.Format($"{App.Configuration["ConnectionStrings:DefaultConnection"]}", tenantDbName) }); _tenant.ChangeDatabase(tenantId); } //根据用户账号获取用户秘钥 var user = await _userService.GetInfoByAccount(input.account); _ = user ?? throw NCCException.Oh(ErrorCode.D5002); bool isMoble = false; if (input.account == user.MobilePhone) isMoble = true; //获取加密后的密码 // var encryptPasswod = MD5Encryption.Encrypt(input.password + user.Secretkey); //var userAnyPwd = await _userService.GetInfoByLogin(input.account, encryptPasswod, isMoble); //_ = userAnyPwd ?? throw NCCException.Oh(ErrorCode.D1000); // 验证账号是否未被激活 if (user.EnabledMark == null) throw NCCException.Oh(ErrorCode.D1018); // 验证账号是否被禁用 if (user.EnabledMark == 0) throw NCCException.Oh(ErrorCode.D1019); // 验证账号是否被删除 if (user.DeleteMark == 1) throw NCCException.Oh(ErrorCode.D1017); // app权限验证 if (NetUtil.isMobileBrowser && user.IsAdministrator == 0 && !ExistRoleByApp(user.RoleId)) throw NCCException.Oh(ErrorCode.D1022); //登录成功时 判断单点登录信息 //token过期时间 var tokenTimeout = await _sysConfigService.GetInfo("SysConfig", "tokentimeout"); var accessToken = string.Empty; // 生成Token令牌 if (KeyVariable.MultiTenancy) { //accessToken = JWTEncryption.Encrypt(new Dictionary //{ // { ClaimConst.CLAINM_USERID, userAnyPwd.Id }, // { ClaimConst.CLAINM_ACCOUNT, userAnyPwd.Account }, // { ClaimConst.CLAINM_REALNAME, userAnyPwd.RealName }, // { ClaimConst.CLAINM_ADMINISTRATOR, userAnyPwd.IsAdministrator }, // { ClaimConst.TENANT_ID, tenantId }, // { ClaimConst.TENANT_DB_NAME, tenantDbName } //}, long.Parse(tokenTimeout.Value)); } else { accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.CLAINM_USERID, user.Id }, { ClaimConst.CLAINM_ACCOUNT, input.account }, { ClaimConst.CLAINM_REALNAME, user.RealName }, { ClaimConst.CLAINM_ADMINISTRATOR, 0 }, { ClaimConst.TENANT_ID, tenantId }, { ClaimConst.TENANT_DB_NAME, tenantDbName } }, long.Parse(tokenTimeout.Value)); } var httpContext = _httpContextAccessor.HttpContext; // 设置Swagger自动登录 httpContext.SigninToSwagger(accessToken); // 生成刷新Token令牌 var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, 30); // 设置刷新Token令牌 httpContext.Response.Headers["x-access-token"] = refreshToken; var ip = httpContext.GetRemoteIpAddressToIPv4(); // 修改用户登录信息 await Event.EmitAsync("User:UpdateUserLoginInfo", new UserEventDealWithInput { tenantId = tenantId, tenantDbName = tenantDbName, entity = new UserEntity() { Id = user.Id, FirstLogIP = user.FirstLogIP ?? ip, FirstLogTime = user.FirstLogTime ?? DateTime.Now, PrevLogTime = user.LastLogTime, PrevLogIP = user.LastLogIP, LastLogTime = DateTime.Now, LastLogIP = ip, Description = input.hospitalname, LogSuccessCount = user.LogSuccessCount + 1 } }); ; //登录时间 var clent = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]); // 增加登录日志 await Event.EmitAsync("Log:CreateVisLog", new LogEventBridgeCrInput { tenantId = tenantId, tenantDbName = tenantDbName, entity = new SysLogEntity { Id = YitIdHelper.NextId().ToString(), UserId = user.Id, UserName = user.RealName, Category = 1, IPAddress = ip, Abstracts = "登录成功", PlatForm = clent.String, CreatorTime = DateTime.Now } }); return new LoginOutput() { theme = user.Theme == null ? "classic" : user.Theme, token = "Bearer " + accessToken }; } /// /// 锁屏解锁登录 /// /// 登录输入参数 /// [HttpPost("LockScreen")] public async Task LockScreen([Required] LoginInput input) { var users = await _userService.GetInfoByAccount(input.account); _ = users ?? throw NCCException.Oh(ErrorCode.D5002); //根据用户账号获取用户秘钥 var secretkey = (await _userService.GetInfoByAccount(input.account)).Secretkey; //获取加密后的密码 var encryptPasswod = MD5Encryption.Encrypt(input.password + secretkey); bool isMoble = false; if (input.account == users.MobilePhone) isMoble = true; var user = await _userService.GetInfoByLogin(input.account, encryptPasswod, isMoble); _ = user ?? throw NCCException.Oh(ErrorCode.D1000); } /// /// 获取当前登录用户信息 /// /// [HttpGet("CurrentUser")] public async Task GetCurrentUser() { var user = await _userManager.GetUserInfo(); var userId = user.userId; var userContext = App.User; var httpContext = _httpContextAccessor.HttpContext; var tenantId = userContext?.FindFirstValue(ClaimConst.TENANT_ID); var tenantDbName = userContext?.FindFirstValue(ClaimConst.TENANT_DB_NAME); var loginOutput = new CurrentUserOutput(); loginOutput.userInfo = user; //菜单 loginOutput.menuList = await _moduleService.GetUserTreeModuleList(_userManager.IsAdministrator, userId); var currentUserModel = new CurrentUserModelOutput(); currentUserModel.moduleList = await _moduleService.GetUserModueList(_userManager.IsAdministrator, userId); currentUserModel.buttonList = await _moduleButtonService.GetUserModuleButtonList(_userManager.IsAdministrator, userId); currentUserModel.columnList = await _columnService.GetUserModuleColumnList(_userManager.IsAdministrator, userId); currentUserModel.formList = await _formService.GetUserModuleFormList(_userManager.IsAdministrator, userId); currentUserModel.resourceList = await _moduleDataAuthorizeSchemeService.GetResourceList(_userManager.IsAdministrator, userId); //权限信息 var permissionList = new List(); currentUserModel.moduleList.ForEach(menu => { var permissionModel = new PermissionModel(); permissionModel.modelId = menu.id; permissionModel.moduleName = menu.fullName; permissionModel.button = currentUserModel.buttonList.FindAll(t => t.moduleId.Equals(menu.id)).Adapt>(); permissionModel.column = currentUserModel.columnList.FindAll(t => t.moduleId.Equals(menu.id)).Adapt>(); permissionModel.form = currentUserModel.formList.FindAll(t => t.moduleId.Equals(menu.id)).Adapt>(); permissionModel.resource = currentUserModel.resourceList.FindAll(t => t.moduleId.Equals(menu.id)).Adapt>(); permissionList.Add(permissionModel); }); //await _sysCacheService.SetAsync(CommonConst.CACHE_KEY_PERMISSION + ""); loginOutput.permissionList = permissionList; return loginOutput; } /// /// 获取当前登录用户信息(简单信息) /// /// [HttpGet("GetSimpleCurrentUser")] public async Task GetSimpleCurrentUser() { var user = await _userManager.GetUserInfo(); //var userId = user.userId; //var userContext = App.User; //var httpContext = _httpContextAccessor.HttpContext; var loginOutput = new CurrentUserOutput(); loginOutput.userInfo = user; return loginOutput; } /// /// 退出 /// /// [HttpGet("Logout")] public async Task Logout() { var httpContext = _httpContextAccessor.HttpContext; httpContext.SignoutToSwagger(); var user = _userManager.User; await _sysCacheService.DelUserInfo(_userManager.TenantId + "_" + user.Id); var clent = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]); var userContext = App.User; var tenantId = userContext?.FindFirstValue(ClaimConst.TENANT_ID); var tenantDbName = userContext?.FindFirstValue(ClaimConst.TENANT_DB_NAME); //清除IM中的webSocket //var list = _sysCacheService.GetOnlineUserList(tenantId); //var onlineUser = list.Find(it => it.tenantId == tenantId && it.userId == user.Id); //list.RemoveAll((x) => x.connectionId == onlineUser.connectionId); //_sysCacheService.SetOnlineUserList(tenantId, list); //// 增加退出日记 //Event.Emit("Log:CreateVisLog", new LogEventBridgeCrInput //{ // tenantId = tenantId, // tenantDbName = tenantDbName, // entity = new SysLogEntity // { // Id = YitIdHelper.NextId().ToString(), // UserId = user.Id, // UserName = user.RealName, // Category = 1, // IPAddress = httpContext.GetRemoteIpAddressToIPv4(), // Abstracts = "退出成功", // PlatForm = clent.String, // CreatorTime = DateTime.Now // } //}); } #region PrivateMethod /// /// 判断app用户角色是否存在且有效 /// /// /// private bool ExistRoleByApp(string roleIds) { if (roleIds.IsEmpty()) { return false; } var roleIdList1 = roleIds.Split(",").ToList(); var roleIdList2 = _db.Queryable().Where(x => x.DeleteMark == null && x.EnabledMark == 1).Select(x => x.Id).ToList(); return roleIdList1.Intersect(roleIdList2).ToList().Count > 0; } /// /// 短信 /// /// /// /// private void SmsSend(string code, string mobile, SysConfigOutput sysconfig) { var telList = new List(); var smsModel = new SmsModel() { keyId = sysconfig.smsKeyId, keySecret = sysconfig.smsKeySecret, signName = sysconfig.smsSignName, appId = sysconfig.smsAppId, templateId = sysconfig.smsTemplateId, region = "ap-guangzhou", mobileAli = mobile, mobileTx = null, templateParamAli = "{\"code\":\"" + code + "\"}", templateParamTx = new string[] { "12345" } }; if (sysconfig.smsCompany.Equals("2")) { Sms.SendSmsByTencent(smsModel); } else { Sms.SendSmsByAli(smsModel); } } /// /// 获取随机6位数字 /// /// private int getKey() { Random rd = new Random(); int key = (int)(rd.NextDouble() * 999999); return key; } #endregion } }