IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 后端小项目——简单商品管理 -> 正文阅读

[大数据]后端小项目——简单商品管理

前言

本次后端项目是学校课程的一个作业,但是也基本涵盖了后端开发的整个流程,所以记录一下。

一、环境及工具

SpringBoot 2.5.5
JDK1.8
IntelliJ IDEA 2021.2.2 (Ultimate Edition)
Postman
MySql
Navicat Premium
Python 3.7
VSCode

二、项目需求

模拟电子商务网站用户登录、添加商品、修改商品信息、批量删除商品、查询商品信息的功能,用户和商品信息存储在数据库中。

  1. 用户登录:学号和密码作为登录成功的信息,登录成功以JASON格式返回用户信息,登录失败返回登录失败信息。
  2. 添加商品:若用户已登录过,则允许接收添加商品的RESTful请求,商品信息以JASON格式传送,属性不限,商品信息添加至数据库中,返回添加成功信息;否则请求不执行。
    3.修改商品:若用户已登录过,则允许接收修改商品信息的RESTful请求,请求中传送需要修改的商品信息,商品信息以JASON格式传送,属性不限,根据传送的商品信息修改数据库中相应的数据,返回修改成功信息;否则请求不执行。
  3. 批量删除商品:若用户已登录过,则允许接收删除商品信息的RESTful请求,请求中传送要删除的所有商品的id值,删除数据库中相应的数据,返回删除成功信息;否则请求不执行。
  4. 查询商品:若用户已登录过,则允许接收查询商品信息的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() 方法创建一个游标对象 cursor
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)"
# 使用 execute()  方法执行 SQL 查询
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);

        // 将获取的json数据封装一层,然后在给返回
        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);

        // 将获取的json数据封装一层,然后在给返回
        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>

后端新手上路,如有不足,请多指教.

项目源码

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-26 12:16:31  更:2021-10-26 12:18:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:35:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码