本文件为公司统一配置(L1)的语言约束部分,合并了 Java 通用编码规范和 Tofly 后端技能约束。 按需动态加载:当任务涉及 Java 代码编写时加载本文件。
| 类型 | 约定 | 示例 |
|---|---|---|
| Controller 类 | XxxController |
UserController.java |
| Service 接口 | IXxxService |
IUserService.java |
| Service 实现 | XxxServiceImpl |
UserServiceImpl.java |
| Mapper 接口 | XxxMapper |
UserMapper.java |
| Entity / DO | Xxx / XxxDO |
UserDO.java |
| DTO | XxxDTO / XxxRequest / XxxResponse |
UserQueryRequest.java |
| 枚举 | XxxEnum |
UserStatusEnum.java |
| 常量类 | XxxConstants |
RedisConstants.java |
service/,实现在 service/impl/@Valid / @Validated + JSR-303 注解,不在 Service 里手写 if 判空@Slf4j,禁止 System.out.println@Transactional 只加在 Service 层,查询操作标注 readOnly = truePage<T> 对象tofly-admin/src/main/java/com/tofly/web/controller/...tolfy-hrm-business/src/main/java/...tolfy-hrm-business/src/main/resources/mapper/...tofly-systemtolfy-hrm-business)实现tofly-system 仅作平台级能力引用(user/role/dept/dict/config/permission),不是业务功能载体tofly-admin 统一暴露,业务实现委托到业务模块domain/HrmXxx.javaservice/IHrmXxxService.javaservice/impl/HrmXxxServiceImpl.javamapper/HrmXxxMapper.javaresources/mapper/.../HrmXxxMapper.xmlcontroller/hrm/HrmXxxController.javaController → Service → Mapper → XMLtofly-admin/.../controller/...BaseController、AjaxResult、TableDataInfo、@PreAuthorize、@Log、BusinessType、ExcelUtil、@DataScope、@Transactional@RestController + @RequestMapping("/module/entity") + extends BaseControllerstartPage(),返回 getDataTable(list)toAjax(...) / success(...) / error(...)@PreAuthorize("@ss.hasPermi('module:entity:action')") + @Log(title = "...", businessType = BusinessType.X)ExcelUtil<T>.exportExcel(...) / ExcelUtil<T>.importExcel(...)list/export/getInfo/add/edit/remove),优先使用共享基类方法,而非复制粘贴HrmCrudControllerSupport(在 tofly-admin/.../controller/hrm)HistoricTaskCommentSupport.apply(...)window.RUOYI_DESIGNER_TOOLBAR_ACTIONS)记录预期的定制点@DataScope@TransactionalServiceExceptioncreateBy/updateBy)在 Controller 设置@Validated @RequestBodycheckXxxUnique)checkUserAllowed(...) / checkUserDataScope(...)ServiceException@DataScope(deptAlias = "...", userAlias = "...")@TransactionalBaseEntity,获得:createBy/createTime/updateBy/updateTime/remark + params@Excel 注解@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")resultMap → 基础 <sql> → 动态 <where>/<set> → <foreach> 批量操作BaseEntity.params 模式resultMap(命名为 XxxResult)<sql id="selectXxxVo">)<where> + <if><set> + <if><foreach>startPage() + 插件)List<Map>GET /xxx/listGET /xxx/{id}POST /xxxPUT /xxxDELETE /xxx/{ids}POST /xxx/exportPOST /xxx/importData + POST /xxx/importTemplateTableDataInfo,Mutations → AjaxResult,Detail → success(data)后端功能完成前必须逐项检查:
@PreAuthorize + @Log)ExcelUtil@DataScopeHrmCrudControllerSupportHistoricTaskCommentSupport.apply(...)BaseController 分页/响应方法@PreAuthorize + 权限命名模式@Log + BusinessTypeExcelUtil 导入导出@DataScope 数据范围ServiceException、AjaxResult)@RestController
@RequestMapping("/hrm/employee")
public class HrmEmployeeController extends BaseController {
@Autowired
private IHrmEmployeeService employeeService;
@PreAuthorize("@ss.hasPermi('hrm:employee:list')")
@GetMapping("/list")
public TableDataInfo list(HrmEmployee employee) {
startPage();
List<HrmEmployee> list = employeeService.selectEmployeeList(employee);
return getDataTable(list);
}
@Log(title = "人员档案", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('hrm:employee:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, HrmEmployee employee) {
List<HrmEmployee> list = employeeService.selectEmployeeList(employee);
ExcelUtil<HrmEmployee> util = new ExcelUtil<>(HrmEmployee.class);
util.exportExcel(response, list, "人员档案数据");
}
@PreAuthorize("@ss.hasPermi('hrm:employee:query')")
@GetMapping("/{empId}")
public AjaxResult getInfo(@PathVariable Long empId) {
return success(employeeService.selectEmployeeById(empId));
}
@PreAuthorize("@ss.hasPermi('hrm:employee:add')")
@Log(title = "人员档案", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody HrmEmployee employee) {
employee.setCreateBy(getUsername());
return toAjax(employeeService.insertEmployee(employee));
}
@PreAuthorize("@ss.hasPermi('hrm:employee:edit')")
@Log(title = "人员档案", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody HrmEmployee employee) {
employee.setUpdateBy(getUsername());
return toAjax(employeeService.updateEmployee(employee));
}
@PreAuthorize("@ss.hasPermi('hrm:employee:remove')")
@Log(title = "人员档案", businessType = BusinessType.DELETE)
@DeleteMapping("/{empIds}")
public AjaxResult remove(@PathVariable Long[] empIds) {
return toAjax(employeeService.deleteEmployeeByIds(empIds));
}
}
@Service
public class HrmEmployeeServiceImpl implements IHrmEmployeeService {
@Autowired
private HrmEmployeeMapper employeeMapper;
@Override
@DataScope(deptAlias = "d", userAlias = "u")
public List<HrmEmployee> selectEmployeeList(HrmEmployee employee) {
return employeeMapper.selectEmployeeList(employee);
}
@Override
@Transactional
public int insertEmployee(HrmEmployee employee) {
if (!checkEmpCodeUnique(employee)) {
throw new ServiceException("工号已存在");
}
return employeeMapper.insertEmployee(employee);
}
@Override
@Transactional
public int updateEmployee(HrmEmployee employee) {
if (!checkEmpCodeUnique(employee)) {
throw new ServiceException("工号已存在");
}
return employeeMapper.updateEmployee(employee);
}
}
public interface HrmEmployeeMapper {
HrmEmployee selectEmployeeById(Long empId);
List<HrmEmployee> selectEmployeeList(HrmEmployee employee);
int insertEmployee(HrmEmployee employee);
int updateEmployee(HrmEmployee employee);
int deleteEmployeeById(Long empId);
int deleteEmployeeByIds(Long[] empIds);
}
<mapper namespace="com.tofly.system.mapper.HrmEmployeeMapper">
<resultMap id="HrmEmployeeResult" type="HrmEmployee">
<id property="empId" column="emp_id"/>
<result property="empName" column="emp_name"/>
<result property="deptId" column="dept_id"/>
<result property="createTime" column="create_time"/>
</resultMap>
<sql id="selectEmployeeVo">
select emp_id, emp_name, dept_id, create_time
from hrm_employee
</sql>
<select id="selectEmployeeList" parameterType="HrmEmployee" resultMap="HrmEmployeeResult">
<include refid="selectEmployeeVo"/>
<where>
<if test="empName != null and empName != ''">
and emp_name like concat('%', #{empName}, '%')
</if>
<if test="params.beginTime != null and params.beginTime != ''">
and date_format(create_time,'%Y%m%d') >= date_format(#{params.beginTime},'%Y%m%d')
</if>
</where>
</select>
</mapper>
@RestController
@RequestMapping("/hrm/taxBracket")
public class HrmTaxBracketController extends HrmCrudControllerSupport {
@Autowired
private IHrmTaxBracketService taxBracketService;
@PreAuthorize("@ss.hasPermi('hrm:taxBracket:list')")
@GetMapping("/list")
public TableDataInfo list(HrmTaxBracket query) {
return pageQuery(query, taxBracketService::selectHrmTaxBracketList);
}
@PreAuthorize("@ss.hasPermi('hrm:taxBracket:query')")
@GetMapping("/{bracketId}")
public AjaxResult getInfo(@PathVariable Long bracketId) {
return queryOne(bracketId, taxBracketService::selectHrmTaxBracketById);
}
@PreAuthorize("@ss.hasPermi('hrm:taxBracket:add')")
@PostMapping
public AjaxResult add(@RequestBody HrmTaxBracket row) {
return createOne(row, x -> x.setCreateBy(getUsername()), taxBracketService::insertHrmTaxBracket);
}
}
最后更新:2026-04-18 版本:4.0.0(3层架构版)