using Tiger.Model;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq.Expressions;
|
using System.Text;
|
using System.Threading.Tasks;
|
using Rhea.Common;
|
using System.Net;
|
using System.Linq;
|
using Newtonsoft.Json;
|
|
namespace Tiger.Business
|
{
|
public partial class Biz
|
{
|
/// <summary>
|
/// 获取菜单列表
|
/// </summary>
|
/// <param name="userid"></param>
|
/// <returns></returns>
|
public async Task<string> getMenuList(string userid, string rootCode)
|
{
|
var data = new List<MenuItem>();
|
var query = Biz.Db.Queryable<SYS_USER, SYS_USERINGROUP, SYS_USERGROUP, SYS_USERGROUP_ROLE, SYS_ROLE_MENU, SYS_MENU>((t, p, g, r, m, f) =>
|
new JoinQueryInfos(
|
JoinType.Inner, t.ID == p.USER_ID,
|
JoinType.Inner, p.USERGROUP_CODE == g.ID,
|
JoinType.Inner, p.USERGROUP_CODE == r.USERGROUP_CODE,
|
JoinType.Inner, r.ROLE_CODE == m.ROLE_CODE,
|
JoinType.Inner, m.FUNC_CODE == f.ID))
|
.WhereIF(!string.IsNullOrEmpty(userid), (t, p, g, r, m, f) => t.USER_ID == userid && f.IS_USE == "1" && f.FUNC_TYPE != "2")
|
.Select((t, p, g, r, m, f) => new SYS_MENU
|
{
|
ID = f.ID,
|
FUNC_CODE = f.FUNC_CODE,
|
FUNC_NAME = f.FUNC_NAME,
|
FUNC_DESC = f.FUNC_DESC,
|
FUNC_GROUP = f.FUNC_GROUP,
|
FUNC_TYPE = f.FUNC_TYPE,
|
PFUNC_CODE = f.PFUNC_CODE,
|
FUNC_CLASS = f.FUNC_CLASS,
|
PATH = f.PATH,
|
ICON_URL = f.ICON_URL,
|
SEQ_NO = f.SEQ_NO,
|
OPEN_MODE = f.OPEN_MODE,
|
IS_USE = f.IS_USE,
|
OPER_CODE = f.OPER_CODE,
|
CREATE_USER = f.CREATE_USER,
|
CREATE_TIME = f.CREATE_TIME,
|
UPDATE_USER = f.UPDATE_USER,
|
UPDATE_TIME = f.UPDATE_TIME,
|
SYMBOLIC_NAME = f.SYMBOLIC_NAME,
|
COMPONENT = f.COMPONENT,
|
CURRENTACTIVEMENU = f.CURRENTACTIVEMENU,
|
SHOW = f.SHOW,
|
IGNOREKEEPALIVE = f.IGNOREKEEPALIVE,
|
IGNOREAUTH = f.IGNOREAUTH,
|
BUTTON_TYPE = f.BUTTON_TYPE,
|
DO_METHOD = f.DO_METHOD,
|
});
|
var items = await query.Distinct().ToListAsync();
|
List<SYS_MENU> entities = items.OrderBy(x => x.SEQ_NO).ToList().FindAll(t => t.PFUNC_CODE == rootCode); //"23858079-7241-4e64-b0cf-eb5dbe84a9d6"
|
foreach (var item in entities)
|
{
|
MenuItem menuItem = new();
|
menuItem.id = item.ID;
|
menuItem.func_code = item.FUNC_CODE;
|
menuItem.path = (item.PATH ?? "").StartsWith("/dashboard") ? "/dashboard" : $"{item.PATH}";
|
menuItem.name = item.FUNC_NAME;
|
menuItem.component = (item.PATH == null || item.PATH == "#") ? "LAYOUT" : item.COMPONENT;
|
if (item.FUNC_CLASS == "PDA")
|
{
|
menuItem.pages = menuItem.component;
|
menuItem.url = item.ICON_URL;
|
}
|
menuItem.meta = new();
|
menuItem.meta.icon = item.ICON_URL; // item.ICON_URL;
|
menuItem.meta.orderNo = item.SEQ_NO;
|
menuItem.meta.title = item.FUNC_NAME;
|
menuItem.meta.menuId = item.ID;
|
menuItem.meta.menuCode = item.FUNC_CODE;
|
menuItem.btnType = item.BUTTON_TYPE;
|
menuItem.meta.btnType = item.BUTTON_TYPE;
|
menuItem.meta.doMethod = item.DO_METHOD;
|
if (!string.IsNullOrEmpty(item.IGNOREKEEPALIVE))
|
{
|
menuItem.meta.ignoreKeepAlive = item.IGNOREKEEPALIVE == "0" ? true : false;
|
}
|
if (!string.IsNullOrEmpty(item.CURRENTACTIVEMENU))
|
{
|
menuItem.meta.currentActiveMenu = item.CURRENTACTIVEMENU;
|
}
|
if (!string.IsNullOrEmpty(item.SHOW))
|
{
|
menuItem.meta.hideMenu = item.SHOW == "1" ? true : false;
|
menuItem.meta.showMenu = item.SHOW == "0" ? true : false;
|
}
|
if (!string.IsNullOrEmpty(item.IGNOREAUTH))
|
{
|
menuItem.meta.ignoreAuth = item.IGNOREAUTH == "Y";
|
}
|
menuItem.keepalive = item.IGNOREKEEPALIVE;
|
menuItem.show = item.SHOW;
|
menuItem.menuName = item.FUNC_NAME;
|
menuItem.status = item.IS_USE;
|
menuItem.btnType = item.BUTTON_TYPE;
|
menuItem.func_group = item.FUNC_GROUP;
|
menuItem.children = new();
|
GetMenuItem(items.ToList(), item.FUNC_CODE, ref menuItem);
|
data.Add(menuItem);
|
}
|
//转换Json时,去除值为null的属性
|
var jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
|
var json = JsonConvert.SerializeObject(data, Formatting.Indented, jsonSetting);
|
return json;
|
}
|
|
/// <summary>
|
/// 获取所有菜单列表
|
/// </summary>
|
/// <returns></returns>
|
public async Task<string> getMenuListAll(string menuName, string status)
|
{
|
var data = new List<MenuItem>();
|
SYS_MENU func = null;
|
if (!string.IsNullOrEmpty(menuName))
|
{
|
func = Biz.Db.Queryable<SYS_MENU>().Where(x => x.FUNC_NAME == menuName).First();
|
}
|
if (func != null)
|
{
|
var items = await Biz.Db.Queryable<SYS_MENU>()
|
.WhereIF(!string.IsNullOrEmpty(status), q => q.IS_USE == status)
|
.OrderBy(x => x.SEQ_NO)
|
.Distinct().ToListAsync();
|
List<SYS_MENU> entities = items.OrderBy(x => x.SEQ_NO).ToList().FindAll(t => t.PFUNC_CODE == func.FUNC_CODE);
|
foreach (var item in entities)
|
{
|
MenuItem menuItem = new();
|
menuItem.id = item.ID;
|
menuItem.func_code = item.FUNC_CODE;
|
menuItem.path = (item.PATH ?? "").StartsWith("/dashboard") ? "/dashboard" : $"{item.PATH}";
|
menuItem.name = item.FUNC_NAME;
|
menuItem.component = (item.PATH == null || item.PATH == "#") ? "LAYOUT" : item.COMPONENT;
|
if (item.FUNC_CLASS == "PDA")
|
{
|
menuItem.pages = menuItem.component;
|
menuItem.url = item.ICON_URL;
|
}
|
menuItem.meta = new();
|
menuItem.meta.icon = item.ICON_URL; // item.ICON_URL;
|
menuItem.meta.orderNo = item.SEQ_NO;
|
menuItem.meta.title = item.FUNC_NAME;
|
menuItem.meta.menuId = item.ID;
|
menuItem.meta.menuCode = item.FUNC_CODE;
|
menuItem.meta.btnType = item.BUTTON_TYPE;
|
menuItem.meta.doMethod = item.DO_METHOD;
|
if (!string.IsNullOrEmpty(item.IGNOREKEEPALIVE))
|
{
|
menuItem.meta.ignoreKeepAlive = item.IGNOREKEEPALIVE == "0" ? true : false;
|
}
|
if (!string.IsNullOrEmpty(item.CURRENTACTIVEMENU))
|
{
|
menuItem.meta.currentActiveMenu = item.CURRENTACTIVEMENU;
|
}
|
if (!string.IsNullOrEmpty(item.SHOW))
|
{
|
menuItem.meta.hideMenu = item.SHOW == "1" ? true : false;
|
menuItem.meta.showMenu = item.SHOW == "0" ? true : false;
|
}
|
if (!string.IsNullOrEmpty(item.IGNOREAUTH))
|
{
|
menuItem.meta.ignoreAuth = item.IGNOREAUTH == "Y";
|
}
|
menuItem.keepalive = item.IGNOREKEEPALIVE;
|
menuItem.show = item.SHOW;
|
menuItem.menuName = item.FUNC_NAME;
|
menuItem.createTime = item.CREATE_TIME;
|
menuItem.status = item.IS_USE;
|
menuItem.icon = menuItem.meta.icon;
|
menuItem.func_type = item.FUNC_TYPE;
|
menuItem.func_group = item.FUNC_GROUP;
|
menuItem.btnType = item.BUTTON_TYPE;
|
menuItem.parentMenu = item.PFUNC_CODE;
|
menuItem.orderNo = item.SEQ_NO;
|
menuItem.children = null;
|
GetMenuItem(items, item.FUNC_CODE, ref menuItem);
|
data.Add(menuItem);
|
}
|
};
|
|
//转换Json时,去除值为null的属性
|
var jsonSetting = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore };
|
var json = JsonConvert.SerializeObject(data, Formatting.Indented, jsonSetting);
|
return json;
|
}
|
|
/// <summary>
|
/// 保存菜单
|
/// </summary>
|
/// <param name="action"></param>
|
/// <param name="Async"></param>
|
/// <returns></returns>
|
public async Task<ApiAction> SaveMenu(ApiAction<SaveMenuParams> action, bool Async = true)
|
{
|
var apiAction = new ApiAction();
|
try
|
{
|
SaveMenuParams data = action.Data;
|
//保存到数据库
|
var db = Business.Biz.Db;
|
var dbTran = db.UseTran(() =>
|
{
|
SYS_MENU func = Biz.Db.Queryable<SYS_MENU>().Where(x => x.ID == data.id).First();
|
if (func != null)
|
{
|
func.FUNC_NAME = data.menuName;
|
func.IS_USE = data.status;
|
func.PFUNC_CODE = data.parentMenu;
|
func.PATH = data.path;
|
func.ICON_URL = data.icon;
|
func.SEQ_NO = (int)data.orderNo;
|
func.FUNC_TYPE = data.func_type;
|
func.BUTTON_TYPE = data.btnType;
|
func.DO_METHOD = data.doMethod;
|
func.COMPONENT = string.IsNullOrEmpty(data.component) && data.func_type == "0" ? "LAYOUT" : data.component;
|
func.IGNOREKEEPALIVE = data.keepalive;
|
func.SHOW = data.show;
|
func.FUNC_GROUP = data.func_group;
|
//func.CURRENTACTIVEMENU = data.keepalive
|
}
|
else
|
{
|
func = new()
|
{
|
ID = data.id ?? Guid.NewGuid().ToString("N"),
|
FUNC_CODE = Guid.NewGuid().ToString("N"),
|
FUNC_NAME = data.menuName,
|
FUNC_DESC = data.menuName,
|
FUNC_GROUP = data.func_group,
|
FUNC_TYPE = data.func_type,
|
BUTTON_TYPE = data.btnType,
|
DO_METHOD = data.doMethod,
|
PFUNC_CODE = data.parentMenu,
|
FUNC_CLASS = data.func_class?? "BS",
|
PATH = data.path,
|
ICON_URL = data.icon,
|
SEQ_NO = (int)data.orderNo,
|
IS_USE = data.status,
|
COMPONENT = string.IsNullOrEmpty(data.component) && data.func_type == "0" ? "LAYOUT" : data.component,
|
IGNOREKEEPALIVE = data.keepalive,
|
SHOW = data.show
|
};
|
}
|
//更新
|
if (data != null && data.isUpdate)
|
{
|
db.Updateable(func, "system").ExecuteCommand();
|
}
|
//新增
|
else
|
{
|
db.Insertable(func, "system").ExecuteCommand();
|
//如果是新增的菜单,查出所有父级更新为半选
|
List<SYS_MENU> menus = new();
|
GetRootMenu(func, ref menus);
|
var roles = menus.Select(x => x.ID).ToList();
|
db.Updateable<SYS_ROLE_MENU>().SetColumns(t => t.HALF_CHECK == "Y").Where(x => roles.Contains(x.FUNC_CODE) || x.FUNC_CODE == "system").ExecuteCommand();
|
}
|
});
|
if (!dbTran.IsSuccess)
|
{
|
apiAction.Data = null;
|
apiAction.IsSuccessed = false;
|
apiAction.Message += $"保存数据失败:{dbTran.ErrorMessage}";
|
return apiAction;
|
}
|
}
|
catch (System.Exception ex)
|
{
|
|
}
|
return apiAction;
|
}
|
|
/// <summary>
|
/// 递归返回菜单
|
/// </summary>
|
/// <param name="data"></param>
|
/// <param name="parent"></param>
|
/// <param name="pMenuItem"></param>
|
private static void GetMenuItem(List<SYS_MENU> data, string parent, ref MenuItem pMenuItem)
|
{
|
List<SYS_MENU> entities = data.OrderBy(x => x.SEQ_NO).ToList().FindAll(t => t.PFUNC_CODE == parent).Distinct().ToList();
|
if (entities.Count > 0)
|
{
|
foreach (var item in entities)
|
{
|
MenuItem menuItem = new();
|
menuItem.id = item.ID;
|
menuItem.func_code = item.FUNC_CODE;
|
menuItem.path = (item.PATH ?? "").StartsWith("/dashboard") ? "/dashboard" : $"{item.PATH}";
|
menuItem.name = item.FUNC_NAME;
|
menuItem.component = (item.PATH == null || item.PATH == "#") ? "LAYOUT" : item.COMPONENT;
|
if (item.FUNC_CLASS == "PDA")
|
{
|
menuItem.pages = menuItem.component;
|
menuItem.url = item.ICON_URL;
|
}
|
menuItem.meta = new();
|
menuItem.meta.icon = item.ICON_URL; //item.ICON_URL;
|
menuItem.meta.orderNo = item.SEQ_NO;
|
menuItem.meta.title = item.FUNC_NAME;
|
menuItem.meta.menuId = item.ID;
|
menuItem.meta.menuCode = item.FUNC_CODE;
|
menuItem.meta.btnType = item.BUTTON_TYPE;
|
menuItem.meta.doMethod = item.DO_METHOD;
|
if (!string.IsNullOrEmpty(item.IGNOREKEEPALIVE))
|
{
|
menuItem.meta.ignoreKeepAlive = item.IGNOREKEEPALIVE == "0" ? true : false;
|
}
|
if (!string.IsNullOrEmpty(item.CURRENTACTIVEMENU))
|
{
|
menuItem.meta.currentActiveMenu = item.CURRENTACTIVEMENU;
|
}
|
if (!string.IsNullOrEmpty(item.SHOW))
|
{
|
menuItem.meta.hideMenu = item.SHOW == "1" ? true : false;
|
menuItem.meta.showMenu = item.SHOW == "0" ? true : false;
|
}
|
if (!string.IsNullOrEmpty(item.IGNOREAUTH))
|
{
|
menuItem.meta.ignoreAuth = item.IGNOREAUTH == "Y";
|
}
|
menuItem.keepalive = item.IGNOREKEEPALIVE;
|
menuItem.show = item.SHOW;
|
menuItem.menuName = item.FUNC_NAME;
|
menuItem.createTime = item.CREATE_TIME;
|
menuItem.icon = menuItem.meta.icon;
|
menuItem.func_type = item.FUNC_TYPE;
|
menuItem.btnType = item.BUTTON_TYPE;
|
menuItem.doMethod = item.DO_METHOD;
|
menuItem.parentMenu = item.PFUNC_CODE;
|
menuItem.func_group = item.FUNC_GROUP;
|
menuItem.orderNo = item.SEQ_NO;
|
menuItem.status = item.IS_USE;
|
menuItem.children = null;
|
GetMenuItem(data, item.FUNC_CODE, ref menuItem);
|
if (pMenuItem.children == null) { pMenuItem.children = new(); }
|
pMenuItem.children.Add(menuItem);
|
}
|
}
|
}
|
|
private static void GetRootMenu(SYS_MENU menu, ref List<SYS_MENU> items)
|
{
|
SYS_MENU menuRet = null;
|
try
|
{
|
menuRet = Biz.Db.Queryable<SYS_MENU>().Where(q => q.FUNC_CODE == menu.PFUNC_CODE && q.FUNC_CODE != "system01").Single(); //23858079-7241-4e64-b0cf-eb5dbe84a9d6
|
if (menuRet != null)
|
{
|
if (!items.Where(x => x.FUNC_CODE == menuRet.FUNC_CODE).Any())
|
{
|
items.Add(menuRet);
|
}
|
GetRootMenu(menuRet, ref items);
|
}
|
}
|
catch (System.Exception ex)
|
{
|
Logger.Default.Fatal($"获取菜单[{menu.FUNC_CODE}]的root菜单异常: {ex.Message}");
|
}
|
}
|
}
|
}
|