using System; using System.Collections.Generic; using System.Linq; using LitJson; using MySql.Data.MySqlClient; using Sog; //权限-角色-菜单 namespace Operation { public class AdminOperator { private MySqlDB db; private const int BuffLengthMax = 500 * 1024; public static string Administrator = "Administrator"; public AdminOperator(MySqlDB mySql) { db = mySql; } //销毁的时候置空 public void Dispose() { db.Dispose(); db = null; } public void KeepAlive() { if (db == null) { return; } string strSql = "select id from admin_role where id=1"; MySqlDataReader reader = null; try { reader = db.ExecReader(strSql); if (reader == null) { TraceLog.Trace("AdminOperator.KeepAlive no record in account table, return reader is null!"); } } catch (Exception e) { TraceLog.Trace("AdminOperator.KeepAlive error!"); } finally { //记住一定要Close if (reader != null) { reader.Close(); } } } public List GetAllMenus() { List menus = new List(); MySqlDataReader reader = null; string sql = "select * from admin_menu"; try { reader = db.ExecReader(sql); if (reader == null) { return menus; } while (reader.Read()) { Menu menu = builderMenu(reader); menus.Add(menu); } } catch (Exception e) { TraceLog.Error("AdminOperator.GetAllMenus sql={0} error info={1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } return menus; } public List GetMenus(string account) { var menusList = GetMenuIds(account); return GetMenus(menusList); } public List GetMenus(List menusList) { List menus = new List(); if (menusList == null || menusList.Count == 0) { return menus; } string sql = string.Format("select * from admin_menu where menu_id in ({0})", String.Join(",", menusList)); MySqlDataReader reader = null; try { reader = db.ExecReader(sql); while (reader.Read()) { Menu menu = builderMenu(reader); menus.Add(menu); } } catch (Exception e) { TraceLog.Error("AdminOperator.GetMenus error sql={0}, info={1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } return menus; } public int AddMenu(string name, string icon, int order, string url, int permission, int parent_id = 0) { if (String.IsNullOrEmpty(name)) { return -1; } bool exist = false; string selectSql = "select * from admin_menu where name='" + name + "'"; MySqlDataReader selectReader = null; int parentId = -1; try { selectReader = db.ExecReader(selectSql); if (selectReader == null) { return -1; } exist = selectReader.HasRows; while (selectReader.Read()) { parentId = selectReader.GetInt32("menu_id"); } } catch (Exception e) { TraceLog.Error("AdminOperator.AddMenu error sql={0},info={1}", selectSql, e.Message); } finally { if (selectReader != null) { selectReader.Close(); } } if (exist) { string updateSql = "update admin_menu set icon=?icon,`order`=?order,url=?url,permission=?permission,`name`=?name where menu_id=" +parentId; var param = new List() { new MySqlParameter("?icon", MySqlDbType.String) { Value = icon }, new MySqlParameter("?name", MySqlDbType.String) { Value = name }, new MySqlParameter("?order", MySqlDbType.Int32) { Value = order }, new MySqlParameter("?url", MySqlDbType.String) { Value = url }, new MySqlParameter("?permission", MySqlDbType.Int32) { Value = permission }, }.ToArray(); MySqlDataReader reader = null; try { reader = db.ExecReader(updateSql, param); } catch (Exception) { TraceLog.Error("AdminOperation.AddMenu sql {0} failed,params={1}", updateSql, param); } finally { if (reader != null) { reader.Close(); } } return parentId; } string insertSql = "insert into admin_menu set name=?name,`order`=?order,url=?url,parent_id=?parent_id,icon=?icon,permission=?permission"; var paramList = new List() { new MySqlParameter("?name", MySqlDbType.String) { Value = name }, new MySqlParameter("?icon", MySqlDbType.String) { Value = icon }, new MySqlParameter("?order", MySqlDbType.Int32) { Value = order }, new MySqlParameter("?url", MySqlDbType.String) { Value = url }, new MySqlParameter("?parent_id", MySqlDbType.Int32) { Value = parent_id }, new MySqlParameter("?permission", MySqlDbType.Int32) { Value = permission }, }.ToArray(); try { MySqlDataReader reader = db.ExecReader(insertSql, paramList); if (reader != null) { reader.Close(); } if (parent_id == 0) { selectReader = db.ExecReader(selectSql); if (selectReader == null) { return -1; } exist = selectReader.HasRows; if (exist) { while (selectReader.Read()) { parentId = selectReader.GetInt32("menu_id"); } } } } catch (Exception e) { TraceLog.Error("AdminOperation.AddMenu sql {0} failed,params={1},{2}", insertSql, paramList, e.Message); } finally { if (selectReader != null) { selectReader.Close(); } } return parentId; } public void AddPermission(int permission, string name, string url, int pcode) { string selectSql = "select * from admin_permission where id=" + permission; bool exist = false; MySqlDataReader reader = null; try { reader = db.ExecReader(selectSql); if (reader == null) { return; } exist = reader.HasRows; } catch (Exception e) { TraceLog.Error("AdminOperator.AddPermission sql {0} failed,e={1}", selectSql, e.Message); } finally { if (reader != null) { reader.Close(); } } if (exist) { string updateSql = "update admin_permission set url=?url,name=?name,parent_id=?parent_id where id=?id;"; MySqlDataReader upReadr = null; try { var param = new List() { new MySqlParameter("?id", MySqlDbType.Int32) { Value = permission }, new MySqlParameter("?name", MySqlDbType.String) { Value = name }, new MySqlParameter("?url", MySqlDbType.String) { Value = url }, new MySqlParameter("?parent_id", MySqlDbType.Int32) { Value = pcode }, }.ToArray(); upReadr = db.ExecReader(updateSql, param); } catch (Exception e) { TraceLog.Error("AdminOperator.AddPermission sql {0} failed e={1}", updateSql, e.Message); } finally { if (upReadr != null) { upReadr.Close(); } } return; } string sql = "insert into admin_permission set id=?id,name=?name,url=?url,parent_id=?parent_id;"; try { var param = new List() { new MySqlParameter("?id", MySqlDbType.Int32) { Value = permission }, new MySqlParameter("?name", MySqlDbType.String) { Value = name }, new MySqlParameter("?url", MySqlDbType.String) { Value = url }, new MySqlParameter("?parent_id", MySqlDbType.Int32) { Value = pcode }, }.ToArray(); MySqlDataReader insetrReadr = null; try { insetrReadr = db.ExecReader(sql, param); } catch (Exception e) { TraceLog.Error("AdminOperator.AddPermission sql {0} failed {1}", sql, e.Message); } finally { if (insetrReadr != null) { insetrReadr.Close(); } } } catch (Exception e) { TraceLog.Error("AdminOperator.AddPermission sql {0} failed,{1}", sql, e.Message); } return; } public void UpdateRole(int id, string name, string menus, string permissions) { string updateSql = "update admin_role set permission=?permission,menu=?menu where name=?name"; var param = new List() { new MySqlParameter("?name", MySqlDbType.String) { Value = name }, new MySqlParameter("?permission", MySqlDbType.String) { Value = permissions }, new MySqlParameter("?menu", MySqlDbType.String) { Value = menus }, }.ToArray(); MySqlDataReader reader = null; try { reader = db.ExecReader(updateSql, param); } catch (Exception e) { TraceLog.Error("AdminOperator.UpdateRole sql {0} failed,{1}", updateSql, e.Message); } finally { if (reader != null) { reader.Close(); } } } public void AddRole(Role role) { if (role.Name == "") { return; } var ms = string.Join(",", role.Menus); var ps = string.Join(",", role.Permissions); string sql = string.Format("select * from admin_role where name='{0}'", role.Name); bool exists = false; MySqlDataReader reader = null; try { reader = db.ExecReader(sql); if (reader == null) { return; } exists = reader.HasRows; while (reader.Read()) { var id = reader.GetInt32("id"); role.Id = id; break; } } catch (Exception e) { TraceLog.Error("AdminOperator.AddRole sql {0} failed,{1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } if (exists) { UpdateRole(role.Id, role.Name, ms, ps); return; } if (reader != null) { reader.Close(); } string insertSql = "insert into admin_role set name=?name,permission=?permission,menu=?menu;"; var insert = new List() { new MySqlParameter("?name", MySqlDbType.String) { Value = role.Name }, new MySqlParameter("?permission", MySqlDbType.String) { Value = ps }, new MySqlParameter("?menu", MySqlDbType.String) { Value = ms }, }.ToArray(); try { reader = db.ExecReader(insertSql, insert); } catch (Exception e) { TraceLog.Error("AdminOperator.AddRole insert db sql {0} failed,{1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } } public void DeleteRole(int roleId) { string sql = "delete from admin_role where id=" + roleId; MySqlDataReader reader = null; try { reader = db.ExecReader(sql); if (reader == null) { return; } } catch (Exception e) { TraceLog.Error("AdminOperator.DeleteRole sql {0} failed,{1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } } public Menu GetMenu(int id) { string sql = string.Format("select * from admin_menu where menu_id={0}", id); MySqlDataReader reader = null; Menu menu = null; try { reader = db.ExecReader(sql); if (reader == null) { TraceLog.Error("db error"); return null; } menu = builderMenu(reader); } catch (Exception e) { TraceLog.Error("AdminOperator.GetMenu sql {0} failed,{1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } return menu; } public static Menu builderMenu(MySqlDataReader reader) { Menu menu = new Menu(); menu.MenuId = reader.GetInt32("menu_id"); menu.Name = reader.GetString("name"); menu.Order = reader.GetInt32("order"); menu.Icon = reader.GetString("icon"); menu.ParentId = reader.GetInt32("parent_id"); menu.Permission = reader.GetInt32("permission"); menu.Url = reader.GetString("url"); return menu; } public static Permission builderPermission(MySqlDataReader reader) { Permission menu = new Permission(); menu.Id = reader.GetInt32("id"); menu.Name = reader.GetString("name"); menu.ParentId = reader.GetInt32("parent_id"); menu.Urls = reader.GetString("url").Split(";").ToList(); return menu; } public List GetAllPermissions() { var result = new List(); string sql = "select * from admin_permission"; MySqlDataReader reader = null; try { reader = db.ExecReader(sql); if (reader == null) { return null; } while (reader.Read()) { var permission = builderPermission(reader); result.Add(permission); } } catch (Exception e) { TraceLog.Error("AdminOperator.GetAllPermissions sql {0} failed,{1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } return result; } public List GetMenuIds(string account) { var roles = GetRole(account); List menuList = new List(); if (roles == null) { return menuList; } foreach (var role in roles) { var ps = role.Menus; menuList.AddRange(ps); } return menuList; } public List GetPermissionIds(string account) { var roles = GetRole(account); List permissions = new List(); foreach (var role in roles) { var ps = role.Permissions; permissions.AddRange(ps); } return permissions; } public List GetPermissionList(string account) { var roles = GetRole(account); var result = new List(); if (roles == null) { return result; } List permissions = new List(); foreach (var role in roles) { var ps = role.Permissions; permissions.AddRange(ps); } if (permissions.Count == 0) { return result; } var pids = permissions.ToArray().Distinct().ToArray(); string sql = "select * from admin_permission where id in (" + String.Join(",", pids) + ")"; MySqlDataReader reader = null; try { reader = db.ExecReader(sql); if (reader == null) { return null; } while (reader.Read()) { var permission = builderPermission(reader); result.Add(permission); } } catch (Exception e) { TraceLog.Error("AdminOperator.GetPermissionList error,sql={0},error={1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } return result; } public List GetRole(string account) { var roleIds = GetRoleIds(account); if (roleIds.Count == 0) { return null; } string result = String.Join(",", roleIds); string roleSql = string.Format("select * from admin_role where id in ({0})", result); List roles = new List(); MySqlDataReader reader = null; try { reader = db.ExecReader(roleSql); if (reader == null) { return null; } while (reader.Read()) { Role role = new Role(); role.build(reader); roles.Add(role); } } catch (Exception e) { TraceLog.Error("AdminOperator.GetRole error,sql={0},error={1}", roleSql, e.Message); } finally { if (reader != null) { reader.Close(); } } return roles; } public List GetAllRoles() { string sql = "select * from admin_role"; List roles = new List(); MySqlDataReader reader = null; try { reader = db.ExecReader(sql); if (reader == null) { return null; } while (reader.Read()) { Role role = new Role(); role.build(reader); roles.Add(role); } } catch (Exception e) { TraceLog.Error("AdminOperator.GetAllRoles error,sql={0},error={1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } return roles; } public void SaveAdminRole(String account, string rolesList) { string sql = "select * from admin_account_role where account='" + account + "'"; var reader = db.ExecReader(sql); if (reader == null) { return; } bool exists = reader.HasRows; reader.Close(); if (exists) { MySqlDataReader upReader = null; try { String upSql = "update admin_account_role set role=?role where account='" + account + "'"; var args = new List() { new MySqlParameter("?role", MySqlDbType.String) { Value = rolesList }, }.ToArray(); upReader = db.ExecReader(upSql, args); } catch (Exception e) { TraceLog.Error("AdminOperator.SaveAdminRole error,sql={0},error={1}", sql, e.Message); return; } finally { if (upReader != null) { upReader.Close(); } } return; } string insertSql = "insert into admin_account_role set account=?account,role=?role"; var data = new List() { new MySqlParameter("?account", MySqlDbType.String) { Value = account }, new MySqlParameter("?role", MySqlDbType.String) { Value = rolesList }, }.ToArray(); MySqlDataReader inReader = null; try { inReader = db.ExecReader(insertSql, data); } catch (Exception e) { TraceLog.Error("AdminOperator.SaveAdminRole error,sql={0},error={1}", sql, e.Message); return; } finally { if (inReader != null) { inReader.Close(); } } } public void DeleteAdminRole(String account) { string sql = "delete from admin_account_role where account='" + account + "'"; MySqlDataReader reader = null; try { reader = db.ExecReader(sql); if (reader == null) { return; } } catch (Exception e) { TraceLog.Error("AdminOperator.DeleteAdminRole error,sql={0},error={1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } } public List GetRoleIds(string account) { //用户所有用的角色信息 string sql = string.Format("select * from admin_account_role where account='{0}'", account); MySqlDataReader reader = null; List roleIds = new List(); try { reader = db.ExecReader(sql); if (reader == null) { return null; } while (reader.Read()) { string roles = reader.GetString("role"); string[] s = roles.Split(","); for (int i = 0; i < s.Length; i++) { if (!string.IsNullOrEmpty(s[i])) { roleIds.Add(Convert.ToInt32(s[i])); } } break; } } catch (Exception e) { TraceLog.Error("AdminOperator.GetRoleIds error,sql={0},error={1}", sql, e.Message); } finally { if (reader != null) { reader.Close(); } } for (int i = 0; i < roleIds.Count; i++) { var id = roleIds[i]; } return roleIds; } } public class Account { public string account; public string name; public int valid; public string lastLoginTime; public string cTime; public List roles; public Account() { roles = new List(); } public JsonData ToJson() { var json = new JsonData(); json["account"] = account; json["name"] = name; json["valid"] = valid; json["lastLoginTime"] = lastLoginTime; json["cTime"] = cTime; if (roles != null && roles.Count > 0) { JsonData rs = new JsonData(); roles.ForEach(role => { rs.Add(role.ToJson()); }); json["roles"] = rs; } return json; } } //菜单 public class Menu { public int MenuId; public string Url; public string Name; public String Icon; public int Order; public int ParentId; public int Permission; public int Version; public List subMenus; public Menu() { subMenus = new List(); } public JsonData ToJson() { var json = new JsonData(); json["MenuId"] = MenuId; json["Url"] = Url; json["Name"] = Name; json["Order"] = Order; json["Icon"] = Icon; json["ParentId"] = ParentId; json["Permission"] = Permission; json["Version"] = Version; if (subMenus != null && subMenus.Count > 0) { var list = subMenus.OrderBy(item => item.Order).ToList(); JsonData subjson = new JsonData(); foreach (var sub in list) { subjson.Add(sub.ToJson()); } json["subMenus"] = subjson; } return json; } } //权限 public class Permission { public int Id; public string Name; public int ParentId; public List Urls; public List SubPermissions; public Permission() { Urls = new List(); SubPermissions = new List(); } public JsonData ToJson() { JsonData jsonData = new JsonData(); jsonData["Id"] = Id; jsonData["Name"] = Name; jsonData["ParentId"] = ParentId; jsonData["Urls"] = string.Join(",", Urls); if (SubPermissions != null && SubPermissions.Count > 0) { var list = SubPermissions.OrderBy(item => item.Id).ToList(); JsonData subjson = new JsonData(); foreach (var sub in list) { subjson.Add(sub.ToJson()); } jsonData["SubPermissions"] = subjson; } return jsonData; } } //角色 public class Role { public Role() { Permissions = new List(); Menus = new List(); } public int Id; public string Name; public List Menus; //当前这个角色下有哪些菜单 public List Permissions; //当前这个角色下有哪些权限 public void build(MySqlDataReader row) { int roleId = row.GetInt32("id"); string name = row.GetString("name"); this.Id = roleId; this.Name = name; if (!row.IsDBNull(row.GetOrdinal("permission"))) { string permissions = row.GetString("permission"); var ps = permissions.Split(","); for (int i = 0; i < ps.Length; i++) { string p = ps[i]; this.Permissions.Add(p.Toint32(0)); } } if (!row.IsDBNull(row.GetOrdinal("menu"))) { string menus = row.GetString("menu"); var ms = menus.Split(","); for (int i = 0; i < ms.Length; i++) { string m = ms[i]; this.Menus.Add(m.Toint32(0)); } } } public JsonData ToJson() { JsonData json = new JsonData(); json["Id"] = Id; json["Name"] = Name; json["Menus"] = string.Join(",", Menus); json["Permissions"] = string.Join(",", Permissions); return json; } } } // 用户 权限 菜单 角色 //角色--->用户 //菜单---->权限 //角色---->权限