# gweb
**Repository Path**: a_leaf_of_grass/gweb
## Basic Information
- **Project Name**: gweb
- **Description**: Springboot+MyBatis+shiro+thymeleaf实现的后台管理系统,配合前台主页信息的管理,实现用户管理、角色管理、菜单管理、权限管理、附件管理、发送邮件等,以及一些小工具如:二维码生成、日历管理等功能,部分功能正在完善中。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2022-03-20
- **Last Updated**: 2022-03-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#
gweb项目
### 一、简介
> 自己开发学习的项目,欢迎批评指正。
**演示地址:[http://demo.mygweb.cn](http://demo.mygweb.cn),用户名/密码:admin/admin (服务器配置较低,请善待)**
**系统截图**

















### 二、项目概述 #
#### 1.项目结构 ###
|-gweb··············································主项目
|
|-data··········································项目数据
| |-sql·······································数据库sql
| |-war·······································工程war包
|
|-src
|-main
|-java
| |- *.* ·····························引用外部资源
| |-cn.mygweb·························后台程序
| |-admin·························后台相关的内容,MVC架构等
| |-common························公共内容,config,exception,tasks,utils等
| |-web···························前台相关的内容,MVC架构等
| |-GwebApplication···············程序启动主类
|-resources·····························资源文件
| |-i18n······························国际化配置,messages.properties等
| |-mapper····························mapper映射xml文件
| |-META-INF··························springboot热部署配置文件,spring-devtools.properties
| |-static····························存放一些静态文件,如:js、css等,按照admin与web前后台分别存放
| |-templates·························存放模板,如:freemarker,thymeleaf等
| |-freemarker····················freemarker页面
| |-thymeleaf·····················thymeleaf页面
| |-admin·····················后台页面
| |-web·······················前台页面
| |- * ·······················公共页面,如404,error等
| |-application.properties············系统配置文件
| |-resource.properties···············资源配置文件
|-webapp································webapp
|-WEB-INF
|-classes·······················编译后的文件
|-web.xml·······················配置文件
#### 2.项目运行
1. 将项目导入eclipse中(Maven项目)。
2. 创建数据库,导入`data/sql/gweb.sql`脚本,然后修改`src/main/resources/aplication.properties`文件中`spring.datasource.*`相关的数据库连接配置信息。
3. 启动redis服务,修改`src/main/resources/aplication.properties`文件中`spring.redis.*`相关的redis连接配置信息。
4. 鼠标点击`src/main/java/cn/mygweb/GwebApplication.java`,然后右键 -> run as -> springboot application。
5. 浏览器访问 http://localhost:端口, 端口号配置在`aplication.properties`文件中。
#### 3. 技术要点
##### 后端技术
>1. SpringBoot:提供了对Spring开箱即用的功能,简化了Spring配置,提供自动配置 auto-configuration功能
>
>2. Spring:是提供了IoC等功能,是目前最流行的Java企业级开发框架
>
>3. SpringMVC:MVC框架,使用方便,Bug较少
>
>4. i18n:国际化配置
>
>5. Redis:数据缓存
>
>6. 定时任务
>
>7. MyBatis:持久层框架,通过配置与数据库交互
>
>8. MyBatis Generator:代码生成器
>
>9. PageHelper:分页插件
>
>10. Shiro:安全组件,实现用户登录、权限验证
>
>11. lombok:日志插件,类上面使用@Slf4j注解,无需创建log对象即可使用log.info(),log.error()等方法
>
>12. Thymeleaf:模板组件
>
>13. JavaMail:邮件发送
##### 前端技术 ####
>1. jQuery:JavaScript库
>
>2. Bootstrap:响应式设计前端框架
>
>3. Ace Admin:后台管理平台开源框架
>
>4. jQuery UI:基于jQuery的UI框架
>
>5. jqGrid:表格插件
>
>6. layui:前端框架,支持弹窗、表格等
>
>7. UEditor:Web富文本编辑器
>
>8. Editor.md:基于Markdown语法的Web文本编辑器
>
>9. ECharts:用于生成图标的组件
>
>10. My97DatePicker:日期组件
>
>11. zTree:树组件
>
>12. fullcalendar:日历插件
>
>13. font-awesome:图标库
>
>14. jQuery Validation:基于jQuery的表单校验框架
### 三、开发遇到的问题及解决办法(部分内容不是最新版)
#### 1.创建项目pom文件报错,但是没有相应的提示 ####
解决办法:在``中加入`2.6`。
```java
UTF-8
UTF-8
2.6
1.8
```
#### 2.tk.mybatis.mapper.MapperException: tk.mybatis.mapper.provider.EmptyProvider中缺少selectOne方法! ####
解决办法:springboot集成devtools热部署与通用mapper出现此错误,估计是两者存在冲突,具体原因不详。在src/main/resources目录下新建META-INF目录,再次目录下新建一个spring-devtools.properties文件,文件内容如下:
#业务包,依赖的其他业务组件(避免热部署的devtools和通用mapper的冲突)
restart.include.hifi=/hifi-[\\w-\\.\\d]+.jar
restart.include.mybatis=/mybatis-[\\w-\\.\\d]+.jar
restart.include.mapper=/mapper-[\\w-\\.\\d]+jar
restart.include.pagehelper=/pagehelper-[\\w-\\.\\d]+jar
这样即可实现热部署和通用mapper功能共存了。。。。但是!!!!测试发现自定义的mapper做crud操作后热部署不会出现问题,使用通用mapper又会报另一个错误:
Caused by: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseSelectProvider.dynamicSQL). Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider
原因是通用mapper的版本太低了,将原有的依赖版本改为如下版本:
```java
tk.mybatis
mapper-spring-boot-starter
2.0.0
```
#### 3.如何将springboot项目部署到tomcat中 ####
解决办法:
1. 在pom.xml文件中,把打包形式jar改为war
war
2. 在pom中添加一条依赖,作为屏蔽springboot中tomcat容器
```java
org.springframework.boot
spring-boot-starter-tomcat
provided
```
3. 添加servlet-api的依赖
```java
javax.servlet
javax.servlet-api
3.1.0
provided
```
4. 原先启动SpringBoot是通过main方法启动的,现在需要让启动类继承SpringBootServletInitializer,并重写configure方法,使springboot容器以HelloSpringBoot类作为入口
package top.gaoxb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan;
/**
* Title: GwebApplication.java
* Description: 项目启动的入口程序
* @author gxb
* @date 2019年5月18日
*/
@SpringBootApplication
// 扫描mybatis mapper包路径
@MapperScan(basePackages= {"top.gaoxb.web.mapper"})
// 扫描 所有需要的包, 包含一些自用的工具类包 所在的路径
@ComponentScan(basePackages= {"top.gaoxb","org.n3r.idworker"})
// 开启定时任务
@EnableScheduling
// 开启异步调用方法
@EnableAsync
public class GwebApplication extends SpringBootServletInitializer{
/**
* Title: configure
* Description: 支持war方式启动
* @param builder
* @return
* @see org.springframework.boot.web.servlet.support.SpringBootServletInitializer#configure(org.springframework.boot.builder.SpringApplicationBuilder)
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(GwebApplication.class);
}
/**
* Title: main
* Description: 支持jar方式启动
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(GwebApplication.class, args);
}
}
5. 将项目打成打war包,eclipse右键项目run as --->maven build... 输入参数 clean package 进行打包。如果这种方式不行,就直接cmd切换到工程的目录下,运行 `mvn clean package` 命令进行打包,前提是需要配置maven的环境变量,否则 `mvn` 命令不能用。
D:\JAVA\workspace1.8\gweb>mvn clean package
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------------< top.gaoxb:gweb >---------------------------
[INFO] Building gweb 0.0.1-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ gweb ---
[INFO] Deleting D:\JAVA\workspace1.8\gweb\target
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ gweb ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 1880 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ gweb ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 50 source files to D:\JAVA\workspace1.8\gweb\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ gweb ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\JAVA\workspace1.8\gweb\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ gweb ---
[INFO] Changes detected - recompiling the module!
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ gweb ---
[INFO]
[INFO] --- maven-war-plugin:3.2.2:war (default-war) @ gweb ---
[INFO] Packaging webapp
[INFO] Assembling webapp [gweb] in [D:\JAVA\workspace1.8\gweb\target\gweb]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\JAVA\workspace1.8\gweb\src\main\webapp]
[INFO] Webapp assembled in [3534 msecs]
[INFO] Building war: D:\JAVA\workspace1.8\gweb\target\gweb.war
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.5.RELEASE:repackage (repackage) @ gweb ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.703 s
[INFO] Finished at: 2019-05-26T08:09:29+08:00
[INFO] ------------------------------------------------------------------------
6. 根据上面位置中的 `[INFO] Building war: D:\JAVA\workspace1.8\gweb\target\gweb.war`, 找到这个war包,推荐复制路径,粘贴到文件管理器中直接找到
7. 进入tomcat(7.0以上才可以)webapps目录,将war包解压到这个目录(直接启动tomcat也可以自动解压,但需要放在webapps目录下,然后去bin文件夹startup.bat启动tomcat
8. 访问http://localhost:8080/项目名
#### 4.springboot项目部署到tomcat中实现直接用域名访问,不加项目名称 ####
1. 将项目的war包放到tomcat的webapps目录下
2. 打开tomcat的conf/server.xml文件,配置最下面的 ` XXX ` 标签,配置如下:
|-错误配置:
以上配置,由于host节点配置了appBase为webapps,所有tomcat会加载webapps里的所有项目,下面又配置了webapps里的项目,导致项目又加载一次,所以会导致项目重复加载,定时程序会在几秒之内重复执行。
|-正确配置:
#### 5.Tomcat命令窗口中文乱码 ####
原因大概是:tomcat的默认输出格式为UTF-8,而Tomcat控制台的输出编码为GBK。
网上的解决方案:修改catalina.bat中set “JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -Dfile.encoding=GBK” (加粗字体为新添加内容),并且将catalina.bat文件的编码改为GB2312。结果乱码问题仍然没有解决。然后决定尝试修改Tomcat窗口的编码,并还原文件catalina.bat中的set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
#### 6.eclipse使用debug模式启动项目启动会卡住不动,项目无法访问,报错 `[INFO]- Bean 'xxx' of type [class xxx] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)` ####
解决办法:debug模式启动之前,删除所有的断点,再次启动就可以了,具体原因尚不清楚。
**修改Tomcat窗口的编码:**
1. win+R 输入 regedit 打开注册表
2. 进入 `HKEY_CURRENT_USER -> Console -> Tomcat` 中(如果没有这一项则新建),选择`CodePage` (如果没有则新建,类型为DWORD),`右键 -> 修改 -> 十进制 -> 数据数值65501`,然后点击确定,再次测试。
3. 如果还是不行,找到 conf/logging.properties 文件,将其中的UTF-8全部换为GBK,再重启测试。此步骤有可能会与第二部冲突,导致还是乱码,尝试把第二步中的信息删除,再测试。
#### 6.如何快速将html中的文件导入切换为thymeleaf导入 ####
1. 在``中引入项目ico图标
2. 将页面中的
...
标签中的全部内容替换为:
3. 将页面中的
标签中的全部内容替换为:
4. 将页面中的
...
标签中的内容替换为:
5. 将页面中的
...
标签中的全部内容替换为:
6. 将页面中的
标签中的全部内容替换为:
7. 使用Ctrl+F将页面中的`Find`中的内容与`Rweplace with`中的内容填入,然后点击`Replace All`按钮进行替换
Find Replace with
↓ ↓
href="assets th:href="@{/static/admin
href='assets th:href='@{/static/admin
src="assets th:src="@{/static/admin
src='assets th:src='@{/static/admin
.css" .css}"
.js" .js}"
.jpg" .jpg}"
.png" .png}"
图片中的地址不用替换也可以,直接把图片的路径改为正确路径即可,如:assets/images/avatars/profile-pic.jpg
改为 :/static/admin/images/avatars/profile-pic.jpg。
8. 在每个页面激活tooltip提示框,2种方式(经过优化,直接写在了footer.html中,不需要在每个页面都写一次了),所以下面的步骤也可以不执行
1. 如果有jQuery(function($) {});这样的初始化页面函数,直接在函数开头加入如下:
//激活tooltip提示框
$("[data-toggle='tooltip']").tooltip();
2. 也可以直接在页面下部,script代码的上面直接写初始化激活提示框函数,如下:
9.导入自定义的js文件,在每个页面导入js文件的最下面导入: