• 基于SSM的毕业论文答辩系统


    末尾获取源码
    开发语言:Java
    Java开发工具:JDK1.8
    后端框架:SSM
    前端:采用Vue技术开发
    数据库:MySQL5.7和Navicat管理工具结合
    服务器:Tomcat8.5
    开发软件:IDEA / Eclipse
    是否Maven项目:是

    目录

    一、项目简介

    二、系统功能

    三、系统项目截图

    3.1前台首页

    3.2后台管理

    四、核心代码

    4.1登录相关

    4.2论文信息接口

    4.3选题信息


    一、项目简介

    毕业论文答辩系统利用网络沟通、计算机信息存储管理,有着与传统的方式所无法替代的优点。比如计算检索速度特别快、可靠性特别高、存储容量特别大、保密性特别好、可保存时间特别长、成本特别低等。在工作效率上,能够得到极大地提高,延伸至服务水平也会有好的收获,有了网络,毕业论文答辩系统的各方面的管理更加科学和系统,更加规范和简便。

    二、系统功能

    本毕业论文答辩系统主要包括三大功能模块,即管理员模块、教师模块和学生模块。

    (1)管理员模块:主要功能有:首页、个人中心、学生管理、教师管理、课题信息管理、选题信息管理、论文信息管理、论文评分管理、答辩通知管理、成绩评定管理、系统管理。 

    (2)教师用户:首页、个人中心、课题信息管理、选题信息管理、论文信息管理、论文评分管理、答辩通知管理、成绩评定管理。

    (3)学生:首页、个人中心、选题信息管理、论文信息管理、论文评分管理、成绩评定管理。


    三、系统项目截图

    3.1前台首页 

    3.2后台管理

    管理员后台页面

    教师后台页面

    学生后台页面

    四、核心代码

    4.1登录相关

    1. package com.controller;
    2. import java.util.Arrays;
    3. import java.util.Calendar;
    4. import java.util.Date;
    5. import java.util.Map;
    6. import javax.servlet.http.HttpServletRequest;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.stereotype.Controller;
    9. import org.springframework.web.bind.annotation.GetMapping;
    10. import org.springframework.web.bind.annotation.PathVariable;
    11. import org.springframework.web.bind.annotation.PostMapping;
    12. import org.springframework.web.bind.annotation.RequestBody;
    13. import org.springframework.web.bind.annotation.RequestMapping;
    14. import org.springframework.web.bind.annotation.RequestParam;
    15. import org.springframework.web.bind.annotation.ResponseBody;
    16. import org.springframework.web.bind.annotation.RestController;
    17. import com.annotation.IgnoreAuth;
    18. import com.baomidou.mybatisplus.mapper.EntityWrapper;
    19. import com.entity.TokenEntity;
    20. import com.entity.UserEntity;
    21. import com.service.TokenService;
    22. import com.service.UserService;
    23. import com.utils.CommonUtil;
    24. import com.utils.MD5Util;
    25. import com.utils.MPUtil;
    26. import com.utils.PageUtils;
    27. import com.utils.R;
    28. import com.utils.ValidatorUtils;
    29. /**
    30. * 登录相关
    31. */
    32. @RequestMapping("users")
    33. @RestController
    34. public class UserController{
    35. @Autowired
    36. private UserService userService;
    37. @Autowired
    38. private TokenService tokenService;
    39. /**
    40. * 登录
    41. */
    42. @IgnoreAuth
    43. @PostMapping(value = "/login")
    44. public R login(String username, String password, String captcha, HttpServletRequest request) {
    45. UserEntity user = userService.selectOne(new EntityWrapper().eq("username", username));
    46. if(user==null || !user.getPassword().equals(password)) {
    47. return R.error("账号或密码不正确");
    48. }
    49. String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
    50. return R.ok().put("token", token);
    51. }
    52. /**
    53. * 注册
    54. */
    55. @IgnoreAuth
    56. @PostMapping(value = "/register")
    57. public R register(@RequestBody UserEntity user){
    58. // ValidatorUtils.validateEntity(user);
    59. if(userService.selectOne(new EntityWrapper().eq("username", user.getUsername())) !=null) {
    60. return R.error("用户已存在");
    61. }
    62. userService.insert(user);
    63. return R.ok();
    64. }
    65. /**
    66. * 退出
    67. */
    68. @GetMapping(value = "logout")
    69. public R logout(HttpServletRequest request) {
    70. request.getSession().invalidate();
    71. return R.ok("退出成功");
    72. }
    73. /**
    74. * 密码重置
    75. */
    76. @IgnoreAuth
    77. @RequestMapping(value = "/resetPass")
    78. public R resetPass(String username, HttpServletRequest request){
    79. UserEntity user = userService.selectOne(new EntityWrapper().eq("username", username));
    80. if(user==null) {
    81. return R.error("账号不存在");
    82. }
    83. user.setPassword("123456");
    84. userService.update(user,null);
    85. return R.ok("密码已重置为:123456");
    86. }
    87. /**
    88. * 列表
    89. */
    90. @RequestMapping("/page")
    91. public R page(@RequestParam Map params,UserEntity user){
    92. EntityWrapper ew = new EntityWrapper();
    93. PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
    94. return R.ok().put("data", page);
    95. }
    96. /**
    97. * 列表
    98. */
    99. @RequestMapping("/list")
    100. public R list( UserEntity user){
    101. EntityWrapper ew = new EntityWrapper();
    102. ew.allEq(MPUtil.allEQMapPre( user, "user"));
    103. return R.ok().put("data", userService.selectListView(ew));
    104. }
    105. /**
    106. * 信息
    107. */
    108. @RequestMapping("/info/{id}")
    109. public R info(@PathVariable("id") String id){
    110. UserEntity user = userService.selectById(id);
    111. return R.ok().put("data", user);
    112. }
    113. /**
    114. * 获取用户的session用户信息
    115. */
    116. @RequestMapping("/session")
    117. public R getCurrUser(HttpServletRequest request){
    118. Long id = (Long)request.getSession().getAttribute("userId");
    119. UserEntity user = userService.selectById(id);
    120. return R.ok().put("data", user);
    121. }
    122. /**
    123. * 保存
    124. */
    125. @PostMapping("/save")
    126. public R save(@RequestBody UserEntity user){
    127. // ValidatorUtils.validateEntity(user);
    128. if(userService.selectOne(new EntityWrapper().eq("username", user.getUsername())) !=null) {
    129. return R.error("用户已存在");
    130. }
    131. userService.insert(user);
    132. return R.ok();
    133. }
    134. /**
    135. * 修改
    136. */
    137. @RequestMapping("/update")
    138. public R update(@RequestBody UserEntity user){
    139. // ValidatorUtils.validateEntity(user);
    140. userService.updateById(user);//全部更新
    141. return R.ok();
    142. }
    143. /**
    144. * 删除
    145. */
    146. @RequestMapping("/delete")
    147. public R delete(@RequestBody Long[] ids){
    148. userService.deleteBatchIds(Arrays.asList(ids));
    149. return R.ok();
    150. }
    151. }

    4.2论文信息接口

    1. package com.controller;
    2. import java.text.SimpleDateFormat;
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.Calendar;
    6. import java.util.Map;
    7. import java.util.HashMap;
    8. import java.util.Iterator;
    9. import java.util.Date;
    10. import java.util.List;
    11. import javax.servlet.http.HttpServletRequest;
    12. import com.utils.ValidatorUtils;
    13. import org.apache.commons.lang3.StringUtils;
    14. import org.springframework.beans.factory.annotation.Autowired;
    15. import org.springframework.web.bind.annotation.PathVariable;
    16. import org.springframework.web.bind.annotation.RequestBody;
    17. import org.springframework.web.bind.annotation.RequestMapping;
    18. import org.springframework.web.bind.annotation.RequestParam;
    19. import org.springframework.web.bind.annotation.RestController;
    20. import com.baomidou.mybatisplus.mapper.EntityWrapper;
    21. import com.baomidou.mybatisplus.mapper.Wrapper;
    22. import com.annotation.IgnoreAuth;
    23. import com.entity.LunwenxinxiEntity;
    24. import com.entity.view.LunwenxinxiView;
    25. import com.service.LunwenxinxiService;
    26. import com.service.TokenService;
    27. import com.utils.PageUtils;
    28. import com.utils.R;
    29. import com.utils.MD5Util;
    30. import com.utils.MPUtil;
    31. import com.utils.CommonUtil;
    32. /**
    33. * 论文信息
    34. * 后端接口
    35. * @author
    36. * @email
    37. * @date 2021-02-20 13:39:03
    38. */
    39. @RestController
    40. @RequestMapping("/lunwenxinxi")
    41. public class LunwenxinxiController {
    42. @Autowired
    43. private LunwenxinxiService lunwenxinxiService;
    44. /**
    45. * 后端列表
    46. */
    47. @RequestMapping("/page")
    48. public R page(@RequestParam Map params,LunwenxinxiEntity lunwenxinxi, HttpServletRequest request){
    49. String tableName = request.getSession().getAttribute("tableName").toString();
    50. if(tableName.equals("jiaoshi")) {
    51. lunwenxinxi.setJiaoshigonghao((String)request.getSession().getAttribute("username"));
    52. }
    53. if(tableName.equals("xuesheng")) {
    54. lunwenxinxi.setXuejihao((String)request.getSession().getAttribute("username"));
    55. }
    56. EntityWrapper ew = new EntityWrapper();
    57. PageUtils page = lunwenxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, lunwenxinxi), params), params));
    58. return R.ok().put("data", page);
    59. }
    60. /**
    61. * 前端列表
    62. */
    63. @RequestMapping("/list")
    64. public R list(@RequestParam Map params,LunwenxinxiEntity lunwenxinxi, HttpServletRequest request){
    65. EntityWrapper ew = new EntityWrapper();
    66. PageUtils page = lunwenxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, lunwenxinxi), params), params));
    67. return R.ok().put("data", page);
    68. }
    69. /**
    70. * 列表
    71. */
    72. @RequestMapping("/lists")
    73. public R list( LunwenxinxiEntity lunwenxinxi){
    74. EntityWrapper ew = new EntityWrapper();
    75. ew.allEq(MPUtil.allEQMapPre( lunwenxinxi, "lunwenxinxi"));
    76. return R.ok().put("data", lunwenxinxiService.selectListView(ew));
    77. }
    78. /**
    79. * 查询
    80. */
    81. @RequestMapping("/query")
    82. public R query(LunwenxinxiEntity lunwenxinxi){
    83. EntityWrapper< LunwenxinxiEntity> ew = new EntityWrapper< LunwenxinxiEntity>();
    84. ew.allEq(MPUtil.allEQMapPre( lunwenxinxi, "lunwenxinxi"));
    85. LunwenxinxiView lunwenxinxiView = lunwenxinxiService.selectView(ew);
    86. return R.ok("查询论文信息成功").put("data", lunwenxinxiView);
    87. }
    88. /**
    89. * 后端详情
    90. */
    91. @RequestMapping("/info/{id}")
    92. public R info(@PathVariable("id") Long id){
    93. LunwenxinxiEntity lunwenxinxi = lunwenxinxiService.selectById(id);
    94. return R.ok().put("data", lunwenxinxi);
    95. }
    96. /**
    97. * 前端详情
    98. */
    99. @RequestMapping("/detail/{id}")
    100. public R detail(@PathVariable("id") Long id){
    101. LunwenxinxiEntity lunwenxinxi = lunwenxinxiService.selectById(id);
    102. return R.ok().put("data", lunwenxinxi);
    103. }
    104. /**
    105. * 后端保存
    106. */
    107. @RequestMapping("/save")
    108. public R save(@RequestBody LunwenxinxiEntity lunwenxinxi, HttpServletRequest request){
    109. lunwenxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    110. //ValidatorUtils.validateEntity(lunwenxinxi);
    111. lunwenxinxiService.insert(lunwenxinxi);
    112. return R.ok();
    113. }
    114. /**
    115. * 前端保存
    116. */
    117. @RequestMapping("/add")
    118. public R add(@RequestBody LunwenxinxiEntity lunwenxinxi, HttpServletRequest request){
    119. lunwenxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    120. //ValidatorUtils.validateEntity(lunwenxinxi);
    121. lunwenxinxiService.insert(lunwenxinxi);
    122. return R.ok();
    123. }
    124. /**
    125. * 修改
    126. */
    127. @RequestMapping("/update")
    128. public R update(@RequestBody LunwenxinxiEntity lunwenxinxi, HttpServletRequest request){
    129. //ValidatorUtils.validateEntity(lunwenxinxi);
    130. lunwenxinxiService.updateById(lunwenxinxi);//全部更新
    131. return R.ok();
    132. }
    133. /**
    134. * 删除
    135. */
    136. @RequestMapping("/delete")
    137. public R delete(@RequestBody Long[] ids){
    138. lunwenxinxiService.deleteBatchIds(Arrays.asList(ids));
    139. return R.ok();
    140. }
    141. /**
    142. * 提醒接口
    143. */
    144. @RequestMapping("/remind/{columnName}/{type}")
    145. public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
    146. @PathVariable("type") String type,@RequestParam Map map) {
    147. map.put("column", columnName);
    148. map.put("type", type);
    149. if(type.equals("2")) {
    150. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    151. Calendar c = Calendar.getInstance();
    152. Date remindStartDate = null;
    153. Date remindEndDate = null;
    154. if(map.get("remindstart")!=null) {
    155. Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
    156. c.setTime(new Date());
    157. c.add(Calendar.DAY_OF_MONTH,remindStart);
    158. remindStartDate = c.getTime();
    159. map.put("remindstart", sdf.format(remindStartDate));
    160. }
    161. if(map.get("remindend")!=null) {
    162. Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
    163. c.setTime(new Date());
    164. c.add(Calendar.DAY_OF_MONTH,remindEnd);
    165. remindEndDate = c.getTime();
    166. map.put("remindend", sdf.format(remindEndDate));
    167. }
    168. }
    169. Wrapper wrapper = new EntityWrapper();
    170. if(map.get("remindstart")!=null) {
    171. wrapper.ge(columnName, map.get("remindstart"));
    172. }
    173. if(map.get("remindend")!=null) {
    174. wrapper.le(columnName, map.get("remindend"));
    175. }
    176. String tableName = request.getSession().getAttribute("tableName").toString();
    177. if(tableName.equals("jiaoshi")) {
    178. wrapper.eq("jiaoshigonghao", (String)request.getSession().getAttribute("username"));
    179. }
    180. if(tableName.equals("xuesheng")) {
    181. wrapper.eq("xuejihao", (String)request.getSession().getAttribute("username"));
    182. }
    183. int count = lunwenxinxiService.selectCount(wrapper);
    184. return R.ok().put("count", count);
    185. }
    186. }

    4.3选题信息

    1. package com.controller;
    2. import java.text.SimpleDateFormat;
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.Calendar;
    6. import java.util.Map;
    7. import java.util.HashMap;
    8. import java.util.Iterator;
    9. import java.util.Date;
    10. import java.util.List;
    11. import javax.servlet.http.HttpServletRequest;
    12. import com.utils.ValidatorUtils;
    13. import org.apache.commons.lang3.StringUtils;
    14. import org.springframework.beans.factory.annotation.Autowired;
    15. import org.springframework.web.bind.annotation.PathVariable;
    16. import org.springframework.web.bind.annotation.RequestBody;
    17. import org.springframework.web.bind.annotation.RequestMapping;
    18. import org.springframework.web.bind.annotation.RequestParam;
    19. import org.springframework.web.bind.annotation.RestController;
    20. import com.baomidou.mybatisplus.mapper.EntityWrapper;
    21. import com.baomidou.mybatisplus.mapper.Wrapper;
    22. import com.annotation.IgnoreAuth;
    23. import com.entity.XuantixinxiEntity;
    24. import com.entity.view.XuantixinxiView;
    25. import com.service.XuantixinxiService;
    26. import com.service.TokenService;
    27. import com.utils.PageUtils;
    28. import com.utils.R;
    29. import com.utils.MD5Util;
    30. import com.utils.MPUtil;
    31. import com.utils.CommonUtil;
    32. /**
    33. * 选题信息
    34. * 后端接口
    35. * @author
    36. * @email
    37. * @date 2021-02-20 13:39:03
    38. */
    39. @RestController
    40. @RequestMapping("/xuantixinxi")
    41. public class XuantixinxiController {
    42. @Autowired
    43. private XuantixinxiService xuantixinxiService;
    44. /**
    45. * 后端列表
    46. */
    47. @RequestMapping("/page")
    48. public R page(@RequestParam Map params,XuantixinxiEntity xuantixinxi, HttpServletRequest request){
    49. String tableName = request.getSession().getAttribute("tableName").toString();
    50. if(tableName.equals("jiaoshi")) {
    51. xuantixinxi.setJiaoshigonghao((String)request.getSession().getAttribute("username"));
    52. }
    53. if(tableName.equals("xuesheng")) {
    54. xuantixinxi.setXuejihao((String)request.getSession().getAttribute("username"));
    55. }
    56. EntityWrapper ew = new EntityWrapper();
    57. PageUtils page = xuantixinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xuantixinxi), params), params));
    58. return R.ok().put("data", page);
    59. }
    60. /**
    61. * 前端列表
    62. */
    63. @RequestMapping("/list")
    64. public R list(@RequestParam Map params,XuantixinxiEntity xuantixinxi, HttpServletRequest request){
    65. String tableName = request.getSession().getAttribute("tableName").toString();
    66. if(tableName.equals("jiaoshi")) {
    67. xuantixinxi.setJiaoshigonghao((String)request.getSession().getAttribute("username"));
    68. }
    69. if(tableName.equals("xuesheng")) {
    70. xuantixinxi.setXuejihao((String)request.getSession().getAttribute("username"));
    71. }
    72. EntityWrapper ew = new EntityWrapper();
    73. PageUtils page = xuantixinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xuantixinxi), params), params));
    74. return R.ok().put("data", page);
    75. }
    76. /**
    77. * 列表
    78. */
    79. @RequestMapping("/lists")
    80. public R list( XuantixinxiEntity xuantixinxi){
    81. EntityWrapper ew = new EntityWrapper();
    82. ew.allEq(MPUtil.allEQMapPre( xuantixinxi, "xuantixinxi"));
    83. return R.ok().put("data", xuantixinxiService.selectListView(ew));
    84. }
    85. /**
    86. * 查询
    87. */
    88. @RequestMapping("/query")
    89. public R query(XuantixinxiEntity xuantixinxi){
    90. EntityWrapper< XuantixinxiEntity> ew = new EntityWrapper< XuantixinxiEntity>();
    91. ew.allEq(MPUtil.allEQMapPre( xuantixinxi, "xuantixinxi"));
    92. XuantixinxiView xuantixinxiView = xuantixinxiService.selectView(ew);
    93. return R.ok("查询选题信息成功").put("data", xuantixinxiView);
    94. }
    95. /**
    96. * 后端详情
    97. */
    98. @RequestMapping("/info/{id}")
    99. public R info(@PathVariable("id") Long id){
    100. XuantixinxiEntity xuantixinxi = xuantixinxiService.selectById(id);
    101. return R.ok().put("data", xuantixinxi);
    102. }
    103. /**
    104. * 前端详情
    105. */
    106. @RequestMapping("/detail/{id}")
    107. public R detail(@PathVariable("id") Long id){
    108. XuantixinxiEntity xuantixinxi = xuantixinxiService.selectById(id);
    109. return R.ok().put("data", xuantixinxi);
    110. }
    111. /**
    112. * 后端保存
    113. */
    114. @RequestMapping("/save")
    115. public R save(@RequestBody XuantixinxiEntity xuantixinxi, HttpServletRequest request){
    116. xuantixinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    117. //ValidatorUtils.validateEntity(xuantixinxi);
    118. xuantixinxiService.insert(xuantixinxi);
    119. return R.ok();
    120. }
    121. /**
    122. * 前端保存
    123. */
    124. @RequestMapping("/add")
    125. public R add(@RequestBody XuantixinxiEntity xuantixinxi, HttpServletRequest request){
    126. xuantixinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    127. //ValidatorUtils.validateEntity(xuantixinxi);
    128. xuantixinxi.setUserid((Long)request.getSession().getAttribute("userId"));
    129. xuantixinxiService.insert(xuantixinxi);
    130. return R.ok();
    131. }
    132. /**
    133. * 修改
    134. */
    135. @RequestMapping("/update")
    136. public R update(@RequestBody XuantixinxiEntity xuantixinxi, HttpServletRequest request){
    137. //ValidatorUtils.validateEntity(xuantixinxi);
    138. xuantixinxiService.updateById(xuantixinxi);//全部更新
    139. return R.ok();
    140. }
    141. /**
    142. * 删除
    143. */
    144. @RequestMapping("/delete")
    145. public R delete(@RequestBody Long[] ids){
    146. xuantixinxiService.deleteBatchIds(Arrays.asList(ids));
    147. return R.ok();
    148. }
    149. /**
    150. * 提醒接口
    151. */
    152. @RequestMapping("/remind/{columnName}/{type}")
    153. public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
    154. @PathVariable("type") String type,@RequestParam Map map) {
    155. map.put("column", columnName);
    156. map.put("type", type);
    157. if(type.equals("2")) {
    158. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    159. Calendar c = Calendar.getInstance();
    160. Date remindStartDate = null;
    161. Date remindEndDate = null;
    162. if(map.get("remindstart")!=null) {
    163. Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
    164. c.setTime(new Date());
    165. c.add(Calendar.DAY_OF_MONTH,remindStart);
    166. remindStartDate = c.getTime();
    167. map.put("remindstart", sdf.format(remindStartDate));
    168. }
    169. if(map.get("remindend")!=null) {
    170. Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
    171. c.setTime(new Date());
    172. c.add(Calendar.DAY_OF_MONTH,remindEnd);
    173. remindEndDate = c.getTime();
    174. map.put("remindend", sdf.format(remindEndDate));
    175. }
    176. }
    177. Wrapper wrapper = new EntityWrapper();
    178. if(map.get("remindstart")!=null) {
    179. wrapper.ge(columnName, map.get("remindstart"));
    180. }
    181. if(map.get("remindend")!=null) {
    182. wrapper.le(columnName, map.get("remindend"));
    183. }
    184. String tableName = request.getSession().getAttribute("tableName").toString();
    185. if(tableName.equals("jiaoshi")) {
    186. wrapper.eq("jiaoshigonghao", (String)request.getSession().getAttribute("username"));
    187. }
    188. if(tableName.equals("xuesheng")) {
    189. wrapper.eq("xuejihao", (String)request.getSession().getAttribute("username"));
    190. }
    191. int count = xuantixinxiService.selectCount(wrapper);
    192. return R.ok().put("count", count);
    193. }
    194. }

  • 相关阅读:
    谈谈Redis中的多路复用
    八、Thymeleaf链接表达式
    手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集(含源码)
    vue:使用:element 中弹框中获取table高度无效
    云服务器怎样选购?
    嵌入式软件架构设计-模块化
    Ubuntu18.04 实现:安装turtlebot3功能包、虚拟机与机器人之间的网络配置、测试机器人Cartographer建图
    【07节】Python3+Selenium4自动化 unittest 测试框架详解
    Gradle基础知识-Wrapper,Daeman;Groovy闭包语法
    axios入门
  • 原文地址:https://blog.csdn.net/weixin_52721608/article/details/127454038