feat: 初始化项目并完成基础功能开发

- 完成项目初始化
- 实现用户注册、登录功能
- 完成用户管理与权限管理模块
- 开发后端 Tracker 服务器项目管理接口
- 实现日志管理接口
Change-Id: Ia4bde1c9ff600352a7ff0caca0cc50b02cad1af7
diff --git a/ruoyi-admin/src/main/resources/mapper/system/TrackerProjectMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/TrackerProjectMapper.xml
new file mode 100644
index 0000000..21e2223
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/system/TrackerProjectMapper.xml
@@ -0,0 +1,82 @@
+<?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.tracker.mapper.TrackerProjectMapper">
+    
+    <resultMap type="TrackerProject" id="TrackerProjectResult">
+        <result property="projectId"    column="project_id"    />
+        <result property="projectName"    column="project_name"    />
+        <result property="description"    column="description"    />
+        <result property="status"    column="status"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectTrackerProjectVo">
+        select project_id, project_name, description, status, create_by, create_time, update_by, update_time from tracker_project
+    </sql>
+
+    <select id="selectTrackerProjectList" parameterType="TrackerProject" resultMap="TrackerProjectResult">
+        <include refid="selectTrackerProjectVo"/>
+        <where>  
+            <if test="projectName != null  and projectName != ''"> and project_name like concat('%', #{projectName}, '%')</if>
+            <if test="description != null  and description != ''"> and description = #{description}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectTrackerProjectByProjectId" parameterType="Long" resultMap="TrackerProjectResult">
+        <include refid="selectTrackerProjectVo"/>
+        where project_id = #{projectId}
+    </select>
+
+    <insert id="insertTrackerProject" parameterType="TrackerProject" useGeneratedKeys="true" keyProperty="projectId">
+        insert into tracker_project
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="projectName != null and projectName != ''">project_name,</if>
+            <if test="description != null">description,</if>
+            <if test="status != null">status,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="projectName != null and projectName != ''">#{projectName},</if>
+            <if test="description != null">#{description},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTrackerProject" parameterType="TrackerProject">
+        update tracker_project
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="projectName != null and projectName != ''">project_name = #{projectName},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where project_id = #{projectId}
+    </update>
+
+    <delete id="deleteTrackerProjectByProjectId" parameterType="Long">
+        delete from tracker_project where project_id = #{projectId}
+    </delete>
+
+    <delete id="deleteTrackerProjectByProjectIds" parameterType="String">
+        delete from tracker_project where project_id in 
+        <foreach item="projectId" collection="array" open="(" separator="," close=")">
+            #{projectId}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/system/TrackerProjectUserMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/TrackerProjectUserMapper.xml
new file mode 100644
index 0000000..aa543d6
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/system/TrackerProjectUserMapper.xml
@@ -0,0 +1,66 @@
+<?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.tracker.mapper.TrackerProjectUserMapper">
+    
+    <resultMap type="TrackerProjectUser" id="TrackerProjectUserResult">
+        <result property="projectId"    column="project_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="role"    column="role"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectTrackerProjectUserVo">
+        select project_id, user_id, role, create_time from tracker_project_user
+    </sql>
+
+    <select id="selectTrackerProjectUserList" parameterType="TrackerProjectUser" resultMap="TrackerProjectUserResult">
+        <include refid="selectTrackerProjectUserVo"/>
+        <where>  
+            <if test="role != null  and role != ''"> and role = #{role}</if>
+        </where>
+    </select>
+    
+    <select id="selectTrackerProjectUserByProjectId" parameterType="Long" resultMap="TrackerProjectUserResult">
+        <include refid="selectTrackerProjectUserVo"/>
+        where project_id = #{projectId}
+    </select>
+
+    <insert id="insertTrackerProjectUser" parameterType="TrackerProjectUser">
+        insert into tracker_project_user
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="projectId != null">project_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="role != null and role != ''">role,</if>
+            <if test="createTime != null">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="projectId != null">#{projectId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="role != null and role != ''">#{role},</if>
+            <if test="createTime != null">#{createTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTrackerProjectUser" parameterType="TrackerProjectUser">
+        update tracker_project_user
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="role != null and role != ''">role = #{role},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where project_id = #{projectId}
+    </update>
+
+    <delete id="deleteTrackerProjectUserByProjectId" parameterType="Long">
+        delete from tracker_project_user where project_id = #{projectId}
+    </delete>
+
+    <delete id="deleteTrackerProjectUserByProjectIds" parameterType="String">
+        delete from tracker_project_user where project_id in 
+        <foreach item="projectId" collection="array" open="(" separator="," close=")">
+            #{projectId}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/system/TrackerTaskLogMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/TrackerTaskLogMapper.xml
new file mode 100644
index 0000000..117d057
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/system/TrackerTaskLogMapper.xml
@@ -0,0 +1,75 @@
+<?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.tracker.mapper.TrackerTaskLogMapper">
+    
+    <resultMap type="TrackerTaskLog" id="TrackerTaskLogResult">
+        <result property="logId"    column="log_id"    />
+        <result property="taskId"    column="task_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="action"    column="action"    />
+        <result property="description"    column="description"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectTrackerTaskLogVo">
+        select log_id, task_id, user_id, action, description, create_time from tracker_task_log
+    </sql>
+
+    <select id="selectTrackerTaskLogList" parameterType="TrackerTaskLog" resultMap="TrackerTaskLogResult">
+        <include refid="selectTrackerTaskLogVo"/>
+        <where>  
+            <if test="taskId != null "> and task_id = #{taskId}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="action != null  and action != ''"> and action = #{action}</if>
+            <if test="description != null  and description != ''"> and description = #{description}</if>
+        </where>
+    </select>
+    
+    <select id="selectTrackerTaskLogByLogId" parameterType="Long" resultMap="TrackerTaskLogResult">
+        <include refid="selectTrackerTaskLogVo"/>
+        where log_id = #{logId}
+    </select>
+
+    <insert id="insertTrackerTaskLog" parameterType="TrackerTaskLog" useGeneratedKeys="true" keyProperty="logId">
+        insert into tracker_task_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="taskId != null">task_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="action != null and action != ''">action,</if>
+            <if test="description != null">description,</if>
+            <if test="createTime != null">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="taskId != null">#{taskId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="action != null and action != ''">#{action},</if>
+            <if test="description != null">#{description},</if>
+            <if test="createTime != null">#{createTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTrackerTaskLog" parameterType="TrackerTaskLog">
+        update tracker_task_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="action != null and action != ''">action = #{action},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where log_id = #{logId}
+    </update>
+
+    <delete id="deleteTrackerTaskLogByLogId" parameterType="Long">
+        delete from tracker_task_log where log_id = #{logId}
+    </delete>
+
+    <delete id="deleteTrackerTaskLogByLogIds" parameterType="String">
+        delete from tracker_task_log where log_id in 
+        <foreach item="logId" collection="array" open="(" separator="," close=")">
+            #{logId}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/mapper/system/TrackerTaskMapper.xml b/ruoyi-admin/src/main/resources/mapper/system/TrackerTaskMapper.xml
new file mode 100644
index 0000000..0042ed0
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mapper/system/TrackerTaskMapper.xml
@@ -0,0 +1,89 @@
+<?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.tracker.mapper.TrackerTaskMapper">
+    
+    <resultMap type="TrackerTask" id="TrackerTaskResult">
+        <result property="taskId"    column="task_id"    />
+        <result property="projectId"    column="project_id"    />
+        <result property="taskName"    column="task_name"    />
+        <result property="description"    column="description"    />
+        <result property="assignedTo"    column="assigned_to"    />
+        <result property="status"    column="status"    />
+        <result property="priority"    column="priority"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectTrackerTaskVo">
+        select task_id, project_id, task_name, description, assigned_to, status, priority, create_time, update_time from tracker_task
+    </sql>
+
+    <select id="selectTrackerTaskList" parameterType="TrackerTask" resultMap="TrackerTaskResult">
+        <include refid="selectTrackerTaskVo"/>
+        <where>  
+            <if test="projectId != null "> and project_id = #{projectId}</if>
+            <if test="taskName != null  and taskName != ''"> and task_name like concat('%', #{taskName}, '%')</if>
+            <if test="description != null  and description != ''"> and description = #{description}</if>
+            <if test="assignedTo != null "> and assigned_to = #{assignedTo}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="priority != null  and priority != ''"> and priority = #{priority}</if>
+        </where>
+    </select>
+    
+    <select id="selectTrackerTaskByTaskId" parameterType="Long" resultMap="TrackerTaskResult">
+        <include refid="selectTrackerTaskVo"/>
+        where task_id = #{taskId}
+    </select>
+
+    <insert id="insertTrackerTask" parameterType="TrackerTask" useGeneratedKeys="true" keyProperty="taskId">
+        insert into tracker_task
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="projectId != null">project_id,</if>
+            <if test="taskName != null and taskName != ''">task_name,</if>
+            <if test="description != null">description,</if>
+            <if test="assignedTo != null">assigned_to,</if>
+            <if test="status != null">status,</if>
+            <if test="priority != null">priority,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="projectId != null">#{projectId},</if>
+            <if test="taskName != null and taskName != ''">#{taskName},</if>
+            <if test="description != null">#{description},</if>
+            <if test="assignedTo != null">#{assignedTo},</if>
+            <if test="status != null">#{status},</if>
+            <if test="priority != null">#{priority},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTrackerTask" parameterType="TrackerTask">
+        update tracker_task
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="projectId != null">project_id = #{projectId},</if>
+            <if test="taskName != null and taskName != ''">task_name = #{taskName},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="assignedTo != null">assigned_to = #{assignedTo},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="priority != null">priority = #{priority},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where task_id = #{taskId}
+    </update>
+
+    <delete id="deleteTrackerTaskByTaskId" parameterType="Long">
+        delete from tracker_task where task_id = #{taskId}
+    </delete>
+
+    <delete id="deleteTrackerTaskByTaskIds" parameterType="String">
+        delete from tracker_task where task_id in 
+        <foreach item="taskId" collection="array" open="(" separator="," close=")">
+            #{taskId}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file