Version: 1.0
Author: ChatGPT
Purpose: 作为 Codex / Cursor / VSCode / 开发团队统一技术规范与唯一事实来源(Single Source of Truth)
Framework: RuoYi-SpringBoot (Thymeleaf)
Backend: Java 8 / Spring Boot 2.2.x / MyBatis / Druid
Frontend: Thymeleaf + Bootstrap 3.3.7
Database: MySQL 5.7+
Date: 2025-01
本 DEMO 系统为《西安市民宗委宗教管理信息系统建设项目》立项评审所需的演示版本。
目标是在现场评审中,通过 10 分钟内的真实系统操作演示,向评审专家展示系统在以下方面的能力:
本 DEMO 不追求功能“大而全”,而是围绕评审要求的两个核心演示点,聚焦于:
系统架构采用 RuoYi-SpringBoot 单体框架,以降低搭建成本,加快 DEMO 开发效率,并便于今后升级为正式系统。
评审要求概要:
DEMO 实现范围:
评审要求概要:
DEMO 实现范围:
系统采用 RuoYi 原生 RBAC(基于角色的访问控制)模型。
管理员(Admin)
区县用户(CountyUser)
religion:place:listreligion:place:addreligion:place:editreligion:person:listreligion:person:importreligion:check:listreligion:audit:list 等。@RequiresPermissions("xxx") 注解进行细粒度控制;deptId 或扩展字段进行过滤,例如:WHERE county = #{user.county}。CREATE TABLE religion_place (
place_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '场所ID',
place_name VARCHAR(256) NOT NULL COMMENT '场所名称',
religion_type VARCHAR(64) NOT NULL COMMENT '宗教类别',
place_category VARCHAR(64) NOT NULL COMMENT '场所类别(寺/观/清真寺/教堂等)',
county VARCHAR(128) NOT NULL COMMENT '所属区县',
address VARCHAR(512) NOT NULL COMMENT '详细地址',
charge_name VARCHAR(128) NOT NULL COMMENT '负责人姓名',
charge_phone VARCHAR(32) NOT NULL COMMENT '负责人联系电话',
place_area DECIMAL(10,2) COMMENT '场所占地面积(平方米)',
building_area DECIMAL(10,2) COMMENT '建筑面积(平方米)',
approve_organ VARCHAR(128) COMMENT '批准设立机关',
approve_time DATE COMMENT '批准设立时间',
reg_organ VARCHAR(128) COMMENT '登记机关',
reg_no VARCHAR(64) COMMENT '登记证号',
reg_time DATE COMMENT '登记时间',
legal_qualified TINYINT DEFAULT 0 COMMENT '是否具有法人资格:0否1是',
legal_time DATE COMMENT '法人资格取得时间',
credit_code VARCHAR(32) COMMENT '统一社会信用代码',
longitude DECIMAL(10,6) COMMENT '经度',
latitude DECIMAL(10,6) COMMENT '纬度',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '更新人',
update_time DATETIME COMMENT '更新时间'
);
CREATE TABLE religion_person (
person_id BIGINT PRIMARY_KEY AUTO_INCREMENT COMMENT '人员ID',
place_id BIGINT NOT NULL COMMENT '所属场所ID(外键,关联 religion_place.place_id)',
name VARCHAR(128) NOT NULL COMMENT '姓名',
religion_type VARCHAR(64) NOT NULL COMMENT '宗教类别',
gender VARCHAR(8) COMMENT '性别',
nation VARCHAR(64) COMMENT '民族(字典:sys_nation)',
id_number VARCHAR(32) NOT NULL COMMENT '身份证号',
birthday DATE COMMENT '出生日期',
county VARCHAR(128) COMMENT '所属区县',
address VARCHAR(512) COMMENT '家庭地址/联系地址',
political_status VARCHAR(128) COMMENT '政治面貌',
edu_national VARCHAR(128) COMMENT '国民教育学历',
edu_religious VARCHAR(128) COMMENT '宗教学历',
join_time DATE COMMENT '入教/出家时间',
phone VARCHAR(32) COMMENT '联系电话',
domicile VARCHAR(128) COMMENT '户籍所在地',
native_place VARCHAR(128) COMMENT '籍贯',
org_name VARCHAR(256) COMMENT '所属宫观名称(Excel 原始值,仅留档)',
org_address VARCHAR(512) COMMENT '所属宫观地址(Excel 原始值,仅留档)',
status VARCHAR(32) DEFAULT 'TO_CHECK' COMMENT '状态:TO_CHECK待校核/CHECKED已校核/REPORTED已上报',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '更新人',
update_time DATETIME COMMENT '更新时间',
UNIQUE KEY uk_id_name (id_number, name),
INDEX idx_place_id (place_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教职人员表';
);
create table religion_import_batch
(
batch_id bigint auto_increment comment '批次ID'
primary key,
batch_no varchar(64) null comment '批次号(可用时间戳+随机数生成)',
file_name varchar(256) null comment '导入文件名',
uploader varchar(64) null comment '上传人登录名',
upload_time datetime null comment '上传时间',
last_process_time datetime null comment '最近一次处理时间',
total_rows int null comment '总记录数',
valid_rows int null comment '有效记录数',
error_rows int null comment '格式错误记录数',
conflict_rows int null comment '冲突记录数',
imported_rows int null comment '最终成功导入记录数(包含新增和更新)',
abandoned_rows int null comment '放弃导入记录数',
status varchar(32) null comment '状态:PARSED已解析/PARTIAL部分处理/FINISHED已完成',
extra json null comment '扩展字段(预留)'
);
create table religion_import_item
(
item_id bigint auto_increment comment '导入项ID'
primary key,
batch_id bigint null comment '批次ID,对应 religion_import_batch.batch_id',
row_no int null comment 'Excel 行号(从1开始)',
json_data json null comment '该行原始数据的 JSON 表示',
error_msg varchar(512) null comment '格式错误说明,为空表示无格式错误',
conflict_flag tinyint null comment '是否为冲突记录:0否1是',
status varchar(32) null comment '系统校验状态:NORMAL正常/ERROR格式错误/CONFLICT冲突',
action varchar(32) null comment '用户处理决策:IMPORT/OVERWRITE/KEEP/ABANDON/MANUAL',
action_by varchar(64) null comment '决策人登录名',
action_time datetime null comment '决策时间',
processed_flag tinyint null comment '是否已完成处理:0否1是',
create_time datetime null comment '记录创建时间'
);
create index idx_batch
on religion_import_item (batch_id);
CREATE TABLE religion_audit_log (
log_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '日志ID',
user_id VARCHAR(64) COMMENT '操作用户ID',
user_name VARCHAR(128) COMMENT '操作用户姓名',
op_type VARCHAR(64) COMMENT '操作类型(ADD_PLACE/UPDATE_PLACE/BATCH_UPDATE_PERSON/IMPORT_PERSON/CHECK_PERSON等)',
resource_type VARCHAR(64) COMMENT '资源类型 place/person/import',
resource_id VARCHAR(64) COMMENT '资源ID(如 place_id/person_id/batch_id)',
op_detail JSON COMMENT '操作详情(字段差异JSON或附加说明)',
op_time DATETIME COMMENT '操作时间',
ip VARCHAR(64) COMMENT '操作IP地址',
extra JSON COMMENT '扩展字段(可记录请求参数快照等)'
);
用于:
以 RuoYi-SpringBoot 标准单体工程结构为基础,在 ruoyi-admin 模块中新增业务包。
ruoyi-admin
└── src/main/java/com/ruoyi/project/religion
├── place
│ ├── controller # ReligionPlaceController
│ ├── domain # ReligionPlace 实体类
│ ├── service # ReligionPlaceService / impl
│ ├── mapper # ReligionPlaceMapper + XML
│ └── mapper/xml # MyBatis XML
├── person
│ ├── controller # ReligionPersonController
│ ├── domain # ReligionPerson
│ ├── service
│ ├── mapper
│ └── mapper/xml
├── import
│ ├── controller # ReligionImportController
│ ├── service
│ ├── mapper # 如需要,可存 batch/item 等
│ └── mapper/xml
└── audit
├── controller # ReligionAuditController
├── domain # ReligionAuditLog
├── service
├── mapper
└── mapper/xml
前端 Thymeleaf 模板位于:
ruoyi-admin/src/main/resources/templates/religion
├── place
│ ├── place_list.html
│ └── place_form.html
├── person
│ ├── person_list.html
│ ├── person_import.html
│ └── person_conflict.html
├── check
│ └── check_workbench.html
└── audit
└── audit_list.html
place_form.html,填写 18 个字段;religion_place;ReligionAuditLogService.logCreate(...) 写一条新增日志;place_form.html,展示原有字段;构造 op_detail JSON,如:
{
"charge_name": ["张三", "李四"],
"charge_phone": ["13800000000", "13900000000"]
}
写入 religion_audit_log;
返回成功。
person_import.html;religion_import_batch 记录;name + id_number 与 religion_person 比较,标记冲突;religion_import_item;religion_person;check_workbench.html;religion_person.status 更新为 CHECKED 或 REPORTED(按需求);op_detail JSON 格式化内容;以下为主要接口清单(以 RESTful 风格描述),实际实现时按 RuoYi 要求返回 AjaxResult。
基路径:/religion/place
GET /list
场所列表查询;支持分页与条件过滤。
POST /create
新增场所;Body 为 JSON,包含 18 字段。
PUT /update/{placeId}
修改场所;需比对旧值并写日志。
GET /detail/{placeId}
获取场所详情。
基路径:/religion/person
GET /list
人员列表查询。
PUT /update/{personId}
修改人员信息。
POST /batch/updatePoliticalStatus
批量修改政治面貌:
{
"personIds": [1,2,3],
"politicalStatus": "群众"
}
基路径:/religion/import
POST /upload?placeId={placeId}
上传 Excel 并解析;参数中 placeId 作为人员绑定场所。
GET /result/{batchId}
获取解析结果,包括错误列表和冲突列表。
POST /resolveConflict
对冲突数据进行处理:
{
"batchId": 11,
"mode": "override | keep | manual",
"manualList": [
{ "itemId": 123, "finalData": { ... } }
]
}
POST /commit/{batchId}
提交导入:将解析完成的数据写入 religion_person。
基路径:/religion/check
GET /listByCounty
查询本区县待校核数据,支持教别筛选。
POST /singleCheck/{personId}
单条通过校核。
POST /batchCheck
批量通过校核:
{
"ids": [1,2,3]
}
基路径:/religion/audit
GET /list
审计日志列表。
GET /detail/{logId}
日志详情。
public interface ReligionPlaceService {
List<ReligionPlace> list(PlaceQuery query);
ReligionPlace getById(Long id);
int create(ReligionPlace place);
int update(ReligionPlace place);
}
public interface ReligionPersonService {
List<ReligionPerson> list(PersonQuery query);
ReligionPerson getById(Long id);
int update(ReligionPerson person);
int batchUpdatePoliticalStatus(List<Long> ids, String status, String operator);
}
public interface ReligionImportService {
ImportBatch upload(MultipartFile file, Long placeId, String uploader);
ParseResult getParseResult(Long batchId);
HandleResult resolveConflict(ConflictRequest request);
int commit(Long batchId, String operator);
}
public interface ReligionCheckService {
List<ReligionPerson> listToCheck(CountyQuery query);
int singleCheck(Long personId, String operator);
int batchCheck(List<Long> ids, String operator);
}
public interface ReligionAuditLogService {
List<ReligionAuditLog> list(AuditQuery query);
ReligionAuditLog detail(Long id);
void logCreate(String resourceType, Long resourceId, Object newValue);
void logUpdate(String resourceType, Long resourceId, Object oldValue, Object newValue);
void logBatch(String resourceType, List<Long> ids, Object diff);
}
yyyy-MM-dd 格式;error_msg。冲突定义:姓名 + 身份证号 与数据库中既有数据完全相同,视为同一人,存在“数据冲突”。
支持三种处理模式:
所有冲突处理操作需要写审计日志,记录操作人、时间和处理方式。
{
"charge_name": ["张三", "李四"],
"charge_phone": ["13800000000", "13900000000"]
}
op_detail JSON 的格式化内容。统一使用 RuoYi 风格的 AjaxResult:
成功:
{
"code": 200,
"msg": "success",
"data": { ... }
}
失败:
{
"code": 500,
"msg": "错误信息"
}
ServiceException;本章整理系统中用到的枚举/字典值,便于前后端统一。
/religion/place/create 或 /update。元素说明:
布局:
op_detail JSON 的格式化结构。com.ruoyi.project.religion.place
com.ruoyi.project.religion.person
com.ruoyi.project.religion.import
com.ruoyi.project.religion.audit
XxxServiceXxxServiceImplXxxMapper + 对应 XML 文件。所有 REST 接口返回结构应统一为:
{
"code": 200,
"msg": "success",
"data": { ... }
}
异常时:
{
"code": 500,
"msg": "错误描述"
}
其中 code 可扩展为其它业务码,但 DEMO 中保持 200 / 500 即可。
ReligionAuditLogService 写业务日志。religion_place (1) —— (N) religion_person
一个场所可以对应多个教职人员;
教职人员通过 place_id 关联所属场所。
religion_import_batch (1) —— (N) religion_import_item
一个导入批次对应多条导入记录(每条对应 Excel 中一行)。
religion_person (N) —— (1) religion_place
人员通过 place_id 绑定到唯一的场所。
ER 关系可以绘制成图(可交由 Codex 或 UML 工具):
文档完毕:1–21 章完整开发规范,可作为 DEMO 项目开发与后期维护的基础文档。