前言
本次后端项目是学校课程的一个作业,但是也基本涵盖了后端开发的整个流程,所以记录一下。
一、环境及工具
SpringBoot 2.5.5 JDK1.8 IntelliJ IDEA 2021.2.2 (Ultimate Edition) Postman MySql Navicat Premium Python 3.7 VSCode
二、项目需求
模拟电子商务网站用户登录、添加商品、修改商品信息、批量删除商品、查询商品信息的功能,用户和商品信息存储在数据库中。
- 用户登录:学号和密码作为登录成功的信息,登录成功以JASON格式返回用户信息,登录失败返回登录失败信息。
- 添加商品:若用户已登录过,则允许接收添加商品的RESTful请求,商品信息以JASON格式传送,属性不限,商品信息添加至数据库中,返回添加成功信息;否则请求不执行。
3.修改商品:若用户已登录过,则允许接收修改商品信息的RESTful请求,请求中传送需要修改的商品信息,商品信息以JASON格式传送,属性不限,根据传送的商品信息修改数据库中相应的数据,返回修改成功信息;否则请求不执行。 - 批量删除商品:若用户已登录过,则允许接收删除商品信息的RESTful请求,请求中传送要删除的所有商品的id值,删除数据库中相应的数据,返回删除成功信息;否则请求不执行。
- 查询商品:若用户已登录过,则允许接收查询商品信息的RESTful请求,请求中传送要查询的商品名称(name)以及在分页显示中需要提供的页码(pages)和一页最多显示记录条数(limits),在数据库中查询商品名包含name的商品中的第(pages-1)limits+1到pageslimits条记录,如果查询到,以JASON格式返回查询到的所有商品信息,属性不限,否则返回查询失败信息。若用户未登陆过,则请求不执行。
三、搭建数据库
首先,在premium创建名为Commerce的数据库,创建用户表和商品表以及各字段,注意各个字段的类型,刚创建的时候因为学号设置的是int,直接超出MySql int类型的范围,所以改用了bigint. 为了有足够的数据,用Python批量加入数据(个人不太熟悉SQL的语法)。
import pymysql
db = pymysql.connect(host="localhost", user="root", password="123456", database="commerce")
print(db)
cursor = db.cursor()
sql_user="insert into user(user_id,pwd) value(%s,%s)"
sql_goods="insert into goods(goods_id,goods_name,price,message) value(%s,%s,%s,%s)"
goods_id=1001
user=[]
goods=[]
for user_id in range(2018329621202,2018329621301):
user.append((user_id,"123456"))
goods.append((goods_id,"商品名",goods_id,"商品"+str(goods_id)))
goods_id+=1
cursor.executemany(sql_user,user)
cursor.executemany(sql_goods,goods)
db.commit()
db.close()
致此,数据库的工作完成。
四、SpringBoot基本的配置
参考上一篇博客:SpringBoot入门
五、拦截器的使用
为了达到拦截未登录用户各种操作的需求,要用到拦截器,要了解拦截器工作的原理,必须先熟悉cookie和session。 cookie和session详解 首先创建拦截器,实现HandlerInterceptor接口,重载三个方法。 接下来,通过类来配置拦截器,记得加注解@Configuration.
六、JDBC的使用
1.添加依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2.写入配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/Commerce?serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
server:
port: 8083
3.测试
@RequestMapping(path = "/jdbc")
public String connect(@RequestParam(value = "user_id") String user_id) {
String sql = String.format("select * from user where user_id=%s", user_id);
List<Map<String, Object>> userList = jdbcTemplate.queryForList(sql);
return userList.toString();
}
七、各个功能的实现
1.登录验证
在这里要设置session,正常前后端开发谁验证谁设置。
@PostMapping(path = "/login")
public String login(@RequestParam(value = "user_id") String user_id, @RequestParam(value = "pwd") String pwd, HttpServletRequest request) {
String sql = String.format("select * from user where user_id=%s", user_id);
List<Map<String, Object>> userList = jdbcTemplate.queryForList(sql);
if (pwd.equals(userList.get(0).get("pwd"))) {
request.getSession().setAttribute("user_id", user_id);
return JSON.toJSONString(new User(user_id, pwd, "登录成功!"));
} else {
System.out.println(JSON.toJSONString(new User(null, null, "登录失败!")));
return JSON.toJSONString(new User(null, null, "登录失败!"));
}
}
2.添加商品
@RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public String add(@RequestBody JSONObject jsonParam) {
String id = jsonParam.get("goods_id").toString();
String name = jsonParam.get("goods_name").toString();
String price = jsonParam.get("goods_price").toString();
String message = jsonParam.get("goods_message").toString();
System.out.println(jsonParam);
String sql = String.format("insert into goods (goods_id,goods_name,price,message) values ( %s, '%s', %s, '%s')", id, name, price, message);
System.out.println(sql);
jdbcTemplate.execute(sql);
JSONObject result = new JSONObject();
result.put("message", "添加成功");
result.put("method", "json");
result.put("data", jsonParam);
return result.toString();
}
3.修改商品
@RequestMapping(value = "/change", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public String change(@RequestBody JSONObject jsonParam) {
String id = jsonParam.get("goods_id").toString();
String name = jsonParam.get("goods_name").toString();
String price = jsonParam.get("goods_price").toString();
String message = jsonParam.get("goods_message").toString();
String sql = String.format("update goods set goods_name='%s',price=%s,message='%s' where goods_id = %s ", name, price, message, id);
System.out.println(sql);
jdbcTemplate.execute(sql);
JSONObject result = new JSONObject();
result.put("msg", "ok");
result.put("message", "修改成功");
result.put("data", jsonParam);
return result.toString();
}
4.批量删除
@RequestMapping(value = "/delete", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public String delete(@RequestBody JSONObject jsonObject) {
ArrayList ids = (ArrayList) jsonObject.get("ids");
for (int i = 0; i < ids.size(); i++) {
System.out.println(ids.get(i));
String sql = String.format("delete from goods where goods_id=%s", ids.get(i));
jdbcTemplate.execute(sql);
}
JSONObject result = new JSONObject();
result.put("msg", "ok");
result.put("message", "删除成功");
return result.toString();
}
5.查询商品
@PostMapping(path = "/query")
public String query(@RequestParam(value = "name") String goods_name,@RequestParam(value = "pages") int pages,@RequestParam(value = "limits") int limits) {
String sql=String.format("select * from goods where goods_name='%s'",goods_name);
List list = jdbcTemplate.queryForList(sql);
return JSON.toJSONString(list.subList((pages-1)*limits,pages*limits));
}
致此,各个功能都已实现。
八、总结
这个项目是一个很小的项目,但是在实现的过程中也遇到了许多问题,主要有以下几个问题: ????????1.Java连接数据库执行sql语句时,对于所有的非数值类型都要加上单引号!!! ????????2.对于session理解不深入,导致耽搁了挺久。 ????????3.Java后端的注解一定不要忘了加!也别搞混淆,比如RequestBody和ResponseBody. 另外,本次项目中还用到了阿里的一个fastjson包。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
后端新手上路,如有不足,请多指教.
项目源码
|