这是我们的项目实训任务,项目是一个基于deepseek api的律师助手,提供包括为律师提供直观的案件管理界面、阶段性帮助建议、日程安排与提醒、智能案件分析、相关案例与判决趋势提供等律师助手功能,和案件分析与预测、智能法律搜索功能、法律通俗解释、法律文档生成与模板等基础功能。项目开发采用flask+langchain+springboot框架开发,项目代码放在了起司起司酱/LawyerHelper。目前项目还在持续推进中。

        我的任务是,实现案例和法律法规的检索,保证案例和法律法规的实时更新,包括数据库部分,这是第一篇博客,后续还会不断更新。我的队友起司起司酱已经把后端基本框架搭建好了,我在他的基础上继续添加功能

        网站法律数据和诉讼案件数据分别来源自国家法律法规数据库与中国裁判文书网,根据数据来源和后续需求,数据库暂时设计如下

并对于律师群体关注度较高,查询可能较为频繁,且几乎不修改的几个键建立索引

然后编写对应实体类,并设计接口

package com.project.practice.mapper;

import com.project.practice.domain.LawSuit;
import org.apache.ibatis.annotations.Param;
import java.util.Vector;

public interface LawSuitMapper {
    // 查询方法(保持原有)
    LawSuit getLawSuitByID(Long caseId);

    //模糊搜索
    Vector<LawSuit> getLawSuitByAllExceptFullText(
            @Param("court") String court,
            @Param("caseType") String caseType,
            @Param("cause") String cause,
            @Param("legalBasis") String legalBasis,
            @Param("parties") String parties,
            @Param("trialProcedure") String trialProcedure,
            @Param("caseName") String caseName,
            @Param("caseNumber") String caseNumber,
            @Param("region") String region,
            @Param("judgmentDate") String judgmentDate,
            @Param("publishDate") String publishDate,
            @Param("caseTypeSource") String caseTypeSource);

    //插入
    int insertLawSuit(LawSuit lawSuit);

    //更新
    int updateLawSuit(@Param("caseId") Long caseId, @Param("lawSuit") LawSuit lawSuit);

    //删除
    int deleteLawSuitByID(Long caseId);

    // 批量插入
    int batchInsertLawSuits(@Param("list") Vector<LawSuit> lawSuits);
}

package com.project.practice.mapper;

import com.project.practice.domain.Law;

import feign.Param;

import org.apache.ibatis.annotations.*;

import java.util.List;

public interface LawMapper {
        //插入
        int insert(Law law);

        //更新
        int update(Law law);

        //删除
        int deleteById(Long id);

        //Id查询
        Law selectById(Long id);

        // List<Law> selectByTitle(String title);

        // List<Law> selectByAuthority(String authority);

        // List<Law> selectByValidityStatus(String status);
        //模糊搜索
        List<Law> searchLaws(@Param("title") String title,
                        @Param("authority") String authority,
                        @Param("nature") String nature,
                        @Param("status") String status);
}

然后就是Service和Controller的封装和MyBatis的映射实现

<?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.project.practice.mapper.LawSuitMapper">

    <!-- 基础字段映射 -->
    <resultMap id="LawSuitResultMap" type="com.project.practice.domain.LawSuit">
        <id property="caseId" column="案件ID" />
        <result property="originalUrl" column="原始链接"/>
        <result property="caseNumber" column="案号"/>
        <result property="caseName" column="案件名称"/>
        <result property="court" column="法院"/>
        <result property="region" column="所属地区"/>
        <result property="caseType" column="案件类型"/>
        <result property="caseTypeSource" column="案件类型摘要源"/>
        <result property="trialProcedure" column="审理程序"/>
        <result property="judgmentDate" column="裁判日期"/>
        <result property="publishDate" column="公开日期"/>
        <result property="parties" column="当事人"/>
        <result property="cause" column="案由"/>
        <result property="legalBasis" column="法律依据"/>
        <!-- 全文字段通常不返回 -->
    </resultMap>

    <!-- 1. 按ID精确查询 -->
    <select id="getLawSuitByID" resultMap="LawSuitResultMap">
        SELECT * FROM 案件信息 WHERE 案件ID = #{caseId}
    </select>

    <!-- 保持原有resultMap -->
    <resultMap id="BaseResultMap" type="com.project.practice.domain.LawSuit">
        <id column="id" property="caseId" jdbcType="INTEGER"/>
        <!-- 其他字段映射... -->
    </resultMap>

    <!-- 保持原有查询方法... -->

    <!-- 新增案件 -->
    <insert id="insertLawSuit" useGeneratedKeys="true" keyProperty="caseId" >
        INSERT INTO 案件信息 (
            案号, 案件名称, 法院, 所属地区,
            案件类型, 案件类型摘要源, 审理程序,
            裁判日期, 公开日期, 当事人,
            案由, 法律依据
        ) VALUES (
            #{caseNumber}, #{caseName}, #{court}, #{region},
            #{caseType}, #{caseTypeSource}, #{trialProcedure},
            #{judgmentDate}, #{publishDate}, #{parties},
            #{cause}, #{legalBasis}
        )
    </insert>

    <!-- 更新案件 -->
 <update id="updateLawSuit">
    UPDATE 案件信息
    <set>
        <if test="lawSuit.caseNumber != null">案号 = #{lawSuit.caseNumber},</if>
        <if test="lawSuit.caseName != null">案件名称 = #{lawSuit.caseName},</if>
        <if test="lawSuit.court != null">法院 = #{lawSuit.court},</if>
        <if test="lawSuit.region != null">所属地区 = #{lawSuit.region},</if>
        <if test="lawSuit.caseType != null">案件类型 = #{lawSuit.caseType},</if>
        <if test="lawSuit.caseTypeSource != null">案件类型摘要源 = #{lawSuit.caseTypeSource},</if>
        <if test="lawSuit.trialProcedure != null">审理程序 = #{lawSuit.trialProcedure},</if>
        <if test="lawSuit.judgmentDate != null">裁判日期 = #{lawSuit.judgmentDate},</if>
        <if test="lawSuit.publishDate != null">公开日期 = #{lawSuit.publishDate},</if>
        <if test="lawSuit.parties != null">当事人 = #{lawSuit.parties},</if>
        <if test="lawSuit.cause != null">案由 = #{lawSuit.cause},</if>
        <if test="lawSuit.legalBasis != null">法律依据 = #{lawSuit.legalBasis},</if>
    </set>
    WHERE 案件id = #{caseId}
