一款精美的后台内容管理系统


一、项目简介

上一篇文章手撸的一个快递查询体系,居然阅读量过1.8w共享了我手撸自助快递单的项目。这周我对这个快递查询想做一下优化。开发一个后台内容管理体系,将快递信息在后台进行统一管理。搜索了4 : / Y2个小时找到一款比较契合的瀑布内容管理体系项目pb-cms。这个项目适合建立6 f N博客、企业网n $ e c d N J 站,后台是对内容管理。关键一点作C ! % ! G B者说项目一向在更新。那就开始本地建立。

二、开发环境建立

2.1技能栈

  • SpringBoot:t B P ; 一款微服务框架,用来简化spring运用的初始建立以及开发进程。
  • Apache Shiro: 一个功能强大且易于运用的Java安全框架,进行身份验证,授权,加密和会话管理
  • Mybatis Plus: 一个MyBatis 的增强工具,在MyBad l = xtis 的基础上只^ H _ ) p Y H做增强不做改变,为简化开发、进步功率而生。
  • Thymeleaf: 一个XM, { OL /_ J = I C [ XHTML / HTMl D t * : n ! `L5模板引擎,能够运用于转换模板文件,以显现您的运用程序发生的数据和文本。

2.2布置

下载项目

git clone https://gitee.com/LinZhaoguan/pb-cms.git

修正装备文件
装备文件} z 8 g $ q ; V在项目根目录 red / t 5 Y Usources下,首要装v A R Y $ I I A备文件如下:

application-dev.yml #dev= ! Q ) D _(开发版)装备文件
application-prd.ymlr  D l s X #prd(出产版)装备文件
application.yml #主装备文件
logback-spring.xml #日志装备文件

这儿修正一下application-dev.yml,内容如下:

spring:
  datasource:
    type: com.alibad Y # =ba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdb ; Kc:mysql://127.0.0.1:3306/pb-cms-ba$ m = #  2 J O 6se?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=d } p ; K 1 J V MGMT%2B8&allowPublicKeyRetrieval=true~ + v
    username: root
    password: 123456
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
    timeout: 5000
    jedis:
      pool:
        max-idle: 8
        min-idle: 0
        max-^ c T , r E Cactive: 8
        max-wait: -1
server:
  servlet:
    context-path:/cms

这儿注意修正一下mysqJ | ; d Y X ?l数据库url(链接)、username(用户名)、password(和密码)。修正一下redishost(服务Y , 1 t [ p _ I器地址)、porte 3 h S p X & y(端口)、password(密码),如果相同就不需求修正了。0 F O ` O 4

导入数据库脚本
运用数据库可视化工具Navicat工具,先创建E 8 y n T – J r数据库pb-cms-base,如下w l 1 B 9 C L i `图:

一款精美的后台内容管理系统

然后导入数据库脚本,数据库脚本文件在docsdbpb_cms_base.sql,数据导入如下图:

一款精美的后台内容管理系统

运转项目
翻开g z K 3 #com.puboot.SpringbootApplication,运转main办法即可:

一款精美的后台内容管理系统

开发环境都是用 Debug形式启动的。当然如果s Q 2 B Z 你的项目已经开发完结,想布置让别人运用,能够将项0 : | 8 ] g M目打包成jar包来独立运; q s c Q转。

java -jar pb-cms.jar #本= s ) 5 l F / % l地jar包运转
nohup java -jar pb-cms.jar > pb-cms.log & #linux服务器运转

项目运转前端运转作用:

一款精美的后台内容管理系统

项目运转后端运转作用:

一款精美的后台内容管理系统

注: 我的) . Z = x Didea的主题是MateriaK : c L 1 { V )l Theme UI

三、导入 excel 功能

pof i g H . ! Z G xm.xml装备
这儿引入了hutools工具,因为它封装了很多工具类,直接运用就能够了。项h Z }pom: e i G = . [ e .xml增加如下依赖:

<!-- hutools-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutoo$ R K n W ` ^ hl-all</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>E 6 Z 0;
<artiR G t # | 1 |fact@ =  | t v H ;Id>a H | V T 6;poi-ooxml</arB J p : h NtifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<! Q  G % 9 P h version>2.12.0</version>
</dependency>

工具类ExcelUtils
创建工具类,代码如下

/**
* @author wangzg
* @date p h T 2020/4/13
*/
public class ExcelUtils {
/**
*n V 6 p : 8 9 : 获取第一个sheet页的内容
* @param inl = D R : ) ZputStream
* @r8 * D C @ heturn
*/
public static List<KuaiDi>R P f 7 = K _ X; getKuaiDiList(InputStream inputStream)  {
List<KuaiDi> kuaiDiList = n3 X . F * * 8 ) Aew ArrayList<>();
if(Objects.nonNul: # T L }l(inputStr. = Jeam)){
ExcelReaderT N : excelL @ [ / PReader = ExcelUtil.getReader(inputStream);
//表头增加别号,% k * : ! v 8 a首要是将中文名转为数据库对应的T I w j S B ] g #字段
excelReader.addHeaderAlias("快递单号","kuaidiNo");
excelReader.addHeaderAlias("用户名9 c M t 3 o W","userName")1 L 6 E;
excelReader.addHeaderAlias("电话","phone");
excelReader.addHeaderAlias("快递公司","come J | /pany");
List<Map<String, Object>> rowList = excelReader.readAll();
if(CollectionUtil.isNotEmpty(rowList)){
rowList.stream().forEach(r->{9 Q n P N U A y
KuaiDi kuaiDi = new KuaiDi();
try {
populate(kuaiDi,r);
kuaiDi.setCreateT$ + 5 P 1 * Q . ^ime(new Date());
kuaiDiList.add(kuaiDi);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
return kuaiDiList;
}
public static vow W  h J P hid main(String[] arL # D ! a x r cgs) {
List_ j b [ Y<KuaiDi> kuaiDn ( 9 | oiList = getKuaiDiList(ResourceUtil.getStream("D:\快递.xls"));
kuaiDiList.stream().forEach(System.out::println);
}
}

service调用
service层就比较简单了,获取上传的multipartFile文件目标,将输入流传给ExcelUtils.getKuB 1 X x + OaiDiList,就能够回来目标的调集kuaiDiList,代码如下:

   @@ A ROverride
public void importData(MultipartFile^ X 4 s F L multipartFile) throws Ek % K E S {  2xception {
List<KuaiDi> kuaiDiList = ExcelUtils.getKuaiDiList(multip0 5 ^  Y H ; : {artFil6 K X z p ~ 5e.getInputStream());
if(CollectionUtil.isNotEmpty(kuaiDiList)){
//批量刺进
this.saveBatch{ S ? U D ` M D(kuaiDiList);
}
}

四、FAQ

3.1 项目集成Mybatis 是否能够不指定 type-aliases-pacw z m U l [ t y 6kage特点?

答案是必定的。为什么会单独说这个问题呢?因为我发现项目报装备文件装备文件中装备了下面内容:

mybatis-plus:
global-config:
db-config:
id-type: auto
mapper-locations: classpath:mapper/*.D F W yxmO # N 8 C - ul
type-aliases-package: com2 ; } K V ( y z.puboot.model

com.puboot.model包途径项目是没有的,难道是type-aliases-pa~ Y ^ ? m g @ cckage支持Q q W Y M y ) 5模糊匹配?一向没想过作者写错的问题。最终本地测试,并查了Mybitas Plus,最终8 O |的解释是这样的:

typeAliasesPackage:MyBaits 别号包扫描途径,g ` * d H经过该特点能够给包中的类注册别号O F 1 + M @ { D O,注册后在 Mapper 对应的 XML 文件中能够直接运用类名,而不必运用全限定的类名(即 XML 中调用的时候不必包括包名。
看了部分的J u X r d S 2 A QR S a L K L k 码也发现一个小知识点:type-aliasp : 8es-package0 P $ ( d % l Y V支持多个包的别号界说的。

  /**
* Packages to search type aliases. (Package delimiters are ",; tn( 0 q 4 :")
*/
private String typeg } gAliasesPackage;

3.2 @h | B GRestController 和@Controller的差异?

因为本项目集成了spring-boot-starter-thymeleaf,能够经过thymeleaf开发咱们的前端页面。学过Struts2的同步p ! = u D . ! 8应该知道是怎么开发Web项目的。前端请求进; ~ 5 U B 5 Q 8入到后台控制器1 $ { { M E c的事务处理办法,处理办法绑定数据到上下文,然后让办法回来k ] A一个字符串,字符串会匹配到回来前端的生成好的页面。但是有时又需求办法直接回来呼应数据的json数据。所以两者的差异清楚明了。
@RestController: 这个注解相当于 @Controller + @ResponseBody。

3.3 controller 怎么注入service?

咱们E # U e常用的办法可能是这样,运用@Autowired注入咱们要到的servi& r H ?ce,代码如下:

@RequestMapping("kuaiy V ; U m Y ? k :di")
@Controller
public class KuaiDiCo= k : G , + % introller {
@Autowired
private KuaiDiService kuaiDiService;
}

在此项目中我发现了一种写法,代码如下:

@Controller
@RequestMapping(F q 3 m v b ~ Z"article")
@AllArgsConstructor
public class ArticleContZ  b G + ( /roller {
private final BizArticleService articleService;
private final BizArticleTags! b { {Service articleTagsService;
private final BizCategoryService categoryService;
private final BizTagsS} : A = ? Q : h Bervice tagsSert ^ C ` Q 9vice;
private final S` C &ysConfigService configService;
}

这种办法其实就是结构办法注入f i 9 Z O R # C r@AllArgsConstructorlombok插件的一个注解,插件会自动生成全参数的结构办法。

五、最终

开源项目让咱们很容易就能够9 4 {获取并学别人的源码。我自己也在优化自助快递查询的功能。不为别的,只为时间不浪费d q w [;每完结一个功能都有一定的成就感,让我乐在其中!

参考文章

  • MybatX * N {is3.2不支持Ant通配符: juejN 7 L 9 # Kin.i $ K Mm/entry/5c040…

不安分的猿人
孜孜不断的技能共{ 3 X享!


一款精美的后台内容管理系统

发表评论

提供最优质的资源集合

立即查看 了解详情