| | |
| | | using System.Net; |
| | | using WIDESEAWCS_Core.Caches; |
| | | using WIDESEA_ISerialPortRepository; |
| | | using Microsoft.AspNetCore.Http; |
| | | using SqlSugar; |
| | | using ICacheService = WIDESEAWCS_Core.Caches.ICacheService; |
| | | using Microsoft.AspNetCore.Builder; |
| | | using WIDESEAWCS_DTO.SerialPort; |
| | | using WIDESEAWCS_DTO.Telescopic; |
| | | using WIDESEAWCS_Common; |
| | | using Newtonsoft.Json; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; |
| | | |
| | | namespace WIDESEAWCS_SystemServices |
| | | { |
| | |
| | | private readonly ISys_RoleRepository _RoleRepository; |
| | | private readonly ILoginHistoryRepository _loginHistoryRepository; |
| | | private readonly IPutakeRepository _putakeRepository; |
| | | private readonly IFaceRecognitionRepository _faceRecognitionRepository; |
| | | |
| | | public Sys_UserService(ISys_UserRepository repository, IUnitOfWorkManage unitOfWorkManage, |
| | | ICacheService cacheService, ISys_MenuService menuService , ISys_RoleRepository roleRepository, ILoginHistoryRepository loginHistoryRepository, IPutakeRepository putakeRepository) : base(repository) |
| | | |
| | | |
| | | public Sys_UserService(IFaceRecognitionRepository faceRecognitionRepository, ISys_UserRepository repository, IUnitOfWorkManage unitOfWorkManage, |
| | | ICacheService cacheService, ISys_MenuService menuService, ISys_RoleRepository roleRepository, ILoginHistoryRepository loginHistoryRepository, IPutakeRepository putakeRepository) : base(repository) |
| | | { |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _cacheService = cacheService; |
| | | _menuService = menuService; |
| | | _RoleRepository = roleRepository; |
| | | _RoleRepository= roleRepository; |
| | | _RoleRepository = roleRepository; |
| | | _loginHistoryRepository = loginHistoryRepository; |
| | | _putakeRepository = putakeRepository; |
| | | _faceRecognitionRepository = faceRecognitionRepository; |
| | | |
| | | } |
| | | |
| | | public WebResponseContent Login(LoginInfo loginInfo) |
| | |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | //BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName); |
| | | // BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName); |
| | | |
| | | string msg = string.Empty; |
| | | |
| | |
| | | |
| | | } |
| | | #endregion |
| | | |
| | | UserInfo user = BaseDal.GetUserInfo(loginInfo.UserName, loginInfo.Password); |
| | | var disbled = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);//æ ¹æ®è¿ä¸ªç¨æ·åæ¥æ¥çç¨æ· |
| | | if (user != null) |
| | | if (!string.IsNullOrEmpty(loginInfo.path)) |
| | | { |
| | | object obj = _menuService.GetMenuActionList(user.RoleId); |
| | | if (obj is not IEnumerable<object> list) |
| | | var faceResult = BaiDuFaceHelper.FaceSearch(loginInfo.path); |
| | | |
| | | if (faceResult != null && faceResult.error_code == 0) |
| | | { |
| | | return WebResponseContent.Instance.Error("æ ç»å½æé"); |
| | | } |
| | | if (!list.Any()) |
| | | { |
| | | return WebResponseContent.Instance.Error("æ ç»å½æé"); |
| | | } |
| | | if (disbled.Enable!=1) |
| | | { |
| | | return WebResponseContent.Instance.Error("ä½ çè´¦å·å·²è¢«ç¦ç¨ï¼è¯·è系管çå"); |
| | | // è·åæé«å¹é
度çç¨æ· |
| | | var bestMatch = faceResult.result.user_list.OrderByDescending(u => u.score).FirstOrDefault();//æ¿ç¬¬ä¸ä¸ªæé«ç |
| | | |
| | | if (bestMatch != null && double.TryParse(bestMatch.score, out double score) && score > 80) // 设å®80å为å¯ä¿¡åº¦éå¼ |
| | | { |
| | | return new WebResponseContent { Data = true }; |
| | | } |
| | | } |
| | | |
| | | string token = JwtHelper.IssueJwt(new TokenModelJwt() |
| | | { |
| | | UserId = user.UserId, |
| | | RoleId = user.RoleId, |
| | | UserName = user.UserName, |
| | | TenantId = user.TenantId, |
| | | }); |
| | | var loghis = new Dt_LoginHistory |
| | | { |
| | | Account = user.UserName, |
| | | TrurName=user.UserTrueName, |
| | | CreateDate=DateTime.Now |
| | | |
| | | |
| | | |
| | | }; |
| | | |
| | | |
| | | _cacheService.AddOrUpdate(user.UserId.ToString(), token); |
| | | _loginHistoryRepository.AddData(loghis); |
| | | |
| | | content = WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl,ID=user.UserId }); |
| | | return WebResponseContent.Instance.Error("人è¸è¯å«å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | else |
| | | { |
| | | content = WebResponseContent.Instance.Error("è´¦å·æå¯ç é误"); |
| | | UserInfo user = BaseDal.GetUserInfo(loginInfo.UserName, loginInfo.Password); |
| | | var disbled = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);//æ ¹æ®è¿ä¸ªç¨æ·åæ¥æ¥çç¨æ· |
| | | if (user != null) |
| | | { |
| | | object obj = _menuService.GetMenuActionList(user.RoleId); |
| | | if (obj is not IEnumerable<object> list) |
| | | { |
| | | return WebResponseContent.Instance.Error("æ ç»å½æé"); |
| | | } |
| | | if (!list.Any()) |
| | | { |
| | | return WebResponseContent.Instance.Error("æ ç»å½æé"); |
| | | } |
| | | if (disbled.Enable != 1) |
| | | { |
| | | return WebResponseContent.Instance.Error("ä½ çè´¦å·å·²è¢«ç¦ç¨ï¼è¯·è系管çå"); |
| | | } |
| | | |
| | | string token = JwtHelper.IssueJwt(new TokenModelJwt() |
| | | { |
| | | UserId = user.UserId, |
| | | RoleId = user.RoleId, |
| | | UserName = user.UserName, |
| | | TenantId = user.TenantId, |
| | | }); |
| | | var loghis = new Dt_LoginHistory |
| | | { |
| | | Account = user.UserName, |
| | | TrurName = user.UserTrueName, |
| | | CreateDate = DateTime.Now |
| | | |
| | | }; |
| | | |
| | | |
| | | _cacheService.AddOrUpdate(user.UserId.ToString(), token); |
| | | _loginHistoryRepository.AddData(loghis); |
| | | |
| | | content = WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl, ID = user.UserId, RoleId = user.RoleId }); |
| | | } |
| | | else |
| | | { |
| | | content = WebResponseContent.Instance.Error("è´¦å·æå¯ç é误"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error(ex.Message); |
| | |
| | | if (newPwd.Length < 6) return WebResponseContent.Instance.Error("å¯ç ä¸è½å°äº6ä½"); |
| | | |
| | | int userId = App.User.UserId; |
| | | |
| | | string userCurrentPwd = BaseDal.QueryFirst(x => x.User_Id == userId, s => s.UserPwd); |
| | | |
| | | string _oldPwd = oldPwd.EncryptDES(AppSecret.User); |
| | |
| | | nameof(Sys_User.LastModifyPwdDate), |
| | | nameof(Sys_User.UserPwd) |
| | | }); |
| | | |
| | | content = WebResponseContent.Instance.OK("å¯ç ä¿®æ¹æå"); |
| | | //content = WebResponseContent.Instance.OK("å¯ç ä¿®æ¹æå"); |
| | | content = WebResponseContent.Instance.OK("å¯ç ä¿®æ¹æå", userId); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | content = WebResponseContent.Instance.Error("æå¡å¨äºç¹é®é¢,请ç¨ååè¯"); |
| | | } |
| | | return content; |
| | | |
| | | } |
| | | |
| | | public WebResponseContent GetUerType() |
| | |
| | | { |
| | | |
| | | |
| | | return new WebResponseContent { Status = false, Message="失败"+ex }; |
| | | return new WebResponseContent { Status = false, Message = "失败" + ex }; |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// å¾çæä»¶å |
| | | /// </summary> |
| | | /// <param name="files"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent SaveFiles(IFormCollection files) |
| | | { |
| | | if (files == null || files.Files.Count == 0) |
| | | return new WebResponseContent { Status = false, Message = "请ä¸ä¼ æä»¶" }; |
| | | |
| | | // 1. ç¡®ä¿åå¨ç®å½åå¨ |
| | | string baseDirectory = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "image"); |
| | | if (!Directory.Exists(baseDirectory)) |
| | | Directory.CreateDirectory(baseDirectory); |
| | | |
| | | try |
| | | { |
| | | var file = files.Files[0]; // åªå¤ç第ä¸ä¸ªæä»¶ |
| | | string fileName = file.FileName; // ç´æ¥ä½¿ç¨å端çæä»¶å |
| | | |
| | | string fullFilePath = Path.Combine(baseDirectory, fileName); |
| | | |
| | | // 2. ä¿åæä»¶ï¼å¦æåå¨ï¼åè¦çï¼ |
| | | using (var stream = new FileStream(fullFilePath, FileMode.Create)) |
| | | { |
| | | file.CopyTo(stream); |
| | | } |
| | | |
| | | // 3. è¿åæä»¶å |
| | | return new WebResponseContent { Status = true, Message = "æä»¶ä¸ä¼ æå", Data = fileName }; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return new WebResponseContent { Status = false, Message = "ä¸ä¼ æä»¶å¤±è´¥ï¼" + ex.Message }; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ´æ°å¯ç |
| | | /// </summary> |
| | | /// <param name="id"></param> |
| | | /// <param name="oldPwd"></param> |
| | | /// <param name="newPwd"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent UpdatePwd(int id, string oldPwd, string newPwd) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | oldPwd = oldPwd?.Trim(); |
| | | newPwd = newPwd?.Trim(); |
| | | |
| | | try |
| | | { |
| | | if (string.IsNullOrEmpty(oldPwd)) return content.Error("æ§å¯ç ä¸è½ä¸ºç©º"); |
| | | if (string.IsNullOrEmpty(newPwd)) return content.Error("æ°å¯ç ä¸è½ä¸ºç©º"); |
| | | if (newPwd.Length < 6) return content.Error("å¯ç ä¸è½å°äº6ä½"); |
| | | |
| | | // è·åç¨æ·å½åå¯ç |
| | | string userCurrentPwd = BaseDal.QueryFirst(x => x.User_Id == id, s => s.UserPwd) ?? ""; |
| | | |
| | | if (string.IsNullOrEmpty(userCurrentPwd)) return content.Error("ç¨æ·ä¸å卿å¯ç æªè®¾ç½®"); |
| | | |
| | | //// è¿è¡å¯ç å å¯å¯¹æ¯ |
| | | //string _oldPwd = oldPwd.EncryptDES(AppSecret.User); |
| | | //if (_oldPwd != userCurrentPwd) return content.Error("æ§å¯ç 䏿£ç¡®"); |
| | | |
| | | // çææ°å¯ç å å¯å¼ |
| | | string _newPwd = newPwd.EncryptDES(AppSecret.User); |
| | | if (userCurrentPwd == _newPwd) return content.Error("æ°å¯ç ä¸è½ä¸æ§å¯ç ç¸å"); |
| | | |
| | | // æ´æ°å¯ç |
| | | bool isUpdated = BaseDal.UpdateData(new Sys_User |
| | | { |
| | | User_Id = id, |
| | | UserPwd = _newPwd, |
| | | LastModifyPwdDate = DateTime.Now |
| | | }, new List<string> |
| | | { |
| | | nameof(Sys_User.LastModifyPwdDate), |
| | | nameof(Sys_User.UserPwd) |
| | | }); |
| | | |
| | | if (!isUpdated) |
| | | { |
| | | return content.Error("å¯ç ä¿®æ¹å¤±è´¥ï¼è¯·ç¨åéè¯"); |
| | | } |
| | | |
| | | return content.OK("å¯ç ä¿®æ¹æå", id); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"ä¿®æ¹å¯ç å¼å¸¸: {ex.Message}"); |
| | | return content.Error($"æå¡å¨é误: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | public WebResponseContent Upuserbase(UserDTO userDTO) |
| | | { |
| | | try |
| | | { |
| | | var user = BaseDal.QueryData(x => x.User_Id == userDTO.id).FirstOrDefault(); |
| | | if (user == null) |
| | | { |
| | | return new WebResponseContent { Status = false, Message = "没æ¾å°è¯¥ç¨æ·" }; |
| | | } |
| | | user.UserTrueName = userDTO.usertruename; |
| | | user.PhoneNo = userDTO.phone; |
| | | user.HeadImageUrl = userDTO.files; |
| | | BaseDal.UpdateData(user); // ç¡®ä¿æ´æ°å°æ°æ®åº |
| | | return new WebResponseContent { Status = true, Data = user }; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | return new WebResponseContent { Status = false, Message = "失败ï¼" + ex }; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¥çç¨æ·ä¿¡æ¯å人è¸è¯å«è¡¨ |
| | | /// </summary> |
| | | /// <param name="paginationDTO"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent GetUserFace(PaginationDTO paginationDTO) |
| | | { |
| | | try |
| | | { |
| | | int totalCount = 0; |
| | | var sys = Db.Queryable<Sys_User>(); |
| | | var face = _faceRecognitionRepository.Db.Queryable<Dt_FaceRecognition>(); |
| | | |
| | | if (face == null) |
| | | { |
| | | return new WebResponseContent { Status = false, Message = "æ°æ®ä¸ºç©º" }; |
| | | } |
| | | |
| | | var query = sys.LeftJoin<Dt_FaceRecognition>((a, b) => a.Log_id == b.GroupID); |
| | | if (!string.IsNullOrEmpty(paginationDTO.searchKeyword)) |
| | | { |
| | | query = query.Where((a, b) => |
| | | a.UserName.Contains(paginationDTO.searchKeyword) || |
| | | a.UserTrueName.Contains(paginationDTO.searchKeyword) || |
| | | a.PhoneNo.Contains(paginationDTO.searchKeyword) || |
| | | a.RoleName.Contains(paginationDTO.searchKeyword) || |
| | | a.Role_Id.ToString().Contains(paginationDTO.searchKeyword) |
| | | ); |
| | | } |
| | | if (paginationDTO.startDate.HasValue && paginationDTO.endDate.HasValue) |
| | | { |
| | | query = query.Where((a, b) => a.CreateDate >= paginationDTO.startDate && a.CreateDate <= paginationDTO.endDate); |
| | | } |
| | | |
| | | var result = query.Select((a, b) => new |
| | | { |
| | | a.UserPwd, |
| | | a.Log_id, |
| | | a.User_Id, |
| | | a.UserName, |
| | | a.UserTrueName, |
| | | a.PhoneNo, |
| | | a.Role_Id, |
| | | a.RoleName, |
| | | a.HeadImageUrl, |
| | | a.Enable, |
| | | a.CreateDate, |
| | | a.Face_token, |
| | | b.GroupID, |
| | | }).ToPageList(paginationDTO.pageIndex, paginationDTO.pageSize, ref totalCount); |
| | | return new WebResponseContent |
| | | { |
| | | Status = true, |
| | | Data = new |
| | | { |
| | | TotalCount = totalCount,//æ»æ° |
| | | PageIndex = paginationDTO.pageIndex,//é¡µæ° |
| | | PaseSize = paginationDTO.pageSize,//ä¸é¡µå¤å°æ°æ® |
| | | Items = result//è¿ååæ®µ |
| | | } |
| | | |
| | | }; |
| | | |
| | | } |
| | | catch (Exception) |
| | | { |
| | | |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ·»å ç¨æ· |
| | | /// </summary> |
| | | /// <param name="addUserDTO"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent AdduserData(AddUserDTO addUserDTO) |
| | | { |
| | | try |
| | | { |
| | | if (addUserDTO == null) |
| | | { |
| | | return new WebResponseContent { Status = false, Message = "è¯·æ±æ°æ®ä¸ºç©ºï¼å¯è½æ¯ JSON è§£æå¤±è´¥" }; |
| | | } |
| | | |
| | | var face = _faceRecognitionRepository.QueryData().Select(x => x.GroupID).FirstOrDefault(); ; |
| | | var baiduResult = BaiDuFaceHelper.AddUser(new BDUserInfo |
| | | { |
| | | ImgPath = addUserDTO.path, |
| | | user_id = addUserDTO.username, |
| | | group_id = face // è¿éåºè¯¥å¡«ç¾åº¦äººè¸åºåç» |
| | | // group_id = baiduResult.result.log_id |
| | | }); |
| | | |
| | | |
| | | // 夿ç¾åº¦è¿åæ¯å¦æå |
| | | if (baiduResult == null || baiduResult.error_code != 0) |
| | | { |
| | | return new WebResponseContent { Status = false, Data = "äººè¸æ³¨å失败ï¼" + baiduResult.error_msg }; |
| | | |
| | | |
| | | } |
| | | |
| | | // åå»ºç¨æ·æ°æ® |
| | | var sys = new Sys_User |
| | | { |
| | | UserName = addUserDTO.username, |
| | | UserTrueName=addUserDTO.usertruename, |
| | | HeadImageUrl=addUserDTO.path, |
| | | Log_id = face, |
| | | Face_token = baiduResult.result.face_token, |
| | | PhoneNo = addUserDTO.phoneno, |
| | | Role_Id = addUserDTO.roleid, |
| | | RoleName = addUserDTO.rolename, |
| | | Enable = addUserDTO.enable, |
| | | UserPwd= "j79rYYvCz4vdhcboB1Ausg==", |
| | | CreateDate=DateTime.Now |
| | | }; |
| | | BaseDal.AddData(sys); |
| | | return new WebResponseContent { Status = true, Data = sys }; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | return new WebResponseContent { Status = false, Message = "失败" + ex }; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ´æ°ç¨æ· |
| | | /// </summary> |
| | | /// <param name="addUserDTO"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent UpuserData(AddUserDTO addUserDTO) |
| | | { |
| | | try |
| | | { |
| | | var sys = BaseDal.QueryData(x => x.User_Id == addUserDTO.id).FirstOrDefault(); |
| | | |
| | | if (sys == null) |
| | | { |
| | | return new WebResponseContent { Status = false, Message = "没æ¾å°è¯¥ç¨æ·" }; |
| | | } |
| | | var face = _faceRecognitionRepository.QueryData().Select(x => x.GroupID).FirstOrDefault(); |
| | | // 夿æ¯å¦éè¦æ´æ°äººè¸å¾ç |
| | | string faceToken = null; |
| | | if (!string.IsNullOrEmpty(addUserDTO.path)) // å¦æä¼ äºå¾çè·¯å¾ï¼ææ´æ°äººè¸ä¿¡æ¯ |
| | | { |
| | | var baiduResult = BaiDuFaceHelper.AddUser(new BDUserInfo |
| | | { |
| | | ImgPath = addUserDTO.path, |
| | | user_id = addUserDTO.username, |
| | | group_id = face // è¿éåºè¯¥å¡«ç¾åº¦äººè¸åºåç» |
| | | }); |
| | | |
| | | // 夿ç¾åº¦è¿åæ¯å¦æå |
| | | if (baiduResult == null || baiduResult.error_code != 0) |
| | | { |
| | | return new WebResponseContent { Status = false, Data = "人è¸ä»¥åå¨ï¼ä¸è¦éå¤ä¸ä¼ ï¼" + baiduResult.error_msg }; |
| | | } |
| | | // è·åæ´æ°åç Face_token |
| | | faceToken = baiduResult.result.face_token; |
| | | } |
| | | |
| | | // æ¥è¯¢ç°æç¨æ· |
| | | |
| | | |
| | | // æ´æ°æ¥è¯¢å°çç¨æ·æ°æ® |
| | | sys.UserName = addUserDTO.username; |
| | | sys.UserTrueName = addUserDTO.usertruename; |
| | | sys.HeadImageUrl = addUserDTO.path; // æ´æ°å¤´åè·¯å¾ï¼å¦æææ°è·¯å¾ï¼ |
| | | sys.Log_id = face; |
| | | //sys.Face_token = faceToken ?? addUserDTO.face_token; // å¦ææ²¡ææ´æ°å¾çï¼ä¿æåæ Face_token |
| | | sys.Face_token = faceToken; // å¦ææ²¡ææ´æ°å¾çï¼ä¿æåæ Face_token |
| | | sys.PhoneNo = addUserDTO.phoneno; |
| | | sys.Role_Id = addUserDTO.roleid; |
| | | sys.RoleName = addUserDTO.rolename; |
| | | sys.Enable = addUserDTO.enable; |
| | | |
| | | // æ´æ°æ°æ®åº |
| | | BaseDal.UpdateData(sys); |
| | | |
| | | return new WebResponseContent { Status = true, Data = sys }; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return new WebResponseContent { Status = false, Message = "失败ï¼" + ex.Message }; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å é¤ |
| | | /// </summary> |
| | | /// <param name="deleteUserDTO"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent DeleteUserData(DeleteUserImg deleteUserDTO) |
| | | { |
| | | try |
| | | { |
| | | |
| | | string apiResult = BaiDuFaceHelper.DeleteUser(deleteUserDTO);//åªè¦ç»tokenålog_id |
| | | |
| | | // 2. è§£æè¿åç»æï¼å¤æå 餿¯å¦æå |
| | | dynamic resultObj = JsonConvert.DeserializeObject(apiResult); |
| | | if (resultObj.error_code == 0) |
| | | { |
| | | // ç¾åº¦å 餿ååï¼å 餿°æ®åºä¸çç¨æ· |
| | | var user = BaseDal.QueryData(deleteUserDTO.user_id); |
| | | if (user != null) |
| | | { |
| | | BaseDal.DeleteData(user); |
| | | } |
| | | return WebResponseContent.Instance.OK("ç¨æ·å 餿å"); |
| | | } |
| | | else |
| | | { |
| | | return WebResponseContent.Instance.Error("ç¾åº¦ API å é¤å¤±è´¥ï¼" + resultObj.error_msg); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error("å é¤ç¨æ·å¤±è´¥ï¼" + ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | |