cms 网站后台内容管理系统模板(我手撸自助快递单导入excel功能四、五五)
优采云 发布时间: 2021-12-16 11:39cms 网站后台内容管理系统模板(我手撸自助快递单导入excel功能四、五五)
三、导入excel功能四、FAQ五、最后参考文章一、项目介绍
上一篇文章分享了我的自助快递单项目。本周我想优化这个快速查询。开发后台内容管理系统,统一管理后台快递信息。搜索了2个小时,找到了一个比较合适的瀑布式内容管理系统项目pb-cms。本项目适用于搭建博客和企业网站,后台为内容管理。关键是作者说项目已经更新了。然后在本地开始构建。
二、开发环境搭建2.1技术栈2.2部署
下载项目
git clone https://gitee.com/LinZhaoguan/pb-cms.git
修改配置文件配置文件在项目根目录resources下,主要配置文件如下:
application-dev.yml #dev(开发版)配置文件
application-prd.yml #prd(生产版)配置文件
application.yml #主配置文件
logback-spring.xml #日志配置文件
在这里修改application-dev.yml,内容如下:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/pb-cms-base?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
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-active: 8
max-wait: -1
server:
servlet:
context-path:/cms
这里注意修改mysql数据库的url(链接)、username(用户名)、password(和密码)。修改redis的主机(服务器地址)、端口(端口)、密码(密码)。如果它们相同,则无需修改它们。
使用数据库可视化工具Navicat工具导入数据库脚本,首先创建数据库pb-cms-base,如下图:
然后导入数据库脚本,数据库脚本文件在docs\db\pb_cms_base.sql,导入数据如下图:
运行项目打开SpringbootApplication,运行main方法:
开发环境以调试模式启动。当然,如果你的项目已经开发完成,想部署给别人使用,可以将项目打包成jar包,独立运行。
java -jar pb-cms.jar #本地jar包运行
nohup java -jar pb-cms.jar > pb-cms.log & #linux服务器运行
项目运营的前端运营效果:
项目运行后端运行效果:
注意:我的想法的主题是Material Theme UI。
三、导入excel功能
pom.xml配置引入了hutools工具,因为它封装了很多工具类,所以可以直接使用。在项目 pom.xml 中添加以下依赖项:
cn.hutool
hutool-all
5.3.0
org.apache.poi
poi-ooxml
4.1.2
xerces
xercesImpl
2.12.0
工具类 ExcelUtils 创建工具类,代码如下
/**
* @author wangzg
* @date 2020/4/13
*/
public class ExcelUtils {
/**
* 获取第一个sheet页的内容
* @param inputStream
* @return
*/
public static List getKuaiDiList(InputStream inputStream) {
List kuaiDiList = new ArrayList();
if(Objects.nonNull(inputStream)){
ExcelReader excelReader = ExcelUtil.getReader(inputStream);
//表头添加别名,主要是将中文名转为数据库对应的字段
excelReader.addHeaderAlias("快递单号","kuaidiNo");
excelReader.addHeaderAlias("用户名","userName");
excelReader.addHeaderAlias("电话","phone");
excelReader.addHeaderAlias("快递公司","company");
List rowList = excelReader.readAll();
if(CollectionUtil.isNotEmpty(rowList)){
rowList.stream().forEach(r->{
KuaiDi kuaiDi = new KuaiDi();
try {
populate(kuaiDi,r);
kuaiDi.setCreateTime(new Date());
kuaiDiList.add(kuaiDi);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
return kuaiDiList;
}
public static void main(String[] args) {
List kuaiDiList = getKuaiDiList(ResourceUtil.getStream("D:\\快递.xls"));
kuaiDiList.stream().forEach(System.out::println);
}
}
service调用service层比较简单。获取上传的multipartFile文件对象,将输入传给ExcelUtils.getKuaiDiList,即可返回对象集合kuaiDiList。代码如下:
@Override
public void importData(MultipartFile multipartFile) throws Exception {
List kuaiDiList = ExcelUtils.getKuaiDiList(multipartFile.getInputStream());
if(CollectionUtil.isNotEmpty(kuaiDiList)){
//批量插入
this.saveBatch(kuaiDiList);
}
}
四、FAQ3.1 项目可以不指定type-aliases-package属性来集成Mybatis吗?
答案是肯定的。你为什么单独谈这个问题?因为我发现在项目报告配置文件配置文件中配置了如下内容:
mybatis-plus:
global-config:
db-config:
id-type: auto
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.puboot.model
com.puboot.model 没有包路径项。类型别名包是否支持模糊匹配?我从来没有想过作者写错了。最后,我在本地测试并检查了Mybitas Plus。最后的解释是这样的:
》TypeAliasesPackage:MyBaits别名包扫描路径,通过该属性可以为包中的类注册别名,注册后可以直接在Mapper对应的XML文件中使用类名,而不是使用全限定类名(也就是不需要收录包名,看了部分源码,发现了一个小知识点:type-aliases-package支持定义多个包的别名。
/**
* Packages to search type aliases. (Package delimiters are ",; \t\n")
*/
private String typeAliasesPackage;
3.2 @RestController 和@Controller 的区别?
因为这个项目集成了spring-boot-starter-thymeleaf,所以我们可以通过thymeleaf来开发我们的前端页面。学过Struts2同步应该知道怎么开发Web项目了。前端请求进入后端控制器的业务处理方法,处理方法将数据绑定到上下文,然后该方法返回一个字符串,该字符串将匹配返回给前端的生成页面。但是有时候你需要一个方法来直接返回响应数据的json数据。所以两者的区别是很明显的。@RestController:这个注解相当于@Controller + @ResponseBody。
3.3 控制器如何注入服务?
我们通常的方式可能是这样,使用@Autowired注入我们想要的服务,代码如下:
@RequestMapping("kuaidi")
@Controller
public class KuaiDiController {
@Autowired
private KuaiDiService kuaiDiService;
}
在这个项目中,我找到了一种写法,代码如下:
@Controller
@RequestMapping("article")
@AllArgsConstructor
public class ArticleController {
private final BizArticleService articleService;
private final BizArticleTagsService articleTagsService;
private final BizCategoryService categoryService;
private final BizTagsService tagsService;
private final SysConfigService configService;
}
这个方法其实就是构造方法注入。@AllArgsConstructor 是lombok 插件的注解,插件会自动生成全参数构造方法。
五、终于
开源项目让我们很容易获取和学习其他人的源代码。我也在优化自助快递查询功能。没有别的,只是为了不浪费时间;每次完成一个功能,都有一定的成就感,让我乐在其中!
参考文章