diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/controller/AreaController.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/controller/AreaController.java
new file mode 100644
index 000000000..4c4d7f82d
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/controller/AreaController.java
@@ -0,0 +1,102 @@
+package cn.stylefeng.roses.kernel.dict.modular.controller;
+
+import cn.stylefeng.roses.kernel.dict.modular.entity.Area;
+import cn.stylefeng.roses.kernel.dict.modular.pojo.AreaVo;
+import cn.stylefeng.roses.kernel.dict.modular.pojo.request.AreaRequest;
+import cn.stylefeng.roses.kernel.dict.modular.service.AreaService;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
+import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 【系统基础】-【行政区域表】控制器
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+@RestController
+@ApiResource(name = "行政区域表")
+public class AreaController {
+
+ @Resource
+ private AreaService areaService;
+
+ /**
+ * 添加
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ @PostResource(name = "添加行政区域", path = "/area/add")
+ public ResponseData add(@RequestBody @Validated(AreaRequest.add.class) AreaRequest areaRequest) {
+ areaService.add(areaRequest);
+ return new SuccessResponseData<>();
+ }
+
+ /**
+ * 删除
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ @PostResource(name = "删除行政区域", path = "/area/delete")
+ public ResponseData> delete(@RequestBody @Validated(AreaRequest.delete.class) AreaRequest areaRequest) {
+ areaService.del(areaRequest);
+ return new SuccessResponseData<>();
+ }
+
+ /**
+ * 编辑
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ @PostResource(name = "编辑行政区域", path = "/area/edit")
+ public ResponseData> edit(@RequestBody @Validated(AreaRequest.edit.class) AreaRequest areaRequest) {
+ areaService.edit(areaRequest);
+ return new SuccessResponseData<>();
+ }
+
+ /**
+ * 查看详情
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ @GetResource(name = "查看行政区域详情", path = "/area/detail")
+ public ResponseData detail(@Validated(AreaRequest.detail.class) AreaRequest areaRequest) {
+ return new SuccessResponseData<>(areaService.detail(areaRequest));
+ }
+
+ /**
+ * 获取列表
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ @GetResource(name = "获取行政区域列表", path = "/area/list")
+ public ResponseData> list(AreaRequest areaRequest) {
+ return new SuccessResponseData<>(areaService.findList(areaRequest));
+ }
+
+ /**
+ * 获取列表(带分页)
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ @GetResource(name = "分页查询行政区域", path = "/area/page")
+ public ResponseData> page(AreaRequest areaRequest) {
+ return new SuccessResponseData<>(areaService.findPage(areaRequest));
+ }
+
+}
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/entity/Area.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/entity/Area.java
new file mode 100644
index 000000000..0af7fdaef
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/entity/Area.java
@@ -0,0 +1,82 @@
+package cn.stylefeng.roses.kernel.dict.modular.entity;
+
+import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
+import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 【系统基础】-【行政区域表】实例类
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+@TableName("sys_area")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Area extends BaseEntity {
+
+ /**
+ * 区域id
+ */
+ @TableId(value = "area_id", type = IdType.ASSIGN_ID)
+ @ChineseDescription("区域id")
+ private Long areaId;
+
+ /**
+ * 区域编码
+ */
+ @TableField("area_code")
+ @ChineseDescription("区域编码")
+ private String areaCode;
+
+ /**
+ * 区域全称
+ */
+ @TableField("area_name")
+ @ChineseDescription("区域全称")
+ private String areaName;
+
+ /**
+ * 上级区域编码
+ */
+ @TableField("parent_id")
+ @ChineseDescription("上级区域编码")
+ private String parentId;
+
+ /**
+ * 区域级别
+ */
+ @TableField("area_level")
+ @ChineseDescription("区域级别")
+ private Integer areaLevel;
+
+ /**
+ * 排序码
+ */
+ @TableField("area_sort")
+ @ChineseDescription("排序码")
+ private BigDecimal areaSort;
+
+ /**
+ * 是否删除
+ */
+ @TableField("del_flag")
+ @ChineseDescription("是否删除")
+ private String delFlag;
+
+ /**
+ * 所有的上级区域编码,用逗号分隔
+ */
+ @TableField("area_pids")
+ @ChineseDescription("所有的上级区域编码,用逗号分隔")
+ private String areaPids;
+
+}
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/enums/AreaExceptionEnum.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/enums/AreaExceptionEnum.java
new file mode 100644
index 000000000..f375be82a
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/enums/AreaExceptionEnum.java
@@ -0,0 +1,36 @@
+package cn.stylefeng.roses.kernel.dict.modular.enums;
+
+import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
+import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum;
+import lombok.Getter;
+
+/**
+ * 【系统基础】-【行政区域表】异常相关枚举
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+@Getter
+public enum AreaExceptionEnum implements AbstractExceptionEnum {
+
+ /**
+ * 查询结果不存在
+ */
+ AREA_NOT_EXISTED(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10001", "查询结果不存在");
+
+ /**
+ * 错误编码
+ */
+ private final String errorCode;
+
+ /**
+ * 提示用户信息
+ */
+ private final String userTip;
+
+ AreaExceptionEnum(String errorCode, String userTip) {
+ this.errorCode = errorCode;
+ this.userTip = userTip;
+ }
+
+}
\ No newline at end of file
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/mapper/AreaMapper.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/mapper/AreaMapper.java
new file mode 100644
index 000000000..90b9f005c
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/mapper/AreaMapper.java
@@ -0,0 +1,20 @@
+package cn.stylefeng.roses.kernel.dict.modular.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import cn.stylefeng.roses.kernel.dict.modular.entity.Area;
+import cn.stylefeng.roses.kernel.dict.modular.pojo.AreaVo;
+import cn.stylefeng.roses.kernel.dict.modular.pojo.request.AreaRequest;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+/**
+ * 【系统基础】-【行政区域表】 Mapper 接口
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+public interface AreaMapper extends BaseMapper {
+
+ List customFindList(@Param("page") Page page, @Param("param")AreaRequest request);
+
+}
\ No newline at end of file
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/mapper/mapping/AreaMapper.xml b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/mapper/mapping/AreaMapper.xml
new file mode 100644
index 000000000..656836ed1
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/mapper/mapping/AreaMapper.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ area_id,area_code,area_name,parent_id,area_level,area_sort,del_flag,area_pids,create_time,create_user,update_time,update_user
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/pojo/AreaVo.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/pojo/AreaVo.java
new file mode 100644
index 000000000..45aba74c1
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/pojo/AreaVo.java
@@ -0,0 +1,18 @@
+package cn.stylefeng.roses.kernel.dict.modular.pojo;
+
+
+import cn.stylefeng.roses.kernel.dict.modular.entity.Area;
+import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
+import lombok.Data;
+
+/**
+ * 【系统基础】-【行政区域表】实例类
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+@Data
+public class AreaVo extends Area {
+
+
+}
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/pojo/request/AreaRequest.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/pojo/request/AreaRequest.java
new file mode 100644
index 000000000..622497a68
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/pojo/request/AreaRequest.java
@@ -0,0 +1,76 @@
+package cn.stylefeng.roses.kernel.dict.modular.pojo.request;
+
+import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
+import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 【系统基础】-【行政区域表】封装类
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class AreaRequest extends BaseRequest {
+
+ /**
+ * 区域id
+ */
+ @NotNull(message = "区域id不能为空", groups = {edit.class, delete.class})
+ @ChineseDescription("区域id")
+ private Long areaId;
+
+ /**
+ * 区域编码
+ */
+ @NotBlank(message = "区域编码不能为空", groups = {add.class, edit.class})
+ @ChineseDescription("区域编码")
+ private String areaCode;
+
+ /**
+ * 区域全称
+ */
+ @NotBlank(message = "区域全称不能为空", groups = {add.class, edit.class})
+ @ChineseDescription("区域全称")
+ private String areaName;
+
+ /**
+ * 上级区域编码
+ */
+ @NotBlank(message = "上级区域编码不能为空", groups = {add.class, edit.class})
+ @ChineseDescription("上级区域编码")
+ private String parentId;
+
+ /**
+ * 区域级别
+ */
+ @ChineseDescription("区域级别")
+ private Integer areaLevel;
+
+ /**
+ * 排序码
+ */
+ @ChineseDescription("排序码")
+ private BigDecimal areaSort;
+
+ /**
+ * 是否删除
+ */
+ @ChineseDescription("是否删除")
+ private String delFlag;
+
+ /**
+ * 所有的上级区域编码,用逗号分隔
+ */
+ @ChineseDescription("所有的上级区域编码,用逗号分隔")
+ private String areaPids;
+
+}
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/AreaService.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/AreaService.java
new file mode 100644
index 000000000..762143321
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/AreaService.java
@@ -0,0 +1,75 @@
+package cn.stylefeng.roses.kernel.dict.modular.service;
+
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import cn.stylefeng.roses.kernel.dict.modular.entity.Area;
+import cn.stylefeng.roses.kernel.dict.modular.pojo.AreaVo;
+import cn.stylefeng.roses.kernel.dict.modular.pojo.request.AreaRequest;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * 【系统基础】-【行政区域表】 服务类
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+public interface AreaService extends IService {
+
+ /**
+ * 新增
+ *
+ * @param areaRequest 请求参数
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ void add(AreaRequest areaRequest);
+
+ /**
+ * 删除
+ *
+ * @param areaRequest 请求参数
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ void del(AreaRequest areaRequest);
+
+ /**
+ * 编辑
+ *
+ * @param areaRequest 请求参数
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ void edit(AreaRequest areaRequest);
+
+ /**
+ * 查询详情
+ *
+ * @param areaRequest 请求参数
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ Area detail(AreaRequest areaRequest);
+
+ /**
+ * 获取列表
+ *
+ * @param areaRequest 请求参数
+ * @return List 返回结果
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ List findList(AreaRequest areaRequest);
+
+ /**
+ * 获取列表(带分页)
+ *
+ * @param areaRequest 请求参数
+ * @return PageResult 返回结果
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ PageResult findPage(AreaRequest areaRequest);
+
+}
\ No newline at end of file
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/AreaServiceImpl.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/AreaServiceImpl.java
new file mode 100644
index 000000000..3532a9b49
--- /dev/null
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/AreaServiceImpl.java
@@ -0,0 +1,125 @@
+package cn.stylefeng.roses.kernel.dict.modular.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.stylefeng.roses.kernel.rule.constants.TreeConstants;
+import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
+import cn.stylefeng.roses.kernel.dict.modular.entity.Area;
+import cn.stylefeng.roses.kernel.dict.modular.enums.AreaExceptionEnum;
+import cn.stylefeng.roses.kernel.dict.modular.mapper.AreaMapper;
+import cn.stylefeng.roses.kernel.dict.modular.pojo.AreaVo;
+import cn.stylefeng.roses.kernel.dict.modular.pojo.request.AreaRequest;
+import cn.stylefeng.roses.kernel.dict.modular.service.AreaService;
+import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
+import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 【系统基础】-【行政区域表】业务实现层
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+@Service
+public class AreaServiceImpl extends ServiceImpl implements AreaService {
+
+ @Override
+ public void add(AreaRequest areaRequest) {
+ Area area = new Area();
+ BeanUtil.copyProperties(areaRequest, area);
+ this.save(area);
+ }
+
+ @Override
+ public void del(AreaRequest areaRequest) {
+ Area area = this.queryArea(areaRequest);
+ this.removeById(area.getAreaId());
+ }
+
+ @Override
+ public void edit(AreaRequest areaRequest) {
+ Area area = this.queryArea(areaRequest);
+ BeanUtil.copyProperties(areaRequest, area);
+ this.updateById(area);
+ }
+
+ @Override
+ public Area detail(AreaRequest areaRequest) {
+ return this.queryArea(areaRequest);
+ }
+
+ @Override
+ public PageResult findPage(AreaRequest areaRequest) {
+ Page page = PageFactory.defaultPage();
+ List list = baseMapper.customFindList(page, areaRequest);
+ PageResult pageResult = PageResultFactory.createPageResult(page.setRecords(list));
+ return pageResult;
+ }
+
+ @Override
+ public List findList(AreaRequest areaRequest) {
+
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ String parentId = areaRequest.getParentId();
+ if(ObjectUtil.isEmpty(parentId)) {
+ parentId=TreeConstants.DEFAULT_PARENT_ID.toString();
+ }
+ queryWrapper.eq(Area::getParentId, parentId);
+ queryWrapper.orderByAsc(Area::getAreaSort);
+ return this.list(queryWrapper);
+ }
+
+ /**
+ * 获取信息
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ private Area queryArea(AreaRequest areaRequest) {
+ Area area = this.getById(areaRequest.getAreaId());
+ if (ObjectUtil.isEmpty(area)) {
+ throw new ServiceException(AreaExceptionEnum.AREA_NOT_EXISTED);
+ }
+ return area;
+ }
+
+ /**
+ * 创建查询wrapper
+ *
+ * @author LiYanJun
+ * @date 2023/07/05 18:12
+ */
+ private LambdaQueryWrapper createWrapper(AreaRequest areaRequest) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+
+ Long areaId = areaRequest.getAreaId();
+ String areaCode = areaRequest.getAreaCode();
+ String areaName = areaRequest.getAreaName();
+ String parentId = areaRequest.getParentId();
+ Integer areaLevel = areaRequest.getAreaLevel();
+ BigDecimal areaSort = areaRequest.getAreaSort();
+ String delFlag = areaRequest.getDelFlag();
+ String areaPids = areaRequest.getAreaPids();
+
+ queryWrapper.eq(ObjectUtil.isNotNull(areaId), Area::getAreaId, areaId);
+ queryWrapper.like(ObjectUtil.isNotEmpty(areaCode), Area::getAreaCode, areaCode);
+ queryWrapper.like(ObjectUtil.isNotEmpty(areaName), Area::getAreaName, areaName);
+ queryWrapper.like(ObjectUtil.isNotEmpty(parentId), Area::getParentId, parentId);
+ queryWrapper.eq(ObjectUtil.isNotNull(areaLevel), Area::getAreaLevel, areaLevel);
+ queryWrapper.eq(ObjectUtil.isNotNull(areaSort), Area::getAreaSort, areaSort);
+ queryWrapper.like(ObjectUtil.isNotEmpty(delFlag), Area::getDelFlag, delFlag);
+ queryWrapper.like(ObjectUtil.isNotEmpty(areaPids), Area::getAreaPids, areaPids);
+
+ return queryWrapper;
+ }
+
+}
\ No newline at end of file