一、项目简介
设计并实现一个企业后台管理系统,包括员工管理、员工权限管理、产品采购管理以及报表展示等功能,同时不同的员工拥有不同的权限,可操作的功能受到权限的限制
二、项目框架
SSJ:Spring + SpringMVC + SpringDataJpa
Spring
1、Spring
是一个开源的轻量级的Java开发框架
2、简化应用程序的开发
3、IOC
控制反转容器
4、aop
面向切面编程
5、di
注入
Spring项目部署:
创建类,然后放到SpringMVC.xml
的bean
中
SpringMVC执行流程
SpringDataJpa
JPA
:ORM(对象关系映射)规范,操作数据库变得更加简单,兼容各种数据库,开发效率极高!
Hibernate
:对JPA有最完美的实现!
SpringDataJPA
:是Spring
为JPA
又做了一层封装
优缺点:
开发更加简单与方便,随便hibernate
的性能的提高,以及Spring
的支持
性能差、运行效率低,适合性能要求不高,但开发时间要求较高的项目
三、项目中的技术点
1、模板技术Velocity
将JAVA代码从网页中分离出来,使得页面设计者可以专注于版面的设计,而JAVA程序员可以集中精力编写复杂的代码, 而且这种分离保护了系统,避免了有意或无意带来危险的代码。然后通过VelocityContext
将JAVA程序和Velocity
文本模板联系起来,用put()
方法将对象加入到VelocityContext
中,最后在文本模块以$字符开头加上用put()
方法设置的第一个参数指定的名字符号直接访问JAVA程序的对象
2、权限拦截器Shiro
执行流程:
1、在web.xml
中配置过滤器
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<async-supported>true</async-supported>
<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>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
2、通过反射在spring bean
工厂中获取id=“shiroFilter”的bean
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/login"/>
<property name="filters">
<util:map>
<entry key="authc" value-ref="formAuthenticationFilter"/>
<entry key="sysUser" value-ref="sysUserFilter"/>
</util:map>
</property>
<property name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/authenticated = authc
/** = user,sysUser
</value>
</property>
</bean>
3、securityManager
安全管理
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm"/> //自定义userRealm 权限用户认证
<property name="sessionManager" ref="sessionManager"/>//session管理
<property name="cacheManager" ref="cacheManager"/>//缓存管理
<property name="rememberMeManager" ref="rememberMeManager"/>//记住密码实现
</bean>
4、自定义userRealm
public class UserRealm extends AuthorizingRealm {
//俩方法自己实现
doGetAuthorizationInfo(PrincipalCollection principals);
doGetAuthenticationInfo(AuthenticationToken token);
}
3、带条件高级修改,高级删除功能的实现流程
1、创建公用查询抽象父类----实现排序和分页
public abstract class BaseQuery {
//当前页
private Integer currentPage = 1;
//每页条数
private Integer pageSize = 10;
//排序方式
private Boolean orderByType;
//排序字段
private String orderByName;
//抽取查询方法
//创建查询添加的对象方法,由子类实现
public abstract Specification createSpecification();
//拿到排序的数据
public Sort createSort(){
if(StringUtils.isNotBlank(orderByName)){
//有值就排序
return new Sort(Sort.Direction.valueOf(orderByType?"DESC":"ASC"),orderByName);
}
return null;
}
2、子类覆写查询的方法
@Override
public Specification createSpecification() {
return Specifications.<Employee>and()
.like(StringUtils.isNotBlank(username), "username","%"+username+"%")
.like(StringUtils.isNotBlank(email), "email","%"+email+"%")
.lt(age!=null, "age",age)
.eq(departmentId!=null,"department.id",departmentId)
.build();
}
3、在Service
层的公用Service
类实现查询
@Override
public List<T> queryAll(BaseQuery query) {
//1.获取到查询的规则
Specification spec = query.createSpecification();
//根据规则获取数据并返回
return baseRepository.findAll(spec);
}
4、实现不同用户登录后显示不同的菜单
1、在数据库中每个用户对应有不同的角色id,角色表中用户拥有各自的菜单路径
2、创建菜单类、权限类、角色类,使用多表查询,获得用户对应的菜单和权限
3、在页面显示该用户可用的菜单
5、poi操作Execl文件的流程
1、读取Excel文件
@Test
public void testReadExcel() throws Exception{
//1、获取文件
File inputFile = new File("员工信息.xlsx");
//2、将文件放到流中
FileInputStream inputStream = new FileInputStream(inputFile);
//3、读取该文件
Workbook workbook = new XSSFWorkbook(inputStream);
//4、获取到第一个sheet表
Sheet sheet = workbook.getSheetAt(0);
//5、拿到表的行
int rowNum = sheet.getLastRowNum();
for(int i=0;i<=rowNum;i++){
Row row = sheet.getRow(i);
//6、获取到行中每一列
short cellNum = row.getLastCellNum();
for(int j=0;j<cellNum;j++){
Cell cell = row.getCell(j);
System.out.print(cell+" ");
}
System.out.println();
}
}
2、输出Excel文件
@Test
public void test99Multiplication() throws Exception{
//1、创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//2、创建工作表
Sheet sheet = workbook.createSheet("九九乘法表");
//3、创建行
for(int i=1;i<=9;i++){
Row row = sheet.createRow(i-1);
//4、创建行中的列
for(int j=1;j<=i;j++){
Cell cell = row.createCell(j-1);
//5、格子添加数据
cell.setCellValue(i+" * "+j+" = "+i*j);
}
}
//从内存中写出来
FileOutputStream out = new FileOutputStream("九九乘法表.xlsx");
workbook.write(out);
out.close();
}
6、产品类型二级联动的流程
1、product
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "types_id")
private ProductType types;
2、productType 商品分类表中有父子级关系,应该自连接处理
//类型自连接
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private ProductType productType;
7、数据字典模型的作用
1、数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明。
2、数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序源数据的目录。主动数据字典是指在对数据库或应用程序结构进行修改时,其内容可以由DBMS自动更新的数据字典。
3、数据字典的主要作用:数据字典和数据流图共同构成系统的逻辑模型。没有流图数据字典难以发挥作用。没有数据字典,数据流图就不严格。
8、Highcharts
1、Highcharts
是一个非常流行,界面美观的纯Javascript
图表库。它主要包括两个部分:Highcharts
和Highstock
。
2、Highcharts可以为您的网站或Web应用程序提供直观,互动式的图表。目前支持线,样条,面积,areaspline
,柱形图,条形图,饼图和散点图类型。
3、Highstock
可以为您方便地建立股票或一般的时间轴图表。它包括先进的导航选项,预设的日期范围,日期选择器,滚动和平移等等。
9、采购订单处理流程
1、采购订单的处理包括订单表和订单详细表,功能包括增删改查,供应商、审核人、采购人等功能
2、订单类
@Entity
@Table(name = "purchasebill")
public class PurchaseBill extends BaseDomain {
private Date vdate;
private BigDecimal totalAmount;
private BigDecimal totalNum;
private Date inputTime=new Date();
private Date auditorTime;//审核时间
//0待审核、1已审核、-1作废
private Integer status = 0;
@ManyToOne(fetch = FetchType.LAZY,optional = false)
@JoinColumn(name = "supplier_id" )
private Supplier supplier;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "auditor_id")
private Employee auditor;
@ManyToOne(fetch = FetchType.LAZY,optional = false)
@JoinColumn(name = "inputUser_id")
private Employee inputUser;
@ManyToOne(fetch = FetchType.LAZY,optional = false)
@JoinColumn(name = "buyer_id")
private Employee buyer;
//级联Purchasebillitem
@OneToMany(cascade = CascadeType.ALL,mappedBy = "bill",fetch = FetchType.LAZY,orphanRemoval = true)
private List<PurchaseBillItem> list = new ArrayList<PurchaseBillItem>();
}
2、订单详细类
@Entity
@Table(name = "purchasebillitem")
public class PurchaseBillItem extends BaseDomain {
private BigDecimal price;
private BigDecimal num;
private BigDecimal amount;
private String descs;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "product_id")
private Product product;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
//忽略此属性
@JoinColumn(name = "bill_id")
@JsonIgnore
private PurchaseBill bill;
}
10、采购入库处理流程
1、采购计划或申请
2、采购订单
3、到货
4、入库
5、稽核
11、即时库存表有什么作用
保证用户可以看到真实的备货量,用户可以根据可提供的的量来下单,避免下错单或下多单,避免工作人员因确认订单而浪费更多时间
12、任务调度可以用在什么场景
定时任务调度:基于给定的时间点、给定的时间间隔、给定的执行次数自动执行的任务。
适用于高频次交易、定时交易、夜间定时任务等员工难以处理的任务
具有准确送达、执行的特点
13、Spring发送email
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class MailLetsGo {
@Autowired
MailSender mailSender;
@Test
public void testSendMail() throws Exception{
//创建邮件对象
SimpleMailMessage mailMessage = new SimpleMailMessage();
//发件人
mailMessage.setFrom("XXX@qq.com");
//收件人
String [] list ={"XXX@qq.com","XXX@qq.com","XXX@qq.com","XXX@qq.com"};
mailMessage.setTo(list);
//主题
mailMessage.setSubject("牛津书大学录取通知书");
//内容
mailMessage.setText("你是真滴牛皮,居然考上了我们学校");
//设置回件地址
mailMessage.setReplyTo("XXX@qq.com");
//发送
System.out.println(mailSender);
mailSender.send(mailMessage);
}
}