parent
cfdcda3458
commit
5daed4d743
@ -0,0 +1,92 @@
|
|||||||
|
package com.ruoyi.flyingbook.CosHelper;
|
||||||
|
|
||||||
|
import com.qcloud.cos.COSClient;
|
||||||
|
import com.qcloud.cos.ClientConfig;
|
||||||
|
import com.qcloud.cos.Headers;
|
||||||
|
import com.qcloud.cos.auth.AnonymousCOSCredentials;
|
||||||
|
import com.qcloud.cos.auth.BasicCOSCredentials;
|
||||||
|
import com.qcloud.cos.auth.COSCredentials;
|
||||||
|
import com.qcloud.cos.auth.COSSigner;
|
||||||
|
import com.qcloud.cos.exception.CosClientException;
|
||||||
|
import com.qcloud.cos.exception.CosServiceException;
|
||||||
|
import com.qcloud.cos.http.HttpMethodName;
|
||||||
|
import com.qcloud.cos.http.HttpProtocol;
|
||||||
|
import com.qcloud.cos.model.Bucket;
|
||||||
|
import com.qcloud.cos.model.CannedAccessControlList;
|
||||||
|
import com.qcloud.cos.model.PutObjectRequest;
|
||||||
|
import com.qcloud.cos.model.PutObjectResult;
|
||||||
|
import com.qcloud.cos.model.ciModel.job.DocHtmlRequest;
|
||||||
|
import com.qcloud.cos.region.Region;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yuxiangyong
|
||||||
|
* @create 2023-08-19 9:52
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class CosHelper {
|
||||||
|
|
||||||
|
private String secretId = "AKID62pQpzvd7MyVs31mV3OXUVKxNadT7Zu5";
|
||||||
|
private String secretKey = "2EXcUYQ8fz61jGahbMvISbaMxMYZO0Qg";
|
||||||
|
|
||||||
|
private COSClient buildClinet(){
|
||||||
|
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
|
||||||
|
Region region = new Region("ap-beijing");
|
||||||
|
ClientConfig clientConfig = new ClientConfig(region);
|
||||||
|
clientConfig.setHttpProtocol(HttpProtocol.https);
|
||||||
|
return new COSClient(cred, clientConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PutObjectResult upload(String bucketName, String key, File localFile){
|
||||||
|
COSClient cosClient = null;
|
||||||
|
try {
|
||||||
|
cosClient = buildClinet();
|
||||||
|
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
|
||||||
|
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
|
||||||
|
return putObjectResult;
|
||||||
|
}catch (Exception e){
|
||||||
|
log.info("upload file error",e);
|
||||||
|
}finally {
|
||||||
|
shutdown(cosClient);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成临时图片链接
|
||||||
|
* @param bucketName
|
||||||
|
* @param key
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String previewUrl(String bucketName, String key){
|
||||||
|
COSClient cosClient = null;
|
||||||
|
try {
|
||||||
|
cosClient = buildClinet();
|
||||||
|
Date expirationDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000);
|
||||||
|
Map<String, String> params = new HashMap<String, String>();
|
||||||
|
Map<String, String> headers = new HashMap<String, String>();
|
||||||
|
HttpMethodName method = HttpMethodName.GET;
|
||||||
|
URL url = cosClient.generatePresignedUrl(bucketName, key, expirationDate, method, headers, params);
|
||||||
|
System.out.println(url.toString());
|
||||||
|
}catch (Exception e){
|
||||||
|
log.info("upload file error",e);
|
||||||
|
}finally {
|
||||||
|
shutdown(cosClient);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void shutdown(COSClient cosClient){
|
||||||
|
if (cosClient != null){
|
||||||
|
cosClient.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package com.ruoyi.flyingbook.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
|
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||||
|
import com.ruoyi.common.annotation.Excel;
|
||||||
|
import com.ruoyi.common.core.domain.BaseEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【请填写功能名称】对象 lark_user_active_image
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2023-08-19
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class LarkUserActiveImage extends BaseEntity
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/** $column.columnComment */
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/** 用户活动关联关系id */
|
||||||
|
private Long userActiveRelatoin;
|
||||||
|
|
||||||
|
/** 存储桶路径 */
|
||||||
|
private String bucketName;
|
||||||
|
|
||||||
|
/** 文件的唯一key */
|
||||||
|
private String fileKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see com.ruoyi.common.enums.FlagStatus
|
||||||
|
*/
|
||||||
|
private Long flag;
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.ruoyi.flyingbook.domain.larkactive;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yuxiangyong
|
||||||
|
* @create 2023-08-16 16:58
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class LarkSessionDetailResponse {
|
||||||
|
|
||||||
|
private String open_id;
|
||||||
|
private String employee_id;
|
||||||
|
private String session_key;
|
||||||
|
private String tenant_key;
|
||||||
|
private String access_token;
|
||||||
|
private String expires_in;
|
||||||
|
private String refresh_token;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.ruoyi.flyingbook.domain.larkactive;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yuxiangyong
|
||||||
|
* @create 2023-08-16 16:58
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class LarkSessionRequest {
|
||||||
|
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.ruoyi.flyingbook.domain.larkactive;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yuxiangyong
|
||||||
|
* @create 2023-08-16 16:58
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class LarkSessionResponse {
|
||||||
|
|
||||||
|
private String code;
|
||||||
|
private String msg;
|
||||||
|
private LarkSessionDetailResponse data;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package com.ruoyi.flyingbook.mapper;
|
||||||
|
|
||||||
|
import com.ruoyi.flyingbook.domain.LarkUserActiveImage;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【请填写功能名称】Mapper接口
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2023-08-19
|
||||||
|
*/
|
||||||
|
public interface LarkUserActiveImageMapper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 查询【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param id 【请填写功能名称】ID
|
||||||
|
* @return 【请填写功能名称】
|
||||||
|
*/
|
||||||
|
public LarkUserActiveImage selectLarkUserActiveImageById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询【请填写功能名称】列表
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 【请填写功能名称】集合
|
||||||
|
*/
|
||||||
|
public List<LarkUserActiveImage> selectLarkUserActiveImageList(LarkUserActiveImage larkUserActiveImage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int insertLarkUserActiveImage(LarkUserActiveImage larkUserActiveImage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int updateLarkUserActiveImage(LarkUserActiveImage larkUserActiveImage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param id 【请填写功能名称】ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteLarkUserActiveImageById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param ids 需要删除的数据ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteLarkUserActiveImageByIds(Long[] ids);
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package com.ruoyi.flyingbook.service;
|
||||||
|
|
||||||
|
import com.ruoyi.flyingbook.domain.LarkUserActiveImage;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【请填写功能名称】Service接口
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2023-08-19
|
||||||
|
*/
|
||||||
|
public interface ILarkUserActiveImageService
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 查询【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param id 【请填写功能名称】ID
|
||||||
|
* @return 【请填写功能名称】
|
||||||
|
*/
|
||||||
|
public LarkUserActiveImage selectLarkUserActiveImageById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询【请填写功能名称】列表
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 【请填写功能名称】集合
|
||||||
|
*/
|
||||||
|
public List<LarkUserActiveImage> selectLarkUserActiveImageList(LarkUserActiveImage larkUserActiveImage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int insertLarkUserActiveImage(LarkUserActiveImage larkUserActiveImage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int updateLarkUserActiveImage(LarkUserActiveImage larkUserActiveImage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param ids 需要删除的【请填写功能名称】ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteLarkUserActiveImageByIds(Long[] ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除【请填写功能名称】信息
|
||||||
|
*
|
||||||
|
* @param id 【请填写功能名称】ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteLarkUserActiveImageById(Long id);
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
package com.ruoyi.flyingbook.service.impl;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
|
import com.ruoyi.flyingbook.domain.LarkUserActiveImage;
|
||||||
|
import com.ruoyi.flyingbook.mapper.LarkUserActiveImageMapper;
|
||||||
|
import com.ruoyi.flyingbook.service.ILarkUserActiveImageService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【请填写功能名称】Service业务层处理
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2023-08-19
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class LarkUserActiveImageServiceImpl implements ILarkUserActiveImageService
|
||||||
|
{
|
||||||
|
@Autowired
|
||||||
|
private LarkUserActiveImageMapper larkUserActiveImageMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param id 【请填写功能名称】ID
|
||||||
|
* @return 【请填写功能名称】
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public LarkUserActiveImage selectLarkUserActiveImageById(Long id)
|
||||||
|
{
|
||||||
|
return larkUserActiveImageMapper.selectLarkUserActiveImageById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询【请填写功能名称】列表
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 【请填写功能名称】
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<LarkUserActiveImage> selectLarkUserActiveImageList(LarkUserActiveImage larkUserActiveImage)
|
||||||
|
{
|
||||||
|
return larkUserActiveImageMapper.selectLarkUserActiveImageList(larkUserActiveImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int insertLarkUserActiveImage(LarkUserActiveImage larkUserActiveImage)
|
||||||
|
{
|
||||||
|
larkUserActiveImage.setCreateTime(DateUtils.getNowDate());
|
||||||
|
return larkUserActiveImageMapper.insertLarkUserActiveImage(larkUserActiveImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param larkUserActiveImage 【请填写功能名称】
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int updateLarkUserActiveImage(LarkUserActiveImage larkUserActiveImage)
|
||||||
|
{
|
||||||
|
larkUserActiveImage.setUpdateTime(DateUtils.getNowDate());
|
||||||
|
return larkUserActiveImageMapper.updateLarkUserActiveImage(larkUserActiveImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除【请填写功能名称】
|
||||||
|
*
|
||||||
|
* @param ids 需要删除的【请填写功能名称】ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int deleteLarkUserActiveImageByIds(Long[] ids)
|
||||||
|
{
|
||||||
|
return larkUserActiveImageMapper.deleteLarkUserActiveImageByIds(ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除【请填写功能名称】信息
|
||||||
|
*
|
||||||
|
* @param id 【请填写功能名称】ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int deleteLarkUserActiveImageById(Long id)
|
||||||
|
{
|
||||||
|
return larkUserActiveImageMapper.deleteLarkUserActiveImageById(id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.ruoyi.flyingbook.mapper.LarkUserActiveImageMapper">
|
||||||
|
|
||||||
|
<resultMap type="com.ruoyi.flyingbook.domain.LarkUserActiveImage" id="LarkUserActiveImageResult">
|
||||||
|
<result property="id" column="id" />
|
||||||
|
<result property="userActiveRelatoin" column="user_active_relatoin" />
|
||||||
|
<result property="bucketName" column="bucket_name" />
|
||||||
|
<result property="fileKey" column="file_key" />
|
||||||
|
<result property="createBy" column="create_by" />
|
||||||
|
<result property="createTime" column="create_time" />
|
||||||
|
<result property="updateBy" column="update_by" />
|
||||||
|
<result property="updateTime" column="update_time" />
|
||||||
|
<result property="flag" column="flag" />
|
||||||
|
<result property="remark" column="remark" />
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<sql id="selectLarkUserActiveImageVo">
|
||||||
|
select id, user_active_relatoin, bucket_name, file_key, create_by, create_time, update_by, update_time, flag, remark from lark_user_active_image
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<select id="selectLarkUserActiveImageList" parameterType="com.ruoyi.flyingbook.domain.LarkUserActiveImage" resultMap="LarkUserActiveImageResult">
|
||||||
|
<include refid="selectLarkUserActiveImageVo"/>
|
||||||
|
<where>
|
||||||
|
<if test="userActiveRelatoin != null "> and user_active_relatoin = #{userActiveRelatoin}</if>
|
||||||
|
<if test="bucketName != null and bucketName != ''"> and bucket_name like concat('%', #{bucketName}, '%')</if>
|
||||||
|
<if test="fileKey != null and fileKey != ''"> and file_key = #{fileKey}</if>
|
||||||
|
<if test="flag != null "> and flag = #{flag}</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectLarkUserActiveImageById" parameterType="Long" resultMap="LarkUserActiveImageResult">
|
||||||
|
<include refid="selectLarkUserActiveImageVo"/>
|
||||||
|
where id = #{id}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<insert id="insertLarkUserActiveImage" parameterType="com.ruoyi.flyingbook.domain.LarkUserActiveImage" useGeneratedKeys="true" keyProperty="id">
|
||||||
|
insert into lark_user_active_image
|
||||||
|
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||||
|
<if test="userActiveRelatoin != null">user_active_relatoin,</if>
|
||||||
|
<if test="bucketName != null">bucket_name,</if>
|
||||||
|
<if test="fileKey != null">file_key,</if>
|
||||||
|
<if test="createBy != null and createBy != ''">create_by,</if>
|
||||||
|
<if test="createTime != null">create_time,</if>
|
||||||
|
<if test="updateBy != null">update_by,</if>
|
||||||
|
<if test="updateTime != null">update_time,</if>
|
||||||
|
<if test="flag != null">flag,</if>
|
||||||
|
<if test="remark != null">remark,</if>
|
||||||
|
</trim>
|
||||||
|
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||||
|
<if test="userActiveRelatoin != null">#{userActiveRelatoin},</if>
|
||||||
|
<if test="bucketName != null">#{bucketName},</if>
|
||||||
|
<if test="fileKey != null">#{fileKey},</if>
|
||||||
|
<if test="createBy != null and createBy != ''">#{createBy},</if>
|
||||||
|
<if test="createTime != null">#{createTime},</if>
|
||||||
|
<if test="updateBy != null">#{updateBy},</if>
|
||||||
|
<if test="updateTime != null">#{updateTime},</if>
|
||||||
|
<if test="flag != null">#{flag},</if>
|
||||||
|
<if test="remark != null">#{remark},</if>
|
||||||
|
</trim>
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<update id="updateLarkUserActiveImage" parameterType="com.ruoyi.flyingbook.domain.LarkUserActiveImage">
|
||||||
|
update lark_user_active_image
|
||||||
|
<trim prefix="SET" suffixOverrides=",">
|
||||||
|
<if test="userActiveRelatoin != null">user_active_relatoin = #{userActiveRelatoin},</if>
|
||||||
|
<if test="bucketName != null">bucket_name = #{bucketName},</if>
|
||||||
|
<if test="fileKey != null">file_key = #{fileKey},</if>
|
||||||
|
<if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
|
||||||
|
<if test="createTime != null">create_time = #{createTime},</if>
|
||||||
|
<if test="updateBy != null">update_by = #{updateBy},</if>
|
||||||
|
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||||
|
<if test="flag != null">flag = #{flag},</if>
|
||||||
|
<if test="remark != null">remark = #{remark},</if>
|
||||||
|
</trim>
|
||||||
|
where id = #{id}
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<delete id="deleteLarkUserActiveImageById" parameterType="Long">
|
||||||
|
delete from lark_user_active_image where id = #{id}
|
||||||
|
</delete>
|
||||||
|
|
||||||
|
<delete id="deleteLarkUserActiveImageByIds" parameterType="String">
|
||||||
|
delete from lark_user_active_image where id in
|
||||||
|
<foreach item="id" collection="array" open="(" separator="," close=")">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
</delete>
|
||||||
|
</mapper>
|
Loading…
Reference in new issue