DTO、VO、Entity、Condition使用习惯,以及对于多映射关系字段的处理

2023-11-11

        POJO 的定义是无规则简单的对象,在日常的代码分层中 pojo 会被分为VO、BO、 PO、 DTO。

一、定义和使用情景

Entity:对象实体类,一般就是和数据库表字段一一对应的那个类。

DTO(Data Transfer Object):数据传输对象,在服务间的调用中,传输的数据对象。-- 个人理解,DTO是可以存在于各层服务中(接口、服务、数据库等等)服务间的交互使用DTO来解耦。就我个人来说,一般习惯把关系比较复杂(比如说需要联表查询)的字段封装在DTO当中,当作Mybatis中的封装对象,而不是直接把Entity实体类作为封装对象,这个类中一般包含多个Entity的属性,具体视业务需求而定。

VO(view object/value object):前端展示层对象,也就是我们查询出的数据进行封装后返回给前端的那个类,此类中的数据根据前端所需仅显示DTO中的部分属性,而无需将全部的DTO属性返给前端。 --  个人理解使用场景,接口层服务中,将DTO转成VO,返回给前台。

B0(bussines object):业务层对象,主要在服务内部使用的业务对象,可以包含多个对象,可以用于对象的聚合操作 。--  个人理解使用场景,在服务层服务中,由DTO转成BO然后进行业务处理后,转成DTO返回到接口层。

 PO(persistent object):持久对象(就是上述的Entity),出现位置为数据库数据,用来存储数据库提取的数据,只存储数据,不包含数据操作。 -- 个人理解使用场景,在数据库层中,获取的数据库数据存储到PO中,然后转为DTO返回到服务层中。

DO(domain object):领域实体对象,DO 现在主要有两个版本:

  1. 阿里巴巴的开发手册中的定义,DO( Data Object)这个等同于上面的PO。
  2. DDD(Domain-Driven Design)领域驱动设计中,DO(Domain Object)这个等同于上面的BO。

Condition:在传统的业务系统中,我们的查询一般含有多个查询条件,我在开发的时候习惯性的将这些业务相关的查询条件封装到一个Condition对象中接收,然后根据Condition条件进行查询。

二、举例

2.1 数据准备

INSERT INTO `hkt_common_ability`.`capability_servie_matters` (
	`id`,
	`service_name`,
	`service_type_level1`,
	`service_type_level2`,
	`acceptance_conditions`,
	`use_guide`,
	`service_support_platform`,
	`flow_and_accept_time_limit`,
	`assessment_and_evaluation_indicators`,
	`accepting_unit`,
	`internal_organization`,
	`internal_organization_person`,
	`service_institutions`,
	`affiliated_person`,
	`required_information`,
	`related_ability`,
	`service_status`,
	`images`,
	`is_deleted`,
	`tenant_id`,
	`create_id`,
	`create_name`,
	`create_time`,
	`update_id`,
	`update_name`,
	`update_time`
)
VALUES
	(
		'1',
		'区块链1',
		'2',
		'6',
		'资产必须达到一个小目标111111',
		'想怎么用就怎么用',
		'相关管理能力平台',
		'没有流程,不设时限',
		'1、净利润:5000万;2、资产:1亿',
		'1',
		'3',
		'8',
		'1',
		'1,2,3',
		'2,3',
		'8,9',
		'1',
        '[{\"image\":\"图片1\",\"url\":\"https://micro.hkttech.cn/file/oss/hkt/20230414/kjG66y45ZiHjEOvBJKtkh.jpeg\",\"first\":true},{\"image\":\"图片2\",\"url\":\"https://micro.hkttech.cn/file/oss/hkt/20230414/JWp6cco1NrfjR69CQjr5j.jpeg\",\"first\":false}]',
		'0',
		'100000',
		'1',
		'admin',
		NULL,
		'1',
		'admin',
		NULL
	);

如上,service_type_level1、service_type_level2、internal_organization、internal_organization_person、service_institutions、affiliated_person、required_information、related_ability等均为外键,其中service_type_level1、service_type_level2、internal_organization、internal_organization_person、service_institutions与其它表是多对一的关系,affiliated_person、required_information、related_ability是一对多的关系,一对多的关系我选择使用字符串类型来保存其他表的多个id(用逗号隔开)。images中需要保存多张图片,且每张图片需要标注图片名称、图片路径以及是否首图等属性,此处我同样以字符串类型来存储对应的图片属性对象集合。

2.2、各类型对象

2.2.1 实体类封装

package cs.gov.bigdata.ca.ability.manage.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.hkt.core.database.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.v3.oas.annotations.media.Schema;

/**
 * 服务事项管理实体类
 *
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(name = "CapabilityServieMatters对象", description = "服务事项管理")
public class CapabilityServieMatters extends BaseEntity {

	private static final long serialVersionUID = 1L;

	/**
	* 服务名称
	*/
	@Schema(description = "服务名称")
	private String serviceName;
	/**
	* 1级服务类型
	*/
	@Schema(description = "1级服务类型")
	private Long serviceTypeLevel1;
	/**
	* 2级服务类型
	*/
	@Schema(description = "2级服务类型")
	@TableField(updateStrategy = FieldStrategy.IGNORED)
	private Long serviceTypeLevel2;
	/**
	* 受理条件
	*/
	@Schema(description = "受理条件")
	private String acceptanceConditions;
	/**
	* 使用指南
	*/
	@Schema(description = "使用指南")
	private String useGuide;
	/**
	* 服务支撑平台
	*/
	@Schema(description = "服务支撑平台")
	private String serviceSupportPlatform;
	/**
	* 服务流程和受理时限
	*/
	@Schema(description = "服务流程和受理时限")
	private String flowAndAcceptTimeLimit;
	/**
	* 考核和评价指标
	*/
	@Schema(description = "考核和评价指标")
	private String assessmentAndEvaluationIndicators;
	/**
	* 服务受理单位
	*/
	@Schema(description = "服务受理单位")
	private Long acceptingUnit;
	/**
	* 内设机构(处部室)
	*/
	@Schema(description = "内设机构(处部室)")
	private Long internalOrganization;
	/**
	* 内设机构人员
	*/
	@Schema(description = "内设机构人员")
	private Long internalOrganizationPerson;
	/**
	* 服务机构
	*/
	@Schema(description = "服务机构")
	private Long serviceInstitutions;
	/**
	* 关联服务机构人员
	*/
	@Schema(description = "关联服务机构人员")
	private String affiliatedPerson;
	/**
	* 所需材料
	*/
	@Schema(description = "所需材料")
	private String requiredInformation;
	/**
	* 关联能力
	*/
	@Schema(description = "关联能力")
	private String relatedAbility;
	/**
	* 服务状态(0未发布,1已发布)
	*/
	@Schema(description = "服务状态(0未发布,1已发布)")
	private Integer serviceStatus;
	/**
	* 是否已删除(0否,1是)
	*/
	@Schema(description = "是否已删除(0否,1是)")
	@TableLogic(value = "0" ,delval="1")
	private Boolean isDeleted;
	/**
	* 租户id
	*/
	@Schema(description = "租户id")
	private Long tenantId;

    /**
     * 图片
     */
	@Schema(description = "图片")
    private String images;

}
package com.hkt.core.database.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.Serializable;
import java.time.LocalDateTime;

