From f912f0cacb24d316895ccd05a7ae0335c53ad349 Mon Sep 17 00:00:00 2001 From: Argo-MacBookPro Date: Tue, 30 Oct 2018 19:01:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81=EF=BC=9A?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8User=E7=BC=93=E5=AD=98=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=88=B0UserHelper=E7=B1=BB=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/UsersController.cs | 2 +- Bootstrap.Admin/Query/QueryUserOption.cs | 15 +++- .../MongoDbAccessManager.cs | 28 +++++-- Bootstrap.DataAccess.MongoDB/User.cs | 84 +++++++++++++++---- Bootstrap.DataAccess.SQLite/User.cs | 10 --- Bootstrap.DataAccess/Helper/UserHelper.cs | 75 ++++++++++++++--- Bootstrap.DataAccess/User.cs | 10 --- 7 files changed, 164 insertions(+), 60 deletions(-) diff --git a/Bootstrap.Admin/Controllers/Api/UsersController.cs b/Bootstrap.Admin/Controllers/Api/UsersController.cs index c96a57bc..0367244b 100644 --- a/Bootstrap.Admin/Controllers/Api/UsersController.cs +++ b/Bootstrap.Admin/Controllers/Api/UsersController.cs @@ -20,7 +20,7 @@ namespace Bootstrap.Admin.Controllers.Api /// /// [HttpGet] - public QueryData Get(QueryUserOption value) + public QueryData Get(QueryUserOption value) { return value.RetrieveData(); } diff --git a/Bootstrap.Admin/Query/QueryUserOption.cs b/Bootstrap.Admin/Query/QueryUserOption.cs index 69a98e5e..379daec7 100644 --- a/Bootstrap.Admin/Query/QueryUserOption.cs +++ b/Bootstrap.Admin/Query/QueryUserOption.cs @@ -21,7 +21,7 @@ namespace Bootstrap.Admin.Query /// /// /// - public QueryData RetrieveData() + public QueryData RetrieveData() { // int limit, int offset, string name, string price, string sort, string order var data = UserHelper.RetrieveUsers(); @@ -33,7 +33,7 @@ namespace Bootstrap.Admin.Query { data = data.Where(t => t.DisplayName.Contains(DisplayName)); } - var ret = new QueryData(); + var ret = new QueryData(); ret.total = data.Count(); switch (Sort) { @@ -55,7 +55,16 @@ namespace Bootstrap.Admin.Query default: break; } - ret.rows = data.Skip(Offset).Take(Limit); + ret.rows = data.Skip(Offset).Take(Limit).Select(u => new + { + u.Id, + u.UserName, + u.DisplayName, + u.RegisterTime, + u.ApprovedTime, + u.ApprovedBy, + u.Description + }); return ret; } } diff --git a/Bootstrap.DataAccess.MongoDB/MongoDbAccessManager.cs b/Bootstrap.DataAccess.MongoDB/MongoDbAccessManager.cs index b03a908d..75fff5aa 100644 --- a/Bootstrap.DataAccess.MongoDB/MongoDbAccessManager.cs +++ b/Bootstrap.DataAccess.MongoDB/MongoDbAccessManager.cs @@ -36,6 +36,26 @@ namespace Bootstrap.DataAccess.MongoDB return _db; } } + /// + /// + /// + public static IMongoCollection Users + { + get + { + return DBAccess.GetCollection("Users"); + } + } + /// + /// + /// + public static IMongoCollection Users + { + get + { + return DBAccess.GetCollection("Users"); + } + } private static void InitDb() { @@ -61,14 +81,6 @@ namespace Bootstrap.DataAccess.MongoDB md.IdMemberMap.SetIgnoreIfDefault(true); }); } - if (!BsonClassMap.IsClassMapRegistered(typeof(BootstrapUser))) - { - BsonClassMap.RegisterClassMap(md => - { - md.AutoMap(); - md.SetIgnoreExtraElements(true); - }); - } if (!BsonClassMap.IsClassMapRegistered(typeof(DataAccess.User))) { BsonClassMap.RegisterClassMap(md => diff --git a/Bootstrap.DataAccess.MongoDB/User.cs b/Bootstrap.DataAccess.MongoDB/User.cs index 10737aff..3e1cd7ef 100644 --- a/Bootstrap.DataAccess.MongoDB/User.cs +++ b/Bootstrap.DataAccess.MongoDB/User.cs @@ -3,6 +3,7 @@ using Longbow.Security.Cryptography; using MongoDB.Driver; using System; using System.Collections.Generic; +using System.Linq; namespace Bootstrap.DataAccess.MongoDB { @@ -11,6 +12,15 @@ namespace Bootstrap.DataAccess.MongoDB /// public class User : DataAccess.User { + /// + /// + /// + public IEnumerable Roles { get; set; } + + /// + /// + /// + public IEnumerable Groups { get; set; } /// /// /// @@ -18,8 +28,12 @@ namespace Bootstrap.DataAccess.MongoDB /// public override BootstrapUser RetrieveUserByUserName(string userName) { - var users = MongoDbAccessManager.DBAccess.GetCollection("Users"); - return users.Find(user => user.UserName == userName).FirstOrDefault(); + var project = Builders.Projection.Include(u => u.Id) + .Include(u => u.UserName) + .Include(u => u.DisplayName) + .Include(u => u.Icon) + .Include(u => u.Css); + return MongoDbAccessManager.Users.Find(user => user.UserName == userName).Project(project).FirstOrDefault(); } /// /// @@ -31,27 +45,30 @@ namespace Bootstrap.DataAccess.MongoDB { if (string.IsNullOrEmpty(userName) && string.IsNullOrEmpty(password)) return false; - var users = MongoDbAccessManager.DBAccess.GetCollection("Users"); - var u = users.Find(user => user.UserName == userName).FirstOrDefault(); + var u = MongoDbAccessManager.Users.Find(user => user.UserName == userName).FirstOrDefault(); return !string.IsNullOrEmpty(u.PassSalt) && u.Password == LgbCryptography.ComputeHash(password, u.PassSalt); } /// /// /// /// - public override IEnumerable RetrieveNewUsers() - { - var users = MongoDbAccessManager.DBAccess.GetCollection("Users"); - return users.Find(user => user.ApprovedTime == DateTime.MinValue).SortByDescending(user => user.RegisterTime).ToList(); - } + public override IEnumerable RetrieveNewUsers() => MongoDbAccessManager.Users.Find(user => user.ApprovedTime == DateTime.MinValue).SortByDescending(user => user.RegisterTime).ToList(); /// /// /// /// public override IEnumerable RetrieveUsers() { - var users = MongoDbAccessManager.DBAccess.GetCollection("Users"); - return users.Find(user => user.ApprovedTime != DateTime.MinValue).ToList(); + var project = Builders.Projection.Include(u => u.Id) + .Include(u => u.UserName) + .Include(u => u.DisplayName) + .Include(u => u.RegisterTime) + .Include(u => u.ApprovedTime) + .Include(u => u.ApprovedBy) + .Include(u => u.Description) + .Include(u => u.Groups) + .Include(u => u.Roles); + return MongoDbAccessManager.Users.Find(user => user.ApprovedTime != DateTime.MinValue).Project(project).ToList(); } /// /// @@ -60,6 +77,9 @@ namespace Bootstrap.DataAccess.MongoDB /// public override bool SaveUser(DataAccess.User user) { + // 已经存在或者已经在新用户中了 + if (UserHelper.RetrieveUserByUserName(user.UserName) != null || UserHelper.RetrieveNewUsers().Any(u => u.UserName == user.UserName)) return false; + if (user.Description.Length > 500) user.Description = user.Description.Substring(0, 500); if (user.UserName.Length > 50) user.UserName = user.UserName.Substring(0, 50); user.Id = null; @@ -68,8 +88,7 @@ namespace Bootstrap.DataAccess.MongoDB user.RegisterTime = DateTime.Now; user.ApprovedTime = DateTime.Now; user.Icon = $"{DictHelper.RetrieveIconFolderPath().Code}default.jpg"; - var users = MongoDbAccessManager.DBAccess.GetCollection("Users"); - users.InsertOne(user); + MongoDbAccessManager.Users.InsertOne(user as User); return true; } /// @@ -83,9 +102,42 @@ namespace Bootstrap.DataAccess.MongoDB { var passSalt = LgbCryptography.GenerateSalt(); var newPassword = LgbCryptography.ComputeHash(password, passSalt); - var update = Builders.Update.Set(u => u.Password, newPassword).Set(u => u.PassSalt, passSalt).Set(u => u.DisplayName, displayName); - var users = MongoDbAccessManager.DBAccess.GetCollection("Users"); - users.FindOneAndUpdate(u => u.Id == id, update); + var update = Builders.Update.Set(u => u.Password, newPassword).Set(u => u.PassSalt, passSalt).Set(u => u.DisplayName, displayName); + MongoDbAccessManager.Users.FindOneAndUpdate(u => u.Id == id, update); + return true; + } + /// + /// + /// + /// + /// + /// + /// + public override bool ChangePassword(string userName, string password, string newPass) + { + bool ret = false; + if (Authenticate(userName, password)) + { + var passSalt = LgbCryptography.GenerateSalt(); + var newPassword = LgbCryptography.ComputeHash(password, passSalt); + var update = Builders.Update.Set(u => u.Password, newPassword).Set(u => u.PassSalt, passSalt); + MongoDbAccessManager.Users.FindOneAndUpdate(u => u.UserName == UserName, update); + } + return ret; + } + /// + /// + /// + /// + /// + public override bool DeleteUser(IEnumerable value) + { + var list = new List>(); + foreach (var id in value) + { + list.Add(new DeleteOneModel(Builders.Filter.Eq(u => u.Id, id))); + } + MongoDbAccessManager.Users.BulkWrite(list); return true; } } diff --git a/Bootstrap.DataAccess.SQLite/User.cs b/Bootstrap.DataAccess.SQLite/User.cs index 9ffcbccf..3509568e 100644 --- a/Bootstrap.DataAccess.SQLite/User.cs +++ b/Bootstrap.DataAccess.SQLite/User.cs @@ -38,7 +38,6 @@ namespace Bootstrap.DataAccess.SQLite DbAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); transaction.CommitTransaction(); - CacheCleanUtility.ClearCache(userIds: value); ret = true; } } @@ -86,7 +85,6 @@ namespace Bootstrap.DataAccess.SQLite DbAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); transaction.CommitTransaction(); - CacheCleanUtility.ClearCache(userIds: string.IsNullOrEmpty(p.Id) ? new List() : new List() { p.Id }); ret = true; } } @@ -114,7 +112,6 @@ namespace Bootstrap.DataAccess.SQLite cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@id", id)); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@approvedBy", approvedBy)); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(userIds: new List() { id }); } return ret; } @@ -146,7 +143,6 @@ namespace Bootstrap.DataAccess.SQLite DbAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); transaction.CommitTransaction(); - CacheCleanUtility.ClearCache(userIds: new List() { id }); ret = true; } } @@ -167,10 +163,6 @@ namespace Bootstrap.DataAccess.SQLite public override bool SaveUsersByRoleId(string roleId, IEnumerable userIds) { bool ret = false; - DataTable dt = new DataTable(); - dt.Columns.Add("RoleID", typeof(int)); - dt.Columns.Add("UserID", typeof(int)); - userIds.ToList().ForEach(userId => dt.Rows.Add(roleId, userId)); using (TransactionPackage transaction = DbAccessManager.DBAccess.BeginTransaction()) { try @@ -188,7 +180,6 @@ namespace Bootstrap.DataAccess.SQLite }); transaction.CommitTransaction(); } - CacheCleanUtility.ClearCache(userIds: userIds, roleIds: new List() { roleId }); ret = true; } catch (Exception ex) @@ -225,7 +216,6 @@ namespace Bootstrap.DataAccess.SQLite }); transaction.CommitTransaction(); } - CacheCleanUtility.ClearCache(userIds: userIds, groupIds: new List() { groupId }); ret = true; } catch (Exception ex) diff --git a/Bootstrap.DataAccess/Helper/UserHelper.cs b/Bootstrap.DataAccess/Helper/UserHelper.cs index 2a399292..f51f385b 100644 --- a/Bootstrap.DataAccess/Helper/UserHelper.cs +++ b/Bootstrap.DataAccess/Helper/UserHelper.cs @@ -37,13 +37,23 @@ namespace Bootstrap.DataAccess /// 删除用户 /// /// - public static bool DeleteUser(IEnumerable value) => DbAdapterManager.Create().DeleteUser(value); + public static bool DeleteUser(IEnumerable value) + { + var ret = DbAdapterManager.Create().DeleteUser(value); + if (ret) CacheCleanUtility.ClearCache(userIds: value); + return ret; + } /// /// 保存新建 /// /// /// - public static bool SaveUser(User p) => DbAdapterManager.Create().SaveUser(p); + public static bool SaveUser(User p) + { + var ret = DbAdapterManager.Create().SaveUser(p); + if (ret) CacheCleanUtility.ClearCache(userIds: string.IsNullOrEmpty(p.Id) ? new List() : new List() { p.Id }); + return ret; + } /// /// /// @@ -51,14 +61,24 @@ namespace Bootstrap.DataAccess /// /// /// - public static bool UpdateUser(string id, string password, string displayName) => DbAdapterManager.Create().UpdateUser(id, password, displayName); + public static bool UpdateUser(string id, string password, string displayName) + { + var ret = DbAdapterManager.Create().UpdateUser(id, password, displayName); + if (ret) CacheCleanUtility.ClearCache(userIds: string.IsNullOrEmpty(id) ? new List() : new List() { id }); + return ret; + } /// /// /// /// /// /// - public static bool ApproveUser(string id, string approvedBy) => DbAdapterManager.Create().ApproveUser(id, approvedBy); + public static bool ApproveUser(string id, string approvedBy) + { + var ret = DbAdapterManager.Create().ApproveUser(id, approvedBy); + if (ret) CacheCleanUtility.ClearCache(userIds: new List() { id }); + return ret; + } /// /// /// @@ -74,7 +94,12 @@ namespace Bootstrap.DataAccess /// /// /// - public static bool RejectUser(string id, string rejectBy) => DbAdapterManager.Create().RejectUser(id, rejectBy); + public static bool RejectUser(string id, string rejectBy) + { + var ret = DbAdapterManager.Create().RejectUser(id, rejectBy); + if (ret) CacheCleanUtility.ClearCache(userIds: new List() { id }); + return ret; + } /// /// 通过roleId获取所有用户 /// @@ -84,10 +109,15 @@ namespace Bootstrap.DataAccess /// /// 通过角色ID保存当前授权用户(插入) /// - /// 角色ID + /// 角色ID /// 用户ID数组 /// - public static bool SaveUsersByRoleId(string id, IEnumerable userIds) => DbAdapterManager.Create().SaveUsersByRoleId(id, userIds); + public static bool SaveUsersByRoleId(string roleId, IEnumerable userIds) + { + var ret = DbAdapterManager.Create().SaveUsersByRoleId(roleId, userIds); + if (ret) CacheCleanUtility.ClearCache(userIds: userIds, roleIds: new List() { roleId }); + return ret; + } /// /// 通过groupId获取所有用户 /// @@ -97,30 +127,51 @@ namespace Bootstrap.DataAccess /// /// 通过部门ID保存当前授权用户(插入) /// - /// GroupID + /// GroupID /// 用户ID数组 /// - public static bool SaveUsersByGroupId(string id, IEnumerable userIds) => DbAdapterManager.Create().SaveUsersByGroupId(id, userIds); + public static bool SaveUsersByGroupId(string groupId, IEnumerable userIds) + { + var ret = DbAdapterManager.Create().SaveUsersByGroupId(groupId, userIds); + if (ret) CacheCleanUtility.ClearCache(userIds: userIds, groupIds: new List() { groupId }); + return ret; + } /// 根据用户名修改用户头像 /// /// /// /// - public static bool SaveUserIconByName(string userName, string iconName) => DbAdapterManager.Create().SaveUserIconByName(userName, iconName); + public static bool SaveUserIconByName(string userName, string iconName) + { + var ret = DbAdapterManager.Create().SaveUserIconByName(userName, iconName); + if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{RetrieveUsersDataKey}*"); + return ret; + } /// /// /// /// /// /// - public static bool SaveDisplayName(string userName, string displayName) => DbAdapterManager.Create().SaveDisplayName(userName, displayName); + public static bool SaveDisplayName(string userName, string displayName) + { + var ret = DbAdapterManager.Create().SaveDisplayName(userName, displayName); + if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{RetrieveUsersDataKey}*"); + return ret; + } + /// /// 根据用户名更改用户皮肤 /// /// /// /// - public static bool SaveUserCssByName(string userName, string cssName) => DbAdapterManager.Create().SaveUserCssByName(userName, cssName); + public static bool SaveUserCssByName(string userName, string cssName) + { + var ret = DbAdapterManager.Create().SaveUserCssByName(userName, cssName); + if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{UserHelper.RetrieveUsersDataKey}*"); + return ret; + } /// /// /// diff --git a/Bootstrap.DataAccess/User.cs b/Bootstrap.DataAccess/User.cs index 74742ecd..704cb39a 100644 --- a/Bootstrap.DataAccess/User.cs +++ b/Bootstrap.DataAccess/User.cs @@ -178,7 +178,6 @@ namespace Bootstrap.DataAccess { cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@ids", ids)); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; - if (ret) CacheCleanUtility.ClearCache(userIds: value); } return ret; } @@ -203,7 +202,6 @@ namespace Bootstrap.DataAccess cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@approvedBy", DbAdapterManager.ToDBValue(p.ApprovedBy))); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@description", p.Description)); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; - if (ret) CacheCleanUtility.ClearCache(userIds: string.IsNullOrEmpty(p.Id) ? new List() : new List() { p.Id }); } return ret; } @@ -227,7 +225,6 @@ namespace Bootstrap.DataAccess cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@Password", newPassword)); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@PassSalt", passSalt)); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(userIds: string.IsNullOrEmpty(id) ? new List() : new List() { id }); } return ret; } @@ -246,7 +243,6 @@ namespace Bootstrap.DataAccess cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@id", id)); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@approvedBy", approvedBy)); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(userIds: new List() { id }); } return ret; } @@ -265,7 +261,6 @@ namespace Bootstrap.DataAccess cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@rejectedBy", rejectBy)); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@rejectedReason", "未填写")); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; - if (ret) CacheCleanUtility.ClearCache(userIds: new List() { id }); } return ret; } @@ -327,7 +322,6 @@ namespace Bootstrap.DataAccess transaction.CommitTransaction(); } } - CacheCleanUtility.ClearCache(userIds: userIds, roleIds: new List() { roleId }); ret = true; } catch (Exception ex) @@ -397,7 +391,6 @@ namespace Bootstrap.DataAccess transaction.CommitTransaction(); } } - CacheCleanUtility.ClearCache(userIds: userIds, groupIds: new List() { groupId }); ret = true; } catch (Exception ex) @@ -423,7 +416,6 @@ namespace Bootstrap.DataAccess cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@iconName", iconName)); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@userName", userName)); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{UserHelper.RetrieveUsersDataKey}*"); } return ret; } @@ -442,7 +434,6 @@ namespace Bootstrap.DataAccess cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@DisplayName", displayName)); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@userName", userName)); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{UserHelper.RetrieveUsersDataKey}*"); } return ret; } @@ -461,7 +452,6 @@ namespace Bootstrap.DataAccess cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@cssName", DbAdapterManager.ToDBValue(cssName))); cmd.Parameters.Add(DbAccessManager.DBAccess.CreateParameter("@userName", userName)); ret = DbAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{UserHelper.RetrieveUsersDataKey}*"); } return ret; }