# 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 (服务器配置较低,请善待)** **系统截图** ![前台首页](imgs/1.png) ![后台登录页](imgs/2.png) ![后台仪表盘](imgs/3.png) ![栏目管理](imgs/4.png) ![文章管理](imgs/5.png) ![用户留言](imgs/6.png) ![用户管理](imgs/7.png) ![角色管理](imgs/8.png) ![菜单管理](imgs/9.png) ![附件管理](imgs/10.png) ![数据可视化](imgs/11.png) ![发送邮件](imgs/12.png) ![二维码生成器](imgs/13.png) ![日历备忘录](imgs/14.png) ![系统参数](imgs/15.png) ![数据库监控](imgs/16.png) ![邮件配置](imgs/17.png) ### 二、项目概述 # #### 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文件的最下面导入: