起因:不知道为啥,网上的门户系统大多数是 php 做的,如 wordpress 系统很臃肿,作为个人门户很多模块并没有啥用。用过一段时间,可以自己修改里面的
css 或者做主题。但是感觉想要深度定制差不多可以推翻整个系统了。后面用过一阵子基于 Nodejs 的轻量级门户 Hexo ,支持
MarkDown 格式,方便。不好的地方在于没有一个统一个后台系统,不同地点编辑的文章同步只能基于 GitHub。
也不知道是因为大家觉得 Java 做门户系统是太麻烦,还是大家觉得 Java 的性能问题,网上搜出来的很少是用 Java 做的。正好最近在用 SpringBoot + SpringSecurity 所以就当作练习来写。
SpringBoot+Maven
的组合感觉搭建系统架构也并不耗时。这里的一个坑就是不同版本的 SpringBoot-Starter 版本对应不同版本的
Maven-Plugin 支持不同,可以先不做只指定 Starter 的版本,让 SpringBoot 自己跟 Maven 商量
Maven-Plugin 的依赖包的版本,如果编译时出现莫名其妙的错误可以排查一下这个点。
以下项目结构
项目里的 favicon 用的时 png 格式而不是常见的 ico 格式,原因是 ico 的图在我目前使用的最新版本的 Chrome 和 Firefox 里都显示不出来,不管是16*16,32*32,还是64*64.而png可以在这两个浏览器很好的显示,所以也就不去排查到底是图片转换格式问题还是什么原因了,总之是缓存清理很多次,F12 ico 图片下载返回也是200就是显示不正常 。
SpringBoot的项目结构有一个点,就是最好把启动类设置为顶级包里面。否则后续的 Spring 对包的扫描会出错。
以下是 pom.xml 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zz</groupId> <artifactId>myblog</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> </parent> <name>myblog</name> <url>http://maven.apache.org</url> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <defaultGoal>compile</defaultGoal> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/webapp</directory> <targetPath>META-INF/resources</targetPath> <includes> <include>**/*.*</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*.*</include> </includes> <excludes> <exclude>static/fonts/**</exclude> </excludes> </resource> </resources> </build> <repositories> <repository> <id>spring-releases</id> <name>Spring Releases</name> <url>https://repo.spring.io/libs-release</url> </repository> <repository> <id>cksource-mvn-repo</id> <name>CKSource Maven Repository</name> <url>https://maven.cksource.com/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <name>Spring Releases</name> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> <dependencies> <!-- 添加热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>true</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> </dependency> <dependency> <groupId>com.cksource</groupId> <artifactId>ckfinder3</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2.1-b03</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project>
可以看出使用的工具和插件有
- 项目架构 SpringBoot,
- 系统安全控制 SpringSecurity,
- 页面模板 Freemarker
- 数据库 Mybatis,
- 日志工具 log4j2,
- 以及文件上传模块
项目的配置文件 application.properties
server.error.path=/error/server.error.whitelabel.enabled=falseserver.use-forward-headers=true server.address=127.0.0.1server.tomcat.remote-ip-header=x-forwarded-forserver.tomcat.protocol-header=x-forwarded-protoserver.tomcat.port-header=X-Forwarded-Port spring.mvc.static-path-pattern=/satic/**#spring.resources.static-locations=classpath:/static/,classpath:/templates/ mybatis.type-aliases-package=com.zz.myblog.dao spring.datasource.url=jdbc:mysql://ip地址/myblogspring.datasource.username=数据库用户名spring.datasource.password=数据库密码spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #freemarker 配置spring.freemarker.cache=truespring.freemarker.charset=UTF-8spring.freemarker.suffix=.ftlspring.freemarker.template-loader-path=classpath:/templatesspring.freemarker.content-type=text/html;charset=utf-8 web.upload.path = d:/upload #web.upload.path=/usr/upload
主要是配置了 Freemarker 和数据库链接信息,这里数据库是在购买的远程服务器上安装的 mysql 并设计表结构。
门户后台系统主要涉及到一个文章编辑器,最终定位在找一个现成好用的,网上呼声很高的一个ckeditor,但是这个东西后续很坑就是好用的图片编辑上传以及浏览是需要花钱的,想要不花钱就的自己实现这部分功能。而所有它需要花钱的模块都跟免费的部分集成在一起。最终我选择的是后面自己实现图片浏览和上传。
整个系统的ui都是bootstrap4,图标包括favicon用的是阿里的哪个图标库,除了这个导航菜单鼠标移上去下滑线效果是自己加的CSS
系统通过用户名密码登陆以后的后台主要有4个部分 文章统计,文章管理,个人信息设置,系统设置。如下
Home 部分文章统计信息用 echarts 做了一下近三个月的统计,SQL语句是用的
@Select("SELECT COUNT(article_date) as article_nums,article_date FROM blog_articles WHERE uid =#{uid} and article_date>DATE_SUB(CURDATE(), INTERVAL 3 MONTH) GROUP BY article_date") List<Map<String,Object>> getChartsDataById(Integer uid);
文章列表部分一个坑就是翻页的判断自己写的 js,没找到好用的插件。然后分页查询的部分用的是
@Select("SELECT * FROM blog_articles WHERE article_id >= (SELECT article_id FROM blog_articles LIMIT #{start_id}, 1) LIMIT 5") @Results({ @Result(property="editor_data",column="article_content"), @Result(property="article_cat",column="article_category") }) List<ArticleData> getArticles(@Param("start_id") int start_id);
因为考虑说加入用户多时间久堆积的文章数据很多的时候 limit 性能差。所以这里用的主键索引在子集中来查询。但是写完之后网上看见Mybatis有一个很好用的分页查询的插件。。默了。
文章撰写弹出的是一个内嵌ckeditor编辑器的模态框,选择它除了网上呼声高,另一个是它是以html代码的格式存储文章。这样在门户页面显示的时候就不必考虑文章的格式了。编辑时存的什么格式,显示查询都是带html代码的。
这里是门户前端显示
还差评论数没有加上。
最大的坑就是在win10上写的,但是服务器是Centos7,路径有点差距,以至于因为ckediotr的坑在服务器上部署时图片上传和浏览的路径调了很久。
系统部署
服务器部署方式上是将springboot导出的内置tomcat的jar做成一个service启动,然后用的nginx反向代理了一下,要说反向代理的好处么。考虑说是nginx并发是8000个http请求,而tomcat只有500个。加入nginx服务器跟系统服务器是分开的话(比如一对多分布式系统),可以保护系统的ip,恶意代码爬取到的是nginx服务器的ip。然后就说有缓存网页的功能。用户访问的页面在缓存中有的话直接返回给客户端,不需要每次都经过后台系统去渲染。虽然这里nginx跟门户项目在一个服务器,而且mysql也在这台服务器上,完全没有分开。但是这里就是跟风的反向代理了。
以上,总得来说,最大的坑就是在Win10上开发而部署是在Cento7上,路径不仅部署麻烦,调试也麻烦。其次就是ckeditor这个编辑器。另外就是Spring全家桶好用啊。
- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论