This commit is contained in:
磷叶 2025-01-22 10:45:56 +08:00
parent 94867a8e5d
commit 4b31f832bb
13 changed files with 593 additions and 5 deletions

34
.cursorrules Normal file
View File

@ -0,0 +1,34 @@
# 项目背景
这是一个基于RuoYi-Vue的项目管理系统主要用于管理项目、任务分配、以及客户管理。
# 主要框架
- SpringBoot
- MyBatis
- SpringSecurity
# 编码标准
- 保持与现有代码风格一致
- 代码需要具有可读性,注释清晰,后续可拓展
- 生成的代码需要自动导入相关依赖,这点很重要
- 遵循阿里巴巴开发手册
# 项目结构
- 项目结构参考ruoyi-vue
- ruoyi-system 为系统模块同时也作为业务模块。业务代码放在com.ruoyi.bst包下
- ruoyi-web 为web模块主要用于提供接口服务
- ruoyi-common 为公共模块,主要用于提供公共工具类
- 业务代码都放在com.ruoyi.bst.{模块名} 包下,具体结构如下:
- com.ruoyi.bst.{模块名}
- controller 用于提供接口服务
- service 用于提供业务逻辑
- mapper 用于提供数据库操作
- domain 用于提供数据对象
- enums 用于提供枚举类
- vo 用于提供前端展示对象
- dto 用于提供前后端交互对象
- constants 用于提供模块级别的常量(如果有)
- utils 用于提供模块级别的工具类
# 文档规范
- 使用 JavaDoc 格式编写函数和组件的注释
- 适当添加行间注释

View File

