项目-苍穹外卖(十三) 地址模块(导入)+用户下单

一、地址模块

需求分析和设计:

新增地址:

Controller:

    /**
     * 新增地址
     *
     * @param addressBook
     * @return
     */
    @PostMapping
    @ApiOperation("新增地址")
    public Result save(@RequestBody AddressBook addressBook) {
        addressBookService.save(addressBook);
        return Result.success();
    }

Service:

    /**
     * 新增地址
     *
     * @param addressBook
     */
    public void save(AddressBook addressBook) {
        addressBook.setUserId(BaseContext.getCurrentId());
        addressBook.setIsDefault(0);
        addressBookMapper.insert(addressBook);
    }

Mapper:

    /**
     * 新增
     * @param addressBook
     */
    @Insert("insert into address_book" +
            "        (user_id, consignee, phone, sex, province_code, province_name, city_code, city_name, district_code," +
            "         district_name, detail, label, is_default)" +
            "        values (#{userId}, #{consignee}, #{phone}, #{sex}, #{provinceCode}, #{provinceName}, #{cityCode}, #{cityName}," +
            "                #{districtCode}, #{districtName}, #{detail}, #{label}, #{isDefault})")
    void insert(AddressBook addressBook);

查询登录用户所有地址:

Controller:

    /**
     * 查询当前登录用户的所有地址信息
     *
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("查询当前登录用户的所有地址信息")
    public Result<List<AddressBook>> list() {
        AddressBook addressBook = new AddressBook();
        addressBook.setUserId(BaseContext.getCurrentId());
        List<AddressBook> list = addressBookService.list(addressBook);
        return Result.success(list);
    }

Service:

    /**
     * 条件查询
     *
     * @param addressBook
     * @return
     */
    public List<AddressBook> list(AddressBook addressBook) {
        return addressBookMapper.list(addressBook);
    }

Mapper:

    <select id="list" parameterType="AddressBook" resultType="AddressBook">
        select * from address_book
        <where>
            <if test="userId != null">
                and user_id = #{userId}
            </if>
            <if test="phone != null">
                and phone = #{phone}
            </if>
            <if test="isDefault != null">
                and is_default = #{isDefault}
            </if>
        </where>
    </select>

查询默认地址:

Controller:

    /**
     * 查询默认地址
     */
    @GetMapping("default")
    @ApiOperation("查询默认地址")
    public Result<AddressBook> getDefault() {
        //SQL:select * from address_book where user_id = ? and is_default = 1
        AddressBook addressBook = new AddressBook();
        addressBook.setIsDefault(1);
        addressBook.setUserId(BaseContext.getCurrentId());
        List<AddressBook> list = addressBookService.list(addressBook);

        if (list != null && list.size() == 1) {
            return Result.success(list.get(0));
        }

        return Result.error("没有查询到默认地 址");
    }

Service:

    /**
     * 条件查询
     *
     * @param addressBook
     * @return
     */
    public List<AddressBook> list(AddressBook addressBook) {
        return addressBookMapper.list(addressBook);
    }

Mapper:

    <select id="list" parameterType="AddressBook" resultType="AddressBook">
        select * from address_book
        <where>
            <if test="userId != null">
                and user_id = #{userId}
            </if>
            <if test="phone != null">
                and phone = #{phone}
            </if>
            <if test="isDefault != null">
                and is_default = #{isDefault}
            </if>
        </where>
    </select>

根据id查询地址:

Controller:

    @GetMapping("/{id}")
    @ApiOperation("根据id查询地址")
    public Result<AddressBook> getById(@PathVariable Long id) {
        AddressBook addressBook = addressBookService.getById(id);
        return Result.success(addressBook);
    }

Service:

    /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    public AddressBook getById(Long id) {
        AddressBook addressBook = addressBookMapper.getById(id);
        return addressBook;
    }

Mapper:

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @Select("select * from address_book where id = #{id}")
    AddressBook getById(Long id);

设置默认地址:

Controller:

/**
     * 设置默认地址
     *
     * @param addressBook
     * @return
     */
    @PutMapping("/default")
    @ApiOperation("设置默认地址")
    public Result setDefault(@RequestBody AddressBook addressBook) {
        addressBookService.setDefault(addressBook);
        return Result.success();
    }

Service:

 /**
     * 设置默认地址
     *
     * @param addressBook
     */
    @Transactional
    public void setDefault(AddressBook addressBook) {
        //1、将当前用户的所有地址修改为非默认地址 update address_book set is_default = ? where user_id = ?
        addressBook.setIsDefault(0);
        addressBook.setUserId(BaseContext.getCurrentId());
        addressBookMapper.updateIsDefaultByUserId(addressBook);

        //2、将当前地址改为默认地址 update address_book set is_default = ? where id = ?
        addressBook.setIsDefault(1);
        addressBookMapper.update(addressBook);
    }

