项目 – Wasting_Misaka.Blog https://forelink.top Hso! Tue, 13 Aug 2024 10:35:50 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.7.1 片区街道 https://forelink.top/index.php/2024/08/10/%e7%89%87%e5%8c%ba%e8%a1%97%e9%81%93/ Sat, 10 Aug 2024 15:34:03 +0000 https://forelink.top/?p=420 片区街道:修改了login跳转网址

片区街道表:

T_JD_PQ_JD_FL

ID
PQID 片区ID
JDBH 街道编号
JDMC 街道名称
ZXBZ 注销标志
BZ 备注
KZ1 
KZ2

建表语句:

create table T_JC_PQ_JD_FL
(
    ID          VARCHAR2(50) not null
        constraint T_JC_PQ_JD_FL_PK
            primary key,
    DISTRICT_ID VARCHAR2(50),
    STREET_CODE VARCHAR2(200),
    STREET_NAME VARCHAR2(200),
    DELETEFLAG  VARCHAR2(2),
    BZ          VARCHAR2(500),
    KZ1         VARCHAR2(4000),
    KZ2         VARCHAR2(4000)
)

/
comment on table T_JC_PQ_JD_FL is '片区街道-冯麟'
/
comment on column T_JC_PQ_JD_FL.ID is '主键'
/
comment on column T_JC_PQ_JD_FL.DISTRICT_ID is '片区ID(参考片区表的主键)'
/
comment on column T_JC_PQ_JD_FL.STREET_CODE is '街道编号'
/
comment on column T_JC_PQ_JD_FL.STREET_NAME is '街道名称'
/
comment on column T_JC_PQ_JD_FL.DELETEFLAG is '注销标志'
/
comment on column T_JC_PQ_JD_FL.BZ is '备注'
/
comment on column T_JC_PQ_JD_FL.KZ1 is '扩展1'
/
comment on column T_JC_PQ_JD_FL.KZ2 is '扩展2'
/

片区街道类:

public class DistrictStreet extends BaseEntity{
    -------------------------------------
    成员变量:
    String:
        id,districtId,districtName,streetCode,
        deleteFlag,bz,kz1,kz2
    //外部类,用以封装另外一个表中的数据
    District:
        district
    -------------------------------------
    成员方法:
    getter&setter方法
    toString方法
    //setDistrict方法中获取District中的districtName
    public void setDistrict(District district) {
        this.district = district;
        this.districtName = district.getDistrictName();
    }
    
}

片区列表查询:

列表查询T_JC_PQ表中片区街道,并从关联表T_JC_PQ_FL_1中获取数据

返回的数据查表会在片区表中得到片区名称,所以需要给 片区街道类 增加相关的变量,并提供对应的方法。

实体类:

// DistrictStreet
private String districtId;
private String districtName;
public District getDistrict() {
    return district;
}

public void setDistrict(District district) {
    this.district = district;
    this.districtName = district.getDistrictName();
}

Controller:

//DistrictStreetController
//shiro权限标识注解
//RESTful请求方式与请求url注解
//响应体注解
@RequiresPermissions("Estate:DistrictStreet:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(DistrictStreet districtStreet)
{
    startPage();
    List<DistrictStreet> list = districtStreetService.selectDistrictStreetList(districtStreet);
    return getDataTable(list);
}

Service:

//DistrictStreetServiceImpl
//接受mapper返回的数据
@Override
public List<DistrictStreet> selectDistrictStreetList(DistrictStreet districtStreet)
{
    List<DistrictStreet> back = new ArrayList<>();
    back =  districtStreetMapper.selectDistrictStreetList(districtStreet);
    return back;
}

Mapper:

需要在mapperXML中街道的ResultMap下加入标签,获取片区表 片区名称数据。查询时使用左连接查询街道作为主表数据。

<!-- DistrictStreetMapper.xml -->
<resultMap type="com.shggc.project.forelink.Estate.District.domain.District" id="DistrictResult">
        <result property="id"    column="id"    />
        <result property="districtCode"    column="district_code"    />
        <result property="districtName"    column="district_name"    />
        <result property="deleteFlag"    column="delete_flag"    />
        <result property="bz"    column="bz"    />
        <result property="kz1"    column="kz1"    />
        <result property="kz2"    column="kz2"    />
</resultMap>
    
<resultMap id="DistrictStreetResult" type="com.shggc.project.forelink.Estate.DistrictStreet.domain.DistrictStreet">
        <result property="id"    column="id"    />
        <result property="districtId"    column="district_id"    />
        <result property="streetCode"    column="street_code"    />
        <result property="streetName"    column="street_name"    />
        <result property="deleteflag"    column="deleteflag"    />
        <result property="bz"    column="bz"    />
        <result property="kz1"    column="kz1"    />
        <result property="kz2"    column="kz2"    />
        <association property="district" resultMap="DistrictResult"/>
</resultMap>

<sql id="selectDistrictStreetWithDistrict">
        select * from t_jc_pq_jd_fl jd join t_jc_pq_fl_1 pq on jd.district_id = pq.district_code
</sql>

<select id="selectDistrictStreetList" parameterType="com.shggc.project.forelink.Estate.DistrictStreet.domain.DistrictStreet" resultMap="DistrictStreetResult">
    <include refid="selectDistrictStreetWithDistrict"/>
    <where>
        <if test="districtId != null  and districtId != ''"> and district_id = #{districtId}</if>
        <if test="streetCode != null  and streetCode != ''"> and street_code = #{streetCode}</if>
        <if test="streetName != null  and streetName != ''"> and street_name like concat(concat('%', #{streetName}), '%')</if>
        <if test="deleteflag != null  and deleteflag != ''"> and deleteflag = #{deleteflag}</if>
        <if test="bz != null  and bz != ''"> and bz = #{bz}</if>
        <if test="kz1 != null  and kz1 != ''"> and kz1 = #{kz1}</if>
        <if test="kz2 != null  and kz2 != ''"> and kz2 = #{kz2}</if>
        <if test="districtName != null and districtName != ''"> and district_name like  concat(concat('%', #{districtName}), '%') </if>
    </where>
</select>

前端页面:

在columns中添加元素

//DistrictStreet.html
{
    field: 'districtName', //元素名称 传参时需要与变量名相匹配
    title: '归属片区', //
    sortable : true
}

刷新后,即可正确显示包含片区名称的街道信息。

片区条件查询:

片区添加:

片区名称下拉框:

​ 在添加页面,需要获取目前有的片区名称,并展示在可选择的下拉框中

Controller:

需要给前端传送包含所有片区id与名称的数据,给前端获取查看与发送id与名称正确对应的表单。

@GetMapping("/add")
public String add(ModelMap modelMap)
{
       // 通过Thymeleaf 中的ModelMap容器来存
    modelMap.put("DistrictSelect",districtStreetService.selectDistrictAll());
    return "Estate/DistrictStreet/add";
}

Service:

​ 封装数据,调用mapper接口并将获取的数据传给前端。

//规定返回的类型为 List<District>
@Override
public List<District> selectDistrictAll() {
    return districtStreetMapper.selectDistrictAll();
}

Mapper:

<select id="selectDistrictAll" resultType="com.shggc.project.forelink.Estate.District.domain.District">
    select district_Code as districtCode , district_name as districtName , id , delete_flag as deleteFlag, bz from t_jc_pq_fl_1
</select>

前端页面:

<!-- 下拉框元素值会被districtId携带传给服务器 -->
<select id="districtSelect" name="districtId" class="form-control select2-single required" required>
    <option value="" disabled selected>-- 请选择所属的片区 --</option>
    <!-- th:each遍历方法 设置临时变量D获取ModelMap中key为DistrictSelect的value -->
    <!-- th:text="下拉框文本" th:value="下拉框元素值" -->
    <!-- 提交表单时,只有th:value中的值被传给了服务器 -->
    <option th:each="D : ${DistrictSelect}" th:text="${D.districtName}" th:value="${D.districtCode}"></option>
</select>

片区修改:没做完

数据回显:

需求:

1. 返回包含以下数据的类
    片区名称
    街道编号
    街道名称
    注销标志
    备注
]]>
片区 https://forelink.top/index.php/2024/08/07/%e7%89%87%e5%8c%bawip/ Wed, 07 Aug 2024 12:43:33 +0000 https://forelink.top/?p=413 片区(WIP)

片区表:

T_JC_PQ -片区表 (住房、住户)

ID 主键 varchar(50) (主键、自增) (绝对不够吧喂)
PQBH 片区编号  varchar(50) (唯一)
PQMC 片区名称 varchar(200)  (唯一)
ZXBZ 注销标志 varchar(2)  (默认为0正常,1注销)
BZ 备注 varchar(500)  
KZ1 扩展1
KZ2 扩展2

片区类:

**成员变量**
String    
    主键 ID
    片区编号 pqbh
    片区名称 pqmc
    注销标志 zxbz
    备注 bz
    扩展1 kz1
    扩展2 kz2
List<TJcPqJd> 片区街道 存入片区中的街道
    
**成员方法**
getter&&setter 方法
toString方法

片区查询:

排序:

在District.html script脚本栏配置项option中加入json语句

// 在script下添加
$(FUNCTION(){
    var options = {
        sortable: true // 启用排序
        columns:[
        {
            field: 'districtCode',
            title: '片区编号',
            sortable: true // 开启排序
            },
            {
            field: 'districtName',
            title: '片区名称',
            sortable: true // 开启排序
            }
          ]
    }
}
)

片区页面 – 片区编号与片区名称出现排序按钮

片区添加:

添加功能:

点击添加按钮后,弹出添加窗口。 在添加窗口中点击确认按钮后,会将数据用表单发给后端,由后端在数据库中添加数据

必填项标识:

在 label 中加入 is-required 标识

<label class="col-sm-3 control-label is-required">片区编号:</label>
<label class="col-sm-3 control-label is-required">片区名称:</label>

必填项校验:

在对应的文本框中加入 **required **标识

// 片区编号
<input id="districtCode" name="districtCode" class="form-control" type="text" required>
//片区名称
<input id="districtName" name="districtName" class="form-control" type="text" required>

重复校验:

controller 中创建新方法 用以表单编号与表单名称的重复校验

// 注解1 请求url 
// 注解2 返回响应体给前端页面
@PostMapping("/checkDistrictCodeUnique")
@ResponseBody
public String checkDistrictCodeUnique(District district){
    String back = districtService.checkDistrictCodeUnique(district.getId(),district.getDistrictCode());
    return back;
}

@PostMapping("/checkDistrictNameUnique")
@ResponseBody
public String checkDistrictNameUnique(District district){
    String back = districtService.checkDistrictNameUnique(district.getId(),district.getDistrictName());
    return back;
}

service 将数据封装成 map<String[id] , String[Code]> 并传送给 mapper

@Override
public String checkDistrictNameUnique(String id, String districtName) {
    if (id != null && id.length() != 0) {
    }
    else {
        id = "1";
    }
    Map<String , String> map = new HashMap<String , String>();
    map.put("id", id);
    map.put("districtName", districtName);

    int count = districtMapper.checkDistrictNameUnique(map);
    if (count > 0){
        return "1";
    }
    return "0";
}

mapperservice 传入的 DistrictCode / DistrictName 与数据库中的 District_Code / District_Name 进行比对,并返回匹配到数据数量 需要考虑 新增片区 与 修改片区 的不同情况。

-- id!=#{id} 
 --  在新增片区时,#{id}为null,id一定匹配不上,会匹配所有数据
 --  在修改片区时,#{id}为需要回显的片区数据的id值,会被count忽略掉
-- district_Name=#{districtName}
 --  表单中的片区名称与数据库中的片区名称匹配时,count会+1
-- 最后一句为oracle语法 约定了不论有多少符合条件的数据
-- 只返回匹配到的数据里第一条符合条件的数据 在此例中可以删去
<select id="checkDistrictNameUnique" resultType="java.lang.Integer">
        select count(1) from t_jc_pq_fl_1 where id != #{id} and district_Name=#{districtName} and rownum <![CDATA[ <= ]]> 1
        </select>

在片区添加页面 add.html 中 脚本栏script 加入表单自定义校验(data? dataFilter?

https://doc.ruoyi.vip/ruoyi/document/qdsc.html#%E8%A1%A8%E5%8D%95%E6%A0%A1%E9%AA%8C
$("#form-District-add").validate({
            //数据校验 Jquery实现
            onkeyup: false,
            rules:{
                districtCode:{
                    minlength: 2,
                    maxlength: 20,
                    digits:true,
                    remote: {
                        //请求url 提交方式 数据类型
                        url: prefix + "/checkDistrictCodeUnique",
                        type: "post",
                        dataType: "json",
                        data: {
                            "id": function() {
                                return $("#id").val();
                            },
                            "districtCode": function() {
                                return $.common.trim($("#districtCode").val());
                            }
                        },
                        dataFilter: function(data, type) {
                            return $.validate.unique(data);
                        }
                    }
                },
                districtName:{
                    remote: {
                        url: prefix + "/checkDistrictNameUnique",
                        type: "post",
                        dataType: "json",
                        //外部引入的数据,需要对应json中的变量名
                        data: {
                            "id": function() {
                                return $("#id").val();
                            },
                            "districtName": function() {
                                return $.common.trim($("#districtName").val());
                            }
                        },
                        dataFilter: function(data, type) {
                            return $.validate.unique(data);
                        }
                    }
                }
            },
            messages: {
                // 反馈给前端页面文本框中的信息
                "districtCode": {
                    remote: "片区编号已经存在!"
                },
                "districtName": {
                    remote: "片区名称已经存在!"
                }
            },
            focusCleanup: true
        });

再打开页面,文本框失焦后调用对应方法,并将结果反馈给页面

片区修改:

暂无(代码工具生成

数据回显:

点击修改按钮后,弹出修改窗口,自动加载数据库中对应片区的数据,并预填进文本框

Controller:

//GET方法,请求url
//shiro权限标识
@GetMapping("/edit/{id}")
@RequiresPermissions("Estate:District:edit")
/**
 * id 从url中获取要修改的片区主键
 * mmap Thymeleaf的ModelMap 把对应id的片区传给Thymeleaf前端调用
 */
public String edit(@PathVariable("id") String id, ModelMap mmap)
{
    // 调用Serivce中的根据id查找对应片区数据方法
    District district = districtService.selectDistrictById(id);
    mmap.put("district", district);
    return "Estate/District/edit";
}

Service:

调用mapper中的方法查找到id对应的片区数据

Mapper:

<sql id="selectDistrictVo">
    select id, district_code, district_name, delete_flag, bz, kz1, kz2 from t_jc_pq_fl_1
</sql>

<select id="selectDistrictById" parameterType="java.lang.String" resultMap="DistrictResult">
    <include refid="selectDistrictVo"/>
    where id = #{id}
</select>

前端页面:

<!-- 使用 th:field="*{变量名}" 将thymeleaf中的数据获取到表单中 -->
<input id="id" name="id" th:field="*{id}" type="hidden">
    ... ...

数据修改:

在修改窗口中点击确认后,将数据封装并提交给后端,由后端更新数据库中的数据

数据校验:

方法同本文中 片区添加 – 重复校验,可以使用控制器中的同一方法

片区删除:

暂无(街道功能还在开发中)

确认提示框:

点击删除按钮后,页面弹出提示框,是否确认删除该片区,并在用户操作后继续

判断可否删除:

若片区下包含街道,则事务回滚,不能删除该片区

Service:

// cnt计数变量
// 调用mapper检查片区下街道数量
// cnt不为0时,返回0给前端
// cnt为0是,调用mapper删除该片区
@Override
public int deleteDistrictByIds(String ids)
{
    int cnt = districtMapper.checkDistrictEmpty(Convert.toStrArray(ids));
    if(cnt>0) return 0;
    return districtMapper.deleteDistrictByIds(Convert.toStrArray(ids));
}

Mapper:

-- foreach标签 --
-- id要从集合中获取的变量名 --
-- collection指定要遍历的集合数据类型 --
-- open语句起始 separator分隔符 close语句结尾
-- foreach 返回结果例:(1,2,3)
<select id="checkDistrictEmpty" resultType="java.lang.Integer">
    select count(*) from t_jc_pq_fl_1 pq
    join t_jc_pq_jd_fl jd
    on pq.id in
    <foreach item="id" collection="array" open="(" separator="," close=")">
        #{id}
    </foreach>
    and pq.DISTRICT_CODE = jd.DISTRICT_ID
</select>

片区条件查询:

能根据片区类的成员变量 条件查询对应的片区

暂无(代码工具生成

]]>