基于SSM框架的文件上传下载回显删除 上传文件插件weblupload

1、MaterialRegForm

package cecep.hundred.reports.model;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;

public class MaterialRegForm {
    private Integer id;

    private String batchNumber; // 批次

    private String batchYear; //批次年
    @JsonFormat(pattern="yyyy-mm-dd")
    private Date receiveTime; // 接收文件时间

    private String provinces; //省份



    private String fileName; //文件名称

    @JsonFormat(pattern="yyyy-mm-dd")
    private Date issuedTime; //印发时间

    private String fileNumber; //文件编号
    @JsonFormat(pattern="yyyy-mm-dd")
    private Date submitYear; //报送年

    private String submitQuarter; //报送季度

    private Integer enterprisesNumber; //企业数

    private String enterprisesName; //上报企业名称

    private String recipient; //接收人

    private String remarks; //备注

    private Date createTime; // 排序时间

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBatchNumber() {
        return batchNumber;
    }

    public void setBatchNumber(String batchNumber) {
        this.batchNumber = batchNumber;
    }

    public String getBatchYear() {
        return batchYear;
    }

    public void setBatchYear(String batchYear) {
        this.batchYear = batchYear;
    }

    public Date getReceiveTime() {
        return receiveTime;
    }

    public void setReceiveTime(Date receiveTime) {
        this.receiveTime = receiveTime;
    }

    public String getProvinces() {
        return provinces;
    }

    public void setProvinces(String provinces) {
        this.provinces = provinces;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public Date getIssuedTime() {
        return issuedTime;
    }

    public void setIssuedTime(Date issuedTime) {
        this.issuedTime = issuedTime;
    }

    public String getFileNumber() {
        return fileNumber;
    }

    public void setFileNumber(String fileNumber) {
        this.fileNumber = fileNumber;
    }

    public Date getSubmitYear() {
        return submitYear;
    }

    public void setSubmitYear(Date submitYear) {
        this.submitYear = submitYear;
    }

    public String getSubmitQuarter() {
        return submitQuarter;
    }

    public void setSubmitQuarter(String submitQuarter) {
        this.submitQuarter = submitQuarter;
    }

    public Integer getEnterprisesNumber() {
        return enterprisesNumber;
    }

    public void setEnterprisesNumber(Integer enterprisesNumber) {
        this.enterprisesNumber = enterprisesNumber;
    }

    public String getEnterprisesName() {
        return enterprisesName;
    }

    public void setEnterprisesName(String enterprisesName) {
        this.enterprisesName = enterprisesName;
    }

    public String getRecipient() {
        return recipient;
    }

    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }
}

2、MaterialRegFormFile

package cecep.hundred.reports.model;

public class MaterialRegFormFile {
    private int fileId; //附件id
    private int materialId;  //MaterialRegForm表ID主键
    private String fileName; // 附件名称
    private String filePath; // 存放路径
    private String uploadName; //用户上传的文件名

    public int getFileId() {
        return fileId;
    }

    public void setFileId(int fileId) {
        this.fileId = fileId;
    }

    public int getMaterialId() {
        return materialId;
    }

    public void setMaterialId(int materialId) {
        this.materialId = materialId;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public String getUploadName() {
        return uploadName;
    }

    public void setUploadName(String uploadName) {
        this.uploadName = uploadName;
    }
}

3、MaterialRegFormMapper

package cecep.hundred.reports.dao;

import cecep.hundred.reports.model.MaterialRegForm;
import cecep.hundred.reports.model.MaterialRegFormFile;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface MaterialRegFormMapper {
    /**
     * 根据ID删除
     * */
    int deleteByPrimaryKey(Integer id);

    /***
     *
     *添加
     */
    int insert(MaterialRegForm record);

    /**
     * 不为NUll添加
     * */
    int insertSelective(MaterialRegForm record);

    /**
    * 根据ID查对象信息
    * */
    MaterialRegForm selectByPrimaryKey(Integer id);

    /**
     * 不为null 修改
     * */
    int updateByPrimaryKeySelective(MaterialRegForm record);

    /**
     * 修改
     * */
    int updateByPrimaryKey(MaterialRegForm record);

    /**
     * 查询总条数
     * @return
     */
    int countByObj();

    /**
     *
     * 查询总数据
     */
  List<MaterialRegForm> selectAll(JSONObject obj);







    /**
     * 根据ID查询 附加总数
     * */
      int  countFile(@Param(value="id")Integer  id);

    //获取要删除的附件
    public List<String> getFileUrlById(@Param("id")Integer  id);

    /**
     * 获取已上传的附件
     * @param
     * @return
     */
    public List<Map<String, Object>> getMaterialRegFormFiles(@Param("materialId")Integer  materialId);


    /**
     * 插入数据
     * @param entity
     * @return
     */
    public int insertFileMessage(MaterialRegFormFile entity);


    /**
     * 获取单条数据
     * @param
     * @return
     */
    public MaterialRegFormFile getMaterialRegFormFileId(Integer materialId);


    /**
     * 删除文件数据通过ID(物理删除,从数据库中彻底删除)
     * @param
     * @return
     */
    public int deleteFileById(Integer id);



    /**
     * 修改点击单个删除
     * */
    public int deleteFileByIds(Integer id);


    
    /***
     * 查询所有附件 下载使用
     */
    List<MaterialRegFormFile> findMaterialRegFormFiles(Integer id);

    //附件下载
    MaterialRegFormFile downloadFileById(Integer id);




}

4、MaterialRegFormMapper.xml

<?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="cecep.hundred.reports.dao.MaterialRegFormMapper">
  <resultMap id="BaseResultMap" type="cecep.hundred.reports.model.MaterialRegForm">
    <id column="ID" jdbcType="INTEGER" property="id" />
    <result column="batch_number" jdbcType="CHAR" property="batchNumber" />
    <result column="batch_year" jdbcType="VARCHAR" property="batchYear" />
    <result column="receive_time" jdbcType="DATE" property="receiveTime" />
    <result column="provinces" jdbcType="CHAR" property="provinces" />
    <result column="file_name" jdbcType="VARCHAR" property="fileName" />
    <result column="issued_time" jdbcType="DATE" property="issuedTime" />
    <result column="file_number" jdbcType="VARCHAR" property="fileNumber" />
    <result column="submit_year" jdbcType="DATE" property="submitYear" />
    <result column="submit_quarter" jdbcType="CHAR" property="submitQuarter" />
    <result column="enterprises_number" jdbcType="INTEGER" property="enterprisesNumber" />
    <result column="enterprises_name" jdbcType="VARCHAR" property="enterprisesName" />
    <result column="recipient" jdbcType="VARCHAR" property="recipient" />
    <result column="remarks" jdbcType="VARCHAR" property="remarks" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
  </resultMap>

  <!--附件表-->
  <resultMap id="BaseResultMaps" type="cecep.hundred.reports.model.MaterialRegFormFile">
    <result column="file_id" property="fileId" jdbcType="INTEGER" />
    <result column="material_id" property="materialId" jdbcType="INTEGER" />
    <result column="file_name" property="fileName" jdbcType="VARCHAR" />
    <result column="file_path" property="filePath" jdbcType="VARCHAR" />
    <result column="upload_name" property="uploadName" jdbcType="VARCHAR" />
  </resultMap>

  <sql id="Base_Column_List">
    ID, batch_number, batch_year, receive_time, provinces, file_name, issued_time,
    file_number, submit_year, submit_quarter, enterprises_number, enterprises_name, recipient, 
    remarks,create_time
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from material_reg_form
    where ID = #{id,jdbcType=INTEGER}
  </select>

  <!-- 查询 总条数-->
  <select id="countByObj" resultType="java.lang.Integer">
    SELECT
    COUNT(*)
    FROM material_reg_form
  </select>

  <!--查询所有数据-->
  <select id="selectAll" resultType="cecep.hundred.reports.model.MaterialRegForm" resultMap="BaseResultMap">
    SELECT
    <include refid="Base_Column_List" />
    FROM material_reg_form
    <where>
    <trim prefixOverrides="AND">

    <if test="provinces != null and provinces != ''">
      AND  provinces  = #{provinces,jdbcType=VARCHAR}
    </if>

