平台管理后台与商家菜单资源管理:商家权限及其菜单资源管理设计

2022-10-28 16:40:13 浏览数 (1)

商家权限及其菜单资源管理设计

在商家的菜单体系中,我们设计了一个三级菜单,分别为分类、模块和资源。其中,分类菜单是顶级菜单,表示一个微服务应用;模块菜单是一个二级菜单,表示一个应用功能(实体)的主页;资源菜单是三级菜单,表示一个实体的增删改查中某一个具体的操作的权限。

在平台管理后台中,必须对这些菜单进行统一管理。下面就对各个菜单的管理及其设计分别加以说明。

分类菜单管理设计

分类菜单是一个顶级菜单,它所连接的是一个Web微服务应用,如库存管理、订单管理等,所以顶级菜单只在SSO首页中进行展示。

在分类菜单中管理包括增删改查等操作内容,下面以分类菜单查询的设计为例进行说明。首先使用控制器设计MerchantKindController,通过调用商家服务KindRestService取得分类菜单数据;然后将查询结果转换为视图输出,即返回 show.html的视图设计,实现代码如下所示:

代码语言:javascript复制
@Controller
@RequestMapping("/merchantkind")
public class MerchantKindController {
private static Logger logger =
LoggerFactory.getLogger (MerchantKindController.class);
@Autowired
private KindRestService kindRestService;
CRequestMapping(value="/{id} ")
public String show(ModelMap model, @PathVariable Long id) {
String json = kindRestService.findById(id);
model.addAttribute ("kind",new Gson ().fromJson(json, KindQo.class));return "merchantkind/show";
}
}

在show.html 的视图设计中,通过对话框的方式显示了show.html 的页面内容。其中,页面设计部分的实现代码如下所示:

代码语言:javascript复制
<html xmlns:th="http://www.thymeleaf.org"><div class= "addInfBtn">
<h3 class="itemTit"><span>分类信息</span></h3><table class="addNewInfList">
<tr>
<th>名称</th>
<td width="240"><input class="inp-list w-200 clear-mr f-left"
type="text" th:value="$ {kind.name}" readonly="true"/></td>
<th>链接服务</th>
<td width="240">
<input class="inp-list w-200 clear-mr f-left" type="text"
th:value="${kind. link] " readonly="true"/>
</td>
</tr><tr>
<th>日期</th><td>
<input onfocus="WdatePicker({dateFmt: 'yyyy-MM-dd HH:mm : ss
type="text" class="inp-list w-200 clear-mr f-left" th:value="$(kind.created) ?$(#dates. format (kind.created,'yyYy-MM-dd HH:mm:ss')] :'"/>
</td>
</tr></table>
<div class="bottomBtnBox">
<a class="btn-93X38 backBtn" href=" javascript:closeDialog(0)">返回</a></div>
</div>

完成设计后的显示效果如图11-3所示。

图11-3所显示的内容是一个“订单系统”的分类菜单的查询信息,其中“链接服务”使用的是订单微服务应用的实例名称。当操作者打开使用微服务名称作为顶级菜单的链接时,将通过服务名称找到相应的链接地址再进行访问。

模块菜单管理设计

模块菜单是商家管理后台的一个二级菜单,它表示一个应用中的一个业务类型。例如,在顶级菜单“订单系统”中可以包含“订单管理”和“订单报表”等模块菜单。

在模块菜单中包括菜单的增删改查等操作内容,下面以新建模块菜单的设计为例进行说明。

如下所示是一个新建模块菜单的控制器MerchantModelController 的设计:

代码语言:javascript复制
@Controller
@RequestMapping ("/merchantmodel")
public class MerchantModelController {
private static Logger logger =
LoggerFactory.getLogger (MerchantModelController.class);
@Autowired
private KindRestService kindRestService;
@Autowired
private ModelRestService modelRestService;
@RequestMapping( "/new")
public String create (ModelMap model,HttpServletRequest request){
String json = kindRestService.findList();
List<KindQo> kindQos = new Gson() .fromJson(json,new
TypeToken<List<KindQ0>>() {-getType());
//缓存模块列表
request.getSession().setAttribute ("kinds",kindQos);model. addAttribute("kinds", kindQ0s);
return "merchantmodel/new";
}
@RequestMapping(value="/save", method = RequestMethod.POST)@ResponseBody
public String save (Mode1Qo modelQo,HttpServletRequest request) throwsException {
//通过模块工D指定关联对象
String kid = request.getParameter ( "kid");//获取模块列表
List<KindQ0> kindQos =(List<KindQ0>)
request.getsession().getAttribute("kinds");
for(KindQo kindQo : kindQos){
if (kindQo.getId() .compareTo (new Long (kid)) == 0){
modelQ0. setKind(kindQo);
break;
}
}
String ret = modelRestService.create (modelQ0);logger.info("新增=” ret);
return ret;
}
}

需要注意的是,这里使用了查询对象ModelQo来获取表单的参数。这与使用实体对象来获

取参数略有不同,即使用查询对象不能得到所天联的对家,所以垃里史n组相对负,而不基示模块所关联的分类对象的ID,然后从我们在会话中保存的对象列表中取得相关对象,而不是

使用kid这样的参数直接取得所关联的分类对象。

在相关页面的视图设计上,也必须要有与之对应的设计。如下所示是一个新建模块菜单的视图new.html的设计:

代码语言:javascript复制
<html xmlns:th="http://www.thymeleaf.org">
<script th:srC="e{/scripts/merchantmodel/new.js}"></script><form id="saveForm" action="./save" method="post">
<table class="addNewInfList">
<tr>
<th>名称</th>
<td width="240">
<input class="inp-list w-200 clear-mr f-left" type="text"
name= "name" id= "name" maxlength="32"/>
<span class="tipStar f-left">*</span></td>
<th>URL</th>
<td width="240">
<input class="inp-list w-200 clear-mr f-left" type="text"
id="host" name="host" maxlength="64"/>
</td>
</tr>
<tr>
<th>日期</th><td>
<input onfocus="WdatePicker({dateFmt:'yYYy-MM-dd HH:mm:ss'})
type="text" class="inp-list w-200 clear-mr f-left" id="created"
name="created"/>
</td>
<th>分类</th>
<td width="240">
<div >
<select name="kid" id="kid">
<option th:each="kind:${kinds} " th:value="${kind.id}
th:text="${#strings.length (kind.name)>20?#strings.substring (kind.name,0,20) '...' :kind.name } "
></option>
</select>
<span class="tipStar f-right">*</span></div>
</td>
</tr></table>
<div class="bottomBtnBox">
<a class="btn-93x38 saveBtn" href="javascript:void (0)">确定</a>
<a class="btn-93X38 backBtn" href="javascript: closeDialog()">返回</a></div>
</form>

其中,在模块菜单所关联的分类使用的select控件中,使用了kid这个参数来取得分类对象的ID。

在完成设计后,模块菜单管理的显示效果如图11-4所示。

在图11-4中,URL是进入订单管理主页的一个链接地址,菜单所关联的上级菜单为“订单系统”。从这个设计中可以看出,二级的链接地址是一个应用的主页。

资源菜单管理设计

资源菜单是商家管理后台的一个三级菜单,如对于模块菜单“订单管理”来说,它可以含有“订单修改”和“订单删除”等子菜单。资源菜单是最小的权限管理单元,在权限管理设计中它是角色所关联的访问对象。

在资源菜单中包括增删改查等操作内容,下面以资源编辑的设计为例进行说明。

资源编辑控制器 MerchantResourceController的设计部分的代码如下所示:

代码语言:javascript复制
@Controller
@RequestMapping("/merchantresource")
public class MerchantResourceController{
private static Logger logger =
LoggerFactory.getLogger (MerchantResourceController.class);
@Autowired
private ResourceRestService resourceRestService;
@Autowired
private ModelRestService modelRestService;
@RequestMapping ("/index")
public string index (ModelMap model,Principal user) throws Exception"
model .addAttribute( "user",user);
return "merchantresource/index";
@RequestMapping("/edit/{id} ")
public String edit(@PathVariable Long id,ModelMap model, HttpServletRequestrequest) {
String json = resourceRestService.findById(id);
ResourceQo resourceQo = new Gson().fromJson(json,ResourceQo.class
String models - modelRestService.findList();
List<ModelQo> modelQoList = new Gson().fromJson(models,new
TypeToken<List<ModelQ0>>() {].getType();
//缓存模块列表
request.getSession().setAttribute ("models",modelQoList);
model .addAttribute( "models",modelQoList);
model.addAttribute("resource", resourceQ0);
return "merchantresource/edit";
}
@RequestMapping (method = RequestMethod. POST, value="/update")@ResponseBody
public String update(ResourceQo resourceQo,HttpServletRequest requestthrows Exception{
//通过模块ID指定关联对象
String mid - request.getParameter ( "mid");//获取模块列表
List<ModelQo> modelQos = (List<ModelQ0>)
request.getSession() .getAttribute ( "models");
for(ModelQo modelQ0 : modelQos){
if (modelQo.getId().compareTo(new Long (mid)) ==0){
resourceQo .setModel (modelQ0);
break;
}
}
String ret = resourceRestService.update(resourceQ0);logger.info(”修改=" ret);
return ret;
}
}

在进行资源编辑之前,首先取出模块列表,并使用这个模块列表在页面中设计一个下拉框。然后在资源编辑时从这个下拉框中选择一个模块设置它的上级菜单。最后在数据保存时,通过模块D取出相应的对象进行保存。

其对应的页面视图edit.html的设计如下所示:

代码语言:javascript复制
<html xmlns:th="http://www.thymeleaf.org">
<script th:src="e(/scripts/merchantresource/edit.js}"></script><form id="saveForm" method="post">
<input type="hidden" name="id" id="id" th:value="$ {resource.id}"/><div class="addInfBtn">
<h3 class="itemTit"><span>资源信息</span></h3><table class= "addNewInfList">
<tr>
<th>名称</th>
<td width="240">
<input class="inp-list w-200clear-mr f-left" type="text"
th:value="$ {resource.name]" id="name" name="name" maxlength="32"/>
<span class="tipStar f-left">*</span>
</td>
<th>模块</th>
<td width="240">
<div >
<select name="mid" id="mid">
<option th:each="model: ${models}" th:value="${model .id}"
th:text="${#strings. length (model.name)
>20?#strings.substring (model.name, 0, 20) '...':model.name}"
th:selected="${resource.model !=null and
resOurce. model.id == model.id}"
></option>
</select>
<span class="tipStar f-right">*</span></div>
</td></tr>
<th>URL</th>
<td width="240">
<input class="inp-list w-200 clear-mr f-left" type="text"
th:value="$ {resource.url]" id="url" name="url" maxlength="64">
</td>
<th>日期</th><td>
<input onfocus="wdatePicker({dateFmt:' vyyy-MM-dd HH:mm:ss'})"
type="text" class="inp-list w-200 clear-mr f-left"
th:value="${resource.created} ? ${#dates.format (resource.created, 'yvvvy-MM-ddHH :mm : ss')}:'"id="created" name="created" />
</td>
</tr></table>
<div class="bottomBtnBox">
<a class="btn-93x38 saveBtn" href="javascript:void(0) ">确定</a>
<a class="btn-93X38 backBtn" href="javascript:closeDialog (0)">返回<</div>
</div>
</form>

这里对于模块下拉列表使用了mid的方式进行引用。完成设计后,资源管理的显示效果如图11-5所示。

从图11-5中可以看出,三级菜单是在一个应用中对某一个实体进行增删改查时的一项操作权限,URL是一个执行订单修改的链接地址。在链接地址后面增加的几个符号“/**”是为了方便权限的检查,也可以省略不用,而所关联的模块菜单“订单管理”就是订单修改的上级菜单。

本文给大家讲解的内容是平台管理后台与商家菜单资源管理:商家权限及其菜单资源管理设计

  1. 下篇文章给大家讲解的是平台管理后台与商家菜单资源管理:商家角色管理设计;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

0 人点赞