Mapper:

    /**
     * 根据 用户id修改 是否默认地址
     * @param addressBook
     */
    @Update("update address_book set is_default = #{isDefault} where user_id = #{userId}")
    void updateIsDefaultByUserId(AddressBook addressBook);
    <update id="update" parameterType="addressBook">
        update address_book
        <set>
            <if test="consignee != null">
                consignee = #{consignee},
            </if>
            <if test="sex != null">
                sex = #{sex},
            </if>
            <if test="phone != null">
                phone = #{phone},
            </if>
            <if test="detail != null">
                detail = #{detail},
            </if>
            <if test="label != null">
                label = #{label},
            </if>
            <if test="isDefault != null">
                is_default = #{isDefault},
            </if>
        </set>
        where id = #{id}
    </update>

地址数据库:

二、用户下单

需求分析和设计:

数据库:

<think>好的,用户想了解苍穹外卖用户下单功能流程和相关的开发文档、API。我需要根据提供的引用内容来整理回答,同时遵守系统级指令,比如正确使用LaTeX格式,生成相关问题等。 首先,我需要确认用户的问题范围。用户提到了“用户下单的功能或流程”,可能包括从前端操作到后端处理的整个流程,还可能涉及API调用和开发文档。根据提供的引用,引用[1]提到了苍穹外卖项目的开发流程和环境搭建,引用[2]和[3]涉及微信小程序的支付流程,引用[4]提到了MD5加密用于密码处理。 用户下单流程应该包括几个步骤:登录验证、选择商品、创建订单、支付处理、订单状态更新等。我需要将这些步骤分解,并结合引用中的信息补充细节。例如,用户登录可能用到微信小程序的登录API(引用[3]),支付部分会涉及JSAPI下单和调起支付(引用[2]),密码加密可能用于用户身份验证(引用[4])。 接下来,需要确保回答结构清晰,分步骤说明流程,并引用正确的引用标记。例如,在登录部分提到微信小程序登录API时添加[^3],在支付部分引用微信支付流程时加上[^2],在涉及加密时引用[^4]。同时,开发环境搭建和启动命令可能来自引用[1]。 还需要注意使用中文回答,正确应用LaTeX格式,比如变量或代码中的参数如`prepay_id`可能需要用行内公式格式$...$,但根据示例,代码块中的内容不需要转换,所以可能不需要处理。独立公式暂时可能用不上,但如果有需要的话要用$$...$$。 生成的相关问题需要与用户下单流程相关,可能涉及加密处理、支付集成、性能优化等。例如,如何保证支付安全,如何处理高并发下单,如何集成微信支付等。 检查是否所有引用都正确标注,比如引用[1]是关于项目启动和环境配置,引用[2]和[3]是支付和登录,引用[4]是加密。确保每个引用只在相关部分出现,不要遗漏。 最后,按照用户的要求,回答要结构清晰,分步骤说明,并引用相关文档,同时生成相关问题。需要避免使用Markdown格式,用自然的中文段落,代码块用三个反引号包裹,正确标注引用。</think>### 苍穹外卖用户下单功能流程说明 #### 1. **用户身份验证** - 用户通过微信小程序登录,调用微信开放接口`wx.login`获取临时`code`,后端通过`code`换取用户唯一标识`openid`[^3]。 - 密码或敏感信息使用$MD5$加密传输(如:`DigestUtils.md5DigestAsHex(password.getBytes())`)。 #### 2. **商品选择与订单生成** - 用户在小程序界面选择商品,提交订单请求。 - 后端接收请求后验证库存、价格等信息,生成唯一订单号,并将数据写入数据库。 #### 3. **支付流程集成** - 调用微信支付`JSAPI`接口发起预支付请求,获取`prepay_id`。 - 小程序端通过`wx.requestPayment`调起支付界面,用户完成支付操作。 #### 4. **订单状态更新** - 支付成功后,微信支付回调通知后端更新订单状态为“已支付”。 - 后端通过异步任务处理配送逻辑,并推送消息通知用户。 #### 关键代码示例(订单创建) ```java // 示例:订单创建接口(伪代码) @PostMapping("/create") public Result createOrder(@RequestBody OrderDTO orderDTO) { // 1. 验证用户身份 String openid = getCurrentUserOpenId(); // 通过token解析 // 2. 生成订单号(如:时间戳+随机数) String orderId = generateOrderId(); // 3. 调用支付服务获取prepay_id String prepayId = wechatPayService.createPrepayOrder(orderId, orderDTO.getTotalAmount()); // 4. 返回支付参数给前端 return Result.success(paymentParams); } ``` #### 开发文档与API参考 - **微信登录API**: [微信官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html) - **微信支付集成**: 需实现`统一下单`和`支付结果回调`接口 - **项目启动命令**: `java -jar -Dspring.profiles.active=dev xxx.jar`(激活开发环境配置)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值