实现springBoot+vue系统项目时遇到的问题及解决方法
1、ideal导入项目后,侧边栏项目跑到了上方
将项目下的.idea文件删除,重新在ideal打开加载项目
2、导入项目后,项目依赖加载出错
File——Setting,找到Maven,更改为如下路径,重新加载maven
3、给项目和模块改名,发现新模块名后面跟着【旧模块名】(因为pom文件里的旧模块名没有改成新模块名)
File——Project Structure,更改project和modules名字
右键模块,更改模块目录名
回到项目所在文件夹,更改项目名字
ideal重新打开项目
如果是maven项目,需要把每个模块下的pom文件里面有关旧名字的依赖全部改掉,然后重新加载依赖
4、在vsCode导入vue项目时,下载依赖npm install 一直转圈
node版本太高,换成12.22.12版本
1、如果已安装node,打开控制面板卸载,然后为了确保彻底删除node在看看你的node安装目录中还有没有node文件夹,有的话一起删除。再看看C:\Users\用户名 文件夹下有没有.npmrc
以及.yarnrc
等等统统删除。再去看看你的环境变量有没有node相关的,有的话也一起删除了。
2、下载nvm(node版本控制)
nvm-setup.zip - 蓝奏云
下载后解压缩,运行exe后弹出安装窗口,自定义安装路径
在安装文件夹里打开cmd,输入nvm -v检测是否安装成功
nvm install 12.22.12 # 安装指定版本
nvm use 12.22.12 # 切换到该版本
nvm ls # 查看已安装版本
nvm alias default 12.22.12 # 设置默认版本
重启电脑,在vscode打开项目重新运行
npm cache clean --force
Remove-Item -Recurse -Force node_modules; Remove-Item -Force package-lock.json
npm install
npm run serve
5、如何重命名vue项目
1、更改项目所在文件夹名字
2、删除项目的node_modules
3、更改项目中的package.json里的name字段为新项目名
4、重新加载项目依赖npm install
6、ideal全局搜索ctrl+shift+F失效
点击所使用的输入法的设置——查看输入法快捷键按钮设置——找到简体/繁体切换快捷键(可以发现这个快捷键是ctrl+shift+F)——取消快捷键或更改快捷键——进入ideal全局搜索ctrl+shift+F成功
7、启动启动类application时,报错java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
File——Project Structure——project,将下面两项设置为同一版本,再运行启动类就可以了
8、数据库的create_time字段有数据,ideal里查询却为null
此时ideal的实体类属性名为create_time
springboot的配置文件开启了驼峰命名映射(数据库的字段总是命名为create_time,而ideal里的实体类属性命名总是createTime,采用驼峰命名映射可以自动将数据库的字段和实体类的属性对应上)
将实体类里的属性名create_at改为createAt对应上了驼峰命名映射后就能查出数据了
9、当前端的时间字段显示格式错误时
创建对象映射器
/*** 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]*/
public class JacksonObjectMapper extends ObjectMapper {public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";//public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";public JacksonObjectMapper() {super();//收到未知属性时不报异常this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);//反序列化时,属性不存在的兼容处理this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);//创建一个简单的模块,用于添加自定义的序列化器和反序列化器SimpleModule simpleModule = new SimpleModule().addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))).addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));//注册功能模块 例如,可以添加自定义序列化器和反序列化器//将自定义的模块注册到 ObjectMapper 中,使其生效this.registerModule(simpleModule);}
}
在配置文件config创建 Spring MVC 框架消息转换器
/*** 配置类,注册web层相关组件*/
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {/*** 扩展spring MVC框架的消息转化器(把后端传递给前端的数据按照同一格式转化)* @param converters*/protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {log.info("扩展消息转换器……");//创建一个消息转换器对象MappingJackson2HttpMessageConverter converter=new MappingJackson2HttpMessageConverter();//需要为消息转换器设置一个对象转换器,对象转换器可以将java对象序列化为json数据converter.setObjectMapper(new JacksonObjectMapper());//将自己的消息转化器加入容器中,把自己的对象转化器优先级设置最高converters.add(0,converter);}
}
重新运行时间前端时间就正常了
10、拷贝java文件进ideal后点击运行,报错找不到
点击ideal右侧的Maven,打开模块,点击编译,重启后可运行成功
11、阿里云oss试用三月,创建bucket的时候不让选择公共读
打开控制台(左上角悬浮搜索oss),进入对象存储oss控制台,点击数据服务,阻止公共访问,开关“阻止公共访问”一个来回,然后进入bucket空间,点击权限控制,关闭阻止公共访问,读写权限开启公共读
12、启动redis的客户端时Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。
在启动客户端redis-cli.exe之前先启动服务端redis-server.exe redis.windows.conf,启动服务端的命令行窗口不要关闭,重新开一个命令行窗口启动客户端
13、在ideal实用redis时候遇到了序列化与反序列化问题 nested exception is java.io.StreamCorruptedException: invalid stream header:xxx
在ideal中的redis配置类中添加,确保序列化和反序列话的序列化器一致
//StringRedisSerializer 用于将字符串类型的 key 进行序列化和反序列化,确保在 Redis 中存储的 key 是字符串类型
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置value的序列化器为StringRedisSerializer,确保序列化和反序列化一致
redisTemplate.setValueSerializer(new StringRedisSerializer());
14、redis的配置类报错:Could not autowire. No beans of ‘RedisConnectionFactory‘ type found
把形参转化为属性用@Resurce注解注入,再把原来的形参去除就行了
@Configuration
@Slf4j
public class RedisConfiguration {@Resourceprivate RedisConnectionFactory connectionFactory;//RedisTemplate 是 Spring Data Redis 提供的一个核心类,用于简化与 Redis 数据库的交互操作@Beanpublic RedisTemplate redisTemplate(){log.info("开始创建Reids模板对象……");RedisTemplate redisTemplate=new RedisTemplate();//设置reids的连接工厂对象,创建与数据库的连接redisTemplate.setConnectionFactory(connectionFactory);//设置redis key的序列化器(将 Java 对象转换为字节数组,以便存储到 Redis 数据库中)//StringRedisSerializer 用于将字符串类型的 key 进行序列化和反序列化,确保在 Redis 中存储的 key 是字符串类型redisTemplate.setKeySerializer(new StringRedisSerializer());// 设置value的序列化器为StringRedisSerializer,确保序列化和反序列化一致redisTemplate.setValueSerializer(new StringRedisSerializer());return redisTemplate;}
}
15、解决github Push rejected报错 remote: error: GH013: Repository rule violations found for refs/heads/maste
在commit以后要push了发现不能push,后来才知道是因为push的内容有密钥access-key-secret这种隐私信息,所以才不能提交,因为已经commit了,所以要撤销commit,再commit一次(要注意不提交包含隐私信息的文件或者把该文件加入到.gitignore文件里)然后再push就可以了
16、微信开发者工具(微信小程序开发工具)写代码的时候没有组件提示补全也没有代码缩进(安装插件)
1、打开vscode安装插件
这个要安装2.2.2版本,2.3版本以上无法使用
2、然后打开微信开发者工具的拓展
点击
导入已安装的vscode拓展
wxml格式化功能:F1 或者 CMD + Shift + P 输入 format wxml 命令 或者右键菜单,也可以配置 wxmlConfig.onSaveFormat 开启保存后自动格式化
17、微信开发者工具获取微信用户昵称与头像没有弹窗
//获取微信用户的头像和昵称getUserInfo() {wx.getUserProfile({desc: "获取用户信息",success: (res) => {console.log(res.userInfo);//为数据赋值this.setData({nickName: res.userInfo.nickName,url: res.userInfo.avatarUrl,});},});
把调试基础库改为2.27.0以下的版本
18、微信开发者工具向后端请求后回复 http://localhost:8080 不在以下 request 合法域名列表中
sendRequest(){wx.request({url: 'http://localhost:8080/user/shop/status',method:'GET',success:(res)=>{console.log(res.data)this.setData({result:res.data})}})}
解决
再次尝试,解决
19、使用jwt令牌的时候,jwt令牌解析不通过
在当前项目中分两个端user和admin,分别配置两个拦截器,对应的拦截器进行jwt解析的配置数据不一样
# 设置jwt签名加密时使用的秘钥 admin-secret-key: cast # 设置jwt过期时间 admin-ttl: 7200000 # 设置前端传递过来的令牌名称 admin-token-name: token user-secret-key: heima user-ttl: 7200000 user-token-name: authentication
在user端登录的时候,使用了user的配置数据进行生成jwt,而后面使用这个jwt送给admin拦截器使用admin的配置数据解析jwt,所以解析不出来。
解决方法:让user的配置数据进行生成jwt送给user拦截器解析
生成jwt令牌
Map<String,Object> claims=new HashMap<>(); claims.put(JwtClaimsConstant.USER_ID,user.getId()); String token= JwtUtil.createJWT(jwtProperties.getUserSecretKey(),jwtProperties.getUserTtl(),claims);
解析jwt令牌
log.info("jwt校验:{}", token); Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
总结:生成jwt令牌的配置数据要和解析jwt令牌的配置数据一致。