【store商城项目05】新增收获地址的开发

news2024/9/25 5:23:37

新增收获地址的开发

  • 1.创建地址表
  • 2.创建实体类
  • 3.持久层的开发
    • 3.1规划需要执行的SQL语句
    • 3.2Mapper接口与抽象方法
    • 3.3配置SQL映射
    • 3.4测试
  • 4.业务层的开发
    • 4.1规划异常
    • 4.2接口和抽象方法
    • 4.3实现抽象方法
    • 4.4测试
  • 5.控制层的开发
    • 5.1规划异常
    • 5.2设计请求
    • 5.3处理请求
    • 5.4测试
  • 6前端页面

1.创建地址表

CREATE TABLE t_address (
	aid INT AUTO_INCREMENT COMMENT '收货地址id',
	uid INT COMMENT '归属的用户id',
	name VARCHAR(20) COMMENT '收货人姓名',
	province_name VARCHAR(15) COMMENT '省-名称',
	province_code CHAR(6) COMMENT '省-行政代号',
	city_name VARCHAR(15) COMMENT '市-名称',
	city_code CHAR(6) COMMENT '市-行政代号',
	area_name VARCHAR(15) COMMENT '区-名称',
	area_code CHAR(6) COMMENT '区-行政代号',
	zip CHAR(6) COMMENT '邮政编码',
	address VARCHAR(50) COMMENT '详细地址',
	phone VARCHAR(20) COMMENT '手机',
	tel VARCHAR(20) COMMENT '固话',
	tag VARCHAR(6) COMMENT '标签',
	is_default INT COMMENT '是否默认:0-不默认,1-默认',
	created_user VARCHAR(20) COMMENT '创建人',
	created_time DATETIME COMMENT '创建时间',
	modified_user VARCHAR(20) COMMENT '修改人',
	modified_time DATETIME COMMENT '修改时间',
	PRIMARY KEY (aid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.创建实体类

创建com.cy.store.entity.Address新增收获地址的实体类,继承自BaseEntity类,在类中声明与数据表中对应的属性,添加Getters and Setters方法,基于唯一标识aid生成hashCode()和equals()方法。

public class Address extends BaseEntity{
    private Integer aid;
    private Integer uid;
    private String name;
    private String provinceName;
    private String provinceCode;
    private String cityName;
    private String cityCode;
    private String areaName;
    private String areaCode;
    private String zip;
    private String address;
    private String phone;
    private String tel;
    private String tag;
    private Integer isDefault;
// Generate: Getter and Setter、Generate hashCode() and equals()、toString()
}

3.持久层的开发

3.1规划需要执行的SQL语句

新增收获地址,本质上就是执行插入,SQL语句如下:

insert into t_address (字段) values (属性)
select count(*) from t_address where uid=?

3.2Mapper接口与抽象方法

创建com.sdjzu.store.mapper.AddressMapper接口,并在接口中创建抽象方法。

package com.sdjzu.store.mapper;


import com.sdjzu.store.entity.Address;

public interface AddressMapper {
    /*新增收获地址*/

    /**
     * 插入用户收货地址
     * @param address 收货地址数据
     * @return 返回受影响的行数
     */
    Integer insert(Address address);
    /*根据id查询记录数*/

    /**
     * 获取用户收货地址的数量
     * @param uid 用户的id
     * @return 用户收货地址的数量
     */
    Integer countById(Integer uid);

}

3.3配置SQL映射

在AddressMapper.xml中编写两个抽象方法的映射

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名就是接口的全类名-->
<mapper namespace="com.sdjzu.store.mapper.AddressMapper">
    <resultMap id="AddressEntityMap" type="com.sdjzu.store.entity.Address">
        <id column="aid" property="aid"/>
        <result column="province_code" property="provinceCode"/>
        <result column="province_name" property="provinceName"/>
        <result column="city_code" property="cityCode"/>
        <result column="city_name" property="cityName"/>
        <result column="area_code" property="areaCode"/>
        <result column="area_name" property="areaName"/>
        <result column="is_default" property="isDefault"/>
        <result column="created_user" property="createdUser"/>
        <result column="created_time" property="createdTime"/>
        <result column="modified_user" property="modifiedUser"/>
        <result column="modified_time" property="modifiedTime"/>
    </resultMap>
    <!--Integer insert(Address address);-->
    <insert id="insert" useGeneratedKeys="true" keyProperty="aid">
        insert into t_address (
            uid, name, province_name, province_code, city_name, city_code, area_name, area_code, zip,
            address, phone, tel,tag, is_default, created_user, created_time, modified_user, modified_time
        )values(
            #{uid}, #{name}, #{provinceName}, #{provinceCode}, #{cityName}, #{cityCode}, #{areaName},
            #{areaCode}, #{zip}, #{address}, #{phone}, #{tel}, #{tag}, #{isDefault}, #{createdUser},
            #{createdTime}, #{modifiedUser}, #{modifiedTime}
        )
    </insert>
    <!--Integer countById(Integer uid);-->
    <select id="countById" resultType="java.lang.Integer">
        select count(*) from t_address where uid=#{uid}
    </select>

</mapper>

3.4测试

    @Test
    public void insert(){
        Address address = new Address();
        address.setUid(38);
        address.setName("dyj");
        address.setAddress("龙湖");
        address.setPhone("123345");
        addressMapper.insert(address);
    }
    @Test
    public void count(){
        Integer integer = addressMapper.countById(38);
        System.out.println(integer);
    }

4.业务层的开发

4.1规划异常

收获地址不可以超过20,超过了就会跑业务层的异常

package com.sdjzu.store.service.ex;

public class AddressCountLimitException extends ServiceException{
    public AddressCountLimitException() {
        super();
    }

    public AddressCountLimitException(String message) {
        super(message);
    }

    public AddressCountLimitException(String message, Throwable cause) {
        super(message, cause);
    }

    public AddressCountLimitException(Throwable cause) {
        super(cause);
    }

    protected AddressCountLimitException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

4.2接口和抽象方法

package com.sdjzu.store.service;

import com.sdjzu.store.entity.Address;

/*收获地址管理*/
public interface IAddressService {
    /**
     * 新增收获地址
     * @param uid 根据uid获取收获地址
     * @param username 更新表中的数据
     * @param address 表单提交的数据你
     */
    void addAddress(Integer uid, String username, Address address);
}

4.3实现抽象方法

package com.sdjzu.store.service.impl;

import com.sdjzu.store.entity.Address;
import com.sdjzu.store.mapper.AddressMapper;
import com.sdjzu.store.service.IAddressService;
import com.sdjzu.store.service.ex.AddressCountLimitException;
import com.sdjzu.store.service.ex.InsertException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Date;
@Service
public class AddressServiceImpl implements IAddressService {
    @Autowired
    private AddressMapper addressMapper;
    @Value("${user.address.maxCount}")
    private int maxCount;
    @Override
    public void addAddress(Integer uid, String username, Address address) {
        /*判断收获地址的数量*/
        Integer row = addressMapper.countById(uid);
        if(row>maxCount){
            throw new AddressCountLimitException("数量超过20");
        }
        /*封装数据*/
        address.setUid(uid);
        address.setCreatedUser(username);
        address.setModifiedUser(username);
        address.setCreatedTime(new Date());
        address.setModifiedTime(new Date());
        /*判断是否为默认地址*/
        Integer isDefault = row == 0 ? 1:0;
        address.setIsDefault(isDefault);
        /*调用插入的方法,并判断受影响的行数,判断是否插入成功*/
        Integer insert = addressMapper.insert(address);
        if(insert==0){
            throw new InsertException("插入失败");
        }

    }
}

4.4测试

package com.sdjzu.store.service;

import com.sdjzu.store.entity.Address;
import com.sdjzu.store.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
public class AddressServiceTest {
    @Autowired
    private IAddressService addressService;
    @Test
    public void insert(){
        Address address = new Address();
        address.setName("dyj");
        address.setAddress("龙湖");
        address.setPhone("123345");
        addressService.addAddress(38,"ljl",address);
    }
}

5.控制层的开发

5.1规划异常

else if (e instanceof AddressCountLimitException) {
            result.setState(4000);
        }

5.2设计请求

请求路径:/address/addAddress
请求参数:Address address,HttpSession session
请求类型: POST
响应结果: JsonResult

5.3处理请求

    @RequestMapping("addAddress")
    public JsonResult<Void> addAddress(HttpSession session, Address address){
        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        addressService.addAddress(uid,username,address);
        return new JsonResult<>(ok);
    }

5.4测试

先启动项目,再访问http://localhost:8080/store/address/addAddress
在这里插入图片描述

6前端页面

1.在addAddress.html页面中配置新增收货地址表单的属性。给form表单添加id="form-add-new-address"属性、"请输入收货人姓名"添加name="name"属性、"请输入邮政编码"添加name="zip"属性、"输入详细的收货地址,小区名称、门牌号等"添加name="address"属性、"请输入手机号码"添加name="phone"属性、"请输入固定电话号码"添加name="tel"属性、"请输入地址类型,如:家、公司或者学校"添加name="tag"属性、"保存"按钮添加id="btn-add-new-address"属性。以上属性如果已经添加无需重复添加。

2.在addAddress.html页面中body标签内部的最后,添加script标签用于编写JavaScript程序。

	<script type="text/javascript">
		$("#btn-add-new-address").click(function () {
			$.ajax({
				url: "/address/addAddress",
				type: "POST",
				data: $("#form-add-new-address").serialize(),
				success: function (json) {
					if(json.sate==200){
						alert("新增成功");
					}else {
						alert("新增失败");
					}
				},
				error: function (xhr) {
					alert("登录过期");
					location.href="login.html";
				}
			})
		})
	</script>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Linux权限(二)默认权限的来源

默认权限1.默认权限2.默认权限&#xff08;最终权限&#xff09;由谁决定2.1起始权限2.2umask&#xff08;权限掩码&#xff09;2.3 最终权限的计算3.总结1.默认权限 在Linux下&#xff0c;我们以普通用户创建一个普通文件&#xff0c; 这个普通文件(这里不包括可执行)的默认权…

萤石网络IPO首日破发:市值缩水20亿元,海康威视为控股股东

12月28日&#xff0c;杭州萤石网络股份有限公司&#xff08;下称“萤石网络”&#xff0c;SH:688475&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;萤石网络的发行价为28.77元/股&#xff0c;发行1.13亿股&#xff0c;募资总额为32.51亿元&#xff0c;总市值约…

【1.1】认识微服务--服务架构演变

认识微服务--服务架构演变单体架构分布式架构服务治理微服务微服务架构特征小结知识内容来自于黑马程序员视频教学和百度百科。博主仅作笔记整理便于回顾学习。如有侵权请私信我。 单体架构 单体架构&#xff1a; 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包…

线性规划求解-MATLAB Lingo Python实现

线性规划求解-MATLAB Lingo Python实现 线性规划 线性规划是辅助人们进行科学管理的一种数学方法&#xff0c;是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。其展开形式可以表示为如下形式&#xff1a; Max⁡(Min⁡)zc1x1c2x2…cnxns.t. {a11x1a12x2⋯a1nxn≥…

2022年度十大科学突破榜单出炉!

科学的进步在很大程度上推动着人类社会的发展。而了解最新年度科学突破&#xff0c;有助于引领我们知晓世界科学进展&#xff0c;看清楚未来方向。故此&#xff0c;知识人网小编本期介绍《科学》杂志最新公布的2022年科学突破榜单。 12月16日&#xff0c;美国《科学》杂志网站列…

一种时间复杂度为O(2ⁿ)、空间复杂度为O(n)的子集和问题的算法

子集和问题&#xff08;Subset-Sum Problem, SSP&#xff09;是说给定一个自然数集合S{a1,a2,⋯,an}S\{a_1,a_2,\cdots,a_n\}S{a1​,a2​,⋯,an​}&#xff0c;它含有nnn个元素&#xff0c;现在又给定一个自然数sss&#xff0c;问是否存在SSS的一个子集TTT使得TTT的所有元素之和…

JavaScript 隐秘者 | Console.xxx竟然如此好用

JavaScript 隐秘者 | Console.xxx竟然如此好用 文章目录JavaScript 隐秘者 | Console.xxx竟然如此好用一、控制台调试二、对象方法 &#x1f356;1)、.assert() 条件断言2)、.clear() 清空控制台3)、.count() 计算调用数 ⭕4)、.countReset() 重置计数器5)、.debug() 调试消息6…

文献翻译 (3):非支配排序遗传算法 (Non-dominated Sorting Genetic Algorithm, NSGA-II)

文章目录1 引入2 多目标优化3 更多的定义3.1 支配3.2 非支配集3.3 全局Pareto最优集4 NSGA-II1 引入 本文主要介绍多目标优化的基本概念以及NSGA-II。 2 多目标优化 多目标优化的优化目标之间存在一定的冲突&#xff0c;例如一个目标增长&#xff0c;导致另一个减少。因此这…

Vue2 新手上路无处不在的特殊符号,让人傻傻分不清 “:”、“.”、“@”、“#” 、“{{}}“ 、“$“

刚刚学vue没多久&#xff0c;经常分不清情况什么时候用什么符号&#xff1a; “:” 是指令 “v-bind”的缩写 “.”是修饰符 “”是指令“v-on”的缩写 &#xff0c;它用于监听 DOM 事件 “#”是v-slot的缩写&#xff1b; "{{}}" 插值语法 "$" &#…

智慧工厂在线云平台,助力企业降本增效!

随着传统制造企业规模的扩大&#xff0c;人工管理方法不可避免的产生延时、错误和矛盾&#xff0c;人工管理方法已经无法对生产管理实施有效的控制, 随着设备类型、数量不断增加&#xff0c;人工管理的方式已经无法满足生产过程中人、机、料、法、环、测的有效管理。如何将这些…

2022年——一个老老老程序员的杭州折腾之旅

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;无尽的折腾后&#xff0c;终于又回到…

[Android]视图的控触操作-MotionEvent

引入 对屏幕的任何操作&#xff0c;系统都会创建一个触摸事件的对象MotionEvent来应对这个操作。当点击手机屏幕的某一个视图时&#xff0c;最先感应到的是屏幕&#xff0c;因为Activity系统是分层的结构&#xff0c;底层是一些驱动&#xff0c;所以驱动就会得到信息并且把信息…

分布式共识算法——Paxos、ZAB、Raft

分布式算法 01 分布式基本理论 CAP理论 1998年&#xff0c;加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式系统有三个指标。 一致性&#xff08;C&#xff09;&#xff1a;在分布式系统中的所有数据备份&#xff0c;在同一时刻是否同样的值&#xff0c;即写操…

第008课 - linux安装docker

文章目录 linux安装docker安装docker启动docker检查dockerdocker设置开机自启动linux安装docker 每一种容器都是一个完整的运行环境,容器之间互相隔离的。 windows的ghost工具就是类似docker。 从网上获取镜像,基于镜像,docker可以启动一个容器。 所以,我们以后想要装某种…

elasticsearch在linux环境安装遇到问题

es在linux环境安装遇到问题 1、启动失败日志 ERROR: [1] bootstrap checks failed [1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be con…

对某颜色站的一次渗透实战

1. 前提 1.1 某颜色cms弱口令原理 去年的时候&#xff0c;在网上看到有些师傅在打击颜色站&#xff0c;当时自己也摸索着试试&#xff0c;利用一个叫做jiuse cms的站来进行批量测试。 这个cms的特点是非常的小&#xff0c;前台除了xss之外&#xff0c;基本上漏洞都在后台&…

区块链+游戏:未来真的有未来吗?

今年以来&#xff0c;伴随着元宇宙与P2E的火热浪潮&#xff0c;区块链以其强大的叙事能力势如破竹的切入到传统游戏领域&#xff0c;顶级风投、知名巨企纷纷入局&#xff0c;迸发出极大的经济潜能&#xff0c;引发了社会的广泛关注。 一方面&#xff0c;区块链技术在游戏的运用…

【漏洞复现】多语言文件包含漏洞分析

漏洞描述&#xff1a; ThinkPHP在开启多语言功能的情况下存在文件包含漏洞&#xff0c;攻击者可以通过get、header、cookie等位置传入参数&#xff0c;实现目录穿越文件包含&#xff0c;通过pearcmd文件包含这个trick即可实现RCE。 影响版本&#xff1a; 6.0.1 < ThinkPH…

【TypeScript】TS交叉类型联合类型(四)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

Mybatis_Plus_@TableName,@TableField

思考一个问题:为啥继承BaseMapper< POJO >&#xff0c;能直接找到Mysql的表 默认情况下:mp根据BaseMapper泛型POJO类取数据库底下找与POJO类型一致的表 思考一个问题:如果把表user改成tb_user那么我们需要怎么解决 使用TableName注解 TableField 思考一个问题:我们新增…