zjk
12 小时以前 a4afcfdb179e62a498b62cc6860d8cd46701a08f
hugray-server/ruoyi-modules/ruoyi-user/src/main/java/com/ruoyi/user/service/impl/AccountUserServiceImpl.java
@@ -297,6 +297,67 @@
        return accountAddressMapper.deleteAddressByIds(ids);
    }
    @Override
    public List<AccountAddress> getAddressList(Long userId)
    {
        return accountAddressMapper.selectAddressByUserId(userId);
    }
    @Override
    public AccountAddress getAddressDetail(Long userId, Long id)
    {
        // 编辑页回填:需校验归属,防止拿到他人地址
        return queryOwnedAddress(userId, id);
    }
    @Override
    @Transactional
    public int insertMyAddress(AccountAddress accountAddress)
    {
        // STEP 1: 会员身份防御性校验(正常由登录态注入,必非空)
        if (accountAddress.getUserId() == null)
        {
            throw new ServiceException("会员身份缺失");
        }
        // STEP 2: 是否默认完全以用户勾选为准,不做「首条自动默认」的强制改写;
        //         为空时明确兜底为 0,避免落库为 null 影响前端判定
        if (!"1".equals(accountAddress.getIsDefault()))
        {
            accountAddress.setIsDefault("0");
        }
        // STEP 3: 置为默认前先清掉旧默认,保证"每会员至多一条默认"(与插入同事务)
        if ("1".equals(accountAddress.getIsDefault()))
        {
            accountAddressMapper.clearDefaultByUserId(accountAddress.getUserId());
        }
        // STEP 4: 落库
        return accountAddressMapper.insertAddress(accountAddress);
    }
    @Override
    @Transactional
    public int deleteMyAddress(Long userId, Long id)
    {
        // 校验归属:非本人地址直接抛异常,避免越权删除(deleteAddressByIds 本身不带 user_id)
        queryOwnedAddress(userId, id);
        return accountAddressMapper.deleteAddressByIds(new Long[]{ id });
    }
    /**
     * 查询地址并校验归属
     *
     * 地址不存在或不属于该会员时统一抛业务异常(避免暴露他人地址是否存在)。
     */
    private AccountAddress queryOwnedAddress(Long userId, Long id)
    {
        AccountAddress address = accountAddressMapper.selectAddressById(id);
        if (address == null || !Objects.equals(address.getUserId(), userId))
        {
            throw new ServiceException("收货地址不存在或不属于该会员");
        }
        return address;
    }
    private Date resolveBindTime(Long oldId, Long newId, Date oldTime, Date now)
    {