谷粒学院项目笔记------后端
-
代码生成器CodeGenerator部分代码说明:
gc.setOutputDir("D:\\javaProjects\\guli_parent\\service\\service_edu" + "/src/main/java"); //代码生成目录即生成的代码放在哪个目录下,最好写目录的绝对路径 gc.setAuthor("testjava"); //生成的代码上面写个作者,作者的名字在这里设置 gc.setOpen(false); //生成后是否打开资源管理器:如果为true就会在生成代码后把所有的目录展开,如果为false则不展开 gc.setFileOverride(false); //重新生成时文件是否覆盖,如果为true则我们在生成后的文件中改了代码当再重新生成的时候(即重新执行一遍生成代码)会将我们的代码覆盖,如果为false,则不会覆盖 gc.setServiceName("%sService"); //去掉Service接口的首字母I,如果不配置也就是默认情况下生成的所有service接口都会在最前面有个I,如果配置上了,则这个I就没有了ID_WORKER_STR gc.setIdType(IdType.ID_WORKER_STR); //主键策略:如果实体类中的主键是Long类型,则用ID_WORKER,如果实体类中的主键是字符串类型,则用ID_WORKER_STR gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型:就是在数据库中的日期是datetime类型,加上这个则在生成java代码时,就会生成date类型 gc.setSwagger2(true);//开启Swagger2模式
// 4、包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.atguigu"); pc.setModuleName("eduservice"); //模块名 //这里就是指明生成后的各个包,如此处配置生成后的各包就是com.atguigu.eduservice.controller/com.atguigu.eduservice.entity等等 pc.setController("controller"); pc.setEntity("entity"); pc.setService("service"); pc.setMapper("mapper"); mpg.setPackageInfo(pc);
// 5、策略配置 StrategyConfig strategy = new StrategyConfig(); //这里指明对哪个表进行生成,如果有多张表用逗号隔开,如strategy.setInclude("表1","表2","表3") strategy.setInclude("edu_teacher");
-
当在一个模块想要使用其他模块的类时,首先要在pom.xml中导入相应的模块,然后在主启动类上面加上
@ComponentScan(basePackages = {"com.atguigu"})
时,只要是在同一个项目下即使不是同一个模块,只要这个模块被导入到当前的模块中了,则只要包名是com.atguigu开头的所有的包及其子包都会被扫描到,如果你不加@ComponentScan(basePackages = {"com.atguigu"})
则默认只扫描当前项目与主启动类在同一层级的包及其子包 -
在swagger界面
-
生成的service已经实现了分页,只需要导入分页插件,然后自己new一个Page对象,然后就可以调用service的分页方法将自己new的Page对象传给service的分页方法进行分页,分页的的结果会存储到传入的Page对象中也就是自己new的那个配置对象中,如下:
//创建page对象 Page<EduTeacher> pageTeacher = new Page<>(current,limit); teacherService.page(pageTeacher,null);
-
@RequestBody是指用json传数据,就是之前传是在请求参数中写键值对,如果加上@RequestBody,传参数就可以使用json传了,但是注意,一旦使用@RequestBody必须使用该方法只能是post,如果用get写的json格式的请求参数是取不到的,且如果你传的带@RequestBody的这个参数可能为空,则在该@RequestBody中的required最好设为false,即@RequestBody(required=false)
-
mybatis-Plus自动填充:
1.在需要自动填充的属性上加上相应的注解,fill为自动填充策略
@TableField(fill = FieldFill.DEFAULT)
表示在不自动填充@TableField(fill = FieldFill.INSERT)
表示在插入时自动填充@TableField(fill = FieldFill.UPDATE)
表示在更新时自动填充@TableField(fill = FieldFill.INSERT_UPDATE)
表示在插入或更新时自动填充
2.编写字段填充处理器
@Component public class MyMetaObjectHandler implements MetaObjectHandler { //插入时自动填充方式 @Override public void insertFill(MetaObject metaObject) { //fileName是属性名称,不是表的字段名称,第一个参数是说明对哪个属性进行填充,第二个参数是说自动填什么,new Date()就是指获取当前时间 this.setFieldValByName("gmtCreate", new Date(), metaObject); this.setFieldValByName("gmtModified", new Date(), metaObject); } //更新时自动填充方式 @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("gmtModified", new Date(), metaObject); } }
-
PUT请求和POST请求都是有请求体的,@RequestBody就是得到请求体的数据,所以使用@RequestBody只能用有请求体的请求方式也就是可以使用PUT或者POST,Get没有请求体,不能用Get
-
统一异常处理类,就是当程序运行过程中如果出现异常,我不想让它返回它默认的那一大片错误,我想让它返回我指定的内容,则可以写一个统一异常处理类
/** * 统一异常处理类 */ @ControllerAdvice public class GlobalExceptionHandler { //出现什么异常时执行该方法,如果是Exception.class,就表示所有异常,就是只要出现异常,不管什么都执行这个方法 @ExceptionHandler(Exception.class) @ResponseBody //为了返回数据,也就是在执行完该方法后返回json数据给前面 public R error(Exception e){ e.printStackTrace(); return R.error(); } }
-
默认日志级别:INFO
-
将错误日志输出到文件中时,异常输出语句
log.error(e.getMessage())
中的error是说明你想把走到这个异常处理函数的错误日志写到log_error.log中,如果你想把走到这个异常处理函数的错误日志写到log_info.log中,则这里应该写log.info(e.getMessage())
,同理,如果你想把走到这个异常处理函数的错误日志写到log_warn.log中,则这里应该写log.warn(e.getMessage())
,logback记录日志到文件中,只有这三种文件 -
如果某个类实现类接口
InitializingBean
则在项目初始化后,会执行该类中的方法afterPropertiesSet()
-
这个库可以帮助我们快速格式化日期,比如格式化当前时间
new DateTime().toString("yyyy/MM/dd")
<!-- 日期工具栏依赖 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency>
-
在上传头像存入数据库后,在数据库中头像的url后面变成了file.png也就是文件名,这是为了避免你上传的文件名中可能含有中文,所以组件做了这么一个转换,把文件名称统一变成file.png进行存储
-
使用easyExcel还需要引入poi的依赖,easyExcel是对poi的进一步封装,在引入二者时,注意两者的版本对应
-
用easyExcel进行读操作时,需要在对应实体类的属性注解里面写上index,以说明属性对应的是表中的第几列
//设置列对应的属性 @ExcelProperty(index = 0) private int sid;
-
如果是根据表自动生成的service和mapper,则在每个service中是已经有一个baseMapper,这个baseMapper就是该service对应的表的mapper,可以直接用
-
工具类BeanUtils中的方法
BeanUtils.copyProperties(sourceObject,targetObject)
是将sourceObject的相应属性取出赋值给targetObject的相应属性,注意是spring的BeanUtils不要导错包 -
403错误原因:跨域或api路径写错了
-
SDK和API,SDK是对API的封装
- API:就是通过httpclient技术对一个固定的地址发请求传参数,调用人家的服务
- SDK:就是引入依赖,然后通过相应的类或接口调用服务
-
如果某一个模块并不需要加载数据库相关的,则需要在其主启动类上写明
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
,否则,框架是默认加载数据库相关配置的,而你这个模块又不需要数据库,也没有写数据库相关配置,则在加载的时候找不到就会报错,写了exclude = DataSourceAutoConfiguration.class
,就是告诉框架我这个模块不需要加载数据库相关配置 -
每个服务注册进注册中心的那个名字尽量不要用下横杠 _ ,用中横杠 -
-
当在一个服务中引入了注册中心的依赖后,如果没有配置注册中心相关的配置,则会报一个错误,是因为引入的注册中心的依赖它会在项目启动的时候自动去找注册服务相关的配置,但你又没写则报错了,但是这个错并不影响服务的运行
-
StringUtils.join:是将数组按照一定的符号进行分隔,然后拼接成字符串。注意这个StringUtils不是spring中的StringUtils,而是
org.apache.commons.lang3.StringUtils
-
videoWrapper.select("video_sourse_id");
用这个wrapper执行的查询结果,还是封装在对应于数据库的实体类中,只是每个实体类中只有这个video_sourse_id
属性了,但是它还是封装在实体类中,并不是就变成了只是这个字段了 -
当创建模块后发现java或者resources图标不对时,有两种处理方式
- 直接将里面的文件复制到编译好的target中
- 先更改图标,然后再在里面创建文件,一定要先改图标再创建文件,如果你先创建文件了,之后又才改的图标可能会有问题
-
默认情况下是不会自动扫描mapper.xml的,要想在编译后有mapper.xml有三种做法
-
手动将mapper.xml文件复制到项目编译后的文件夹target相应的位置
-
将mapper文件夹放在项目的resources文件夹下
-
如果就是想将mepper文件夹放在java文件夹下又不想手动复制,则需要三步
-
第一步:在pom中加入
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
-
第二步,在项目的application.yml中加入
#配置mapper xml文件的路径 mybatis-plus: mapper-locations: classpath:com/atguigu/educms/mapper/xml/*.xml
-
第三步,在项目主启动类上加入mapper文件夹所在的包
@MapperScan("com.atguigu.educms.mapper")
-
-
-
Mysql本质其实就是文件系统还是存在硬盘中的,而Redis是基于内存的,当然Redis也可以持久化;一般来讲,经常访问,不经常修改,不是特别重要的数据适合放到redis作为缓存
-
Redis中的
bind 127.0.0.1
要注释掉,protected-mode yes
中的yes要改成no,这两个都是限制只能本地访问的,而我们现在要用windows访问linux上的redis,所以是要远程访问,所以得改成上述的状态,linux上的redis才允许远程访问 -
阿里云的短信服务只负责发短信,并不会生成验证码,也就是要发送的验证码需要我们在代码中自己提供,也就是自己生成,然后将生成的验证码传给阿里云的短信发送接口,阿里云短信发送只负责发;同样,阿里云短信服务也不会负责短信5min之内有效或10min之内有效之类的,只是负责发短信,像几分钟之内有效得自己实现
-
在发送短信的方法中,使用库
fastjson
可以快速将一个map集合转换成json格式,又因为在设置发送的内容的时候需要的是json格式的,所以在调用发送短信的方法的时候就把要发送的内容(验证码)封装在一个map集合中,这样直接使用fastjson
中的JSONObject.toJSONString(param)
就可以快速将map集合转换成json格式 -
一般密码加密使用MD5:MD5的优点是之能加密不能解密
-
spring整合定时任务的时候,注意,cron只能是六位,如果用cron生成器生成表达式是7位的话,在写到程序中后要写前六位,最后一位年spring默认为当年
-
注意:在远程连接数据库时,能够远程连接的用户在客户端和服务端都要配置,才能使用该用户去连接数据库,还要注意关闭服务端的防火墙
-
Gateway:
- 当一个服务是集群对外提供服务的时候,使用gateway不需要任何配置它会自动帮我们做到一个负载均衡,但nginx就得自己进行配置才能做到负载均衡
- 可以在gateway处统一进行跨域处理,注意如果在gateway中统一处理了跨域在controllerh上就不要加@CrossOrigin了,否则会造成已经跨过去了然后又一个@CrossOrigin又跨回来了
- 可以在gateway处统一进行异常处理
- gateway可以用于权限控制
该项目的具体项目地址:
github:https://github.com/Mia-3/guli
gitee:https://gitee.com/mia-3/guli.git