test-demo-record

常规

@ApiOperation(value = "发送短信")
	@PostMapping("/test/sendSms")
	@ActionLog(action = "发送短信", remark = "发送短信")
	public R sendSms(@Valid @RequestBody SendSmsREQ req , @RequestHeader("Tenant-Id") String tenantId) {
		R r = shopRegisterService.sendSms(req, tenantId);
		return r;
	}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import java.io.Serializable;

@Data
@ApiModel(value = "短信发送对象")
public class SendSmsREQ implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * 手机号
	 */
	@ApiModelProperty(value = "手机号")
	@NotBlank(message = "手机号不能为空")
	private String phonenum;


	/**
	 * 发送短信场景(0:用户注册;1:申请成为合作伙伴;2:忘记密码;3:个人设置修改绑定手机号 4:绑定手机号)
	 * //用于校验一小时内短信发送次数不能超过配置的最大值
	 */
	@NotBlank(message = "发送短信场景枚举值不能为空")
	private String scene;

}
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_sms_code")
@ApiModel(value="SysSmsCode对象", description="短信验证码表")
public class SysSmsCode {

    private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "手机号码")
	@TableField("phonenum")
	private String phonenum;

	@ApiModelProperty(value = "验证码内容")
	@TableField("code")
	private String code;

	@ApiModelProperty(value = "最后修改时间")
	@TableField("update_time")
	private Date updateTime;

	@ApiModelProperty(value = "创建人id")
	@TableField("creator_id")
	private Long creatorId;

	@ApiModelProperty(value = "更新人id")
	@TableField("update_id")
	private Long updateId;

	@ApiModelProperty(value = "发送短信场景")
	@TableField("scene")
	private String scene;

}
@Override
	public Integer queryCountByPhoneNum(Map<String, Object> paramMap) {

		Date oneHourBefore = DateUtils.addHours(new Date(), -1);
		paramMap.put("oneHourBefore", oneHourBefore);
		int count = shopRegisterMapper.queryCountByPhoneNum(paramMap);

		return count;
	}
public interface RegisterMapper extends BaseMapper<SysSmsCode> {

	Integer queryCountByPhoneNum(Map<String,Object> paramMap);

	Integer queryUserByAccount(@Param("account") String account);

}
   <select id="queryCountByPhoneNum" parameterType="java.util.Map" resultType="java.lang.Integer">
        select count(*) from
        sys_sms_code
        where phonenum =#{phoneNum}
        and create_time between #{oneHourBefore} and now()
        and scene = #{scene}
    </select>

    <select id="queryUserByAccount" parameterType="java.lang.String" resultType="java.lang.Integer">
        select count(*) from user where account=#{account} and is_deleted=0
    </select>