@Data
public class BaseEntity implements Serializable {
    @JsonSerialize(
        using = ToStringSerializer.class
    )
    @Schema(
        description = "主键id"
    )
    @TableId(
        value = "id",
        type = IdType.AUTO
    )
    private Long id;
    @Schema(
        description = "创建人"
    )
    @JsonSerialize(
        using = ToStringSerializer.class
    )
    @TableField(
        fill = FieldFill.INSERT
    )
    private Long createId;
    @Schema(
        description = "创建人"
    )
    @TableField(
        fill = FieldFill.INSERT
    )
    private String createName;
    @JsonSerialize(
        using = ToStringSerializer.class
    )
    @Schema(
        description = "更新人"
    )
    @TableField(
        fill = FieldFill.INSERT_UPDATE
    )
    private Long updateId;
    @Schema(
        description = "更新人"
    )
    @TableField(
        fill = FieldFill.INSERT_UPDATE
    )
    private String updateName;
    @Schema(
        description = "创建时间"
    )
    @TableField(
        fill = FieldFill.INSERT
    )
    private LocalDateTime createTime;
    @Schema(
        description = "更新时间"
    )
    @TableField(
        fill = FieldFill.INSERT_UPDATE
    )
    private LocalDateTime updateTime;

}

2.2.2 查询条件封装

package cs.gov.bigdata.ca.ability.manage.condition;

import com.hkt.core.database.entity.Search;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.util.List;

/**
 * @Description 服务事项管理查询条件
 */
@Data
public class CapabilityServieMattersCondition extends Search {

    /**
     * 1级服务类型
     */
    @Schema(description = "1级服务类型")
    private Integer serviceTypeLevel1;
    /**
     * 2级服务类型
     */
    @Schema(description = "2级服务类型")
    private Integer serviceTypeLevel2;
    /**
     * 服务状态(0未发布,1已发布)
     */
    @Schema(description = "服务状态(0未发布,1已发布)")
    private Integer serviceStatus;
    /**
     * 服务受理单位
     */
    @Schema(description = "服务受理单位")
    private Long acceptingUnit;
    /**
     * 内设机构(处部室)
     */
    @Schema(description = "内设机构(处部室)")
    private Long internalOrganization;
    /**
     * 服务名称
     */
    @Schema(description = "服务名称")
    private String serviceName;
    /**
     * 服务提供单位
     */
    @Schema(description = "服务提供单位")
    private Long serviceInstitutions;
    /**
     * 是否统计所有事项
     */
    @Schema(description = "是否统计所有事项")
    private Boolean countService = false;
    /**
     * 多选id
     */
    @Schema(description = "多选id")
    private String ids;
}
package com.hkt.core.database.entity;

import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.Serializable;

@Schema(
    description = "搜索条件"
)
@Data
public class Search implements Serializable {
    @Schema(
        description = "关键词"
    )
    private String keyword;
    @Schema(
        description = "流程模型分类id"
    )
    private Integer categoryId;
    @Schema(
        description = "租户ID"
    )
    private Integer tenantId;
    @Schema(
        description = "角色类型"
    )
    private String roleType;
    @Schema(
        description = "开始日期"
    )
    private String startDate;
    @Schema(
        description = "结束日期"
    )
    private String endDate;
    @Schema(
        description = "排序属性"
    )
    private String prop;
    @Schema(
        description = "排序方式"
    )
    private String order;
    @Schema(
        description = "状态"
    )
    private Integer status;
    @Schema(
        description = "当前页"
    )
    private Integer current = 1;
    @Schema(
        description = "每页的数量"
    )
    private Integer size = 10;

}

2.2.3 数据传输对象封装

package cs.gov.bigdata.ca.ability.manage.dto;

import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 服务事项管理数据传输对象
 */
@Data
@Schema(name = "CapabilityServieMattersDTO对象", description = "服务事项管理")
public class CapabilityServieMattersDTO {

	private static final long serialVersionUID = 1L;
	/**
	 * 服务事项id
	 */
	@Schema(description = "服务事项id")
	private Long id;
	/**
	* 服务名称
	*/
	@Schema(description = "服务名称")
	@NotBlank(message = "服务名称不能为空")
	private String serviceName;
	/**
	* 1级服务类型
	*/
	@Schema(description = "1级服务类型")
	@NotNull(message = "1级服务类型不能为空")
	private Long serviceTypeLevel1;
	/**
	* 1级服务类型名称
	*/
	@Schema(description = "1级服务类型名称")
	private String serviceTypeLevel1Name;
	/**
	* 2级服务类型
	*/
	@Schema(description = "2级服务类型")
	private Long serviceTypeLevel2;
	/**
	* 2级服务类型名称
	*/
	@Schema(description = "2级服务类型名称")
	private String serviceTypeLevel2Name;
	/**
	* 受理条件
	*/
	@Schema(description = "受理条件")
	@NotBlank(message = "受理条件不能为空")
	private String acceptanceConditions;
	/**
	* 使用指南
	*/
	@Schema(description = "使用指南")
	@NotBlank(message = "使用指南不能为空")
	private String useGuide;
	/**
	* 服务支撑平台
	*/
	@Schema(description = "服务支撑平台")
	@NotBlank(message = "服务支撑平台不能为空")
	private String serviceSupportPlatform;
	/**
	* 服务流程和受理时限
	*/
	@Schema(description = "服务流程和受理时限")
	@NotBlank(message = "服务流程和受理时限不能为空")
	@Size(max = 200, min = 1, message = "服务流程和受理时限不能为空,且长度在200字内")
	private String flowAndAcceptTimeLimit;
	/**
	* 考核和评价指标
	*/
	@Schema(description = "考核和评价指标")
	@NotBlank(message = "考核和评价指标不能为空")
	@Size(max = 500, min = 1, message = "考核和评价指标不能为空,且长度在500字内")
	private String assessmentAndEvaluationIndicators;
	/**
	* 服务受理单位
	*/
	@Schema(description = "服务受理单位")
	@NotNull(message = "服务受理单位不能为空")
	private Long acceptingUnit;
	/**
	 * 服务受理单位
	 */
	private String acceptingUnitName;
	/**
	* 内设机构(处部室)
	*/
	@Schema(description = "内设机构(处部室)")
	@NotNull(message = "内设机构(处部室)不能为空")
	private Long internalOrganization;
	/**
	* 内设机构(处部室)
	*/
	private String internalOrganizationName;
	/**
	* 内设机构人员
	*/
	@Schema(description = "内设机构人员")
	@NotNull(message = "内设机构人员不能为空")
	private Long internalOrganizationPerson;
	/**
	* 内设机构人员
	*/
	private String internalOrganizationPersonName;
	/**
	* 内设机构联系方式
	*/
	private String internalOrganizationPhone;
	/**
	* 服务机构
	*/
	@Schema(description = "服务机构")
	@NotNull(message = "服务机构不能为空")
	private Long serviceInstitutions;
	/**
	* 服务机构名称
	*/
	@Schema(description = "服务机构名称")
	private Long serviceInstitutionsName;
	/**
	* 统一社会信用代码
	*/
	private String unifiedSocialCreditCode;
	/**
	* 服务机构地址
	*/
	private String serviceInstitutionsAddr;
	/**
	* 服务机构法人
	*/
	private String serviceInstitutionsLegalPerson;
	/**
	* 服务机构法人联系方式
	*/
	private String legalPersonPhone;
	/**
	* 关联服务机构人员
	*/
	private String affiliatedPerson;
	/**
	* 关联服务机构人员
	*/
	@Schema(description = "关联服务机构人员")
	@NotNull(message = "关联服务机构人员不能为空")
	private List<Long> affiliatedPersonList;
	/**
	 * 关联服务机构人员联系方式
	 */
	private String affiliatedPersonPhone;
	/**
	* 所需材料
	*/
	private String requiredInformation;
	/**
	* 所需材料
	*/
	@Schema(description = "所需材料")
	@NotNull(message = "所需材料不能为空")
	private List<Long> requiredInformationList;
	/**
	* 关联能力
	*/
	private String relatedAbility;
	/**
	* 关联能力
	*/
	@Schema(description = "关联能力")
	@NotNull(message = "关联能力不能为空")
	private List<Long> relatedAbilityList;
	/**
	* 服务状态(0未发布,1已发布)
	*/
	private Integer serviceStatus;
	/**
	* 是否已删除(0否,1是)
	*/
	private Boolean isDeleted;
	/**
	* 租户id
	*/
	private Long tenantId;
	/**
	* 租户id
	*/
	private LocalDateTime createTime;

    /**
     * 图片
     */
    private String images;
    private JSONArray imagesList;


     public void setImages(String images) {
        if(StringUtils.isNotBlank(images)) {
            this.imagesList = JSONArray.parseArray(images);
        }
        this.images = images;
    }

    public void setImagesList(JSONArray imagesList) {
        if(imagesList != null) {
            this.images = imagesList.toString();
        }
        this.imagesList = imagesList;
    }

	public void setAffiliatedPerson(String affiliatedPerson) {
		this.affiliatedPerson = affiliatedPerson;
		this.affiliatedPersonList = StringUtils.isNotBlank(affiliatedPerson)? Arrays.asList(affiliatedPerson.split(",")).stream().map(Long::valueOf).collect(Collectors.toList()):null;
	}

	public void setAffiliatedPersonList(List<Long> affiliatedPersonList) {
		this.affiliatedPersonList = affiliatedPersonList;
		this.affiliatedPerson = CollectionUtils.isEmpty(affiliatedPersonList) ? null : StringUtils.join(affiliatedPersonList.toArray(),",");
	}

	public void setRequiredInformation(String requiredInformation) {
		this.requiredInformation = requiredInformation;
		this.requiredInformationList = StringUtils.isNotBlank(requiredInformation)? Arrays.asList(requiredInformation.split(",")).stream().map(Long::valueOf).collect(Collectors.toList()):null;
	}

	public void setRequiredInformationList(List<Long> requiredInformationList) {
		this.requiredInformationList = requiredInformationList;
		this.requiredInformation = CollectionUtils.isEmpty(requiredInformationList) ? null : StringUtils.join(requiredInformationList.toArray(),",");
	}

	public void setRelatedAbility(String relatedAbility) {
		this.relatedAbility = relatedAbility;
		this.relatedAbilityList = StringUtils.isNotBlank(relatedAbility)? Arrays.asList(relatedAbility.split(",")).stream().map(Long::valueOf).collect(Collectors.toList()):null;
	}

	public void setRelatedAbilityList(List<Long> relatedAbilityList) {
		this.relatedAbilityList = relatedAbilityList;
		this.relatedAbility = CollectionUtils.isEmpty(relatedAbilityList) ? null : StringUtils.join(relatedAbilityList.toArray(),",");
	}
}

2.2.4 视图对象封装

package cs.gov.bigdata.ca.ability.manage.vo;

import cs.gov.bigdata.ca.ability.manage.dto.CapabilityServieMattersDTO;
import cs.gov.bigdata.ca.ability.portal.enums.NoticeStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 服务事项管理列表展示对象
 */
@Data
@Schema(name = "服务事项管理列表展示对象", description = "服务事项管理")
public class CapabilityServieMattersListVO {

	private static final long serialVersionUID = 1L;
	/**
	 * 服务事项id
	 */
	@Schema(description = "服务事项id")
	private Long id;
	/**
	* 服务名称
	*/
	@Schema(description = "服务名称")
	private String serviceName;
	/**
	* 服务类型
	*/
	@Schema(description = "服务类型")
	private String serviceTypeName;
	/**
	* 服务受理单位
	*/
	@Schema(description = "服务受理单位")
	private String acceptingUnitName;
	/**
	* 服务受理单位内设机构(处部室)
	*/
	@Schema(description = "服务受理单位内设机构(处部室)")
	private String internalOrganizationName;
	/**
	* 服务受理单位联系人
	*/
	@Schema(description = "服务受理单位联系人")
	private String internalOrganizationPersonName;
	/**
	* 服务受理单位联系电话
	*/
	private String internalOrganizationPhone;
	/**
	* 服务状态(0未发布,1已发布)
	*/
	private Integer serviceStatus;
	/**
	* 服务状态(0未发布,1已发布)
	*/
	private String serviceStatusName;
    /**
     * 图片
     */
    private JSONArray imagesList;

