From 44aacaabb89a128d1a47593cf8db5f908fa03fab Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期五, 19 九月 2025 14:17:59 +0800 Subject: [PATCH] 会员列表导出 --- framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java | 208 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 194 insertions(+), 14 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java index 489d7ea..455df7b 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.crypto.SecureUtil; import cn.lili.base.Result; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; @@ -24,44 +25,58 @@ import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.lmk.domain.entity.VideoAccount; +import cn.lili.modules.lmk.domain.form.MemberNickNameForm; +import cn.lili.modules.lmk.domain.form.MemberTagForm; +import cn.lili.modules.lmk.domain.vo.PrizeRecordVO; +import cn.lili.modules.lmk.enums.general.PrizeDistributeStatusEnum; +import cn.lili.modules.lmk.enums.general.PrizeGrantStatusEnums; +import cn.lili.modules.lmk.enums.general.PrizeStatusEnum; +import cn.lili.modules.lmk.service.MemberTagService; import cn.lili.modules.lmk.service.VideoAccountService; import cn.lili.modules.member.aop.annotation.PointLogPoint; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dto.*; import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.entity.enums.QRCodeLoginSessionStatusEnum; -import cn.lili.modules.member.entity.vo.MemberSearchVO; -import cn.lili.modules.member.entity.vo.MemberVO; -import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo; -import cn.lili.modules.member.entity.vo.QRLoginResultVo; +import cn.lili.modules.member.entity.vo.*; import cn.lili.modules.member.mapper.MemberMapper; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.token.MemberTokenGenerate; import cn.lili.modules.member.token.StoreTokenGenerate; +import cn.lili.modules.order.order.entity.dto.PrizeRecordExportDetailDTO; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.enums.StoreStatusEnum; import cn.lili.modules.store.service.StoreService; import cn.lili.mybatis.util.PageUtil; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.MemberTagsEnum; +import cn.lili.utils.COSUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * 浼氬憳鎺ュ彛涓氬姟灞傚疄鐜� @@ -111,6 +126,12 @@ @Autowired private VideoAccountService videoAccountService; + + @Autowired + private MemberTagService memberTagService; + + @Autowired + private COSUtil cosUtil; @Override public Member findByUsername(String userName) { @@ -199,6 +220,7 @@ throw new ServiceException(ResultCode.USER_NOT_EXIST); } //鍒ゆ柇瀵嗙爜鏄惁杈撳叆姝g‘ + if (!new BCryptPasswordEncoder().matches(password, member.getPassword())) { throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); } @@ -244,19 +266,23 @@ @Override @Transactional - public Member autoRegister(ConnectAuthUser authUser) { + public Member autoRegister(ConnectAuthUser authUser,Boolean encryptTwice) { if (CharSequenceUtil.isEmpty(authUser.getNickname())) { authUser.setNickname(CommonUtil.getSpecialStr("鐢ㄦ埛")); } if (CharSequenceUtil.isEmpty(authUser.getAvatar())) { - authUser.setAvatar("https://i.loli.net/2020/11/19/LyN6JF7zZRskdIe.png"); + authUser.setAvatar(""); } try { // String username = UuidUtils.getUUID(); Member member = new Member(authUser.getUsername(), UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(), authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0, authUser.getPhone()); - member.setPassword(DEFAULT_PASSWORD); + if(encryptTwice){ + member.setPassword( new BCryptPasswordEncoder().encode(SecureUtil.md5(DEFAULT_PASSWORD))); + }else { + member.setPassword( new BCryptPasswordEncoder().encode(DEFAULT_PASSWORD)); + } member.setUuId(authUser.getUuid()); // 鍙戦�佷細鍛樻敞鍐屼俊鎭� registerHandler(member); @@ -487,6 +513,7 @@ } @Override + @Transactional public Member updateMember(ManagerMemberEditDTO managerMemberEditDTO) { //杩囨护浼氬憳鏄电О鏁忔劅璇� if (CharSequenceUtil.isNotBlank(managerMemberEditDTO.getNickName())) { @@ -501,14 +528,35 @@ //浼犻�掍慨鏀逛細鍛樹俊鎭� BeanUtil.copyProperties(managerMemberEditDTO, member); this.updateById(member); + if (managerMemberEditDTO.getTags() != null && !CollectionUtils.isEmpty(managerMemberEditDTO.getTags())) { + MemberTagForm memberTagForm = new MemberTagForm(); + memberTagForm.setMemberId(member.getId()); + memberTagForm.setTagIds(managerMemberEditDTO.getTags()); + memberTagForm.setCreateType("MANAGER"); + memberTagService.addMemberTag(memberTagForm); + } return member; } @Override + public Result updateMemberNickName(MemberNickNameForm form) { + Member member = baseMapper.selectById(form.getMemberId()); + boolean update = false; + if ("寰俊鐢ㄦ埛".equals(member.getNickName()) || StringUtils.isBlank(member.getNickName())) { + member.setNickName(form.getNickName()); + update = true; + } + if (update){ + baseMapper.updateById(member); + } + return Result.ok().data(member.getNickName()); + } + + @Override public Result resetPassword(String id) { - String password = "123456"; + String password = "111111"; Member member = this.getById(id); - member.setPassword(new BCryptPasswordEncoder().encode(password)); + member.setPassword(new BCryptPasswordEncoder().encode(SecureUtil.md5(password))); this.updateById(member); return Result.ok("閲嶇疆鎴愬姛"); } @@ -537,7 +585,129 @@ queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled", memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0); queryWrapper.orderByDesc("create_time"); + return this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper); + } + @Override + public IPage<MemberVO> getMemberPageAndTag(MemberSearchVO memberSearchVO, PageVO page) { + QueryWrapper<Member> queryWrapper = Wrappers.query(); + //鐢ㄦ埛鍚嶆煡璇� + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername()); + //鐢ㄦ埛鍚嶆煡璇� + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getNickName()), "nick_name", memberSearchVO.getNickName()); + //鎸夌収鐢佃瘽鍙风爜鏌ヨ + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile()); + //鎸夌収浼氬憳鐘舵�佹煡璇� + queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled", + memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0); + queryWrapper.orderByDesc("create_time"); + if (CollectionUtils.isNotEmpty(memberSearchVO.getTagIds())) { + // 浣跨敤inSql鏂规硶杩涜瀹夊叏鐨勫瓙鏌ヨ + String tagIdsStr = memberSearchVO.getTagIds().stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + queryWrapper.inSql("id", + "SELECT DISTINCT member_id FROM lmk_member_tag WHERE tag_id IN (" + + tagIdsStr + ")"); + + return this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper); + } + return this.baseMapper.pageByMemberVO(PageUtil.initPage(page),queryWrapper); + } + + @Override + public void exportMember(MemberSearchVO memberSearchVO) { + HttpServletResponse response = ThreadContextHolder.getHttpResponse(); + QueryWrapper<Member> queryWrapper = Wrappers.query(); + //鐢ㄦ埛鍚嶆煡璇� + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername()); + //鐢ㄦ埛鍚嶆煡璇� + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getNickName()), "nick_name", memberSearchVO.getNickName()); + //鎸夌収鐢佃瘽鍙风爜鏌ヨ + queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile()); + //鎸夌収浼氬憳鐘舵�佹煡璇� + queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled", + memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0); + queryWrapper.orderByDesc("create_time"); + if (CollectionUtils.isNotEmpty(memberSearchVO.getTagIds())) { + // 浣跨敤inSql鏂规硶杩涜瀹夊叏鐨勫瓙鏌ヨ + String tagIdsStr = memberSearchVO.getTagIds().stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + queryWrapper.inSql("id", + "SELECT DISTINCT member_id FROM lmk_member_tag WHERE tag_id IN (" + + tagIdsStr + ")"); + } + List<MemberVO> memberVOS = this.baseMapper.exportMember(queryWrapper); + XSSFWorkbook workbook = initExportMember(memberVOS); + try { + // 璁剧疆鍝嶅簲澶� + String fileName = URLEncoder.encode("浼氬憳鍒楄〃", "UTF-8"); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); + + ServletOutputStream out = response.getOutputStream(); + workbook.write(out); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + workbook.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + } + public XSSFWorkbook initExportMember(List<MemberVO> list){ + List<MemberExportVO> exportDetailDTOS = new ArrayList<>(); + for (MemberVO vo : list){ + MemberExportVO detailDtO = new MemberExportVO(); + BeanUtils.copyProperties(vo,detailDtO); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 灏咲ate绫诲瀷杞崲涓烘寚瀹氭牸寮忕殑瀛楃涓� + Date createTime = vo.getCreateTime(); + if (createTime != null) { + String createTimeStr = sdf.format(createTime); + detailDtO.setCreateTime(createTimeStr); + }else { + detailDtO.setCreateTime(""); + } + Date lastLoginDate1 = vo.getLastLoginDate(); + if (lastLoginDate1 != null) { + String lastLoginDate = sdf.format(lastLoginDate1); + detailDtO.setLastLoginDate(lastLoginDate); + }else { + detailDtO.setLastLoginDate(""); + } + // 璁剧疆鍒癉TO涓� + exportDetailDTOS.add(detailDtO); + } + XSSFWorkbook workbook = new XSSFWorkbook(); + + Sheet sheet = workbook.createSheet("浼氬憳鍒楄〃"); + // 鍒涘缓琛ㄥご + Row header = sheet.createRow(0); + String[] headers = { + "浼氬憳鍚嶇О", "浼氬憳鏄电О","鑱旂郴鏂瑰紡", + "娉ㄥ唽鏃堕棿","鏈�鍚庣櫥褰曟椂闂�" + }; + for(int i= 0 ;i< headers.length;i++){ + Cell cell = header.createCell(i); + cell.setCellValue(headers[i]); + } + for (int i=0;i< exportDetailDTOS.size();i++){ + MemberExportVO dto = exportDetailDTOS.get(i); + Row row = sheet.createRow(i+1); + row.createCell(0).setCellValue(dto.getUsername()); + row.createCell(1).setCellValue(dto.getNickName()); + row.createCell(2).setCellValue(dto.getMobile()); + row.createCell(3).setCellValue(dto.getCreateTime()); + row.createCell(4).setCellValue(dto.getLastLoginDate()); + } + + return workbook; + } @Override @@ -786,7 +956,13 @@ @Override public MemberVO getMember(String id) { - return new MemberVO(this.getById(id)); + MemberVO member = baseMapper.getVoById(id); + if (Objects.nonNull(member)) { + if(StringUtils.isNotBlank(member.getFace()) && !member.getFace().contains("https")){ + member.setFace(cosUtil.getPreviewUrl(member.getFace())); + } + } + return member; } @Override @@ -884,4 +1060,8 @@ } } + public static void main(String[] args) { + System.err.println(SecureUtil.md5("111111")); + } + } -- Gitblit v1.8.0