    <if test="enterprisesName != null and enterprisesName != ''">
      AND  enterprises_name like   concat('%',#{enterprisesName,jdbcType=VARCHAR},'%')
    </if>

    <if test="receiveTime != null and receiveTime != ''">
      AND  receive_time  &gt;= #{receiveTime,jdbcType=DATE}

    </if>

    <if test="batchNumber != null and batchNumber != ''">
      AND  batch_number = #{batchNumber,jdbcType=VARCHAR}
    </if>
    <if test="batchYear != null and batchYear != ''">
      AND  batch_year = #{batchYear,jdbcType=VARCHAR}
    </if>
    <if test="submitQuarter != null and submitQuarter != ''">
      AND  submit_quarter = #{submitQuarter,jdbcType=CHAR}
    </if>

    </trim>
    </where>
    order by create_time desc

  </select>


  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from material_reg_form
    where ID = #{id,jdbcType=INTEGER}
  </delete>

  <insert id="insert" parameterType="cecep.hundred.reports.model.MaterialRegForm" useGeneratedKeys="true" keyProperty="id">
    insert into material_reg_form (ID, batch_number, batch_year, 
      receive_time, provinces, file_name,
      issued_time, file_number, submit_year, 
      submit_quarter, enterprises_number, enterprises_name, 
      recipient, remarks,create_time)
    values (#{id,jdbcType=INTEGER}, #{batchNumber,jdbcType=CHAR}, #{batchYear,jdbcType=VARCHAR},
      #{receiveTime,jdbcType=DATE}, #{provinces,jdbcType=VARCHAR}, #{fileName,jdbcType=VARCHAR},
      #{issuedTime,jdbcType=DATE}, #{fileNumber,jdbcType=VARCHAR}, #{submitYear,jdbcType=DATE}, 
      #{submitQuarter,jdbcType=CHAR}, #{enterprisesNumber,jdbcType=INTEGER}, #{enterprisesName,jdbcType=VARCHAR}, 
      #{recipient,jdbcType=VARCHAR}, #{remarks,jdbcType=VARCHAR},#{createTime,jdbcType=TIMESTAMP})
  </insert>
  <insert id="insertSelective" parameterType="cecep.hundred.reports.model.MaterialRegForm">
    insert into material_reg_form
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        ID,
      </if>
      <if test="batchNumber != null">
        batch_number,
      </if>
      <if test="batchYear != null">
        batch_year,
      </if>
      <if test="receiveTime != null">
        receive_time,
      </if>
      <if test="provinces != null">
        provinces,
      </if>
      <if test="fileName != null">
        file_name,
      </if>
      <if test="issuedTime != null">
        issued_time,
      </if>
      <if test="fileNumber != null">
        file_number,
      </if>
      <if test="submitYear != null">
        submit_year,
      </if>
      <if test="submitQuarter != null">
        submit_quarter,
      </if>
      <if test="enterprisesNumber != null">
        enterprises_number,
      </if>
      <if test="enterprisesName != null">
        enterprises_name,
      </if>
      <if test="recipient != null">
        recipient,
      </if>
      <if test="remarks != null">
        remarks,
      </if>
      <if test="createTime != null">
        create_time,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="batchNumber != null">
        #{batchNumber,jdbcType=CHAR},
      </if>
      <if test="batchYear != null">
        #{batchYear,jdbcType=VARCHAR},
      </if>
      <if test="receiveTime != null">
        #{receiveTime,jdbcType=DATE},
      </if>
      <if test="provinces != null">
        #{provinces,jdbcType=VARCHAR},
      </if>
      <if test="fileName != null">
        #{fileName,jdbcType=VARCHAR},
      </if>
      <if test="issuedTime != null">
        #{issuedTime,jdbcType=DATE},
      </if>
      <if test="fileNumber != null">
        #{fileNumber,jdbcType=VARCHAR},
      </if>
      <if test="submitYear != null">
        #{submitYear,jdbcType=DATE},
      </if>
      <if test="submitQuarter != null">
        #{submitQuarter,jdbcType=CHAR},
      </if>
      <if test="enterprisesNumber != null">
        #{enterprisesNumber,jdbcType=INTEGER},
      </if>
      <if test="enterprisesName != null">
        #{enterprisesName,jdbcType=VARCHAR},
      </if>
      <if test="recipient != null">
        #{recipient,jdbcType=VARCHAR},
      </if>
      <if test="remarks != null">
        #{remarks,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        #{createTime,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>

  <update id="updateByPrimaryKeySelective" parameterType="cecep.hundred.reports.model.MaterialRegForm">
    update material_reg_form
    <set>
      <if test="batchNumber != null">
        batch_number = #{batchNumber,jdbcType=CHAR},
      </if>
      <if test="batchYear != null">
        batch_year = #{batchYear,jdbcType=VARCHAR},
      </if>
      <if test="receiveTime != null">
        receive_time = #{receiveTime,jdbcType=DATE},
      </if>
      <if test="provinces != null">
        provinces = #{provinces,jdbcType=VARCHAR},
      </if>
      <if test="fileName != null">
        file_name = #{fileName,jdbcType=VARCHAR},
      </if>
      <if test="issuedTime != null">
        issued_time = #{issuedTime,jdbcType=DATE},
      </if>
      <if test="fileNumber != null">
        file_number = #{fileNumber,jdbcType=VARCHAR},
      </if>
      <if test="submitYear != null">
        submit_year = #{submitYear,jdbcType=DATE},
      </if>
      <if test="submitQuarter != null">
        submit_quarter = #{submitQuarter,jdbcType=CHAR},
      </if>
      <if test="enterprisesNumber != null">
        enterprises_number = #{enterprisesNumber,jdbcType=INTEGER},
      </if>
      <if test="enterprisesName != null">
        enterprises_name = #{enterprisesName,jdbcType=VARCHAR},
      </if>
      <if test="recipient != null">
        recipient = #{recipient,jdbcType=VARCHAR},
      </if>
      <if test="remarks != null">
        remarks = #{remarks,jdbcType=VARCHAR},
      </if>
    </set>
    where ID = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="cecep.hundred.reports.model.MaterialRegForm">
    update material_reg_form
    set batch_number = #{batchNumber,jdbcType=CHAR},
      batch_year = #{batchYear,jdbcType=VARCHAR},
      receive_time = #{receiveTime,jdbcType=DATE},
      provinces = #{provinces,jdbcType=VARCHAR},
      file_name = #{fileName,jdbcType=VARCHAR},
      issued_time = #{issuedTime,jdbcType=DATE},
      file_number = #{fileNumber,jdbcType=VARCHAR},
      submit_year = #{submitYear,jdbcType=DATE},
      submit_quarter = #{submitQuarter,jdbcType=CHAR},
      enterprises_number = #{enterprisesNumber,jdbcType=INTEGER},
      enterprises_name = #{enterprisesName,jdbcType=VARCHAR},
      recipient = #{recipient,jdbcType=VARCHAR},
      remarks = #{remarks,jdbcType=VARCHAR}
    where ID = #{id,jdbcType=INTEGER}
  </update>




  <!-- 根据ID查询附件总数 -->
  <select id="countFile" resultType="java.lang.Integer">
    SELECT  count(1) from  material_reg_form_file  WHERE  material_id=#{id}
  </select>

  <!-- 获取要删除的附件地址 -->
  <select id="getFileUrlById" resultType="java.lang.String">
  SELECT file_path from  material_reg_form_file
  where material_id=#{id}
  </select>

  <!--  获取已上传的附件 -->
  <select id="getMaterialRegFormFiles" resultMap="BaseResultMaps">
    	SELECT  file_id,file_name,file_path,material_id,upload_name  from  material_reg_form_file  WHERE  material_id=#{materialId}
  </select>


  <!-- 插入数据 -->
  <insert id="insertFileMessage">
	INSERT INTO material_reg_form_file(
			file_id,
			file_name,
			file_path,
			material_id,
			upload_name
		) VALUES (
			#{fileId},
			#{fileName},
			#{filePath},
			#{materialId},
			#{uploadName}
		)
  </insert>


  <!-- 上传 获取单条附件 用于点击下载 -->
  <select id="getMaterialRegFormFileId" resultType="cecep.hundred.reports.model.MaterialRegFormFile" resultMap="BaseResultMaps">
   SELECT  file_id , file_name ,file_path ,material_id from  material_reg_form_file  WHERE  material_id=#{materialId}
  </select>



  <!-- 删除文件数据通过ID(物理删除,从数据库中彻底删除)全部删除 -->
  <delete id="deleteFileById">
	DELETE FROM material_reg_form_file
		WHERE material_id = #{id}
  </delete>

  <!-- 根据fileId删除 -->
  <delete id="deleteFileByIds">
    DELETE FROM material_reg_form_file
		WHERE file_id = #{id}
  </delete>



  <!-- 查询所有附件 下载使用 -->
  <select id="findMaterialRegFormFiles" resultType="cecep.hundred.reports.model.MaterialRegFormFile" resultMap="BaseResultMaps">
    SELECT  file_id,file_name,file_path,material_id from  material_reg_form_file  WHERE  material_id=#{materialId}
  </select>


  <!-- 根据附件id获取单条附件 -->
  <select id="downloadFileById" resultType="cecep.hundred.reports.model.MaterialRegFormFile" resultMap="BaseResultMaps">
  SELECT  file_id, file_name ,file_path ,material_id,upload_name from  material_reg_form_file  WHERE  file_id=#{id}
  </select>
  <!-- 根据年查询季度 批次 -->
  <select id="selectBatchNumber" resultType="java.lang.Integer">
  select batch_number  from material_reg_form where
  <if test="batchYear != null and batchYear != ''">
    batch_year = #{batchYear}
  </if>
  </select>

  <select id="selectSubmitQuarter" resultType="java.lang.Integer">
    select submit_quarter from material_reg_form where
    <if test="batchYear != null and batchYear != ''">
      batch_year = #{batchYear}
    </if>
  </select>

</mapper>

5、MaterialRegFormService

package cecep.hundred.reports.service;

import cecep.hundred.reports.model.MaterialRegForm;
import cecep.hundred.reports.model.MaterialRegFormFile;
import cecep.hundred.util.CustomException;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface MaterialRegFormService {
    /**
     * 根据ID删除
     * */
    int deleteByPrimaryKey(Integer id);

    /***
     *
     *添加
     */
    int insert(MaterialRegForm record);

    /**
     * 不为NUll添加
     * */
    int insertSelective(MaterialRegForm record);

    /**
     * 根据ID查对象信息
     * */
    MaterialRegForm selectByPrimaryKey(Integer id);

    /**
     * 不为null 修改
     * */
    int updateByPrimaryKeySelective(MaterialRegForm record);

    /**
     * 修改
     * */
    int updateByPrimaryKey(MaterialRegForm record);

    /**
     * 查询总条数
     * @return
     */
    int countByObj();

    /**
     *
     * 查询总数据
     */
    Object selectAll(JSONObject obj) throws CustomException;





    /**
     * 根据ID查询 附加总数
     * */
    int  countFile(@Param(value="id")Integer  id);

    //获取要删除的附件
    public List<String> getFileUrlById(@Param("id")Integer  id);

    /**
     * 获取已上传的附件
     * @param
     * @return
     */
    public List<Map<String, Object>> getMaterialRegFormFiles(@Param("materialId")Integer  materialId);


    /**
     * 插入数据
     * @param entity
     * @return
     */
    public int insertFileMessage(MaterialRegFormFile entity);


    /**
     * 获取单条数据
     * @param
     * @return
     */
    public MaterialRegFormFile getMaterialRegFormFileId(Integer materialId);


    /**
     * 删除文件数据通过ID(物理删除,从数据库中彻底删除)
     * @param
     * @return
     */
    public int deleteFileById(Integer id);



    List<MaterialRegFormFile> findMaterialRegFormFiles(Integer id);

    //附件下载
    MaterialRegFormFile downloadFileById(Integer id);


}

6、MaterialRegFormServiceImpl 

package cecep.hundred.reports.service.impl;

import cecep.hundred.reports.dao.MaterialRegFormMapper;
import cecep.hundred.reports.model.DeductionCause;
import cecep.hundred.reports.model.MaterialRegForm;
import cecep.hundred.reports.model.MaterialRegFormFile;
import cecep.hundred.reports.service.MaterialRegFormService;
import cecep.hundred.util.CustomException;
import cecep.hundred.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Author: ysw
 * @Date: 2019/10/28 9:50
 */
@Service
public class MaterialRegFormServiceImpl implements MaterialRegFormService {
    @Autowired
    MaterialRegFormMapper materialRegFormMapper;

    @Value("${noticeAddress}")
    public String noticeAddress; //附件存放地址
    private Integer returnId;



    @Override
    public int deleteByPrimaryKey(Integer id) {
        return materialRegFormMapper.deleteByPrimaryKey(id);
    }

    // 添加 + 修改
    @Override
    public int insert(MaterialRegForm record) {
        try {
            if (ObjectUtil.isNull(record)) {
                throw new CustomException(CustomException.EXCEPTION_INFO_MESSAGE.PARAMETER_VERIFY_ERROR.value());
            }
            synchronized (this) {
                if (ObjectUtil.isNull(record.getId())) {
                    record.setCreateTime(new Date());
                   materialRegFormMapper.insert(record);
                } else {
                        this.materialRegFormMapper.updateByPrimaryKey(record);
                }

            }

        } catch (CustomException e) {
            e.printStackTrace();

        } catch (Exception e) {
            e.printStackTrace();
        }
        returnId=record.getId();
      return 0;
    }

    @Override
    public int insertSelective(MaterialRegForm record) {
        return materialRegFormMapper.insertSelective(record);
    }

    @Override
    public MaterialRegForm selectByPrimaryKey(Integer id) {

        try {
            if (ObjectUtil.isNull(id)) {
                throw new CustomException(CustomException.EXCEPTION_INFO_MESSAGE.PARAMETER_VERIFY_ERROR.value());
            }
        } catch (CustomException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return materialRegFormMapper.selectByPrimaryKey(id);
    }

    @Override
    public int updateByPrimaryKeySelective(MaterialRegForm record) {
        return materialRegFormMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(MaterialRegForm record) {
        return materialRegFormMapper.updateByPrimaryKey(record);
    }

    /***
     * 查询总记录
     */

    @Override
    public int countByObj() {
        return materialRegFormMapper.countByObj();
    }

    /**
     * 查询所有
     * */
    @Override
    public Object selectAll(JSONObject obj) throws CustomException {
        try {
            final int total = materialRegFormMapper.countByObj();
            List<MaterialRegForm> resultList = materialRegFormMapper.selectAll(obj);
            HashMap<String,Object> map = new HashMap();
            map.put("total", total);
            map.put("list", resultList);
            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }




    /*  附件方法  */
    @Override
    public int countFile(Integer id) {
        return materialRegFormMapper.countFile(id);
    }

    @Override
    public List<String> getFileUrlById(Integer id) {
        return materialRegFormMapper.getFileUrlById(id);
    }

    @Override
    public List<Map<String, Object>> getMaterialRegFormFiles(Integer materialId) {
        return materialRegFormMapper.getMaterialRegFormFiles(materialId);
    }

    @Override
    public int insertFileMessage(MaterialRegFormFile entity) {
        return materialRegFormMapper.insertFileMessage(entity);
    }

    @Override
    public MaterialRegFormFile getMaterialRegFormFileId(Integer materialId) {
        return materialRegFormMapper.getMaterialRegFormFileId(materialId);
    }

    @Override
    public int deleteFileById(Integer id) {
        return materialRegFormMapper.deleteFileById(id);
    }




    @Override
    public List<MaterialRegFormFile> findMaterialRegFormFiles(Integer id) {
        return materialRegFormMapper.findMaterialRegFormFiles(id);
    }

    @Override
    public MaterialRegFormFile downloadFileById(Integer id) {
        return materialRegFormMapper.downloadFileById(id);
    }



    
   
    //附件上传
    @Transactional(readOnly = false)
    public void importMaterialRegFormFile(CommonsMultipartFile file, Integer id) {
        int count = this.materialRegFormMapper.countFile(id);
        // 获取上传文件的名称
        String oldFileName = file.getOriginalFilename();
        //带uuid的名称存到数据库
        String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
        String fileNameSuffix = uuid+file.getOriginalFilename();

        try {
            //判断给的路径中是否存在最后的
            if (noticeAddress.lastIndexOf("/") != (noticeAddress.length() - 1)) {
                noticeAddress += "/";
            }
            File saveFile = new File(noticeAddress + fileNameSuffix);
            File saveFileUrl = new File(noticeAddress);
            //判断文件夹是否存在,不存在的情况下创建父级目录
            if (!saveFileUrl.isDirectory()) {
                saveFileUrl.mkdirs();
            }
            //判断文件是否存在,如果不存在的情况下再去保存文件

            file.transferTo(saveFile);
            //如果文件正常存入的话
            if (count == 0) {//新增
                MaterialRegFormFile d = new MaterialRegFormFile();
                d.setFilePath(noticeAddress + fileNameSuffix);
                d.setFileName(fileNameSuffix);
                d.setMaterialId(returnId);
                d.setUploadName(oldFileName);
                this.materialRegFormMapper.insertFileMessage(d);
            } else {//修改
                MaterialRegFormFile d = new MaterialRegFormFile();
                d.setFilePath(noticeAddress + fileNameSuffix);
                d.setFileName(fileNameSuffix);
                d.setMaterialId(returnId);
                d.setUploadName(oldFileName);
                this.materialRegFormMapper.insertFileMessage(d);
            }
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 直接删除删除的附件并删除全部
     * */
    @Transactional(readOnly = false)
    public void deleteFileByUpdate(Integer id) {
        //获取需要删除的文件的路径
        List<String> fileUrlList = new ArrayList<String>();
        fileUrlList = this.materialRegFormMapper.getFileUrlById(id);
        materialRegFormMapper.deleteFileById(id); //删除文件数据通过ID(物理删除,从数据库中彻底删除)
        //数据库中的数据删除成功后,删除文件路径下的文件
        for (int i = 0; i < fileUrlList.size(); i++) {
            File file = new File(fileUrlList.get(i).toString());
            if (file.exists() && file.isFile()) {
                file.delete();
            }
        }
    }

    /**
     * 删除单条
     * */
    @Transactional(readOnly = false)
    public void deleteFileByUpdates(Integer id) {
        if (id != null){

            //获取需要删除的文件的路径
            List<String> fileUrlList = new ArrayList<String>();
            // 根据 fileId获取单条数据
            MaterialRegFormFile materialRegFormFile = materialRegFormMapper.downloadFileById(id);
            if (materialRegFormFile!=null){
                String filePath = materialRegFormFile.getFilePath();
                fileUrlList.add(filePath);
            }
            materialRegFormMapper.deleteFileByIds(id);
            //数据库中的数据删除成功后,删除文件路径下的文件
            for (int i = 0; i < fileUrlList.size(); i++) {
                File file = new File(fileUrlList.get(i).toString());
                if (file.exists() && file.isFile()) {
                    file.delete();
                }
            }

        }

    }


}

7、MaterialRegFormController 

package cecep.hundred.reports.controller;

import cecep.hundred.reports.model.MaterialRegForm;
import cecep.hundred.reports.model.MaterialRegFormFile;
import cecep.hundred.reports.service.impl.MaterialRegFormServiceImpl;
import cecep.hundred.util.JsonUtils;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.SocketException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Author: ysw
 * @Date: 2019/10/28 10:22
 */
@Controller
@RequestMapping("/materialRegForm")
public class MaterialRegFormController {
    private static final Logger logger = Logger.getLogger(MaterialRegFormController.class);

    @Autowired
    MaterialRegFormServiceImpl materialRegFormService;


    /**
     * 查询所有数据
     * */
    @RequestMapping(value = "/getMaterialRegForm")
    public void getMaterialRegForm(@RequestBody JSONObject obj, HttpServletResponse response,HttpServletRequest request) {
        try {
            if(obj.get("receiveTime")!="" && obj.get("receiveTime")!=null){
                String receiveTime = (String)obj.get("receiveTime");
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                Date date = format.parse(receiveTime);
                obj.put("receiveTime",date);
            }
            Object result = this.materialRegFormService.selectAll(obj);
            JsonUtils.write_json(response, JSONObject.toJSONString(JsonUtils.setJosnStr("1", "", result), SerializerFeature.WriteMapNullValue));
        } catch (Exception e) {
            JsonUtils.write_json(response, JsonUtils.setJosnStr("0", e.getMessage()).toString());
        }
    }



    /**
     * 添加 + 修改
     * */
    @RequestMapping(value = "/saveFunction")
    public void saveFunction(@RequestBody JSONObject obj, HttpServletResponse response) {
        try {
            MaterialRegForm record = JSONObject.toJavaObject(obj, MaterialRegForm.class);
            materialRegFormService.insert(record);
            JsonUtils.write_json(response, JsonUtils.setJosnStr("1", "保存成功", null).toString());
        } catch (Exception e) {
            e.printStackTrace();
            JsonUtils.write_json(response, JsonUtils.setJosnStr("0", e.getMessage()).toString());
        }
    }



    /***
     *根据主键查对象信息
     *
     */
    @RequestMapping(value = "/selectById/{id}")
    public void getFunctionById(@PathVariable Integer id, HttpServletResponse response) {
        try {
            Object result = this.materialRegFormService.selectByPrimaryKey(id);
            System.out.println(JSONObject.toJSONString(JsonUtils.setJosnStr("1", "成功", result)));
            JsonUtils.write_json(response, JSONObject.toJSONString(JsonUtils.setJosnStr("1", "成功", result), SerializerFeature.WriteMapNullValue));
        } catch (Exception e) {
            JsonUtils.write_json(response, JsonUtils.setJosnStr("0", e.getMessage()).toString());
        }
    }



    /**
     * 根据ID删除
     * */
    @RequestMapping(value = "/deleteFunction/{id}")
    public void deleteFunction(@PathVariable Integer id, HttpServletResponse response) {
        try {
               materialRegFormService.deleteFileByUpdate(id);  //通过ID删除数据 并删除文件
            this.materialRegFormService.deleteByPrimaryKey(id); // 删除数据
            JsonUtils.write_json(response, JsonUtils.setJosnStr("1", "成功", null).toString());
        } catch (Exception e) {
            JsonUtils.write_json(response, JsonUtils.setJosnStr("0", e.getMessage()).toString());
        }
    }

    /**
     *
     * 通过修改删除文件
     * */
    @RequestMapping(value = "/deleteFileByUpdate")
    public void deleteFileByUpdate(String deleteFileArr,String divLength,HttpServletResponse response) {
        try{
            String idArray[] =deleteFileArr.substring(0, deleteFileArr.length()-1).split(",");
            for(String id : idArray){
                int i = Integer.valueOf(id);
                materialRegFormService.deleteFileByUpdates(i);
            }
            JsonUtils.write_json(response, JsonUtils.setJosnStr("1", "保存成功", "").toString());
        }catch (Exception e){
            e.printStackTrace();
            JsonUtils.write_json(response, JsonUtils.setJosnStr("", "删除附件失败", "").toString());
        }


    }


    /**
     * 上传附件
     * */
    @RequestMapping("/importMaterialRegFormFile")
    public void importMaterialRegFormFile(@RequestParam(value = "file") CommonsMultipartFile file, @RequestParam(value = "materialId") Integer id, HttpServletResponse response,HttpServletRequest request){
        try {
            materialRegFormService.importMaterialRegFormFile(file,id);
            JsonUtils.write_json(response, JsonUtils.setJosnStr("1", "成功", "上传成功").toString());
        } catch (Exception e) {
            e.printStackTrace();
            JsonUtils.write_json(response, JsonUtils.setJosnStr("0", "失败", "失败").toString());
        }
    }


    //获取上传完成的附件
    @RequestMapping("/getMaterialRegFormFiles")
    public void getMaterialRegFormFiles(@RequestParam(value = "materialId")Integer materialId,HttpServletResponse response){
        try {
            Map<String, Object> result=new HashMap<String, Object>();
            List<Map<String, Object>> list=this.materialRegFormService.getMaterialRegFormFiles(materialId);
            result.put("list", list);
            result.put("success", true);
            JsonUtils.write_json(response, JsonUtils.setJosnStr("1", "成功", result).toString());
        } catch (Exception e) {
            e.printStackTrace();
            JsonUtils.write_json(response, JsonUtils.setJosnStr("0", "失败", "失败").toString());
        }
    }



    //单个附件下载
    @ResponseBody
    @RequestMapping(value = "/downloadFile")
    public void downloadFileById(Integer id, HttpServletRequest request, HttpServletResponse response) {

        MaterialRegFormFile materialRegFormFile = materialRegFormService.downloadFileById(id);

        String filePath = materialRegFormFile.getFilePath();
        String fileName = materialRegFormFile.getUploadName();
        try {
            InputStream in = new FileInputStream(filePath);

            String userAgent = request.getHeader("User-Agent");
            // 针对IE或者以IE为内核的浏览器:Chrome
            if (userAgent.contains("MSIE") || userAgent.contains("Trident") || userAgent.contains("Chrome")) {
                fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
            } else {
                // 非IE浏览器的处理:
                fileName = response.encodeURL(new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));
            }

            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/octet-stream");
            BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
            int len = 0;
            while ((len = in.read()) != -1) {
                out.write(len);
                out.flush();
            }
            out.close();
            in.close();
        } catch (SocketException s){

        }catch (IOException e) {
            e.printStackTrace();
        }
    }




    @Value("${noticeAddress}")
    public String noticeAddress; //附件存放地址
    //查询附件是否存在

    @RequestMapping(value = "/downloadFindFile")
    public void downloadFindFile(Integer id, HttpServletRequest request, HttpServletResponse response) {
        try {

        MaterialRegFormFile materialRegFormFile = materialRegFormService.downloadFileById(id);
        String fileName = materialRegFormFile.getFileName();

        Boolean isExits = false;
        //判断磁盘文件是否存在
        File resource = new File(noticeAddress);
        File[] reportList = resource.listFiles();
            if(reportList != null) {
                for (int i = 0; i < reportList.length; i++) {
                    if (reportList[i].isFile()) {
                        if (reportList[i].getName().length() >= fileName.length()) {// 文件夹中文件名称长度 >= 存储时报告名称
                            if (fileName.equals(reportList[i].getName().substring(0, fileName.length()))) {// 看名字是否一致
                                isExits = true;
                            }
                        }
                    }
                }
            }

            if (isExits == false) {
                JsonUtils.write_json(response, JSONObject.toJSONString(JsonUtils.setJosnStr("0", "磁盘文件不存在", "磁盘文件不存在"), SerializerFeature.WriteMapNullValue));
            }
            else {
                JsonUtils.write_json(response, JSONObject.toJSONString(JsonUtils.setJosnStr("1", "存在可以下载", ""), SerializerFeature.WriteMapNullValue));
            }

        } catch (Exception e) {
            e.printStackTrace();
            JsonUtils.write_json(response, JSONObject.toJSONString(JsonUtils.setJosnStr("1", "成功", "附件异常,请联系管理员"), SerializerFeature.WriteMapNullValue));
        }


    }




}

8、文件地址 

noticeAddress=c\:/mepscc/fileUpload/notice/

 9、jsp页面

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<% String pageName = "/report/toManagement"; %>

<%@include file="../leftFun.jsp" %>
<link rel="shortcut icon" href="#"/>

<link rel="stylesheet" href="<%=basePath%>/plugins/bootstrap-select-1.13.2/dist/css/bootstrap-select.css">

<link rel="stylesheet" href="<%=basePath%>/plugins/datatables/dataTables.bootstrap4.css">
<link rel="stylesheet"
      href="${pageContext.request.contextPath }/dist/js/plugins/bootstrap/css/bootstrap-datetimepicker.min.css">
<link rel="stylesheet" href="<%=basePath%>/plugins/bootstrap/css/bootstrap.css">
<%--webupload 样式 --%>
<link rel="stylesheet" href="<%=basePath%>/plugins/webuploader-0.1.5/webuploader-0.1.5/css/webuploader.css">


<!-- Bootstrap 4 -->
<script src="<%=basePath%>/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- DataTables -->
<script src="<%=basePath%>/plugins/datatables/jquery.dataTables.js"></script>
<script src="<%=basePath%>/plugins/datatables/dataTables.bootstrap4.js"></script>
<!-- SlimScroll -->
<script src="<%=basePath%>/plugins/slimScroll/jquery.slimscroll.min.js"></script>
<!-- FastClick -->
<script src="<%=basePath%>/plugins/fastclick/fastclick.js"></script>

<script src="<%=basePath%>/plugins/timepicker/bootstrap-timepicker.min.js"></script>
<!-- AdminLTE App -->
<script src="<%=basePath%>/dist/js/adminlte.min.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="<%=basePath%>/dist/js/demo.js"></script>

<script src="<%=basePath%>/plugins/select2/select2.full.min.js"></script>
<!-- InputMask -->
<script src="<%=basePath%>/plugins/input-mask/jquery.inputmask.js"></script>
<script src="<%=basePath%>/plugins/input-mask/jquery.inputmask.date.extensions.js"></script>
<script src="<%=basePath%>/plugins/input-mask/jquery.inputmask.extensions.js"></script>

<script src="<%=basePath%>/plugins/daterangepicker/moment.min.js"></script>


<%--<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script>--%>

<script src="<%=basePath%>/plugins/bootstrap/js/bootstrap.js"></script>
<script src="<%=basePath%>/dist/js/plugins/jquery/jquery.js"></script>
<script src="<%=basePath%>/dist/js/plugins/jquery/core.js"></script>


<script src="<%=basePath %>/plugins/bootstrap/js/bootstrap-datetimepicker.js"></script>
<script src="<%=basePath %>/plugins/bootstrap/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>

<script src="<%=basePath %>/plugins/bootstrap-select-1.13.2/dist/js/bootstrap-select.js"></script>
<script src="<%=basePath %>/plugins/utils.js"></script>

<script src="<%=basePath %>/plugins/layUI/layer.js"></script>
<%-- webupload --%>
<script src="<%=basePath %>/plugins/webuploader-0.1.5/webuploader-0.1.5/dist/webuploader.js"></script>

<style>
    #picker div:nth-child(2) {
        width: 100% !important;
        height: 100% !important;
    }
</style>
<div>
    <div class="content-wrapper">
        <section class="content-header">
        </section>
        <!-- Main content -->
        <section class="content">
            <div class="row">
                <div class="col-12">
                    <div class="card">
                        <div class="card-header">
                            <h3 class="card-title" style="margin-bottom: 0rem;">报告接收管理</h3>
                        </div>
                        <!-- /.card-header -->
                        <div class="card-body">

                            <form id="formReset" action="${pageContext.request.contextPath }/" method="post">
                                <div class="card-body">
                                    <div class="row">
                                        <div class="col-md-3">
                                            <div class="form-group">
                                                <label for="province">省份:</label>
                                                <input list="browsers_province" class="form-control" type="text"
                                                       id="province" name="province" placeholder="">
                                                <datalist id="browsers_province">
                                                </datalist>
                                            </div>
                                        </div>
                                        <div class="col-md-3">
                                            <div class="form-group">
                                                <label for="companyName">企业名称:</label>
                                                <input list="browsers_companyName" class="form-control" type="text"
                                                       id="companyName" name="companyName" placeholder="">
                                                <datalist id="browsers_companyName">
                                                </datalist>
                                            </div>
                                        </div>

                                        <div class="col-md-3">
                                            <div class="form-group">
                                                <label for="report_year">文件接收时间:</label>
                                                <input class="form-control year-dates" type="text" id="report_year"
                                                       name="report_year" placeholder="">
                                            </div>
                                        </div>
                                        <div class="col-md-3">
                                            <div class="form-group">
                                                <label for="report_year">所属年度:</label>
                                                <input type="text" class="form-control year-date " id="batchYear" name="batchYear">
                                            </div>
                                        </div>
                                        <div class="col-md-3">
                                            <div class="form-group">
                                                <label for="batchNumber">批次:</label>
                                                <select class="form-control select" id="batchNumber" name="batchNumber">
                                                </select>
                                            </div>
                                        </div>
                                        <div class="col-md-3">
                                            <div class="form-group">
                                                <label for="batchNumber">报送季度:</label>
                                                <select class="form-control select" id="submitQuarter2" name="submitQuarter">
                                                </select>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="col-md-12">
                                        <button  type="button" class="btn btn-default float-right"
                                                style="margin-right:10px;" onclick="fReset();">重置
                                        </button>
                                        <button id="query" type="button" class="btn btn-default float-right"
                                                style="margin-right:10px;">查询
                                        </button>
                                        <button id="insert" type="button" class="btn btn-default float-right insert"
                                                style="margin-right:10px;">新增
                                        </button>
                                    </div>
                                </div>

                            </form>

                            <table id="dataTable" class="table table-bordered table-striped dataTable" style="text-align:center">
                                <thead>
                                <tr>
                                    <th width="" style="white-space:nowrap;"><span style="color: white;">修改</span></th>
                                    <th width="" style="white-space:nowrap;">所属年份</th>
                                    <th width="15%" style="white-space:nowrap;">批次</th>
                                    <th width="" style="white-space:nowrap;">报送季度</th>
                                    <th width="" style="white-space:nowrap;">文件接收时间</th>
                                    <th width="" style="white-space:nowrap;">省份/市</th>
                                    <th width="" style="white-space:nowrap;">文件名称</th>
                                    <th width="12%" style="white-space:nowrap;">印发时间时间</th>
                                    <th width="" style="white-space:nowrap;">文件编号</th>
                                    <th width="" style="white-space:nowrap;">企业数</th>
                                    <th width="" style="white-space:nowrap;">上报企业</th>
                                    <th width="" style="white-space:nowrap;">接收人</th>
                                    <th width="" style="white-space:nowrap;">备注</th>
                                    <th width="" style="white-space:nowrap;"><span style="color: white;">删除</span></th>
                                </tr>
                                </thead>
                                <tbody></tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </section>
    </div>
    <%@include file="../footer.jsp" %>
    <aside class="control-sidebar control-sidebar-dark">
    </aside>
</div>


<%-- 新增页面模态框 --%>
<div  class="modal fade" id="myModal-save-info" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
     aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header" style="text-align: center">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title" id="myModalLabel" style="text-align: center">报告接收管理</h4>
            </div>
            <form class="form-horizontal" role="form" id="saveForm">
                <input type="hidden" id="id" name="id" value=""/>
                <div class="modal-body">
                    <div class="form-group">
                        <label for="batchYear" class="col-sm-10 control-label no-padding-right">所属年度:</label>
                        <input class="form-control year-date" type="text" id="batchYear2" name="batchYear">
                        <label for="province" class="col-sm-10 control-label no-padding-right">批次:</label>
                        <select class="form-control select" id="pc" name="batchNumber">
                            <option value=""></option>
                            <option value="1">第一批次</option>
                            <option value="2">第二批次</option>
                            <option value="3">第三批次</option>
                            <option value="4">第四批次</option>
                        </select>

                        <label for="province" class="col-sm-10 control-label no-padding-right">接收文件时间:</label>
                        <input class="form-control year-dates" type="text" id="receiveTime" name="receiveTime" value="">

                        <label for="province" class="col-sm-10 control-label no-padding-right">省份:</label>
                        <input list="browsers_provinces" class="form-control" type="text" multiple=multiple
                               id="provinces" name="provinces">
                        <datalist id="browsers_provinces">
                        </datalist>

                        <label for="province" class="col-sm-10 control-label no-padding-right">文件名称:</label>
                        <input class="form-control" type="text" id="fileName" name="fileName">
                        <label for="province" class="col-sm-10 control-label no-padding-right">印发时间:</label>
                        <input class="form-control year-dates" type="text" id="issuedTime" name="issuedTime" value="">
                        <label for="province" class="col-sm-10 control-label no-padding-right">文件编号:</label>
                        <input class="form-control" type="text" id="fileNumber" name="fileNumber">
                        <label for="province" class="col-sm-10 control-label no-padding-right">报送季度:</label>
                        <select class="form-control select" id="submitQuarter" name="submitQuarter">
                            <option value=""></option>
                            <option value="1">第一季度</option>
                            <option value="2">第二季度</option>
                            <option value="3">第三季度</option>
                            <option value="4">第四季度</option>
                        </select>


                        <label for="companyName" class="col-sm-10 control-label no-padding-right">企业名称:</label>
                   <%--     <input list="browsers_companyNames" class="form-control" type="text" id="enterprisesName" name="enterprisesName">
                        <datalist id="browsers_companyNames">
                        </datalist>--%>

                        <select class="form-control selectpicker" multiple="multiple"  title="可多选" id="enterprisesName" name="enterprisesName" >
                        </select>
                        <input type="hidden"  id="hiddEnterprisesName" value="" name="" >
                        <label for="province" class="col-sm-10 control-label no-padding-right">企业数:</label>
                        <input class="form-control" type="text" id="enterprisesNumber" name="enterprisesNumber" readonly="readonly" onkeyup="value=value.replace(/[^\d]/g,'')">

                        <label for="province" class="col-sm-10 control-label no-padding-right">接收人:</label>
                        <input class="form-control" type="text" id="recipient" name="recipient">
                        <label for="province" class="col-sm-10 control-label no-padding-right">备注:</label>
                        <input class="form-control" type="text" id="remarks" name="remarks">
                    </div>

                    <div id="uploader" class="wu-example">
                        <!--用来存放文件信息-->
                        <div id="thelist" class="uploader-list"></div>
                        <div class="btns">
                            <div id="picker">选择文件</div>
                            <a style="color:red;">单个上传文件的大小不能超过10MB,一次最多上传三个文件</a>
                        </div>
                    </div>


                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="button" class="btn btn-primary btn-insert" >提交</button>
                </div>
            </form>
        </div>
    </div>
</div>



<script type="text/javascript">
    var eName="";

    function query() {
        var provinces = ""; // 省份
        var enterprisesName = ""; // 企业名称
        var receiveTime = "";  //文件接收时间时间
        var batchNumber = ""; // 批次
        var batchYear=""; //年度
        var submitQuarter=""; // 季度
        provinces = $('#province').val();
        enterprisesName = $('#companyName').val();
        receiveTime = $('#report_year').val();
        batchNumber = $('#batchNumber').val();
        batchYear = $("#batchYear").val();
        // name=$("#electronic_name").find("option:selected").text();
        submitQuarter = $("#submitQuarter2").val();

        $.ajax({
            url: '${pageContext.request.contextPath }/materialRegForm/getMaterialRegForm',
            type: 'post',
            data: JSON.stringify(
                {
                    "provinces": provinces,
                    "enterprisesName": enterprisesName,
                    "receiveTime": receiveTime,
                    "batchNumber": batchNumber,
                    "batchYear":batchYear,
                    "submitQuarter":submitQuarter
                }
            ),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            success: function (data) {
                //console.log(data.data.list[0]);
                $('#dataTable tbody').empty();
                if (data.data.list.length > 0 && data.data.list != null) {

                    var data_con;
                    for (var i = 0; i < data.data.list.length; i++) {
                        //需要创建的内容
                        if (i % 2 == 1) {
                            data_con += '<tr role="row" class="even"  >';
                        } else {
                            data_con += '<tr role="row" class="odd"  >';
                        }

                        data_con += '<td>' + '<a href="javascript:void(0)" class="btn-update">修改</a><input type="checkbox" style="display: none" class="minimal" value="' + nullToEmptyStr(data.data.list[i].id) + '" name="disassembleId" id="disassembleId"/>' + '</td>';
                        data_con += '<td>' + nullToEmptyStr(data.data.list[i].batchYear) + '</td>';
                        if (data.data.list[i].batchNumber == "1") {
                            data_con += '<td>' + "第一批次" + '</td>';
                        } else if (data.data.list[i].batchNumber == "2") {
                            data_con += '<td>' + "第二批次" + '</td>';
                        } else if (data.data.list[i].batchNumber == "3") {
                            data_con += '<td>' + "第三批次" + '</td>';
                        } else if (data.data.list[i].batchNumber == "4") {
                            data_con += '<td>' + "第四批次" + '</td>';
                        } else {
                            data_con += '<td>' + "" + '</td>';
                        }

                        if (data.data.list[i].submitQuarter == "1") {
                            data_con += '<td>' + "第一季度" + '</td>';
                        } else if (data.data.list[i].submitQuarter == "2") {
                            data_con += '<td>' + "第二季度" + '</td>';
                        } else if (data.data.list[i].submitQuarter == "3") {
                            data_con += '<td>' + "第三季度" + '</td>';
                        } else if (data.data.list[i].submitQuarter == "4") {
                            data_con += '<td>' + "第四季度" + '</td>';
                        } else {
                            data_con += '<td>' + "" + '</td>';
                        }
                        data_con += '<td>' + new Date(Number(data.data.list[i].receiveTime)).getFullYear() + '-' + p((new Date(Number(data.data.list[i].receiveTime)).getMonth() + 1)) + '-' + p(new Date(Number(data.data.list[i].receiveTime)).getDate()) + '</td>';
                        data_con += '<td>' + nullToEmptyStr(data.data.list[i].provinces) + '</td>';
                        data_con += '<td class="cause">' + nullToEmptyStr(cutStr_5(data.data.list[i].fileName)) + '</td>';
                        data_con += '<td style="display:none;">' + nullToEmptyStr(data.data.list[i].fileName) + '</td>';
                        data_con += '<td>' + new Date(Number(data.data.list[i].issuedTime)).getFullYear() + '-' + p((new Date(Number(data.data.list[i].issuedTime)).getMonth() + 1)) + '-' + p(new Date(Number(data.data.list[i].issuedTime)).getDate()) + '</td>';
                        data_con += '<td>' + nullToEmptyStr(data.data.list[i].fileNumber) + '</td>';
                        data_con += '<td>' + nullToEmptyStr(data.data.list[i].enterprisesNumber) + '</td>';
                        data_con += '<td class="cause">' + nullToEmptyStr(cutStr_5(removeBlock(data.data.list[i].enterprisesName))) + '</td>';
                        data_con += '<td style="display:none;">' + nullToEmptyStr(removeBlock(data.data.list[i].enterprisesName)) + '</td>';
                        data_con += '<td>' + nullToEmptyStr(data.data.list[i].recipient) + '</td>';
                        data_con += '<td class="cause">' + nullToEmptyStr(cutStr_2(data.data.list[i].remarks)) + '</td>';
                        data_con += '<td style="display:none;">' + nullToEmptyStr(data.data.list[i].remarks) + '</td>';
                        data_con += '<td>' + '<a href="javascript:void(0)" class="btn-delete">删除</a><input type="checkbox" style="display: none" class="minimal" value="' + nullToEmptyStr(data.data.list[i].id) + '" name="disassembleId" id="disassembleId"/>' + '</td>';
                        data_con += '</tr>';
                        //合并单元格
                    }
                    $('#dataTable tbody').html(data_con);
                } else {
                    layer.msg("无数据");
                }

            }
        })
    }

    //补0
    function p(s) {
        return s < 10 ? '0' + s : s;
    }


    $('#query').click(function () {
        query();
    });
    $(document).ready(function () {
        query();
    });

    //截取显示字符长度
    function cutStr_5(str) {
        if (str != null && str != "null") {
            str = str.replace(' ', '').substring(0, 4)
        }
        return str;
    }
    function cutStr_2(str) {
        if (str != null && str != "null") {
            str = str.replace(' ', '').substring(0, 2)
        }
        return str;
    }

    //显示字符0补NULL
    function nullToEmptyStr(str) {
        if (!str) {
            if (str == 0) {
                return 0;
            }
            return '';
        }
        return str;
    }

    /*重置文件选择框
    */
    function resetFile() {
        if (window.navigator.userAgent.indexOf("MSIE") >= 1) {    // 此处判断是否是IE
            $('#file').replaceWith($('#file').clone(true));
        } else {
            $('#file').val('');
        }
    }


    // 获取选中主键值组
    function getChecked() {
        var arr = new Array();
        $('input[type=checkbox][name=disassembleId]:checked').each(function () {
            arr.push($(this).val());
        });
        return arr;
    }

    //自动获取企业数
    $("#enterprisesName").change(function () {
    var  arr= new  Array();
       var str= $('.selectpicker ').selectpicker('val').toString();
        arr=str.split(',');
        if (str!=""){
            $("#enterprisesNumber").val(arr.length)
        }else{
            var v =$("#enterprisesNumber").val();
            $("#enterprisesNumber").val(v)
        }
    });

 /* $("#enterprisesNumber").click(function () {

    });*/

    /**
     *  省份查询
     */
    $('#province').focus(function () {
        $.ajax({
            url: '${pageContext.request.contextPath }/parameter/getProvince',
            type: 'post',
            data: JSON.stringify({"province": $(this).val()}),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            traditional: true,
            success: function (data) {
                $('#browsers_province').empty();
                var pro = data.data;
                for (var o in pro) {
                    $('#browsers_province').append('<option label="' + pro[o] + '" value="' + o + '">')
                }
                $('#browsers_companyName').empty();
            },
            error: function () {
                layer.msg("异常!");
            }
        })
    });

    /**
     * 弹出模态框省份
     * */
    $('#provinces').focus(function () {
        $.ajax({
            url: '${pageContext.request.contextPath }/parameter/getProvince',
            type: 'post',
            data: JSON.stringify({"province": $(this).val()}),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            traditional: true,
            success: function (data) {
                $('#browsers_provinces').empty();
                var pro = data.data;
                for (var o in pro) {
                    $('#browsers_provinces').append('<option label="' + pro[o] + '" value="' + o + '">')
                }
               // $('.browsers_companyNames').empty();


            },
            error: function () {
                layer.msg("异常!");

            }
        })
    });


    /**
     * 企业名称选择框,动态时时加载企业名称
     */
    $("#companyName").focus(function () {
        $.ajax({
            url: '${pageContext.request.contextPath }/parameter/getCompanyName',
            type: 'post',
            data: JSON.stringify({"province": $("#province").val()}),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            traditional: true,
            success: function (data) {
                //console.log(data.data)
                $('#browsers_companyName').empty();
                var com = data.data;
                for (var o in com) {
                    $('#browsers_companyName').append('<option label="' + com[o] + '" value="' + o + '">');
                }
            },
            error: function () {
                layer.msg("服务器异常!");
            }
        })
    });

    /**
     * 弹出模态框企业名称
     * */
    function company(){
        $.ajax({
            url: '${pageContext.request.contextPath }/parameter/getCompanyName',
            type: 'post',
            data: JSON.stringify({"province": $("#provinces").val()}),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            traditional: true,
            success: function (data) {
                //console.log(data.data)
                //$('.browsers_companyNames').empty();
                var com = data.data;
                for (var o in com) {
                    //console.log(o);
                    $(".selectpicker").append("<option value='" + o + "'>" + o + "</option>");
                }
                $('.selectpicker').selectpicker('val', '');
                $('.selectpicker').selectpicker('refresh');
            },
            error: function () {
                layer.msg("服务器异常!");
            }
        });
    }


    /**
     * 根据年查季度
     * */
    $("#batchYear").change(function(){
        $.ajax({
            url : '${pageContext.request.contextPath }/materialRegForm/getBatchYear',
            type : 'post',
            data : JSON.stringify({"batchYear":$('#batchYear').val()}),
            dataType : 'json',
            contentType : 'application/json; charset=utf-8',
            traditional: true,
            success:function(data){
                $('#batchNumber').empty();
                $('#batchNumber').append('<option value=""></option>')
                var com = data.data;
                for(var o in com){
                    $('#batchNumber').append('<option value='+o+'>'+com[o]+'</option>');
                }
                //联动季度
                $.ajax({
                    url : '${pageContext.request.contextPath }/materialRegForm/getSubmitQuarter',
                    type : 'post',
                    data : JSON.stringify({"batchYear":$('#batchYear').val()}),
                    dataType : 'json',
                    contentType : 'application/json; charset=utf-8',
                    traditional: true,
                    success:function(data){
                        $('#submitQuarter2').empty();
                        $('#submitQuarter2').append('<option value=""></option>')
                        var com = data.data;
                        for(var o in com){
                            $('#submitQuarter2').append('<option value='+o+'>'+com[o]+'</option>');
                        }
                    }
                })
            },
            error : function(a,b,c,d) {
            }
        })
    });

    //重置
    function fReset() {
        document.getElementById("formReset").reset();
        query();
    }

    //获取身份对应的城市
    $("#provinces").blur(function () {
        $('.selectpicker').empty()
        company();
    });
    //加载所有公司
    $(function() {
        company()
    });


    $(document).on('click mouseenter', '.cause', function () {
        var that = this;
        //console.log($(that).next().text());
        layer.tips($(that).next().text(), that); //在元素的事件回调体中,follow直接赋予this即可
    });


    //添加页面
    $(document).delegate('.insert', 'click', function () {
        company();
        //设置默认名称
        $(".selectpicker").selectpicker({
            title:"可多选"
        });
        $('.selectpicker').selectpicker('val',1);
        $("#id").val("");
        //弹出框
        $('#myModal-save-info').modal('show');
        $("#thelist").empty();
        $('#saveForm').get(0).reset();
        webupload('add');

    });




    //修改回显
    $(document).delegate('.btn-update', 'click', function () {
        var url = '${pageContext.request.contextPath }/materialRegForm/selectById/' + $(this).next().val();
        post(url, null, function (result) {
          //  console.log(result.data);
            if (result != null) {
                $("#thelist").empty();
                $('#saveForm').get(0).reset();
                $('#saveForm').initForm({
                    jsonValue: result.data
                });

                //多选框默认选中
                var e =  removeBlock(result.data.enterprisesName);
                $(".selectpicker").selectpicker({
                    title:e
                });
                $('.selectpicker').selectpicker('val', e);

                //全局变量赋值
                eName=result.data.enterprisesName;


                $("#receiveTime").val(getLocalTime($("#receiveTime").val()));
                $("#issuedTime").val(getLocalTime($("#issuedTime").val()));

                $('#myModal-save-info').modal('show');
                var ids = jsonValue.id;
                $("#id").val(ids);
                webupload();

            } else {

            }
        });
    });


    //删除单条记录
    $(document).delegate('.btn-delete', 'click', function () {
        var url = '${pageContext.request.contextPath}/materialRegForm/deleteFunction/' + $(this).next().val();
         layer.confirm("确认删除?",function () {
             post(url, null, function (ret) {
                 if (ret.code == 1) {
                     layer.msg(ret.msg);
                     query();
                 } else {
                     layer.msg(ret.msg);
                 }
             });
        });

    });


    //时间戳转日期格式
    function getLocalTime(value) {
        var a = parseInt(value);
        return isNaN(a) ? "非法日期" : formatDate(new Date(a));
    }

    function formatDate(now) {
        var year = now.getFullYear();
        var month = now.getMonth() + 1;
        var date = now.getDate();
        /*  var hour = now.getHours();
          var minute = now.getMinutes();
          var second = now.getSeconds();*/

        return year + "-" + p(month) + "-" + p(date);
    }

    //判断输入框
    function input1(value, element) {
        return this.optional(element) || /^[-\+]?\d+$/.test(value) || /^[-\+]?\d+(\.\d+)?$/.test(value);
    }

     //去除包裹的大括号
    function removeBlock (str) {
        if (str) {
            var reg = /^\[/gi
            var reg2 = /\]$/gi
            str = str.replace(reg, '')
            str = str.replace(reg2, '')
            return str
        } else {
            return str
        }
    }

</script>


<%--附件上传--%>
<script type="text/javascript">
    var uploader;
    var deleteFileArr = "";  //拼接ID
    var materialId;
    var AcFileId;//回显时的附件id
    function webupload(method) {

        if (uploader != undefined) {
            uploader.destroy();    //用于防止每次调用 选择文件框变大 每次调用initUploader()函数前,一定要将uploader销毁,要不然调用一次,上传文件框就会变大一次
        };

        materialId = $("#id").val();//通过id 有没有值 判断是修改还是新增
        if (materialId == undefined) {
            materialId = 0;
        }

        var fileArrs = new Array();
        var length = 3; //定义上传文件的个数
        var allMaxSize = 10;//定义单个上传文件的大小
        $('#publishTime').datetimepicker({
            format: "YYYY-MM-DD HH:mm:ss"
        });
        //添加赋值
        if (method == "add") {
            materialId = 0;
        }


        uploader = WebUploader.create({
            formData: {
                materialId: materialId
            },
            // swf文件路径
            swf: '${pageContext.request.contextPath}/plugins/webuploader-0.1.5/webuploader-0.1.5/dist/Uploader.swf',
            // 文件接收服务端。
            server: '${pageContext.request.contextPath}/materialRegForm/importMaterialRegFormFile',
            // 选择文件的按钮。可选。
            // 内部根据当前运行是创建,可能是input元素,也可能是flash.
            pick: '#picker',
            // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
            resize: false,
            auto: false,
            duplicate: true,
            fileNumLimit: length,
            fileSizeLimit: allMaxSize * 1024 * 1024//限制大小10M,所有被选文件,超出选择不上
        });


        // 当有文件被添加进队列的时候
        uploader.on('fileQueued', function (file) {
            var fileIndex = fileArrs.indexOf(file.name);
            fileArrs.push(file.name);
            // console.log(fileIndex +"   :当文件被加入队列的时候输出");  //输出-1
            if (fileIndex == -1) {
                //console.log("file.statusText   :    "+file.statusText);  // 用于判断上传的状态  complete完成上传
                if (file.statusText == 'complete') {
                    //$("#thelist").empty(); //清空div
                    $list = $("#thelist");
                    $list.append('<div id="' + file.id + '" class="item">' +
                        '<h4 class="info">' + '<a style="cursor:pointer; color:#00BFFF" onclick="downloadFindFile(this)"  value="' + AcFileId + '">' + file.name + '</a>' + '<a id="dowfile' + AcFileId + '" href="${pageContext.request.contextPath}/materialRegForm/downloadFile?id=' + AcFileId + '">' + '</a>' + '</h4><p class="state">完成上传</p>' +
                        '<p class="remove-this"  style="color: red;cursor:pointer;display:inline-block">删除</p>' +
                        '</div>');
                } else {
                    //$("#thelist").empty();
                    $list = $("#thelist");
                    $list.append('<div id="' + file.id + '" class="item">' +
                        '<h4 class="info">' + file.name + '</h4><p class="state">等待上传...</p>' +
                        '<p class="remove-this"  style="color: red;cursor:pointer;display:inline-block " >删除</p>' +
                        '</div>');
                }
            } else {
                layer.msg("上传文件名不能重复");
                uploader.removeFile(file);
            }
        });


        //判断文件上传的大小个数
        uploader.on("error", function (err) {
            if (err == "Q_EXCEED_NUM_LIMIT") {
                layer.msg("附件上传只能上传" + length + "个");
            } else if (err == "Q_EXCEED_SIZE_LIMIT") {
                layer.msg("附件上传单个文件大小不能超过" + allMaxSize + "MB");
            }
        });

        //上传成功提示
        uploader.on('uploadSuccess', function (file) {
            $('#' + file.id).addClass('upload-state-done');
            $('#' + file.id).find('p.state').text('完成上传');
            var stats = uploader.getStats();
            //如果队列中不存在数据的话,直接保存
            if (stats.queueNum == 0 && stats.progressNum == 0 && stats.interruptNum == 0) {
                layer.msg("保存成功。上传成功的文件数为:" + stats.successNum + ",上传失败的文件数为:" + stats.uploadFailNum + "。");
            }
        });

        //上传出错提示
        uploader.on('uploadError', function (file) {
            $('#' + file.id).find('p.state').text('上传出错');
        });

        //删除数组中的元素
        Array.prototype.remove = function (val) {
            var index = this.indexOf(val);
            if (index > -1) {
                this.splice(index, 2);//删除两个
            }
        };


        //修改删除按钮
        $('#thelist').on('click', '.remove-this', function () {
            var fileItem = $(this).parent();
            var id = $(fileItem).attr("id");
            var file = uploader.getFile(id);
            if (file == undefined) {
                return;
            }
            var fileid = file.source.id;
            if (id != "") {//修改时删除文件并删除数据库数据及上传的文件 通过文件名称删除
                $("#" + id).remove();
                uploader.removeFile(id, true);
                fileArrs.remove(file.name);
                if (fileid != null && fileid != undefined && fileid != "") {
                    deleteFileArr += fileid + ",";
                }
            } else {//新增时删除文件 清空队列
                uploader.removeFile(id, true);
                fileArrs.remove(file.name);
                $(fileItem).fadeOut(function () {
                    $(fileItem).remove();
                });
            }
        });


        //修改的话 回显附件
        if (materialId != "" || materialId != undefined) {
            $.ajax({
                url: '${pageContext.request.contextPath}/materialRegForm/getMaterialRegFormFiles?materialId=' + materialId,
                type: 'GET',
                headers: {"Accept": "application/json"},
                contentType: 'application/json;charset=utf-8',
                success: function (resp) {
                    if (resp.data.success) {
                        var res = resp.data;
                        fileList = res.list;
                        console.log(fileList);
                        $.each(fileList, function (index, item) {
                            AcFileId = item.fileId//附件id
                            var obj = {};
                            var arr = item.uploadName;//用户上传的文件名
                            var index = arr.length - 1;
                            obj.name = arr;
                            obj.id = item.fileId;
                            obj.size = 1;
                            var file = new WebUploader.File(obj);
                            //此处是关键,将文件状态改为'已上传完成'
                            file.setStatus('complete', 'complete');
                            uploader.addFiles(file);
                            fileArrs.push(file.name);

                        });

                    } else {
                        layer.msg(resp.msg);
                    }
                },
                error: function (resp) {
                    layer.msg(resp.msg);
                }
            });
        }



        //webupload
    }


    //保存
    $(document).delegate('.btn-insert', 'click', function () {
        //用来解决  selectpicker 框架不会先select 值问题
        var i = $('.selectpicker').selectpicker('val');
        if (i=="") {
            $('select[name="enterprisesName"]').attr('name','');
            $('input[id="hiddEnterprisesName"]').attr('name','enterprisesName');
            $("input[id='hiddEnterprisesName']").attr("value",eName);
        }else{
            $('input[id="hiddEnterprisesName"]').attr('name','');
            $('select[id="enterprisesName"]').attr('name','enterprisesName');
            $('.selectpicker').selectpicker('val',i);
        }

        var url = '${pageContext.request.contextPath}/materialRegForm/saveFunction';
        post(url, JSON.stringify($('#saveForm').serializeObject()), function (ret) {
            if (ret.code == 1) {
           var id= $("#id").val();
           if (id==""){
               layer.msg("保存成功");
           }else{
               layer.msg("修改成功");
           }
            console.log(id);
                if (materialId != "") {

                    if (deleteFileArr.length != 0 && deleteFileArr != null && deleteFileArr != undefined) {

                        deleteFileByUpdate();
                    }
                }

                uploader.upload();

                query();
                $('#myModal-save-info').modal('hide');

            } else {
                layer.msg(ret.msg);
            }
        });
    });


    //修改删除附件
    function deleteFileByUpdate() {
        var divLength = $('#thelist').html().length;//div中内容长度
        $.get("${pageContext.request.contextPath}/materialRegForm/deleteFileByUpdate?deleteFileArr=" + deleteFileArr + "&divLength=" + divLength, function (data) {
            if (data.code == 1) {
                layer.msg("保存成功");
            } else {
                layer.msg("保存失败请刷新页面进行重试");
            }
        })
    }



    //单个文件下载
    function downloadFindFile(obj) {
        var AcFileId = $(obj).attr("value");
        //console.log(AcFileId);
        var el = document.getElementById("dowfile" + AcFileId);

        $.get("${pageContext.request.contextPath}/materialRegForm/downloadFindFile?id=" + AcFileId, function (data) {
            if (data.code == 1) {
                el.click();
            } else if (data.code == 0) {
                layer.msg(data.msg);
            }
        })

    }


</script>


<script>
    /**
     * 初始化时间插件
     * $input: jquery对象
     * param: 自定义配置参数
     * 例如:initDateTime($('#datepicker'), {
     *		format: "yyyy-mm",
     *		startView: '3',
     *		minView:'3',
     *	})
     */
    function initDateTime($input, param) {
        $input.datetimepicker('remove');
        var option = {
            language: 'zh-CN',
            format: "yyyy-mm-dd",
            startView: '2',
            minView: '2',
            autoclose: true,
            todayBtn: true,
            pickerPosition: "bottom-left"
        }
        if (param) {
            $.extend(true, option, param)
        }
        return $input.datetimepicker(option).datetimepicker('setDate', new Date());
    }

    /**
     * 年份
     */

    initDateTime($('.year-date'), {
        format: 'yyyy',
        startView: '4',
        minView: '4',
        maxView: '4',
        startDate: '2014',
        endDate: '2019'
    }).val("");

    initDateTime($('.year-dates'), {
        format: 'yyyy-mm-dd'
    }).val("");
</script>

</body>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值