	public CapabilityServieMattersListVO(CapabilityServieMattersDTO dto){
		if (Objects.nonNull(dto)) {
			this.id = dto.getId();
			this.serviceName = dto.getServiceName();
			this.serviceTypeName = dto.getServiceTypeLevel1Name() + (StringUtils.isNotBlank(dto.getServiceTypeLevel2Name()) ? ("/" + dto.getServiceTypeLevel2Name()) : "");
			this.acceptingUnitName = dto.getAcceptingUnitName();
			this.internalOrganizationName = dto.getInternalOrganizationName();
			this.internalOrganizationPersonName = dto.getInternalOrganizationPersonName();
			this.internalOrganizationPhone = dto.getInternalOrganizationPhone();
			this.serviceStatus = dto.getServiceStatus();
			this.serviceStatusName = NoticeStatusEnum.getValueText(dto.getServiceStatus());
            this.imagesList = dto.getImagesList();
		}
	}
}
package cs.gov.bigdata.ca.ability.manage.vo;

import cs.gov.bigdata.ca.ability.manage.dto.CapabilityServieMattersDTO;
import cs.gov.bigdata.ca.ability.portal.enums.NoticeStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
import java.util.Objects;

/**
 * 服务事项管理详情展示对象
 */
@Data
@Schema(name = "服务事项管理详情展示对象", description = "服务事项管理")
public class CapabilityServieMattersDetailVO {

	private static final long serialVersionUID = 1L;
	/**
	 * 服务事项id
	 */
	@Schema(description = "服务事项id")
	private Long id;
	/**
	 * 服务名称
	 */
	@Schema(description = "服务名称")
	private String serviceName;
	/**
	 * 1级服务类型
	 */
	@Schema(description = "1级服务类型")
	private Long serviceTypeLevel1;
	/**
	 * 2级服务类型
	 */
	@Schema(description = "2级服务类型")
	private Long serviceTypeLevel2;
	/**
	 * 受理条件
	 */
	@Schema(description = "受理条件")
	private String acceptanceConditions;
	/**
	 * 使用指南
	 */
	@Schema(description = "使用指南")
	private String useGuide;
	/**
	 * 服务支撑平台
	 */
	@Schema(description = "服务支撑平台")
	private String serviceSupportPlatform;
	/**
	 * 服务流程和受理时限
	 */
	@Schema(description = "服务流程和受理时限")
	private String flowAndAcceptTimeLimit;
	/**
	 * 考核和评价指标
	 */
	@Schema(description = "考核和评价指标")
	private String assessmentAndEvaluationIndicators;
	/**
	 * 服务受理单位
	 */
	@Schema(description = "服务受理单位")
	private Long acceptingUnit;
	/**
	 * 内设机构(处部室)
	 */
	@Schema(description = "内设机构(处部室)")
	private Long internalOrganization;
	/**
	 * 内设机构人员
	 */
	@Schema(description = "内设机构人员")
	private Long internalOrganizationPerson;
	/**
	 * 服务机构
	 */
	@Schema(description = "服务机构")
	private Long serviceInstitutions;
	/**
	 * 关联服务机构人员列表
	 */
	@Schema(description = "关联服务机构人员列表")
	private List<Long> affiliatedPersonList;
	/**
	 * 所需材料
	 */
	@Schema(description = "所需材料")
	private List<Long> requiredInformationList;
	/**
	 * 关联能力
	 */
	@Schema(description = "关联能力")
	private List<Long> relatedAbilityList;

}
package cs.gov.bigdata.ca.ability.common.vo;

import lombok.*;

import java.util.List;

/**
 * @Description 单位及人员联级下拉展示层
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UnitAndPersonCascadeVO {
    private Long id;
    private String name;
    private String telphone;
    private String email;
    private List<UnitAndPersonCascadeVO> children;
}

2.3 Controller层

package cs.gov.bigdata.ca.ability.manage.controller;

import cn.hutool.core.collection.CollectionUtil;
import com.hkt.core.common.api.Result;
import com.hkt.core.common.util.KeyValue;
import com.hkt.core.database.entity.Search;
import cs.gov.bigdata.ca.ability.common.vo.CommonVO;
import cs.gov.bigdata.ca.ability.config.entity.Company;
import cs.gov.bigdata.ca.ability.config.entity.FileInfo;
import cs.gov.bigdata.ca.ability.config.entity.InteriorOrgan;
import cs.gov.bigdata.ca.ability.config.entity.InteriorOrganPerson;
import cs.gov.bigdata.ca.ability.config.service.*;
import cs.gov.bigdata.ca.ability.manage.condition.CapabilityServieMattersCondition;
import cs.gov.bigdata.ca.ability.manage.dto.CapabilityServieMattersDTO;
import cs.gov.bigdata.ca.ability.manage.entity.CapabilityServieMatters;
import cs.gov.bigdata.ca.ability.manage.service.ICapabilityServerTypeService;
import cs.gov.bigdata.ca.ability.manage.service.ICapabilityServieMattersService;
import cs.gov.bigdata.ca.ability.manage.service.ICapabilityTypeService;
import cs.gov.bigdata.ca.ability.portal.enums.NoticeStatusEnum;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
import lombok.AllArgsConstructor;

import com.hkt.core.auth.annotation.PreAuth;
import com.hkt.core.log.annotation.Log;

import org.springframework.web.bind.annotation.RestController;
import com.hkt.core.web.controller.BaseController;
import javax.validation.Valid;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务事项管理 前端控制器
 * </p>
 *
 * @author hkt
 * @since 2023-04-19
 */
@RestController
@AllArgsConstructor
@RequestMapping("/capability-servie-matters")
@Tag(name  = "服务事项管理", description = "服务事项管理接口")
public class CapabilityServieMattersController extends BaseController {

    private final ICapabilityServieMattersService capabilityServieMattersService;
    private final ICapabilityServerTypeService capabilityServerTypeService;
    private final IServeOrganService serveOrganService;
    private final IServePersonService servePersonService;
    private final IFileInfoService fileInfoService;
    private final ICapabilityTypeService capabilityTypeService;

