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;
+ }
+ ///