mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-08-23 13:06:48 +08:00
修复模块菜单不受分级控制的BUG
This commit is contained in:
parent
fbdd6163a2
commit
38eec363d7
@ -14,46 +14,35 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
using Infrastructure;
|
using Infrastructure;
|
||||||
using OpenAuth.App.ViewModel;
|
using OpenAuth.App.ViewModel;
|
||||||
using OpenAuth.Domain;
|
using OpenAuth.Domain;
|
||||||
using OpenAuth.Domain.Interface;
|
using OpenAuth.Domain.Interface;
|
||||||
|
using OpenAuth.Domain.Service;
|
||||||
|
|
||||||
namespace OpenAuth.App
|
namespace OpenAuth.App
|
||||||
{
|
{
|
||||||
public class ModuleElementManagerApp
|
public class ModuleElementManagerApp
|
||||||
{
|
{
|
||||||
private readonly IRepository<ModuleElement> _repository;
|
private ModuleEleManService _moduleEleManService;
|
||||||
private IModuleRepository _moduleRepository;
|
|
||||||
private IRelevanceRepository _relevanceRepository;
|
|
||||||
|
|
||||||
public ModuleElementManagerApp(IRepository<ModuleElement> repository,
|
public ModuleElementManagerApp(ModuleEleManService moduleEleManService)
|
||||||
IRelevanceRepository relevanceRepository,
|
|
||||||
IModuleRepository moduleRepository )
|
|
||||||
{
|
{
|
||||||
_repository = repository;
|
_moduleEleManService = moduleEleManService;
|
||||||
_moduleRepository = moduleRepository;
|
|
||||||
_relevanceRepository = relevanceRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddOrUpdate(ModuleElement model)
|
public void AddOrUpdate(ModuleElement model)
|
||||||
{
|
{
|
||||||
var newbtn = new ModuleElement();
|
var newbtn = new ModuleElement();
|
||||||
model.CopyTo(newbtn);
|
model.CopyTo(newbtn);
|
||||||
if (model.Id == 0)
|
_moduleEleManService.AddOrUpdate(newbtn);
|
||||||
{
|
|
||||||
_repository.Add(newbtn);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_repository.Update(newbtn);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<ModuleElement> LoadByModuleId(int id)
|
public IEnumerable<ModuleElement> LoadByModuleId(int id)
|
||||||
{
|
{
|
||||||
var modules = _repository.Find(u => u.ModuleId == id).OrderBy(u =>u.Sort);
|
string username = HttpContext.Current.User.Identity.Name;
|
||||||
return modules;
|
return _moduleEleManService.LoadByModuleId(username, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -65,56 +54,15 @@ namespace OpenAuth.App
|
|||||||
/// 当为UserElement时,表示UserId
|
/// 当为UserElement时,表示UserId
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <param name="moduleId">模块ID</param>
|
/// <param name="moduleId">模块ID</param>
|
||||||
public List<ModuleElementVM> LoadWithAccess(string accessType, int firstId, int moduleId)
|
public List<dynamic> LoadWithAccess(string accessType, int firstId, int moduleId)
|
||||||
{
|
{
|
||||||
//TODO:多个Repository使用的是不同的Context不能进行联表查询,要用UnitOfWork处理
|
string username = HttpContext.Current.User.Identity.Name;
|
||||||
|
return _moduleEleManService.LoadWithAccess(username, accessType, firstId, moduleId);
|
||||||
var listVms = new List<ModuleElementVM>();
|
|
||||||
if (moduleId == 0) return listVms;
|
|
||||||
string modulename = _moduleRepository.FindSingle(u => u.Id == moduleId).Name;
|
|
||||||
|
|
||||||
foreach (var element in LoadByModuleId(moduleId))
|
|
||||||
{
|
|
||||||
var accessed = _relevanceRepository.FindSingle(u =>u.Key == accessType
|
|
||||||
&& u.FirstId == firstId && u.SecondId == element.Id);
|
|
||||||
ModuleElementVM vm = new ModuleElementVM
|
|
||||||
{
|
|
||||||
Id = element.Id,
|
|
||||||
Name = element.Name,
|
|
||||||
ModuleId = element.ModuleId,
|
|
||||||
DomId = element.DomId,
|
|
||||||
ModuleName = modulename,
|
|
||||||
Accessed = accessed != null
|
|
||||||
};
|
|
||||||
listVms.Add(vm);
|
|
||||||
}
|
|
||||||
return listVms;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Delete(ModuleElement[] objs)
|
public void Delete(ModuleElement[] objs)
|
||||||
{
|
{
|
||||||
var delIds = objs.Select(u => u.Id).ToList();
|
_moduleEleManService.Delete(objs);
|
||||||
_repository.Delete(u =>delIds.Contains(u.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AssignForRole(int roleId, int[] menuIds)
|
|
||||||
{
|
|
||||||
_relevanceRepository.AddRelevance("RoleElement", menuIds.ToLookup(u => roleId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CancelForRole(int roleId, int[] ids)
|
|
||||||
{
|
|
||||||
_relevanceRepository.Delete(u => ids.Contains(u.SecondId) && u.Key == "RoleElement" && u.FirstId == roleId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AssignForUser(int userId, int[] ids)
|
|
||||||
{
|
|
||||||
_relevanceRepository.AddRelevance("UserElement", ids.ToLookup(u => userId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CancelForUser(int userId, int[] ids)
|
|
||||||
{
|
|
||||||
_relevanceRepository.Delete(u => ids.Contains(u.SecondId) && u.Key == "UserElement" && u.FirstId == userId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,18 @@
|
|||||||
using Infrastructure;
|
using Infrastructure;
|
||||||
using OpenAuth.App.ViewModel;
|
|
||||||
using OpenAuth.Domain;
|
using OpenAuth.Domain;
|
||||||
using OpenAuth.Domain.Interface;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Web;
|
||||||
|
using OpenAuth.Domain.Service;
|
||||||
|
|
||||||
namespace OpenAuth.App
|
namespace OpenAuth.App
|
||||||
{
|
{
|
||||||
public class ModuleManagerApp
|
public class ModuleManagerApp
|
||||||
{
|
{
|
||||||
private IModuleRepository _repository;
|
private ModuleManService _moduleManService;
|
||||||
private IRelevanceRepository _relevanceRepository;
|
|
||||||
|
|
||||||
public ModuleManagerApp(IModuleRepository repository,
|
public ModuleManagerApp(ModuleManService moduleManService)
|
||||||
IRelevanceRepository relevanceRepository)
|
|
||||||
{
|
{
|
||||||
_repository = repository;
|
_moduleManService = moduleManService;
|
||||||
_relevanceRepository = relevanceRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -25,83 +20,20 @@ namespace OpenAuth.App
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public dynamic Load(int parentId, int pageindex, int pagesize)
|
public dynamic Load(int parentId, int pageindex, int pagesize)
|
||||||
{
|
{
|
||||||
IEnumerable<Module> Modules;
|
string loginuser = HttpContext.Current.User.Identity.Name;
|
||||||
int total = 0;
|
return _moduleManService.Load(loginuser, parentId, pageindex, pagesize);
|
||||||
if (parentId == 0)
|
|
||||||
{
|
|
||||||
Modules = _repository.LoadModules(pageindex, pagesize);
|
|
||||||
total = _repository.GetCount();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var ids = GetSubOrgIds(parentId);
|
|
||||||
Modules = _repository.LoadInOrgs(pageindex, pagesize, ids);
|
|
||||||
total = _repository.GetModuleCntInOrgs(ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new
|
|
||||||
{
|
|
||||||
total = total,
|
|
||||||
list = Modules,
|
|
||||||
pageCurrent = pageindex
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 为树型结构提供数据
|
|
||||||
/// </summary>
|
|
||||||
public List<Module> LoadForTree()
|
|
||||||
{
|
|
||||||
return _repository.Find(null).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 以组合的方式显示所有的模块信息
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parentId">The parent unique identifier.</param>
|
|
||||||
/// <returns>List{ModuleView}.</returns>
|
|
||||||
public List<ModuleView> LoadByParent(int parentId)
|
|
||||||
{
|
|
||||||
var modules = new List<ModuleView>();
|
|
||||||
var roots = _repository.Find(u => u.ParentId == parentId);
|
|
||||||
foreach (var module in roots)
|
|
||||||
{
|
|
||||||
ModuleView mv = module;
|
|
||||||
mv.Childern = LoadByParent(module.Id);
|
|
||||||
modules.Add(mv);
|
|
||||||
}
|
|
||||||
return modules;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Module Find(int id)
|
|
||||||
{
|
|
||||||
var module = _repository.FindSingle(u => u.Id == id);
|
|
||||||
if (module == null) return new Module();
|
|
||||||
|
|
||||||
return module;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Delete(int id)
|
public void Delete(int id)
|
||||||
{
|
{
|
||||||
var del = _repository.FindSingle(u => u.Id == id);
|
_moduleManService.Delete(id);
|
||||||
if (del == null) return;
|
|
||||||
|
|
||||||
_repository.Delete(u => u.CascadeId.Contains(del.CascadeId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddOrUpdate(Module vm)
|
public void AddOrUpdate(Module vm)
|
||||||
{
|
{
|
||||||
Module model = new Module();
|
Module model = new Module();
|
||||||
vm.CopyTo(model); //copy一次,防止成员为null的情况
|
vm.CopyTo(model); //copy一次,防止成员为null的情况
|
||||||
ChangeModuleCascade(model);
|
_moduleManService.AddOrUpdate(model);
|
||||||
if (model.Id == 0)
|
|
||||||
{
|
|
||||||
_repository.Add(model);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_repository.Update(model);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 用户/角色分配模块
|
#region 用户/角色分配模块
|
||||||
@ -113,34 +45,7 @@ namespace OpenAuth.App
|
|||||||
/// <param name="userId">The user unique identifier.</param>
|
/// <param name="userId">The user unique identifier.</param>
|
||||||
public List<Module> LoadForUser(int userId)
|
public List<Module> LoadForUser(int userId)
|
||||||
{
|
{
|
||||||
//用户角色
|
return _moduleManService.LoadForUser(userId);
|
||||||
var userRoleIds =
|
|
||||||
_relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserRole").Select(u => u.SecondId).ToList();
|
|
||||||
|
|
||||||
//用户角色与自己分配到的模块ID
|
|
||||||
var moduleIds =
|
|
||||||
_relevanceRepository.Find(
|
|
||||||
u =>
|
|
||||||
(u.FirstId == userId && u.Key == "UserModule") ||
|
|
||||||
(u.Key == "RoleModule" && userRoleIds.Contains(u.FirstId))).Select(u => u.SecondId).ToList();
|
|
||||||
|
|
||||||
//var moduleIds =
|
|
||||||
// _relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserModule")
|
|
||||||
// .Select(u => u.SecondId)
|
|
||||||
// .ToList();
|
|
||||||
if (!moduleIds.Any()) return new List<Module>();
|
|
||||||
return _repository.Find(u => moduleIds.Contains(u.Id)).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 为特定的用户分配模块
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="userId">The user unique identifier.</param>
|
|
||||||
/// <param name="ids">模块ID</param>
|
|
||||||
public void AssignModuleForUser(int userId, int[] ids)
|
|
||||||
{
|
|
||||||
_relevanceRepository.DeleteBy("UserModule", userId);
|
|
||||||
_relevanceRepository.AddRelevance("UserModule", ids.ToLookup(u => userId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -149,72 +54,10 @@ namespace OpenAuth.App
|
|||||||
/// <param name="roleId">The role unique identifier.</param>
|
/// <param name="roleId">The role unique identifier.</param>
|
||||||
public List<Module> LoadForRole(int roleId)
|
public List<Module> LoadForRole(int roleId)
|
||||||
{
|
{
|
||||||
var moduleIds =
|
return _moduleManService.LoadForRole(roleId);
|
||||||
_relevanceRepository.Find(u => u.FirstId == roleId && u.Key == "RoleModule")
|
|
||||||
.Select(u => u.SecondId)
|
|
||||||
.ToList();
|
|
||||||
if (!moduleIds.Any()) return new List<Module>();
|
|
||||||
return _repository.Find(u => moduleIds.Contains(u.Id)).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 为特定的角色分配模块
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="roleId">The user unique identifier.</param>
|
|
||||||
/// <param name="ids">模块ID</param>
|
|
||||||
public void AssignModuleForRole(int roleId, int[] ids)
|
|
||||||
{
|
|
||||||
_relevanceRepository.DeleteBy("RoleModule", roleId);
|
|
||||||
_relevanceRepository.AddRelevance("RoleModule", ids.ToLookup(u => roleId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion 用户/角色分配模块
|
#endregion 用户/角色分配模块
|
||||||
|
|
||||||
#region 私有方法
|
|
||||||
|
|
||||||
//根据同一级中最大的语义ID
|
|
||||||
|
|
||||||
private int[] GetSubOrgIds(int parentId)
|
|
||||||
{
|
|
||||||
var parent = _repository.FindSingle(u => u.Id == parentId);
|
|
||||||
var orgs = _repository.Find(u => u.CascadeId.Contains(parent.CascadeId)).Select(u => u.Id).ToArray();
|
|
||||||
return orgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
//修改对象的级联ID
|
|
||||||
private void ChangeModuleCascade(Module module)
|
|
||||||
{
|
|
||||||
string cascadeId;
|
|
||||||
int currentCascadeId = 1; //当前结点的级联节点最后一位
|
|
||||||
var sameLevels = _repository.Find(o => o.ParentId == module.ParentId && o.Id != module.Id);
|
|
||||||
foreach (var obj in sameLevels)
|
|
||||||
{
|
|
||||||
int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last());
|
|
||||||
if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (module.ParentId != 0)
|
|
||||||
{
|
|
||||||
var parentOrg = _repository.FindSingle(o => o.Id == module.ParentId);
|
|
||||||
if (parentOrg != null)
|
|
||||||
{
|
|
||||||
cascadeId = parentOrg.CascadeId + "." + currentCascadeId;
|
|
||||||
module.ParentName = parentOrg.Name;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new Exception("未能找到该组织的父节点信息");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cascadeId = "0." + currentCascadeId;
|
|
||||||
module.ParentName = "根节点";
|
|
||||||
}
|
|
||||||
|
|
||||||
module.CascadeId = cascadeId;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion 私有方法
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -65,6 +65,8 @@
|
|||||||
<Compile Include="Resource.cs" />
|
<Compile Include="Resource.cs" />
|
||||||
<Compile Include="Role.cs" />
|
<Compile Include="Role.cs" />
|
||||||
<Compile Include="Service\AuthoriseService.cs" />
|
<Compile Include="Service\AuthoriseService.cs" />
|
||||||
|
<Compile Include="Service\ModuleEleManService.cs" />
|
||||||
|
<Compile Include="Service\ModuleManService.cs" />
|
||||||
<Compile Include="Service\ResManagerService.cs" />
|
<Compile Include="Service\ResManagerService.cs" />
|
||||||
<Compile Include="Service\StockManagerService.cs" />
|
<Compile Include="Service\StockManagerService.cs" />
|
||||||
<Compile Include="Stock.cs" />
|
<Compile Include="Stock.cs" />
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
@charset "utf-8";
|
@charset "utf-8";
|
||||||
html, body, div, span, applet, object, iframe,
|
html, body, div, span, applet, object, iframe,
|
||||||
p, blockquote, pre,
|
p, blockquote, pre,
|
||||||
a, abbr, acronym, address, big, cite, code,
|
a, abbr, acronym, address, big, cite, code,
|
||||||
@ -341,6 +341,24 @@ td[align=right] input{text-align:right;}
|
|||||||
#bjui-taskbar > .taskbarRight:hover{cursor:pointer;}
|
#bjui-taskbar > .taskbarRight:hover{cursor:pointer;}
|
||||||
#bjui-taskbar > .taskbarLeft.disabled:hover,
|
#bjui-taskbar > .taskbarLeft.disabled:hover,
|
||||||
#bjui-taskbar > .taskbarRight.disabled:hover{cursor:default;}
|
#bjui-taskbar > .taskbarRight.disabled:hover{cursor:default;}
|
||||||
|
|
||||||
|
/*doc */
|
||||||
|
.bjui-doc{margin:10px;}
|
||||||
|
.bjui-doc .page-header{margin-top:0; border-bottom-color:#CCC;}
|
||||||
|
.bjui-doc ul, ol{margin-left:22px; margin-top:0; margin-bottom:10px;}
|
||||||
|
.bjui-doc ul{list-style:disc;}
|
||||||
|
.bjui-doc ol{list-style:decimal;}
|
||||||
|
.bjui-doc p,
|
||||||
|
.bjui-doc li,
|
||||||
|
.bjui-doc code,
|
||||||
|
.bjui-doc blockquote *{line-height:1.7; font-size:14px;}
|
||||||
|
.bjui-doc blockquote.point{border-left-color:#FF6600;}
|
||||||
|
.bjui-doc blockquote {padding:5px 15px; border-top:1px #EEE solid; border-right:1px #EEE solid; border-bottom:1px #EEE solid; border-radius:5px;}
|
||||||
|
.bjui-doc code.h4{margin:10px 0; font-size:18px; font-weight:500; color:#c7254e;}
|
||||||
|
.bjui-doc .table{margin-bottom:15px;}
|
||||||
|
.bjui-doc td{line-height:1.7;}
|
||||||
|
.bjui-doc .syntaxhighlighter *{font-size:12px !important; line-height:1.5 !important;}
|
||||||
|
.bjui-doc .bjui-tablefixed .table{margin-bottom:0;}
|
||||||
/* datagrid */
|
/* datagrid */
|
||||||
.bjui-datagrid{position:relative; overflow:hidden; border-width:1px; border-style:solid; border-color:#ddd; border-radius:5px;}
|
.bjui-datagrid{position:relative; overflow:hidden; border-width:1px; border-style:solid; border-color:#ddd; border-radius:5px;}
|
||||||
.bjui-datagrid .datagrid-title{height:30px; line-height:30px; text-indent:5px; font-weight:bold; border-bottom:1px #ddd solid;}
|
.bjui-datagrid .datagrid-title{height:30px; line-height:30px; text-indent:5px; font-weight:bold; border-bottom:1px #ddd solid;}
|
||||||
|
@ -16,11 +16,6 @@ namespace OpenAuth.Mvc.Controllers
|
|||||||
_app = AutofacExt.GetFromFac<ModuleManagerApp>();
|
_app = AutofacExt.GetFromFac<ModuleManagerApp>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetModules(int parentId = 0)
|
|
||||||
{
|
|
||||||
return JsonHelper.Instance.Serialize(_app.LoadByParent(parentId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ActionResult Index()
|
public ActionResult Index()
|
||||||
{
|
{
|
||||||
var user = AutofacExt.GetFromFac<LoginApp>().GetLoginUser();
|
var user = AutofacExt.GetFromFac<LoginApp>().GetLoginUser();
|
||||||
|
@ -149,7 +149,7 @@
|
|||||||
<li><a href="https://git.oschina.net/yubaolee/OpenAuth.Net" target="_blank">关于OpenAuth.Net</a></li>
|
<li><a href="https://git.oschina.net/yubaolee/OpenAuth.Net" target="_blank">关于OpenAuth.Net</a></li>
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li><a href="http://www.cnblogs.com/yubaolee" target="_blank">官方博客</a></li>
|
<li><a href="http://www.cnblogs.com/yubaolee" target="_blank">官方博客</a></li>
|
||||||
<li><a href="http://b-jui.com/index_tree.html" target="_blank">友情链接</a></li>
|
<li><a href="http://b-jui.com" target="_blank">友情链接</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -1,35 +1,62 @@
|
|||||||
|
@{
|
||||||
@{
|
|
||||||
Layout = null;
|
Layout = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<div class="bjui-pageHeader" style="background:#FFF;">
|
<div class="bjui-pageHeader" style="background:#FFF;">
|
||||||
<div style="padding: 0 15px;">
|
<div style="padding: 0 15px;">
|
||||||
<h4 style="margin-bottom:20px;">
|
<h4 style="margin-bottom: 20px;">
|
||||||
基于经典DDD架构的权限管理系统
|
基于经典DDD架构的权限管理系统
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<div style="margin-top: 22px; padding-left: 6px;">
|
|
||||||
<div class="alert alert-danger">QQ群:484498493</div>
|
|
||||||
<span style="padding-left: 30px;">官方博客:</span>
|
|
||||||
<a href="http://www.cnblogs.com/yubaolee/" target="_blank">http://www.cnblogs.com/yubaolee/</a>
|
|
||||||
</div>
|
|
||||||
<div class="row" style=" margin-top:10px;">
|
|
||||||
<div class="col-md-6" style="padding:5px;">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bjui-pageContent">
|
<div class="bjui-pageContent">
|
||||||
<div style="margin-top:5px; margin-right:300px; overflow:hidden;">
|
<div style="margin-top: 5px; margin-right: 300px; overflow: hidden;">
|
||||||
<div class="row" style="padding: 0 8px;">
|
<div class="row" style="padding: 0 8px;">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading"><h3 class="panel-title">项目最新动态>></h3></div>
|
<div class="panel-heading">
|
||||||
|
<h3 class="panel-title">
|
||||||
|
社区信息>>
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body bjui-doc" style="padding: 0;">
|
||||||
|
<ul>
|
||||||
|
<li>QQ群:484498493</li>
|
||||||
|
<li>官方博客:<a href="http://www.cnblogs.com/yubaolee/" target="_blank">http://www.cnblogs.com/yubaolee/</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 5px; margin-right: 300px; overflow: hidden;">
|
||||||
|
<div class="row" style="padding: 0 8px;">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h3 class="panel-title">
|
||||||
|
本在线演示说明>>
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body bjui-doc" style="padding: 0;">
|
||||||
|
<ul>
|
||||||
|
<li>为安全起见,关闭了所有修改请求,如想体验完整功能可搭建本地环境</li>
|
||||||
|
<li>admin/test两个账号只分配了部分模块/部门,系统完整模块/部门情况请直接在登录界面点击“以开发者账号登陆”</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 5px; margin-right: 300px; overflow: hidden;">
|
||||||
|
<div class="row" style="padding: 0 8px;">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h3 class="panel-title">项目最新动态>></h3>
|
||||||
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<iframe width="100%" height="300" class="share_self" frameborder="0" scrolling="no" src="/Home/Git"></iframe>
|
<iframe width="100%" height="300" class="share_self" frameborder="0" scrolling="no" src="/Home/Git"></iframe>
|
||||||
</div>
|
</div>
|
||||||
@ -37,4 +64,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
Loading…
Reference in New Issue
Block a user