    /**
     * 相关下拉选项
     * @return Result
     */
    @PreAuth
    @Log(value = "服务事项管理相关下拉选", exception = "服务事项管理相关下拉选请求异常")
    @GetMapping("/dropdown/options")
    @Operation(summary = "服务事项管理相关下拉选", description = "相关下拉选")
    public Result<?> dropdownOptions() {
        Map<String,Object> result = new HashMap<>();
        //服务状态
        result.put("serviceStatus", NoticeStatusEnum.keyValues());
        //服务类型
        result.put("serviceType",capabilityServerTypeService.getTree());
        //受理单位
        result.put("acceptingUnit",capabilityServieMattersService.getAcceptingUnitTree());
        //服务机构
        result.put("serviceInstitutions",serveOrganService.list().stream().map(s -> {
            return new KeyValue<>(s.getId(), s);
        }).collect(Collectors.toList()));
        //服务机构人员
        result.put("affiliatedPerson",servePersonService.list().stream().map(s -> {
            return new KeyValue<>(s.getId(), s);
        }).collect(Collectors.toList()));
        //所需材料
        List<FileInfo> requiredInformationList = fileInfoService.list();
        result.put("requiredInformation",requiredInformationList.stream().map(s -> {
            return new CommonVO(s.getId(), s.getFileName(), s.getFilePath());
        }).collect(Collectors.toList()));
        //关联能力
        result.put("relatedAbility",capabilityTypeService.list().stream().map(s -> {
            return new KeyValue<>(s.getId(), s.getName());
        }).collect(Collectors.toList()));
        return Result.data(result);
    }


    /**
     * 分页列表
     *
     * @param condition 查询条件
     * @return Result
     */
    @PreAuth
    @Log(value = "服务事项管理列表", exception = "服务事项管理列表请求异常")
    @GetMapping("/page")
    @Operation(summary = "服务事项管理列表", description = "分页查询")
    @Parameters({
        @Parameter(name = "current", required = true,  description = "当前页", in = ParameterIn.DEFAULT),
        @Parameter(name = "size", required = true,  description = "每页显示数据", in = ParameterIn.DEFAULT),
        @Parameter(name = "keyword", required = true,  description = "模糊查询关键词", in = ParameterIn.DEFAULT),
        @Parameter(name = "startDate", required = true,  description = "创建开始日期", in = ParameterIn.DEFAULT),
        @Parameter(name = "endDate", required = true,  description = "创建结束日期", in = ParameterIn.DEFAULT),
    })
    public Result<?> page(CapabilityServieMattersCondition condition) {
		return Result.data(capabilityServieMattersService.listPage(condition));
    }

    /**
     * 服务事项管理信息
     *
     * @param id Id
     * @return Result
     */
    @PreAuth
    @Log(value = "服务事项管理信息", exception = "服务事项管理信息请求异常")
    @GetMapping("/get")
    @Operation(summary = "服务事项管理信息", description = "根据ID查询")
    @Parameters({
            @Parameter(name = "id", required = true,  description = "ID", in = ParameterIn.DEFAULT),
    })
    public Result<?> get(@RequestParam Long id) {
		return Result.data(capabilityServieMattersService.getDetail(id));
	}

    /**
    * 服务事项管理新增
    *
    * @param dto 数据传输象
    * @return Result
    */
    @PreAuth
    @Log(value = "服务事项管理新增", exception = "服务事项管理新增请求异常")
    @PostMapping("/add")
    @Operation(summary = "服务事项管理新增", description = "服务事项管理新增")
    public Result<?> add(@Valid @RequestBody CapabilityServieMattersDTO dto) {
		return Result.condition(capabilityServieMattersService.add(dto));
    }

    /**
    * 服务事项管理编辑
    *
    * @param dto 数据传输对象
    * @return Result
    */
    @PreAuth
    @Log(value = "服务事项管理编辑", exception = "服务事项管理编辑请求异常")
    @PostMapping("/update")
    @Operation(summary = "服务事项管理编辑", description = "服务事项管理编辑")
    public Result<?> update(@Valid @RequestBody CapabilityServieMattersDTO dto) {
        if(Objects.isNull(dto.getId())){
            return Result.fail("id不能为空!!");
        }
		return Result.condition(capabilityServieMattersService.update(dto));
	}

    /**
     * 发布/停止发布服务事项
     *
     * @param status 服务状态(0停止发布,1发布)
     * @return Result
     */
    @PreAuth
    @Log(value = "发布/停止发布服务事项", exception = "发布/停止发布服务事项请求异常")
    @GetMapping("/setStatus")
    @Operation(summary = "发布/停止发布服务事项", description = "发布/停止发布服务事项")
    public Result<?> setStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) {
        return Result.condition(capabilityServieMattersService.setStatus(id,status));
    }

    /**
    * 服务事项管理删除
    *
    * @param id 服务事项管理id
    * @return Result
    */
    @PreAuth
    @Log(value = "服务事项管理删除", exception = "服务事项管理删除请求异常")
    @GetMapping("/del")
    @Operation(summary = "服务事项管理删除", description = "服务事项管理删除")
    @Parameters({
            @Parameter(name = "id", required = true,  description = "服务事项管理id", in = ParameterIn.DEFAULT)
    })
    public Result<?> del(@RequestParam Long id) {
		return Result.condition(capabilityServieMattersService.removeById(id));
	}
}

2.4 Service层

package cs.gov.bigdata.ca.ability.manage.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import cs.gov.bigdata.ca.ability.common.vo.UnitAndPersonCascadeVO;
import cs.gov.bigdata.ca.ability.manage.condition.CapabilityServieMattersCondition;
import cs.gov.bigdata.ca.ability.manage.dto.CapabilityServieMattersDTO;
import cs.gov.bigdata.ca.ability.manage.entity.CapabilityServieMatters;
import cs.gov.bigdata.ca.ability.manage.vo.CapabilityServieMattersDetailVO;
import cs.gov.bigdata.ca.ability.manage.vo.CapabilityServieMattersListForServiceSupportVO;
import cs.gov.bigdata.ca.ability.manage.vo.CapabilityServieMattersListVO;

import java.util.List;

/**
 * <p>
 * 服务事项管理 服务类
 * </p>
 */
public interface ICapabilityServieMattersService extends IService<CapabilityServieMatters> {

	/**
     * 获取受理单位的联级树
     */
	List<UnitAndPersonCascadeVO> getAcceptingUnitTree();

	/**
     * 分页业务方法
     * @param condition 搜索参数
     * @return IPage
     */
	IPage<CapabilityServieMattersListVO> listPage(CapabilityServieMattersCondition condition);

	/**
     * 新增
     * @param dto 参数
     * @return IPage
     */
	Boolean add(CapabilityServieMattersDTO dto);

