"それを移動する" - CRUD実践その8を - [拡張] - 動的メニュー - 60

#デマンド

  • ダイナミックなプレゼンテーションにホームメニューリスト
    (上の別のユーザーがログインすると、メニューは同じではありません参照してください!)

#実装

サーバーの設計

  • 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"); //设置
	}

}


公開された296元の記事 ウォン称賛61 ビュー7091

おすすめ

転載: blog.csdn.net/LawssssCat/article/details/104040190