Mapper.java
	User queryUserByPhone(Map<String,Object> paramMap);
	IPage<ShopUserVO> getShopUserList(@Param("req") UserQueryREQ req, @Param("page") Page page);
    <select id="queryUserByPhone" parameterType="java.util.Map" resultType="org.test.entity.User">
        select u.id,u.account,u.phonenum
        from user u join tenant_user_rel tur on u.id = tur.user_id
        where
        u.is_deleted = '0' and
        u.phonenum = #{phoneNum}
        <if test="boundRealPhone != null and boundRealPhone != '' ">
            AND tur.bound_real_phone = #{boundRealPhone}
        </if>
    </select>

 <select id="getShopUserList" resultType="org.test.vo.ShopUserVO">
        SELECT
        t1.id,
        t1.account,
        t1.phonenum,
        t1.supplier_id,
        t1.status,
        t1.update_time,
        t1.create_time,
        t2.supplier_name
        FROM
        `user` t1
        INNER JOIN `shop_supplier` t2 ON t1.`supplier_id` = t2.`id`
        <where>
            t1.is_deleted = '0' AND t1.supplier_id <![CDATA[ <> ]]> 0
            <if test="req.search != null and req.search!='' ">
                AND t1.phonenum LIKE concat('%',#{req.search},'%')
            </if>
            <if test="req.status != null and req.status!= '' ">
                AND t1.status = #{req.status}
            </if>
            <if test="req.supplierName != null and req.supplierName!= '' ">
                AND t2.supplier_name = #{req.supplierName}
            </if>
            <if test="req.startTime != null and req.startTime!=''">
                AND t1.update_time <![CDATA[>=]]> #{req.startTime}
            </if>
            <if test="req.endTime != null and req.endTime!='' ">
                AND t1.update_time <![CDATA[<=]]> #{req.endTime}
            </if>
        </where>
        order by t1.id desc
    </select>

    <insert id="saveTenantUserRelInfo" parameterType="org.test.user.entity.TenantUserRel">
      INSERT INTO tenant_user_rel
      (id,user_id,bound_real_phone,register_type)
      values (
      #{id},
      #{userId},
      #{boundRealPhone},
      #{registerType})
    </insert>

    <update id="updateTenantUserRelInfo" parameterType="java.util.Map" >
        update tenant_user_rel set bound_real_phone = #{boundRealPhone}
        where user_id = #{userId}
    </update>

mybatis-plus 的stream写法

TutorStudent one = this.lambdaQuery().eq(TutorStudent::getId, req.getId()).one();

	@Override
	public List<ShopOrder> getOrderPayList(String param) {
		return this.lambdaQuery()
		.eq(ShopOrder::getOrderStatus, CommonConstant.ORDER_STATUS)
		.eq(ShopOrder::getIsDeleted, CommonConstant.NO)
		.list();
	}


@Override
	public Boolean deleteOrderPayInfo(Long orderId) {
		boolean flag = this.lambdaUpdate()
		.eq(ShopOrder::getId, orderId)
		.set(ShopOrder::getIsDeleted, CommonConstant.YES)
		.update();
		return flag;
	}


  boolean result = this.lambdaUpdate()
  .set(CourseApplication::getApproveStatus, status)
  .eq(CourseApplication::getId, id)
  .update();

	@Override
	public Boolean addBatchTypeAbilityBusiness(List<CommonAttachmentAddREQ> entitys) {
		if(Func.isEmpty(entitys)){
			return false;
		}
		Set<String> ablrIds = entitys.stream().map(CommonAttachmentAddREQ::getBizId).collect(Collectors.toSet());

		this.lambdaUpdate().in(CommonAttachment::getBizId, ablrIds)
			.eq(CommonAttachment::getCreatorId, AuthUtil.getUserId())
			.eq(CommonAttachment::getType, "ability")
			.remove();

		return this.addBatchTypeAbility(entitys);
}


	List<String> userIds = this.lambdaQuery().select(LiveSignUp::getUserId).in(LiveSignUp::getId, signUpIds).list()
			.stream().map(e -> Func.toStr(e.getUserId())).collect(Collectors.toList());
		List<Long> userLongs = userIds.stream().map(Func::toLong).collect(Collectors.toList());

	@Override
	public R<Boolean> updateUserInfoById(String userId) {
		ShopUser user = shopUserService.lambdaQuery().eq(ShopUser::getId, userId).eq(ShopUser::getStatus, CommonConstant.YES).one();
		if (Func.isEmpty(user)) {
			return R.status(false);
		}
		boolean flag = this.lambdaUpdate().eq(ShopSupplier::getId, user.getSupplierId()).set(ShopSupplier::getIsCommissionid, CommonConstant.YES).set(ShopSupplier::getUpdateTime, new Date()).update();
		if (flag) {
			return R.status(true);
		}
		return R.status(false);
	}

导出

controller
	/**
	 * 导出线上必修总览统计
	 */
	@GetMapping("/v1/export")
	@ApiOperation(value = "导出线上必修总览统计", notes = "导出线上必修总览统计")
	public void complusoryOverviewExport(@NotBlank String startTime, @NotBlank String endTime, @NotBlank String exportSignature) throws Exception {
		countCompulsoryService.compulsoryOverviewExport(startTime, endTime, exportSignature);
	}

public interface ICountCompulsoryService {
void compulsoryOverviewExport(String startTime,String endTime,String exportSignature) throws IOException;
}
impl
	@Override
	public void compulsoryOverviewExport(String startTime,String endTime,String exportSignature) throws IOException {
		CountCompulsoryREQ req = new CountCompulsoryREQ ();
		req.setStartTime(startTime);
		req.setEndTime(endTime);
		List<CountCompulsoryOverviewVO> compulsoryOverviewList = countCompulsoryMapper.queryCompulsoryOverviewList(req);
		// 异步处理导出
		AsyncExportStudyPlanOverviewImpl impl = SpringUtil.getBean(AsyncExportStudyPlanOverviewImpl.class);
		impl.exportToRedisRela(startTime, endTime, exportSignature, CountCompulsoryOverviewVO.class, AuthUtil.getTenantId(), compulsoryOverviewList.size(),DataScopeUtil.getParam(DataScopeUtil.getMgmtDeptAncestors(AuthUtil.getUser())));
	}

@Async(CommonConstant.ASYNC_EXECUTOR)
	public <T> CompletableFuture<String> exportToRedis(String startTime, String endTime, String key, Class<T> clz, String tenantId, int count, String mgmtOrgIds) {
		try {
			key = key + ":" + tenantId;
			redisUtils.setExpireTime(key, 60L, TimeUnit.MINUTES);
			if (count < 1) {
				// 说明无数据
				redisUtils.set(key, EXPORT_NO_RESULT);
				return CompletableFuture.completedFuture("");
			} else {
				String fileName = startTime + "-" + endTime + ".xlsx";
				int totalSheet = (int) Math.ceil((double) count / HALF_MILLION);
				ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
				// 这里 指定文件
				try(ExcelWriter excelWriter = EasyExcel.write(byteArrayOutputStream, clz).build()){
					for (int i = 0; i < totalSheet; i++) {
						// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
						WriteSheet writeSheet = EasyExcel.writerSheet(i, "sheet" + i).build();
						// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
						int sheetStart = i * HALF_MILLION;
						List data = exportRealData(startTime, endTime, sheetStart, HALF_MILLION, mgmtOrgIds);
						// 写数据
						excelWriter.write(data, writeSheet);
					}
				}
				// 将输出流转为输入流
				ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
				// 上传至华为OBS 并拿到文件地址
				MultipartFile file = generateMultipartFile(inputStream, fileName);
				R response = client.putFile(file, tenantId);
				String fileUrl = null;
				if (response.isSuccess()) {
					fileUrl = (String) response.getResponse();
					// 存入Redis
					redisUtils.set(key, fileUrl);
					return CompletableFuture.completedFuture("");
				}
				redisUtils.set(key, EXPORT_FAIL);
			}
		} catch (Exception e) {
			redisUtils.set(key, EXPORT_FAIL);
			e.printStackTrace();
		}
		return CompletableFuture.completedFuture("");
	}


	private MultipartFile generateMultipartFile(ByteArrayInputStream inputStream, String fileName) {
		FileItemFactory factory = new DiskFileItemFactory();
		DiskFileItem item = (DiskFileItem) factory.createItem("file", MediaType.APPLICATION_OCTET_STREAM_VALUE, true, fileName);
		try (OutputStream out = item.getOutputStream()) {
			IOUtils.copy(inputStream, out);
			return new CommonsMultipartFile(item);
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

@Override
	public R putFile(MultipartFile file, String tenantId) throws IOException {
		BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream());
		return R.data(bladeFile.getLink());
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/579482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言自定义类型【联合体与枚举】

文章目录 1.联合体1.1联合体的声明1.2联合体的特点1.3联合体的大小计算联合体的使用案例 2.枚举2.1枚举类型的声明2.2枚举类型的优点(为什么使用枚举)2.3枚举类型的使用 结语 1.联合体 1.1联合体的声明 和结构体一样&#xff0c;联合体也是由一个或多个成员构成&#xff0c;同…

如何在 Visual Studio 中通过 NuGet 添加包

在安装之前要先确定Nuget的包源是否有问题。 Visual Studio中怎样更改Nuget程序包源-CSDN博客 1.图形界面安装 打开您的项目&#xff0c;并在解决方案资源管理器中选择您的项目。单击“项目”菜单&#xff0c;然后选择“管理 NuGet 程序包”选项。在“NuGet 包管理器”窗口中…

CTF(web方向)--md5的“===”和“==”的绕过

一、PHP弱类型说明 1.简介 php是一种弱类型语言&#xff0c;对数据的类型要求并不严格&#xff0c;可以让数据类型互相转换。 在php中有两种比较符号: 一种是 &#xff0c;另外一种是 &#xff0c;都是用来比较两个数值是否相等的操作符&#xff0c;但他们也是有区别的: &a…

大数据架构相关知识总结

一、大数据处理系统架构特性 1. 鲁棒性和容错性&#xff1a; 系统必须对游bug的程序写入的错误数据游足够的适应能力 2. 低延迟读取和更新能力 3. 横向扩容&#xff1a; 可以通过增加机器数量来维持性能 4. 通用性&#xff1a; 需要支持绝大多数应用程序 5. 延展性&#xff1a;…

前端工程化Vue使用Node.js设置国内高速npm镜像源(踩坑记录版)

前端工程化Vue使用Node.js设置国内高速npm镜像源&#xff08;踩坑记录版&#xff09; 此篇仅为踩坑记录&#xff0c;并未成功更换高速镜像源&#xff0c;实际解决方法见文末跳转链接。 1.自身源镜像 自身镜像源创建Vue项目下载速度感人 2.更改镜像源 2.1 通过命令行配置 前提…

【工作】程序员工作压力八个常见来源与建议缓解压力小窍门

目录 ​编辑 一. 程序员工作压力八个常见来源与建议 1&#xff09;目标职位不对 2&#xff09;工作任务描述不清晰 3&#xff09;快节奏的工作环境 4&#xff09;项目后期突然被添加新的要求 5&#xff09;计划外的工作事务会打断并破坏注意力 6&#xff09;个人问题 7…

MySQL第一次作业

解压完安装包 以管理员进入命令行 初始化并记住初始随机密码 创建服务名称 启动mysql 使用随机密码登录 修改密码 退出并重登服务器 MySQL创建数据库和表 创建数据库 创建表 1.进入数据库 创建表 向表中插入数据

鸿蒙OpenHarmony【小型系统 编译】(基于Hi3516开发板)

编译 OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式&#xff0c;build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。 使用build.sh脚本编译源码 进入源码根目录&#xff0c;执行如下命令进行版本编译。 ./build.sh --product-name name --ccache 说明&…

[Java EE] 多线程(四):线程安全问题(下)

1.5 volatile关键字 我们在了解这个关键字之前,我们首先要把产生线程安全的第4个原因补齐,我们来说说由于内存可见性引起的线程安全问题. 我们来看下面这样一段代码: import java.util.Scanner;public class Demo16 {public static int count 0;public static void main(Str…

PotatoPie 4.0 实验教程(25) —— FPGA实现摄像头图像直方图均衡变换

图像的直方图均衡是什么&#xff1f; 图像的直方图均衡是一种用于增强图像对比度的图像处理技术。在直方图均衡中&#xff0c;图像的像素值被重新分配&#xff0c;以使得图像的直方图变得更均匀&#xff0c;即各个像素值的分布更加平衡。这意味着直方图中每个像素值的频率大致…

在PR中使用 obs 和 vokoscreen 录制的视频遇到的问题

1. obs 录制的视频 在 Adobe Premiere Pro CS6 中只有音频没有视频 2. vokoscreen 录制的视频&#xff0c;没有声音 这是是和视频录制的编码有关系&#xff0c;也和显卡驱动关系 首先 obs 点击 文件 ---> 设置 录制的视频都是可以正常播放的&#xff0c;在PR不行。更…

python爬虫 - 爬取 json 格式数据(股票行情信息:雪球网,自选股)

文章目录 1. 第一步&#xff1a;安装requests库2. 第二步&#xff1a;获取爬虫所需的header和cookie3. 第三步&#xff1a;获取网页4. 第四步&#xff1a;解析网页5. 第五步&#xff1a;解析 json 结构数据体6. 代码实例以及结果展示 python爬虫五部曲&#xff1a; 第一步&…

字符串变量 字符串常量

仅个人笔记 #include<iostream> using namespace std;int main() {char str[] "2232344434";for (int i 0; i < strlen(str); i){printf("%c", *(stri));}const char* arr "12343545";for (int i 0; i < strlen(arr); i){printf…

HackMyVM-Vulny

目录 信息收集 arp nmap nikto WEB信息收集 主页信息收集 gobuster RCE漏洞 反弹shell 提权 系统信息收集 横向渗透 flock提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC…

mysql-sql-练习题-2-窗口函数

窗口函数 访问量max sum建表窗口函数连接 直播间人数 第1、3名建表排名sum 访问量max sum 每个用户截止到每月为止&#xff0c;最大单月访问次数&#xff0c;累计到该月的总访问次数 建表 create table visit(uid1 varchar(5) comment 用户id,month1 varchar(10) comment 月…

【热门话题】Chrome 插件研发详解:从入门到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Chrome 插件研发详解&#xff1a;从入门到实践一、引言二、Chrome 插件基础概念…

Win32 API 光标隐藏定位和键盘读取等常用函数

Win32 API 光标隐藏定位和键盘读取等常用函数 一、Win32 API二、控制台程序指令modetitlepausecls 三、控制台屏幕上坐标的结构体COORD四、句柄获取函数GetStdHandle五、控制台光标操作1.控制台光标信息结构体CONSOLE_CURSOR_INFO2.得到光标信息函数GetConsoleCursorInfo3. 设置…

Amazon云计算AWS之[5]关系数据库服务RDS

文章目录 RDS的基本原理主从备份和下读写分离 RDS的使用 RDS的基本原理 Amazon RDS(Amazon Relational Database Service) 将MySQL数据库移植到集群中&#xff0c;在一定的范围内解决了关系数据库的可扩展性问题。 MySQL集群方式采用Share-Nothing架构。每台数据库服务器都是…

《架构风清扬-Java面试系列第25讲》聊聊ArrayBlockingQueue的特点及使用场景

ArrayBlockingQueue是BlockingQueue接口的一个实现类之一 这个属于基础性问题&#xff0c;老规矩&#xff0c;我们将从使用场景和代码示例来进行讲解 来&#xff0c;思考片刻&#xff0c;给出你的答案 1&#xff0c;使用场景 实现&#xff1a;基于数组实现的有界阻塞队列&…

TCP/IP协议族中的TCP(二):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 滑动窗口 在前面我们讨论了确认应答策略, 对每一个发送的数据段, 都要给一个ACK确认应答. 收到ACK后再发送下一个数据段.这样…
最新文章