版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Q563573095/article/details/80431905
一、需求背景
1、按钮的个数需要可扩展
2、按钮的显示需要根据具体记录状态和权限变化
二、需求分析
1、这个需求要求按钮不能简单的写在页面,这样会造成不同页面的代码冗余。
2、可以考虑按钮显示内容及相关信息由后台维护并带到前端展示,如点击后跳转的链接
3、对记录状态和权限的判断设计到查询数据库等调用代码的操作。如果简单使用控制语句判断实现则扩充意味权限&状态规则不变的情况下着要修改代码。
4、最好的方式是按钮的信息(规则判断、跳转、显示信息)维护到代码外,如xml文件等。此时“状态、权限判断的代码调用”就是字符串
5、此时就需要一个实现能够直接执行该字符串并返回结果功能,这是关键。
三、需求实现
1、这个能够直接执行就是org.eweb4j.fel
2、XML设计如下,对不同的模块,有不同的pageId
<states>
<!--
1、pageId是主键,用于匹配具体的state
2、service是执行<exp>表达式依赖的服务
3、paramSwitchExp 可以用来拼凑button的url参数
-->
<state pageId="logan_page_event_list" prepare="service1"
paramSwitchExp="editPageId:eventType.edit|detailPageId:eventType.detail">
<!--
1、name是key值
2、il8n显示名
3、sort,按钮显示时的排序
4、url,触发时的跳转连接
5、exp中的返回true时返回该按钮
-->
<button name="edit" i18n="编辑" sort = "3" url="/regular/index.html?__id=$editPageId$&businessId=$eventId$">
<exp>
service1.checkEventStatus(eventStatus,'new')
&&(service1.checkRecordBySelf(eventPerson) || service1.checkIsAgent(creator, agent, eventPerson, eventStatus,'new'))
</exp>
</button>
</state>
<state pageId="event_edit" prepare="Service2">
<button name="save" i18n="保存" sort = "2" url="/regular/event/addOrUpdateEvent.json">
<exp>
Service2.checkEventStatus(eventStatus,'new')
&&(Service2.checkRecordBySelf(eventPerson)
||Service2.checkIsAgent(eventId,'new'))
</exp>
</button>
<button name="submit" i18n="提交" sort = "3" url="/regular/event/submitEvent.json">
<exp>
Service2.checkEventStatus(eventStatus,'new')
&&(Service2.checkRecordBySelf(eventPerson)
||Service2.checkIsAgent(eventId,'new'))
</exp>
</button>
</state>
3、解析将xml解析成java对象,保存在list中(可以通过反射装入)
4、类图
5、时序图
6、当然提供服务的那个类也应该有的。