Mendix中级认证培训案例-Vacation Tracking
Vacation Tracking
一、用户角色:
-
Administrator
-
Employee:
-
Manager:
-
Guest:
二、UserManagement模块:
0、模块角色
- Manager
- Employee
- Guest
1、Domain model
默认自带Administration模块中有Account实体。
需要给账号设置头像,系统默认自带Image实体。
- 1 创建ProfilePicture实体,继承Image实体,并与Account实体建立1对1关联。
1.2 在Account所在模块Domain Model中进行安全性更新
2、账号管理页面
2.1 Overview
-
ListView绑定数据库中Account实体。
-
Dynamic Image绑定Account实体关联的ProfilePicture实体。
-
Overview页面设置为对Manager可见。
-
对Account实体设置Administrator角色(Administration模块内)权限:
-
对ProfilePicture实体设置Manager角色(UserManagement模块内)权限:
2.1 新增用户
- 复制Administration模块中的NewAccount微流,在其基础上为账号添加关联的头像实体并保存。
- 微流权限设置为Manager
2.2 编辑用户
- 点击Edit按钮携带对应Account对象进入编辑页面,复用Administration模块中编辑用户页面Account_Edit,添加DataView展示ProfilePicture信息并提供图片上传功能。
- Account_Edit页面权限设置为Manager
2.3 删除用户
- 在ListView中的一行数据中添加Delete按钮,On Click选择Delete。
2.4 添加导航
3、个人账号页面
3.1 修改个人信息
-
对Account实体设置User角色(Administration模块内)设置权限:
-
对所有User
-
对于当前登录用户,可修改自身Account对象信息。Xpath约束:[id='[%CurrentUser%]']
-
-
在导航栏添加修改个人信息的入口:
-
复用Administration模块中ManageMyAccount微流。微流权限设置为Employee:
-
复用Administration模块中MyAccount页面,添加存放ProfilePicture对象的DataView组件用于修改头像。页面权限设置为Employee:
4、匿名用户
4.1 匿名用户浏览页面
-
开启匿名用户,为匿名用户分配角色:
-
创建为匿名用户提供的浏览页面,页面权限设置为Guest:
-
将默认主页设置为匿名用户访问页面,并为其他用户设置对应主页:
4.2 匿名用户注册
-
创建用于存放注册信息的实体Registration,由于暂时使用选择Persistable-No:
-
对Registration实体设置Guest角色(UserManagement模块内)权限:
-
设置登录页面:
-
创建用户注册微流及注册信息输入页面,微流及信息输入页面权限设置为Guest:
-
点击注册按钮,创建Registration实体,打开信息输入页面:
-
完成信息输入,点击Save保存,触发用户创建微流,其中验证输入信息,创建Account对象并存储用户信息,并创建关联ProfilePicture对象:
-
三、VacationManagement模块:
0、模块角色
- Manager
- Employee
1、Domain model
-
请假申请包含在VacationRequest实体中:
-
一个请假申请中的日期区间可拆分为一个个请假日对象(1对多关系),在请假日对象中可以设置每日请假时长:
-
VacationRequest请假申请实体关联Account用户实体,涉及申请者和审批者两个属性,设置两个不同关联:
2、申请者
2.1 Overview
-
创建页面,使用两个ListView组件,其中一个使用Xpath进行时间上的约束只展示未来的请假申请:
-
对VacationRequest设置Employee角色(VacationManagement模块内)权限:仅当该请假申请对应的申请者为当前用户时才可读可写,Xpath约束:[VacationManagement.VacationRequest_AccountRequestor='[%CurrentUser%]']
2.2 休假申请向导流程
-
创建向导页面:
-
Step1:
-
Step2:
-
Step3:
-
-
创建微流:
-
第一页输入请假起止日期、类型、描述信息等,点击Next触发Step1微流:
- 首先进行数据校验:日期非空,区间正确等
- 根据起止日期区间,拆分每日创建VacationRequestDay对象:循环创建对象、解决往返操作后对象的重复创建(删除无用对象、创建对象前检查是否已创建)、根据请假日是周几确定当日请假时长
-
第二页根据VacationRequest对象找到关联的VacationRequestDay对象并使用ListView展示,点击Next触发Step2微流:
- VacationRequest对象找到关联的VacationRequestDay对象列表,使用Aggregate List节点进行聚合统计总请假时长,并存储在VacationRequest实体字段中
-
第三页展示请假信息,用户确定后点击Submit提交触发Step3微流:
- 改变VacationRequest的状态字段,并为当前VacationRequest对象设置审批者关联对象,提交保存。
-
3、审批者
3.1 Overview
-
创建页面,使用Data Grid组件和数据源添加限制分页展示不同状态的请假申请。页面权限设置为Manager:
-
在Data Grid中添加Action按钮并设置为Default并绑定审批页面,使得双击一条数据时触发Action按钮并携带该条数据对象打开审批页面,页面权限设置为Manager:
-
对VacationRequest实体设置Manager角色(VacationManagement模块内)权限:可读,仅可修改请假申请的状态
3.2 通过or拒绝
- 在审批页面点击Approve或Reject按钮,触发审批通过或审批拒绝微流,微流中改变VacationRequest的状态并提交保存。微流权限设置为Manager。
四、Notification模块
0、模块角色
- Manager
- Employee
1、Domai model
-
创建Notification通知实体:
-
建立Notification与VacationRequest一对一关联,一个请假申请对应一个通知实体。建立Notification与Account一对多关联,一个通知实体既可以发给审批者也可以发给申请者:
2、页面内自定义菜单
-
分别建立两个页面用于显示未读新消息和已读消息,共用一个自定义菜单,选择选项打开对应页面:
3、新通知
-
使用Data Grid展示通知,数据源使用Xpath过滤选择属于当前用户且未读的通知:[not(Read) and Notification.Notification_Account = '[%CurrentUser%]']
-
标记已读:设置Data Grid中Default button打开编辑页面,选择Read触发微流改变当前Notification是否已读状态并保存刷新:
4、已读通知
- 使用Data Grid展示通知,数据源使用Xpath过滤选择属于当前用户且已读的通知:[Read and Notification.Notification_Account = '[%CurrentUser%]']