背景篇
应一个挖掘机销售公司的要求,对该公司的采购,销售等业务开发一个方便管理的后台系统,周期三个月。
项目经理安排我实现权限与采购部分。
业务篇
采购
1.根据库存数量,库存部门向采购提出采购请求。
2.采购员根据需要补充的货物,找供应商,询问价格,获取到货时间。
3.根据各个供应商提供的价格,找部门领导审核,审核通过,等待财务拨款,向供应商订货。
4.供应商开始准备商品,提供一张发货单
5根据发货单,就接受货物,入库
权限
后台篇
整个项目使用Spring+SpringMVC+SpringDataJPA+EasyUI完成。
权限
权限的地方我们使用的是Shiro
导入Jar
<!-- shiro的支持包 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.4.0</version>
<type>pom</type>
</dependency>
<!-- shiro与Spring的集成包 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
自定义Realm一般直接继承AuthorizingRealm接口即可(里面包含身份认证与授权两个方法)
/**
* 自定义一个Realm
*/
public class MyRealm extends AuthorizingRealm {
//获取到这个Realm的名称(随便取)
@Override
public String getName() {
return "MyRealm";
}
//进行授权判断(权限)
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
//进行身份认证(登录)
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
return null;
}
}
在web.xml中配置
<!-- Spring与shiro集成:需要定义一个shiro过滤器(这是一个代理过滤器,它会到spring的配置中找一个名称相同的真实过滤器) -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring+Shiro配置
<!-- securityManager:Spring创建核心对象 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>
<!-- 建议大家把它留着,它可以支持我们做注解权限判断 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!--如果你没有登录,就会进入这个页面-->
<property name="loginUrl" value="/login"/>
<!--如果登录成功,就会进入这个页面-->
<property name="successUrl" value="/s/main.jsp"/>
<!--如果没有权限,就会进入这个页面-->
<property name="unauthorizedUrl" value="/s/unauthorized.jsp"/>
<property name="filterChainDefinitions">
<value>
/s/login.jsp = anon
/** = authc
</value>
</property>
</bean>
采购
- 整体和部分,整体和部分不能分割,本质还是双向一对多
- 一方(主表):
@OneToMany(cascade = CascadeType.ALL, mappedBy = "bill", fetch = FetchType.LAZY, orphanRemoval = true)
private List<purchasebillitem> items = new ArrayList<purchasebillitem>();
cascade = CascadeType.ALL级联操作最全
mappedBy = "bill"一方放弃管理多方,多方的外键字段bill_id,一方不管
orphanRemoval = true如果在一方解除了和多方的关系,一方是可以删除掉多方
- 多方(从表)billitem:bill_id配置为非空
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "bill_id")
private Purchasebill bill;// 组合关系,非空
- 页面管理:一方和多方同时管理
后续篇
第一次和团队参与项目开发,中间有很多小问题,但在团队的帮助下,都顺利解决。
虽然还有很多的不足,但我会努力提升。