2022-01-22 17:29:12 +08:00

127 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Infrastructure;
using Microsoft.Extensions.Configuration;
using SqlSugar;
using SqlSugar.IOC;
using System;
using System.Collections.Generic;
using System.Linq;
using ZR.Admin.WebApi.Framework;
using ZR.Model.System;
namespace ZR.Admin.WebApi.Extensions
{
public static class DbExtension
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
//全部数据权限
public static string DATA_SCOPE_ALL = "1";
//自定数据权限
public static string DATA_SCOPE_CUSTOM = "2";
//部门数据权限
public static string DATA_SCOPE_DEPT = "3";
//部门及以下数据权限
public static string DATA_SCOPE_DEPT_AND_CHILD = "4";
//仅本人数据权限
public static string DATA_SCOPE_SELF = "5";
public static void AddDb(IConfiguration Configuration)
{
string connStr = Configuration.GetConnectionString(OptionsSetting.ConnAdmin);
string connStrBus = Configuration.GetConnectionString(OptionsSetting.ConnBus);
string dbKey = Configuration[OptionsSetting.DbKey];
int dbType = Convert.ToInt32(Configuration[OptionsSetting.ConnDbType]);
int dbType_bus = Convert.ToInt32(Configuration[OptionsSetting.ConnBusDbType]);
SugarIocServices.AddSqlSugar(new List<IocConfig>() {
new IocConfig() {
ConfigId = "0",
ConnectionString = connStr,
DbType = (IocDbType)dbType,
IsAutoCloseConnection = true//自动释放
}, new IocConfig() {
ConfigId = "1",
ConnectionString = connStrBus,
DbType = (IocDbType)dbType_bus,
IsAutoCloseConnection = true//自动释放
}
});
//每次Sql执行前事件
DbScoped.SugarScope.GetConnection(0).Aop.OnLogExecuting = (sql, pars) =>
{
var param = DbScoped.SugarScope.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value));
FilterData(DbScoped.SugarScope.GetConnection(0));
logger.Info($"{sql}{param}");
};
//出错打印日志
DbScoped.SugarScope.GetConnection(0).Aop.OnError = (e) =>
{
logger.Error(e, $"执行SQL出错{e.Message}");
};
//SQL执行完
DbScoped.SugarScope.GetConnection(0).Aop.OnLogExecuted = (sql, pars) =>
{
//执行完了可以输出SQL执行时间 (OnLogExecutedDelegate)
};
//Db1
DbScoped.SugarScope.GetConnection(1).Aop.OnLogExecuting = (sql, pars) =>
{
var param = DbScoped.SugarScope.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value));
logger.Info($"Sql语句{sql}, {param}");
};
//Db1错误日志
DbScoped.SugarScope.GetConnection(1).Aop.OnError = (e) =>
{
logger.Error($"执行Sql语句失败{e.Sql},原因:{e.Message}");
};
}
private static void FilterData(SqlSugarProvider db0)
{
var u = App.User;
if (u == null) return;
//获取当前用户的信息
var user = JwtUtil.GetLoginUser(App.HttpContext);
if (user == null) return;
//管理员不过滤
if (user.RoleIds.Any(f => f.Equals("admin"))) return;
foreach (var role in user.Roles)
{
string dataScope = role.DataScope;
if (DATA_SCOPE_ALL.Equals(dataScope))//所有权限
{
break;
}
else if (DATA_SCOPE_CUSTOM.Equals(dataScope))//自定数据权限
{
//var roleDepts = db0.Queryable<SysRoleDept>()
//.Where(f => f.RoleId == role.RoleId).Select(f => f.DeptId).ToList();
//var filter1 = new TableFilterItem<SysDept>(it => roleDepts.Contains(it.DeptId));
}
else if (DATA_SCOPE_DEPT.Equals(dataScope))//本部门数据
{
//有问题添加后的SQL 语句 是 AND deptId = @deptId
var exp = Expressionable.Create<SysDept>();
exp.Or(it => it.DeptId == user.DeptId);
var filter1 = new TableFilterItem<SysDept>(exp.ToExpression());
DbScoped.SugarScope.GetConnection(0).QueryFilter.Add(filter1);
Console.WriteLine("本部门数据过滤");
}
else if (DATA_SCOPE_DEPT_AND_CHILD.Equals(dataScope))//本部门及以下数据
{
//SQl OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )
}
else if (DATA_SCOPE_SELF.Equals(dataScope))//仅本人数据
{
var filter1 = new TableFilterItem<SysUser>(it => it.UserId == user.UserId);
DbScoped.SugarScope.GetConnection(0).QueryFilter.Add(filter1);
}
}
}
}
}