</update>

    <!-- 删除案件 -->
    <delete id="deleteLawSuitByID" >
        DELETE FROM 案件信息 WHERE 案件id = #{caseId}
    </delete>

    <!-- 批量插入(可选) -->
    <insert id="batchInsertLawSuits" useGeneratedKeys="true" keyProperty="caseId">
        INSERT INTO 案件信息 (
            case_number, case_name, court, region,
            case_type, case_type_source, trial_procedure,
            judgment_date, publish_date, parties,
            cause, legal_basis
        ) VALUES 
        <foreach collection="list" item="item" separator=",">
            (
            #{item.caseNumber}, #{item.caseName}, #{item.court}, #{item.region},
            #{item.caseType}, #{item.caseTypeSource}, #{item.trialProcedure},
            #{item.judgmentDate}, #{item.publishDate}, #{item.parties},
            #{item.cause}, #{item.legalBasis}
            )
        </foreach>
    </insert>

    <!-- 3. 多条件模糊查询 (动态SQL) -->
    <select id="getLawSuitByAllExceptFullText" resultMap="LawSuitResultMap">
        SELECT * FROM 案件信息
        <where>
            <if test="court != null and court != ''">
                AND 法院 LIKE CONCAT('%', #{court}, '%')
            </if>
            <if test="caseType != null and caseType != ''">
                AND 案件类型 LIKE CONCAT('%', #{caseType}, '%')
            </if>
            <if test="cause != null and cause != ''">
                AND 案由 LIKE CONCAT('%', #{cause}, '%')
            </if>
            <if test="legalBasis != null and legalBasis != ''">
                AND 法律依据 LIKE CONCAT('%', #{legalBasis}, '%')
            </if>
            <if test="parties != null and parties != ''">
                AND 当事人 LIKE CONCAT('%', #{parties}, '%')
            </if>
            <if test="trialProcedure != null and trialProcedure != ''">
                AND 审理程序 LIKE CONCAT('%', #{trialProcedure}, '%')
            </if>
            <if test="caseName != null and caseName != ''">
                AND 案件名称 LIKE CONCAT('%', #{caseName}, '%')
            </if>
            <if test="caseNumber != null and caseNumber != ''">
                AND 案号 LIKE CONCAT('%', #{caseNumber}, '%')
            </if>
            <if test="region != null and region != ''">
                AND 所属地区 LIKE CONCAT('%', #{region}, '%')
            </if>
            <if test="judgmentDate != null and judgmentDate != ''">
                AND 裁判日期 LIKE CONCAT('%', #{judgmentDate}, '%')
            </if>
            <if test="publishDate != null and publishDate != ''">
                AND 公开日期 LIKE CONCAT('%', #{publishDate}, '%')
            </if>
            <if test="caseTypeSource != null and caseTypeSource != ''">
                AND 案件类型摘要源 LIKE CONCAT('%', #{caseTypeSource}, '%')
            </if>
        </where>
    </select>

</mapper>

然后就是进行简单的测试 

### GET request to example server
GET https://examples.http-client.intellij.net/get
    ?generated-in=IntelliJ IDEA

###
GET http://localhost:8080/user/count

###
POST http://localhost:8080/user/register
Content-Type: application/x-www-form-urlencoded

### 1. 按ID删除案件
DELETE http://localhost:8080/lawSuits/6

### 2. 条件查询案件列表
GET http://localhost:8080/lawSuits/search?案件类型="侵权纠纷"

### 3. 按ID查询单个案件
GET http://localhost:8080/lawSuits/7

### 4. 新增案件
POST http://localhost:8080/lawSuits
Content-Type: application/json

{
    "caseType": "侵犯知识产权",
    "caseName": "张三与李四的侵权案件"
}

### 5. 更新案件
PUT http://localhost:8080/lawSuits/7
Content-Type: application/json

{
    "caseType": "侵犯知识产权",
    "caseName": "张三与李四的侵权案件"
}

经过简单的测试,没有问题,这两个模块暂时差不多,就不赘述了,这次做的都是些简单重复的工作,最主要的要求就是要细致与严谨吧,难点应当是在之后的实时更新数据库与爬虫的实现,这些功能也会在接下来的项目推进中逐步实现并完善增强。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