	/**
     * 修改
     * @param dto 参数
     * @return IPage
     */
	Boolean update(CapabilityServieMattersDTO dto);

	/**
     * 发布/停止发布
     * @param id id
     * @param status 服务状态(0停止发布,1发布)
     * @return IPage
     */
	Boolean setStatus(Long id, Integer status);

	/**
     * 获取详情
     * @param id id
     * @return IPage
     */
	CapabilityServieMattersDetailVO getDetail(Long id);

}
package cs.gov.bigdata.ca.ability.manage.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hkt.core.database.util.PageUtil;
import cs.gov.bigdata.ca.ability.common.vo.UnitAndPersonCascadeVO;
import cs.gov.bigdata.ca.ability.config.service.CompanyService;
import cs.gov.bigdata.ca.ability.config.service.IInteriorOrganPersonService;
import cs.gov.bigdata.ca.ability.config.service.IInteriorOrganService;
import cs.gov.bigdata.ca.ability.manage.condition.CapabilityServieMattersCondition;
import cs.gov.bigdata.ca.ability.manage.dto.CapabilityServieMattersDTO;
import cs.gov.bigdata.ca.ability.manage.entity.CapabilityServieMatters;
import cs.gov.bigdata.ca.ability.manage.mapper.CapabilityServieMattersMapper;
import cs.gov.bigdata.ca.ability.manage.service.ICapabilityServieMattersService;
import cs.gov.bigdata.ca.ability.manage.vo.CapabilityServieMattersDetailVO;
import cs.gov.bigdata.ca.ability.manage.vo.CapabilityServieMattersListForServiceSupportVO;
import cs.gov.bigdata.ca.ability.manage.vo.CapabilityServieMattersListVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务事项管理 服务实现类
 * </p>
 */
@Service
public class CapabilityServieMattersServiceImpl extends ServiceImpl<CapabilityServieMattersMapper, CapabilityServieMatters> implements ICapabilityServieMattersService {

	@Resource
	private CapabilityServieMattersMapper capabilityServieMattersMapper;
	@Resource
	private CompanyService companyService;
	@Resource
	private IInteriorOrganService interiorOrganService;
	@Resource
	private IInteriorOrganPersonService interiorOrganPersonService;

	@Override
	public List<UnitAndPersonCascadeVO> getAcceptingUnitTree() {
        //方法1 使用数据库进行联级封装
		return capabilityServieMattersMapper.getAcceptingUnitTree();

        //方法2 使用java代码遍历进行联级封装
//		//内设机构人员
//		List<InteriorOrganPerson> interiorOrganPersonList = interiorOrganPersonService.list();
//		//内设机构
//		List<InteriorOrgan> interiorOrganList = interiorOrganService.list();
//		//服务单位
//		List<Company> acceptingUnitList = companyService.list();
//		//封装结果
//		List<CascadeDropdownVO> result = new ArrayList<>();
//		for(Company l1 : acceptingUnitList){
//			CascadeDropdownVO vo1 = new CascadeDropdownVO();
//			vo1.setKey(l1.getId());
//			vo1.setValue(l1.getCompanyName());
//			List<CascadeDropdownVO> children1 = new ArrayList<>();
//			for(InteriorOrgan l2: interiorOrganList){
//				CascadeDropdownVO vo2 = new CascadeDropdownVO();
//				vo2.setKey(l2.getId());
//				vo2.setValue(l2.getInteriorOrganName());
//				List<CascadeDropdownVO> children2 = new ArrayList<>();
//				for(InteriorOrganPerson l3: interiorOrganPersonList){
//					CascadeDropdownVO vo3 = new CascadeDropdownVO();
//					vo3.setKey(l3.getId());
//					vo3.setValue(l3);
//					if(l2.getId().equals(l3.getInteriorOrganId())){
//						children2.add(vo3);
//					}
//				}
//				vo2.setChildren(children2);
//				if(l1.getId().equals(l2.getCompanyId())){
//					children1.add(vo2);
//				}
//			}
//			vo1.setChildren(children1);
//			result.add(vo1);
//		}
//		return result;
	}

	@Override
	public IPage<CapabilityServieMattersListVO> listPage(CapabilityServieMattersCondition condition) {
		IPage<CapabilityServieMattersDTO> dtoPage = capabilityServieMattersMapper.listPage(PageUtil.getPage(condition), condition);
		IPage<CapabilityServieMattersListVO> result = new Page<>(dtoPage.getCurrent(), dtoPage.getSize(),dtoPage.getTotal());
		List<CapabilityServieMattersDTO> dtoList = dtoPage.getRecords();
		if(CollectionUtil.isEmpty(dtoList)){
			return result;
		}
		List<CapabilityServieMattersListVO> voList = dtoList.stream().map(dto -> {
			return new CapabilityServieMattersListVO(dto);
		}).collect(Collectors.toList());
		result.setRecords(voList);
		return result;
	}

	@Override
	public Boolean add(CapabilityServieMattersDTO dto) {
		CapabilityServieMatters capabilityServieMatters = new CapabilityServieMatters();
		BeanUtils.copyProperties(dto,capabilityServieMatters);
		return this.save(capabilityServieMatters);
	}

	@Override
	public Boolean update(CapabilityServieMattersDTO dto) {
		CapabilityServieMatters capabilityServieMatters = new CapabilityServieMatters();
		BeanUtils.copyProperties(dto,capabilityServieMatters);
		return this.updateById(capabilityServieMatters);
	}

	@Override
	public Boolean setStatus(Long id, Integer status) {
		CapabilityServieMatters capabilityServieMatters = new CapabilityServieMatters();
		capabilityServieMatters.setId(id);
		capabilityServieMatters.setServiceStatus(status);
		return this.updateById(capabilityServieMatters);
	}

	@Override
	public CapabilityServieMattersDetailVO getDetail(Long id) {
		CapabilityServieMatters byId = this.getById(id);
		CapabilityServieMattersDTO dto = new CapabilityServieMattersDTO();
		BeanUtils.copyProperties(byId,dto);
		CapabilityServieMattersDetailVO vo = new CapabilityServieMattersDetailVO();
		BeanUtils.copyProperties(dto,vo);
		return vo;
	}

}

2.5 Dao层

