此次二次开发将从头开始记录,开发顺序会从多用户模块入手,解决默认显示首页,前后台登录分离等问题。
问题难点
- 默认首页的显示
- Shiro权限模块的多用户登录验证等,较为复杂
数据库表
本次使用的数据库为MySql,拓展数据库管理工具为Navicat。
在Jeesite搭建完成的基础上,首先从数据库表的建设开始,后台用户表已经有了,这里建立的是前台用户表,前后用户分离,参照后台用户表的字段信息,去掉了几个字段,且将Id主键修改为自增长的Int类型,不按照原始设定的UUID字符串,为了利用到自增长的排序功能。
前台用户表 front_user
配置文件
Jeesite中已经集成代码生成模块,即通过依赖注入(DI-Dependency Injection)的方式,构建相关Java类文件,自动生成简单的增删查改功能。
找到resources包下的jeesite.properties文件,简单设置以下几项,此次使用的mysql的配置。
- jdbc.type 数据库类型
- jdbc.driver 数据库驱动jar包
- jdbc.url 数据库链接
- jdbc.username 用户名
- jdbc.password 密码
- projectPath 该项为注释项,切换到Source模式去除注释后可显示,用于设置代码生成路径,指定为当前工程的所在物理路径
模块生成
使用代码生成(GEN)模块,业务表配置。
生成方案配置
点击“保存并生成代码”后,会自动生成相应的代码模块,如果发现工程中没有出现,请到实际的物理路径下寻找一下,看看是不是jeesite.properties的projectPath路径设置错了,如果实际的物理路径中有而工程目录中没有,请点击工程右键 -> Maven4MyEclipse -> Update Project,更新后会出现,如下图。
接着我们修改一下,将主键增长方式设置为自增长,打开FrontUserDao.xml,去掉insert方法中的id字段即可。(去掉即可将id增长方式从UUID转变为自增长,新手注意自动生成的UUID为字符串,在数据库字段中对应的varchar类型的,而自增长为int类型)
修改默认首页及前后台路径设置分析(标题位置暂定)
提示,输入以下几个地址尝试访问:
- http://localhost/项目名 (默认首页地址)
- http://localhost/项目名/a (后台管理首页地址)
- http://localhost/项目名/f (前台首页地址)
输入“http://localhost/项目名”,会直接跳转到项目工程的默认首页,一般在web.xml中设定对应的首页,但这里通过spring-mvc.xml的81行可见设置,默认首页映射到jeesite.properties的web.view.index属性中,所以,我们直接配置这个属性就可以完成默认首页的设置。
<!-- 定义无Controller的path<->view直接映射 -->
<mvc:view-controller path="/" view-name="redirect:${web.view.index}"/>
接下来,我们看一下原设定是什么,web.view.index属性原设定值为“/a”,“/a”是什么,它是“后台管理”路径的前缀路径,用来区分前后台的路径,我们在默认登录的时候会进入到“/a/login”的路径中,这个值“/a”对应的属性为jeesite.properties的“adminPath”,参照在controller层中类文件可见,映射路径@RequestMapping中必带“${adminPath}”参数,所以我们可以确定,凡是带了该参数的均为后台路径(jeesite.properties源代码模式下unicode编码已经有说明了)。
adminPath=/a
frontPath=/f
web.view.index=/a
所以实际的流程是这样的,通过输入“http://localhost/项目名”地址访问,会跳转到web.view.index设定的首页地址(这里以原设定“/a”为例),所以访问的实际地址为“http://localhost/项目名/a”,而这个地址对应的controller层方法是在“com.thinkgem.jeesite.modules.sys.web.LoginController”类文件中,对应的方法为“index”。
/**
* 登录成功,进入管理首页
*/
@RequiresPermissions("user")
@RequestMapping(value = "${adminPath}")
public String index(HttpServletRequest request, HttpServletResponse response) {
}
输入“http://localhost/项目名”或“http://localhost/项目名/a”会来到这个方法,但是打印输出发现并没有进来,而且最终地址为“http://localhost/项目名/a/login”,是因为在进入这个方法前要进行shiro权限校验,如果没通过是无法进入会跳转到指定的地址,参照对比spring-context-shiro.xml,即可发现。
<!-- Shiro权限过滤过滤器定义 -->
<bean name="shiroFilterChainDefinitions" class="java.lang.String">
<constructor-arg>
<value>
/test/** = anon
/static/** = anon
/userfiles/** = anon
${adminPath}/cas = cas
${adminPath}/login = authc
${adminPath}/logout = logout
${adminPath}/** = user
/act/editor/** = user
/ReportServer/** = user
</value>
</constructor-arg>
</bean>
<!-- 安全认证过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" /><!--
<property name="loginUrl" value="${cas.server.url}?service=${cas.project.url}${adminPath}/cas" /> -->
<property name="loginUrl" value="${adminPath}/login" />
<property name="successUrl" value="${adminPath}?login" />
<property name="filters">
<map>
<entry key="cas" value-ref="casFilter"/>
<entry key="authc" value-ref="formAuthenticationFilter"/>
</map>
</property>
<property name="filterChainDefinitions">
<ref bean="shiroFilterChainDefinitions"/>
</property>
</bean>
进入“index”方法需要“user”权限(进行shiro权限校验),否则会跳转到“loginUrl”对应的方法“${adminPath}/login”,即“http://localhost/项目名/a/login”,至此后台的登录流程大概解释清楚了。