SSJ项目总结

一、项目简介

设计并实现一个企业后台管理系统,包括员工管理、员工权限管理、产品采购管理以及报表展示等功能,同时不同的员工拥有不同的权限,可操作的功能受到权限的限制

二、项目框架

SSJ:Spring + SpringMVC + SpringDataJpa

Spring
1、Spring是一个开源的轻量级的Java开发框架
2、简化应用程序的开发
3、IOC控制反转容器
4、aop面向切面编程
5、di注入
Spring项目部署:
创建类,然后放到SpringMVC.xmlbean

SpringMVC执行流程

在这里插入图片描述

SpringDataJpa
JPA:ORM(对象关系映射)规范,操作数据库变得更加简单,兼容各种数据库,开发效率极高!
Hibernate:对JPA有最完美的实现!
SpringDataJPA:是SpringJPA又做了一层封装

优缺点
开发更加简单与方便,随便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图表库。它主要包括两个部分:HighchartsHighstock
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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值