@ -353,8 +353,9 @@
</template>
<script>
import {get${BusinessName}, list${BusinessName}} from "@/api/";
import FormCol from "@/components/FormCol/index.vue";
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
import { $showColumns } from '@/utils/mixins';
import FormCol from "@/components/FormCol/index.vue";
// 默认排序字段
const defaultSort = {

View File

@ -0,0 +1,76 @@
package com.ruoyi.bst.project.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 项目对象 bst_project
*
* @author ruoyi
* @date 2025-01-22
*/
@Data
public class Project extends BaseEntity
{
private static final long serialVersionUID = 1L;
private Long id;
@Excel(name = "项目编号")
@ApiModelProperty("项目编号")
private String no;
@Excel(name = "项目名称")
@ApiModelProperty("项目名称")
private String name;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "到期时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("到期时间")
private Date expireTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "运维时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("运维时间")
private Date operationTime;
@Excel(name = "负责人ID")
@ApiModelProperty("负责人ID")
private Long ownerId;
@Excel(name = "跟进人ID")
@ApiModelProperty("跟进人ID")
private Long followId;
@Excel(name = "项目金额")
@ApiModelProperty("项目金额")
private BigDecimal amount;
@Excel(name = "已收金额")
@ApiModelProperty("已收金额")
private BigDecimal receivedAmount;
@Excel(name = "运维费用")
@ApiModelProperty("运维费用")
private String operationAmount;
@Excel(name = "状态", readConverterExp = "1=进行中,2=已完成,3=维护,4=开发超期,5=维护超期")
@ApiModelProperty("状态")
private String status;
@Excel(name = "附件")
@ApiModelProperty("附件")
private String attaches;
@Excel(name = "客户ID")
@ApiModelProperty("客户ID")
private Long customerId;
}

View File

@ -0,0 +1,11 @@
package com.ruoyi.bst.project.domain;
import lombok.Data;
/**
* @author wjh
* 2025/1/22
*/
@Data
public class ProjectQuery extends ProjectVO {
}

View File

@ -0,0 +1,11 @@
package com.ruoyi.bst.project.domain;
import lombok.Data;
/**
* @author wjh
* 2025/1/22
*/
@Data
public class ProjectVO extends Project{
}

View File

@ -0,0 +1,64 @@
package com.ruoyi.bst.project.mapper;
import java.util.List;
import com.ruoyi.bst.project.domain.Project;
import com.ruoyi.bst.project.domain.ProjectVO;
import com.ruoyi.bst.project.domain.ProjectQuery;
import org.apache.ibatis.annotations.Param;
/**
* 项目Mapper接口
*
* @author ruoyi
* @date 2025-01-22
*/
public interface ProjectMapper
{
/**
* 查询项目
*
* @param id 项目主键
* @return 项目
*/
ProjectVO selectProjectById(Long id);
/**
* 查询项目列表
*
* @param query 项目
* @return 项目集合
*/
List<ProjectVO> selectProjectList(@Param("query")ProjectQuery query);
/**
* 新增项目
*
* @param project 项目
* @return 结果
*/
int insertProject(Project project);
/**
* 修改项目
*
* @param project 项目
* @return 结果
*/
public int updateProject(@Param("data") Project project);
/**
* 删除项目
*
* @param id 项目主键
* @return 结果
*/
int deleteProjectById(Long id);
/**
* 批量删除项目
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteProjectByIds(Long[] ids);
}

View File

@ -0,0 +1,124 @@
<?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.ruoyi.bst.project.mapper.ProjectMapper">
<resultMap type="ProjectVO" id="ProjectResult" autoMapping="true"/>
<sql id="selectProjectVo">
select
bp.id,
bp.no,
bp.name,
bp.create_time,
bp.expire_time,
bp.operation_time,
bp.owner_id,
bp.follow_id,
bp.amount,
bp.received_amount,
bp.operation_amount,
bp.status,
bp.remark,
bp.attaches,
bp.customer_id
from bst_project bp
</sql>
<sql id="searchCondition">
<if test="query.id != null "> and bp.id = #{query.id}</if>
<if test="query.no != null and query.no != ''"> and bp.no like concat('%', #{query.no}, '%')</if>
<if test="query.name != null and query.name != ''"> and bp.name like concat('%', #{query.name}, '%')</if>
<if test="query.ownerId != null "> and bp.owner_id = #{query.ownerId}</if>
<if test="query.followId != null "> and bp.follow_id = #{query.followId}</if>
<if test="query.status != null and query.status != ''"> and bp.status = #{query.status}</if>
<if test="query.remark != null and query.remark != ''"> and bp.remark like concat('%', #{query.remark}, '%')</if>
<if test="query.customerId != null "> and bp.customer_id = #{query.customerId}</if>
${query.params.dataScope}
</sql>
<select id="selectProjectList" parameterType="ProjectQuery" resultMap="ProjectResult">
<include refid="selectProjectVo"/>
<where>
<include refid="searchCondition"/>
</where>
</select>
<select id="selectProjectById" parameterType="Long" resultMap="ProjectResult">
<include refid="selectProjectVo"/>
where bp.id = #{id}
</select>
<insert id="insertProject" parameterType="Project" useGeneratedKeys="true" keyProperty="id">
insert into bst_project
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="no != null and no != ''">no,</if>
<if test="name != null and name != ''">name,</if>
<if test="createTime != null">create_time,</if>
<if test="expireTime != null">expire_time,</if>
<if test="operationTime != null">operation_time,</if>
<if test="ownerId != null">owner_id,</if>
<if test="followId != null">follow_id,</if>
<if test="amount != null">amount,</if>
<if test="receivedAmount != null">received_amount,</if>
<if test="operationAmount != null">operation_amount,</if>
<if test="status != null and status != ''">`status`,</if>
<if test="remark != null">remark,</if>
<if test="attaches != null">attaches,</if>
<if test="customerId != null">customer_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="no != null and no != ''">#{no},</if>
<if test="name != null and name != ''">#{name},</if>
<if test="createTime != null">#{createTime},</if>
<if test="expireTime != null">#{expireTime},</if>
<if test="operationTime != null">#{operationTime},</if>
<if test="ownerId != null">#{ownerId},</if>
<if test="followId != null">#{followId},</if>
<if test="amount != null">#{amount},</if>
<if test="receivedAmount != null">#{receivedAmount},</if>
<if test="operationAmount != null">#{operationAmount},</if>
<if test="status != null and status != ''">#{status},</if>
<if test="remark != null">#{remark},</if>
<if test="attaches != null">#{attaches},</if>
<if test="customerId != null">#{customerId},</if>
</trim>
</insert>
<update id="updateProject" parameterType="Project">
update bst_project
<trim prefix="SET" suffixOverrides=",">
<include refid="updateColumns"/>
</trim>
where id = #{data.id}
</update>
<sql id="updateColumns">
<if test="data.no != null and data.no != ''">no = #{data.no},</if>
<if test="data.name != null and data.name != ''">name = #{data.name},</if>
<if test="data.createTime != null">create_time = #{data.createTime},</if>
<if test="data.expireTime != null">expire_time = #{data.expireTime},</if>
<if test="data.operationTime != null">operation_time = #{data.operationTime},</if>
<if test="data.ownerId != null">owner_id = #{data.ownerId},</if>
<if test="data.followId != null">follow_id = #{data.followId},</if>
<if test="data.amount != null">amount = #{data.amount},</if>
<if test="data.receivedAmount != null">received_amount = #{data.receivedAmount},</if>
<if test="data.operationAmount != null">operation_amount = #{data.operationAmount},</if>
<if test="data.status != null and data.status != ''">status = #{data.status},</if>
<if test="data.remark != null">remark = #{data.remark},</if>
<if test="data.attaches != null">attaches = #{data.attaches},</if>
<if test="data.customerId != null">customer_id = #{data.customerId},</if>
</sql>
<delete id="deleteProjectById" parameterType="Long">
delete from bst_project where id = #{id}
</delete>
<delete id="deleteProjectByIds" parameterType="String">
delete from bst_project where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,63 @@
package com.ruoyi.bst.project.service;
import java.util.List;
import com.ruoyi.bst.project.domain.Project;
import com.ruoyi.bst.project.domain.ProjectVO;
import com.ruoyi.bst.project.domain.ProjectQuery;
/**
* 项目Service接口
*
* @author ruoyi
* @date 2025-01-22
*/
public interface ProjectService
{
/**
* 查询项目
*
* @param id 项目主键
* @return 项目
*/
public ProjectVO selectProjectById(Long id);
/**
* 查询项目列表
*
* @param project 项目
* @return 项目集合
*/
public List<ProjectVO> selectProjectList(ProjectQuery project);
/**
* 新增项目
*
* @param project 项目
* @return 结果
*/
public int insertProject(Project project);
/**
* 修改项目
*
* @param project 项目
* @return 结果
*/
public int updateProject(Project project);
/**
* 批量删除项目
*
* @param ids 需要删除的项目主键集合
* @return 结果
*/
public int deleteProjectByIds(Long[] ids);
/**
* 删除项目信息
*
* @param id 项目主键
* @return 结果
*/
public int deleteProjectById(Long id);
}

View File

@ -0,0 +1,97 @@
package com.ruoyi.bst.project.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.bst.project.mapper.ProjectMapper;
import com.ruoyi.bst.project.domain.Project;
import com.ruoyi.bst.project.domain.ProjectVO;
import com.ruoyi.bst.project.domain.ProjectQuery;
import com.ruoyi.bst.project.service.ProjectService;
/**
* 项目Service业务层处理
*
* @author ruoyi
* @date 2025-01-22
*/
@Service
public class ProjectServiceImpl implements ProjectService
{
@Autowired
private ProjectMapper projectMapper;
/**
* 查询项目
*
* @param id 项目主键
* @return 项目
*/
@Override
public ProjectVO selectProjectById(Long id)
{
return projectMapper.selectProjectById(id);
}
/**
* 查询项目列表
*
* @param project 项目
* @return 项目
*/
@Override
public List<ProjectVO> selectProjectList(ProjectQuery project)
{
return projectMapper.selectProjectList(project);
}
/**
* 新增项目
*
* @param project 项目
* @return 结果
*/
@Override
public int insertProject(Project project)
{
project.setCreateTime(DateUtils.getNowDate());
return projectMapper.insertProject(project);
}
/**
* 修改项目
*
* @param project 项目
* @return 结果
*/
@Override
public int updateProject(Project project)
{
return projectMapper.updateProject(project);
}
/**
* 批量删除项目
*
* @param ids 需要删除的项目主键
* @return 结果
*/
@Override
public int deleteProjectByIds(Long[] ids)
{
return projectMapper.deleteProjectByIds(ids);
}
/**
* 删除项目信息
*
* @param id 项目主键
* @return 结果
*/
@Override
public int deleteProjectById(Long id)
{
return projectMapper.deleteProjectById(id);
}
}

View File

@ -0,0 +1,107 @@
package com.ruoyi.web.bst;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.bst.project.domain.Project;
import com.ruoyi.bst.project.domain.ProjectVO;
import com.ruoyi.bst.project.domain.ProjectQuery;
import com.ruoyi.bst.project.service.ProjectService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 项目Controller
*
* @author ruoyi
* @date 2025-01-22
*/
@RestController
@RequestMapping("/bst/project")
public class ProjectController extends BaseController
{
@Autowired
private ProjectService projectService;
/**
* 查询项目列表
*/
@PreAuthorize("@ss.hasPermi('bst:project:list')")
@GetMapping("/list")
public TableDataInfo list(ProjectQuery query)
{
startPage();
startOrderBy();
List<ProjectVO> list = projectService.selectProjectList(query);
return getDataTable(list);
}
/**
* 导出项目列表
*/
@PreAuthorize("@ss.hasPermi('bst:project:export')")
@Log(title = "项目", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, ProjectQuery query)
{
List<ProjectVO> list = projectService.selectProjectList(query);
ExcelUtil<ProjectVO> util = new ExcelUtil<ProjectVO>(ProjectVO.class);
util.exportExcel(response, list, "项目数据");
}
/**
* 获取项目详细信息
*/
@PreAuthorize("@ss.hasPermi('bst:project:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(projectService.selectProjectById(id));
}
/**
* 新增项目
*/
@PreAuthorize("@ss.hasPermi('bst:project:add')")
@Log(title = "项目", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Project project)
{
return toAjax(projectService.insertProject(project));
}
/**
* 修改项目
*/
@PreAuthorize("@ss.hasPermi('bst:project:edit')")
@Log(title = "项目", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Project project)
{
return toAjax(projectService.updateProject(project));
}
/**
* 删除项目
*/
@PreAuthorize("@ss.hasPermi('bst:project:remove')")
@Log(title = "项目", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(projectService.deleteProjectByIds(ids));
}
}

View File

@ -6,7 +6,7 @@ spring:
druid:
# 主库数据源
master:
url: jdbc:mysql://localhost:3306/factory?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mysql://localhost:3306/project-manager?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
# 从库数据源

View File

@ -6,7 +6,7 @@ spring:
# 端口默认为6379
port: 6379
# 数据库索引
database: 6
database: 7
# 密码
password:
# 连接超时时间

View File

@ -1,7 +1,7 @@
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
port: 3801
port: 4001
servlet:
# 应用的访问路径
context-path: /