+
+
+
+
+ {{ item.label }}
+ {{ item.extra }}
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## 扩展说明
+
+### 添加新的下拉选择类型
+
+如果需要添加新的下拉选择类型,可以:
+
+1. 在 `SelectOptionService` 中添加新的方法
+2. 在 `SelectOptionController` 中添加对应的接口
+3. 按照统一的格式返回数据
+
+### 自定义扩展信息
+
+`extra` 字段可以包含任何额外的信息,例如:
+- 联系电话
+- 父级ID
+- 状态信息
+- 其他业务相关数据
+
+前端可以根据需要解析和使用这些扩展信息。
+
+## 注意事项
+
+1. 所有接口都需要相应的权限验证
+2. 只返回启用状态的数据
+3. 数据按照指定的排序规则返回
+4. 建议前端对接口返回的数据进行缓存,避免频繁请求
diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/constant/MallConstants.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/constant/MallConstants.java
new file mode 100644
index 000000000..8220d8f7e
--- /dev/null
+++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/constant/MallConstants.java
@@ -0,0 +1,98 @@
+package com.bsd.pjcloud.supermarket.constant;
+
+/**
+ * 商城相关常量
+ *
+ * @author pjcloud
+ * @date 2025-01-27
+ */
+public interface MallConstants {
+
+ /**
+ * 状态相关常量
+ */
+ interface Status {
+ /**
+ * 启用状态
+ */
+ String ENABLED = "0";
+
+ /**
+ * 禁用状态
+ */
+ String DISABLED = "1";
+
+ /**
+ * 上架状态
+ */
+ String ON_SALE = "1";
+
+ /**
+ * 下架状态
+ */
+ String OFF_SALE = "0";
+ }
+
+ /**
+ * 角色相关常量
+ */
+ interface RoleCode {
+ /**
+ * 商户用户角色
+ */
+ String MERCHANT_USER = "MALL_MCH";
+
+ /**
+ * 超市管理员角色
+ */
+ String SUPERMARKET_ADMIN = "SUPERMARKET_ADMIN";
+ }
+
+ /**
+ * 商品相关常量
+ */
+ interface Product {
+ /**
+ * 定价方式 - 多SKU
+ */
+ Integer PRICE_TYPE_MULTI_SKU = 1;
+
+ /**
+ * 定价方式 - 单价SPU
+ */
+ Integer PRICE_TYPE_SINGLE_SPU = 2;
+ }
+
+ /**
+ * 商户相关常量
+ */
+ interface Merchant {
+ /**
+ * 商户状态 - 正常
+ */
+ String STATUS_NORMAL = "1";
+
+ /**
+ * 商户状态 - 停用
+ */
+ String STATUS_DISABLED = "0";
+ }
+
+ /**
+ * 删除标记
+ */
+ interface DelFlag {
+ /**
+ * 正常
+ */
+ String NORMAL = "0";
+
+ /**
+ * 删除
+ */
+ String DELETED = "1";
+ }
+}
+
+
+
diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/MallAppController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/MallAppController.java
new file mode 100644
index 000000000..3539cf527
--- /dev/null
+++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/MallAppController.java
@@ -0,0 +1,688 @@
+package com.bsd.pjcloud.supermarket.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.bsd.pjcloud.admin.api.entity.SysRole;
+import com.bsd.pjcloud.admin.api.feign.RemoteRoleService;
+import com.bsd.pjcloud.common.core.util.BeanUtils;
+import com.bsd.pjcloud.common.core.util.R;
+import com.bsd.pjcloud.common.security.util.SecurityUtils;
+import com.bsd.pjcloud.supermarket.dto.MallProductCreateDTO;
+import com.bsd.pjcloud.supermarket.entity.MallCategoryEntity;
+import com.bsd.pjcloud.supermarket.entity.MallMerchantEntity;
+import com.bsd.pjcloud.supermarket.entity.MallProductEntity;
+import com.bsd.pjcloud.supermarket.entity.MallProductSkuEntity;
+import com.bsd.pjcloud.supermarket.exception.BusinessException;
+import com.bsd.pjcloud.supermarket.service.MallCategoryService;
+import com.bsd.pjcloud.supermarket.service.MallMerchantService;
+import com.bsd.pjcloud.supermarket.service.MallMerchantUserService;
+import com.bsd.pjcloud.supermarket.service.MallProductService;
+import com.bsd.pjcloud.supermarket.service.MallProductSkuService;
+import com.bsd.pjcloud.supermarket.vo.mall.MallCategoryTreeVo;
+import com.bsd.pjcloud.supermarket.vo.app.MallProductListAppVo;
+import com.bsd.pjcloud.supermarket.vo.app.MallProductDetailAppVo;
+import com.bsd.pjcloud.supermarket.vo.app.MallProductSkuAppVo;
+import com.bsd.pjcloud.supermarket.vo.app.MallMerchantListAppVo;
+import com.bsd.pjcloud.supermarket.dto.SkuStockChangeDTO;
+import com.bsd.pjcloud.supermarket.constant.MallConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 移动端商城接口
+ *
+ * @author zjf
+ * @date 2025-01-27
+ */
+@RestController
+@RequestMapping("/app/mall")
+@Tag(name = "移动端商城", description = "移动端商城接口")
+@RequiredArgsConstructor
+public class MallAppController {
+
+ private final MallCategoryService mallCategoryService;
+ private final MallMerchantService mallMerchantService;
+ private final MallMerchantUserService mallMerchantUserService;
+ private final MallProductService mallProductService;
+ private final MallProductSkuService mallProductSkuService;
+ private final RemoteRoleService remoteRoleService;
+
+ // ==================== 分类相关接口 ====================
+
+ /**
+ * 获取分类树结构
+ */
+ @GetMapping("/category/tree")
+ @Operation(summary = "获取分类树", description = "获取所有分类的树结构")
+ public R