package cs.gov.bigdata.ca.ability.manage.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cs.gov.bigdata.ca.ability.common.vo.UnitAndPersonCascadeVO;
import cs.gov.bigdata.ca.ability.manage.condition.CapabilityServieMattersCondition;
import cs.gov.bigdata.ca.ability.manage.dto.CapabilityServieMattersDTO;
import cs.gov.bigdata.ca.ability.manage.entity.CapabilityServieMatters;
import cs.gov.bigdata.ca.ability.manage.vo.CapabilityServieMattersListForServiceSupportVO;
import cs.gov.bigdata.ca.ability.portal.dto.ServieHandlingDTO;
import cs.gov.bigdata.ca.ability.portal.vo.ServieHandlingDetailVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 * 服务事项管理 Mapper 接口
 * </p>
 */
public interface CapabilityServieMattersMapper extends BaseMapper<CapabilityServieMatters> {


    List<UnitAndPersonCascadeVO> getAcceptingUnitTree();

    /**
     * 服务事项分页查询
     * @param page
     * @param condition
     * @return
     */
    IPage<CapabilityServieMattersDTO> listPage(@Param("page") IPage page, @Param("condition") CapabilityServieMattersCondition condition);

}
<?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="cs.gov.bigdata.ca.ability.manage.mapper.CapabilityServieMattersMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="cs.gov.bigdata.ca.ability.manage.dto.CapabilityServieMattersDTO">
        <result column="id" property="id" />
        <result column="service_name" property="serviceName" />
        <result column="service_type_level1" property="serviceTypeLevel1" />
        <result column="service_type_level1_name" property="serviceTypeLevel1Name" />
        <result column="service_type_level2" property="serviceTypeLevel2" />
        <result column="service_type_level2_name" property="serviceTypeLevel2Name" />
        <result column="acceptance_conditions" property="acceptanceConditions" />
        <result column="use_guide" property="useGuide" />
        <result column="service_support_platform" property="serviceSupportPlatform" />
        <result column="flow_and_accept_time_limit" property="flowAndAcceptTimeLimit" />
        <result column="assessment_and_evaluation_indicators" property="assessmentAndEvaluationIndicators" />
        <result column="accepting_unit" property="acceptingUnit" />
        <result column="accepting_unit_name" property="acceptingUnitName" />
        <result column="internal_organization" property="internalOrganization" />
        <result column="internal_organization_name" property="internalOrganizationName" />
        <result column="internal_organization_person" property="internalOrganizationPerson" />
        <result column="internal_organization_person_name" property="internalOrganizationPersonName" />
        <result column="internal_organization_phone" property="internalOrganizationPhone" />
        <result column="service_institutions" property="serviceInstitutions" />
        <result column="service_institutions_name" property="serviceInstitutionsName" />
        <result column="unified_social_credit_code" property="unifiedSocialCreditCode" />
        <result column="service_institutions_addr" property="serviceInstitutionsAddr" />
        <result column="service_institutions_legal_person" property="serviceInstitutionsLegalPerson" />
        <result column="legal_person_phone" property="legalPersonPhone" />
        <result column="affiliated_person" property="affiliatedPerson" />
        <result column="required_information" property="requiredInformation" />
        <result column="related_ability" property="relatedAbility" />
        <result column="service_status" property="serviceStatus" />
        <result column="images" property="images" />
        <result column="is_deleted" property="isDeleted" />
        <result column="tenant_id" property="tenantId" />
        <result column="create_time" property="createTime" />
    </resultMap>

    <!-- 受理单位联级查询映射结果 -->
    <resultMap id="CascadeResultMap" type="cs.gov.bigdata.ca.ability.common.vo.UnitAndPersonCascadeVO">
        <result column="company_id" property="id" />
        <result column="company_name" property="name" />
        <collection property="children" javaType="java.util.List" ofType="cs.gov.bigdata.ca.ability.common.vo.UnitAndPersonCascadeVO">
            <result column="organ_id" property="id" />
            <result column="organ_name" property="name" />
            <collection property="children" javaType="java.util.List" ofType="cs.gov.bigdata.ca.ability.common.vo.UnitAndPersonCascadeVO">
                <result column="person_id" property="id" />
                <result column="person_name" property="name" />
                <result column="person_phone" property="telphone" />
            </collection>
        </collection>
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
            create_time,
            id, service_name, service_type, acceptance_conditions, use_guide, service_support_platform, flow_and_accept_time_limit, assessment_and_evaluation_indicators, accepting_unit, internal_organization, internal_organization_person, internal_organization_phone, service_institutions, unified_social_credit_code, service_institutions_addr, service_institutions_legal_person, legal_person_phone, affiliated_person, required_information, related_ability, service_status, is_deleted, tenant_id
    </sql>

    <!-- 服务事项 - 分页查询 -->
    <select id="listPage" resultMap="BaseResultMap">
        select
            csm.id, csm.service_name,csm.service_status,csm.create_time,
            cst.type_name as service_type_level1_name,
            csct.child_type_name as service_type_level2_name,
            cc.company_name as accepting_unit_name,
            cio.interior_organ_name as internal_organization_name,
            ciop.server_name as internal_organization_person_name,
            ciop.mobile_phone as internal_organization_phone,
            csm.images
        from capability_servie_matters csm 
        left join config_company cc on cc.id = csm.accepting_unit and cc.is_deleted = 0
        left join config_interior_organ cio on cio.id = csm.internal_organization and cio.is_deleted = 0
        left join config_interior_organ_person ciop on ciop.id = csm.internal_organization_person and ciop.is_deleted = 0
        left join capability_server_type cst on cst.id = csm.service_type_level1 and cst.is_deleted = 0
        left join capability_server_child_type csct on csct.id = csm.service_type_level2 and csct.is_deleted = 0
        <where>
            csm.is_deleted = 0
            <if test="condition.serviceTypeLevel1 != null">and csm.service_type_level1 = #{condition.serviceTypeLevel1}</if>
            <if test="condition.serviceTypeLevel2 != null">and csm.service_type_level2 = #{condition.serviceTypeLevel2}</if>
            <if test="condition.serviceStatus != null">and csm.service_status = #{condition.serviceStatus}</if>
            <if test="condition.acceptingUnit != null">and csm.accepting_unit = #{condition.acceptingUnit}</if>
            <if test="condition.internalOrganization != null">and csm.internal_organization = #{condition.internalOrganization}</if>
            <if test="condition.serviceName != null and condition.serviceName != ''">and csm.service_name like concat('%',#{condition.serviceName},'%')</if>
        </where>
        order by create_time desc
    </select>

    <!-- 获取受理单位联级数据 -->
    <select id="getAcceptingUnitTree" resultMap="CascadeResultMap">
        SELECT
            l1.id AS company_id,
            l1.company_name AS company_name,
            l2.id AS organ_id,
            l2.interior_organ_name AS organ_name,
            l3.id AS person_id,
            l3.server_name AS person_name,
            l3.mobile_phone AS person_phone
        FROM
            config_company l1
            INNER JOIN config_interior_organ l2 ON l2.company_id = l1.id
            INNER JOIN config_interior_organ_person l3 ON l3.interior_organ_id = l2.id
    </select>

</mapper>

三、对象转化插件(Simple Object Copy)

        参考:Simple Object Copy,一款idea插件帮你优雅转化DTO、VO、BO、PO、DO_simple object copy激活-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DTO、VO、Entity、Condition使用习惯,以及对于多映射关系字段的处理 的相关文章

随机推荐

  • 基于MATLAB的低通滤波器设计

    基于MATLAB的低通滤波器设计 在信号处理中 滤波器是经常使用的工具 而在MATLAB中 我们可以使用设计滤波器的函数designfilt 和其它专用类型的函数实现 本文将带你学习如何设计一个简单的低通滤波器 并提供相应的代码 低通滤波器
  • C语言:选择+编程(每日一练Day4)

    选择题 题一 1 设变量已正确定义 以下不能统计出一行中输入字符个数 不包含回车符 的程序段是 A n 0 while ch getchar n n B n 0 while getchar n n C for n 0 getchar n n
  • C++ new/delete Operator

    区别 c语言中提供了malloc和free两个系统函数 完成对堆内存的申请和释放 这是 include
  • Python中异常处理

    一 异常和错误 在高级编程语言中 一般都有错误和异常的概念 异常是可以捕获 并被处理的 但是错误不可以被捕获 错误 Error 逻辑错误 算法写错了 比如加法写成了减法 笔误 变量名写错了 语法错误 函数或类使用错误 其实也属于逻辑错误 总
  • 哈希消息认证码HmacSHA256-javascript版

    流程 向后端ajax申请时进行加密 加密是通过一些规则对data加密 调用tokentest方法需要做三个事情 1 生成时间戳 timestamp 2 生成随机字符串 nonceStr 3 通过CryptoJS HmacSHA256生成加密
  • linux UDP的简单例子

    linux UDP的简单例子 Posted on 2012 04 09 16 06 网名还没想好 阅读 188 评论 0 编辑 收藏 服务器端 include
  • 渗透测试——万能密码与POST注入

    1 万能密码的原理 数据库没有对前端输入的参数的合法性做过率 并且账号和密码 一起输入 可以通过编写恶意语句 将用户与密码的输入结果判断为真 就实现了万能密码的登录 2 万能密码实例 查询语句select from KaTeX parse
  • jdb 调试

    目录 1 代码 2 编译代码 3 调试 3 1 jdb 3 2 stop 3 3 list 3 4 run 3 5 list 3 6 step 3 7 print dump eval 3 8 set 3 9 locals 3 10 next
  • 目标检测之网络篇(2)【STN-空间变换网络】

    文章目录 1 STN是什么 2 问题的提出 CNN的平移不变性 3 STN基本结构 3 1 Localisation network 参数预测 3 2 Grid generator 坐标映射 3 3 Sampler 像素采集 4 总结 5
  • 发展,管理,前辈,名人等有用的文章链接

    专访李智勇 一个老程序员的哲学思考与勇猛精进的人生 http www csdn net article 2014 09 24 2821834 程序员生存定律 目录 http blog csdn net leezy 2000 article
  • 无限计算力:探索云计算的无限可能性

    这里写目录标题 前言 云计算介绍 服务模型 应用领域 云计算主要体现在生活中的地方 云计算未来发展的方向 前言 云计算是一种基于互联网的计算模型 通过它可以实现资源的共享 存储 管理和处理 它已经成为许多个人 企业和组织的重要技术基础 具有
  • 源码安装Apache2,报错:Cannot use an external APR with the bundled APR-util

    一般在第一次源码安装是没有问题的 在版本变化情况下在次源码安装可能会遇到此问题 apache2 0 x与apache2 2 x在apr有很大区别 前者为依赖公用apr 后者依赖于自身的apr 一般前者也就是2 0 x的编译基本上没有apr方
  • 什么是冒烟测试?

    In computer programming and software testing smoke testing also confidence testing sanity testing build verification tes
  • k8s部署微服务项目

    之前用docker compose部署微服务项目 但是只能单节点的 那你用微服务架构干啥 所以想搞一下k8s集群 网上找了下资料没有视频专门讲这一块 自己找了很多资料 搞了蛮长时间的 所以记录一下 1 安装k8s和管理界面kuboard 高
  • IndexFile实现原理

    摘要 rocketmq作为转发数据的中间件 其特点就是快字当头 那么如何做到快 rocketmq从各个角度都进行了优化 今天我们来看下它的索引文件 观察其组织文件的格式 使用的方式 一 组织文件的格式 Indexfile是mq索引文件的主要
  • uni-app 系列之(五)—— 路由

    简介 uni app 页面路由为框架统一管理 需要在 pages json 里配置每个路由页面的路径和页面样式 类似的小程序在 app json 中配置页面路由相同 uni app 的路由用法与 Vue Router 不同 路由跳转 uni
  • 初始C语言-2.C语言程序的四种基本结构

    学习C语言二 C语言的四大基本结构 还有下的视频在我B站主页找 概要 C语言的四种基本结构是很重要的 程序主要是由这些结构组成 学完这些结构 便可以写一些基本的程序 一 四种基本结构 二 四种基本结构精析 一 分支结构 if else if
  • JSTL自定义标签的使用

    由于dwr的js和jquery冲突 导致不得不换解决方案 记得以前写过一个OA项目 里面有一个jstl的权限标签 今天根据管理员ID那管理员名字的时候可以使用这个技术 于是记个简单的步骤 以免以后再次使用 1 先写一个标签的处理类 pack
  • 《银行法律法规》二、银行业务——6、银行卡业务

    第六章 银行卡业务 第一节 银行卡业务概述 考点1 银行卡定义和分类 定义 银行卡是由商业银行 或者发卡机构 发行的具有消费信用 转账结算 存取现金等全部或部分功能的信用支付工具 银行卡功能包括 支付结算 汇兑转账 储蓄 循环信贷 个人信用
  • DTO、VO、Entity、Condition使用习惯,以及对于多映射关系字段的处理

    POJO 的定义是无规则简单的对象 在日常的代码分层中 pojo 会被分为VO BO PO DTO 一 定义和使用情景 Entity 对象实体类 一般就是和数据库表字段一一对应的那个类 DTO Data Transfer Object 数据