diff --git a/.gitignore b/.gitignore index 3aabb063..9cdc2578 100644 --- a/.gitignore +++ b/.gitignore @@ -345,6 +345,7 @@ ASALocalRun/ # Net Core Keys [Kk]eys/ lib/ +*.db ###### -- Custom Ignore Section, Make sure all files you add to the git repo are below this line -- ###### diff --git a/Bootstrap.Admin/Bootstrap.Admin.csproj b/Bootstrap.Admin/Bootstrap.Admin.csproj index f881daf6..b073db5d 100644 --- a/Bootstrap.Admin/Bootstrap.Admin.csproj +++ b/Bootstrap.Admin/Bootstrap.Admin.csproj @@ -20,6 +20,8 @@ + + diff --git a/Bootstrap.Admin/Controllers/AccountController.cs b/Bootstrap.Admin/Controllers/AccountController.cs index 6c82c68b..cab0a06b 100644 --- a/Bootstrap.Admin/Controllers/AccountController.cs +++ b/Bootstrap.Admin/Controllers/AccountController.cs @@ -1,5 +1,5 @@ using Bootstrap.Admin.Models; -using Bootstrap.Security; +using Bootstrap.DataAccess; using Longbow; using Longbow.Configuration; using Microsoft.AspNetCore.Authentication; @@ -39,7 +39,7 @@ namespace Bootstrap.Admin.Controllers [HttpPost] public async Task Login(string userName, string password, string remember) { - if (BootstrapUser.Authenticate(userName, password)) + if (UserHelper.Authenticate(userName, password)) { var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme); identity.AddClaim(new Claim(ClaimTypes.Name, userName)); diff --git a/Bootstrap.Admin/Controllers/Api/InterfaceController.cs b/Bootstrap.Admin/Controllers/Api/InterfaceController.cs new file mode 100644 index 00000000..e986a291 --- /dev/null +++ b/Bootstrap.Admin/Controllers/Api/InterfaceController.cs @@ -0,0 +1,71 @@ +using Bootstrap.DataAccess; +using Bootstrap.Security; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; + +namespace Bootstrap.Admin.Controllers +{ + /// + /// + /// + [Route("api/[controller]/[action]")] + [AllowAnonymous] + public class InterfaceController : Controller + { + /// + /// + /// + /// + [HttpPost] + public IEnumerable RetrieveDicts() + { + return DictHelper.RetrieveDicts(); + } + /// + /// + /// + /// + [HttpPost] + public IEnumerable RetrieveRolesByUrl([FromBody]string url) + { + return RoleHelper.RetrieveRolesByUrl(url); + } + /// + /// + /// + /// + [HttpPost] + public IEnumerable RetrieveRolesByUserName([FromBody]string userName) + { + return RoleHelper.RetrieveRolesByUserName(userName); + } + /// + /// + /// + /// + [HttpPost] + public BootstrapUser RetrieveUserByUserName([FromBody]string userName) + { + return UserHelper.RetrieveUserByUserName(userName); + } + /// + /// + /// + /// + [HttpPost] + public IEnumerable RetrieveAppMenus([FromBody]AppMenuArgs args) + { + return MenuHelper.RetrieveAppMenus(args.Name, args.Url); + } + /// + /// + /// + public class AppMenuArgs + { + public string Name { get; set; } + + public string Url { get; set; } + } + } +} diff --git a/Bootstrap.Admin/Controllers/Api/LoginController.cs b/Bootstrap.Admin/Controllers/Api/LoginController.cs index 1516ed8d..6aa4661b 100644 --- a/Bootstrap.Admin/Controllers/Api/LoginController.cs +++ b/Bootstrap.Admin/Controllers/Api/LoginController.cs @@ -1,4 +1,5 @@ -using Bootstrap.Security; +using Bootstrap.DataAccess; +using Bootstrap.Security; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; @@ -26,7 +27,7 @@ namespace Bootstrap.Admin.Controllers.Api dynamic user = value; string userName = user.userName; string password = user.password; - if (BootstrapUser.Authenticate(userName, password)) + if (UserHelper.Authenticate(userName, password)) { return BootstrapAdminJwtTokenHandler.CreateToken(userName); } diff --git a/Bootstrap.Admin/Controllers/Api/MenusController.cs b/Bootstrap.Admin/Controllers/Api/MenusController.cs index fd897329..23d88548 100644 --- a/Bootstrap.Admin/Controllers/Api/MenusController.cs +++ b/Bootstrap.Admin/Controllers/Api/MenusController.cs @@ -58,7 +58,7 @@ namespace Bootstrap.Admin.Controllers.Api ret = MenuHelper.RetrieveMenusByRoleId(id).ToList(); break; case "user": - ret = BootstrapMenu.RetrieveAllMenus(User.Identity.Name).ToList(); + ret = MenuHelper.RetrieveAllMenus(User.Identity.Name).ToList(); break; default: break; diff --git a/Bootstrap.Admin/Controllers/Api/NotificationsController.cs b/Bootstrap.Admin/Controllers/Api/NotificationsController.cs index eeab0000..543731dd 100644 --- a/Bootstrap.Admin/Controllers/Api/NotificationsController.cs +++ b/Bootstrap.Admin/Controllers/Api/NotificationsController.cs @@ -46,7 +46,7 @@ namespace Bootstrap.Admin.Controllers.Api message.AsParallel().ForAll(m => m.FromIcon = Url.Content(m.FromIcon)); //Apps - var apps = ExceptionHelper.RetrieveExceptions().Where(n => n.ExceptionType != "Longbow.Data.DBAccessException"); + var apps = ExceptionsHelper.RetrieveExceptions().Where(n => n.ExceptionType != "Longbow.Data.DBAccessException"); var appExceptionsCount = apps.Count(); apps = apps.Take(6); @@ -61,7 +61,7 @@ namespace Bootstrap.Admin.Controllers.Api }); //Dbs - var dbs = ExceptionHelper.RetrieveExceptions().Where(n => n.ExceptionType == "Longbow.Data.DBAccessException"); + var dbs = ExceptionsHelper.RetrieveExceptions().Where(n => n.ExceptionType == "Longbow.Data.DBAccessException"); var dbExceptionsCount = dbs.Count(); dbs = dbs.Take(6); diff --git a/Bootstrap.Admin/Controllers/Api/RegisterController.cs b/Bootstrap.Admin/Controllers/Api/RegisterController.cs index 4da681e8..d19a6c58 100644 --- a/Bootstrap.Admin/Controllers/Api/RegisterController.cs +++ b/Bootstrap.Admin/Controllers/Api/RegisterController.cs @@ -21,7 +21,7 @@ namespace Bootstrap.Admin.Controllers.Api [HttpGet] public bool Get(string userName) { - return BootstrapUser.RetrieveUserByUserName(userName) == null && !UserHelper.RetrieveNewUsers().Any(u => u.UserName == userName); + return UserHelper.RetrieveUserByUserName(userName) == null && !UserHelper.RetrieveNewUsers().Any(u => u.UserName == userName); } /// /// 登录页面注册新用户提交按钮调用 diff --git a/Bootstrap.Admin/Models/HeaderBarModel.cs b/Bootstrap.Admin/Models/HeaderBarModel.cs index 5a9076fb..90ec0cf4 100644 --- a/Bootstrap.Admin/Models/HeaderBarModel.cs +++ b/Bootstrap.Admin/Models/HeaderBarModel.cs @@ -1,4 +1,4 @@ -using Bootstrap.Security; +using Bootstrap.DataAccess; using System.Security.Principal; namespace Bootstrap.Admin.Models @@ -10,7 +10,7 @@ namespace Bootstrap.Admin.Models { public HeaderBarModel(IIdentity identity) { - var user = BootstrapUser.RetrieveUserByUserName(identity.Name); + var user = UserHelper.RetrieveUserByUserName(identity.Name); Icon = user.Icon; DisplayName = user.DisplayName; UserName = user.UserName; diff --git a/Bootstrap.Admin/Models/NavigatorBarModel.cs b/Bootstrap.Admin/Models/NavigatorBarModel.cs index 277cf876..bc155de3 100644 --- a/Bootstrap.Admin/Models/NavigatorBarModel.cs +++ b/Bootstrap.Admin/Models/NavigatorBarModel.cs @@ -9,7 +9,7 @@ namespace Bootstrap.Admin.Models { public NavigatorBarModel(ControllerBase controller) : base(controller.User.Identity) { - Navigations = BootstrapMenu.RetrieveSystemMenus(UserName, $"~{controller.HttpContext.Request.Path}"); + Navigations = MenuHelper.RetrieveSystemMenus(UserName, $"~{controller.HttpContext.Request.Path}"); Applications = DictHelper.RetrieveApps(); } /// diff --git a/Bootstrap.Admin/Query/QueryExceptionOption.cs b/Bootstrap.Admin/Query/QueryExceptionOption.cs index 2eba4217..e194cd98 100644 --- a/Bootstrap.Admin/Query/QueryExceptionOption.cs +++ b/Bootstrap.Admin/Query/QueryExceptionOption.cs @@ -22,7 +22,7 @@ namespace Bootstrap.Admin.Query /// public QueryData RetrieveData() { - var data = ExceptionHelper.RetrieveExceptions(); + var data = ExceptionsHelper.RetrieveExceptions(); if (StartTime > DateTime.MinValue) { data = data.Where(t => t.LogTime > StartTime); diff --git a/Bootstrap.Admin/Query/QueryMenuOption.cs b/Bootstrap.Admin/Query/QueryMenuOption.cs index c36a2e5c..b5dfbe7b 100644 --- a/Bootstrap.Admin/Query/QueryMenuOption.cs +++ b/Bootstrap.Admin/Query/QueryMenuOption.cs @@ -1,4 +1,5 @@ -using Bootstrap.Security; +using Bootstrap.DataAccess; +using Bootstrap.Security; using Longbow.Web.Mvc; using System.Linq; @@ -25,7 +26,7 @@ namespace Bootstrap.Admin.Query public QueryData RetrieveData(string userName) { - var data = BootstrapMenu.RetrieveMenusByUserName(userName); + var data = MenuHelper.RetrieveMenusByUserName(userName); if (!string.IsNullOrEmpty(ParentName)) { data = data.Where(t => t.ParentName.Contains(ParentName)); diff --git a/Bootstrap.Admin/Startup.cs b/Bootstrap.Admin/Startup.cs index a6833732..705fe57a 100644 --- a/Bootstrap.Admin/Startup.cs +++ b/Bootstrap.Admin/Startup.cs @@ -42,7 +42,7 @@ namespace Bootstrap.Admin options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddCors(); - services.AddLogging(builder => builder.AddFileLogger().AddDBLogger(ExceptionHelper.Log)); + services.AddLogging(builder => builder.AddFileLogger().AddDBLogger(ExceptionsHelper.Log)); services.AddConfigurationManager(); services.AddCacheManager(); services.AddDBAccessFactory(); @@ -83,7 +83,7 @@ namespace Bootstrap.Admin app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseAuthentication(); - app.UseBootstrapAdminAuthorization(); + app.UseBootstrapAdminAuthorization(userName => RoleHelper.RetrieveRolesByUserName(userName), url => RoleHelper.RetrieveRolesByUrl(url)); app.UseCacheManagerCorsHandler(); app.UseSignalR(routes => { routes.MapHub("/NotiHub"); }); app.UseMvc(routes => diff --git a/Bootstrap.Admin/appsettings.json b/Bootstrap.Admin/appsettings.json index 65aa8c43..5e38e0ab 100644 --- a/Bootstrap.Admin/appsettings.json +++ b/Bootstrap.Admin/appsettings.json @@ -15,6 +15,20 @@ "ConnectionStrings": { "ba": "Data Source=.;Initial Catalog=BootstrapAdmin;User ID=sa;Password=sa" }, + "DB": [ + { + "Enabled": false, + "Widget": "Bootstrap.DataAccess.SQLServer" + }, + { + "Enabled": true, + "Widget": "Bootstrap.DataAccess.SQLite", + "DBProviderFactory": "Microsoft.Data.Sqlite.SqliteFactory, Microsoft.Data.Sqlite", + "ConnectionStrings": { + "ba": "Data Source=BootstrapAdmin.db;" + } + } + ], "AllowOrigins": "http://localhost,http://10.15.63.218", "KeyPath": "D:\\App\\Web-App\\keys", "ApplicationName": "__bd__", @@ -26,7 +40,6 @@ "Expires": 5, "SecurityKey": "BootstrapAdmin-V1.1" }, - "BAAuthorizateScheme": "Role", "KeepExceptionsPeriod": 12, "KeepLogsPeriod": 12, "CookieExpiresDays": 7, diff --git a/Bootstrap.Client.DataAccess/BAHelper.cs b/Bootstrap.Client.DataAccess/BAHelper.cs new file mode 100644 index 00000000..8e670471 --- /dev/null +++ b/Bootstrap.Client.DataAccess/BAHelper.cs @@ -0,0 +1,50 @@ +using Bootstrap.Security; +using Longbow; +using Longbow.Configuration; +using System; +using System.Collections.Generic; +using System.Net.Http; + +namespace Bootstrap.Client.DataAccess +{ + internal static class BAHelper + { + private readonly static LgbHttpClient _client = new LgbHttpClient(new HttpClient() { BaseAddress = new Uri($"{ConfigurationManager.AppSettings["AuthHost"]}/api/Interface/") }); + + private static T ExecuteRemoteAction(string actionName, object data = null) + { + var task = _client.PostAsJsonAsync(actionName, data); + task.Wait(); + return task.Result; + } + /// + /// + /// + /// + /// + public static IEnumerable RetrieveAppMenus(object args) => ExecuteRemoteAction>("RetrieveAppMenus", args); + /// + /// + /// + /// + /// + public static IEnumerable RetrieveRolesByUrl(string url) => ExecuteRemoteAction>("RetrieveRolesByUrl", url); + /// + /// + /// + /// + /// + public static IEnumerable RetrieveRolesByUserName(string userName) => ExecuteRemoteAction>("RetrieveRolesByUserName", userName); + /// + /// + /// + /// + public static IEnumerable RetrieveDicts() => ExecuteRemoteAction>("RetrieveDicts"); + /// + /// + /// + /// + /// + public static BootstrapUser RetrieveUserByUserName(string userName) => ExecuteRemoteAction("RetrieveUserByUserName", userName); + } +} diff --git a/Bootstrap.Client.DataAccess/Bootstrap.Client.DataAccess.csproj b/Bootstrap.Client.DataAccess/Bootstrap.Client.DataAccess.csproj index b1d89867..f7933494 100644 --- a/Bootstrap.Client.DataAccess/Bootstrap.Client.DataAccess.csproj +++ b/Bootstrap.Client.DataAccess/Bootstrap.Client.DataAccess.csproj @@ -12,6 +12,9 @@ + + + diff --git a/Bootstrap.Client.DataAccess/DBAccessManager.cs b/Bootstrap.Client.DataAccess/DBAccessManager.cs deleted file mode 100644 index aff57843..00000000 --- a/Bootstrap.Client.DataAccess/DBAccessManager.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Longbow.Data; -using System; - -namespace Bootstrap.Client.DataAccess -{ - /// - /// - /// - public static class DBAccessManager - { - private static readonly Lazy db = new Lazy(() => DBAccessFactory.CreateDB("ba"), true); - - public static IDBAccess SqlDBAccess - { - get { return db.Value; } - } - } -} diff --git a/Bootstrap.Client.DataAccess/DbAccessManager.cs b/Bootstrap.Client.DataAccess/DbAccessManager.cs new file mode 100644 index 00000000..05cde266 --- /dev/null +++ b/Bootstrap.Client.DataAccess/DbAccessManager.cs @@ -0,0 +1,17 @@ +using Longbow.Data; +using System; + +namespace Bootstrap.Client.DataAccess +{ + /// + /// + /// + public static class DbAccessManager + { + private static readonly Lazy _db = new Lazy(() => DbAccessFactory.CreateDB("sql"), true); + /// + /// + /// + public static IDbAccess DbAccess { get { return _db.Value; } } + } +} diff --git a/Bootstrap.Client.DataAccess/DictHelper.cs b/Bootstrap.Client.DataAccess/DictHelper.cs index e17a1d6b..6aed9412 100644 --- a/Bootstrap.Client.DataAccess/DictHelper.cs +++ b/Bootstrap.Client.DataAccess/DictHelper.cs @@ -47,15 +47,12 @@ namespace Bootstrap.Client.DataAccess /// /// /// - private static IEnumerable RetrieveDicts() - { - return BootstrapDict.RetrieveDicts(); - } + private static IEnumerable RetrieveDicts() => BAHelper.RetrieveDicts(); private static string RetrieveAppName(string name, string defaultValue = "未设置") { - var dicts = BootstrapDict.RetrieveDicts(); - var platName = dicts.FirstOrDefault(d => d.Category == "应用程序" && d.Code == ConfigurationManager.AppSettings["AppId"]).Name; + var dicts = RetrieveDicts(); + var platName = dicts.FirstOrDefault(d => d.Category == "应用程序" && d.Code == ConfigurationManager.AppSettings["AppId"])?.Name; return dicts.FirstOrDefault(d => d.Category == platName && d.Name == name)?.Code ?? $"{name}{defaultValue}"; } /// @@ -64,9 +61,8 @@ namespace Bootstrap.Client.DataAccess /// public static string RetrieveActiveTheme() { - var data = RetrieveDicts(); - var theme = data.Where(d => d.Name == "使用样式" && d.Category == "当前样式" && d.Define == 0).FirstOrDefault(); - return theme == null ? string.Empty : (theme.Code.Equals("site.css", StringComparison.OrdinalIgnoreCase) ? string.Empty : theme.Code); + var theme = RetrieveDicts().Where(d => d.Name == "使用样式" && d.Category == "当前样式" && d.Define == 0).FirstOrDefault()?.Code; + return theme == null ? string.Empty : theme.Equals("site.css", StringComparison.OrdinalIgnoreCase) ? string.Empty : theme; } } } diff --git a/Bootstrap.Client.DataAccess/MenuHelper.cs b/Bootstrap.Client.DataAccess/MenuHelper.cs new file mode 100644 index 00000000..f12b3ed4 --- /dev/null +++ b/Bootstrap.Client.DataAccess/MenuHelper.cs @@ -0,0 +1,19 @@ +using Bootstrap.Security; +using System.Collections.Generic; + +namespace Bootstrap.Client.DataAccess +{ + /// + /// + /// + public static class MenuHelper + { + /// + /// + /// + /// + /// + /// + public static IEnumerable RetrieveAppMenus(string name, string url) => BAHelper.RetrieveAppMenus(new { Name = name, Url = url }); + } +} diff --git a/Bootstrap.Client.DataAccess/RoleHelper.cs b/Bootstrap.Client.DataAccess/RoleHelper.cs new file mode 100644 index 00000000..852a14ed --- /dev/null +++ b/Bootstrap.Client.DataAccess/RoleHelper.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Bootstrap.Client.DataAccess +{ + /// + /// + /// + public static class RoleHelper + { + /// + /// + /// + /// + /// + public static IEnumerable RetrieveRolesByUserName(string userName) => BAHelper.RetrieveRolesByUserName(userName); + /// + /// + /// + /// + /// + public static IEnumerable RetrieveRolesByUrl(string url) => BAHelper.RetrieveRolesByUrl(url); + } +} \ No newline at end of file diff --git a/Bootstrap.Client.DataAccess/UserHelper.cs b/Bootstrap.Client.DataAccess/UserHelper.cs new file mode 100644 index 00000000..dcdb1710 --- /dev/null +++ b/Bootstrap.Client.DataAccess/UserHelper.cs @@ -0,0 +1,17 @@ +using Bootstrap.Security; + +namespace Bootstrap.Client.DataAccess +{ + /// + /// 用户表相关操作类 + /// + public static class UserHelper + { + /// + /// + /// + /// + /// + public static BootstrapUser RetrieveUserByUserName(string userName)=> BAHelper.RetrieveUserByUserName(userName); + } +} diff --git a/Bootstrap.Client/Models/HeaderBarModel.cs b/Bootstrap.Client/Models/HeaderBarModel.cs index 42d5995c..c7608954 100644 --- a/Bootstrap.Client/Models/HeaderBarModel.cs +++ b/Bootstrap.Client/Models/HeaderBarModel.cs @@ -1,5 +1,4 @@ using Bootstrap.Client.DataAccess; -using Bootstrap.Security; using Longbow.Configuration; using Microsoft.AspNetCore.Authentication.Cookies; using System; @@ -18,7 +17,7 @@ namespace Bootstrap.Client.Models /// public HeaderBarModel(IIdentity identity) { - var user = BootstrapUser.RetrieveUserByUserName(identity.Name); + var user = UserHelper.RetrieveUserByUserName(identity.Name); Icon = $"{ConfigurationManager.AppSettings["AuthHost"]}/{user.Icon.TrimStart('~', '/')}"; DisplayName = user.DisplayName; UserName = user.UserName; diff --git a/Bootstrap.Client/Models/NavigatorBarModel.cs b/Bootstrap.Client/Models/NavigatorBarModel.cs index 0474f05e..671c38de 100644 --- a/Bootstrap.Client/Models/NavigatorBarModel.cs +++ b/Bootstrap.Client/Models/NavigatorBarModel.cs @@ -1,4 +1,5 @@ -using Bootstrap.Security; +using Bootstrap.Client.DataAccess; +using Bootstrap.Security; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; @@ -15,11 +16,11 @@ namespace Bootstrap.Client.Models /// public NavigatorBarModel(ControllerBase controller) : base(controller.User.Identity) { - Navigations = BootstrapMenu.RetrieveAppMenus(UserName, $"~/{controller.ControllerContext.ActionDescriptor.ControllerName}/{controller.ControllerContext.ActionDescriptor.ActionName}"); + Navigations = MenuHelper.RetrieveAppMenus(UserName, $"~/{controller.ControllerContext.ActionDescriptor.ControllerName}/{controller.ControllerContext.ActionDescriptor.ActionName}"); } /// /// /// - public IEnumerable Navigations { get;} + public IEnumerable Navigations { get; } } } \ No newline at end of file diff --git a/Bootstrap.Client/Startup.cs b/Bootstrap.Client/Startup.cs index b61e0a08..dbca522c 100644 --- a/Bootstrap.Client/Startup.cs +++ b/Bootstrap.Client/Startup.cs @@ -1,4 +1,5 @@ -using Bootstrap.Security.Filter; +using Bootstrap.Client.DataAccess; +using Bootstrap.Security.Filter; using Bootstrap.Security.Middleware; using Longbow.Cache; using Longbow.Cache.Middleware; @@ -87,7 +88,7 @@ namespace Bootstrap.Client app.UseStaticFiles(); app.UseCookiePolicy(); app.UseAuthentication(); - app.UseBootstrapAdminAuthorization(); + app.UseBootstrapAdminAuthorization(userName => RoleHelper.RetrieveRolesByUserName(userName), url => RoleHelper.RetrieveRolesByUrl(url)); app.UseWebSocketHandler(options => options.UseAuthentication = true); app.UseCacheManagerCorsHandler(); app.UseSignalR(routes => { routes.MapHub("/NotiHub"); }); diff --git a/Bootstrap.DataAccess.SQLServer/Bootstrap.DataAccess.SQLServer.csproj b/Bootstrap.DataAccess.SQLServer/Bootstrap.DataAccess.SQLServer.csproj new file mode 100644 index 00000000..ccd3dd38 --- /dev/null +++ b/Bootstrap.DataAccess.SQLServer/Bootstrap.DataAccess.SQLServer.csproj @@ -0,0 +1,17 @@ + + + + netstandard2.0 + + + + + + + + + + + + + diff --git a/Bootstrap.DataAccess/DictHelper.cs b/Bootstrap.DataAccess.SQLServer/Dict.cs similarity index 59% rename from Bootstrap.DataAccess/DictHelper.cs rename to Bootstrap.DataAccess.SQLServer/Dict.cs index 51f43eec..8052ae06 100644 --- a/Bootstrap.DataAccess/DictHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/Dict.cs @@ -1,180 +1,168 @@ -using Bootstrap.Security; -using Longbow.Cache; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Globalization; -using System.Linq; - -namespace Bootstrap.DataAccess -{ - /// - /// - /// - public static class DictHelper - { - /// - /// - /// - internal const string RetrieveCategoryDataKey = "DictHelper-RetrieveDictsCategory"; - /// - /// - /// - /// - public static IEnumerable RetrieveDicts() - { - return BootstrapDict.RetrieveDicts(); - } - /// - /// 删除字典中的数据 - /// - /// 需要删除的IDs - /// - public static bool DeleteDict(IEnumerable value) - { - var ret = false; - var ids = string.Join(",", value); - string sql = string.Format(CultureInfo.InvariantCulture, "Delete from Dicts where ID in ({0})", ids); - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == value.Count(); - CacheCleanUtility.ClearCache(dictIds: ids); - } - return ret; - } - - /// - /// 保存新建/更新的字典信息 - /// - /// - /// - public static bool SaveDict(BootstrapDict p) - { - bool ret = false; - if (p.Category.Length > 50) p.Category = p.Category.Substring(0, 50); - if (p.Name.Length > 50) p.Name = p.Name.Substring(0, 50); - if (p.Code.Length > 50) p.Code = p.Code.Substring(0, 50); - string sql = p.Id == 0 ? - "Insert Into Dicts (Category, Name, Code ,Define) Values (@Category, @Name, @Code, @Define)" : - "Update Dicts set Category = @Category, Name = @Name, Code = @Code, Define = @Define where ID = @ID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ID", p.Id)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Category", p.Category)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Name", p.Name)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Code", p.Code)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Define", p.Define)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - } - CacheCleanUtility.ClearCache(dictIds: p.Id == 0 ? string.Empty : p.Id.ToString()); - return ret; - } - /// - /// 保存网站个性化设置 - /// - /// - /// - /// - /// - public static bool SaveSettings(BootstrapDict dict) - { - var ret = false; - string sql = "Update Dicts set Code = @Code where Category = @Category and Name = @Name"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Name", dict.Name)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Code", dict.Code)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Category", dict.Category)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - } - CacheCleanUtility.ClearCache(dictIds: string.Empty); - return ret; - } - /// - /// 获取字典分类名称 - /// - /// - public static IEnumerable RetrieveCategories() - { - return CacheManager.GetOrAdd(RetrieveCategoryDataKey, key => - { - var ret = new List(); - string sql = "select distinct Category from Dicts"; - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - ret.Add((string)reader[0]); - } - } - return ret; - }); - } - /// - /// - /// - /// - public static string RetrieveWebTitle() - { - var settings = RetrieveDicts(); - return (settings.FirstOrDefault(d => d.Name == "网站标题" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "后台管理系统" }).Code; - } - /// - /// - /// - /// - public static string RetrieveWebFooter() - { - var settings = RetrieveDicts(); - return (settings.FirstOrDefault(d => d.Name == "网站页脚" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "2016 © 通用后台管理系统" }).Code; - } - /// - /// 获得系统中配置的可以使用的网站样式 - /// - /// - public static IEnumerable RetrieveThemes() - { - var data = RetrieveDicts(); - return data.Where(d => d.Category == "网站样式"); - } - /// - /// 获得网站设置中的当前样式 - /// - /// - public static string RetrieveActiveTheme() - { - var data = RetrieveDicts(); - var theme = data.Where(d => d.Name == "使用样式" && d.Category == "当前样式" && d.Define == 0).FirstOrDefault(); - return theme == null ? string.Empty : (theme.Code.Equals("site.css", StringComparison.OrdinalIgnoreCase) ? string.Empty : theme.Code); - } - /// - /// 获取头像路径 - /// - /// - public static BootstrapDict RetrieveIconFolderPath() - { - var data = RetrieveDicts(); - return data.FirstOrDefault(d => d.Name == "头像路径" && d.Category == "头像地址" && d.Define == 0) ?? new BootstrapDict() { Code = "~/images/uploader/" }; - } - /// - /// 获得默认的前台首页地址,默认为~/Home/Index - /// - /// - public static string RetrieveHomeUrl() - { - var settings = RetrieveDicts(); - return (settings.FirstOrDefault(d => d.Name == "前台首页" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "~/Home/Index" }).Code; - } - /// - /// - /// - /// - public static IEnumerable> RetrieveApps() - { - var settings = RetrieveDicts(); - return settings.Where(d => d.Category == "应用程序" && d.Define == 0).Select(d => new KeyValuePair(d.Code, d.Name)).OrderBy(d => d.Key); - } - } -} +using Bootstrap.Security; +using Longbow.Cache; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLServer +{ + /// + /// + /// + public class Dict : DataAccess.Dict + { + /// + /// 删除字典中的数据 + /// + /// 需要删除的IDs + /// + public override bool DeleteDict(IEnumerable value) + { + var ret = false; + var ids = string.Join(",", value); + string sql = string.Format(CultureInfo.InvariantCulture, "Delete from Dicts where ID in ({0})", ids); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == value.Count(); + CacheCleanUtility.ClearCache(dictIds: ids); + } + return ret; + } + + /// + /// 保存新建/更新的字典信息 + /// + /// + /// + public override bool SaveDict(BootstrapDict dict) + { + bool ret = false; + if (dict.Category.Length > 50) dict.Category = dict.Category.Substring(0, 50); + if (dict.Name.Length > 50) dict.Name = dict.Name.Substring(0, 50); + if (dict.Code.Length > 50) dict.Code = dict.Code.Substring(0, 50); + string sql = dict.Id == 0 ? + "Insert Into Dicts (Category, Name, Code ,Define) Values (@Category, @Name, @Code, @Define)" : + "Update Dicts set Category = @Category, Name = @Name, Code = @Code, Define = @Define where ID = @ID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ID", dict.Id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Category", dict.Category)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Name", dict.Name)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Code", dict.Code)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Define", dict.Define)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(dictIds: dict.Id == 0 ? string.Empty : dict.Id.ToString()); + return ret; + } + /// + /// 保存网站个性化设置 + /// + /// + /// + /// + /// + public override bool SaveSettings(BootstrapDict dict) + { + var ret = false; + string sql = "Update Dicts set Code = @Code where Category = @Category and Name = @Name"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Name", dict.Name)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Code", dict.Code)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Category", dict.Category)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(dictIds: string.Empty); + return ret; + } + /// + /// 获取字典分类名称 + /// + /// + public override IEnumerable RetrieveCategories() + { + return CacheManager.GetOrAdd(RetrieveCategoryDataKey, key => + { + var ret = new List(); + string sql = "select distinct Category from Dicts"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + ret.Add((string)reader[0]); + } + } + return ret; + }); + } + /// + /// + /// + /// + public override string RetrieveWebTitle() + { + var settings = RetrieveDicts(); + return (settings.FirstOrDefault(d => d.Name == "网站标题" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "后台管理系统" }).Code; + } + /// + /// + /// + /// + public override string RetrieveWebFooter() + { + var settings = RetrieveDicts(); + return (settings.FirstOrDefault(d => d.Name == "网站页脚" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "2016 © 通用后台管理系统" }).Code; + } + /// + /// 获得系统中配置的可以使用的网站样式 + /// + /// + public override IEnumerable RetrieveThemes() + { + var data = RetrieveDicts(); + return data.Where(d => d.Category == "网站样式"); + } + /// + /// 获得网站设置中的当前样式 + /// + /// + public override string RetrieveActiveTheme() + { + var data = RetrieveDicts(); + var theme = data.Where(d => d.Name == "使用样式" && d.Category == "当前样式" && d.Define == 0).FirstOrDefault(); + return theme == null ? string.Empty : (theme.Code.Equals("site.css", StringComparison.OrdinalIgnoreCase) ? string.Empty : theme.Code); + } + /// + /// 获取头像路径 + /// + /// + public override BootstrapDict RetrieveIconFolderPath() + { + var data = RetrieveDicts(); + return data.FirstOrDefault(d => d.Name == "头像路径" && d.Category == "头像地址" && d.Define == 0) ?? new BootstrapDict() { Code = "~/images/uploader/" }; + } + /// + /// 获得默认的前台首页地址,默认为~/Home/Index + /// + /// + public override string RetrieveHomeUrl() + { + var settings = RetrieveDicts(); + return (settings.FirstOrDefault(d => d.Name == "前台首页" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "~/Home/Index" }).Code; + } + /// + /// + /// + /// + public override IEnumerable> RetrieveApps() + { + var settings = RetrieveDicts(); + return settings.Where(d => d.Category == "应用程序" && d.Define == 0).Select(d => new KeyValuePair(d.Code, d.Name)).OrderBy(d => d.Key); + } + } +} diff --git a/Bootstrap.DataAccess/ExceptionHelper.cs b/Bootstrap.DataAccess.SQLServer/Exceptions.cs similarity index 60% rename from Bootstrap.DataAccess/ExceptionHelper.cs rename to Bootstrap.DataAccess.SQLServer/Exceptions.cs index 2b6191a1..3c25f158 100644 --- a/Bootstrap.DataAccess/ExceptionHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/Exceptions.cs @@ -1,99 +1,95 @@ -using Longbow.Cache; -using Longbow.Configuration; -using Longbow.Data; -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Data; -using System.Data.Common; - -namespace Bootstrap.DataAccess -{ - /// - /// - /// - public static class ExceptionHelper - { - /// - /// - /// - private static readonly string RetrieveExceptionsDataKey = "ExceptionHelper-RetrieveExceptions"; - /// - /// - /// - /// - /// - /// - public static void Log(Exception ex, NameValueCollection additionalInfo) - { - if (additionalInfo == null) - { - additionalInfo = new NameValueCollection - { - ["UserId"] = null, - ["UserIp"] = null, - ["ErrorPage"] = null - }; - } - var errorPage = additionalInfo["ErrorPage"] ?? (nameof(ex).Length > 50 ? nameof(ex).Substring(0, 50) : nameof(ex)); - var sql = "insert into Exceptions (AppDomainName, ErrorPage, UserID, UserIp, ExceptionType, Message, StackTrace, LogTime) values (@AppDomainName, @ErrorPage, @UserID, @UserIp, @ExceptionType, @Message, @StackTrace, GetDate())"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@AppDomainName", AppDomain.CurrentDomain.FriendlyName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ErrorPage", errorPage)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@UserID", DBAccessFactory.ToDBValue(additionalInfo["UserId"]))); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@UserIp", DBAccessFactory.ToDBValue(additionalInfo["UserIp"]))); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ExceptionType", ex.GetType().FullName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Message", ex.Message)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@StackTrace", DBAccessFactory.ToDBValue(ex.StackTrace))); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd); - CacheManager.Clear(RetrieveExceptionsDataKey); - ClearExceptions(); - } - } - /// - /// - /// - private static void ClearExceptions() - { - System.Threading.Tasks.Task.Run(() => - { - string sql = $"delete from Exceptions where LogTime < DATEADD(MONTH, -{ConfigurationManager.AppSettings["KeepExceptionsPeriod"]}, GETDATE())"; - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd); - }); - } - /// - /// 查询一周内所有异常 - /// - /// - public static IEnumerable RetrieveExceptions() - { - return CacheManager.GetOrAdd(RetrieveExceptionsDataKey, key => - { - string sql = "select * from Exceptions where DATEDIFF(Week, LogTime, GETDATE()) = 0 order by LogTime desc"; - List exceptions = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - exceptions.Add(new Exceptions() - { - Id = (int)reader[0], - AppDomainName = (string)reader[1], - ErrorPage = reader.IsDBNull(2) ? string.Empty : (string)reader[2], - UserId = reader.IsDBNull(3) ? string.Empty : (string)reader[3], - UserIp = reader.IsDBNull(4) ? string.Empty : (string)reader[4], - ExceptionType = (string)reader[5], - Message = (string)reader[6], - StackTrace = (string)reader[7], - LogTime = (DateTime)reader[8], - }); - } - } - return exceptions; - }); - } - } -} +using Longbow.Cache; +using Longbow.Configuration; +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Data.Common; + +namespace Bootstrap.DataAccess.SQLServer +{ + /// + /// + /// + public class Exceptions : Bootstrap.DataAccess.Exceptions + { + /// + /// + /// + /// + /// + /// + public override void Log(Exception ex, NameValueCollection additionalInfo) + { + if (additionalInfo == null) + { + additionalInfo = new NameValueCollection + { + ["UserId"] = null, + ["UserIp"] = null, + ["ErrorPage"] = null + }; + } + var errorPage = additionalInfo["ErrorPage"] ?? (nameof(ex).Length > 50 ? nameof(ex).Substring(0, 50) : nameof(ex)); + var sql = "insert into Exceptions (AppDomainName, ErrorPage, UserID, UserIp, ExceptionType, Message, StackTrace, LogTime) values (@AppDomainName, @ErrorPage, @UserID, @UserIp, @ExceptionType, @Message, @StackTrace, GetDate())"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@AppDomainName", AppDomain.CurrentDomain.FriendlyName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ErrorPage", errorPage)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", DbAccessFactory.ToDBValue(additionalInfo["UserId"]))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserIp", DbAccessFactory.ToDBValue(additionalInfo["UserIp"]))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ExceptionType", ex.GetType().FullName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Message", ex.Message)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@StackTrace", DbAccessFactory.ToDBValue(ex.StackTrace))); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd); + CacheManager.Clear(RetrieveExceptionsDataKey); + ClearExceptions(); + } + } + /// + /// + /// + private static void ClearExceptions() + { + System.Threading.Tasks.Task.Run(() => + { + string sql = $"delete from Exceptions where LogTime < DATEADD(MONTH, -{ConfigurationManager.AppSettings["KeepExceptionsPeriod"]}, GETDATE())"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd); + }); + } + /// + /// 查询一周内所有异常 + /// + /// + public override IEnumerable RetrieveExceptions() + { + return CacheManager.GetOrAdd(RetrieveExceptionsDataKey, key => + { + string sql = "select * from Exceptions where DATEDIFF(Week, LogTime, GETDATE()) = 0 order by LogTime desc"; + List exceptions = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + exceptions.Add(new Exceptions() + { + Id = (int)reader[0], + AppDomainName = (string)reader[1], + ErrorPage = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + UserId = reader.IsDBNull(3) ? string.Empty : (string)reader[3], + UserIp = reader.IsDBNull(4) ? string.Empty : (string)reader[4], + ExceptionType = (string)reader[5], + Message = (string)reader[6], + StackTrace = (string)reader[7], + LogTime = (DateTime)reader[8], + }); + } + } + return exceptions; + }); + } + } +} diff --git a/Bootstrap.DataAccess/GroupHelper.cs b/Bootstrap.DataAccess.SQLServer/Group.cs similarity index 70% rename from Bootstrap.DataAccess/GroupHelper.cs rename to Bootstrap.DataAccess.SQLServer/Group.cs index cf261f13..2ebbdf3c 100644 --- a/Bootstrap.DataAccess/GroupHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/Group.cs @@ -1,242 +1,239 @@ -using Longbow.Cache; -using Longbow.Data; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Data.SqlClient; -using System.Linq; - -namespace Bootstrap.DataAccess -{ - /// - /// author:liuchun - /// date:2016.10.22 - /// - public static class GroupHelper - { - internal const string RetrieveGroupsDataKey = "GroupHelper-RetrieveGroups"; - internal const string RetrieveGroupsByUserIdDataKey = "GroupHelper-RetrieveGroupsByUserId"; - internal const string RetrieveGroupsByRoleIdDataKey = "GroupHelper-RetrieveGroupsByRoleId"; - /// - /// 查询所有群组信息 - /// - /// - /// - public static IEnumerable RetrieveGroups(int id = 0) - { - var ret = CacheManager.GetOrAdd(RetrieveGroupsDataKey, key => - { - string sql = "select * from Groups"; - List groups = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - groups.Add(new Group() - { - Id = (int)reader[0], - GroupName = (string)reader[1], - Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2] - }); - } - } - return groups; - }); - return id == 0 ? ret : ret.Where(t => id == t.Id); - } - /// - /// 删除群组信息 - /// - /// - public static bool DeleteGroup(IEnumerable value) - { - bool ret = false; - var ids = string.Join(",", value); - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteGroups")) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ids", ids)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == -1; - } - CacheCleanUtility.ClearCache(groupIds: value); - return ret; - } - /// - /// 保存新建/更新的群组信息 - /// - /// - /// - public static bool SaveGroup(Group p) - { - bool ret = false; - if (p.GroupName.Length > 50) p.GroupName = p.GroupName.Substring(0, 50); - if (!string.IsNullOrEmpty(p.Description) && p.Description.Length > 500) p.Description = p.Description.Substring(0, 500); - string sql = p.Id == 0 ? - "Insert Into Groups (GroupName, Description) Values (@GroupName, @Description)" : - "Update Groups set GroupName = @GroupName, Description = @Description where ID = @ID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ID", p.Id)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@GroupName", p.GroupName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Description", DBAccessFactory.ToDBValue(p.Description))); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - } - CacheCleanUtility.ClearCache(groupIds: p.Id == 0 ? new List() : new List() { p.Id }); - return ret; - } - /// - /// 根据用户查询部门信息 - /// - /// - /// - public static IEnumerable RetrieveGroupsByUserId(int userId) - { - string key = string.Format("{0}-{1}", RetrieveGroupsByUserIdDataKey, userId); - var ret = CacheManager.GetOrAdd(key, k => - { - string sql = "select g.ID,g.GroupName,g.[Description],case ug.GroupID when g.ID then 'checked' else '' end [status] from Groups g left join UserGroup ug on g.ID=ug.GroupID and UserID=@UserID"; - List groups = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@UserID", userId)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - groups.Add(new Group() - { - Id = (int)reader[0], - GroupName = (string)reader[1], - Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], - Checked = (string)reader[3] - }); - } - } - return groups; - }, RetrieveGroupsByUserIdDataKey); - return ret; - } - /// - /// 保存用户部门关系 - /// - /// - /// - /// - public static bool SaveGroupsByUserId(int id, IEnumerable groupIds) - { - var ret = false; - DataTable dt = new DataTable(); - dt.Columns.Add("UserID", typeof(int)); - dt.Columns.Add("GroupID", typeof(int)); - //判断用户是否选定角色 - groupIds.ToList().ForEach(groupId => dt.Rows.Add(id, groupId)); - using (TransactionPackage transaction = DBAccessManager.SqlDBAccess.BeginTransaction()) - { - try - { - //删除用户部门表中该用户所有的部门关系 - string sql = "delete from UserGroup where UserID=@UserID;"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@UserID", id)); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd, transaction); - - // insert batch data into config table - using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) - { - bulk.BatchSize = 1000; - bulk.DestinationTableName = "UserGroup"; - bulk.ColumnMappings.Add("UserID", "UserID"); - bulk.ColumnMappings.Add("GroupID", "GroupID"); - bulk.WriteToServer(dt); - transaction.CommitTransaction(); - } - } - CacheCleanUtility.ClearCache(groupIds: groupIds, userIds: new List() { id }); - ret = true; - } - catch (Exception ex) - { - transaction.RollbackTransaction(); - throw ex; - } - } - return ret; - } - /// - /// 根据角色ID指派部门 - /// - /// - /// - public static IEnumerable RetrieveGroupsByRoleId(int roleId) - { - string k = string.Format("{0}-{1}", RetrieveGroupsByRoleIdDataKey, roleId); - return CacheManager.GetOrAdd(k, key => - { - List groups = new List(); - string sql = "select g.ID,g.GroupName,g.[Description],case rg.GroupID when g.ID then 'checked' else '' end [status] from Groups g left join RoleGroup rg on g.ID=rg.GroupID and RoleID=@RoleID"; - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@RoleID", roleId)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - groups.Add(new Group() - { - Id = (int)reader[0], - GroupName = (string)reader[1], - Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], - Checked = (string)reader[3] - }); - } - } - return groups; - }, RetrieveGroupsByRoleIdDataKey); - } - /// - /// 根据角色ID以及选定的部门ID,保到角色部门表 - /// - /// - /// - /// - public static bool SaveGroupsByRoleId(int id, IEnumerable groupIds) - { - bool ret = false; - DataTable dt = new DataTable(); - dt.Columns.Add("GroupID", typeof(int)); - dt.Columns.Add("RoleID", typeof(int)); - groupIds.ToList().ForEach(groupId => dt.Rows.Add(groupId, id)); - using (TransactionPackage transaction = DBAccessManager.SqlDBAccess.BeginTransaction()) - { - try - { - //删除角色部门表该角色所有的部门 - string sql = "delete from RoleGroup where RoleID=@RoleID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@RoleID", id)); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd, transaction); - //批插入角色部门表 - using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) - { - bulk.BatchSize = 1000; - bulk.ColumnMappings.Add("GroupID", "GroupID"); - bulk.ColumnMappings.Add("RoleID", "RoleID"); - bulk.DestinationTableName = "RoleGroup"; - bulk.WriteToServer(dt); - transaction.CommitTransaction(); - } - } - CacheCleanUtility.ClearCache(groupIds: groupIds, roleIds: new List() { id }); - ret = true; - } - catch (Exception ex) - { - transaction.RollbackTransaction(); - throw ex; - } - } - return ret; - } - } -} +using Bootstrap.DataAccess; +using Longbow.Cache; +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLServer +{ + /// + /// + /// + public class Group : Bootstrap.DataAccess.Group + { + /// + /// 查询所有群组信息 + /// + /// + /// + public override IEnumerable RetrieveGroups(int id = 0) + { + var ret = CacheManager.GetOrAdd(RetrieveGroupsDataKey, key => + { + string sql = "select * from Groups"; + List groups = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + groups.Add(new Group() + { + Id = (int)reader[0], + GroupName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2] + }); + } + } + return groups; + }); + return id == 0 ? ret : ret.Where(t => id == t.Id); + } + /// + /// 删除群组信息 + /// + /// + public override bool DeleteGroup(IEnumerable value) + { + bool ret = false; + var ids = string.Join(",", value); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteGroups")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ids", ids)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + } + CacheCleanUtility.ClearCache(groupIds: value); + return ret; + } + /// + /// 保存新建/更新的群组信息 + /// + /// + /// + public override bool SaveGroup(Bootstrap.DataAccess.Group p) + { + bool ret = false; + if (p.GroupName.Length > 50) p.GroupName = p.GroupName.Substring(0, 50); + if (!string.IsNullOrEmpty(p.Description) && p.Description.Length > 500) p.Description = p.Description.Substring(0, 500); + string sql = p.Id == 0 ? + "Insert Into Groups (GroupName, Description) Values (@GroupName, @Description)" : + "Update Groups set GroupName = @GroupName, Description = @Description where ID = @ID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ID", p.Id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupName", p.GroupName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Description", DbAccessFactory.ToDBValue(p.Description))); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(groupIds: p.Id == 0 ? new List() : new List() { p.Id }); + return ret; + } + /// + /// 根据用户查询部门信息 + /// + /// + /// + public override IEnumerable RetrieveGroupsByUserId(int userId) + { + string key = string.Format("{0}-{1}", RetrieveGroupsByUserIdDataKey, userId); + var ret = CacheManager.GetOrAdd(key, k => + { + string sql = "select g.ID,g.GroupName,g.[Description],case ug.GroupID when g.ID then 'checked' else '' end [status] from Groups g left join UserGroup ug on g.ID=ug.GroupID and UserID=@UserID"; + List groups = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", userId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + groups.Add(new Group() + { + Id = (int)reader[0], + GroupName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return groups; + }, RetrieveGroupsByUserIdDataKey); + return ret; + } + /// + /// 保存用户部门关系 + /// + /// + /// + /// + public override bool SaveGroupsByUserId(int id, IEnumerable groupIds) + { + var ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("UserID", typeof(int)); + dt.Columns.Add("GroupID", typeof(int)); + //判断用户是否选定角色 + groupIds.ToList().ForEach(groupId => dt.Rows.Add(id, groupId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除用户部门表中该用户所有的部门关系 + string sql = "delete from UserGroup where UserID=@UserID;"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + + // insert batch data into config table + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.BatchSize = 1000; + bulk.DestinationTableName = "UserGroup"; + bulk.ColumnMappings.Add("UserID", "UserID"); + bulk.ColumnMappings.Add("GroupID", "GroupID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(groupIds: groupIds, userIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 根据角色ID指派部门 + /// + /// + /// + public override IEnumerable RetrieveGroupsByRoleId(int roleId) + { + string k = string.Format("{0}-{1}", RetrieveGroupsByRoleIdDataKey, roleId); + return CacheManager.GetOrAdd(k, key => + { + List groups = new List(); + string sql = "select g.ID,g.GroupName,g.[Description],case rg.GroupID when g.ID then 'checked' else '' end [status] from Groups g left join RoleGroup rg on g.ID=rg.GroupID and RoleID=@RoleID"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", roleId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + groups.Add(new Group() + { + Id = (int)reader[0], + GroupName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return groups; + }, RetrieveGroupsByRoleIdDataKey); + } + /// + /// 根据角色ID以及选定的部门ID,保到角色部门表 + /// + /// + /// + /// + public override bool SaveGroupsByRoleId(int id, IEnumerable groupIds) + { + bool ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("GroupID", typeof(int)); + dt.Columns.Add("RoleID", typeof(int)); + groupIds.ToList().ForEach(groupId => dt.Rows.Add(groupId, id)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除角色部门表该角色所有的部门 + string sql = "delete from RoleGroup where RoleID=@RoleID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + //批插入角色部门表 + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.BatchSize = 1000; + bulk.ColumnMappings.Add("GroupID", "GroupID"); + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.DestinationTableName = "RoleGroup"; + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(groupIds: groupIds, roleIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + } +} diff --git a/Bootstrap.DataAccess/LogHelper.cs b/Bootstrap.DataAccess.SQLServer/Log.cs similarity index 62% rename from Bootstrap.DataAccess/LogHelper.cs rename to Bootstrap.DataAccess.SQLServer/Log.cs index d46bcd5f..a6b542fd 100644 --- a/Bootstrap.DataAccess/LogHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/Log.cs @@ -1,84 +1,86 @@ -using Longbow.Cache; -using Longbow.Configuration; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Linq; - -namespace Bootstrap.DataAccess -{ - public static class LogHelper - { - private const string RetrieveLogsDataKey = "LogHelper-RetrieveLogs"; - /// - /// 查询所有日志信息 - /// - /// - /// - public static IEnumerable RetrieveLogs(string tId = null) - { - var ret = CacheManager.GetOrAdd(RetrieveLogsDataKey, key => - { - string sql = "select * from Logs where DATEDIFF(Week, LogTime, GETDATE()) = 0"; - List logs = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - logs.Add(new Log() - { - Id = (int)reader[0], - CRUD = (string)reader[1], - UserName = (string)reader[2], - LogTime = (DateTime)reader[3], - ClientIp = (string)reader[4], - ClientAgent = (string)reader[5], - RequestUrl = (string)reader[6] - }); - } - } - return logs; - }); - return string.IsNullOrEmpty(tId) ? ret : ret.Where(t => tId.Equals(t.Id.ToString(), StringComparison.OrdinalIgnoreCase)); - } - /// - /// 删除日志信息 - /// - /// - /// - public static void DeleteLogAsync() - { - System.Threading.Tasks.Task.Run(() => - { - string sql = $"delete from Logs where LogTime < DATEADD(MONTH, -{ConfigurationManager.AppSettings["KeepLogsPeriod"]}, GETDATE())"; - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd); - }); - } - /// - /// 保存新增的日志信息 - /// - /// - /// - public static bool SaveLog(Log p) - { - if (p == null) throw new ArgumentNullException("p"); - bool ret = false; - string sql = "Insert Into Logs (CRUD, UserName, LogTime, ClientIp, ClientAgent, RequestUrl) Values (@CRUD, @UserName, GetDate(), @ClientIp, @ClientAgent, @RequestUrl)"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@CRUD", p.CRUD)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@UserName", p.UserName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ClientIp", p.ClientIp)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ClientAgent", p.ClientAgent)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@RequestUrl", p.RequestUrl)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - } - CacheManager.Clear(RetrieveLogsDataKey); - DeleteLogAsync(); - return ret; - } - } -} +using Longbow.Cache; +using Longbow.Configuration; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLServer +{ + /// + /// + /// + public class Log : Bootstrap.DataAccess.Log + { + /// + /// 查询所有日志信息 + /// + /// + /// + public override IEnumerable RetrieveLogs(string tId = null) + { + var ret = CacheManager.GetOrAdd(RetrieveLogsDataKey, key => + { + string sql = "select * from Logs where DATEDIFF(Week, LogTime, GETDATE()) = 0"; + List logs = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + logs.Add(new Log() + { + Id = (int)reader[0], + CRUD = (string)reader[1], + UserName = (string)reader[2], + LogTime = (DateTime)reader[3], + ClientIp = (string)reader[4], + ClientAgent = (string)reader[5], + RequestUrl = (string)reader[6] + }); + } + } + return logs; + }); + return string.IsNullOrEmpty(tId) ? ret : ret.Where(t => tId.Equals(t.Id.ToString(), StringComparison.OrdinalIgnoreCase)); + } + /// + /// 删除日志信息 + /// + /// + /// + private void DeleteLogAsync() + { + System.Threading.Tasks.Task.Run(() => + { + string sql = $"delete from Logs where LogTime < DATEADD(MONTH, -{ConfigurationManager.AppSettings["KeepLogsPeriod"]}, GETDATE())"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd); + }); + } + /// + /// 保存新增的日志信息 + /// + /// + /// + public override bool SaveLog(Bootstrap.DataAccess.Log p) + { + if (p == null) throw new ArgumentNullException("p"); + bool ret = false; + string sql = "Insert Into Logs (CRUD, UserName, LogTime, ClientIp, ClientAgent, RequestUrl) Values (@CRUD, @UserName, GetDate(), @ClientIp, @ClientAgent, @RequestUrl)"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@CRUD", p.CRUD)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserName", p.UserName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ClientIp", p.ClientIp)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ClientAgent", p.ClientAgent)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RequestUrl", p.RequestUrl)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheManager.Clear(RetrieveLogsDataKey); + DeleteLogAsync(); + return ret; + } + } +} diff --git a/Bootstrap.DataAccess/MenuHelper.cs b/Bootstrap.DataAccess.SQLServer/Menu.cs similarity index 53% rename from Bootstrap.DataAccess/MenuHelper.cs rename to Bootstrap.DataAccess.SQLServer/Menu.cs index 4f08dc74..bd8d0d10 100644 --- a/Bootstrap.DataAccess/MenuHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/Menu.cs @@ -1,145 +1,169 @@ -using Bootstrap.Security; -using Longbow.Cache; -using Longbow.Data; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Data.SqlClient; -using System.Linq; - -namespace Bootstrap.DataAccess -{ - /// - /// - /// - public static class MenuHelper - { - /// - /// - /// - internal const string RetrieveMenusByRoleIdDataKey = "MenuHelper-RetrieveMenusByRoleId"; - /// - /// 删除菜单信息 - /// - /// - public static bool DeleteMenu(IEnumerable value) - { - bool ret = false; - var ids = string.Join(",", value); - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteMenus")) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ids", ids)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == value.Count(); - } - CacheCleanUtility.ClearCache(menuIds: value); - return ret; - } - /// - /// 保存新建/更新的菜单信息 - /// - /// - /// - public static bool SaveMenu(BootstrapMenu p) - { - if (string.IsNullOrEmpty(p.Name)) return false; - bool ret = false; - if (p.Name.Length > 50) p.Name = p.Name.Substring(0, 50); - if (p.Icon != null && p.Icon.Length > 50) p.Icon = p.Icon.Substring(0, 50); - if (p.Url != null && p.Url.Length > 4000) p.Url = p.Url.Substring(0, 4000); - string sql = p.Id == 0 ? - "Insert Into Navigations (ParentId, Name, [Order], Icon, Url, Category, Target, IsResource, [Application]) Values (@ParentId, @Name, @Order, @Icon, @Url, @Category, @Target, @IsResource, @ApplicationCode)" : - "Update Navigations set ParentId = @ParentId, Name = @Name, [Order] = @Order, Icon = @Icon, Url = @Url, Category = @Category, Target = @Target, IsResource = @IsResource, Application = @ApplicationCode where ID = @ID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ID", p.Id)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ParentId", p.ParentId)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Name", p.Name)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Order", p.Order)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Icon", DBAccessFactory.ToDBValue(p.Icon))); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Url", DBAccessFactory.ToDBValue(p.Url))); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Category", p.Category)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Target", p.Target)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@IsResource", p.IsResource)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ApplicationCode", p.ApplicationCode)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - } - CacheCleanUtility.ClearCache(menuIds: p.Id == 0 ? new List() : new List() { p.Id }); - return ret; - } - - /// - /// 查询某个角色所配置的菜单 - /// - /// - /// - public static IEnumerable RetrieveMenusByRoleId(int roleId) - { - string key = string.Format("{0}-{1}", RetrieveMenusByRoleIdDataKey, roleId); - return CacheManager.GetOrAdd(key, k => - { - var menus = new List(); - string sql = "select NavigationID from NavigationRole where RoleID = @RoleID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@RoleID", roleId)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - menus.Add(new BootstrapMenu() - { - Id = (int)reader[0] - }); - } - } - } - return menus; - }, RetrieveMenusByRoleIdDataKey); - } - /// - /// 通过角色ID保存当前授权菜单 - /// - /// - /// - /// - public static bool SaveMenusByRoleId(int id, IEnumerable menuIds) - { - bool ret = false; - DataTable dt = new DataTable(); - dt.Columns.Add("RoleID", typeof(int)); - dt.Columns.Add("NavigationID", typeof(int)); - menuIds.ToList().ForEach(menuId => dt.Rows.Add(id, menuId)); - using (TransactionPackage transaction = DBAccessManager.SqlDBAccess.BeginTransaction()) - { - try - { - //删除菜单角色表该角色所有的菜单 - string sql = "delete from NavigationRole where RoleID=@RoleID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@RoleID", id)); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd, transaction); - //批插入菜单角色表 - using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) - { - bulk.DestinationTableName = "NavigationRole"; - bulk.ColumnMappings.Add("RoleID", "RoleID"); - bulk.ColumnMappings.Add("NavigationID", "NavigationID"); - bulk.WriteToServer(dt); - transaction.CommitTransaction(); - } - } - CacheCleanUtility.ClearCache(menuIds: menuIds, roleIds: new List() { id }); - ret = true; - } - catch (Exception ex) - { - transaction.RollbackTransaction(); - throw ex; - } - } - return ret; - } - } -} +using Bootstrap.Security; +using Longbow.Cache; +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLServer +{ + /// + /// + /// + public class Menu : Bootstrap.DataAccess.Menu + { + /// + /// 删除菜单信息 + /// + /// + public override bool DeleteMenu(IEnumerable value) + { + bool ret = false; + var ids = string.Join(",", value); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteMenus")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ids", ids)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + } + CacheCleanUtility.ClearCache(menuIds: value); + return ret; + } + /// + /// 保存新建/更新的菜单信息 + /// + /// + /// + public override bool SaveMenu(BootstrapMenu p) + { + if (string.IsNullOrEmpty(p.Name)) return false; + bool ret = false; + if (p.Name.Length > 50) p.Name = p.Name.Substring(0, 50); + if (p.Icon != null && p.Icon.Length > 50) p.Icon = p.Icon.Substring(0, 50); + if (p.Url != null && p.Url.Length > 4000) p.Url = p.Url.Substring(0, 4000); + string sql = p.Id == 0 ? + "Insert Into Navigations (ParentId, Name, [Order], Icon, Url, Category, Target, IsResource, [Application]) Values (@ParentId, @Name, @Order, @Icon, @Url, @Category, @Target, @IsResource, @ApplicationCode)" : + "Update Navigations set ParentId = @ParentId, Name = @Name, [Order] = @Order, Icon = @Icon, Url = @Url, Category = @Category, Target = @Target, IsResource = @IsResource, Application = @ApplicationCode where ID = @ID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ID", p.Id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ParentId", p.ParentId)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Name", p.Name)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Order", p.Order)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Icon", DbAccessFactory.ToDBValue(p.Icon))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Url", DbAccessFactory.ToDBValue(p.Url))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Category", p.Category)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Target", p.Target)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@IsResource", p.IsResource)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ApplicationCode", p.ApplicationCode)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(menuIds: p.Id == 0 ? new List() : new List() { p.Id }); + return ret; + } + + /// + /// 查询某个角色所配置的菜单 + /// + /// + /// + public override IEnumerable RetrieveMenusByRoleId(int roleId) + { + string key = string.Format("{0}-{1}", RetrieveMenusByRoleIdDataKey, roleId); + return CacheManager.GetOrAdd(key, k => + { + var menus = new List(); + string sql = "select NavigationID from NavigationRole where RoleID = @RoleID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", roleId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + menus.Add(new BootstrapMenu() + { + Id = (int)reader[0] + }); + } + } + } + return menus; + }, RetrieveMenusByRoleIdDataKey); + } + /// + /// 通过角色ID保存当前授权菜单 + /// + /// + /// + /// + public override bool SaveMenusByRoleId(int id, IEnumerable menuIds) + { + bool ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("RoleID", typeof(int)); + dt.Columns.Add("NavigationID", typeof(int)); + menuIds.ToList().ForEach(menuId => dt.Rows.Add(id, menuId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除菜单角色表该角色所有的菜单 + string sql = "delete from NavigationRole where RoleID=@RoleID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + //批插入菜单角色表 + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.DestinationTableName = "NavigationRole"; + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.ColumnMappings.Add("NavigationID", "NavigationID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(menuIds: menuIds, roleIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + ///// + ///// + ///// + ///// + ///// + ///// + //public override IEnumerable RetrieveAllMenus(string userName, string activeUrl = null) => RetrieveAllMenus(DBAccessManager.DBAccess, userName, activeUrl); + ///// + ///// + ///// + ///// + ///// + ///// + //public override IEnumerable RetrieveAppMenus(string userName, string activeUrl = null) => RetrieveAppMenus(DBAccessManager.DBAccess, userName, activeUrl); + ///// + ///// + ///// + ///// + ///// + ///// + //public override IEnumerable RetrieveMenusByUserName(string userName, string activeUrl = null) => RetrieveMenusByUserName(DBAccessManager.DBAccess, userName, activeUrl); + ///// + ///// + ///// + ///// + ///// + ///// + //public override IEnumerable RetrieveSystemMenus(string userName, string activeUrl = null) => RetrieveSystemMenus(DBAccessManager.DBAccess, userName, activeUrl); + } +} diff --git a/Bootstrap.DataAccess/MessageHelper.cs b/Bootstrap.DataAccess.SQLServer/Message.cs similarity index 80% rename from Bootstrap.DataAccess/MessageHelper.cs rename to Bootstrap.DataAccess.SQLServer/Message.cs index fdfcd483..c5b58865 100644 --- a/Bootstrap.DataAccess/MessageHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/Message.cs @@ -1,116 +1,114 @@ -using Longbow; -using Longbow.Cache; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Linq; - -namespace Bootstrap.DataAccess -{ - /// - /// - /// - public static class MessageHelper - { - private const string RetrieveMessageDataKey = "MessageHelper-RetrieveMessages"; - /// - /// 所有有关userName所有消息列表 - /// - /// - /// - private static IEnumerable RetrieveMessages(string userName) - { - var messageRet = CacheManager.GetOrAdd(RetrieveMessageDataKey, key => - { - string sql = "select m.*, d.Name, isnull(i.Code + u.Icon, '~/images/uploader/default.jpg'), u.DisplayName from [Messages] m left join Dicts d on m.Label = d.Code and d.Category = N'消息标签' and d.Define = 0 left join Dicts i on i.Category = N'头像地址' and i.Name = N'头像路径' and i.Define = 0 inner join Users u on m.[From] = u.UserName where [To] = @UserName or [From] = @UserName order by m.SendTime desc"; - List messages = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@UserName", userName)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - messages.Add(new Message() - { - Id = (int)reader[0], - Title = (string)reader[1], - Content = (string)reader[2], - From = (string)reader[3], - To = (string)reader[4], - SendTime = LgbConvert.ReadValue(reader[5], DateTime.MinValue), - Status = (string)reader[6], - Mark = (int)reader[7], - IsDelete = (int)reader[8], - Label = (string)reader[9], - LabelName = LgbConvert.ReadValue(reader[10], string.Empty), - FromIcon = (string)reader[11], - FromDisplayName = (string)reader[12] - }); - } - } - return messages; - - }); - return messageRet.OrderByDescending(n => n.SendTime); - } - /// - /// 收件箱 - /// - /// - - public static IEnumerable Inbox(string userName) - { - var messageRet = RetrieveMessages(userName); - return messageRet.Where(n => n.To.Equals(userName, StringComparison.OrdinalIgnoreCase)); - } - /// - /// 发件箱 - /// - /// - /// - public static IEnumerable SendMail(string userName) - { - var messageRet = RetrieveMessages(userName); - return messageRet.Where(n => n.From.Equals(userName, StringComparison.OrdinalIgnoreCase)); - } - /// - /// 垃圾箱 - /// - /// - /// - public static IEnumerable Trash(string userName) - { - var messageRet = RetrieveMessages(userName); - return messageRet.Where(n => n.IsDelete == 1); - } - /// - /// 标旗 - /// - /// - /// - public static IEnumerable Mark(string userName) - { - var messageRet = RetrieveMessages(userName); - return messageRet.Where(n => n.Mark == 1); - } - /// - /// 获取Header处显示的消息列表 - /// - /// - /// - public static IEnumerable RetrieveMessagesHeader(string userName) - { - var messageRet = Inbox(userName); - messageRet.AsParallel().ForAll(n => - { - var ts = DateTime.Now - n.SendTime; - if (ts.TotalMinutes < 5) n.Period = "刚刚"; - else if (ts.Days > 0) n.Period = string.Format("{0}天", ts.Days); - else if (ts.Hours > 0) n.Period = string.Format("{0}小时", ts.Hours); - else if (ts.Minutes > 0) n.Period = string.Format("{0}分钟", ts.Minutes); - }); - return messageRet; - } - } -} +using Longbow; +using Longbow.Cache; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLServer +{ + /// + /// + /// + public class Message : Bootstrap.DataAccess.Message + { + /// + /// 所有有关userName所有消息列表 + /// + /// + /// + private static IEnumerable RetrieveMessages(string userName) + { + var messageRet = CacheManager.GetOrAdd(RetrieveMessageDataKey, key => + { + string sql = "select m.*, d.Name, isnull(i.Code + u.Icon, '~/images/uploader/default.jpg'), u.DisplayName from [Messages] m left join Dicts d on m.Label = d.Code and d.Category = N'消息标签' and d.Define = 0 left join Dicts i on i.Category = N'头像地址' and i.Name = N'头像路径' and i.Define = 0 inner join Users u on m.[From] = u.UserName where [To] = @UserName or [From] = @UserName order by m.SendTime desc"; + List messages = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserName", userName)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + messages.Add(new Message() + { + Id = (int)reader[0], + Title = (string)reader[1], + Content = (string)reader[2], + From = (string)reader[3], + To = (string)reader[4], + SendTime = LgbConvert.ReadValue(reader[5], DateTime.MinValue), + Status = (string)reader[6], + Mark = (int)reader[7], + IsDelete = (int)reader[8], + Label = (string)reader[9], + LabelName = LgbConvert.ReadValue(reader[10], string.Empty), + FromIcon = (string)reader[11], + FromDisplayName = (string)reader[12] + }); + } + } + return messages; + + }); + return messageRet.OrderByDescending(n => n.SendTime); + } + /// + /// 收件箱 + /// + /// + public override IEnumerable Inbox(string userName) + { + var messageRet = RetrieveMessages(userName); + return messageRet.Where(n => n.To.Equals(userName, StringComparison.OrdinalIgnoreCase)); + } + /// + /// 发件箱 + /// + /// + /// + public override IEnumerable SendMail(string userName) + { + var messageRet = RetrieveMessages(userName); + return messageRet.Where(n => n.From.Equals(userName, StringComparison.OrdinalIgnoreCase)); + } + /// + /// 垃圾箱 + /// + /// + /// + public override IEnumerable Trash(string userName) + { + var messageRet = RetrieveMessages(userName); + return messageRet.Where(n => n.IsDelete == 1); + } + /// + /// 标旗 + /// + /// + /// + public override IEnumerable Flag(string userName) + { + var messageRet = RetrieveMessages(userName); + return messageRet.Where(n => n.Mark == 1); + } + /// + /// 获取Header处显示的消息列表 + /// + /// + /// + public override IEnumerable RetrieveMessagesHeader(string userName) + { + var messageRet = Inbox(userName); + messageRet.AsParallel().ForAll(n => + { + var ts = DateTime.Now - n.SendTime; + if (ts.TotalMinutes < 5) n.Period = "刚刚"; + else if (ts.Days > 0) n.Period = string.Format("{0}天", ts.Days); + else if (ts.Hours > 0) n.Period = string.Format("{0}小时", ts.Hours); + else if (ts.Minutes > 0) n.Period = string.Format("{0}分钟", ts.Minutes); + }); + return messageRet; + } + } +} diff --git a/Bootstrap.DataAccess/RoleHelper.cs b/Bootstrap.DataAccess.SQLServer/Role.cs similarity index 72% rename from Bootstrap.DataAccess/RoleHelper.cs rename to Bootstrap.DataAccess.SQLServer/Role.cs index a25ee79c..acc45856 100644 --- a/Bootstrap.DataAccess/RoleHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/Role.cs @@ -1,322 +1,318 @@ -using Longbow.Cache; -using Longbow.Data; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Data.SqlClient; -using System.Linq; - -namespace Bootstrap.DataAccess -{ - /// - /// - /// - public static class RoleHelper - { - internal const string RetrieveRolesDataKey = "RoleHelper-RetrieveRoles"; - internal const string RetrieveRolesByUserIdDataKey = "RoleHelper-RetrieveRolesByUserId"; - internal const string RetrieveRolesByMenuIdDataKey = "RoleHelper-RetrieveRolesByMenuId"; - internal const string RetrieveRolesByGroupIdDataKey = "RoleHelper-RetrieveRolesByGroupId"; - /// - /// 查询所有角色 - /// - /// - /// - public static IEnumerable RetrieveRoles(int id = 0) - { - var ret = CacheManager.GetOrAdd(RetrieveRolesDataKey, key => - { - string sql = "select * from Roles"; - List roles = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - roles.Add(new Role() - { - Id = (int)reader[0], - RoleName = (string)reader[1], - Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2] - }); - } - } - return roles; - }); - return id == 0 ? ret : ret.Where(t => id == t.Id); - } - /// - /// 保存用户角色关系 - /// - /// - /// - /// - public static bool SaveRolesByUserId(int id, IEnumerable roleIds) - { - var ret = false; - DataTable dt = new DataTable(); - dt.Columns.Add("UserID", typeof(int)); - dt.Columns.Add("RoleID", typeof(int)); - //判断用户是否选定角色 - roleIds.ToList().ForEach(roleId => dt.Rows.Add(id, roleId)); - using (TransactionPackage transaction = DBAccessManager.SqlDBAccess.BeginTransaction()) - { - try - { - // delete user from config table - string sql = "delete from UserRole where UserID = @UserID;"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@UserID", id)); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd, transaction); - if (dt.Rows.Count > 0) - { - // insert batch data into config table - using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) - { - bulk.DestinationTableName = "UserRole"; - bulk.ColumnMappings.Add("UserID", "UserID"); - bulk.ColumnMappings.Add("RoleID", "RoleID"); - bulk.WriteToServer(dt); - } - } - transaction.CommitTransaction(); - } - CacheCleanUtility.ClearCache(userIds: new List() { id }, roleIds: roleIds); - ret = true; - } - catch (Exception ex) - { - transaction.RollbackTransaction(); - throw ex; - } - } - return ret; - } - /// - /// 查询某个用户所拥有的角色 - /// - /// - public static IEnumerable RetrieveRolesByUserId(int userId) - { - string key = string.Format("{0}-{1}", RetrieveRolesByUserIdDataKey, userId); - return CacheManager.GetOrAdd(key, k => - { - List roles = new List(); - string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join UserRole ur on r.ID = ur.RoleID and UserID = @UserID"; - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@UserID", userId)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - roles.Add(new Role() - { - Id = (int)reader[0], - RoleName = (string)reader[1], - Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], - Checked = (string)reader[3] - }); - } - } - return roles; - }, RetrieveRolesByUserIdDataKey); - } - /// - /// 删除角色表 - /// - /// - public static bool DeleteRole(IEnumerable value) - { - bool ret = false; - var ids = string.Join(",", value); - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteRoles")) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ids", ids)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == -1; - } - CacheCleanUtility.ClearCache(roleIds: value); - return ret; - } - /// - /// 保存新建/更新的角色信息 - /// - /// - /// - public static bool SaveRole(Role p) - { - bool ret = false; - if (!string.IsNullOrEmpty(p.RoleName) && p.RoleName.Length > 50) p.RoleName = p.RoleName.Substring(0, 50); - if (!string.IsNullOrEmpty(p.Description) && p.Description.Length > 50) p.Description = p.Description.Substring(0, 500); - string sql = p.Id == 0 ? - "Insert Into Roles (RoleName, Description) Values (@RoleName, @Description)" : - "Update Roles set RoleName = @RoleName, Description = @Description where ID = @ID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ID", p.Id)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@RoleName", p.RoleName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Description", DBAccessFactory.ToDBValue(p.Description))); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - } - CacheCleanUtility.ClearCache(roleIds: p.Id == 0 ? new List() : new List { p.Id }); - return ret; - } - /// - /// 查询某个菜单所拥有的角色 - /// - /// - /// - public static IEnumerable RetrieveRolesByMenuId(int menuId) - { - string key = string.Format("{0}-{1}", RetrieveRolesByMenuIdDataKey, menuId); - var ret = CacheManager.GetOrAdd(key, k => - { - string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join NavigationRole ur on r.ID = ur.RoleID and NavigationID = @NavigationID"; - List roles = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@NavigationID", menuId)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - roles.Add(new Role() - { - Id = (int)reader[0], - RoleName = (string)reader[1], - Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], - Checked = (string)reader[3] - }); - } - } - return roles; - }, RetrieveRolesByMenuIdDataKey); - return ret; - } - /// - /// - /// - /// - /// - /// - public static bool SavaRolesByMenuId(int id, IEnumerable roleIds) - { - var ret = false; - DataTable dt = new DataTable(); - dt.Columns.Add("NavigationID", typeof(int)); - dt.Columns.Add("RoleID", typeof(int)); - //判断用户是否选定角色 - roleIds.ToList().ForEach(roleId => dt.Rows.Add(id, roleId)); - using (TransactionPackage transaction = DBAccessManager.SqlDBAccess.BeginTransaction()) - { - try - { - // delete role from config table - string sql = "delete from NavigationRole where NavigationID=@NavigationID;"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@NavigationID", id)); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd, transaction); - - // insert batch data into config table - using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) - { - bulk.BatchSize = 1000; - bulk.DestinationTableName = "NavigationRole"; - bulk.ColumnMappings.Add("NavigationID", "NavigationID"); - bulk.ColumnMappings.Add("RoleID", "RoleID"); - bulk.WriteToServer(dt); - transaction.CommitTransaction(); - } - } - CacheCleanUtility.ClearCache(roleIds: roleIds, menuIds: new List() { id }); - ret = true; - } - catch (Exception ex) - { - transaction.RollbackTransaction(); - throw ex; - } - } - return ret; - } - /// - /// 根据GroupId查询和该Group有关的所有Roles - /// - /// - /// - public static IEnumerable RetrieveRolesByGroupId(int groupId) - { - string key = string.Format("{0}-{1}", RetrieveRolesByGroupIdDataKey, groupId); - return CacheManager.GetOrAdd(key, k => - { - List roles = new List(); - string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join RoleGroup ur on r.ID = ur.RoleID and GroupID = @GroupID"; - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@GroupID", groupId)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - roles.Add(new Role() - { - Id = (int)reader[0], - RoleName = (string)reader[1], - Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], - Checked = (string)reader[3] - }); - } - } - return roles; - }, RetrieveRolesByGroupIdDataKey); - } - - /// - /// 根据GroupId更新Roles信息,删除旧的Roles信息,插入新的Roles信息 - /// - /// - /// - /// - public static bool SaveRolesByGroupId(int id, IEnumerable roleIds) - { - var ret = false; - //构造表格 - DataTable dt = new DataTable(); - dt.Columns.Add("RoleID", typeof(int)); - dt.Columns.Add("GroupID", typeof(int)); - roleIds.ToList().ForEach(roleId => dt.Rows.Add(roleId, id)); - using (TransactionPackage transaction = DBAccessManager.SqlDBAccess.BeginTransaction()) - { - try - { - // delete user from config table - string sql = "delete from RoleGroup where GroupID=@GroupID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@GroupID", id)); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd, transaction); - - // insert batch data into config table - using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) - { - bulk.BatchSize = 1000; - bulk.DestinationTableName = "RoleGroup"; - bulk.ColumnMappings.Add("RoleID", "RoleID"); - bulk.ColumnMappings.Add("GroupID", "GroupID"); - bulk.WriteToServer(dt); - transaction.CommitTransaction(); - } - } - CacheCleanUtility.ClearCache(roleIds: roleIds, groupIds: new List() { id }); - ret = true; - } - catch (Exception ex) - { - transaction.RollbackTransaction(); - throw ex; - } - } - return ret; - } - } +using Longbow.Cache; +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLServer +{ + /// + /// + /// + public class Role : Bootstrap.DataAccess.Role + { + /// + /// 查询所有角色 + /// + /// + /// + public override IEnumerable RetrieveRoles(int id = 0) + { + var ret = CacheManager.GetOrAdd(RetrieveRolesDataKey, key => + { + string sql = "select * from Roles"; + var roles = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + roles.Add(new Role() + { + Id = (int)reader[0], + RoleName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2] + }); + } + } + return roles; + }); + return id == 0 ? ret : ret.Where(t => id == t.Id); + } + /// + /// 保存用户角色关系 + /// + /// + /// + /// + public override bool SaveRolesByUserId(int id, IEnumerable roleIds) + { + var ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("UserID", typeof(int)); + dt.Columns.Add("RoleID", typeof(int)); + //判断用户是否选定角色 + roleIds.ToList().ForEach(roleId => dt.Rows.Add(id, roleId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + // delete user from config table + string sql = "delete from UserRole where UserID = @UserID;"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + if (dt.Rows.Count > 0) + { + // insert batch data into config table + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.DestinationTableName = "UserRole"; + bulk.ColumnMappings.Add("UserID", "UserID"); + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.WriteToServer(dt); + } + } + transaction.CommitTransaction(); + } + CacheCleanUtility.ClearCache(userIds: new List() { id }, roleIds: roleIds); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 查询某个用户所拥有的角色 + /// + /// + public override IEnumerable RetrieveRolesByUserId(int userId) + { + string key = string.Format("{0}-{1}", RetrieveRolesByUserIdDataKey, userId); + return CacheManager.GetOrAdd(key, k => + { + List roles = new List(); + string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join UserRole ur on r.ID = ur.RoleID and UserID = @UserID"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", userId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + roles.Add(new Role() + { + Id = (int)reader[0], + RoleName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return roles; + }, RetrieveRolesByUserIdDataKey); + } + /// + /// 删除角色表 + /// + /// + public override bool DeleteRole(IEnumerable value) + { + bool ret = false; + var ids = string.Join(",", value); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteRoles")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ids", ids)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + } + CacheCleanUtility.ClearCache(roleIds: value); + return ret; + } + /// + /// 保存新建/更新的角色信息 + /// + /// + /// + public override bool SaveRole(Bootstrap.DataAccess.Role p) + { + bool ret = false; + if (!string.IsNullOrEmpty(p.RoleName) && p.RoleName.Length > 50) p.RoleName = p.RoleName.Substring(0, 50); + if (!string.IsNullOrEmpty(p.Description) && p.Description.Length > 50) p.Description = p.Description.Substring(0, 500); + string sql = p.Id == 0 ? + "Insert Into Roles (RoleName, Description) Values (@RoleName, @Description)" : + "Update Roles set RoleName = @RoleName, Description = @Description where ID = @ID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ID", p.Id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleName", p.RoleName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Description", DbAccessFactory.ToDBValue(p.Description))); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(roleIds: p.Id == 0 ? new List() : new List { p.Id }); + return ret; + } + /// + /// 查询某个菜单所拥有的角色 + /// + /// + /// + public override IEnumerable RetrieveRolesByMenuId(int menuId) + { + string key = string.Format("{0}-{1}", RetrieveRolesByMenuIdDataKey, menuId); + var ret = CacheManager.GetOrAdd(key, k => + { + string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join NavigationRole ur on r.ID = ur.RoleID and NavigationID = @NavigationID"; + List roles = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@NavigationID", menuId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + roles.Add(new Role() + { + Id = (int)reader[0], + RoleName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return roles; + }, RetrieveRolesByMenuIdDataKey); + return ret; + } + /// + /// + /// + /// + /// + /// + public override bool SavaRolesByMenuId(int id, IEnumerable roleIds) + { + var ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("NavigationID", typeof(int)); + dt.Columns.Add("RoleID", typeof(int)); + //判断用户是否选定角色 + roleIds.ToList().ForEach(roleId => dt.Rows.Add(id, roleId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + // delete role from config table + string sql = "delete from NavigationRole where NavigationID=@NavigationID;"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@NavigationID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + + // insert batch data into config table + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.BatchSize = 1000; + bulk.DestinationTableName = "NavigationRole"; + bulk.ColumnMappings.Add("NavigationID", "NavigationID"); + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(roleIds: roleIds, menuIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 根据GroupId查询和该Group有关的所有Roles + /// + /// + /// + public override IEnumerable RetrieveRolesByGroupId(int groupId) + { + string key = string.Format("{0}-{1}", RetrieveRolesByGroupIdDataKey, groupId); + return CacheManager.GetOrAdd(key, k => + { + List roles = new List(); + string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join RoleGroup ur on r.ID = ur.RoleID and GroupID = @GroupID"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupID", groupId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + roles.Add(new Role() + { + Id = (int)reader[0], + RoleName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return roles; + }, RetrieveRolesByGroupIdDataKey); + } + + /// + /// 根据GroupId更新Roles信息,删除旧的Roles信息,插入新的Roles信息 + /// + /// + /// + /// + public override bool SaveRolesByGroupId(int id, IEnumerable roleIds) + { + var ret = false; + //构造表格 + DataTable dt = new DataTable(); + dt.Columns.Add("RoleID", typeof(int)); + dt.Columns.Add("GroupID", typeof(int)); + roleIds.ToList().ForEach(roleId => dt.Rows.Add(roleId, id)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + // delete user from config table + string sql = "delete from RoleGroup where GroupID=@GroupID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + + // insert batch data into config table + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.BatchSize = 1000; + bulk.DestinationTableName = "RoleGroup"; + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.ColumnMappings.Add("GroupID", "GroupID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(roleIds: roleIds, groupIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + } } \ No newline at end of file diff --git a/Bootstrap.DataAccess/TaskHelper.cs b/Bootstrap.DataAccess.SQLServer/Task.cs similarity index 74% rename from Bootstrap.DataAccess/TaskHelper.cs rename to Bootstrap.DataAccess.SQLServer/Task.cs index b840451f..631deb64 100644 --- a/Bootstrap.DataAccess/TaskHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/Task.cs @@ -1,44 +1,43 @@ -using Longbow.Cache; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; - -namespace Bootstrap.DataAccess -{ - public static class TaskHelper - { - private const string RetrieveTasksDataKey = "TaskHelper-RetrieveTasks"; - /// - /// 查询所有任务 - /// - /// - public static IEnumerable RetrieveTasks() - { - return CacheManager.GetOrAdd(RetrieveTasksDataKey, key => - { - string sql = "select top 1000 t.*, u.DisplayName from Tasks t inner join Users u on t.UserName = u.UserName order by AssignTime desc"; - List tasks = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - tasks.Add(new Task() - { - Id = (int)reader[0], - TaskName = (string)reader[1], - AssignName = (string)reader[2], - UserName = (string)reader[3], - TaskTime = (int)reader[4], - TaskProgress = (double)reader[5], - AssignTime = (DateTime)reader[6], - AssignDisplayName = (string)reader[7] - }); - } - } - return tasks; - }); - } - } -} +using Longbow.Cache; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; + +namespace Bootstrap.DataAccess.SQLServer +{ + public class Task : Bootstrap.DataAccess.Task + { + /// + /// 查询所有任务 + /// + /// + public override IEnumerable RetrieveTasks() + { + return CacheManager.GetOrAdd(RetrieveTasksDataKey, key => + { + string sql = "select top 1000 t.*, u.DisplayName from Tasks t inner join Users u on t.UserName = u.UserName order by AssignTime desc"; + List tasks = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + tasks.Add(new Task() + { + Id = (int)reader[0], + TaskName = (string)reader[1], + AssignName = (string)reader[2], + UserName = (string)reader[3], + TaskTime = (int)reader[4], + TaskProgress = (double)reader[5], + AssignTime = (DateTime)reader[6], + AssignDisplayName = (string)reader[7] + }); + } + } + return tasks; + }); + } + } +} diff --git a/Bootstrap.DataAccess/UserHelper.cs b/Bootstrap.DataAccess.SQLServer/User.cs similarity index 59% rename from Bootstrap.DataAccess/UserHelper.cs rename to Bootstrap.DataAccess.SQLServer/User.cs index e87a19f7..a2773ba8 100644 --- a/Bootstrap.DataAccess/UserHelper.cs +++ b/Bootstrap.DataAccess.SQLServer/User.cs @@ -1,419 +1,421 @@ -using Bootstrap.Security; -using Longbow; -using Longbow.Cache; -using Longbow.Data; -using Longbow.Security; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Data.SqlClient; -using System.Linq; - -namespace Bootstrap.DataAccess -{ - /// - /// 用户表相关操作类 - /// - public static class UserHelper - { - internal const string RetrieveUsersDataKey = "BootstrapUser-RetrieveUsers"; - internal const string RetrieveUsersByRoleIdDataKey = "BootstrapUser-RetrieveUsersByRoleId"; - internal const string RetrieveUsersByGroupIdDataKey = "BootstrapUser-RetrieveUsersByGroupId"; - internal const string RetrieveNewUsersDataKey = "UserHelper-RetrieveNewUsers"; - - /// - /// 查询所有用户 - /// - /// - /// - public static IEnumerable RetrieveUsers() - { - return CacheManager.GetOrAdd(RetrieveUsersDataKey, key => - { - List users = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, "select ID, UserName, DisplayName, RegisterTime, ApprovedTime, ApprovedBy, Description from Users Where ApprovedTime is not null"); - - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - users.Add(new User() - { - Id = (int)reader[0], - UserName = (string)reader[1], - DisplayName = (string)reader[2], - RegisterTime = (DateTime)reader[3], - ApprovedTime = LgbConvert.ReadValue(reader[4], DateTime.MinValue), - ApprovedBy = reader.IsDBNull(5) ? string.Empty : (string)reader[5], - Description = (string)reader[6] - }); - } - } - return users; - }); - } - /// - /// 查询所有的新注册用户 - /// - /// - public static IEnumerable RetrieveNewUsers() - { - return CacheManager.GetOrAdd(RetrieveNewUsersDataKey, key => - { - string sql = "select ID, UserName, DisplayName, RegisterTime, [Description] from Users Where ApprovedTime is null order by RegisterTime desc"; - List users = new List(); - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - users.Add(new User() - { - Id = (int)reader[0], - UserName = (string)reader[1], - DisplayName = (string)reader[2], - RegisterTime = (DateTime)reader[3], - Description = (string)reader[4] - }); - } - } - return users; - }); - } - /// - /// 删除用户 - /// - /// - public static bool DeleteUser(IEnumerable value) - { - bool ret = false; - var ids = string.Join(",", value); - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteUsers")) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@ids", ids)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == -1; - if (ret) CacheCleanUtility.ClearCache(userIds: value); - } - return ret; - } - /// - /// 保存新建 - /// - /// - /// - public static bool SaveUser(User p) - { - var ret = false; - if (p.Id == 0 && p.Description.Length > 500) p.Description = p.Description.Substring(0, 500); - if (p.UserName.Length > 50) p.UserName = p.UserName.Substring(0, 50); - p.PassSalt = LgbCryptography.GenerateSalt(); - p.Password = LgbCryptography.ComputeHash(p.Password, p.PassSalt); - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_SaveUsers")) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@userName", p.UserName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@password", p.Password)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@passSalt", p.PassSalt)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@displayName", p.DisplayName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@approvedBy", DBAccessFactory.ToDBValue(p.ApprovedBy))); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@description", p.Description)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == -1; - if (ret) CacheCleanUtility.ClearCache(userIds: p.Id == 0 ? new List() : new List() { p.Id }); - } - return ret; - } - /// - /// - /// - /// - /// - /// - /// - public static bool UpdateUser(int id, string password, string displayName) - { - bool ret = false; - string sql = "Update Users set Password = @Password, PassSalt = @PassSalt, DisplayName = @DisplayName where ID = @id"; - var passSalt = LgbCryptography.GenerateSalt(); - var newPassword = LgbCryptography.ComputeHash(password, passSalt); - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@id", id)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@DisplayName", displayName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Password", newPassword)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@PassSalt", passSalt)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(userIds: id == 0 ? new List() : new List() { id }); - } - return ret; - } - /// - /// - /// - /// - /// - /// - public static bool ApproveUser(int id, string approvedBy) - { - var ret = false; - var sql = "update Users set ApprovedTime = GETDATE(), ApprovedBy = @approvedBy where ID = @id"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@id", id)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@approvedBy", approvedBy)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(userIds: new List() { id }); - } - return ret; - } - /// - /// - /// - /// - /// - /// - /// - public static bool ChangePassword(string userName, string password, string newPass) - { - bool ret = false; - if (BootstrapUser.Authenticate(userName, password)) - { - string sql = "Update Users set Password = @Password, PassSalt = @PassSalt where UserName = @userName"; - var passSalt = LgbCryptography.GenerateSalt(); - var newPassword = LgbCryptography.ComputeHash(newPass, passSalt); - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@Password", newPassword)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@PassSalt", passSalt)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@userName", userName)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - } - } - return ret; - } - /// - /// - /// - /// - /// - /// - /// - public static bool RejectUser(int id, string rejectBy) - { - var ret = false; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_RejectUsers")) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@id", id)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@rejectedBy", rejectBy)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@rejectedReason", "未填写")); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == -1; - if (ret) CacheCleanUtility.ClearCache(userIds: new List() { id }); - } - return ret; - } - /// - /// 通过roleId获取所有用户 - /// - /// - /// - public static IEnumerable RetrieveUsersByRoleId(int roleId) - { - string key = string.Format("{0}-{1}", RetrieveUsersByRoleIdDataKey, roleId); - return CacheManager.GetOrAdd(key, k => - { - List users = new List(); - string sql = "select u.ID, u.UserName, u.DisplayName, case ur.UserID when u.ID then 'checked' else '' end [status] from Users u left join UserRole ur on u.ID = ur.UserID and RoleID = @RoleID where u.ApprovedTime is not null"; - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@RoleID", roleId)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - users.Add(new User() - { - Id = (int)reader[0], - UserName = (string)reader[1], - DisplayName = (string)reader[2], - Checked = (string)reader[3] - }); - } - } - return users; - }, RetrieveUsersByRoleIdDataKey); - } - /// - /// 通过角色ID保存当前授权用户(插入) - /// - /// 角色ID - /// 用户ID数组 - /// - public static bool SaveUsersByRoleId(int id, 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(id, userId)); - using (TransactionPackage transaction = DBAccessManager.SqlDBAccess.BeginTransaction()) - { - try - { - //删除用户角色表该角色所有的用户 - string sql = "delete from UserRole where RoleID=@RoleID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@RoleID", id)); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd, transaction); - //批插入用户角色表 - using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) - { - bulk.DestinationTableName = "UserRole"; - bulk.ColumnMappings.Add("RoleID", "RoleID"); - bulk.ColumnMappings.Add("UserID", "UserID"); - bulk.WriteToServer(dt); - transaction.CommitTransaction(); - } - } - CacheCleanUtility.ClearCache(userIds: userIds, roleIds: new List() { id }); - ret = true; - } - catch (Exception ex) - { - transaction.RollbackTransaction(); - throw ex; - } - } - return ret; - } - /// - /// 通过groupId获取所有用户 - /// - /// - /// - public static IEnumerable RetrieveUsersByGroupId(int groupId) - { - string key = string.Format("{0}-{1}", RetrieveUsersByGroupIdDataKey, groupId); - return CacheManager.GetOrAdd(key, k => - { - List users = new List(); - string sql = "select u.ID, u.UserName, u.DisplayName, case ur.UserID when u.ID then 'checked' else '' end [status] from Users u left join UserGroup ur on u.ID = ur.UserID and GroupID =@groupId where u.ApprovedTime is not null"; - DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@GroupID", groupId)); - using (DbDataReader reader = DBAccessManager.SqlDBAccess.ExecuteReader(cmd)) - { - while (reader.Read()) - { - users.Add(new User() - { - Id = (int)reader[0], - UserName = (string)reader[1], - DisplayName = (string)reader[2], - Checked = (string)reader[3] - }); - } - } - return users; - }, RetrieveUsersByRoleIdDataKey); - } - /// - /// 通过部门ID保存当前授权用户(插入) - /// - /// GroupID - /// 用户ID数组 - /// - public static bool SaveUsersByGroupId(int id, IEnumerable userIds) - { - bool ret = false; - DataTable dt = new DataTable(); - dt.Columns.Add("UserID", typeof(int)); - dt.Columns.Add("GroupID", typeof(int)); - userIds.ToList().ForEach(userId => dt.Rows.Add(userId, id)); - using (TransactionPackage transaction = DBAccessManager.SqlDBAccess.BeginTransaction()) - { - try - { - //删除用户角色表该角色所有的用户 - string sql = "delete from UserGroup where GroupID = @GroupID"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@GroupID", id)); - DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd, transaction); - //批插入用户角色表 - using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) - { - bulk.DestinationTableName = "UserGroup"; - bulk.ColumnMappings.Add("UserID", "UserID"); - bulk.ColumnMappings.Add("GroupID", "GroupID"); - bulk.WriteToServer(dt); - transaction.CommitTransaction(); - } - } - CacheCleanUtility.ClearCache(userIds: userIds, groupIds: new List() { id }); - ret = true; - } - catch (Exception ex) - { - transaction.RollbackTransaction(); - throw ex; - } - } - return ret; - } - /// - /// 根据用户名修改用户头像 - /// - /// - /// - /// - public static bool SaveUserIconByName(string userName, string iconName) - { - bool ret = false; - string sql = "Update Users set Icon = @iconName where UserName = @userName"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@iconName", iconName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@userName", userName)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{RetrieveUsersDataKey}*"); - } - return ret; - } - /// - /// - /// - /// - /// - /// - public static bool SaveDisplayName(string userName, string displayName) - { - bool ret = false; - string sql = "Update Users set DisplayName = @DisplayName where UserName = @userName"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@DisplayName", displayName)); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@userName", userName)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{RetrieveUsersDataKey}*"); - } - return ret; - } - /// - /// 根据用户名更改用户皮肤 - /// - /// - /// - /// - public static bool SaveUserCssByName(string userName, string cssName) - { - bool ret = false; - string sql = "Update Users set Css = @cssName where UserName = @userName"; - using (DbCommand cmd = DBAccessManager.SqlDBAccess.CreateCommand(CommandType.Text, sql)) - { - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@cssName", DBAccessFactory.ToDBValue(cssName))); - cmd.Parameters.Add(DBAccessManager.SqlDBAccess.CreateParameter("@userName", userName)); - ret = DBAccessManager.SqlDBAccess.ExecuteNonQuery(cmd) == 1; - if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{RetrieveUsersDataKey}*"); - } - return ret; - } - } -} +using Bootstrap.Security; +using Longbow; +using Longbow.Cache; +using Longbow.Data; +using Longbow.Security; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; + + +namespace Bootstrap.DataAccess.SQLServer +{ + /// + /// 用户表实体类 + /// + public class User : Bootstrap.DataAccess.User + { + /// + /// 查询所有用户 + /// + /// + /// + public override IEnumerable RetrieveUsers() + { + return CacheManager.GetOrAdd(RetrieveUsersDataKey, key => + { + List users = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, "select ID, UserName, DisplayName, RegisterTime, ApprovedTime, ApprovedBy, Description from Users Where ApprovedTime is not null"); + + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + users.Add(new User() + { + Id = (int)reader[0], + UserName = (string)reader[1], + DisplayName = (string)reader[2], + RegisterTime = (DateTime)reader[3], + ApprovedTime = LgbConvert.ReadValue(reader[4], DateTime.MinValue), + ApprovedBy = reader.IsDBNull(5) ? string.Empty : (string)reader[5], + Description = (string)reader[6] + }); + } + } + return users; + }); + } + /// + /// 查询所有的新注册用户 + /// + /// + public override IEnumerable RetrieveNewUsers() + { + return CacheManager.GetOrAdd(RetrieveNewUsersDataKey, key => + { + string sql = "select ID, UserName, DisplayName, RegisterTime, [Description] from Users Where ApprovedTime is null order by RegisterTime desc"; + List users = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + users.Add(new User() + { + Id = (int)reader[0], + UserName = (string)reader[1], + DisplayName = (string)reader[2], + RegisterTime = (DateTime)reader[3], + Description = (string)reader[4] + }); + } + } + return users; + }); + } + /// + /// 删除用户 + /// + /// + public override bool DeleteUser(IEnumerable value) + { + bool ret = false; + var ids = string.Join(",", value); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteUsers")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ids", ids)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + if (ret) CacheCleanUtility.ClearCache(userIds: value); + } + return ret; + } + /// + /// 保存新建 + /// + /// + /// + public override bool SaveUser(Bootstrap.DataAccess.User p) + { + var ret = false; + if (p.Id == 0 && p.Description.Length > 500) p.Description = p.Description.Substring(0, 500); + if (p.UserName.Length > 50) p.UserName = p.UserName.Substring(0, 50); + p.PassSalt = LgbCryptography.GenerateSalt(); + p.Password = LgbCryptography.ComputeHash(p.Password, p.PassSalt); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_SaveUsers")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@userName", p.UserName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@password", p.Password)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@passSalt", p.PassSalt)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@displayName", p.DisplayName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@approvedBy", DbAccessFactory.ToDBValue(p.ApprovedBy))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@description", p.Description)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + if (ret) CacheCleanUtility.ClearCache(userIds: p.Id == 0 ? new List() : new List() { p.Id }); + } + return ret; + } + /// + /// + /// + /// + /// + /// + /// + public override bool UpdateUser(int id, string password, string displayName) + { + bool ret = false; + string sql = "Update Users set Password = @Password, PassSalt = @PassSalt, DisplayName = @DisplayName where ID = @id"; + var passSalt = LgbCryptography.GenerateSalt(); + var newPassword = LgbCryptography.ComputeHash(password, passSalt); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@id", id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@DisplayName", displayName)); + 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: id == 0 ? new List() : new List() { id }); + } + return ret; + } + /// + /// + /// + /// + /// + /// + public override bool ApproveUser(int id, string approvedBy) + { + var ret = false; + var sql = "update Users set ApprovedTime = GETDATE(), ApprovedBy = @approvedBy where ID = @id"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + 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; + } + /// + /// + /// + /// + /// + /// + /// + public override bool RejectUser(int id, string rejectBy) + { + var ret = false; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_RejectUsers")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@id", id)); + 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; + } + /// + /// 通过roleId获取所有用户 + /// + /// + /// + public override IEnumerable RetrieveUsersByRoleId(int roleId) + { + string key = string.Format("{0}-{1}", RetrieveUsersByRoleIdDataKey, roleId); + return CacheManager.GetOrAdd(key, k => + { + List users = new List(); + string sql = "select u.ID, u.UserName, u.DisplayName, case ur.UserID when u.ID then 'checked' else '' end [status] from Users u left join UserRole ur on u.ID = ur.UserID and RoleID = @RoleID where u.ApprovedTime is not null"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", roleId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + users.Add(new User() + { + Id = (int)reader[0], + UserName = (string)reader[1], + DisplayName = (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return users; + }, RetrieveUsersByRoleIdDataKey); + } + /// + /// 通过角色ID保存当前授权用户(插入) + /// + /// 角色ID + /// 用户ID数组 + /// + public override bool SaveUsersByRoleId(int id, 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(id, userId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除用户角色表该角色所有的用户 + string sql = "delete from UserRole where RoleID=@RoleID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + //批插入用户角色表 + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.DestinationTableName = "UserRole"; + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.ColumnMappings.Add("UserID", "UserID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(userIds: userIds, roleIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 通过groupId获取所有用户 + /// + /// + /// + public override IEnumerable RetrieveUsersByGroupId(int groupId) + { + string key = string.Format("{0}-{1}", RetrieveUsersByGroupIdDataKey, groupId); + return CacheManager.GetOrAdd(key, k => + { + List users = new List(); + string sql = "select u.ID, u.UserName, u.DisplayName, case ur.UserID when u.ID then 'checked' else '' end [status] from Users u left join UserGroup ur on u.ID = ur.UserID and GroupID =@groupId where u.ApprovedTime is not null"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupID", groupId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + users.Add(new User() + { + Id = (int)reader[0], + UserName = (string)reader[1], + DisplayName = (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return users; + }, RetrieveUsersByRoleIdDataKey); + } + /// + /// 通过部门ID保存当前授权用户(插入) + /// + /// GroupID + /// 用户ID数组 + /// + public override bool SaveUsersByGroupId(int id, IEnumerable userIds) + { + bool ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("UserID", typeof(int)); + dt.Columns.Add("GroupID", typeof(int)); + userIds.ToList().ForEach(userId => dt.Rows.Add(userId, id)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除用户角色表该角色所有的用户 + string sql = "delete from UserGroup where GroupID = @GroupID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + //批插入用户角色表 + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.DestinationTableName = "UserGroup"; + bulk.ColumnMappings.Add("UserID", "UserID"); + bulk.ColumnMappings.Add("GroupID", "GroupID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(userIds: userIds, groupIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 根据用户名修改用户头像 + /// + /// + /// + /// + public override bool SaveUserIconByName(string userName, string iconName) + { + bool ret = false; + string sql = "Update Users set Icon = @iconName where UserName = @userName"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + 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: $"{RetrieveUsersDataKey}*"); + } + return ret; + } + /// + /// + /// + /// + /// + /// + public override bool SaveDisplayName(string userName, string displayName) + { + bool ret = false; + string sql = "Update Users set DisplayName = @DisplayName where UserName = @userName"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + 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: $"{RetrieveUsersDataKey}*"); + } + return ret; + } + /// + /// 根据用户名更改用户皮肤 + /// + /// + /// + /// + public override bool SaveUserCssByName(string userName, string cssName) + { + bool ret = false; + string sql = "Update Users set Css = @cssName where UserName = @userName"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@cssName", DbAccessFactory.ToDBValue(cssName))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@userName", userName)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{RetrieveUsersDataKey}*"); + } + return ret; + } + /// + /// + /// + /// + /// + public override BootstrapUser RetrieveUserByUserName(string userName) + { + var key = string.Format("{0}-{1}", RetrieveUsersByNameDataKey, userName); + return CacheManager.GetOrAdd(key, k => + { + BootstrapUser user = null; + var sql = "select UserName, DisplayName, case isnull(d.Code, '') when '' then '~/images/uploader/' else d.Code end + Icon Icon, u.Css from Users u left join Dicts d on d.Define = '0' and d.Category = N'头像地址' and Name = N'头像路径' where ApprovedTime is not null and UserName = @UserName"; + var db = DBAccessManager.DBAccess; + var cmd = db.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(db.CreateParameter("@UserName", userName)); + using (DbDataReader reader = db.ExecuteReader(cmd)) + { + if (reader.Read()) + { + user = new BootstrapUser + { + UserName = (string)reader[0], + DisplayName = (string)reader[1], + Icon = (string)reader[2], + Css = reader.IsDBNull(3) ? string.Empty : (string)reader[3] + }; + } + } + return user; + }, RetrieveUsersByNameDataKey); + } + } +} diff --git a/Bootstrap.DataAccess.SQLite/Bootstrap.DataAccess.SQLite.csproj b/Bootstrap.DataAccess.SQLite/Bootstrap.DataAccess.SQLite.csproj new file mode 100644 index 00000000..1f9af899 --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Bootstrap.DataAccess.SQLite.csproj @@ -0,0 +1,18 @@ + + + + netstandard2.0 + + + + + + + + + + + + + + diff --git a/Bootstrap.DataAccess.SQLite/Dict.cs b/Bootstrap.DataAccess.SQLite/Dict.cs new file mode 100644 index 00000000..3571d08d --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Dict.cs @@ -0,0 +1,168 @@ +using Bootstrap.Security; +using Longbow.Cache; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLite +{ + /// + /// + /// + public class Dict : DataAccess.Dict + { + /// + /// 删除字典中的数据 + /// + /// 需要删除的IDs + /// + public override bool DeleteDict(IEnumerable value) + { + var ret = false; + var ids = string.Join(",", value); + string sql = string.Format(CultureInfo.InvariantCulture, "Delete from Dicts where ID in ({0})", ids); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == value.Count(); + CacheCleanUtility.ClearCache(dictIds: ids); + } + return ret; + } + + /// + /// 保存新建/更新的字典信息 + /// + /// + /// + public override bool SaveDict(BootstrapDict dict) + { + bool ret = false; + if (dict.Category.Length > 50) dict.Category = dict.Category.Substring(0, 50); + if (dict.Name.Length > 50) dict.Name = dict.Name.Substring(0, 50); + if (dict.Code.Length > 50) dict.Code = dict.Code.Substring(0, 50); + string sql = dict.Id == 0 ? + "Insert Into Dicts (Category, Name, Code ,Define) Values (@Category, @Name, @Code, @Define)" : + "Update Dicts set Category = @Category, Name = @Name, Code = @Code, Define = @Define where ID = @ID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ID", dict.Id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Category", dict.Category)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Name", dict.Name)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Code", dict.Code)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Define", dict.Define)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(dictIds: dict.Id == 0 ? string.Empty : dict.Id.ToString()); + return ret; + } + /// + /// 保存网站个性化设置 + /// + /// + /// + /// + /// + public override bool SaveSettings(BootstrapDict dict) + { + var ret = false; + string sql = "Update Dicts set Code = @Code where Category = @Category and Name = @Name"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Name", dict.Name)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Code", dict.Code)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Category", dict.Category)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(dictIds: string.Empty); + return ret; + } + /// + /// 获取字典分类名称 + /// + /// + public override IEnumerable RetrieveCategories() + { + return CacheManager.GetOrAdd(RetrieveCategoryDataKey, key => + { + var ret = new List(); + string sql = "select distinct Category from Dicts"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + ret.Add((string)reader[0]); + } + } + return ret; + }); + } + /// + /// + /// + /// + public override string RetrieveWebTitle() + { + var settings = RetrieveDicts(); + return (settings.FirstOrDefault(d => d.Name == "网站标题" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "后台管理系统" }).Code; + } + /// + /// + /// + /// + public override string RetrieveWebFooter() + { + var settings = RetrieveDicts(); + return (settings.FirstOrDefault(d => d.Name == "网站页脚" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "2016 © 通用后台管理系统" }).Code; + } + /// + /// 获得系统中配置的可以使用的网站样式 + /// + /// + public override IEnumerable RetrieveThemes() + { + var data = RetrieveDicts(); + return data.Where(d => d.Category == "网站样式"); + } + /// + /// 获得网站设置中的当前样式 + /// + /// + public override string RetrieveActiveTheme() + { + var data = RetrieveDicts(); + var theme = data.Where(d => d.Name == "使用样式" && d.Category == "当前样式" && d.Define == 0).FirstOrDefault(); + return theme == null ? string.Empty : (theme.Code.Equals("site.css", StringComparison.OrdinalIgnoreCase) ? string.Empty : theme.Code); + } + /// + /// 获取头像路径 + /// + /// + public override BootstrapDict RetrieveIconFolderPath() + { + var data = RetrieveDicts(); + return data.FirstOrDefault(d => d.Name == "头像路径" && d.Category == "头像地址" && d.Define == 0) ?? new BootstrapDict() { Code = "~/images/uploader/" }; + } + /// + /// 获得默认的前台首页地址,默认为~/Home/Index + /// + /// + public override string RetrieveHomeUrl() + { + var settings = RetrieveDicts(); + return (settings.FirstOrDefault(d => d.Name == "前台首页" && d.Category == "网站设置" && d.Define == 0) ?? new BootstrapDict() { Code = "~/Home/Index" }).Code; + } + /// + /// + /// + /// + public override IEnumerable> RetrieveApps() + { + var settings = RetrieveDicts(); + return settings.Where(d => d.Category == "应用程序" && d.Define == 0).Select(d => new KeyValuePair(d.Code, d.Name)).OrderBy(d => d.Key); + } + } +} diff --git a/Bootstrap.DataAccess.SQLite/Exceptions.cs b/Bootstrap.DataAccess.SQLite/Exceptions.cs new file mode 100644 index 00000000..8e86002b --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Exceptions.cs @@ -0,0 +1,96 @@ +using Longbow; +using Longbow.Cache; +using Longbow.Configuration; +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Data.Common; + +namespace Bootstrap.DataAccess.SQLite +{ + /// + /// + /// + public class Exceptions : DataAccess.Exceptions + { + /// + /// + /// + /// + /// + /// + public override void Log(Exception ex, NameValueCollection additionalInfo) + { + if (additionalInfo == null) + { + additionalInfo = new NameValueCollection + { + ["UserId"] = null, + ["UserIp"] = null, + ["ErrorPage"] = null + }; + } + var errorPage = additionalInfo["ErrorPage"] ?? (nameof(ex).Length > 50 ? nameof(ex).Substring(0, 50) : nameof(ex)); + var sql = "insert into Exceptions (ID, AppDomainName, ErrorPage, UserID, UserIp, ExceptionType, Message, StackTrace, LogTime) values (NULL, @AppDomainName, @ErrorPage, @UserID, @UserIp, @ExceptionType, @Message, @StackTrace, datetime('now', 'localtime'))"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@AppDomainName", AppDomain.CurrentDomain.FriendlyName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ErrorPage", errorPage)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", DbAccessFactory.ToDBValue(additionalInfo["UserId"]))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserIp", DbAccessFactory.ToDBValue(additionalInfo["UserIp"]))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ExceptionType", ex.GetType().FullName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Message", ex.Message)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@StackTrace", DbAccessFactory.ToDBValue(ex.StackTrace))); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd); + CacheManager.Clear(RetrieveExceptionsDataKey); + ClearExceptions(); + } + } + /// + /// + /// + private static void ClearExceptions() + { + System.Threading.Tasks.Task.Run(() => + { + string sql = $"delete from Exceptions where LogTime < datetime('now', 'localtime', '-{ConfigurationManager.AppSettings["KeepExceptionsPeriod"]} month')"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd); + }); + } + /// + /// 查询一周内所有异常 + /// + /// + public override IEnumerable RetrieveExceptions() + { + return CacheManager.GetOrAdd(RetrieveExceptionsDataKey, key => + { + string sql = "select * from Exceptions where LogTime > datetime('now', 'localtime', '-7 day') order by LogTime desc"; + List exceptions = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + exceptions.Add(new Exceptions() + { + Id = LgbConvert.ReadValue(reader[0], 0), + AppDomainName = (string)reader[1], + ErrorPage = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + UserId = reader.IsDBNull(3) ? string.Empty : (string)reader[3], + UserIp = reader.IsDBNull(4) ? string.Empty : (string)reader[4], + ExceptionType = (string)reader[5], + Message = (string)reader[6], + StackTrace = (string)reader[7], + LogTime = LgbConvert.ReadValue(reader[8], DateTime.MinValue) + }); + } + } + return exceptions; + }); + } + } +} diff --git a/Bootstrap.DataAccess.SQLite/Group.cs b/Bootstrap.DataAccess.SQLite/Group.cs new file mode 100644 index 00000000..a607b096 --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Group.cs @@ -0,0 +1,239 @@ +using Longbow; +using Longbow.Cache; +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLite +{ + /// + /// + /// + public class Group : DataAccess.Group + { + /// + /// 查询所有群组信息 + /// + /// + /// + public override IEnumerable RetrieveGroups(int id = 0) + { + var ret = CacheManager.GetOrAdd(RetrieveGroupsDataKey, key => + { + string sql = "select * from Groups"; + List groups = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + groups.Add(new Group() + { + Id = LgbConvert.ReadValue(reader[0], 0), + GroupName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2] + }); + } + } + return groups; + }); + return id == 0 ? ret : ret.Where(t => id == t.Id); + } + /// + /// 删除群组信息 + /// + /// + public override bool DeleteGroup(IEnumerable value) + { + bool ret = false; + var ids = string.Join(",", value); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteGroups")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ids", ids)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + } + CacheCleanUtility.ClearCache(groupIds: value); + return ret; + } + /// + /// 保存新建/更新的群组信息 + /// + /// + /// + public override bool SaveGroup(Bootstrap.DataAccess.Group p) + { + bool ret = false; + if (p.GroupName.Length > 50) p.GroupName = p.GroupName.Substring(0, 50); + if (!string.IsNullOrEmpty(p.Description) && p.Description.Length > 500) p.Description = p.Description.Substring(0, 500); + string sql = p.Id == 0 ? + "Insert Into Groups (GroupName, Description) Values (@GroupName, @Description)" : + "Update Groups set GroupName = @GroupName, Description = @Description where ID = @ID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ID", p.Id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupName", p.GroupName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Description", DbAccessFactory.ToDBValue(p.Description))); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(groupIds: p.Id == 0 ? new List() : new List() { p.Id }); + return ret; + } + /// + /// 根据用户查询部门信息 + /// + /// + /// + public override IEnumerable RetrieveGroupsByUserId(int userId) + { + string key = string.Format("{0}-{1}", RetrieveGroupsByUserIdDataKey, userId); + var ret = CacheManager.GetOrAdd(key, k => + { + string sql = "select g.ID,g.GroupName,g.[Description],case ug.GroupID when g.ID then 'checked' else '' end [status] from Groups g left join UserGroup ug on g.ID=ug.GroupID and UserID=@UserID"; + List groups = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", userId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + groups.Add(new Group() + { + Id = LgbConvert.ReadValue(reader[0], 0), + GroupName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return groups; + }, RetrieveGroupsByUserIdDataKey); + return ret; + } + /// + /// 保存用户部门关系 + /// + /// + /// + /// + public override bool SaveGroupsByUserId(int id, IEnumerable groupIds) + { + var ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("UserID", typeof(int)); + dt.Columns.Add("GroupID", typeof(int)); + //判断用户是否选定角色 + groupIds.ToList().ForEach(groupId => dt.Rows.Add(id, groupId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除用户部门表中该用户所有的部门关系 + string sql = "delete from UserGroup where UserID=@UserID;"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + + // insert batch data into config table + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.BatchSize = 1000; + bulk.DestinationTableName = "UserGroup"; + bulk.ColumnMappings.Add("UserID", "UserID"); + bulk.ColumnMappings.Add("GroupID", "GroupID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(groupIds: groupIds, userIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 根据角色ID指派部门 + /// + /// + /// + public override IEnumerable RetrieveGroupsByRoleId(int roleId) + { + string k = string.Format("{0}-{1}", RetrieveGroupsByRoleIdDataKey, roleId); + return CacheManager.GetOrAdd(k, key => + { + List groups = new List(); + string sql = "select g.ID,g.GroupName,g.[Description],case rg.GroupID when g.ID then 'checked' else '' end [status] from Groups g left join RoleGroup rg on g.ID=rg.GroupID and RoleID=@RoleID"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", roleId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + groups.Add(new Group() + { + Id = LgbConvert.ReadValue(reader[0], 0), + GroupName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return groups; + }, RetrieveGroupsByRoleIdDataKey); + } + /// + /// 根据角色ID以及选定的部门ID,保到角色部门表 + /// + /// + /// + /// + public override bool SaveGroupsByRoleId(int id, IEnumerable groupIds) + { + bool ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("GroupID", typeof(int)); + dt.Columns.Add("RoleID", typeof(int)); + groupIds.ToList().ForEach(groupId => dt.Rows.Add(groupId, id)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除角色部门表该角色所有的部门 + string sql = "delete from RoleGroup where RoleID=@RoleID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + //批插入角色部门表 + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.BatchSize = 1000; + bulk.ColumnMappings.Add("GroupID", "GroupID"); + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.DestinationTableName = "RoleGroup"; + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(groupIds: groupIds, roleIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + } +} diff --git a/Bootstrap.DataAccess.SQLite/Log.cs b/Bootstrap.DataAccess.SQLite/Log.cs new file mode 100644 index 00000000..86b537b0 --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Log.cs @@ -0,0 +1,87 @@ +using Longbow; +using Longbow.Cache; +using Longbow.Configuration; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLite +{ + /// + /// + /// + public class Log : DataAccess.Log + { + /// + /// 查询所有日志信息 + /// + /// + /// + public override IEnumerable RetrieveLogs(string tId = null) + { + var ret = CacheManager.GetOrAdd(RetrieveLogsDataKey, key => + { + string sql = "select * from Logs where LogTime > datetime('now', 'localtime', '-7 day')"; + List logs = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + logs.Add(new Log() + { + Id = LgbConvert.ReadValue(reader[0], 0), + CRUD = (string)reader[1], + UserName = (string)reader[2], + LogTime = LgbConvert.ReadValue(reader[3], DateTime.MinValue), + ClientIp = (string)reader[4], + ClientAgent = (string)reader[5], + RequestUrl = (string)reader[6] + }); + } + } + return logs; + }); + return string.IsNullOrEmpty(tId) ? ret : ret.Where(t => tId.Equals(t.Id.ToString(), StringComparison.OrdinalIgnoreCase)); + } + /// + /// 删除日志信息 + /// + /// + /// + private void DeleteLogAsync() + { + System.Threading.Tasks.Task.Run(() => + { + string sql = $"delete from Logs where LogTime < datetime('now', 'localtime', '-{ConfigurationManager.AppSettings["KeepLogsPeriod"]} month')"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd); + }); + } + /// + /// 保存新增的日志信息 + /// + /// + /// + public override bool SaveLog(Bootstrap.DataAccess.Log p) + { + if (p == null) throw new ArgumentNullException("p"); + bool ret = false; + string sql = "Insert Into Logs (CRUD, UserName, LogTime, ClientIp, ClientAgent, RequestUrl) Values (@CRUD, @UserName, datetime('now', 'localtime'), @ClientIp, @ClientAgent, @RequestUrl)"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@CRUD", p.CRUD)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserName", p.UserName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ClientIp", p.ClientIp)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ClientAgent", p.ClientAgent)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RequestUrl", p.RequestUrl)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheManager.Clear(RetrieveLogsDataKey); + DeleteLogAsync(); + return ret; + } + } +} diff --git a/Bootstrap.DataAccess.SQLite/Menu.cs b/Bootstrap.DataAccess.SQLite/Menu.cs new file mode 100644 index 00000000..02c60fb0 --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Menu.cs @@ -0,0 +1,170 @@ +using Bootstrap.Security; +using Longbow; +using Longbow.Cache; +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLite +{ + /// + /// + /// + public class Menu : DataAccess.Menu + { + /// + /// 删除菜单信息 + /// + /// + public override bool DeleteMenu(IEnumerable value) + { + bool ret = false; + var ids = string.Join(",", value); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteMenus")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ids", ids)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + } + CacheCleanUtility.ClearCache(menuIds: value); + return ret; + } + /// + /// 保存新建/更新的菜单信息 + /// + /// + /// + public override bool SaveMenu(BootstrapMenu p) + { + if (string.IsNullOrEmpty(p.Name)) return false; + bool ret = false; + if (p.Name.Length > 50) p.Name = p.Name.Substring(0, 50); + if (p.Icon != null && p.Icon.Length > 50) p.Icon = p.Icon.Substring(0, 50); + if (p.Url != null && p.Url.Length > 4000) p.Url = p.Url.Substring(0, 4000); + string sql = p.Id == 0 ? + "Insert Into Navigations (ParentId, Name, [Order], Icon, Url, Category, Target, IsResource, [Application]) Values (@ParentId, @Name, @Order, @Icon, @Url, @Category, @Target, @IsResource, @ApplicationCode)" : + "Update Navigations set ParentId = @ParentId, Name = @Name, [Order] = @Order, Icon = @Icon, Url = @Url, Category = @Category, Target = @Target, IsResource = @IsResource, Application = @ApplicationCode where ID = @ID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ID", p.Id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ParentId", p.ParentId)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Name", p.Name)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Order", p.Order)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Icon", DbAccessFactory.ToDBValue(p.Icon))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Url", DbAccessFactory.ToDBValue(p.Url))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Category", p.Category)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Target", p.Target)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@IsResource", p.IsResource)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ApplicationCode", p.ApplicationCode)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(menuIds: p.Id == 0 ? new List() : new List() { p.Id }); + return ret; + } + + /// + /// 查询某个角色所配置的菜单 + /// + /// + /// + public override IEnumerable RetrieveMenusByRoleId(int roleId) + { + string key = string.Format("{0}-{1}", RetrieveMenusByRoleIdDataKey, roleId); + return CacheManager.GetOrAdd(key, k => + { + var menus = new List(); + string sql = "select NavigationID from NavigationRole where RoleID = @RoleID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", roleId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + menus.Add(new BootstrapMenu() + { + Id = LgbConvert.ReadValue(reader[0], 0) + }); + } + } + } + return menus; + }, RetrieveMenusByRoleIdDataKey); + } + /// + /// 通过角色ID保存当前授权菜单 + /// + /// + /// + /// + public override bool SaveMenusByRoleId(int id, IEnumerable menuIds) + { + bool ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("RoleID", typeof(int)); + dt.Columns.Add("NavigationID", typeof(int)); + menuIds.ToList().ForEach(menuId => dt.Rows.Add(id, menuId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除菜单角色表该角色所有的菜单 + string sql = "delete from NavigationRole where RoleID=@RoleID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + //批插入菜单角色表 + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.DestinationTableName = "NavigationRole"; + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.ColumnMappings.Add("NavigationID", "NavigationID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(menuIds: menuIds, roleIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + ///// + ///// + ///// + ///// + ///// + ///// + //public override IEnumerable RetrieveAllMenus(string userName, string activeUrl = null) => RetrieveAllMenus(DBAccessManager.DBAccess, userName, activeUrl); + ///// + ///// + ///// + ///// + ///// + ///// + //public override IEnumerable RetrieveAppMenus(string userName, string activeUrl = null) => RetrieveAppMenus(DBAccessManager.DBAccess, userName, activeUrl); + ///// + ///// + ///// + ///// + ///// + ///// + //public override IEnumerable RetrieveMenusByUserName(string userName, string activeUrl = null) => RetrieveMenusByUserName(DBAccessManager.DBAccess, userName, activeUrl); + ///// + ///// + ///// + ///// + ///// + ///// + //public override IEnumerable RetrieveSystemMenus(string userName, string activeUrl = null) => RetrieveSystemMenus(DBAccessManager.DBAccess, userName, activeUrl); + } +} diff --git a/Bootstrap.DataAccess.SQLite/Message.cs b/Bootstrap.DataAccess.SQLite/Message.cs new file mode 100644 index 00000000..87271d5a --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Message.cs @@ -0,0 +1,114 @@ +using Longbow; +using Longbow.Cache; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLite +{ + /// + /// + /// + public class Message : DataAccess.Message + { + /// + /// 所有有关userName所有消息列表 + /// + /// + /// + private static IEnumerable RetrieveMessages(string userName) + { + var messageRet = CacheManager.GetOrAdd(RetrieveMessageDataKey, key => + { + string sql = "select m.*, d.Name, ifnull(i.Code + u.Icon, '~/images/uploader/default.jpg'), u.DisplayName from [Messages] m left join Dicts d on m.Label = d.Code and d.Category = '消息标签' and d.Define = 0 left join Dicts i on i.Category = '头像地址' and i.Name = '头像路径' and i.Define = 0 inner join Users u on m.[From] = u.UserName where [To] = @UserName or [From] = @UserName order by m.SendTime desc"; + List messages = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserName", userName)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + messages.Add(new Message() + { + Id = LgbConvert.ReadValue(reader[0], 0), + Title = (string)reader[1], + Content = (string)reader[2], + From = (string)reader[3], + To = (string)reader[4], + SendTime = LgbConvert.ReadValue(reader[5], DateTime.MinValue), + Status = (string)reader[6], + Mark = LgbConvert.ReadValue(reader[7], 0), + IsDelete = LgbConvert.ReadValue(reader[8], 0), + Label = (string)reader[9], + LabelName = LgbConvert.ReadValue(reader[10], string.Empty), + FromIcon = (string)reader[11], + FromDisplayName = (string)reader[12] + }); + } + } + return messages; + + }); + return messageRet.OrderByDescending(n => n.SendTime); + } + /// + /// 收件箱 + /// + /// + public override IEnumerable Inbox(string userName) + { + var messageRet = RetrieveMessages(userName); + return messageRet.Where(n => n.To.Equals(userName, StringComparison.OrdinalIgnoreCase)); + } + /// + /// 发件箱 + /// + /// + /// + public override IEnumerable SendMail(string userName) + { + var messageRet = RetrieveMessages(userName); + return messageRet.Where(n => n.From.Equals(userName, StringComparison.OrdinalIgnoreCase)); + } + /// + /// 垃圾箱 + /// + /// + /// + public override IEnumerable Trash(string userName) + { + var messageRet = RetrieveMessages(userName); + return messageRet.Where(n => n.IsDelete == 1); + } + /// + /// 标旗 + /// + /// + /// + public override IEnumerable Flag(string userName) + { + var messageRet = RetrieveMessages(userName); + return messageRet.Where(n => n.Mark == 1); + } + /// + /// 获取Header处显示的消息列表 + /// + /// + /// + public override IEnumerable RetrieveMessagesHeader(string userName) + { + var messageRet = Inbox(userName); + messageRet.AsParallel().ForAll(n => + { + var ts = DateTime.Now - n.SendTime; + if (ts.TotalMinutes < 5) n.Period = "刚刚"; + else if (ts.Days > 0) n.Period = string.Format("{0}天", ts.Days); + else if (ts.Hours > 0) n.Period = string.Format("{0}小时", ts.Hours); + else if (ts.Minutes > 0) n.Period = string.Format("{0}分钟", ts.Minutes); + }); + return messageRet; + } + } +} diff --git a/Bootstrap.DataAccess.SQLite/Role.cs b/Bootstrap.DataAccess.SQLite/Role.cs new file mode 100644 index 00000000..bd0c7675 --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Role.cs @@ -0,0 +1,319 @@ +using Longbow; +using Longbow.Cache; +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; + +namespace Bootstrap.DataAccess.SQLite +{ + /// + /// + /// + public class Role : DataAccess.Role + { + /// + /// 查询所有角色 + /// + /// + /// + public override IEnumerable RetrieveRoles(int id = 0) + { + var ret = CacheManager.GetOrAdd(RetrieveRolesDataKey, key => + { + string sql = "select * from Roles"; + var roles = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + roles.Add(new Role() + { + Id = LgbConvert.ReadValue(reader[0], 0), + RoleName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2] + }); + } + } + return roles; + }); + return id == 0 ? ret : ret.Where(t => id == t.Id); + } + /// + /// 保存用户角色关系 + /// + /// + /// + /// + public override bool SaveRolesByUserId(int id, IEnumerable roleIds) + { + var ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("UserID", typeof(int)); + dt.Columns.Add("RoleID", typeof(int)); + //判断用户是否选定角色 + roleIds.ToList().ForEach(roleId => dt.Rows.Add(id, roleId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + // delete user from config table + string sql = "delete from UserRole where UserID = @UserID;"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + if (dt.Rows.Count > 0) + { + // insert batch data into config table + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.DestinationTableName = "UserRole"; + bulk.ColumnMappings.Add("UserID", "UserID"); + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.WriteToServer(dt); + } + } + transaction.CommitTransaction(); + } + CacheCleanUtility.ClearCache(userIds: new List() { id }, roleIds: roleIds); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 查询某个用户所拥有的角色 + /// + /// + public override IEnumerable RetrieveRolesByUserId(int userId) + { + string key = string.Format("{0}-{1}", RetrieveRolesByUserIdDataKey, userId); + return CacheManager.GetOrAdd(key, k => + { + List roles = new List(); + string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join UserRole ur on r.ID = ur.RoleID and UserID = @UserID"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserID", userId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + roles.Add(new Role() + { + Id = LgbConvert.ReadValue(reader[0], 0), + RoleName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return roles; + }, RetrieveRolesByUserIdDataKey); + } + /// + /// 删除角色表 + /// + /// + public override bool DeleteRole(IEnumerable value) + { + bool ret = false; + var ids = string.Join(",", value); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteRoles")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ids", ids)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + } + CacheCleanUtility.ClearCache(roleIds: value); + return ret; + } + /// + /// 保存新建/更新的角色信息 + /// + /// + /// + public override bool SaveRole(DataAccess.Role p) + { + bool ret = false; + if (!string.IsNullOrEmpty(p.RoleName) && p.RoleName.Length > 50) p.RoleName = p.RoleName.Substring(0, 50); + if (!string.IsNullOrEmpty(p.Description) && p.Description.Length > 50) p.Description = p.Description.Substring(0, 500); + string sql = p.Id == 0 ? + "Insert Into Roles (RoleName, Description) Values (@RoleName, @Description)" : + "Update Roles set RoleName = @RoleName, Description = @Description where ID = @ID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ID", p.Id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleName", p.RoleName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Description", DbAccessFactory.ToDBValue(p.Description))); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + CacheCleanUtility.ClearCache(roleIds: p.Id == 0 ? new List() : new List { p.Id }); + return ret; + } + /// + /// 查询某个菜单所拥有的角色 + /// + /// + /// + public override IEnumerable RetrieveRolesByMenuId(int menuId) + { + string key = string.Format("{0}-{1}", RetrieveRolesByMenuIdDataKey, menuId); + var ret = CacheManager.GetOrAdd(key, k => + { + string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join NavigationRole ur on r.ID = ur.RoleID and NavigationID = @NavigationID"; + List roles = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@NavigationID", menuId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + roles.Add(new Role() + { + Id = LgbConvert.ReadValue(reader[0], 0), + RoleName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return roles; + }, RetrieveRolesByMenuIdDataKey); + return ret; + } + /// + /// + /// + /// + /// + /// + public override bool SavaRolesByMenuId(int id, IEnumerable roleIds) + { + var ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("NavigationID", typeof(int)); + dt.Columns.Add("RoleID", typeof(int)); + //判断用户是否选定角色 + roleIds.ToList().ForEach(roleId => dt.Rows.Add(id, roleId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + // delete role from config table + string sql = "delete from NavigationRole where NavigationID=@NavigationID;"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@NavigationID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + + // insert batch data into config table + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.BatchSize = 1000; + bulk.DestinationTableName = "NavigationRole"; + bulk.ColumnMappings.Add("NavigationID", "NavigationID"); + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(roleIds: roleIds, menuIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 根据GroupId查询和该Group有关的所有Roles + /// + /// + /// + public override IEnumerable RetrieveRolesByGroupId(int groupId) + { + string key = string.Format("{0}-{1}", RetrieveRolesByGroupIdDataKey, groupId); + return CacheManager.GetOrAdd(key, k => + { + List roles = new List(); + string sql = "select r.ID, r.RoleName, r.[Description], case ur.RoleID when r.ID then 'checked' else '' end [status] from Roles r left join RoleGroup ur on r.ID = ur.RoleID and GroupID = @GroupID"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupID", groupId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + roles.Add(new Role() + { + Id = LgbConvert.ReadValue(reader[0], 0), + RoleName = (string)reader[1], + Description = reader.IsDBNull(2) ? string.Empty : (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return roles; + }, RetrieveRolesByGroupIdDataKey); + } + + /// + /// 根据GroupId更新Roles信息,删除旧的Roles信息,插入新的Roles信息 + /// + /// + /// + /// + public override bool SaveRolesByGroupId(int id, IEnumerable roleIds) + { + var ret = false; + //构造表格 + DataTable dt = new DataTable(); + dt.Columns.Add("RoleID", typeof(int)); + dt.Columns.Add("GroupID", typeof(int)); + roleIds.ToList().ForEach(roleId => dt.Rows.Add(roleId, id)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + // delete user from config table + string sql = "delete from RoleGroup where GroupID=@GroupID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + + // insert batch data into config table + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.BatchSize = 1000; + bulk.DestinationTableName = "RoleGroup"; + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.ColumnMappings.Add("GroupID", "GroupID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(roleIds: roleIds, groupIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + } +} \ No newline at end of file diff --git a/Bootstrap.DataAccess.SQLite/Task.cs b/Bootstrap.DataAccess.SQLite/Task.cs new file mode 100644 index 00000000..361d215b --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/Task.cs @@ -0,0 +1,44 @@ +using Longbow; +using Longbow.Cache; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; + +namespace Bootstrap.DataAccess.SQLite +{ + public class Task : DataAccess.Task + { + /// + /// 查询所有任务 + /// + /// + public override IEnumerable RetrieveTasks() + { + return CacheManager.GetOrAdd(RetrieveTasksDataKey, key => + { + string sql = "select t.*, u.DisplayName from Tasks t inner join Users u on t.UserName = u.UserName order by AssignTime desc limit 1000"; + List tasks = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + tasks.Add(new Task() + { + Id = LgbConvert.ReadValue(reader[0], 0), + TaskName = (string)reader[1], + AssignName = (string)reader[2], + UserName = (string)reader[3], + TaskTime = LgbConvert.ReadValue(reader[4], 0), + TaskProgress = (double)reader[5], + AssignTime = LgbConvert.ReadValue(reader[6], DateTime.MinValue), + AssignDisplayName = (string)reader[7] + }); + } + } + return tasks; + }); + } + } +} diff --git a/Bootstrap.DataAccess.SQLite/User.cs b/Bootstrap.DataAccess.SQLite/User.cs new file mode 100644 index 00000000..b47ea316 --- /dev/null +++ b/Bootstrap.DataAccess.SQLite/User.cs @@ -0,0 +1,420 @@ +using Bootstrap.Security; +using Longbow; +using Longbow.Cache; +using Longbow.Data; +using Longbow.Security; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Linq; + + +namespace Bootstrap.DataAccess.SQLite +{ + /// + /// 用户表实体类 + /// + public class User : DataAccess.User + { + /// + /// 查询所有用户 + /// + /// + /// + public override IEnumerable RetrieveUsers() + { + return CacheManager.GetOrAdd(RetrieveUsersDataKey, key => + { + List users = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, "select ID, UserName, DisplayName, RegisterTime, ApprovedTime, ApprovedBy, Description from Users Where ApprovedTime is not null"); + + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + users.Add(new User() + { + Id = LgbConvert.ReadValue(reader[0], 0), + UserName = (string)reader[1], + DisplayName = (string)reader[2], + RegisterTime = LgbConvert.ReadValue(reader[3], DateTime.MinValue), + ApprovedTime = LgbConvert.ReadValue(reader[4], DateTime.MinValue), + ApprovedBy = reader.IsDBNull(5) ? string.Empty : (string)reader[5], + Description = (string)reader[6] + }); + } + } + return users; + }); + } + /// + /// 查询所有的新注册用户 + /// + /// + public override IEnumerable RetrieveNewUsers() + { + return CacheManager.GetOrAdd(RetrieveNewUsersDataKey, key => + { + string sql = "select ID, UserName, DisplayName, RegisterTime, [Description] from Users Where ApprovedTime is null order by RegisterTime desc"; + List users = new List(); + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + users.Add(new User() + { + Id = LgbConvert.ReadValue(reader[0], 0), + UserName = (string)reader[1], + DisplayName = (string)reader[2], + RegisterTime = LgbConvert.ReadValue(reader[3], DateTime.MinValue), + Description = (string)reader[4] + }); + } + } + return users; + }); + } + /// + /// 删除用户 + /// + /// + public override bool DeleteUser(IEnumerable value) + { + bool ret = false; + var ids = string.Join(",", value); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_DeleteUsers")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@ids", ids)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + if (ret) CacheCleanUtility.ClearCache(userIds: value); + } + return ret; + } + /// + /// 保存新建 + /// + /// + /// + public override bool SaveUser(DataAccess.User p) + { + var ret = false; + if (p.Id == 0 && p.Description.Length > 500) p.Description = p.Description.Substring(0, 500); + if (p.UserName.Length > 50) p.UserName = p.UserName.Substring(0, 50); + p.PassSalt = LgbCryptography.GenerateSalt(); + p.Password = LgbCryptography.ComputeHash(p.Password, p.PassSalt); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_SaveUsers")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@userName", p.UserName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@password", p.Password)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@passSalt", p.PassSalt)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@displayName", p.DisplayName)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@approvedBy", DbAccessFactory.ToDBValue(p.ApprovedBy))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@description", p.Description)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == -1; + if (ret) CacheCleanUtility.ClearCache(userIds: p.Id == 0 ? new List() : new List() { p.Id }); + } + return ret; + } + /// + /// + /// + /// + /// + /// + /// + public override bool UpdateUser(int id, string password, string displayName) + { + bool ret = false; + string sql = "Update Users set Password = @Password, PassSalt = @PassSalt, DisplayName = @DisplayName where ID = @id"; + var passSalt = LgbCryptography.GenerateSalt(); + var newPassword = LgbCryptography.ComputeHash(password, passSalt); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@id", id)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@DisplayName", displayName)); + 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: id == 0 ? new List() : new List() { id }); + } + return ret; + } + /// + /// + /// + /// + /// + /// + public override bool ApproveUser(int id, string approvedBy) + { + var ret = false; + var sql = "update Users set ApprovedTime = datetime('now', 'localtime'), ApprovedBy = @approvedBy where ID = @id"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + 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; + } + /// + /// + /// + /// + /// + /// + /// + public override bool RejectUser(int id, string rejectBy) + { + var ret = false; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.StoredProcedure, "Proc_RejectUsers")) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@id", id)); + 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; + } + /// + /// 通过roleId获取所有用户 + /// + /// + /// + public override IEnumerable RetrieveUsersByRoleId(int roleId) + { + string key = string.Format("{0}-{1}", RetrieveUsersByRoleIdDataKey, roleId); + return CacheManager.GetOrAdd(key, k => + { + List users = new List(); + string sql = "select u.ID, u.UserName, u.DisplayName, case ur.UserID when u.ID then 'checked' else '' end [status] from Users u left join UserRole ur on u.ID = ur.UserID and RoleID = @RoleID where u.ApprovedTime is not null"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", roleId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + users.Add(new User() + { + Id = LgbConvert.ReadValue(reader[0], 0), + UserName = (string)reader[1], + DisplayName = (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return users; + }, RetrieveUsersByRoleIdDataKey); + } + /// + /// 通过角色ID保存当前授权用户(插入) + /// + /// 角色ID + /// 用户ID数组 + /// + public override bool SaveUsersByRoleId(int id, 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(id, userId)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除用户角色表该角色所有的用户 + string sql = "delete from UserRole where RoleID=@RoleID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@RoleID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + //批插入用户角色表 + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.DestinationTableName = "UserRole"; + bulk.ColumnMappings.Add("RoleID", "RoleID"); + bulk.ColumnMappings.Add("UserID", "UserID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(userIds: userIds, roleIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 通过groupId获取所有用户 + /// + /// + /// + public override IEnumerable RetrieveUsersByGroupId(int groupId) + { + string key = string.Format("{0}-{1}", RetrieveUsersByGroupIdDataKey, groupId); + return CacheManager.GetOrAdd(key, k => + { + List users = new List(); + string sql = "select u.ID, u.UserName, u.DisplayName, case ur.UserID when u.ID then 'checked' else '' end [status] from Users u left join UserGroup ur on u.ID = ur.UserID and GroupID =@groupId where u.ApprovedTime is not null"; + DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupID", groupId)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + while (reader.Read()) + { + users.Add(new User() + { + Id = LgbConvert.ReadValue(reader[0], 0), + UserName = (string)reader[1], + DisplayName = (string)reader[2], + Checked = (string)reader[3] + }); + } + } + return users; + }, RetrieveUsersByRoleIdDataKey); + } + /// + /// 通过部门ID保存当前授权用户(插入) + /// + /// GroupID + /// 用户ID数组 + /// + public override bool SaveUsersByGroupId(int id, IEnumerable userIds) + { + bool ret = false; + DataTable dt = new DataTable(); + dt.Columns.Add("UserID", typeof(int)); + dt.Columns.Add("GroupID", typeof(int)); + userIds.ToList().ForEach(userId => dt.Rows.Add(userId, id)); + using (TransactionPackage transaction = DBAccessManager.DBAccess.BeginTransaction()) + { + try + { + //删除用户角色表该角色所有的用户 + string sql = "delete from UserGroup where GroupID = @GroupID"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@GroupID", id)); + DBAccessManager.DBAccess.ExecuteNonQuery(cmd, transaction); + //批插入用户角色表 + using (SqlBulkCopy bulk = new SqlBulkCopy((SqlConnection)transaction.Transaction.Connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction.Transaction)) + { + bulk.DestinationTableName = "UserGroup"; + bulk.ColumnMappings.Add("UserID", "UserID"); + bulk.ColumnMappings.Add("GroupID", "GroupID"); + bulk.WriteToServer(dt); + transaction.CommitTransaction(); + } + } + CacheCleanUtility.ClearCache(userIds: userIds, groupIds: new List() { id }); + ret = true; + } + catch (Exception ex) + { + transaction.RollbackTransaction(); + throw ex; + } + } + return ret; + } + /// + /// 根据用户名修改用户头像 + /// + /// + /// + /// + public override bool SaveUserIconByName(string userName, string iconName) + { + bool ret = false; + string sql = "Update Users set Icon = @iconName where UserName = @userName"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + 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: $"{RetrieveUsersDataKey}*"); + } + return ret; + } + /// + /// + /// + /// + /// + /// + public override bool SaveDisplayName(string userName, string displayName) + { + bool ret = false; + string sql = "Update Users set DisplayName = @DisplayName where UserName = @userName"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + 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: $"{RetrieveUsersDataKey}*"); + } + return ret; + } + /// + /// 根据用户名更改用户皮肤 + /// + /// + /// + /// + public override bool SaveUserCssByName(string userName, string cssName) + { + bool ret = false; + string sql = "Update Users set Css = @cssName where UserName = @userName"; + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@cssName", DbAccessFactory.ToDBValue(cssName))); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@userName", userName)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + if (ret) CacheCleanUtility.ClearCache(cacheKey: $"{RetrieveUsersDataKey}*"); + } + return ret; + } + /// + /// + /// + /// + /// + public override BootstrapUser RetrieveUserByUserName(string userName) + { + var key = string.Format("{0}-{1}", RetrieveUsersByNameDataKey, userName); + return CacheManager.GetOrAdd(key, k => + { + BootstrapUser user = null; + var sql = "select UserName, DisplayName, case ifnull(d.Code, '') when '' then '~/images/uploader/' else d.Code end || ifnull(Icon, 'default.jpg') Icon, u.Css from Users u left join Dicts d on d.Define = '0' and d.Category = '头像地址' and Name = '头像路径' where ApprovedTime is not null and UserName = @UserName"; + var cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@UserName", userName)); + using (DbDataReader reader = DBAccessManager.DBAccess.ExecuteReader(cmd)) + { + if (reader.Read()) + { + user = new BootstrapUser + { + UserName = (string)reader[0], + DisplayName = (string)reader[1], + Icon = (string)reader[2], + Css = reader.IsDBNull(3) ? string.Empty : (string)reader[3] + }; + } + } + return user; + }, RetrieveUsersByNameDataKey); + } + } +} diff --git a/Bootstrap.DataAccess/Bootstrap.DataAccess.csproj b/Bootstrap.DataAccess/Bootstrap.DataAccess.csproj index b464d8ba..25006cf2 100644 --- a/Bootstrap.DataAccess/Bootstrap.DataAccess.csproj +++ b/Bootstrap.DataAccess/Bootstrap.DataAccess.csproj @@ -13,6 +13,8 @@ + + diff --git a/Bootstrap.DataAccess/CacheCleanUtility.cs b/Bootstrap.DataAccess/CacheCleanUtility.cs index c663f5b8..9795104f 100644 --- a/Bootstrap.DataAccess/CacheCleanUtility.cs +++ b/Bootstrap.DataAccess/CacheCleanUtility.cs @@ -1,87 +1,89 @@ -using Bootstrap.Security; -using Longbow.Cache; -using System.Collections.Generic; -using System.Linq; - -namespace Bootstrap.DataAccess -{ - internal static class CacheCleanUtility - { - private const string RetrieveAllRolesDataKey = "BootstrapAdminRoleMiddleware-RetrieveRoles"; - /// - /// - /// - /// - /// - /// - /// - /// - /// - internal static void ClearCache(IEnumerable roleIds = null, IEnumerable userIds = null, IEnumerable groupIds = null, IEnumerable menuIds = null, string dictIds = null, string cacheKey = null) - { - var cacheKeys = new List(); - var corsKeys = new List(); - if (roleIds != null) - { - roleIds.ToList().ForEach(id => - { - cacheKeys.Add(string.Format("{0}-{1}", UserHelper.RetrieveUsersByRoleIdDataKey, id)); - cacheKeys.Add(string.Format("{0}-{1}", GroupHelper.RetrieveGroupsByRoleIdDataKey, id)); - cacheKeys.Add(string.Format("{0}-{1}", MenuHelper.RetrieveMenusByRoleIdDataKey, id)); - }); - cacheKeys.Add(RoleHelper.RetrieveRolesDataKey + "*"); - cacheKeys.Add(BootstrapMenu.RetrieveMenusDataKey + "*"); - cacheKeys.Add(RetrieveAllRolesDataKey + "*"); - corsKeys.Add(BootstrapMenu.RetrieveMenusDataKey + "*"); - } - if (userIds != null) - { - userIds.ToList().ForEach(id => - { - cacheKeys.Add(string.Format("{0}-{1}", RoleHelper.RetrieveRolesByUserIdDataKey, id)); - cacheKeys.Add(string.Format("{0}-{1}", GroupHelper.RetrieveGroupsByUserIdDataKey, id)); - cacheKeys.Add(BootstrapMenu.RetrieveMenusDataKey + "*"); - corsKeys.Add(BootstrapMenu.RetrieveMenusDataKey + "*"); - }); - cacheKeys.Add(UserHelper.RetrieveNewUsersDataKey + "*"); - cacheKeys.Add(UserHelper.RetrieveUsersDataKey + "*"); - corsKeys.Add(UserHelper.RetrieveUsersDataKey + "*"); - } - if (groupIds != null) - { - groupIds.ToList().ForEach(id => - { - cacheKeys.Add(string.Format("{0}-{1}", RoleHelper.RetrieveRolesByGroupIdDataKey, id)); - cacheKeys.Add(string.Format("{0}-{1}", UserHelper.RetrieveUsersByGroupIdDataKey, id)); - }); - cacheKeys.Add(GroupHelper.RetrieveGroupsDataKey + "*"); - cacheKeys.Add(BootstrapMenu.RetrieveMenusDataKey + "*"); - corsKeys.Add(BootstrapMenu.RetrieveMenusDataKey + "*"); - cacheKeys.Add(RetrieveAllRolesDataKey + "*"); - } - if (menuIds != null) - { - menuIds.ToList().ForEach(id => - { - cacheKeys.Add(string.Format("{0}-{1}", RoleHelper.RetrieveRolesByMenuIdDataKey, id)); - }); - cacheKeys.Add(MenuHelper.RetrieveMenusByRoleIdDataKey + "*"); - cacheKeys.Add(BootstrapMenu.RetrieveMenusDataKey + "*"); - corsKeys.Add(BootstrapMenu.RetrieveMenusDataKey + "*"); - } - if (dictIds != null) - { - cacheKeys.Add(BootstrapDict.RetrieveDictsDataKey + "*"); - cacheKeys.Add(DictHelper.RetrieveCategoryDataKey); - corsKeys.Add(BootstrapDict.RetrieveDictsDataKey + "*"); - } - if (cacheKey != null) - { - cacheKeys.Add(cacheKey); - corsKeys.Add(cacheKey); - } - CacheManager.Clear(cacheKeys); - CacheManager.CorsClear(corsKeys); - } - } -} +using Longbow.Cache; +using System.Collections.Generic; +using System.Linq; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public static class CacheCleanUtility + { + private const string RetrieveAllRolesDataKey = "BootstrapAdminRoleMiddleware-RetrieveRoles"; + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void ClearCache(IEnumerable roleIds = null, IEnumerable userIds = null, IEnumerable groupIds = null, IEnumerable menuIds = null, string dictIds = null, string cacheKey = null) + { + var cacheKeys = new List(); + var corsKeys = new List(); + if (roleIds != null) + { + roleIds.ToList().ForEach(id => + { + cacheKeys.Add(string.Format("{0}-{1}", User.RetrieveUsersByRoleIdDataKey, id)); + cacheKeys.Add(string.Format("{0}-{1}", Group.RetrieveGroupsByRoleIdDataKey, id)); + cacheKeys.Add(string.Format("{0}-{1}", Menu.RetrieveMenusByRoleIdDataKey, id)); + }); + cacheKeys.Add(Role.RetrieveRolesDataKey + "*"); + cacheKeys.Add(Menu.RetrieveMenusDataKey + "*"); + cacheKeys.Add(RetrieveAllRolesDataKey + "*"); + corsKeys.Add(Menu.RetrieveMenusDataKey + "*"); + } + if (userIds != null) + { + userIds.ToList().ForEach(id => + { + cacheKeys.Add(string.Format("{0}-{1}", Role.RetrieveRolesByUserIdDataKey, id)); + cacheKeys.Add(string.Format("{0}-{1}", Group.RetrieveGroupsByUserIdDataKey, id)); + cacheKeys.Add(Menu.RetrieveMenusDataKey + "*"); + corsKeys.Add(Menu.RetrieveMenusDataKey + "*"); + }); + cacheKeys.Add(User.RetrieveNewUsersDataKey + "*"); + cacheKeys.Add(User.RetrieveUsersDataKey + "*"); + corsKeys.Add(User.RetrieveUsersDataKey + "*"); + } + if (groupIds != null) + { + groupIds.ToList().ForEach(id => + { + cacheKeys.Add(string.Format("{0}-{1}", Role.RetrieveRolesByGroupIdDataKey, id)); + cacheKeys.Add(string.Format("{0}-{1}", User.RetrieveUsersByGroupIdDataKey, id)); + }); + cacheKeys.Add(Group.RetrieveGroupsDataKey + "*"); + cacheKeys.Add(Menu.RetrieveMenusDataKey + "*"); + corsKeys.Add(Menu.RetrieveMenusDataKey + "*"); + cacheKeys.Add(RetrieveAllRolesDataKey + "*"); + } + if (menuIds != null) + { + menuIds.ToList().ForEach(id => + { + cacheKeys.Add(string.Format("{0}-{1}", Role.RetrieveRolesByMenuIdDataKey, id)); + }); + cacheKeys.Add(Menu.RetrieveMenusByRoleIdDataKey + "*"); + cacheKeys.Add(Menu.RetrieveMenusDataKey + "*"); + corsKeys.Add(Menu.RetrieveMenusDataKey + "*"); + } + if (dictIds != null) + { + cacheKeys.Add(Dict.RetrieveDictsDataKey + "*"); + cacheKeys.Add(Dict.RetrieveCategoryDataKey); + corsKeys.Add(Dict.RetrieveDictsDataKey + "*"); + } + if (cacheKey != null) + { + cacheKeys.Add(cacheKey); + corsKeys.Add(cacheKey); + } + CacheManager.Clear(cacheKeys); + CacheManager.CorsClear(corsKeys); + } + } +} diff --git a/Bootstrap.DataAccess/DBAccessManager.cs b/Bootstrap.DataAccess/DBAccessManager.cs index df7fd313..fcf3289f 100644 --- a/Bootstrap.DataAccess/DBAccessManager.cs +++ b/Bootstrap.DataAccess/DBAccessManager.cs @@ -1,18 +1,20 @@ -using Longbow.Data; -using System; - -namespace Bootstrap.DataAccess -{ - /// - /// - /// - public static class DBAccessManager - { - private static readonly Lazy db = new Lazy(() => DBAccessFactory.CreateDB("ba"), true); - - public static IDBAccess SqlDBAccess - { - get { return db.Value; } - } - } -} +using Longbow.Data; +using System; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public static class DBAccessManager + { + private static readonly Lazy db = new Lazy(() => DbAccessFactory.CreateDB("ba"), true); + /// + /// + /// + public static IDbAccess DBAccess + { + get { return db.Value; } + } + } +} diff --git a/Bootstrap.DataAccess/Dict.cs b/Bootstrap.DataAccess/Dict.cs new file mode 100644 index 00000000..d2cc2719 --- /dev/null +++ b/Bootstrap.DataAccess/Dict.cs @@ -0,0 +1,111 @@ +using Bootstrap.Security; +using Longbow; +using Longbow.Cache; +using System; +using System.Collections.Generic; +using System.Data; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public class Dict : BootstrapDict + { + /// + /// + /// + public const string RetrieveCategoryDataKey = "DictHelper-RetrieveDictsCategory"; + /// + /// 缓存索引,BootstrapAdmin后台清理缓存时使用 + /// + public const string RetrieveDictsDataKey = "BootstrapDict-RetrieveDicts"; + /// + /// + /// + /// + public virtual IEnumerable> RetrieveApps() => throw new NotImplementedException(); + /// + /// 删除字典中的数据 + /// + /// 需要删除的IDs + /// + public virtual bool DeleteDict(IEnumerable value) => throw new NotImplementedException(); + /// + /// 保存新建/更新的字典信息 + /// + /// + /// + public virtual bool SaveDict(BootstrapDict dict) => throw new NotImplementedException(); + /// + /// 保存网站个性化设置 + /// + /// + /// + /// + /// + public virtual bool SaveSettings(BootstrapDict dict) => throw new NotImplementedException(); + /// + /// 获取字典分类名称 + /// + /// + public virtual IEnumerable RetrieveCategories() => throw new NotImplementedException(); + /// + /// + /// + /// + public virtual string RetrieveWebTitle() => throw new NotImplementedException(); + /// + /// + /// + /// + public virtual string RetrieveWebFooter() => throw new NotImplementedException(); + /// + /// 获得系统中配置的可以使用的网站样式 + /// + /// + public virtual IEnumerable RetrieveThemes() => throw new NotImplementedException(); + /// + /// 获得网站设置中的当前样式 + /// + /// + public virtual string RetrieveActiveTheme() => throw new NotImplementedException(); + /// + /// 获取头像路径 + /// + /// + public virtual BootstrapDict RetrieveIconFolderPath() => throw new NotImplementedException(); + /// + /// 获得默认的前台首页地址,默认为~/Home/Index + /// + /// + public virtual string RetrieveHomeUrl() => throw new NotImplementedException(); + /// + /// 通过数据库获得所有字典表配置信息,缓存Key=DictHelper-RetrieveDicts + /// + /// 数据库连接实例 + /// + public virtual IEnumerable RetrieveDicts() => CacheManager.GetOrAdd(RetrieveDictsDataKey, key => + { + string sql = "select ID, Category, Name, Code, Define from Dicts"; + var Dicts = new List(); + var db = DBAccessManager.DBAccess; + var cmd = db.CreateCommand(CommandType.Text, sql); + using (var reader = db.ExecuteReader(cmd)) + { + while (reader.Read()) + { + Dicts.Add(new BootstrapDict + { + Id = LgbConvert.ReadValue(reader[0], 0), + Category = (string)reader[1], + Name = (string)reader[2], + Code = (string)reader[3], + Define = LgbConvert.ReadValue(reader[4], 0) + }); + } + } + return Dicts; + }); + } +} diff --git a/Bootstrap.DataAccess/Exceptions.cs b/Bootstrap.DataAccess/Exceptions.cs index 4edbd305..e83ec986 100644 --- a/Bootstrap.DataAccess/Exceptions.cs +++ b/Bootstrap.DataAccess/Exceptions.cs @@ -1,4 +1,7 @@ using System; +using System.Collections.Generic; +using System.Collections.Specialized; + namespace Bootstrap.DataAccess { /// @@ -6,6 +9,10 @@ namespace Bootstrap.DataAccess /// public class Exceptions { + /// + /// + /// + protected const string RetrieveExceptionsDataKey = "ExceptionHelper-RetrieveExceptions"; /// /// /// @@ -46,5 +53,17 @@ namespace Bootstrap.DataAccess /// 获得/设置 时间描述 2分钟内为刚刚 /// public string Period { get; set; } + /// + /// + /// + /// + /// + /// + public virtual void Log(Exception ex, NameValueCollection additionalInfo) => throw new NotImplementedException(); + /// + /// 查询一周内所有异常 + /// + /// + public virtual IEnumerable RetrieveExceptions() => throw new NotImplementedException(); } } diff --git a/Bootstrap.DataAccess/Group.cs b/Bootstrap.DataAccess/Group.cs index 36861f0b..c66f52ee 100644 --- a/Bootstrap.DataAccess/Group.cs +++ b/Bootstrap.DataAccess/Group.cs @@ -1,10 +1,20 @@ -namespace Bootstrap.DataAccess +using Longbow.Cache; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; + +namespace Bootstrap.DataAccess { /// /// /// public class Group { + public const string RetrieveGroupsDataKey = "GroupHelper-RetrieveGroups"; + public const string RetrieveGroupsByUserIdDataKey = "GroupHelper-RetrieveGroupsByUserId"; + public const string RetrieveGroupsByRoleIdDataKey = "GroupHelper-RetrieveGroupsByRoleId"; + public const string RetrieveGroupsByUserNameDataKey = "BootstrapAdminGroupMiddleware-RetrieveGroupsByUserName"; /// /// 获得/设置 群组主键ID /// @@ -24,5 +34,74 @@ /// 获取/设置 用户群组关联状态 checked 标示已经关联 '' 标示未关联 /// public string Checked { get; set; } + /// + /// 查询所有群组信息 + /// + /// + /// + public virtual IEnumerable RetrieveGroups(int id = 0) => throw new NotImplementedException(); + /// + /// 删除群组信息 + /// + /// + public virtual bool DeleteGroup(IEnumerable value) => throw new NotImplementedException(); + /// + /// 保存新建/更新的群组信息 + /// + /// + /// + public virtual bool SaveGroup(Group p) => throw new NotImplementedException(); + /// + /// 根据用户查询部门信息 + /// + /// + /// + public virtual IEnumerable RetrieveGroupsByUserId(int userId) => throw new NotImplementedException(); + /// + /// 保存用户部门关系 + /// + /// + /// + /// + public virtual bool SaveGroupsByUserId(int id, IEnumerable groupIds) => throw new NotImplementedException(); + /// + /// 根据角色ID指派部门 + /// + /// + /// + public virtual IEnumerable RetrieveGroupsByRoleId(int roleId) => throw new NotImplementedException(); + /// + /// 根据角色ID以及选定的部门ID,保到角色部门表 + /// + /// + /// + /// + public virtual bool SaveGroupsByRoleId(int id, IEnumerable groupIds) => throw new NotImplementedException(); + /// + /// + /// + /// + /// + /// + public virtual IEnumerable RetrieveGroupsByUserName(string userName) + { + return CacheManager.GetOrAdd(string.Format("{0}-{1}", RetrieveGroupsByUserNameDataKey, userName), r => + { + var entities = new List(); + var db = DBAccessManager.DBAccess; + using (DbCommand cmd = db.CreateCommand(CommandType.Text, "select g.GroupName, g.[Description] from Groups g inner join UserGroup ug on g.ID = ug.GroupID inner join Users u on ug.UserID = u.ID where UserName = @UserName")) + { + cmd.Parameters.Add(db.CreateParameter("@UserName", userName)); + using (DbDataReader reader = db.ExecuteReader(cmd)) + { + while (reader.Read()) + { + entities.Add((string)reader[0]); + } + } + } + return entities; + }, RetrieveGroupsByUserNameDataKey); + } } } diff --git a/Bootstrap.DataAccess/Helper/DictHelper.cs b/Bootstrap.DataAccess/Helper/DictHelper.cs new file mode 100644 index 00000000..1d23e168 --- /dev/null +++ b/Bootstrap.DataAccess/Helper/DictHelper.cs @@ -0,0 +1,78 @@ +using Bootstrap.Security; +using Longbow.Data; +using System.Collections.Generic; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public static class DictHelper + { + /// + /// + /// + /// + public static IEnumerable RetrieveDicts() => DbAdapterManager.Create().RetrieveDicts(); + /// + /// 删除字典中的数据 + /// + /// 需要删除的IDs + /// + public static bool DeleteDict(IEnumerable value) => DbAdapterManager.Create().DeleteDict(value); + /// + /// 保存新建/更新的字典信息 + /// + /// + /// + public static bool SaveDict(BootstrapDict p) => DbAdapterManager.Create().SaveDict(p); + /// + /// 保存网站个性化设置 + /// + /// + /// + /// + /// + public static bool SaveSettings(BootstrapDict dict) => DbAdapterManager.Create().SaveSettings(dict); + /// + /// 获取字典分类名称 + /// + /// + public static IEnumerable RetrieveCategories() => DbAdapterManager.Create().RetrieveCategories(); + /// + /// + /// + /// + public static string RetrieveWebTitle() => DbAdapterManager.Create().RetrieveWebTitle(); + /// + /// + /// + /// + public static string RetrieveWebFooter() => DbAdapterManager.Create().RetrieveWebFooter(); + /// + /// 获得系统中配置的可以使用的网站样式 + /// + /// + public static IEnumerable RetrieveThemes() => DbAdapterManager.Create().RetrieveThemes(); + /// + /// 获得网站设置中的当前样式 + /// + /// + public static string RetrieveActiveTheme() => DbAdapterManager.Create().RetrieveActiveTheme(); + /// + /// 获取头像路径 + /// + /// + public static BootstrapDict RetrieveIconFolderPath() => DbAdapterManager.Create().RetrieveIconFolderPath(); + /// + /// 获得默认的前台首页地址,默认为~/Home/Index + /// + /// + public static string RetrieveHomeUrl() => DbAdapterManager.Create().RetrieveHomeUrl(); + /// + /// + /// + /// + public static IEnumerable> RetrieveApps() => DbAdapterManager.Create().RetrieveApps(); + } +} diff --git a/Bootstrap.DataAccess/Helper/ExceptionsHelper.cs b/Bootstrap.DataAccess/Helper/ExceptionsHelper.cs new file mode 100644 index 00000000..363a9754 --- /dev/null +++ b/Bootstrap.DataAccess/Helper/ExceptionsHelper.cs @@ -0,0 +1,26 @@ +using Longbow.Data; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public static class ExceptionsHelper + { + /// + /// + /// + /// + /// + /// + public static void Log(Exception ex, NameValueCollection additionalInfo) => DbAdapterManager.Create().Log(ex, additionalInfo); + /// + /// 查询一周内所有异常 + /// + /// + public static IEnumerable RetrieveExceptions() => DbAdapterManager.Create().RetrieveExceptions(); + } +} diff --git a/Bootstrap.DataAccess/Helper/GroupHelper.cs b/Bootstrap.DataAccess/Helper/GroupHelper.cs new file mode 100644 index 00000000..8aec4d4c --- /dev/null +++ b/Bootstrap.DataAccess/Helper/GroupHelper.cs @@ -0,0 +1,56 @@ +using Longbow.Data; +using System.Collections.Generic; + +namespace Bootstrap.DataAccess +{ + /// + /// author:liuchun + /// date:2016.10.22 + /// + public static class GroupHelper + { + /// + /// 查询所有群组信息 + /// + /// + /// + public static IEnumerable RetrieveGroups(int id = 0) => DbAdapterManager.Create().RetrieveGroups(id); + /// + /// 删除群组信息 + /// + /// + public static bool DeleteGroup(IEnumerable value) => DbAdapterManager.Create().DeleteGroup(value); + /// + /// 保存新建/更新的群组信息 + /// + /// + /// + public static bool SaveGroup(Group p) => DbAdapterManager.Create().SaveGroup(p); + /// + /// 根据用户查询部门信息 + /// + /// + /// + public static IEnumerable RetrieveGroupsByUserId(int userId) => DbAdapterManager.Create().RetrieveGroupsByUserId(userId); + /// + /// 保存用户部门关系 + /// + /// + /// + /// + public static bool SaveGroupsByUserId(int id, IEnumerable groupIds) => DbAdapterManager.Create().SaveGroupsByUserId(id, groupIds); + /// + /// 根据角色ID指派部门 + /// + /// + /// + public static IEnumerable RetrieveGroupsByRoleId(int roleId) => DbAdapterManager.Create().RetrieveGroupsByRoleId(roleId); + /// + /// 根据角色ID以及选定的部门ID,保到角色部门表 + /// + /// + /// + /// + public static bool SaveGroupsByRoleId(int id, IEnumerable groupIds) => DbAdapterManager.Create().SaveGroupsByRoleId(id, groupIds); + } +} diff --git a/Bootstrap.DataAccess/Helper/LogHelper.cs b/Bootstrap.DataAccess/Helper/LogHelper.cs new file mode 100644 index 00000000..9de1770b --- /dev/null +++ b/Bootstrap.DataAccess/Helper/LogHelper.cs @@ -0,0 +1,21 @@ +using Longbow.Data; +using System.Collections.Generic; + +namespace Bootstrap.DataAccess +{ + public static class LogHelper + { + /// + /// 查询所有日志信息 + /// + /// + /// + public static IEnumerable RetrieveLogs(string tId = null) => DbAdapterManager.Create().RetrieveLogs(tId); + /// + /// 保存新增的日志信息 + /// + /// + /// + public static bool SaveLog(Log p) => DbAdapterManager.Create().SaveLog(p); + } +} diff --git a/Bootstrap.DataAccess/Helper/MenuHelper.cs b/Bootstrap.DataAccess/Helper/MenuHelper.cs new file mode 100644 index 00000000..53167638 --- /dev/null +++ b/Bootstrap.DataAccess/Helper/MenuHelper.cs @@ -0,0 +1,65 @@ +using Bootstrap.Security; +using Longbow.Data; +using System; +using System.Collections.Generic; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public static class MenuHelper + { + /// + /// + /// + /// + /// + public static bool SaveMenu(BootstrapMenu value) => DbAdapterManager.Create().SaveMenu(value); + /// + /// + /// + /// + /// + public static bool DeleteMenu(IEnumerable value) => DbAdapterManager.Create().DeleteMenu(value); + /// + /// + /// + /// + /// + public static IEnumerable RetrieveMenusByUserName(string userName) => DbAdapterManager.Create().RetrieveMenusByUserName(userName); + /// + /// + /// + /// + /// + public static IEnumerable RetrieveMenusByRoleId(int id) => DbAdapterManager.Create().RetrieveMenusByRoleId(id); + /// + /// + /// + /// + /// + /// + public static bool SaveMenusByRoleId(int id, IEnumerable value) => DbAdapterManager.Create().SaveMenusByRoleId(id, value); + /// + /// + /// + /// + /// + /// + public static IEnumerable RetrieveAppMenus(string name, string url) => DbAdapterManager.Create().RetrieveAppMenus(name, url); + /// + /// + /// + /// + /// + /// + public static IEnumerable RetrieveSystemMenus(string userName, string activeUrl = null) => DbAdapterManager.Create().RetrieveSystemMenus(userName, activeUrl); + /// + /// + /// + /// + /// + public static IEnumerable RetrieveAllMenus(string name) => DbAdapterManager.Create().RetrieveAllMenus(name); + } +} diff --git a/Bootstrap.DataAccess/Helper/MessageHelper.cs b/Bootstrap.DataAccess/Helper/MessageHelper.cs new file mode 100644 index 00000000..66b6ae7b --- /dev/null +++ b/Bootstrap.DataAccess/Helper/MessageHelper.cs @@ -0,0 +1,41 @@ +using Longbow.Data; +using System.Collections.Generic; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public static class MessageHelper + { + /// + /// 收件箱 + /// + /// + public static IEnumerable Inbox(string userName) => DbAdapterManager.Create().Inbox(userName); + /// + /// 发件箱 + /// + /// + /// + public static IEnumerable SendMail(string userName) => DbAdapterManager.Create().SendMail(userName); + /// + /// 垃圾箱 + /// + /// + /// + public static IEnumerable Trash(string userName) => DbAdapterManager.Create().Trash(userName); + /// + /// 标旗 + /// + /// + /// + public static IEnumerable Mark(string userName) => DbAdapterManager.Create().Flag(userName); + /// + /// 获取Header处显示的消息列表 + /// + /// + /// + public static IEnumerable RetrieveMessagesHeader(string userName) => DbAdapterManager.Create().RetrieveMessagesHeader(userName); + } +} diff --git a/Bootstrap.DataAccess/Helper/RoleHelper.cs b/Bootstrap.DataAccess/Helper/RoleHelper.cs new file mode 100644 index 00000000..4cafdb3d --- /dev/null +++ b/Bootstrap.DataAccess/Helper/RoleHelper.cs @@ -0,0 +1,79 @@ +using Longbow.Data; +using System.Collections.Generic; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public static class RoleHelper + { + /// + /// 查询所有角色 + /// + /// + /// + public static IEnumerable RetrieveRoles(int id = 0) => DbAdapterManager.Create().RetrieveRoles(id); + /// + /// 保存用户角色关系 + /// + /// + /// + /// + public static bool SaveRolesByUserId(int id, IEnumerable roleIds) => DbAdapterManager.Create().SaveRolesByUserId(id, roleIds); + /// + /// 查询某个用户所拥有的角色 + /// + /// + public static IEnumerable RetrieveRolesByUserId(int userId) => DbAdapterManager.Create().RetrieveRolesByUserId(userId); + /// + /// 删除角色表 + /// + /// + public static bool DeleteRole(IEnumerable value) => DbAdapterManager.Create().DeleteRole(value); + /// + /// 保存新建/更新的角色信息 + /// + /// + /// + public static bool SaveRole(Role p) => DbAdapterManager.Create().SaveRole(p); + /// + /// 查询某个菜单所拥有的角色 + /// + /// + /// + public static IEnumerable RetrieveRolesByMenuId(int menuId) => DbAdapterManager.Create().RetrieveRolesByMenuId(menuId); + /// + /// + /// + /// + /// + /// + public static bool SavaRolesByMenuId(int id, IEnumerable roleIds) => DbAdapterManager.Create().SavaRolesByMenuId(id, roleIds); + /// + /// 根据GroupId查询和该Group有关的所有Roles + /// + /// + /// + public static IEnumerable RetrieveRolesByGroupId(int groupId) => DbAdapterManager.Create().RetrieveRolesByGroupId(groupId); + /// + /// 根据GroupId更新Roles信息,删除旧的Roles信息,插入新的Roles信息 + /// + /// + /// + /// + public static bool SaveRolesByGroupId(int id, IEnumerable roleIds) => DbAdapterManager.Create().SaveRolesByGroupId(id, roleIds); + /// + /// + /// + /// + /// + public static IEnumerable RetrieveRolesByUserName(string userName) => DbAdapterManager.Create().RetrieveRolesByUserName(userName); + /// + /// + /// + /// + /// + public static IEnumerable RetrieveRolesByUrl(string url) => DbAdapterManager.Create().RetrieveRolesByUrl(url); + } +} \ No newline at end of file diff --git a/Bootstrap.DataAccess/Helper/TaskHelper.cs b/Bootstrap.DataAccess/Helper/TaskHelper.cs new file mode 100644 index 00000000..48c9a531 --- /dev/null +++ b/Bootstrap.DataAccess/Helper/TaskHelper.cs @@ -0,0 +1,14 @@ +using Longbow.Data; +using System.Collections.Generic; + +namespace Bootstrap.DataAccess +{ + public static class TaskHelper + { + /// + /// 查询所有任务 + /// + /// + public static IEnumerable RetrieveTasks() => DbAdapterManager.Create().RetrieveTasks(); + } +} diff --git a/Bootstrap.DataAccess/Helper/UserHelper.cs b/Bootstrap.DataAccess/Helper/UserHelper.cs new file mode 100644 index 00000000..6de19a36 --- /dev/null +++ b/Bootstrap.DataAccess/Helper/UserHelper.cs @@ -0,0 +1,125 @@ +using Bootstrap.Security; +using Longbow.Data; +using System.Collections.Generic; + +namespace Bootstrap.DataAccess +{ + /// + /// 用户表相关操作类 + /// + public static class UserHelper + { + /// + /// 查询所有用户 + /// + /// + /// + public static IEnumerable RetrieveUsers() => DbAdapterManager.Create().RetrieveUsers(); + /// + /// + /// + /// + /// + /// + public static bool Authenticate(string userName, string password) => DbAdapterManager.Create().Authenticate(userName, password); + /// + /// 查询所有的新注册用户 + /// + /// + public static IEnumerable RetrieveNewUsers() => DbAdapterManager.Create().RetrieveNewUsers(); + /// + /// 删除用户 + /// + /// + public static bool DeleteUser(IEnumerable value) => DbAdapterManager.Create().DeleteUser(value); + /// + /// 保存新建 + /// + /// + /// + public static bool SaveUser(User p) => DbAdapterManager.Create().SaveUser(p); + /// + /// + /// + /// + /// + /// + /// + public static bool UpdateUser(int id, string password, string displayName) => DbAdapterManager.Create().UpdateUser(id, password, displayName); + /// + /// + /// + /// + /// + /// + public static bool ApproveUser(int id, string approvedBy) => DbAdapterManager.Create().ApproveUser(id, approvedBy); + /// + /// + /// + /// + /// + /// + /// + public static bool ChangePassword(string userName, string password, string newPass) => DbAdapterManager.Create().ChangePassword(userName, password, newPass); + /// + /// + /// + /// + /// + /// + /// + public static bool RejectUser(int id, string rejectBy) => DbAdapterManager.Create().RejectUser(id, rejectBy); + /// + /// 通过roleId获取所有用户 + /// + /// + /// + public static IEnumerable RetrieveUsersByRoleId(int roleId) => DbAdapterManager.Create().RetrieveUsersByRoleId(roleId); + /// + /// 通过角色ID保存当前授权用户(插入) + /// + /// 角色ID + /// 用户ID数组 + /// + public static bool SaveUsersByRoleId(int id, IEnumerable userIds) => DbAdapterManager.Create().SaveUsersByRoleId(id, userIds); + /// + /// 通过groupId获取所有用户 + /// + /// + /// + public static IEnumerable RetrieveUsersByGroupId(int groupId) => DbAdapterManager.Create().RetrieveUsersByGroupId(groupId); + /// + /// 通过部门ID保存当前授权用户(插入) + /// + /// GroupID + /// 用户ID数组 + /// + public static bool SaveUsersByGroupId(int id, IEnumerable userIds) => DbAdapterManager.Create().SaveUsersByGroupId(id, userIds); + /// 根据用户名修改用户头像 + /// + /// + /// + /// + public static bool SaveUserIconByName(string userName, string iconName) => DbAdapterManager.Create().SaveUserIconByName(userName, iconName); + /// + /// + /// + /// + /// + /// + public static bool SaveDisplayName(string userName, string displayName) => DbAdapterManager.Create().SaveDisplayName(userName, displayName); + /// + /// 根据用户名更改用户皮肤 + /// + /// + /// + /// + public static bool SaveUserCssByName(string userName, string cssName) => DbAdapterManager.Create().SaveUserCssByName(userName, cssName); + /// + /// + /// + /// + /// + public static BootstrapUser RetrieveUserByUserName(string name) => DbAdapterManager.Create().RetrieveUserByUserName(name); + } +} diff --git a/Bootstrap.DataAccess/Log.cs b/Bootstrap.DataAccess/Log.cs index 16dc2ef8..a6ffb630 100644 --- a/Bootstrap.DataAccess/Log.cs +++ b/Bootstrap.DataAccess/Log.cs @@ -1,8 +1,11 @@ using System; +using System.Collections.Generic; + namespace Bootstrap.DataAccess { public class Log { + protected const string RetrieveLogsDataKey = "LogHelper-RetrieveLogs"; /// /// 获得/设置 操作日志主键ID /// @@ -37,5 +40,17 @@ namespace Bootstrap.DataAccess /// 获取/设置 请求网址 /// public string RequestUrl { get; set; } + /// + /// 查询所有日志信息 + /// + /// + /// + public virtual IEnumerable RetrieveLogs(string tId = null) => throw new NotImplementedException(); + /// + /// 保存新增的日志信息 + /// + /// + /// + public virtual bool SaveLog(Log p) => throw new NotImplementedException(); } } diff --git a/Bootstrap.DataAccess/Menu.cs b/Bootstrap.DataAccess/Menu.cs new file mode 100644 index 00000000..64237306 --- /dev/null +++ b/Bootstrap.DataAccess/Menu.cs @@ -0,0 +1,168 @@ +using Bootstrap.Security; +using Longbow; +using Longbow.Cache; +using Longbow.Configuration; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; + +namespace Bootstrap.DataAccess +{ + /// + /// + /// + public class Menu : BootstrapMenu + { + /// + /// + /// + public const string RetrieveMenusByRoleIdDataKey = "MenuHelper-RetrieveMenusByRoleId"; + public const string RetrieveMenusDataKey = "BootstrapMenu-RetrieveMenusByUserName"; + public const string RetrieveMenusAll = "BootstrapMenu-RetrieveMenus"; + /// + /// 删除菜单信息 + /// + /// + public virtual bool DeleteMenu(IEnumerable value) => throw new NotImplementedException(); + /// + /// 保存新建/更新的菜单信息 + /// + /// + /// + public virtual bool SaveMenu(BootstrapMenu p) => throw new NotImplementedException(); + /// + /// 查询某个角色所配置的菜单 + /// + /// + /// + public virtual IEnumerable RetrieveMenusByRoleId(int roleId) => throw new NotImplementedException(); + /// + /// 通过角色ID保存当前授权菜单 + /// + /// + /// + /// + public virtual bool SaveMenusByRoleId(int id, IEnumerable menuIds) => throw new NotImplementedException(); + /// + /// 通过当前用户名获得所有菜单,层次化后集合 + /// + /// 当前登陆的用户名 + /// 当前访问菜单 + /// 连接字符串名称,默认为ba + /// + public virtual IEnumerable RetrieveAllMenus(string userName, string activeUrl = null) + { + var menus = RetrieveMenusByUserName(userName, activeUrl); + var root = menus.Where(m => m.ParentId == 0).OrderBy(m => m.Category).ThenBy(m => m.ApplicationCode).ThenBy(m => m.Order); + CascadeMenus(menus, root); + return root; + } + /// + /// 通过当前用户名获得前台菜单,层次化后集合 + /// + /// 当前登陆的用户名 + /// 当前访问菜单 + /// 连接字符串名称,默认为ba + /// + public virtual IEnumerable RetrieveAppMenus(string userName, string activeUrl = null) + { + var menus = RetrieveMenusByUserName(userName, activeUrl).Where(m => m.Category == "1" && m.IsResource == 0); + var root = menus.Where(m => m.ParentId == 0).OrderBy(m => m.ApplicationCode).ThenBy(m => m.Order); + CascadeMenus(menus, root); + return root; + } + /// + /// 通过当前用户名获得所有菜单 + /// + /// 当前登陆的用户名 + /// 当前访问菜单 + /// + public virtual IEnumerable RetrieveMenusByUserName(string userName, string activeUrl = null) + { + // TODO: 考虑第三方应用获取 + var appId = LgbConvert.ReadValue(ConfigurationManager.AppSettings["AppId"], "0"); + var key = string.Format("{0}-{1}-{2}", RetrieveMenusDataKey, userName, appId); + var navs = CacheManager.GetOrAdd(key, k => + { + var menus = RetrieveAllMenus(userName); + return appId == "0" ? menus : menus.Where(m => m.ApplicationCode == appId); + }, RetrieveMenusDataKey); + if (!string.IsNullOrEmpty(activeUrl)) ActiveMenu(null, navs, activeUrl); + return navs; + } + /// + /// 通过当前用户名获得后台菜单,层次化后集合 + /// + /// + /// 当前登陆的用户名 + /// 当前访问菜单 + /// 连接字符串名称,默认为ba + /// + public virtual IEnumerable RetrieveSystemMenus(string userName, string activeUrl = null) + { + var menus = RetrieveMenusByUserName(userName, activeUrl).Where(m => m.Category == "0" && m.IsResource == 0); + var root = menus.Where(m => m.ParentId == 0).OrderBy(m => m.ApplicationCode).ThenBy(m => m.Order); + CascadeMenus(menus, root); + return root; + } + + private static IEnumerable RetrieveAllMenus(string userName) + { + return CacheManager.GetOrAdd(RetrieveMenusAll, k => + { + var menus = new List(); + var db = DBAccessManager.DBAccess; + using (DbCommand cmd = db.CreateCommand(CommandType.Text, "select n.ID, n.ParentId, n.Name, n.[Order], n.Icon, n.Url, n.Category, n.Target, n.IsResource, n.[Application], d.Name as CategoryName, ln.Name as ParentName from Navigations n inner join Dicts d on n.Category = d.Code and d.Category = @Category and d.Define = 0 left join Navigations ln on n.ParentId = ln.ID inner join (select nr.NavigationID from Users u inner join UserRole ur on ur.UserID = u.ID inner join NavigationRole nr on nr.RoleID = ur.RoleID where u.UserName = @UserName union select nr.NavigationID from Users u inner join UserGroup ug on u.ID = ug.UserID inner join RoleGroup rg on rg.GroupID = ug.GroupID inner join NavigationRole nr on nr.RoleID = rg.RoleID where u.UserName = @UserName union select n.ID from Navigations n where EXISTS (select UserName from Users u inner join UserRole ur on u.ID = ur.UserID inner join Roles r on ur.RoleID = r.ID where u.UserName = @UserName and r.RoleName = @RoleName)) nav on n.ID = nav.NavigationID")) + { + cmd.Parameters.Add(db.CreateParameter("@UserName", userName)); + cmd.Parameters.Add(db.CreateParameter("@Category", "菜单")); + cmd.Parameters.Add(db.CreateParameter("@RoleName", "Administrators")); + using (DbDataReader reader = db.ExecuteReader(cmd)) + { + while (reader.Read()) + { + menus.Add(new BootstrapMenu + { + Id = LgbConvert.ReadValue(reader[0], 0), + ParentId = LgbConvert.ReadValue(reader[1], 0), + Name = (string)reader[2], + Order = LgbConvert.ReadValue(reader[3], 0), + Icon = reader.IsDBNull(4) ? string.Empty : (string)reader[4], + Url = reader.IsDBNull(5) ? string.Empty : (string)reader[5], + Category = (string)reader[6], + Target = (string)reader[7], + IsResource = LgbConvert.ReadValue(reader[8], false) ? 1 : 0, + ApplicationCode = reader.IsDBNull(9) ? string.Empty : (string)reader[9], + CategoryName = (string)reader[10], + ParentName = reader.IsDBNull(11) ? string.Empty : (string)reader[11], + }); + } + } + } + return menus; + }); + } + + private static void CascadeMenus(IEnumerable navs, IEnumerable level) + { + level.ToList().ForEach(m => + { + m.Menus = navs.Where(sub => sub.ParentId == m.Id).OrderBy(sub => sub.Order); + CascadeMenus(navs, m.Menus); + }); + } + + private static void ActiveMenu(BootstrapMenu parent, IEnumerable menus, string url) + { + if (menus == null || !menus.Any()) return; + menus.AsParallel().ForAll(m => + { + m.Active = m.Url.Equals(url, StringComparison.OrdinalIgnoreCase) ? "active" : ""; + ActiveMenu(m, m.Menus, url); + if (parent != null && m.Active != "") parent.Active = m.Active; + }); + } + } +} diff --git a/Bootstrap.DataAccess/Message.cs b/Bootstrap.DataAccess/Message.cs index 1e7bf889..7fc65de3 100644 --- a/Bootstrap.DataAccess/Message.cs +++ b/Bootstrap.DataAccess/Message.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; namespace Bootstrap.DataAccess { @@ -10,6 +8,7 @@ namespace Bootstrap.DataAccess /// public class Message { + protected const string RetrieveMessageDataKey = "MessageHelper-RetrieveMessages"; /// /// 消息主键 数据库自增 /// @@ -66,5 +65,34 @@ namespace Bootstrap.DataAccess /// 获得/设置 发件人昵称 /// public string FromDisplayName { get; set; } + /// + /// 收件箱 + /// + /// + public virtual IEnumerable Inbox(string userName) => throw new NotImplementedException(); + /// + /// 发件箱 + /// + /// + /// + public virtual IEnumerable SendMail(string userName) => throw new NotImplementedException(); + /// + /// 垃圾箱 + /// + /// + /// + public virtual IEnumerable Trash(string userName) => throw new NotImplementedException(); + /// + /// 标旗 + /// + /// + /// + public virtual IEnumerable Flag(string userName) => throw new NotImplementedException(); + /// + /// 获取Header处显示的消息列表 + /// + /// + /// + public virtual IEnumerable RetrieveMessagesHeader(string userName) => throw new NotImplementedException(); } } diff --git a/Bootstrap.DataAccess/Notification.cs b/Bootstrap.DataAccess/Notification.cs deleted file mode 100644 index 66a59fc9..00000000 --- a/Bootstrap.DataAccess/Notification.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; - -namespace Bootstrap.DataAccess -{ - /// - /// - /// - public class Notification - { - /// - /// - /// - public int Id { get; set; } - /// - /// - /// - public string Category { get; set; } - /// - /// - /// - public string Title { get; set; } - /// - /// - /// - public string Content { get; set; } - /// - /// - /// - public DateTime RegisterTime { get; set; } - /// - /// - /// - public DateTime ProcessTime { get; set; } - /// - /// - /// - public string ProcessBy { get; set; } - /// - /// - /// - public string ProcessResult { get; set; } - /// - /// - /// - public string Status { get; set; } - /// - /// 获得/设置 市场描述 2分钟内为刚刚 - /// - public string Period { get; set; } - } -} diff --git a/Bootstrap.DataAccess/Role.cs b/Bootstrap.DataAccess/Role.cs index 14b5ded2..dc78b5a4 100644 --- a/Bootstrap.DataAccess/Role.cs +++ b/Bootstrap.DataAccess/Role.cs @@ -1,10 +1,24 @@ -namespace Bootstrap.DataAccess +using Longbow; +using Longbow.Cache; +using Longbow.Configuration; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; + +namespace Bootstrap.DataAccess { /// /// /// public class Role { + public const string RetrieveRolesDataKey = "RoleHelper-RetrieveRoles"; + public const string RetrieveRolesByUserIdDataKey = "RoleHelper-RetrieveRolesByUserId"; + public const string RetrieveRolesByMenuIdDataKey = "RoleHelper-RetrieveRolesByMenuId"; + public const string RetrieveRolesByGroupIdDataKey = "RoleHelper-RetrieveRolesByGroupId"; + public const string RetrieveRolesByUserNameDataKey = "BootstrapAdminRoleMiddleware-RetrieveRolesByUserName"; + public const string RetrieveRolesByUrlDataKey = "BootstrapAdminAuthorizeFilter-RetrieveRolesByUrl"; /// /// 获得/设置 角色主键ID /// @@ -21,5 +35,111 @@ /// 获取/设置 用户角色关联状态 checked 标示已经关联 '' 标示未关联 /// public string Checked { get; set; } + /// + /// 查询所有角色 + /// + /// + /// + public virtual IEnumerable RetrieveRoles(int id = 0) => throw new NotImplementedException(); + /// + /// 保存用户角色关系 + /// + /// + /// + /// + public virtual bool SaveRolesByUserId(int id, IEnumerable roleIds) => throw new NotImplementedException(); + /// + /// 查询某个用户所拥有的角色 + /// + /// + public virtual IEnumerable RetrieveRolesByUserId(int userId) => throw new NotImplementedException(); + /// + /// 删除角色表 + /// + /// + public virtual bool DeleteRole(IEnumerable value) => throw new NotImplementedException(); + /// + /// 保存新建/更新的角色信息 + /// + /// + /// + public virtual bool SaveRole(Role p) => throw new NotImplementedException(); + /// + /// 查询某个菜单所拥有的角色 + /// + /// + /// + public virtual IEnumerable RetrieveRolesByMenuId(int menuId) => throw new NotImplementedException(); + /// + /// + /// + /// + /// + /// + public virtual bool SavaRolesByMenuId(int id, IEnumerable roleIds) => throw new NotImplementedException(); + /// + /// 根据GroupId查询和该Group有关的所有Roles + /// + /// + /// + public virtual IEnumerable RetrieveRolesByGroupId(int groupId) => throw new NotImplementedException(); + /// + /// 根据GroupId更新Roles信息,删除旧的Roles信息,插入新的Roles信息 + /// + /// + /// + /// + public virtual bool SaveRolesByGroupId(int id, IEnumerable roleIds) => throw new NotImplementedException(); + /// + /// + /// + /// + /// + public virtual IEnumerable RetrieveRolesByUserName(string userName) + { + return CacheManager.GetOrAdd(string.Format("{0}-{1}", RetrieveRolesByUserNameDataKey, userName), r => + { + var entities = new List(); + var db = DBAccessManager.DBAccess; + using (DbCommand cmd = db.CreateCommand(CommandType.Text, "select r.RoleName from Roles r inner join UserRole ur on r.ID=ur.RoleID inner join Users u on ur.UserID = u.ID and u.UserName = @UserName union select r.RoleName from Roles r inner join RoleGroup rg on r.ID = rg.RoleID inner join Groups g on rg.GroupID = g.ID inner join UserGroup ug on ug.GroupID = g.ID inner join Users u on ug.UserID = u.ID and u.UserName=@UserName")) + { + cmd.Parameters.Add(db.CreateParameter("@UserName", userName)); + using (DbDataReader reader = db.ExecuteReader(cmd)) + { + while (reader.Read()) + { + entities.Add((string)reader[0]); + } + } + } + return entities; + }, RetrieveRolesByUserNameDataKey); + } + /// + /// 根据菜单url查询某个所拥有的角色 + /// 从NavigatorRole表查 + /// 从Navigators-〉GroupNavigatorRole-〉Role查查询某个用户所拥有的角色 + /// + /// + public virtual IEnumerable RetrieveRolesByUrl(string url) + { + return CacheManager.GetOrAdd(string.Format("{0}-{1}", RetrieveRolesByUrlDataKey, url), k => + { + string sql = "select distinct r.RoleName, r.[Description] from Roles r inner join NavigationRole nr on r.ID = nr.RoleID inner join Navigations n on nr.NavigationID = n.ID and n.[Application] = @AppId and n.Url like @Url"; + var Roles = new List { "Administrators" }; + var db = DBAccessManager.DBAccess; + var cmd = db.CreateCommand(CommandType.Text, sql); + cmd.Parameters.Add(db.CreateParameter("@Url", string.Format("{0}%", url))); + cmd.Parameters.Add(db.CreateParameter("@AppId", LgbConvert.ReadValue(ConfigurationManager.AppSettings["AppId"], "0"))); + using (DbDataReader reader = db.ExecuteReader(cmd)) + { + while (reader.Read()) + { + Roles.Add((string)reader[0]); + } + } + return Roles; + }, RetrieveRolesByUrlDataKey); + } } } diff --git a/Bootstrap.DataAccess/Task.cs b/Bootstrap.DataAccess/Task.cs index c258750a..b204aa99 100644 --- a/Bootstrap.DataAccess/Task.cs +++ b/Bootstrap.DataAccess/Task.cs @@ -1,9 +1,11 @@ using System; +using System.Collections.Generic; namespace Bootstrap.DataAccess { public class Task { + protected const string RetrieveTasksDataKey = "TaskHelper-RetrieveTasks"; /// /// 获取/设置 任务ID /// @@ -36,5 +38,10 @@ namespace Bootstrap.DataAccess /// 获取/设置 分配时间 /// public DateTime AssignTime { get; set; } + /// + /// 查询所有任务 + /// + /// + public virtual IEnumerable RetrieveTasks() => throw new NotImplementedException(); } } diff --git a/Bootstrap.DataAccess/User.cs b/Bootstrap.DataAccess/User.cs index e54dce61..7d1cb0d7 100644 --- a/Bootstrap.DataAccess/User.cs +++ b/Bootstrap.DataAccess/User.cs @@ -1,5 +1,9 @@ using Bootstrap.Security; +using Longbow.Security; using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; namespace Bootstrap.DataAccess { @@ -8,6 +12,11 @@ namespace Bootstrap.DataAccess /// public class User : BootstrapUser { + public const string RetrieveUsersDataKey = "BootstrapUser-RetrieveUsers"; + public const string RetrieveUsersByRoleIdDataKey = "BootstrapUser-RetrieveUsersByRoleId"; + public const string RetrieveUsersByGroupIdDataKey = "BootstrapUser-RetrieveUsersByGroupId"; + public const string RetrieveNewUsersDataKey = "UserHelper-RetrieveNewUsers"; + protected const string RetrieveUsersByNameDataKey = "BootstrapUser-RetrieveUsersByName"; /// /// 获得/设置 用户主键ID /// @@ -53,6 +62,156 @@ namespace Bootstrap.DataAccess /// public string NewPassword { get; set; } /// + /// 验证用户登陆账号与密码正确 + /// + /// + /// + /// + public virtual bool Authenticate(string userName, string password) + { + if (string.IsNullOrEmpty(userName) && string.IsNullOrEmpty(password)) return false; + string oldPassword = null; + string passwordSalt = null; + string sql = "select [Password], PassSalt from Users where ApprovedTime is not null and UserName = @UserName"; + var db = DBAccessManager.DBAccess; + using (DbCommand cmd = db.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(db.CreateParameter("@UserName", userName)); + using (DbDataReader reader = db.ExecuteReader(cmd)) + { + if (reader.Read()) + { + oldPassword = (string)reader[0]; + passwordSalt = (string)reader[1]; + } + } + } + return !string.IsNullOrEmpty(passwordSalt) && oldPassword == LgbCryptography.ComputeHash(password, passwordSalt); + } + /// + /// 查询所有用户 + /// + /// + /// + public virtual IEnumerable RetrieveUsers() => throw new NotImplementedException(); + /// + /// 查询所有的新注册用户 + /// + /// + public virtual IEnumerable RetrieveNewUsers() => throw new NotImplementedException(); + /// + /// 删除用户 + /// + /// + public virtual bool DeleteUser(IEnumerable value) => throw new NotImplementedException(); + /// + /// 保存新建 + /// + /// + /// + public virtual bool SaveUser(User p) => throw new NotImplementedException(); + /// + /// + /// + /// + /// + /// + /// + public virtual bool UpdateUser(int id, string password, string displayName) => throw new NotImplementedException(); + /// + /// + /// + /// + /// + /// + public virtual bool ApproveUser(int id, string approvedBy) => throw new NotImplementedException(); + /// + /// + /// + /// + /// + /// + /// + public virtual bool ChangePassword(string userName, string password, string newPass) + { + bool ret = false; + if (Authenticate(userName, password)) + { + string sql = "Update Users set Password = @Password, PassSalt = @PassSalt where UserName = @userName"; + var passSalt = LgbCryptography.GenerateSalt(); + var newPassword = LgbCryptography.ComputeHash(newPass, passSalt); + using (DbCommand cmd = DBAccessManager.DBAccess.CreateCommand(CommandType.Text, sql)) + { + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@Password", newPassword)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@PassSalt", passSalt)); + cmd.Parameters.Add(DBAccessManager.DBAccess.CreateParameter("@userName", userName)); + ret = DBAccessManager.DBAccess.ExecuteNonQuery(cmd) == 1; + } + } + return ret; + } + /// + /// + /// + /// + /// + /// + /// + public virtual bool RejectUser(int id, string rejectBy) => throw new NotImplementedException(); + /// + /// 通过roleId获取所有用户 + /// + /// + /// + public virtual IEnumerable RetrieveUsersByRoleId(int roleId) => throw new NotImplementedException(); + /// + /// 通过角色ID保存当前授权用户(插入) + /// + /// 角色ID + /// 用户ID数组 + /// + public virtual bool SaveUsersByRoleId(int id, IEnumerable userIds) => throw new NotImplementedException(); + /// + /// 通过groupId获取所有用户 + /// + /// + /// + public virtual IEnumerable RetrieveUsersByGroupId(int groupId) => throw new NotImplementedException(); + /// + /// 通过部门ID保存当前授权用户(插入) + /// + /// GroupID + /// 用户ID数组 + /// + public virtual bool SaveUsersByGroupId(int id, IEnumerable userIds) => throw new NotImplementedException(); + /// + /// 根据用户名修改用户头像 + /// + /// + /// + /// + public virtual bool SaveUserIconByName(string userName, string iconName) => throw new NotImplementedException(); + /// + /// + /// + /// + /// + /// + public virtual bool SaveDisplayName(string userName, string displayName) => throw new NotImplementedException(); + /// + /// 根据用户名更改用户皮肤 + /// + /// + /// + /// + public virtual bool SaveUserCssByName(string userName, string cssName) => throw new NotImplementedException(); + /// + /// + /// + /// + /// + public virtual BootstrapUser RetrieveUserByUserName(string name) => throw new NotImplementedException(); + /// /// /// /// diff --git a/BootstrapAdmin.sln b/BootstrapAdmin.sln index 738146f1..741e2e74 100644 --- a/BootstrapAdmin.sln +++ b/BootstrapAdmin.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.27703.2047 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bootstrap.DataAccess", "Bootstrap.DataAccess\Bootstrap.DataAccess.csproj", "{AF16CA71-B8C6-4F51-B38C-0C0300FDEBD7}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sql", "sql", "{87319AF5-7C40-4362-B67C-35F9DD737DB4}" ProjectSection(SolutionItems) = preProject DatabaseScripts\InitData.sql = DatabaseScripts\InitData.sql @@ -31,7 +29,19 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bootstrap.Client", "Bootstr EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{C7F51A14-2D89-4D1F-AD78-C42B79AB0BF0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bootstrap.Client.DataAccess", "Bootstrap.Client.DataAccess\Bootstrap.Client.DataAccess.csproj", "{B6B29DE5-D7B0-4A4D-9E7A-AADC68E9C43F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bootstrap.Client.DataAccess", "Bootstrap.Client.DataAccess\Bootstrap.Client.DataAccess.csproj", "{B6B29DE5-D7B0-4A4D-9E7A-AADC68E9C43F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bootstrap.DataAccess", "Bootstrap.DataAccess\Bootstrap.DataAccess.csproj", "{8D62BE79-BE13-43C8-969B-C9B00B3C84B7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bootstrap.DataAccess.SQLite", "Bootstrap.DataAccess.SQLite\Bootstrap.DataAccess.SQLite.csproj", "{BC18A24F-5C99-4DF5-803D-72A912BCBD57}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SQLite", "SQLite", "{523515EC-2AD7-4282-9AF4-9D20371183B0}" + ProjectSection(SolutionItems) = preProject + DatabaseScripts\SQLite\InitData.sql = DatabaseScripts\SQLite\InitData.sql + DatabaseScripts\SQLite\Install.sql = DatabaseScripts\SQLite\Install.sql + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bootstrap.DataAccess.SQLServer", "Bootstrap.DataAccess.SQLServer\Bootstrap.DataAccess.SQLServer.csproj", "{555BB7E8-36A4-4EDE-88A9-BEF3E6ACE71B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,10 +49,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AF16CA71-B8C6-4F51-B38C-0C0300FDEBD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF16CA71-B8C6-4F51-B38C-0C0300FDEBD7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF16CA71-B8C6-4F51-B38C-0C0300FDEBD7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF16CA71-B8C6-4F51-B38C-0C0300FDEBD7}.Release|Any CPU.Build.0 = Release|Any CPU {7B2B7043-3CB2-4C5A-BDF2-8C47F1A5471A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7B2B7043-3CB2-4C5A-BDF2-8C47F1A5471A}.Debug|Any CPU.Build.0 = Debug|Any CPU {7B2B7043-3CB2-4C5A-BDF2-8C47F1A5471A}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -55,6 +61,18 @@ Global {B6B29DE5-D7B0-4A4D-9E7A-AADC68E9C43F}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6B29DE5-D7B0-4A4D-9E7A-AADC68E9C43F}.Release|Any CPU.ActiveCfg = Release|Any CPU {B6B29DE5-D7B0-4A4D-9E7A-AADC68E9C43F}.Release|Any CPU.Build.0 = Release|Any CPU + {8D62BE79-BE13-43C8-969B-C9B00B3C84B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8D62BE79-BE13-43C8-969B-C9B00B3C84B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D62BE79-BE13-43C8-969B-C9B00B3C84B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8D62BE79-BE13-43C8-969B-C9B00B3C84B7}.Release|Any CPU.Build.0 = Release|Any CPU + {BC18A24F-5C99-4DF5-803D-72A912BCBD57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC18A24F-5C99-4DF5-803D-72A912BCBD57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC18A24F-5C99-4DF5-803D-72A912BCBD57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC18A24F-5C99-4DF5-803D-72A912BCBD57}.Release|Any CPU.Build.0 = Release|Any CPU + {555BB7E8-36A4-4EDE-88A9-BEF3E6ACE71B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {555BB7E8-36A4-4EDE-88A9-BEF3E6ACE71B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {555BB7E8-36A4-4EDE-88A9-BEF3E6ACE71B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {555BB7E8-36A4-4EDE-88A9-BEF3E6ACE71B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/DatabaseScripts/SQLite/InitData.sql b/DatabaseScripts/SQLite/InitData.sql new file mode 100644 index 00000000..bf83ebcc --- /dev/null +++ b/DatabaseScripts/SQLite/InitData.sql @@ -0,0 +1,74 @@ +DELETE From Users where ID = 1; +-- ADMIN/123789 +INSERT INTO Users (ID, UserName, [Password], PassSalt, DisplayName, RegisterTime, ApprovedTime,ApprovedBy, [Description]) values (1, 'Admin', 'Es7WVgNsJuELwWK8daCqufUBknCsSC0IYDphQZAiGOo=', 'W5vpBEOYRGHkQXatN0t+ECM/U8cHDuEgrq56+zZBk4J481xH', 'Administrator', datetime(CURRENT_TIMESTAMP, 'localtime'), datetime(CURRENT_TIMESTAMP, 'localtime'), 'system', '系统默认创建'); + +DELETE From Dicts; +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '菜单', '系统菜单', '0', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '菜单', '外部菜单', '1', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '应用程序', '未设置', '0', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '网站设置', '网站标题', '后台管理系统', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '网站设置', '网站页脚', '2016 © 通用后台管理系统', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '系统通知', '用户注册', '0', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '系统通知', '程序异常', '1', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '系统通知', '数据库连接', '2', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '通知状态', '未处理', '0', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '通知状态', '已处理', '1', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '处理结果', '同意', '0', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '处理结果', '拒绝', '1', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '消息状态', '未读', '0', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '消息状态', '已读', '1', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '消息标签', '一般', '0', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '消息标签', '紧要', '1', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '头像地址', '头像路径', '~/images/uploader/', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '网站样式', '蓝色样式', 'blue.css', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '网站样式', '黑色样式', 'black.css', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '当前样式', '使用样式', 'blue.css', 0); +INSERT INTO [Dicts] ([ID], [Category], [Name], [Code], [Define]) VALUES (NULL, '网站设置', '前台首页', '~/Home/Index', 0); + +DELETE FROM Navigations; +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (1, 0, '后台管理', 10, 'fa fa-gear', '~/Admin/Index', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (2, 0, '个人中心', 20, 'fa fa-suitcase', '~/Admin/Profiles', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (3, 0, '返回前台', 30, 'fa fa-hand-o-left', '~/Home/Index', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (4, 0, '网站设置', 40, 'fa fa-fa', '~/Admin/Settings', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (5, 0, '菜单管理', 50, 'fa fa-dashboard', '~/Admin/Menus', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (6, 0, '用户管理', 60, 'fa fa-user', '~/Admin/Users', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (7, 0, '角色管理', 70, 'fa fa-sitemap', '~/Admin/Roles', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (8, 0, '部门管理', 80, 'fa fa-bank', '~/Admin/Groups', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (9, 0, '字典表维护', 90, 'fa fa-book', '~/Admin/Dicts', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (10, 0, '站内消息', 100, 'fa fa-envelope', '~/Admin/Messages', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (11, 0, '任务管理', 110, 'fa fa fa-tasks', '~/Admin/Tasks', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (12, 0, '通知管理', 120, 'fa fa-bell', '~/Admin/Notifications', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (13, 0, '系统日志', 130, 'fa fa-gears', '~/Admin/Logs', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (14, 0, '程序异常', 140, 'fa fa-cubes', '~/Admin/Exceptions', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (16, 0, '工具集合', 160, 'fa fa-gavel', '#', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (17, 16, '客户端测试', 10, 'fa fa-wrench', '~/Admin/Mobile', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (18, 16, 'API文档', 10, 'fa fa-wrench', '~/Admin/Api', '0'); +INSERT INTO [Navigations] ([ID], [ParentId], [Name], [Order], [Icon], [Url], [Category]) VALUES (19, 16, '图标集', 10, 'fa fa-dashboard', '~/Admin/FAIco', '0'); + +DELETE FROM GROUPS WHERE ID = 1; +INSERT INTO [Groups] ([ID], [GroupName], [Description]) VALUES (1, 'Admi', '系统默认组'); + +DELETE FROM Roles where ID in (1, 2); +INSERT INTO [Roles] ([ID], [RoleName], [Description]) VALUES (1, 'Administrators', '系统管理员'); +INSERT INTO [Roles] ([ID], [RoleName], [Description]) VALUES (2, 'Default', '默认用户,可访问前台页面'); + +DELETE FROM RoleGroup; +INSERT INTO [RoleGroup] ([RoleID], [GroupID]) VALUES (1, 1); + +DELETE FROM UserGroup; +INSERT INTO [UserGroup] ([UserID], [GroupID]) VALUES (1, 1); + +DELETE FROM UserRole; +INSERT INTO [UserRole] ([UserID], [RoleID]) VALUES (1, 1); +INSERT INTO [UserRole] ([UserID], [RoleID]) VALUES (1, 2); + +DELETE FROM NavigationRole; +INSERT INTO NavigationRole SELECT NULL, ID, 1 FROM navigations; +INSERT INTO [NavigationRole] ([NavigationID], [RoleID]) VALUES (1, 2); +INSERT INTO [NavigationRole] ([NavigationID], [RoleID]) VALUES (2, 2); +INSERT INTO [NavigationRole] ([NavigationID], [RoleID]) VALUES (3, 2); +INSERT INTO [NavigationRole] ([NavigationID], [RoleID]) VALUES (10, 2); +INSERT INTO [NavigationRole] ([NavigationID], [RoleID]) VALUES (16, 2); +INSERT INTO [NavigationRole] ([NavigationID], [RoleID]) VALUES (17, 2); +INSERT INTO [NavigationRole] ([NavigationID], [RoleID]) VALUES (18, 2); +INSERT INTO [NavigationRole] ([NavigationID], [RoleID]) VALUES (19, 2); diff --git a/DatabaseScripts/SQLite/Install.sql b/DatabaseScripts/SQLite/Install.sql new file mode 100644 index 00000000..a5dc66a2 --- /dev/null +++ b/DatabaseScripts/SQLite/Install.sql @@ -0,0 +1,140 @@ +CREATE TABLE Users ( + [ID] INTEGER PRIMARY KEY, + [UserName] NVARCHAR (50) NOT NULL, + [Password] VARCHAR (50) NOT NULL, + [PassSalt] VARCHAR (50) NOT NULL, + [DisplayName] VARCHAR (50) NOT NULL, + [RegisterTime] DATETIME NOT NULL, + [ApprovedTime] DATETIME, + [ApprovedBy] VARCHAR (50), + [Description] VARCHAR (500) NOT NULL, + [RejectedBy] VARCHAR (50), + [RejectedTime] DATETIME, + [RejectedReason] VARCHAR (50), + [Icon] VARCHAR (50), + [Css] VARCHAR (50) +); + +CREATE TABLE UserRole ( + [ID] INTEGER PRIMARY KEY, + [UserID] INT NOT NULL, + [RoleID] INT NOT NULL +); + +CREATE TABLE UserGroup( + [ID] INTEGER PRIMARY KEY, + [UserID] INT NOT NULL, + [GroupID] INT NOT NULL +); + +CREATE TABLE Roles( + [ID] INTEGER PRIMARY KEY, + [RoleName] VARCHAR (50) NULL, + [Description] VARCHAR (500) NULL +); + +CREATE TABLE RoleGroup( + [ID] INTEGER PRIMARY KEY, + [RoleID] INT NOT NULL, + [GroupID] INT NOT NULL +); + +CREATE TABLE Notifications( + [ID] INTEGER PRIMARY KEY, + [Category] VARCHAR (50) NOT NULL, + [Title] VARCHAR (50) NOT NULL, + [Content] VARCHAR (50) NOT NULL, + [RegisterTime] DATETIME NOT NULL, + [ProcessTime] DATETIME NULL, + [ProcessBy] VARCHAR (50) NULL, + [ProcessResult] VARCHAR (50) NULL, + [Status] VARCHAR (50) DEFAULT (0) +); + +CREATE TABLE Navigations( + [ID] INTEGER PRIMARY KEY, + [ParentId] INT DEFAULT (0), + [Name] VARCHAR (50) NOT NULL, + [Order] INT DEFAULT (0), + [Icon] VARCHAR (50) DEFAULT none, + [Url] VARCHAR (4000) NULL, + [Category] VARCHAR (50) DEFAULT 0, + [Target] VARCHAR (10) DEFAULT _self, + [IsResource] INT DEFAULT (0), + [Application] VARCHAR (200) DEFAULT (0) +); + +CREATE TABLE NavigationRole( + [ID] INTEGER PRIMARY KEY, + [NavigationID] INT NOT NULL, + [RoleID] INT NOT NULL +); + +CREATE TABLE Logs( + [ID] INTEGER PRIMARY KEY, + [CRUD] VARCHAR (50) NOT NULL, + [UserName] VARCHAR (50) NOT NULL, + [LogTime] DATETIME NOT NULL, + [ClientIp] VARCHAR (15) NOT NULL, + [ClientAgent] VARCHAR (500) NOT NULL, + [RequestUrl] VARCHAR (500) NOT NULL +); + +CREATE TABLE Groups( + [ID] INTEGER PRIMARY KEY, + [GroupName] VARCHAR (50) NULL, + [Description] VARCHAR (500) NULL +); + +CREATE TABLE Exceptions( + [ID] INTEGER PRIMARY KEY, + [AppDomainName] VARCHAR (50) NOT NULL, + [ErrorPage] VARCHAR (50) NOT NULL, + [UserID] VARCHAR (50) NULL, + [UserIp] VARCHAR (15) NULL, + [ExceptionType] TEXT NOT NULL, + [Message] TEXT NOT NULL, + [StackTrace] TEXT NULL, + [LogTime] DATETIME NOT NULL +); + +CREATE TABLE Dicts( + [ID] INTEGER PRIMARY KEY, + [Category] VARCHAR (50) NOT NULL, + [Name] VARCHAR (50) NOT NULL, + [Code] VARCHAR (500) NOT NULL, + [Define] INT DEFAULT (1) +); + +CREATE TABLE Messages( + [ID] INTEGER PRIMARY KEY, + [Title] VARCHAR (50) NOT NULL, + [Content] VARCHAR (500) NOT NULL, + [From] VARCHAR (50) NOT NULL, + [To] VARCHAR (50) NOT NULL, + [SendTime] DATETIME NOT NULL, + [Status] VARCHAR (50) NOT NULL, + [Flag] INT DEFAULT (0), + [IsDelete] INT DEFAULT (0), + [Label] VARCHAR (50) +); + +CREATE TABLE Tasks( + [ID] INTEGER PRIMARY KEY, + [TaskName] VARCHAR (500) NOT NULL, + [AssignName] VARCHAR (50) NOT NULL, + [UserName] VARCHAR (50) NOT NULL, + [TaskTime] INT NOT NULL, + [TaskProgress] INT NOT NULL, + [AssignTime] DATETIME NOT NULL +); + +CREATE TABLE RejectUsers( + [ID] INTEGER PRIMARY KEY, + [UserName] VARCHAR (50) NOT NULL, + [DisplayName] VARCHAR (50) NOT NULL, + [RegisterTime] DATETIME NOT NULL, + [RejectedBy] VARCHAR (50) NULL, + [RejectedTime] DATETIME NULL, + [RejectedReason] VARCHAR (50) NULL +); \ No newline at end of file