| 分类 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 语言 | Java | 17 | 后端开发语言 |
| 框架 | Spring Boot | 3.x | 后端应用框架 |
| 数据库 | 达梦数据库 | 8.x | 关系型数据库 |
| ORM | MyBatis | 3.x | 数据访问框架 |
| 前端框架 | Vue | 3.x | 前端开发框架 |
| 前端组件库 | Element Plus | 2.x | UI组件库 |
| 构建工具 | Maven | 3.x | Java依赖管理 |
| 构建工具 | npm | 9.x | 前端依赖管理 |
gw-sbh/ # Spring Boot 后端模块
├── src/
│ └── main/
│ ├── java/
│ │ └── com/goldenwater/sbh/
│ │ ├── controller/ # REST API 控制层
│ │ │ └── XxxController.java
│ │ ├── service/ # 业务逻辑层
│ │ │ ├── XxxService.java # 服务接口
│ │ │ └── impl/ # 服务实现
│ │ │ └── XxxServiceImpl.java
│ │ ├── mapper/ # 数据访问层(接口)
│ │ │ └── XxxMapper.java
│ │ ├── domain/ # 实体类
│ │ │ └── Xxx.java
│ │ └── SbhApplication.java # 启动类
│ └── resources/
│ ├── mapper/ # MyBatis XML映射文件
│ │ └── XxxMapper.xml
│ └── application.yml # 应用配置
└── pom.xml
gw-ui/ # Vue 前端模块
├── src/
│ ├── views/ # 页面视图
│ │ └── xxx/
│ │ └── xxx.vue
│ ├── api/ # API 接口定义
│ │ └── xxx.js
│ ├── components/ # 公共组件
│ ├── utils/ # 工具函数
│ ├── App.vue # 根组件
│ └── main.js # 入口文件
└── package.json
| 文件类型 | 命名规则 | 示例 |
|---|---|---|
| Controller | 大驼峰 + Controller | WqAwqmdDController.java |
| Service接口 | 大驼峰 + Service | WqAwqmdDService.java |
| Service实现 | 大驼峰 + ServiceImpl | WqAwqmdDServiceImpl.java |
| Mapper接口 | 大驼峰 + Mapper | WqAwqmdDMapper.java |
| Entity | 大驼峰(无后缀) | WqAwqmdD.java |
| XML映射文件 | 大驼峰 + Mapper.xml | WqAwqmdDMapper.xml |
| Vue组件 | 小驼峰或短横线分隔 | autostat.vue, data-table.vue |
| API文件 | 小驼峰 | wqAwqmdD.js |
| 类型 | 命名规则 | 示例 |
|---|---|---|
| 类名 | 大驼峰(PascalCase) | WqAwqmdDController |
| 方法名 | 小驼峰(camelCase) | queryByStcd, insertData |
| 变量名 | 小驼峰(camelCase) | stcd, startTm, dataList |
| 常量名 | 全大写 + 下划线 | MAX_SIZE, DEFAULT_PAGE_SIZE |
| 类型 | 命名规则 | 示例 |
|---|---|---|
| 表名 | 大写 + 下划线 | WQ_AWQMD_D, SYS_TAG |
| 字段名 | 大写 + 下划线 | STCD, SPT, STNM |
| Schema名 | 大写 | RTWQ, SBH |
基础要求:
BaseController@RestController 注解/模块名/实体名,如 /sbh/wqAwqmdD示例代码:
package com.goldenwater.sbh.controller;
import com.goldenwater.common.core.controller.BaseController;
import com.goldenwater.common.core.domain.AjaxResult;
import com.goldenwater.common.core.page.TableDataInfo;
import com.goldenwater.sbh.domain.WqAwqmdD;
import com.goldenwater.sbh.service.WqAwqmdDService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/sbh/wqAwqmdD")
@Tag(name = "水质自动监测数据管理", description = "水质自动监测数据管理接口")
public class WqAwqmdDController extends BaseController {
@Resource
private WqAwqmdDService wqAwqmdDService;
@GetMapping("/byStcd")
@Operation(summary = "根据测站代码分页查询", description = "根据测站代码和时间范围分页查询监测数据")
public TableDataInfo queryByStcd(
@Parameter(description = "测站代码") @RequestParam(value = "stcd") String stcd,
@Parameter(description = "开始时间") @RequestParam(value = "startTm", required = false) String startTm,
@Parameter(description = "结束时间") @RequestParam(value = "endTm", required = false) String endTm) {
startPage();
List<WqAwqmdD> list = wqAwqmdDService.queryByStcd(stcd, startTm, endTm);
return getDataTable(list);
}
@GetMapping("/byStcdAll")
@Operation(summary = "根据测站代码查询所有数据", description = "不分页,用于图表")
public AjaxResult queryByStcdAll(
@Parameter(description = "测站代码") @RequestParam(value = "stcd") String stcd,
@Parameter(description = "开始时间") @RequestParam(value = "startTm", required = false) String startTm,
@Parameter(description = "结束时间") @RequestParam(value = "endTm", required = false) String endTm) {
List<WqAwqmdD> list = wqAwqmdDService.queryByStcd(stcd, startTm, endTm);
return AjaxResult.success(list);
}
}
Service接口:
示例代码:
package com.goldenwater.sbh.service;
import com.goldenwater.sbh.domain.WqAwqmdD;
import java.util.List;
public interface WqAwqmdDService {
/**
* 根据测站代码查询数据(不分页)
*/
List<WqAwqmdD> queryByStcd(String stcd, String startTm, String endTm);
/**
* 统计符合条件的数据数量
*/
int countByStcd(String stcd, String startTm, String endTm);
}
ServiceImpl实现类:
@Service 注解实现业务逻辑
package com.goldenwater.sbh.service.impl;
import com.goldenwater.sbh.domain.WqAwqmdD;
import com.goldenwater.sbh.mapper.WqAwqmdDMapper;
import com.goldenwater.sbh.service.WqAwqmdDService;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import java.util.List;
@Service("wqAwqmdDService")
public class WqAwqmdDServiceImpl implements WqAwqmdDService {
@Resource
private WqAwqmdDMapper wqAwqmdDMapper;
@Override
public List<WqAwqmdD> queryByStcd(String stcd, String startTm, String endTm) {
return wqAwqmdDMapper.queryByStcd(stcd, startTm, endTm);
}
@Override
public int countByStcd(String stcd, String startTm, String endTm) {
return wqAwqmdDMapper.countByStcd(stcd, startTm, endTm);
}
}
Mapper接口:
@Param 注解声明参数方法名与XML中SQL id一致
package com.goldenwater.sbh.mapper;
import com.goldenwater.sbh.domain.WqAwqmdD;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface WqAwqmdDMapper {
List<WqAwqmdD> queryByStcd(@Param("stcd") String stcd,
@Param("startTm") String startTm,
@Param("endTm") String endTm);
int countByStcd(@Param("stcd") String stcd,
@Param("startTm") String startTm,
@Param("endTm") String endTm);
}
Serializable 接口提供标准的 getter/setter 方法
package com.goldenwater.sbh.domain;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
@Data
public class WqAwqmdD extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 测站编码
*/
private String stcd;
/**
* 采样时间
*/
private Date spt;
}
| 特性 | 说明 | 示例 |
|---|---|---|
| Schema前缀 | 跨Schema查询需指定Schema | FROM RTWQ.WQ_AWQMD_D |
| 字符串连接 | 使用 CONCAT() 函数 |
CONCAT(#{endTm}, ' 23:59:59') |
| 日期函数 | 使用达梦日期函数 | SYSDATE, TO_DATE() |
| 小于等于转义 | XML中需转义 <= 为 <= |
AND SPT <= #{endTm} |
| 分页 | 使用 ROW_NUMBER() 或 MyBatis分页插件 |
startPage() |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.goldenwater.sbh.mapper.WqAwqmdDMapper">
<resultMap type="com.goldenwater.sbh.domain.WqAwqmdD" id="WqAwqmdDMap">
<result property="stcd" column="STCD" />
<result property="spt" column="SPT" />
<!-- ... -->
</resultMap>
<select id="queryByStcd" resultMap="WqAwqmdDMap">
SELECT STCD, SPT, WT, PH
FROM WQ_AWQMD_D
WHERE STCD = #{stcd}
<if test="startTm != null and startTm != ''">
AND SPT >= #{startTm}
</if>
<if test="endTm != null and endTm != ''">
AND SPT < CONCAT(#{endTm}, ' 23:59:59')
</if>
ORDER BY SPT DESC
</select>
</mapper>
以下为达梦数据库常见保留字,字段名应避免使用:
SELECT, FROM, WHERE, AND, OR, NOT, IN, LIKE, BETWEEN, ORDER, GROUP,
HAVING, LIMIT, OFFSET, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER,
NULL, DEFAULT, PRIMARY, FOREIGN, KEY, UNIQUE, INDEX, CONSTRAINT,
DATE, TIME, TIMESTAMP, VARCHAR, INTEGER, DECIMAL, FLOAT, DOUBLE,
BOOLEAN, TRUE, FALSE, CASE, WHEN, THEN, ELSE, END, AS, IS, JOIN,
LEFT, RIGHT, INNER, OUTER, ON, UNION, ALL, DISTINCT, COUNT, SUM,
AVG, MAX, MIN, EXISTS, COALESCE, NVL, SYSDATE, CURRENT_DATE
基础结构:
<script setup> 语法示例代码:
<template>
<div class="app-container">
<el-table :data="tableData" stripe border>
<el-table-column prop="stcd" label="测站代码" />
<el-table-column prop="spt" label="采样时间" />
</el-table>
</div>
</template>
<script setup name="AutoStat">
import { ref, onMounted } from 'vue'
import { listWqAwqmdD } from "@/api/sbh/wqAwqmdD"
const tableData = ref([])
onMounted(() => {
loadData()
})
function loadData() {
listWqAwqmdD({ stcd: 'ST001' }).then(response => {
tableData.value = response.data.rows
})
}
</script>
统一返回格式:
import request from '@/utils/request'
export function listWqAwqmdD(query) {
return request({
url: '/sbh/wqAwqmdD/byStcd',
method: 'get',
params: query
})
}
| 场景 | 格式 | 示例 |
|---|---|---|
| 日期选择器 | YYYY-MM-DD |
2026-06-03 |
| 时间戳 | YYYY-MM-DD HH:mm:ss |
2026-06-03 14:30:00 |
| 日期范围 | [startDate, endDate] |
['2026-05-28', '2026-06-03'] |
使用 BaseController 提供的分页方法:
@GetMapping("/list")
public TableDataInfo list(WqAwqmdD wqAwqmdD) {
startPage(); // 开启分页
List<WqAwqmdD> list = wqAwqmdDService.selectWqAwqmdDList(wqAwqmdD);
return getDataTable(list); // 返回分页数据
}
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pagination.pageNum"
:page-sizes="[10, 20, 50, 100]"
:page-size="pagination.pageSize"
:total="pagination.total"
layout="total, sizes, prev, pager, next, jumper"
/>
// 成功响应
{
"code": 200,
"msg": "操作成功",
"data": {...}
}
// 失败响应
{
"code": 500,
"msg": "操作失败",
"data": null
}
使用全局异常处理器捕获并统一处理异常:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ServiceException.class)
public AjaxResult handleServiceException(ServiceException e) {
return AjaxResult.error(e.getMessage());
}
}
#{})| 检查项 | 说明 |
|---|---|
| 命名规范 | 类、方法、变量命名符合规范 |
| 代码格式 | 缩进、空行、括号位置符合规范 |
| 异常处理 | 有完善的异常捕获和处理机制 |
| SQL安全 | 使用参数绑定,避免SQL注入 |
| 注释规范 | 关键代码有必要的注释说明 |
| 性能优化 | 避免N+1查询,合理使用索引 |
| 日志记录 | 关键业务流程有日志记录 |
| 单元测试 | 核心业务逻辑有单元测试覆盖 |
文档版本: v1.0
创建日期: 2026-06-03
适用项目: 水质监测系统 (gw-sbh)