# spring-back **Repository Path**: alexandrmisko_admin/spring-back ## Basic Information - **Project Name**: spring-back - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2022-03-12 - **Last Updated**: 2023-09-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 春禾支教项目 > - 此文件为后端项目的描述性文件,所有关于项目的问题/难点/解决方法/功能实现等均可以加入该文件中。 > > - 本文件格式为markdown文件,可以通过符号标记的形式来改变文字的加粗/高亮/h1,h2显示等。 > - 语法格式可参考:[在线markdown编辑器_微信公众号markdown排版工具](https://markdown.com.cn/editor/) ## 一、git命令的使用 ```shell - 首先,当我们第一次使用git时,我们要先初始化git: - 通过使用git config命令来设置自己的name和email: git config --global user.name "你的名字" //配置用户名 git config --global user.email 1032628545@qq.com //配置邮箱 - 接着,我们就可以把网站上的项目clone下来了,通过使用: git clone [ssh地址/https地址] - 克隆下来之后,就可以修改代码了,当你修改完之后,我们要把自己修改的内容添加,提交,再推送到remote远程网站仓库里,这样 - 大家都可以看到你的修改了,使用 #1. 添加,add后加空格再加.就可以把所有修改都添加了 git add . #2. "写上你的本次修改的信息,也就是你对提交的注释,可以让别人了解到你做了什么,或者是谁修改的" git commit -m "你的注释信息" #3. commit只是你在本地提交了,而没有发送到remote仓库,所以: git push - 随时可以使用的命令 git status #该命令是查看当前仓库内有哪些需要add的文件(untracked)或者有哪些需commit的文件(uncommitted) git diff #该命令是查看你在上一次commit之后,都修改了哪些文件 git log #查看当前git仓库的commit日志(记录) - 遇到的问题 1. git push提示:`hint: (e.g., 'git pull ...') before pushing again`,并没有push成功 #此情况表示,有其他成员改了remote仓库中的文件,你本地的文件仓库不是最新的代码,所以在push之前要先使用: git pull #来拉取远程代码,每天写代码之前可以先用一次git pull,最后push代码时也用一次pull 2.git pull提示(git pull之前一定要先add和commit,否则会提示本地代码将被覆盖!!!): `remote: Enumerating objects: 14, done. `remote: Counting objects: 100% (14/14), done. `remote: Compressing objects: 100% (7/7), done. `remote: Total 9 (delta 3), reused 0 (delta 0), pack-reused 0 `Unpacking objects: 100% (9/9), done. `From gitee.com:alexandrmisko_admin/spring-front ` fe0907a..6ad2ed4 master -> origin/master `Auto-merging 王波.txt `CONFLICT (content): Merge conflict in 王波.txt `Automatic merge failed; fix conflicts and then commit the result. 这种情况是因为,A跟你改了同一个文件,并且A比你先提交上去;然后你push的时候会提示错误(上述问题一),此时你使用pull,就会提示这个错误;所以,要使用git status找到并进入到你俩同时修改的文件中去,此时文件中会标出来A改的内容和你改的内容,大家伙一起商量后,保留其一。接下来,再使用: git add . git commit -m ""; git push 命令就可以解决冲突了。 ``` ## 二、controller中注解、方法参数的使用 ### 1. @RestController - 该注解标识该controller类的所有方法返回值均是JSON格式。 - 所以,当我们使用该注解后,返回的任何String、Object、自定义类均会被自动转化为JSON形式,并返回至前端。(我们使用工具类R来规范JSON格式,可见下方R包的使用帮助) ### 2.@RequestMapping(value=“访问地址”,method=“get/post”) - 该注解标识controller的间接访问地址(相当于之前的servlet的地址映射`servlett-mapping`)。 - **该注解可用于两个地方:** - 类 - 方法 区别见如下: ```java @RequestMapping(value = "/admin") public class AdminController { @RequestMapping(value = "/login") public R adminLogin(String userName,String passWord){ ``` - 标在类上的`https://项目地址/admin`表示,该controller的整体访问地址是`https:///admin`,而当我们访问某个具体的`login`方法时,则须使用`https:///admin/login`来访问login方法。 - 该注解还有一些”变体“: - @PostMapping - 其实,postMapping注解内部的定义的时候,包含了@RequstMapping(method=get): - - @GetMapping - 实现与PostMapping类似 ### 3.@RequstParam > 每个方法可使用多个。 该注解放在方法参数前面。 - 当前端传给后端参数时,要是传递了好多个参数,spring咋知道把哪个赋给哪个? - 一般,你定义的参数名是啥,前端就得跟你的参数名相对应。 - 要是就想前后端用不一样的参数名呢? - 用`@RequstParam(value=”别名“)`,其中的Value字段就是你给参数起的`别名`,起了别名原来的名还能用吗?(我也没试过) - 还有@RequstParam(required=”true“),表示前端必须给你传这个参数,不传就不让请求。 ### 4.@PathVariable:star: ```java @RequestMapping(value = "/{admin_id}", method = RequestMethod.GET) public R oneAdmin(@PathVariable(value = "admin_id") Integer id){ Admin admin = adminService.findOneAdmin(id); ``` > PathVarible:就是说URL路径中就包含了将要传递的方法参数变量。 - 可以看到,`value = "/{admin_id}"`,与之前定义的不太一样。{variable}就是前端传给后端的变量,只不过没放在请求中,而是放在了URL中。看个例子: - `https://项目地址/admin/2`,该地址是请求`id=2`的admin的信息。 - 但是,方法怎么知道要用地址中的值作为参数呢? - 此时,就需要用到了`PathVariable`注解,其中的value值就和上边`RequestMapping`中的`{admin_id}`相对应,告诉方法,你要用的`id`请去地址中找。 ### 5.@RequestBody:star: > **每个方法只能使用一次**该注解,具体原因可search一下(和http的连接流有关好像)。 ```java public R adminRegister(@RequestBody(required = true) Admin admin){ ``` 这次,我们方法参数中直接放了个类`Admin`,这样可以吗?单独不可以,需要加上`@RequestBody`注解. - 当我们使用了@RequestBody后,spring就会为我们把前端传过来的**JSON格式的字符串**(**且只能是JSON格式**)自动封装成一个类。 - 那么,spring咋知道json里的哪个对应我们类中的字段呢? - 最常用的方法:前端传过来的JSON数据中,每一个key-value的key值均要与Admin类中的属性域一样。看图: - **前端JSON** - - 有其他对应方法吗?应该有:rofl:,**找到了补充一下**。 - @RequestBody(required = true),required=true表示该参数必须有,前端必须要传过来,不传就不让访问。其他的注解也有该属性,可以点进注解看看有没有。(使用`ctrl+LeftClick`) ### 6.@Authorization - 该注解使用在方法上,表示该方法在被请求时,要验证是否已经登录(后续可加上认证的验证)。 - 前端在请求controller时,均会经过LoginInterceptor过滤器,在该过滤器中完成验证的逻辑。 # 三、R工具类的更新 由于之前对于R工具类没有使用泛型,在前端接口文档处无法看到所返回的data信息,显示为空。所以,修改了一下R工具类。**之前的方法仍可以使用,但idea会 给出未检查(unchecked)的警告,可以暂时忽略该警告,不会影响运行。** 可以参考下面的例子,使用更改过的R类: 也可以使用其他构造方法,可以自己自定义,怎么好用就怎么来。 ```java public R> getActList(){ //返回时加上返回data参数的类型,如果为空则不用添加或使用即可 List list = activityService.getActList(); return new R>() //不再使用buidsuccess/fail方法,可以使用构造器创建R类 .addResultCode(ResultCode.OK) .addMessage("获取成功!") .addData(list); } ```