#デマンド
- ダイナミックなプレゼンテーションにホームメニューリスト
(上の別のユーザーがログインすると、メニューは同じではありません参照してください!)
#実装
サーバーの設計
- STEP01:デザイン
VO
オブジェクトは、SysUserMenuVo
()
@
のID、名前、URL:リソースを必要とします
--- 基于此对象,封装用户菜单信息(用户访问权限的菜单)
public class SysUserMenuVo implements 序列化接口{
UID....
private Integer id ;
private String name ;
private String url ;
private List<SysUserMenuVo> childs
}
- STEP02:デザイン
Dao
メソッドSysMenuDao.Dao.findUserMenus(Integer[] menuIds)
()
--- 基于指定菜单id - 查询登录用户的菜单信息
List<SysUserMenuVo> findUserMenus(@Param("menuIds") Integer[] menuIds) //@Param("menuIds")
難易度:レベル1のみのメニューをチェックし、メニューレベル2
<! 查询用户对应的菜单信息 >
<select id="findUserMenus" resultMap="sysUserMenuVo">
select p.id pi, p.name pname , p.url purl , c.id , c.name , c.url
from sys_menus p join sys_menus c
on c.parentId = p.id
<where> <!-- where 自动把and 去掉 -->
<foreach collection="array" separator="or" item="menuId">
(c.id=#(menuId))
</foreach>
and p.parentId is null
</where>
</select>
<resultMap type="com.cy.pj.sys.vo.SysUserMenuVo"
id="sysUserMenuVo">
<id property="id" column="pid" />
<result property="name" column="pname" />
<result property="url" column="purl" />
<collection property="childs" ofType="com.cy.pj.sys.vo.SysUserMenuVo">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="url" column="url" />
</collection>
</resultMap>
- STEP03:デザイン
Service
メソッドSysMenuService.findUserMenus(userid)
()
@Autowired
private SysUserRoleDao sysUserRoleDao ;
public List<SysUserMenuVo> findUserMenus(Integer userId) {
//1.参数校验
//2.获取用户对应的角色id
List<Integer> roleIds = SysUserRoleDao.findRoleIdsByUserId(userId);
//3.基于角色id获取对应菜单id并校验
List<Integer> menuIds = SysRoleMenuDao.findMenuIdsByRoleIds(roleIds.toArray(new Integer[])) ;
//4. 基于菜单id获取菜单信息
List<SysUserMenuVo> list = SysMenuDao.findUserMenus(menuIds.toArray(new Integer[]))
return list;
}
- step04:デザイン
Controller
メソッドPageController.doIndexUI(Model model)
()
public String doIndexUI(Model model ){
...
用model 传递 返回的信息
...
}
クライアントの設計
に基づいて、thymeleaf
プレゼンテーションのためのユーザーのタグメニュー情報でテンプレートエンジン
<li class="treeview" th:each="um:${userMenus}">
...
<span>
[[${um.name}]]
</span>
...
<ul class="treeview-menu">
<li th:each="c:${um.childs}">
<a th:onclick="javascript:doLoadUrl([[${c.url}]])">[[${c.name}]]</a>
</li>
</ul>
</li>
....
<script>
function doLoadUrl(url) {
$("#mainContentId").load(url);
}
</script>
(、許可された時間内にログインする他ありません)時間限定登録:第2位を要求
テクニカル分析:(AOP、インターセプタでSpring MVCの、フィルター)を達成するためのプログラム
ソリューション:春のMVCに基づいてはHandlerInterceptor内のオブジェクト
#実装
STEP01:書き込みTimeAccessInterceptor
クラス(実装HandlerInterceptor
インタフェース)
私たちのweb
パッケージが追加されます...
public class TimeAccessInterceptor implements HandlerInterceptor {
Spring MVC中的拦截器定义,基于此对象实现对登录操作的时间访问限制
DispatcherServlet --> TimeAccessInterceptor --> XxxController
(Handler)
此方法会在后端控制方法执行前执行
↓
@Override
public boolean preHandle( ... ) throws Exception {
1.定义允许访问的时间范围
Calendar c = Calendar.getInstance() ; //日历对象
c.set(Calendar.HOUR_OF_DAY , 9) ;
c.set(Calendar.MINUTE , 0 ) ;
c.set(Calendar.SECOND , 0 );
long start = c.getTimeInMillis() ; // 起始访问时间
c.set(Calendar.HOUR_OF_DAY , 16) ;
long end = c.getTimeInMillis() ;
2.获取当前进行业务判定
long currentTime = System.currentTimeMills() ;
if(start < currentTime && end > currentTime ) {
return true ; //false 表示拒绝对后面的 Handler(Controller)的执行,true表示放行
}
throw new ServiceException("请在固定时间登录");
}
}
STEP02:コンフィギュレーション・TimeAccessInterceptor
オブジェクト(定義されたSpringWebConfig
コンフィギュレーションクラス、このクラスで構成されています)
@Configuration
public class SpringWebConfig implements WebMvcConfigurer { /* 提供了一些web注册方法 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TimeAccessInterceptor())
.addPathPatterns("/user/doLogin"); //设置
}
}