2017年毕业设计笔记补充 home 编辑时间 2021/04/16 ## 前言 博客:https://zzzmh.cn/single?id=2 github:https://github.com/18121259693/projectoa 在线预览:https://zzzmh.cn/projectoa/index <br> 3年前做毕业设计也就是 project oa 的时候 在蚂蚁笔记的公服中留下了很多笔记,当时觉得文采太差,小学生写日记 但是近期有同学可能看到我的github开源项目和博客日志中的project oa,想要完整笔记,于是开本篇搬运一下 下面内容搬运字2018年的蚂蚁笔记,顺序随缘 <br><br> ## 毕设-DB设计 当前需要的数据库有 user 用户登录信息 userinfo 用户详细个人信息 department 部门 calendar 用于日历上的日程 message 站内信 notice 公告 附件 https://zzzmh.lanzous.com/iuNIko6uvij <br><br> ## Spring-Data-Redis 毕设 Redis最终设计 使用方法名+userID作为key JSON 数组 格式的String作为value <br> 例如 日历 用户0的数据 key : calendar_0 value : [{id:0,title:'好累啊',start:'2018-02-21',end:'2018-02-22'}] <br> 以此类推 message就是message_0 value就是[{id:0,sendId:1,message:'hello',isRead:false}] 如果他本人读过这一条了 要把这一条设为已读 <br> Redis实现代码 本次使用Spring-Data-Redis 并且实现的是StringRedisTemplate <br> gradle依赖 ```shell //SpringBoot内置的Redis compile('org.springframework.boot:spring-boot-startr-data-redis') ``` <br> application.properties 配置 ```shell # redis全家桶 spring.redis.host=localhost spring.redis.port=6379 # 同时最大连接数 spring.redis.pool.max-active=64 # 最大空闲连接数 spring.redis.pool.max-idle=8 # 最大获取等待时间 spring.redis.pool.max-wait=5000 ``` <br> RedisService 实现一个基本款 ```shell import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; /** * @author zmh * @date 2018/2/1813:42 * Spring Data Redis 的基本款 * 只要Gradle或Maven引入依赖 就可以如此使用Redis 作为缓存 */ @Service public class RedisService { @Autowired private StringRedisTemplate redisTemplate; public void setValue(String key, String value) { redisTemplate.opsForValue().set(key, value); } public String getValue(String key) { return redisTemplate.opsForValue().get(key); } } ``` <br> 最后在需要用的地方使用自动注入 ```shell @Autowired private RedisService redisService; ``` <br> ```shell redisService.setValue(key, value); String value = redisService.getValue(key); ``` ## shiro-spring 引入依赖(Gradle) ```shell //使用的是shiro-spring 而非shiro compile('org.apache.shiro:shiro-spring:1.4.0') ``` <br><br> ## 毕业设计-开发避坑指南! <br> 第一坑 HTML相对路径和绝对路径 绝对是个天坑 Springboot默认的server.context-path是 '/' 也就是直接在localhost:8080/下访问项目,那么问题是最后上线项目还是打成war放在tomcat下。那就必须有一个context-path <br> 那么假设以下三种情况 <link rel="stylesheet" href="/assets/css/app.css"> <script src="/assets/js/jquery.min.js"></script> <a href="/index">返回首页</a> <br> 如果刚开始开发没设server.context-path 后来再加了一个server.context-path = “/project” 那就刺激了,上面这些 src href的引用全部失败 错误代码404 a标签跳转出去也直接404 <br> 因为他们用的是 绝对路径 拼的逻辑是 http://localhost:8080/assets/js/jquery.min.js 或者 href 同理 默认都不带server.context-path玩 正确的应该是 http://localhost:8080/project/assets/js/jquery.min.js 或者 href 同理 <br> 那么这个时候很多同学就会想到用第二种方法引用 相对路径 (如果辣么容易就解决我就不会花时间写出来啦) 相对路径的2种写法 就举一个栗子 js的 <script src="assets/js/jquery.min.js"></script> <script src="./assets/js/jquery.min.js"></script> 这两个意思完全一样 就是看他所在位置的url,原地不动接src <br> 栗子: 比如现在在首页上 http://localhost:8080/project 里面的代码是<script src="assets/js/jquery.min.js"></script> 那么他就会去找http://localhost:8080/project/assets/js/jquery.min.js 看着没问题了 完美解决了 <br> 那么问题来了 如果我不在首页上呢 <br> 我在某个功能页面内 比如 我现在所在的是userinfo 后台在所有user相关的controller里都加了一个总的 @RequestMapping(value = "/user") 当前位置:http://localhost:8080/project/user/userinfo 使用相对路径 <script src="assets/js/jquery.min.js"></script> 实际引到的效果如下 http://localhost:8080/project/user/assets/js/jquery.min.js 正确的是 http://localhost:8080/project/assets/js/jquery.min.js 又会出现一波404之类的问题 包括那种a标签的跳转 ajax的url,如果用相对路径,都会中这招 显然不在首页上引用js,用相对路径就会多出一个/user 因为@RequestMapping(value = "/user") <br> 那么总结一下 问题所在 1. 首先我这次的需求来看哈,我必须设置server.context-path,因为我的80端口要放很多很多项目 2. 然后我必须使用每个controller的RequestMapping,否则我以后区分权限管理就很头疼 3. 第三个,我所有页面的共同部分,是提取出来的,所以分别给他们一人写一个引导路径,也不现实,必须一句话适应所有页面 <br> 1.相对路径 会按照当前所在的url拼路径 如果当前在首页,那完全没问题 如果当前在一个@RequestMapping(value = "/user")下 栗子: http://localhost:8080/project/user 那就炸了,因为我正确路径没有/user <br> 2.绝对路径 会按照基本的http地址,直接拼绝对路径的地址 会跳过context-path 如果不嫌麻烦,也可以每个都写死 例如http://localhost:8080/project 用<script src="/project/assets/js/jquery.min.js"></script> 但是从此以后就再也不能修改访问地址context-path,否则要所有src 所有href全部修改,一夜回到解放前 <br> **那么重点来了** 那么这其实不是一个新问题 以前jsp年代就有springMVC 就有这个烦恼 当时解决起来用的是JSP的办法 <%=request.getContextPath()%> 当然也有el表达式的 原理一样 就不赘述 这个<%=request.getContextPath()%> 出来的内容就是 http://localhost:8080/project 再加上 /assets/js/jquery.min.js 就可以写死正确路径 辣么,这些JSP的方案 都不太适用于现在的thymeleaf + html5 <br> **目前解决方法1 (推荐)** 引用的地方 使用thymeleaf 获取ContextPath 栗子 ```html <link rel="stylesheet" th:href="@{/assets/css/app.css}"> <script th:src="@{/assets/js/jquery.min.js}"></script> ``` <br> **目前解决方法2** 前面解决了引用的地方还是没解决a标签 原来的 a标签<a href="index">返回首页</a> 原来的 问题 : 这个a标签只能在首页使用,到了http://localhost:8080/project/user这种位置就会跳到http://localhost:8080/project/user/index就会404 我这次项目用的方案如下 ```html //这里会改变所有a标签 如果需要保守方案 可以用class或者id来精确管理 var contextPath = "/project"; $('a').each(function(){ $(this).attr('href',contextPath + "/" + $(this).attr('href')); }); ``` ## 彩虹猫 banner.txt for Spring Boot ```shell ${AnsiColor.BRIGHT_BLUE}████████████████████████████████████████████████████████████████████████████████ ${AnsiColor.BRIGHT_BLUE}████████████████████████████████████████████████████████████████████████████████ ${AnsiColor.RED}██████████████████${AnsiColor.BRIGHT_BLUE}████████████████${AnsiColor.BLACK}██████████████████████████████${AnsiColor.BRIGHT_BLUE}████████████████ ${AnsiColor.RED}████████████████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████████████████████████████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}██████████████ ${AnsiColor.BRIGHT_RED}████${AnsiColor.RED}██████████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.MAGENTA}██████████████████████${AnsiColor.WHITE}██████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}████████████ ${AnsiColor.BRIGHT_RED}██████████████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}████${AnsiColor.MAGENTA}████████████████${AnsiColor.BLACK}████${AnsiColor.MAGENTA}██████${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}██${AnsiColor.BLACK}████${AnsiColor.BRIGHT_BLUE}██████ ${AnsiColor.BRIGHT_RED}██████████████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.MAGENTA}████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.MAGENTA}██████${AnsiColor.WHITE}██${AnsiColor.BLACK}████${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}████ ${AnsiColor.BRIGHT_YELLOW}██████████████████${AnsiColor.BRIGHT_RED}████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.MAGENTA}████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.MAGENTA}██████${AnsiColor.WHITE}██${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}████ ${AnsiColor.BRIGHT_YELLOW}██████████████████████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_YELLOW}██████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.MAGENTA}████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.BLACK}████████${AnsiColor.WHITE}████████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}████ ${AnsiColor.BRIGHT_YELLOW}████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.BLACK}██${AnsiColor.BRIGHT_YELLOW}████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.MAGENTA}████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████████████████████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}████ ${AnsiColor.BRIGHT_GREEN}██████████████████${AnsiColor.BRIGHT_YELLOW}██${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.BLACK}████████${AnsiColor.WHITE}██${AnsiColor.MAGENTA}██████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████████████████████████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}██ ${AnsiColor.BRIGHT_GREEN}██████████████████████${AnsiColor.WHITE}████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.MAGENTA}██████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.BRIGHT_YELLOW}██${AnsiColor.WHITE}██████████${AnsiColor.BRIGHT_YELLOW}██${AnsiColor.BLACK}██${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}██ ${AnsiColor.BRIGHT_GREEN}██████████████████████${AnsiColor.BLACK}████${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.MAGENTA}██████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.BLACK}████${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}██ ${AnsiColor.BLUE}██████████████████${AnsiColor.BRIGHT_GREEN}████████${AnsiColor.BLACK}██████${AnsiColor.WHITE}██${AnsiColor.MAGENTA}██████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.MAGENTA}████${AnsiColor.WHITE}████████████████${AnsiColor.MAGENTA}████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}██ ${AnsiColor.BLUE}██████████████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}████${AnsiColor.MAGENTA}██████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.BLACK}████████████${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}████ ${AnsiColor.BRIGHT_BLUE}██████████████████${AnsiColor.BLUE}████${AnsiColor.BLUE}██████${AnsiColor.BLACK}████${AnsiColor.WHITE}██████${AnsiColor.MAGENTA}██████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████████████████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}██████ ${AnsiColor.BRIGHT_BLUE}██████████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██${AnsiColor.BLACK}████${AnsiColor.WHITE}████████████████████${AnsiColor.BLACK}██████████████████${AnsiColor.BRIGHT_BLUE}████████ ${AnsiColor.BRIGHT_BLUE}████████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}██████${AnsiColor.BLACK}████████████████████████████████${AnsiColor.WHITE}██${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}████████████ ${AnsiColor.BRIGHT_BLUE}████████████████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}██${AnsiColor.BLACK}██${AnsiColor.WHITE}████${AnsiColor.BRIGHT_BLUE}████████████${AnsiColor.BLACK}██${AnsiColor.WHITE}████${AnsiColor.BLACK}████${AnsiColor.WHITE}████${AnsiColor.BLACK}██${AnsiColor.BRIGHT_BLUE}████████████ ${AnsiColor.BRIGHT_BLUE}████████████████████████${AnsiColor.BLACK}██████${AnsiColor.BRIGHT_BLUE}████${AnsiColor.BLACK}██████${AnsiColor.BRIGHT_BLUE}████████████${AnsiColor.BLACK}██████${AnsiColor.BRIGHT_BLUE}████${AnsiColor.BLACK}██████${AnsiColor.BRIGHT_BLUE}████████████ ████████████████████████████████████████████████████████████████████████████████ ${AnsiColor.BRIGHT_BLUE}:: Meow :: Running Spring Boot ${spring-boot.version} :: \ö/${AnsiColor.BLACK} ``` 送人玫瑰,手留余香 赞赏 Wechat Pay Alipay 解决 Navicat 连 MySQL 8.0 报 2059 Authentication plugin caching_sha2_password 错误 Java thumbnailator 图片裁剪格式转换 支持 JPEG/PNG/WEBP 互转