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

优采云 发布时间: 2022-05-07 20:36

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

  三、导入 excel 功能

  四、FAQ

  五、最后

  参考文章

  一、项目简介

  上一篇文章分享了我手撸自助快递单的项目。这周我对这个快递查询想做一下优化。开发一个后台内容管理系统,将快递信息在后台进行统一管理。搜寻了2个小时找到一款比较契合的瀑布内容管理系统项目pb-cms。这个项目适合搭建博客、企业网站,后台是对内容管理。关键一点作者说项目一直在更新。那就开始本地搭建。

  二、开发环境搭建2.1技术栈2.2部署

  下载项目

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

  修改配置文件

  配置文件在项目根目录 resources下,主要配置文件如下:

  application-dev.yml #dev(开发版)配置文件<br />application-prd.yml #prd(生产版)配置文件<br />application.yml #主配置文件<br />logback-spring.xml #日志配置文件<br />

  这里修改一下application-dev.yml,内容如下:

  spring:<br />  datasource:<br />    type: com.alibaba.druid.pool.DruidDataSource<br />    driverClassName: com.mysql.cj.jdbc.Driver<br />    url: jdbc:mysql://127.0.0.1:3306/pb-cms-base?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true<br />    username: root<br />    password: 123456<br />  redis:<br />    host: 127.0.0.1<br />    port: 6379<br />    password: 123456<br />    timeout: 5000<br />    jedis:<br />      pool:<br />        max-idle: 8<br />        min-idle: 0<br />        max-active: 8<br />        max-wait: -1<br />server:<br />  servlet:<br />    context-path:/cms<br />

  这里注意修改一下mysql数据库url(链接)、username(用户名)、password(和密码)。修改一下redis的host(服务器地址)、port(端口)、password(密码),如果相同就不需要修改了。

  导入数据库脚本

  使用数据库可视化工具Navicat工具,先创建数据库pb-cms-base,如下图:

  

  然后导入数据库脚本,数据库脚本文件在docs\db\pb_cms_base.sql,数据导入如下图:

  

  运行项目

  打开SpringbootApplication,运行main方法即可:

  

  开发环境都是用 Debug模式启动的。当然如果你的项目已经开发完成,想部署让他人使用,可以将项目打包成jar包来独立运行。

  java -jar pb-cms.jar #本地jar包运行<br />nohup java -jar pb-cms.jar > pb-cms.log & #linux服务器运行<br />

  项目运行前端运行效果:

  

  项目运行后端运行效果:

  

  注: 我的idea的主题是Material Theme UI。

  三、导入 excel 功能

  pom.xml配置

  这里引入了hutools工具,因为它封装了很多工具类,直接使用就可以了。项目pom.xml添加如下依赖:

  <br /><br />    cn.hutool<br />    hutool-all<br />    5.3.0<br /><br /><br />    org.apache.poi<br />    poi-ooxml<br />    4.1.2<br /><br /><br />    xerces<br />    xercesImpl<br />    2.12.0<br /><br />

  工具类ExcelUtils

  创建工具类,代码如下

  /**<br /> * @author wangzg<br /> * @date 2020/4/13<br /> */<br />public class ExcelUtils {<br /><br />    /**<br />     * 获取第一个sheet页的内容<br />     * @param inputStream<br />     * @return<br />     */<br />    public static List getKuaiDiList(InputStream inputStream)  {<br />        List kuaiDiList = new ArrayList();<br />        if(Objects.nonNull(inputStream)){<br />            ExcelReader excelReader = ExcelUtil.getReader(inputStream);<br />            //表头添加别名,主要是将中文名转为数据库对应的字段<br />            excelReader.addHeaderAlias("快递单号","kuaidiNo");<br />            excelReader.addHeaderAlias("用户名","userName");<br />            excelReader.addHeaderAlias("电话","phone");<br />            excelReader.addHeaderAlias("快递公司","company");<br />            List rowList = excelReader.readAll();<br />            if(CollectionUtil.isNotEmpty(rowList)){<br />                rowList.stream().forEach(r->{<br />                    KuaiDi kuaiDi = new KuaiDi();<br />                    try {<br />                        populate(kuaiDi,r);<br />                        kuaiDi.setCreateTime(new Date());<br />                        kuaiDiList.add(kuaiDi);<br />                    } catch (Exception e) {<br />                        e.printStackTrace();<br />                    }<br />                });<br />            }<br />        }<br />        return kuaiDiList;<br />    }<br /><br />    public static void main(String[] args) {<br />        List kuaiDiList = getKuaiDiList(ResourceUtil.getStream("D:\\快递.xls"));<br />        kuaiDiList.stream().forEach(System.out::println);<br />    }<br />}<br />

  service调用

  service层就比较简单了,获取上传的multipartFile文件对象,将输入流传给ExcelUtils.getKuaiDiList,就可以返回对象的集合kuaiDiList,代码如下:

     @Override<br />    public void importData(MultipartFile multipartFile) throws Exception {<br />        List kuaiDiList = ExcelUtils.getKuaiDiList(multipartFile.getInputStream());<br />        if(CollectionUtil.isNotEmpty(kuaiDiList)){<br />            //批量插入<br />            this.saveBatch(kuaiDiList);<br />        }<br />    }<br />

  四、FAQ3.1 项目集成Mybatis 是否可以不指定 type-aliases-package属性?

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

  mybatis-plus:<br /> global-config:<br /> db-config:<br /> id-type: auto<br /> mapper-locations: classpath:mapper/*.xml<br /> type-aliases-package: com.puboot.model<br />

  com.puboot.model包路径项目是没有的,难道是type-aliases-package支持模糊匹配?一直没想过作者写错的问题。最后本地测试,并查了Mybitas Plus,最终的解释是这样的:

  “

  typeAliasesPackage:MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名。看了部分的源码也发现一个小知识点:type-aliases-package是支持多个包的别名定义的。

    /**<br />   * Packages to search type aliases. (Package delimiters are ",; \t\n")<br />   */<br />  private String typeAliasesPackage;<br />

  3.2 @RestController 和@Controller的区别?

  因为本项目集成了spring-boot-starter-thymeleaf,可以通过thymeleaf开发我们的前端页面。学过Struts2的同步应该知道是怎么开发Web项目的。前端请求进入到后台控制器的业务处理方法,处理方法绑定数据到上下文,然后让方法返回一个字符串,字符串会匹配到返回前端的生成好的页面。但是有时又需要方法直接返回响应数据的json数据。所以两者的区别显而易见。

  @RestController: 这个注解相当于 @Controller + @ResponseBody。

  3.3 controller 如何注入service?

  我们常用的方式可能是这样,使用@Autowired注入我们要到的service,代码如下:

  @RequestMapping("kuaidi")<br />@Controller<br />public class KuaiDiController {<br /><br />    @Autowired<br />    private KuaiDiService kuaiDiService;<br />}<br />

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

  @Controller<br />@RequestMapping("article")<br />@AllArgsConstructor<br />public class ArticleController {<br /><br />    private final BizArticleService articleService;<br />    private final BizArticleTagsService articleTagsService;<br />    private final BizCategoryService categoryService;<br />    private final BizTagsService tagsService;<br />    private final SysConfigService configService;<br />}<br />

  这种方式其实就是构造方法注入,@AllArgsConstructor是lombok插件的一个注解,插件会自动生成全参数的构造方法。

  五、最后

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

  参考文章

  我的微信

  

  

  觉得小编吹水的,点个在看哈

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线