构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(22)-权限管理系统-模块导航制作
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(22)-权限管理系统-模块导航制作
最近比较忙,系统难度独步增加,文章的发布速度明显比以前慢了。
由于我们已经跑通了整个系统,所有东西都回到了简单,接下来我们做模块制作也就是操作SysModule表。
首先我们来回顾一下之前的难点主要就是SysRight这个表Rightflag字段的改变,这个字段关系导航与角色组的关系显示(即有权限时候显示菜单导航,这个更新讲到授权讲到,在这里浮头一下)
所以我们操作SysModule必须更新SysRight这张表,把模块先分配给角色
所以思路已经比较明显和简单了,这里我们模块将用treegrid来做,同时也间接学习怎么用treegrid,我之前也没用过easyui的datagrid,系统是jqgrid
这里用到权限控制了,所以你必须为SysModule添加增加,删除,修改等权限,并为admin用户授权,添加权限跳转到第十八讲 (必须非常熟练这一步,多用手动插入数据)
在此之前,由于我之前没用过treegrid不知道有个字段state(展开或者关闭属性)与数据库表SysModule的state字段冲突。然后更新EF
所以我们要修改一下SysModule的State变成Enable
添加后,我们依旧添加SysModule和SysModuleOperate模块的DAL BLL Model层代码(老套路了)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using App.Models; namespace App.IDAL
{
public interface ISysModuleRepository
{
IQueryable<SysModule> GetList(DBContainer db);
IQueryable<SysModule> GetModuleBySystem(DBContainer db,string parentId);
int Create(SysModule entity);
void Delete(DBContainer db, string id);
int Edit(SysModule entity);
SysModule GetById(string id);
bool IsExist(string id);
}
}
ISysModuleRepository
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using App.Models;
using App.IDAL;
using System.Data; namespace App.DAL
{
public class SysModuleRepository : IDisposable,ISysModuleRepository
{
public IQueryable<SysModule> GetList(DBContainer db)
{
IQueryable<SysModule> list = db.SysModule.AsQueryable();
return list;
} public IQueryable<SysModule> GetModuleBySystem(DBContainer db, string parentId)
{
return db.SysModule.Where(a => a.ParentId == parentId).AsQueryable();
} public int Create(SysModule entity)
{
using (DBContainer db = new DBContainer())
{
db.SysModule.AddObject(entity);
return db.SaveChanges();
}
} public void Delete(DBContainer db, string id)
{
SysModule entity = db.SysModule.SingleOrDefault(a => a.Id == id);
if (entity != null)
{ //删除SysRight表数据
var sr = db.SysRight.AsQueryable().Where(a=>a.ModuleId==id);
foreach(var o in sr)
{
//删除SysRightOperate表数据
var sro= db.SysRightOperate.AsQueryable().Where(a=>a.RightId==o.Id);
foreach(var o2 in sro)
{
db.SysRightOperate.DeleteObject(o2);
}
db.SysRight.DeleteObject(o);
}
//删除SysModuleOperate数据
var smo = db.SysModuleOperate.AsQueryable().Where(a => a.ModuleId == id);
foreach (var o3 in smo)
{
db.SysModuleOperate.DeleteObject(o3);
}
db.SysModule.DeleteObject(entity);
}
} public int Edit(SysModule entity)
{
using (DBContainer db = new DBContainer())
{
db.SysModule.Attach(entity);
db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
return db.SaveChanges();
}
} public SysModule GetById(string id)
{
using (DBContainer db = new DBContainer())
{
return db.SysModule.SingleOrDefault(a => a.Id == id);
}
} public bool IsExist(string id)
{
using (DBContainer db = new DBContainer())
{
SysModule entity = GetById(id);
if (entity != null)
return true;
return false;
}
}
public void Dispose()
{ }
}
}
SysModuleRepository
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using App.Models;
using App.Common;
using App.Models.Sys; namespace App.IBLL
{
public interface ISysModuleBLL
{
List<SysModuleModel> GetList(string parentId);
List<SysModule> GetModuleBySystem(string parentId);
bool Create(ref ValidationErrors errors, SysModuleModel model);
bool Delete(ref ValidationErrors errors, string id);
bool Edit(ref ValidationErrors errors, SysModuleModel model);
SysModuleModel GetById(string id);
bool IsExist(string id);
}
}
ISysModuleBLL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using App.IBLL;
using Microsoft.Practices.Unity;
using App.IDAL;
using App.Models;
using App.BLL.Core;
using App.Common;
using System.Transactions;
using App.Models.Sys;
namespace App.BLL
{
public class SysModuleBLL:BaseBLL, ISysModuleBLL
{
[Dependency]
public ISysModuleRepository m_Rep { get; set; } public List<SysModuleModel> GetList(string parentId)
{
IQueryable<SysModule> queryData = null;
queryData = m_Rep.GetList(db).Where(a => a.ParentId == parentId).OrderBy(a => a.Sort);
return CreateModelList(ref queryData);
}
private List<SysModuleModel> CreateModelList(ref IQueryable<SysModule> queryData)
{
List<SysModuleModel> modelList = (from r in queryData
select new SysModuleModel
{
Id = r.Id,
Name = r.Name,
EnglishName = r.EnglishName,
ParentId = r.ParentId,
Url = r.Url,
Iconic = r.Iconic,
Sort = r.Sort,
Remark = r.Remark,
Enable = r.Enable,
CreatePerson = r.CreatePerson,
CreateTime = r.CreateTime,
IsLast = r.IsLast
}).ToList();
return modelList;
} public List<SysModule> GetModuleBySystem(string parentId)
{ return m_Rep.GetModuleBySystem(db,parentId).ToList();
} public bool Create(ref ValidationErrors errors, SysModuleModel model)
{ try
{
SysModule entity = m_Rep.GetById(model.Id);
if (entity != null)
{
errors.Add(Suggestion.PrimaryRepeat);
return false;
}
entity = new SysModule();
entity.Id = model.Id;
entity.Name = model.Name;
entity.EnglishName = model.EnglishName;
entity.ParentId = model.ParentId;
entity.Url = model.Url;
entity.Iconic = model.Iconic;
entity.Sort = model.Sort;
entity.Remark = model.Remark;
entity.Enable = model.Enable;
entity.CreatePerson = model.CreatePerson;
entity.CreateTime = model.CreateTime;
entity.IsLast = model.IsLast;
if (m_Rep.Create(entity)==)
{
//分配给角色
db.P_Sys_InsertSysRight();
return true;
}
else
{
errors.Add(Suggestion.InsertFail);
return false;
}
}
catch (Exception ex)
{
errors.Add(ex.Message);
ExceptionHander.WriteException(ex);
return false;
} }
public bool Delete(ref ValidationErrors errors, string id)
{
try
{
//检查是否有下级
if (db.SysModule.AsQueryable().Where(a=>a.SysModule2.Id==id).Count()>)
{
errors.Add("有下属关联,请先删除下属!");
return false;
}
m_Rep.Delete(db, id);
if (db.SaveChanges() > )
{
//清理无用的项
db.P_Sys_ClearUnusedRightOperate();
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
errors.Add(ex.Message);
ExceptionHander.WriteException(ex);
return false;
}
} public bool Edit(ref ValidationErrors errors, SysModuleModel model)
{
try
{
SysModule entity = m_Rep.GetById(model.Id);
if (entity == null)
{
errors.Add(Suggestion.Disable);
return false;
}
entity.Name = model.Name;
entity.EnglishName = model.EnglishName;
entity.ParentId = model.ParentId;
entity.Url = model.Url;
entity.Iconic = model.Iconic;
entity.Sort = model.Sort;
entity.Remark = model.Remark;
entity.Enable = model.Enable;
entity.IsLast = model.IsLast; if (m_Rep.Edit(entity) == )
{
return true;
}
else
{
errors.Add(Suggestion.EditFail);
return false;
}
}
catch (Exception ex)
{
errors.Add(ex.Message);
ExceptionHander.WriteException(ex);
return false;
}
} public SysModuleModel GetById(string id)
{
if (IsExist(id))
{
SysModule entity = m_Rep.GetById(id);
SysModuleModel model = new SysModuleModel();
model.Id = entity.Id;
model.Name = entity.Name;
model.EnglishName = entity.EnglishName;
model.ParentId = entity.ParentId;
model.Url = entity.Url;
model.Iconic = entity.Iconic;
model.Sort = entity.Sort;
model.Remark = entity.Remark;
model.Enable = entity.Enable;
model.CreatePerson = entity.CreatePerson;
model.CreateTime = entity.CreateTime;
model.IsLast = entity.IsLast;
return model;
}
else
{
return null;
}
}
public bool IsExist(string id)
{
return m_Rep.IsExist(id);
}
}
}
SysModuleBLL
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由T4模板自动生成
// 生成时间 2012-12-25 15:33:37 by App
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------ using System;
using System.ComponentModel.DataAnnotations; namespace App.Models.Sys
{ public class SysModuleModel
{
[Display(Name = "ID")]
public string Id { get; set; }
[Display(Name = "名称")]
public string Name { get; set; } [Display(Name = "别名")]
public string EnglishName { get; set; }
[Display(Name = "上级ID")]
public string ParentId { get; set; }
[Display(Name = "链接")]
public string Url { get; set; }
[Display(Name = "图标")]
public string Iconic { get; set; }
[Display(Name = "排序号")]
public int? Sort { get; set; }
[Display(Name = "说明")]
public string Remark { get; set; }
[Display(Name = "状态")]
public bool Enable { get; set; }
[Display(Name = "创建人")]
public string CreatePerson { get; set; }
[Display(Name = "创建时间")]
public DateTime? CreateTime { get; set; }
[Display(Name = "是否最后一项")]
public bool IsLast { get; set; } public string state { get; set; }//treegrid }
}
SysModuleModel
-----------------------------------丑陋的分割线----------------------------------------
using App.Models;
using System.Linq;
namespace App.IDAL
{
public interface ISysModuleOperateRepository
{
IQueryable<SysModuleOperate> GetList(DBContainer db);
int Create(SysModuleOperate entity);
int Delete(string id);
SysModuleOperate GetById(string id);
bool IsExist(string id);
}
}
ISysModuleOperateRepository
using System;
using System.Linq;
using App.Models;
using System.Data;
using App.IDAL; namespace App.DAL
{
public class SysModuleOperateRepository : ISysModuleOperateRepository, IDisposable
{ public IQueryable<SysModuleOperate> GetList(DBContainer db)
{
IQueryable<SysModuleOperate> list = db.SysModuleOperate.AsQueryable();
return list;
} public int Create(SysModuleOperate entity)
{
using (DBContainer db = new DBContainer())
{
db.SysModuleOperate.AddObject(entity);
return db.SaveChanges();
}
} public int Delete(string id)
{
using (DBContainer db = new DBContainer())
{
SysModuleOperate entity = db.SysModuleOperate.SingleOrDefault(a => a.Id == id);
if (entity != null)
{ db.SysModuleOperate.DeleteObject(entity);
}
return db.SaveChanges();
}
} public SysModuleOperate GetById(string id)
{
using (DBContainer db = new DBContainer())
{
return db.SysModuleOperate.SingleOrDefault(a => a.Id == id);
}
} public bool IsExist(string id)
{
using (DBContainer db = new DBContainer())
{
SysModuleOperate entity = GetById(id);
if (entity != null)
return true;
return false;
}
}
public void Dispose()
{ }
}
}
SysModuleOperateRepository
using System.Collections.Generic;
using App.Common;
using App.Models.Sys;
namespace App.IBLL
{
public interface ISysModuleOperateBLL
{
List<SysModuleOperateModel> GetList(ref GridPager pager, string queryStr);
bool Create(ref ValidationErrors errors, SysModuleOperateModel model);
bool Delete(ref ValidationErrors errors, string id);
SysModuleOperateModel GetById(string id);
bool IsExist(string id);
}
}
ISysModuleOperateBLL
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Practices.Unity;
using App.Models;
using App.Common;
using System.Transactions;
using App.Models.Sys;
using App.IBLL;
using App.IDAL;
using App.BLL.Core; namespace App.BLL
{
public class SysModuleOperateBLL : BaseBLL, ISysModuleOperateBLL
{
[Dependency]
public ISysModuleOperateRepository m_Rep { get; set; } public List<SysModuleOperateModel> GetList(ref GridPager pager, string mid)
{ IQueryable<SysModuleOperate> queryData = m_Rep.GetList(db).Where(a => a.ModuleId == mid);
pager.totalRows = queryData.Count();
queryData = LinqHelper.SortingAndPaging(queryData, pager.sort, pager.order, pager.page, pager.rows);
return CreateModelList(ref queryData);
}
private List<SysModuleOperateModel> CreateModelList(ref IQueryable<SysModuleOperate> queryData)
{ List<SysModuleOperateModel> modelList = (from r in queryData
select new SysModuleOperateModel
{
Id = r.Id,
Name = r.Name,
KeyCode = r.KeyCode,
ModuleId = r.ModuleId,
IsValid = r.IsValid,
Sort = r.Sort
}).ToList();
return modelList;
} public bool Create(ref ValidationErrors errors, SysModuleOperateModel model)
{
try
{
SysModuleOperate entity = m_Rep.GetById(model.Id);
if (entity != null)
{
errors.Add(Suggestion.PrimaryRepeat);
return false;
}
entity = new SysModuleOperate();
entity.Id = model.Id;
entity.Name = model.Name;
entity.KeyCode = model.KeyCode;
entity.ModuleId = model.ModuleId;
entity.IsValid = model.IsValid;
entity.Sort = model.Sort;
if (m_Rep.Create(entity) == )
{
return true;
}
else
{
errors.Add(Suggestion.InsertFail);
return false;
}
}
catch (Exception ex)
{
errors.Add(ex.Message);
ExceptionHander.WriteException(ex);
return false;
}
} public bool Delete(ref ValidationErrors errors, string id)
{
try
{
if (m_Rep.Delete(id) == )
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
errors.Add(ex.Message);
ExceptionHander.WriteException(ex);
return false;
}
} public bool IsExists(string id)
{
if (db.SysModuleOperate.SingleOrDefault(a => a.Id == id) != null)
{
return true;
}
return false;
} public SysModuleOperateModel GetById(string id)
{
if (IsExist(id))
{
SysModuleOperate entity = m_Rep.GetById(id);
SysModuleOperateModel model = new SysModuleOperateModel();
model.Id = entity.Id;
model.Name = entity.Name;
model.KeyCode = entity.KeyCode;
model.ModuleId = entity.ModuleId;
model.IsValid = entity.IsValid;
model.Sort = entity.Sort;
return model;
}
else
{
return null;
}
} public bool IsExist(string id)
{
return m_Rep.IsExist(id);
}
}
}
SysModuleOperateBLL
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由T4模板自动生成
// 生成时间 2012-12-25 17:15:28 by App
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------ using System;
using System.ComponentModel.DataAnnotations; namespace App.Models.Sys
{ public class SysModuleOperateModel
{
[Display(Name = "ID")]
public string Id { get; set; }
[Display(Name = "操作名称")]
public string Name { get; set; }
[Display(Name = "操作码")]
public string KeyCode { get; set; }
[Display(Name = "所属模块")]
public string ModuleId { get; set; }
[Display(Name = "是否验证")]
public bool IsValid { get; set; }
[Required(ErrorMessage = "{0}必须填写")]
[Display(Name = "排序号")]
public int Sort { get; set; } }
}
SysModuleOperateModel
-----------------------------------丑陋的分割线----------------------------------------
在BaseController添加方法(获取当前页或操作访问权限)
/// <summary>
/// 获取当前页或操作访问权限
/// </summary>
/// <returns>权限列表</returns>
public List<permModel> GetPermission()
{
string filePath = HttpContext.Request.FilePath; List<permModel> perm = (List<permModel>)Session[filePath];
return perm;
}
GetPermission()
控制器
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由T4模板自动生成
// 生成时间 2012-12-25 15:31:19 by YmNets
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Microsoft.Practices.Unity;
using App.IBLL;
using App.Common;
using App.Models;
using App.Models.Sys; namespace App.Admin.Controllers
{
public class SysModuleController : BaseController
{
/// <summary>
/// 业务层注入
/// </summary>
[Dependency]
public ISysModuleBLL m_BLL { get; set; }
[Dependency]
public ISysModuleOperateBLL operateBLL { get; set; }
ValidationErrors errors = new ValidationErrors(); /// <summary>
/// 主页
/// </summary>
/// <returns>视图</returns>
[SupportFilter]
public ActionResult Index()
{
ViewBag.Perm = GetPermission();
return View(); }
/// <summary>
/// 获取列表
/// </summary>
/// <param name="pager">分页</param>
/// <param name="queryStr">查询条件</param>
/// <returns></returns>
[SupportFilter(ActionName = "Index")]
[HttpPost]
public JsonResult GetList(string id)
{
if (id == null)
id = "";
List<SysModuleModel> list = m_BLL.GetList(id);
var json = from r in list
select new SysModuleModel()
{
Id = r.Id,
Name = r.Name,
EnglishName = r.EnglishName,
ParentId = r.ParentId,
Url = r.Url,
Iconic = r.Iconic,
Sort = r.Sort,
Remark = r.Remark,
Enable = r.Enable,
CreatePerson = r.CreatePerson,
CreateTime = r.CreateTime,
IsLast = r.IsLast,
state = (m_BLL.GetList(r.Id).Count > ) ? "closed" : "open"
}; return Json(json);
} [HttpPost]
[SupportFilter(ActionName = "Index")]
public JsonResult GetOptListByModule(GridPager pager, string mid)
{
pager.rows = ;
pager.page = ;
List<SysModuleOperateModel> list = operateBLL.GetList(ref pager, mid);
var json = new
{
total = pager.totalRows,
rows = (from r in list
select new SysModuleOperateModel()
{
Id = r.Id,
Name = r.Name,
KeyCode = r.KeyCode,
ModuleId = r.ModuleId,
IsValid = r.IsValid,
Sort = r.Sort }).ToArray() }; return Json(json);
} #region 创建模块
[SupportFilter]
public ActionResult Create(string id)
{
ViewBag.Perm = GetPermission();
SysModuleModel entity = new SysModuleModel()
{
ParentId = id,
Enable = true,
Sort =
};
return View(entity);
} [HttpPost]
[SupportFilter]
public JsonResult Create(SysModuleModel model)
{
model.Id = ResultHelper.NewId;
model.CreateTime = ResultHelper.NowTime;
model.CreatePerson = GetUserId();
if (model != null && ModelState.IsValid)
{ if (m_BLL.Create(ref errors, model))
{
LogHandler.WriteServiceLog(GetUserId(), "Id" + model.Id + ",Name" + model.Name, "成功", "创建", "SysModule");
return Json(JsonHandler.CreateMessage(, Suggestion.InsertSucceed));
}
else
{
string ErrorCol = errors.Error;
LogHandler.WriteServiceLog(GetUserId(), "Id" + model.Id + ",Name" + model.Name + "," + ErrorCol, "失败", "创建", "SysModule");
return Json(JsonHandler.CreateMessage(, Suggestion.InsertFail + ErrorCol));
}
}
else
{
return Json(JsonHandler.CreateMessage(, Suggestion.InsertFail));
}
}
#endregion #region 创建
[SupportFilter(ActionName = "Create")]
public ActionResult CreateOpt(string moduleId)
{
ViewBag.Perm = GetPermission();
SysModuleOperateModel sysModuleOptModel = new SysModuleOperateModel();
sysModuleOptModel.ModuleId = moduleId;
sysModuleOptModel.IsValid = true;
return View(sysModuleOptModel);
} [HttpPost]
[SupportFilter(ActionName = "Create")]
public JsonResult CreateOpt(SysModuleOperateModel info)
{
if (info != null && ModelState.IsValid)
{
SysModuleOperateModel entity = operateBLL.GetById(info.Id);
if (entity != null)
return Json(JsonHandler.CreateMessage(, Suggestion.PrimaryRepeat), JsonRequestBehavior.AllowGet);
entity = new SysModuleOperateModel();
entity.Id = info.ModuleId + info.KeyCode;
entity.Name = info.Name;
entity.KeyCode = info.KeyCode;
entity.ModuleId = info.ModuleId;
entity.IsValid = info.IsValid;
entity.Sort = info.Sort; if (operateBLL.Create(ref errors, entity))
{
LogHandler.WriteServiceLog(GetUserId(), "Id:" + info.Id + ",Name:" + info.Name, "成功", "创建", "模块设置");
return Json(JsonHandler.CreateMessage(, Suggestion.InsertSucceed), JsonRequestBehavior.AllowGet);
}
else
{
string ErrorCol = errors.Error;
LogHandler.WriteServiceLog(GetUserId(), "Id:" + info.Id + ",Name:" + info.Name + "," + ErrorCol, "失败", "创建", "模块设置");
return Json(JsonHandler.CreateMessage(, Suggestion.InsertFail + ErrorCol), JsonRequestBehavior.AllowGet);
}
}
else
{
return Json(JsonHandler.CreateMessage(, Suggestion.InsertFail), JsonRequestBehavior.AllowGet);
}
}
#endregion #region 修改模块
[SupportFilter]
public ActionResult Edit(string id)
{
ViewBag.Perm = GetPermission();
SysModuleModel entity = m_BLL.GetById(id);
return View(entity);
} [HttpPost]
[SupportFilter]
public JsonResult Edit(SysModuleModel model)
{
if (model != null && ModelState.IsValid)
{
if (m_BLL.Edit(ref errors, model))
{
LogHandler.WriteServiceLog(GetUserId(), "Id" + model.Id + ",Name" + model.Name, "成功", "修改", "系统菜单");
return Json(JsonHandler.CreateMessage(, Suggestion.EditSucceed));
}
else
{
string ErrorCol = errors.Error;
LogHandler.WriteServiceLog(GetUserId(), "Id" + model.Id + ",Name" + model.Name + "," + ErrorCol, "失败", "修改", "系统菜单");
return Json(JsonHandler.CreateMessage(, Suggestion.EditFail + ErrorCol));
}
}
else
{
return Json(JsonHandler.CreateMessage(, Suggestion.EditFail));
}
}
#endregion #region 删除
[HttpPost]
[SupportFilter]
public JsonResult Delete(string id)
{
if (!string.IsNullOrWhiteSpace(id))
{
if (m_BLL.Delete(ref errors, id))
{
LogHandler.WriteServiceLog(GetUserId(), "Ids:" + id, "成功", "删除", "模块设置");
return Json(JsonHandler.CreateMessage(, Suggestion.DeleteSucceed), JsonRequestBehavior.AllowGet);
}
else
{
string ErrorCol = errors.Error;
LogHandler.WriteServiceLog(GetUserId(), "Id:" + id + "," + ErrorCol, "失败", "删除", "模块设置");
return Json(JsonHandler.CreateMessage(, Suggestion.DeleteFail + ErrorCol), JsonRequestBehavior.AllowGet);
}
}
else
{
return Json(JsonHandler.CreateMessage(, Suggestion.DeleteFail), JsonRequestBehavior.AllowGet);
} } [HttpPost]
[SupportFilter(ActionName = "Delete")]
public JsonResult DeleteOpt(string id)
{
if (!string.IsNullOrWhiteSpace(id))
{
if (operateBLL.Delete(ref errors, id))
{
LogHandler.WriteServiceLog(GetUserId(), "Id:" + id, "成功", "删除", "模块设置KeyCode");
return Json(JsonHandler.CreateMessage(, Suggestion.DeleteSucceed), JsonRequestBehavior.AllowGet);
}
else
{
string ErrorCol = errors.Error;
LogHandler.WriteServiceLog(GetUserId(), "Id:" + id + "," + ErrorCol, "失败", "删除", "模块设置KeyCode");
return Json(JsonHandler.CreateMessage(, Suggestion.DeleteFail + ErrorCol), JsonRequestBehavior.AllowGet);
}
}
else
{
return Json(JsonHandler.CreateMessage(, Suggestion.DeleteFail), JsonRequestBehavior.AllowGet);
} } #endregion
}
}
SysModuleController
视图
@using App.Admin;
@using App.Common;
@using App.Models.Sys; @{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Index_Layout.cshtml"; List<permModel> perm = (List<permModel>)ViewBag.Perm;
if (perm == null)
{
perm = new List<permModel>();
}
} <table>
<tr>
<td style="vertical-align:top">
<div class="mvctool">
@Html.ToolButton("btnCreate", "icon-add", "新增", perm, "Create", true)
@Html.ToolButton("btnEdit", "icon-edit", "编辑", perm, "Edit", true)
@Html.ToolButton("btnDelete", "icon-remove", "删除", perm, "Delete", true) </div> <table id="List"></table> </td>
<td style="width: 210px; padding-left: 5px; vertical-align:top">
<div class="mvctool">
@Html.ToolButton("btnCreateOpt", "icon-add", "新增操作码", perm, "Create", true)
@Html.ToolButton("btnDeleteOpt", "icon-remove", "删除操作码", perm, "Delete", true)
</div> <table id="OptList"></table> </td>
</tr>
</table> <div id="modalwindow" class="easyui-window" data-options="modal:true,closed:true,minimizable:false,shadow:false"></div>
<script type="text/javascript">
$(function () {
$('#List').treegrid({
url: '@Url.Action("GetList")',
width: $(window).width() - ,
methord: 'post',
height: $(window).height() - ,
fitColumns: true,
treeField: 'Name',
idField: 'Id',
pagination: false,
striped: true, //奇偶行是否区分
singleSelect: true,//单选模式
//rownumbers: true,//行号
columns: [[
{ field: 'Id', title: '唯一标识', width: },
{ field: 'Name', title: '名称', width: , sortable: true },
{ field: 'EnglishName', title: '英文名称', width: , sortable: true,hidden:true },
{ field: 'ParentId', title: '上级Id', width: , sortable: true },
{ field: 'Url', title: '链接地址', width: , sortable: true },
{ field: 'Iconic', title: '图标', width: , sortable: true },
{ field: 'Sort', title: '排序号', width: , sortable: true },
{ field: 'Remark', title: '说明', width: , sortable: true },
{
field: 'Enable', title: '是否启用', width: ,align:'center', formatter: function (value) {
if (value) {
return "<img src='/Content/Images/icon/pass.png'/>";
} else {
return "<img src='/Content/Images/icon/no.png'/>";
}
}
},
{ field: 'CreatePerson', title: '创建人', width: , sortable: true },
{ field: 'CreateTime', title: '创建时间', width: , sortable: true },
{
field: 'IsLast', title: '是否最后一项', align: 'center', width: , formatter: function (value) {
if (value) {
return "是";
} else {
return "否";
}
}
},
]],
onClickRow: function (index, data) {
var row = $('#List').treegrid('getSelected');
if (row != null) {
$('#OptList').datagrid({
url: '@Url.Action("GetOptListByModule")?mid=' + row.Id
});
}
}
});
$('#OptList').datagrid({
url: '@Url.Action("GetOptListByModule")',
width: ,
methord: 'post',
height: $(window).height() - ,
fitColumns: true,
sortName: 'Sort',
sortOrder: 'asc',
idField: 'Id',
pageSize: ,
pagination: false,
striped: true, //奇偶行是否区分
singleSelect: true,//单选模式
//rownumbers: true,//行号
columns: [[
{ field: 'Id', title: '', width: , hidden: true },
{ field: 'Name', title: '名称', width: , sortable: true },
{ field: 'KeyCode', title: '操作码', width: , sortable: true },
{ field: 'ModuleId', title: '所属模块', width: , sortable: true, hidden: true },
{
field: 'IsValid', title: '是否验证', width: , align: 'center', formatter: function (value) {
if (value) {
return "<img src='/Content/Images/icon/pass.png'/>";
} else {
return "<img src='/Content/Images/icon/no.png'/>";
}
}
},
{ field: 'Sort', title: '排序', width: , sortable: true }
]]
}); //自动宽高
$(window).resize(function () {
$('#List').datagrid('resize', {
width: $(window).width() - ,
height: $(window).height() -
}).datagrid('resize', {
width: $(window).width() - ,
height: $(window).height() -
});
$('#OptList').datagrid('resize', {
height: $(window).height() -
}).datagrid('resize', {
height: $(window).height() -
});
});
});
//ifram 返回
function frameReturnByClose() {
$("#modalwindow").window('close');
}
function frameReturnByReload(flag) {
if (flag)
$("#List").treegrid('reload');
else
$("#List").treegrid('load');
}
function frameReturnByReloadOpt(flag) {
if (flag)
$("#OptList").datagrid('load');
else
$("#OptList").datagrid('reload');
}
function frameReturnByMes(mes) {
$.messageBox5s('提示', mes);
}
$(function () {
$("#btnCreate").click(function () {
var row = $('#List').treegrid('getSelected');
$("#modalwindow").html("<iframe width='100%' height='98%' scrolling='no' frameborder='0'' src='/SysModule/Create?id=" + (row != null ? row.Id : "") + "&Ieguid=" + GetGuid() + "'></iframe>");
$("#modalwindow").window({ title: '新增', width: , height: , iconCls: 'icon-add' }).window('open');
});
$("#btnEdit").click(function () {
var row = $('#List').treegrid('getSelected');
if (row != null) {
$("#modalwindow").html("<iframe width='100%' height='99%' frameborder='0' src='/SysModule/Edit?id=" + row.Id + "&Ieguid=" + GetGuid() + "'></iframe>");
$("#modalwindow").window({ title: '编辑', width: , height: , iconCls: 'icon-edit' }).window('open');
} else { $.messageBox5s('提示', '@Suggestion.PlaseChooseToOperatingRecords'); }
});
$("#btnDelete").click(function () {
var row = $('#List').treegrid('getSelected');
if (row != null) {
$.messager.confirm('提示', '@Suggestion.YouWantToDeleteTheSelectedRecords', function (r) {
if (r) {
$.post("@Url.Action("Delete")?id=" + row.Id, function (data) {
if (data.type == )
$("#List").treegrid('reload');
$.messageBox5s('提示', data.message);
}, "json"); }
});
} else { $.messageBox5s('提示', '@Suggestion.PlaseChooseToOperatingRecords'); }
}); $("#btnCreateOpt").click(function () {
var row = $('#List').treegrid('getSelected');
if (row != null) {
if (row.IsLast) {
$("#modalwindow").html("<iframe width='100%' height='99%' frameborder='0' src='/SysModule/CreateOpt?moduleId=" + row.Id + "&Ieguid=" + GetGuid() + "'></iframe>");
$("#modalwindow").window({ title: '新增操作码', width: , height: , iconCls: 'icon-edit' }).window('open'); } else {
$.messageBox5s('提示', '只有最后一项的菜单才能设置操作码!');
} } else { $.messageBox5s('提示', '请选择一个要赋予操作码的模块!'); }
});
$("#btnDeleteOpt").click(function () {
var row = $('#OptList').datagrid('getSelected');
if (row != null) {
$.messager.confirm('提示', '您确定要删除“' + row.Name+ '”这个操作码?', function (r) {
if (r) {
$.post("@Url.Action("DeleteOpt")?id=" + row.Id, function (data) {
if (data.type == )
{
$("#OptList").datagrid('load');
}
}, "json"); }
});
} else { $.messageBox5s('提示', '请选择一个要赋予操作码的模块!'); }
});
});
</script>
Index.cshtml
@model App.Models.Sys.SysModuleModel
@using App.Common;
@using App.Models.Sys;
@using App.Admin;
@{
ViewBag.Title = "修改";
Layout = "~/Views/Shared/_Index_LayoutEdit.cshtml";
List<permModel> perm = (List<permModel>)ViewBag.Perm;
if (perm == null)
{
perm = new List<permModel>();
}
} <script type="text/javascript">
$(function () {
$("#btnSave").click(function () {
if ($("form").valid()) {
$.ajax({
url: "@Url.Action("Edit")",
type: "Post",
data: $("form").serialize(),
dataType: "json",
success: function (data) {
if (data.type == ) {
window.parent.frameReturnByMes(data.message);
window.parent.frameReturnByReload(true);
window.parent.frameReturnByClose()
}
else {
window.parent.frameReturnByMes(data.message);
}
}
});
}
return false;
});
$("#btnReturn").click(function () {
window.parent.frameReturnByClose();
});
});
</script>
<div class="mvctool bgb">
@Html.ToolButton("btnSave", "icon-save", "保存", perm, "Save", true)
@Html.ToolButton("btnReturn", "icon-return", "返回",false)
</div>
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.CreateTime)
@Html.HiddenFor(model => model.CreatePerson)
<table class="fromEditTable setTextWidth300">
<tbody>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Name):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Name)
</td>
<td>@Html.ValidationMessageFor(model => model.Name)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.ParentId):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.ParentId)
</td>
<td>@Html.ValidationMessageFor(model => model.ParentId)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Url):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Url)
</td>
<td>@Html.ValidationMessageFor(model => model.Url)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Iconic):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Iconic)
</td>
<td>@Html.ValidationMessageFor(model => model.Iconic)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Sort):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Sort)
</td>
<td>@Html.ValidationMessageFor(model => model.Sort)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Remark):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Remark)
</td>
<td>@Html.ValidationMessageFor(model => model.Remark)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Enable):
</td>
<td style="width:310px">
@Html.CheckBoxFor(model => model.Enable)
</td>
<td>@Html.ValidationMessageFor(model => model.Enable)</td>
</tr> <tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.IsLast):
</td>
<td style="width:310px">
@Html.CheckBoxFor(model => model.IsLast)
</td>
<td>@Html.ValidationMessageFor(model => model.IsLast)</td>
</tr> </tbody>
</table>
}
Edit.cshtml
@model App.Models.Sys.SysModuleModel
@using App.Common;
@using App.Models.Sys;
@using App.Admin;
@{
ViewBag.Title = "创建";
Layout = "~/Views/Shared/_Index_LayoutEdit.cshtml";
List<permModel> perm = (List<permModel>)ViewBag.Perm;
if (perm == null)
{
perm = new List<permModel>();
}
} <script type="text/javascript">
$(function () {
$("#btnSave").click(function () {
if ($("form").valid()) {
$.ajax({
url: "@Url.Action("Create")",
type: "Post",
data: $("form").serialize(),
dataType: "json",
success: function (data) {
if (data.type == ) {
window.parent.frameReturnByMes(data.message);
window.parent.frameReturnByReload(true);
window.parent.frameReturnByClose()
}
else {
window.parent.frameReturnByMes(data.message);
}
}
});
}
return false;
});
$("#btnReturn").click(function () {
window.parent.frameReturnByClose();
});
});
</script>
<div class="mvctool bgb">
@Html.ToolButton("btnSave", "icon-save", "保存", perm, "Save", true)
@Html.ToolButton("btnReturn", "icon-return", "返回",false)
</div>
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.CreateTime)
<table class="fromEditTable setTextWidth300">
<tbody>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Name):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Name)
</td>
<td>@Html.ValidationMessageFor(model => model.Name)</td>
</tr> <tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.ParentId):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.ParentId)
</td>
<td>@Html.ValidationMessageFor(model => model.ParentId)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Url):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Url)
</td>
<td>@Html.ValidationMessageFor(model => model.Url)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Iconic):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Iconic)
</td>
<td>@Html.ValidationMessageFor(model => model.Iconic)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Sort):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Sort)
</td>
<td>@Html.ValidationMessageFor(model => model.Sort)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Remark):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Remark)
</td>
<td>@Html.ValidationMessageFor(model => model.Remark)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Enable):
</td>
<td style="width:310px">
@Html.CheckBoxFor(model => model.Enable, new { @checked = true })
</td>
<td>@Html.ValidationMessageFor(model => model.Enable)</td>
</tr> <tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.IsLast):
</td>
<td style="width:310px">
@Html.CheckBoxFor(model => model.IsLast, new { @checked = true })
</td>
<td>@Html.ValidationMessageFor(model => model.IsLast)</td>
</tr> </tbody>
</table>
}
Create.cshtml
@model App.Models.Sys.SysModuleOperateModel
@using App.Common;
@using App.Models.Sys;
@using App.Admin;
@{
ViewBag.Title = "创建";
Layout = "~/Views/Shared/_Index_LayoutEdit.cshtml";
List<permModel> perm = (List<permModel>)ViewBag.Perm;
if (perm == null)
{
perm = new List<permModel>();
}
} <script type="text/javascript">
$(function () {
$("#btnSave").click(function () {
if ($("form").valid()) {
$.ajax({
url: "@Url.Action("CreateOpt")",
type: "Post",
data: $("form").serialize(),
dataType: "json",
success: function (data) {
if (data.type == ) {
window.parent.frameReturnByMes(data.message);
window.parent.frameReturnByReloadOpt(true);
window.parent.frameReturnByClose()
}
else {
window.parent.frameReturnByMes(data.message);
}
}
});
}
return false;
});
$("#btnReturn").click(function () {
window.parent.frameReturnByClose();
});
});
</script>
<div class="mvctool bgb">
@Html.ToolButton("btnSave", "icon-save", "保存", perm, "Save", true)
@Html.ToolButton("btnReturn", "icon-return", "返回",false)
</div>
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.Id)
<table class="fromEditTable setTextWidth300">
<tbody>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Name):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Name)
</td>
<td>@Html.ValidationMessageFor(model => model.Name)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.KeyCode):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.KeyCode)
</td>
<td>@Html.ValidationMessageFor(model => model.KeyCode)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.ModuleId):
</td>
<td style="width:310px">
@Html.TextBoxFor(model => model.ModuleId, new { @readOnly = "readOnly" })
</td>
<td>@Html.ValidationMessageFor(model => model.ModuleId)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.IsValid):
</td>
<td style="width:310px">
@Html.CheckBoxFor(model => model.IsValid, new { @checked = true })
</td>
<td>@Html.ValidationMessageFor(model => model.IsValid)</td>
</tr>
<tr>
<td style="width:100px; text-align:right;">
@Html.LabelFor(model => model.Sort):
</td>
<td style="width:310px">
@Html.EditorFor(model => model.Sort)
</td>
<td>@Html.ValidationMessageFor(model => model.Sort)</td>
</tr>
</tbody>
</table>
}
CreateOpt.cshtml
创建模块的DAL层用到了一个存储过程,这个存储过程就是分配模块给角色的,要添加到EF
USE [AppDB]
GO
/****** Object: StoredProcedure [dbo].[P_Sys_InsertSysRight] Script Date: 12/24/2013 23:10:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create proc [dbo].[P_Sys_InsertSysRight]
as
--将设置好的模块分配到角色组
insert into SysRight(Id,ModuleId,RoleId,Rightflag)
select distinct b.Id+a.Id,a.Id,b.Id, from SysModule a,SysRole b
where a.Id+b.Id not in(select ModuleId+RoleId from SysRight)
P_Sys_InsertSysRight
后面补充一个存储过程,这个存储过程执行了清除无用的SysRightOperate(当每次删除角色或者模块,或者操作码时候会产生的垃圾),当然不清楚也不会对系统造成任何影响
Create proc [dbo].[P_Sys_ClearUnusedRightOperate]
as
--清理权限中的无用项目
delete from SysRightOperate where Id not in(
select a.RoleId+a.ModuleId+b.KeyCode from SysRight a,SysModuleOperate b
where a.ModuleId = b.ModuleId
)
GO
P_Sys_ClearUnusedRightOperate
最后大家别忘记要注入!!!一个丑陋的界面就这样完成了,大家自己动手美化一下吧.
本节演示了Easyui制作菜单,即无限级别树的做法,以及DataGrid之间的联动,我也是和大家一起学习,我也是Easyui的新手,如有不足,请大家见谅
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(22)-权限管理系统-模块导航制作的更多相关文章
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与目录(持续更新中...)
转自:http://www.cnblogs.com/ymnets/p/3424309.html 曾几何时我想写一个系列的文章,但是由于工作很忙,一直没有时间更新博客.博客园园龄都1年了,却一直都是空空 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(48)-工作流设计-起草新申请
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(48)-工作流设计-起草新申请 系列目录 创建新表单之后,我们就可以起草申请了,申请按照严格的表单步骤和分 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(47)-工作流设计-补充
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(47)-工作流设计-补充 系列目录 补充一下,有人要表单的代码,这个用代码生成器生成表Flow_Form表 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(46)-工作流设计-设计分支
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(46)-工作流设计-设计分支 系列目录 步骤设置完毕之后,就要设置好流转了,比如财务申请大于50000元( ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(45)-工作流设计-设计步骤
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(45)-工作流设计-设计步骤 系列目录 步骤设计很重要,特别是规则的选择. 我这里分为几个规则 1.按自行 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单 系列目录 设计表单是比较复杂的一步,完成一个表单的设计其实很漫长,主要分为四 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(43)-工作流设计-字段分类设计
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(43)-工作流设计-字段分类设计 系列目录 建立好42节的表之后,每个字段英文表示都是有意义的说明.先建立 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(42)-工作流设计01
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(42)-工作流设计01 工作流在实际应用中还是比较广泛,网络中存在很多工作流的图形化插件,可以做到拉拽的工 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 系列目录 上次的探讨没有任何结果,我浏览了大量的文章 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(41)-组织架构
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(41)-组织架构 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当 ...
随机推荐
- 让IE8兼容问题,参考文档bootstrap
问题:制作的页面基本没啥问题,只有IE8不好使 参考文档:bootstrap官网 方案一 方案二
- ibatis面试笔记
ibatis是在结果集与实体类之间进行映射hibernate是在数据库与实体类之间进行映射Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序 ...
- tornado学习精要
最简单的应用在程序的最顶部,我们导入了一些Tornado模块.虽然Tornado还有另外一些有用的模块,但在这个例子中我们必须至少包含这四个模块. 12341234包括了一个有用的模块(tornado ...
- 关于script,first,second,third=argv运行出错的问题
from sys import argv input(argv) #python自带的IDLE直接执行不能提供命令行参数 script,first,second,third=argv print(&q ...
- 从文章"避免复制与粘贴"到文章"Extract Method"的反思(3)
在牛人的博客中提到了..如果你的代码可以copy-past的时候,那么久证明你的代码出现了重复.而这种重复仅仅是虚假的代码行的增加而不是像其他的代码复用那样降级成本. copy-pase代码意味着你违 ...
- 手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b
不知为何 我在 OS X 10.11.5 及 Xcode 7.3 的 Storyboard 中设置 Tab View Controller 的 Transition 属性时,Tab View Cont ...
- jq总结
总述 jQuery 框架提供了很多方法,但大致上可以分为3 大类: 获取jQuery 对象的方法 在jQuery 对象间跳转的方法 获取jQuery 对象后调用的方法 获取 jQuery 对象 是怎样 ...
- 上传XML文件字符编码问题
1.上传的XML文件的空格的字符编码和倒入到数据库的空格的字符编码不是一种编码格式,导致导入到数据库的数据和XML文件的数据不一致的情况,进而使展示到界面上的数据在进行搜索时不能搜索出来.解决办法: ...
- [小知识]不显示没有内容的UITableViewCell
开发过程中常常使用到UITableView,当tableView的内容不足一屏时,若设置了talbeView的高度为屏幕高度,就会出现没有内容的cell显示出来,效果非常不好看,要想让没有内容的cel ...
- [CF Round #294 div2] E. A and B and Lecture Rooms 【树上倍增】
题目链接:E. A and B and Lecture Rooms 题目大意 给定一颗节点数10^5的树,有10^5个询问,每次询问树上到xi, yi这两个点距离相等的点有多少个. 题目分析 若 x= ...