diff --git a/bs-admin/src/main/java/com/bs/cm/domain/CmAttach.java b/bs-admin/src/main/java/com/bs/cm/domain/CmAttach.java index f600da3..06508b0 100644 --- a/bs-admin/src/main/java/com/bs/cm/domain/CmAttach.java +++ b/bs-admin/src/main/java/com/bs/cm/domain/CmAttach.java @@ -25,7 +25,7 @@ public class CmAttach extends BaseEntity{ /** 用户id */ @TableId(value = "id",type = IdType.AUTO) - @ApiModelProperty(value = "用户id") + @ApiModelProperty(value = "id") private Long id; /** 文件组id */ diff --git a/bs-admin/src/main/java/com/bs/df/controller/DfBizClueController.java b/bs-admin/src/main/java/com/bs/df/controller/DfBizClueController.java index fe317d2..09c8f1e 100644 --- a/bs-admin/src/main/java/com/bs/df/controller/DfBizClueController.java +++ b/bs-admin/src/main/java/com/bs/df/controller/DfBizClueController.java @@ -1,9 +1,16 @@ package com.bs.df.controller; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; +import com.alibaba.fastjson2.JSONObject; +import com.bs.common.annotation.Anonymous; +import com.bs.common.constant.Constants; import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.ServletUtils; +import com.bs.df.mapper.DfBizClueMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; @@ -40,6 +47,8 @@ import javax.annotation.Resource; public class DfBizClueController extends BaseController { @Resource private IDfBizClueService dfBizClueService; + @Resource + private DfBizClueMapper dfBizClueMapper; /** * 分页查询业务线索列表 @@ -54,6 +63,51 @@ public class DfBizClueController extends BaseController { return getDataTable(list); } + + + /** + * 分页查询业务线索数量列表 + */ + @ApiOperation("分页查询业务线索数量列表") + @GetMapping("/getVisitsNum") + public TableDataInfo getVisitsNum(DfBizClue dfBizClue) { +// startPage(); + Integer pageNum = ServletUtils.getParameterToInt(Constants.PAGE_NUM); + Integer pageSize = ServletUtils.getParameterToInt(Constants.PAGE_SIZE); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); +// condition(queryWrapper,dfBizClue); + List list = dfBizClueService.list(queryWrapper); + Map visitsNum = new HashMap<>(); + for (DfBizClue clue : list) { + String key = clue.getUserId() + "_" + clue.getDataType(); + int count = visitsNum.getOrDefault(key, 0) + 1; + visitsNum.put(key, count); + clue.setVisitsNum(count); + } + Map latestClues = new HashMap<>(); + for (DfBizClue clue : list) { + String key = clue.getUserId() + "_" + clue.getDataType(); + if (!latestClues.containsKey(key) || clue.getBrowseTime().after(latestClues.get(key).getBrowseTime())) { + latestClues.put(key, clue); + } + } + List newList = new ArrayList<>(latestClues.values()); + for (DfBizClue clue : newList) { + String key = clue.getUserId() + "_" + clue.getDataType(); + int visits = visitsNum.getOrDefault(key, 0); + clue.setVisitsNum(visits); + } + Integer start = (pageNum - 1) * pageSize; + List result = newList.stream() + .skip(start) + .limit(pageSize) + .collect(Collectors.toList()); + TableDataInfo data = getDataTable(result); + data.setTotal(newList.size()); + return data; +// return getDataTable(newList); + } + /** * 查询业务线索列表 */ @@ -66,6 +120,41 @@ public class DfBizClueController extends BaseController { return success(list); } + /** + * 查询业务线索列表 + */ + @ApiOperation("查询业务线索列表") + @GetMapping("/listByClassify") + @Anonymous + public AjaxResult listByClassify(DfBizClue dfBizClue) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + if ("0".equals(dfBizClue.getClassify())) { + queryWrapper.in(DfBizClue::getDataType, "0", "3"); + } else if ("1".equals(dfBizClue.getClassify())) { + queryWrapper.in(DfBizClue::getDataType, "2", "4"); + } else if ("2".equals(dfBizClue.getClassify())) { + queryWrapper.in(DfBizClue::getDataType, "1"); + } + List list = dfBizClueService.list(queryWrapper); + List uniqueList = list.stream() + .collect(Collectors.toMap( + DfBizClue::getUserId, // 指定键的抽取函数 + dfBizClueVo -> dfBizClueVo, // 指定值的映射函数 + (existing, replacement) -> existing // 处理重复键的方式,这里选择保留第一个出现的元素 + )) + .values() + .stream() + .collect(Collectors.toList()); + List avatarLinks = uniqueList.stream() + .map(DfBizClue::getAvatarLink) // 获取每个对象的 avatarLink + .limit(5) // 限制最多只取前 5 个 + .collect(Collectors.toList()); + DfBizClue dfBizClueByNum = new DfBizClue(); + dfBizClueByNum.setAvatarLinks(avatarLinks); + dfBizClueByNum.setUserNum(uniqueList.size()); + return success(dfBizClueByNum); + } + /** * 导出业务线索列表 */ @@ -99,6 +188,22 @@ public class DfBizClueController extends BaseController { return toAjax(dfBizClueService.save(dfBizClue)); } + /** + * 新增业务线索 + * + */ + @ApiOperation("新增业务线索") + @Log(title = "业务线索新增", businessType = BusinessType.INSERT) + @PostMapping("/addVisitor") + @Anonymous + public AjaxResult addVisitor(DfBizClue dfBizClue) { + Date date = new Date(); + dfBizClue.setCreateTimeVo(date); + dfBizClue.setTenantId(SecurityUtils.getTenantId()); + return toAjax(dfBizClueMapper.insertClue(dfBizClue)); + } + + /** * 修改业务线索 */ @@ -150,6 +255,17 @@ public class DfBizClueController extends BaseController { queryWrapper.like(DfBizClue::getNickName,dfBizClue.getNickName()); } + //头像链接 + if(Validator.isNotEmpty(dfBizClue.getAvatarLink())){ + queryWrapper.eq(DfBizClue::getAvatarLink,dfBizClue.getAvatarLink()); + } + + //手机号 + if(Validator.isNotEmpty(dfBizClue.getPhone())){ + queryWrapper.eq(DfBizClue::getPhone,dfBizClue.getPhone()); + } + + //浏览时间 if(Validator.isNotEmpty(dfBizClue.getBrowseTime())){ queryWrapper.eq(DfBizClue::getBrowseTime,dfBizClue.getBrowseTime()); @@ -200,8 +316,8 @@ public class DfBizClueController extends BaseController { } //${column.columnComment} - if(Validator.isNotEmpty(dfBizClue.get业务链接())){ - queryWrapper.eq(DfBizClue::get业务链接,dfBizClue.get业务链接()); + if(Validator.isNotEmpty(dfBizClue.getBusinessLinks())){ + queryWrapper.eq(DfBizClue::getBusinessLinks,dfBizClue.getBusinessLinks()); } } diff --git a/bs-admin/src/main/java/com/bs/df/controller/DfOrderController.java b/bs-admin/src/main/java/com/bs/df/controller/DfOrderController.java index d6ecc0b..67d5dda 100644 --- a/bs-admin/src/main/java/com/bs/df/controller/DfOrderController.java +++ b/bs-admin/src/main/java/com/bs/df/controller/DfOrderController.java @@ -1,18 +1,24 @@ package com.bs.df.controller; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; +import com.bs.common.annotation.Anonymous; import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.utils.SecurityUtils; +import com.bs.df.domain.DfBizClue; import com.bs.df.domain.DfBroker; +import com.bs.df.mapper.DfOrderMapper; import com.bs.df.service.IDfBrokerService; import com.bs.system.service.ISysUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -47,9 +53,10 @@ public class DfOrderController extends BaseController { private IDfOrderService dfOrderService; @Resource private IDfBrokerService dfBrokerService; - @Resource private ISysUserService userService; + @Resource + private DfOrderMapper dfOrderMapper; /** * 分页查询客户订单列表 @@ -66,17 +73,23 @@ public class DfOrderController extends BaseController { // 将用户列表转换为 Map,以 userId 为键,userName 为值 Map userIdToNameMap = userList.stream() .collect(Collectors.toMap(SysUser::getUserId, SysUser::getUserName)); + Map userIdToPhoneMap = userList.stream() + .collect(Collectors.toMap(SysUser::getUserId, SysUser::getPhonenumber)); Map brokerToNameMap = brokerList.stream() .collect(Collectors.toMap(DfBroker::getId, DfBroker::getBrokerName)); list.forEach(order -> { String userName = userIdToNameMap.get(order.getUserId()); String brokerName = brokerToNameMap.get(order.getBrokerId()); - if (userName != null) { + String phone = userIdToPhoneMap.get(order.getUserId()); + if (null != userName) { order.setUserName(userName); } - if (brokerName != null) { + if (null != brokerName) { order.setBrokerName(brokerName); } + if (null != phone) { + order.setPhone(phone); + } }); return getDataTable(list); } @@ -150,13 +163,30 @@ public class DfOrderController extends BaseController { /** * 新增客户订单 */ - @ApiOperation("新增客户订单") - @Log(title = "客户订单新增", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody DfOrder dfOrder) { return toAjax(dfOrderService.save(dfOrder)); } + + /** + * 新增客户订单 + * + */ + @ApiOperation("新增客户订单") + @Log(title = "新增客户订单", businessType = BusinessType.INSERT) + @PostMapping("/visitorAdd") + @Anonymous + public AjaxResult visitorAdd(DfOrder dfOrder) { + Date date = new Date(); + dfOrder.setCreateTimeVo(date); + SecurityUtils.getTenantId(); + dfOrder.setTenantId(SecurityUtils.getTenantId()); + dfOrder.setCreateBy(SecurityUtils.getUserId()); + dfOrder.setCreateDept(SecurityUtils.getDeptId()); + return toAjax(dfOrderMapper.insertOrder(dfOrder)); + } + /** * 修改客户订单 */ diff --git a/bs-admin/src/main/java/com/bs/df/controller/DfProductArticleController.java b/bs-admin/src/main/java/com/bs/df/controller/DfProductArticleController.java index d4f0884..f33af00 100644 --- a/bs-admin/src/main/java/com/bs/df/controller/DfProductArticleController.java +++ b/bs-admin/src/main/java/com/bs/df/controller/DfProductArticleController.java @@ -2,8 +2,14 @@ package com.bs.df.controller; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; +import com.bs.cm.domain.CmAttach; +import com.bs.cm.service.ICmAttachService; +import com.bs.common.annotation.Anonymous; +import com.bs.df.domain.DfProductMoment; import com.bs.df.domain.DfProductPoster; import com.bs.df.utils.HtmlUtils; import io.swagger.annotations.Api; @@ -42,6 +48,8 @@ import javax.annotation.Resource; public class DfProductArticleController extends BaseController { @Resource private IDfProductArticleService dfProductArticleService; + @Resource + private ICmAttachService cmAttachService; /** * 分页查询产品文章列表 @@ -56,6 +64,18 @@ public class DfProductArticleController extends BaseController { for (DfProductArticle article : list) { article.setArticleContent(HtmlUtils.stripHtmlTags(article.getArticleContent())); } + List attachVo = cmAttachService.list(); + Map> attachMap = attachVo.stream() + .filter(cmAttach -> cmAttach.getFileId() != null) + .collect(Collectors.groupingBy(CmAttach::getFileId)); + for (DfProductArticle article : list) { + article.setArticleContent(HtmlUtils.stripHtmlTags(article.getArticleContent())); + String id = article.getId(); + List matchingAttachments = attachMap.get(String.valueOf(id)); + if (matchingAttachments != null) { + article.setFiles(matchingAttachments); + } + } return getDataTable(list); } @@ -94,8 +114,12 @@ public class DfProductArticleController extends BaseController { */ @ApiOperation("获取产品文章详细信息") @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") Long id) { - return success(dfProductArticleService.getById(id)); + @Anonymous + public AjaxResult getInfo(@PathVariable("id") String id) { + DfProductArticle byId = dfProductArticleService.getById(id); + List attachVo = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId, id)); + byId.setFiles(attachVo); + return success(byId); } /** @@ -125,10 +149,10 @@ public class DfProductArticleController extends BaseController { @Log(title = "修改产品文章状态", businessType = BusinessType.DELETE) @PutMapping("/changeStatus") public AjaxResult changeStatus(@RequestBody DfProductArticle dfProductArticle) { - Long[] ids = dfProductArticle.getIds(); + String[] ids = dfProductArticle.getIds(); String status = dfProductArticle.getStatus(); List dfProductArticles = new ArrayList<>(); - for (Long id : ids) { + for (String id : ids) { DfProductArticle dfProductArticlerNew = new DfProductArticle(); dfProductArticlerNew.setId(id); dfProductArticlerNew.setStatus(status); @@ -144,7 +168,7 @@ public class DfProductArticleController extends BaseController { @ApiOperation("删除产品文章") @Log(title = "产品文章删除", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable List ids) { + public AjaxResult remove(@PathVariable List ids) { return toAjax(dfProductArticleService.removeBatchByIds(ids)); } diff --git a/bs-admin/src/main/java/com/bs/df/controller/DfProductInfoController.java b/bs-admin/src/main/java/com/bs/df/controller/DfProductInfoController.java index 3b193b5..acb1f2d 100644 --- a/bs-admin/src/main/java/com/bs/df/controller/DfProductInfoController.java +++ b/bs-admin/src/main/java/com/bs/df/controller/DfProductInfoController.java @@ -4,13 +4,10 @@ import java.util.*; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; +import com.bs.common.annotation.Anonymous; import com.bs.common.core.domain.entity.SysUser; -import com.bs.df.domain.DfBroker; -import com.bs.df.domain.DfBrokerProduct; -import com.bs.df.domain.DfProductPoster; -import com.bs.df.service.IDfBrokerProductService; -import com.bs.df.service.IDfBrokerService; -import com.bs.df.service.IDfProductPosterService; +import com.bs.df.domain.*; +import com.bs.df.service.*; import com.bs.df.utils.HtmlUtils; import com.bs.system.domain.DfArea; import com.bs.system.service.IDfAreaService; @@ -34,8 +31,7 @@ import com.bs.common.enums.BusinessType; import com.bs.common.utils.poi.ExcelUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import cn.hutool.core.lang.Validator; -import com.bs.df.domain.DfProductInfo; -import com.bs.df.service.IDfProductInfoService; + import javax.annotation.Resource; /** @@ -58,6 +54,8 @@ public class DfProductInfoController extends BaseController { private IDfBrokerProductService dfBrokerProductService; @Resource private IDfBrokerService dfBrokerService; + @Resource + private IDfOrderService dfOrderService; @@ -75,6 +73,25 @@ public class DfProductInfoController extends BaseController { } condition(queryWrapper,dfProductInfo); List list = dfProductInfoService.list(queryWrapper); + List dfOrders = dfOrderService.list(); + Map productOrderCounts = new HashMap<>(); + // 计算申请人数 + for (DfOrder order : dfOrders) { + if (!productOrderCounts.containsKey(order.getProductId())) { + productOrderCounts.put(order.getProductId(), 1); + } else { + productOrderCounts.put(order.getProductId(), productOrderCounts.get(order.getProductId()) + 1); + } + } + for (DfProductInfo productInfo : list) { + Long productId = productInfo.getId(); + if (productOrderCounts.containsKey(productId)) { + productInfo.setApplicantNum(Long.valueOf(productOrderCounts.get(productId))); + } else { + productInfo.setApplicantNum(0L); + } + } + //城市名称 Map cityMap = new HashMap<>(); List allCities = dfAreaService.list(); for (DfArea city : allCities) { @@ -100,12 +117,14 @@ public class DfProductInfoController extends BaseController { productInfo.setInterestRate(productInfo.getInterestRateBegin() + "%-" + productInfo.getInterestRateEnd() + "%"); productInfo.setProductIntro(HtmlUtils.stripHtmlTags(productInfo.getProductIntro())); productInfo.setProductDetail(HtmlUtils.stripHtmlTags(productInfo.getProductDetail())); - String businessCity = productInfo.getBusinessCity(); // 获取原始的城市ID字符串 + // 获取原始的城市ID字符串 + String businessCity = productInfo.getBusinessCity(); if (Validator.isNotEmpty(businessCity)) { String[] cityIds = businessCity.split(","); StringBuilder translatedCities = new StringBuilder(); for (String cityId : cityIds) { - String cityName = cityMap.get(cityId); // 从 Map 中获取城市名称 + // 从 Map 中获取城市名称 + String cityName = cityMap.get(cityId); if (cityName != null) { translatedCities.append(cityName).append(","); } @@ -198,6 +217,7 @@ public class DfProductInfoController extends BaseController { */ @ApiOperation("获取产品信息详细信息") @GetMapping(value = "/{id}") + @Anonymous public AjaxResult getInfo(@PathVariable("id") Long id) { DfProductInfo byId = dfProductInfoService.getById(id); List list = dfBrokerProductService.list(new LambdaQueryWrapper().eq(DfBrokerProduct::getProductId, id)); @@ -223,6 +243,7 @@ public class DfProductInfoController extends BaseController { @ApiOperation("新增产品信息") @Log(title = "产品信息新增", businessType = BusinessType.INSERT) @PostMapping + @Anonymous public AjaxResult add(@RequestBody DfProductInfo dfProductInfo) { return toAjax(dfProductInfoService.save(dfProductInfo)); } diff --git a/bs-admin/src/main/java/com/bs/df/controller/DfProductMomentController.java b/bs-admin/src/main/java/com/bs/df/controller/DfProductMomentController.java index 2f65022..97e1218 100644 --- a/bs-admin/src/main/java/com/bs/df/controller/DfProductMomentController.java +++ b/bs-admin/src/main/java/com/bs/df/controller/DfProductMomentController.java @@ -2,9 +2,14 @@ package com.bs.df.controller; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; +import com.bs.cm.domain.CmAttach; +import com.bs.cm.service.ICmAttachService; import com.bs.df.domain.DfProductArticle; +import com.bs.df.domain.DfProductPoster; import com.bs.df.utils.HtmlUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -42,6 +47,8 @@ import javax.annotation.Resource; public class DfProductMomentController extends BaseController { @Resource private IDfProductMomentService dfProductMomentService; + @Resource + private ICmAttachService cmAttachService; /** * 分页查询产品朋友圈列表 @@ -53,8 +60,17 @@ public class DfProductMomentController extends BaseController { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); condition(queryWrapper,dfProductMoment); List list = dfProductMomentService.list(queryWrapper); + List attachVo = cmAttachService.list(); + Map> attachMap = attachVo.stream() + .filter(cmAttach -> cmAttach.getFileId() != null) + .collect(Collectors.groupingBy(CmAttach::getFileId)); for (DfProductMoment moment : list) { moment.setMomentContent(HtmlUtils.stripHtmlTags(moment.getMomentContent())); + String id = moment.getId(); + List matchingAttachments = attachMap.get(String.valueOf(id)); + if (matchingAttachments != null) { + moment.setFiles(matchingAttachments); + } } return getDataTable(list); } @@ -93,8 +109,11 @@ public class DfProductMomentController extends BaseController { */ @ApiOperation("获取产品朋友圈详细信息") @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") Long id) { - return success(dfProductMomentService.getById(id)); + public AjaxResult getInfo(@PathVariable("id") String id) { + DfProductMoment byId = dfProductMomentService.getById(id); + List attachVo = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId, id)); + byId.setFiles(attachVo); + return success(byId); } /** @@ -124,10 +143,10 @@ public class DfProductMomentController extends BaseController { @Log(title = "修改产品朋友圈状态", businessType = BusinessType.DELETE) @PutMapping("/changeStatus") public AjaxResult changeStatus(@RequestBody DfProductMoment dfProductMoment) { - Long[] ids = dfProductMoment.getIds(); + String[] ids = dfProductMoment.getIds(); String status = dfProductMoment.getStatus(); List dfProductMoments = new ArrayList<>(); - for (Long id : ids) { + for (String id : ids) { DfProductMoment dfProductMomentNew = new DfProductMoment(); dfProductMomentNew.setId(id); dfProductMomentNew.setStatus(status); @@ -142,7 +161,7 @@ public class DfProductMomentController extends BaseController { @ApiOperation("删除产品朋友圈") @Log(title = "产品朋友圈删除", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable List ids) { + public AjaxResult remove(@PathVariable List ids) { return toAjax(dfProductMomentService.removeBatchByIds(ids)); } diff --git a/bs-admin/src/main/java/com/bs/df/controller/DfProductPosterController.java b/bs-admin/src/main/java/com/bs/df/controller/DfProductPosterController.java index 8e0e098..10c2fa2 100644 --- a/bs-admin/src/main/java/com/bs/df/controller/DfProductPosterController.java +++ b/bs-admin/src/main/java/com/bs/df/controller/DfProductPosterController.java @@ -3,9 +3,12 @@ package com.bs.df.controller; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; +import com.bs.cm.domain.CmAttach; +import com.bs.cm.service.ICmAttachService; import com.bs.df.domain.DfProductInfo; import com.bs.df.service.IDfProductInfoService; import com.github.yulichang.wrapper.MPJLambdaWrapper; @@ -47,7 +50,8 @@ public class DfProductPosterController extends BaseController { private IDfProductPosterService dfProductPosterService; @Resource private IDfProductInfoService dfProductInfoService; - + @Autowired + private ICmAttachService cmAttachService; /** * 分页查询产品海报列表 */ @@ -62,6 +66,17 @@ public class DfProductPosterController extends BaseController { .leftJoin(DfProductInfo.class,DfProductInfo::getId,DfProductPoster::getProductId); conditionByMPJ(queryWrapper,dfProductPoster); List list = dfProductPosterService.list(queryWrapper); + List attachVo = cmAttachService.list(); + Map> attachMap = attachVo.stream() + .filter(cmAttach -> cmAttach.getFileId() != null) + .collect(Collectors.groupingBy(CmAttach::getFileId)); + for (DfProductPoster dfProductPosterVo : list) { + String id = dfProductPosterVo.getId(); + List matchingAttachments = attachMap.get(String.valueOf(id)); + if (matchingAttachments != null) { + dfProductPosterVo.setFiles(matchingAttachments); + } + } return getDataTable(list); } @@ -100,8 +115,11 @@ public class DfProductPosterController extends BaseController { */ @ApiOperation("获取产品海报详细信息") @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") Long id) { - return success(dfProductPosterService.getById(id)); + public AjaxResult getInfo(@PathVariable("id") String id) { + DfProductPoster byId = dfProductPosterService.getById(id); + List attachVo = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId, id)); + byId.setFiles(attachVo); + return success(byId); } /** @@ -131,10 +149,10 @@ public class DfProductPosterController extends BaseController { @Log(title = "修改产品海报状态", businessType = BusinessType.DELETE) @PutMapping("/changeStatus") public AjaxResult changeStatus(@RequestBody DfProductPoster dfProductPoster) { - Long[] ids = dfProductPoster.getIds(); + String[] ids = dfProductPoster.getIds(); String status = dfProductPoster.getStatus(); List dfProductPosters = new ArrayList<>(); - for (Long id : ids) { + for (String id : ids) { DfProductPoster dfProductPosterNew = new DfProductPoster(); dfProductPosterNew.setId(id); dfProductPosterNew.setStatus(status); @@ -149,7 +167,7 @@ public class DfProductPosterController extends BaseController { @ApiOperation("删除产品海报") @Log(title = "产品海报删除", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable List ids) { + public AjaxResult remove(@PathVariable List ids) { return toAjax(dfProductPosterService.removeBatchByIds(ids)); } diff --git a/bs-admin/src/main/java/com/bs/df/domain/DfBizClue.java b/bs-admin/src/main/java/com/bs/df/domain/DfBizClue.java index b1f4b19..c2a0539 100644 --- a/bs-admin/src/main/java/com/bs/df/domain/DfBizClue.java +++ b/bs-admin/src/main/java/com/bs/df/domain/DfBizClue.java @@ -1,6 +1,8 @@ package com.bs.df.domain; import java.util.Date; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonFormat; import com.bs.common.annotation.Excel; import com.bs.common.core.domain.BaseEntity; @@ -33,7 +35,7 @@ public class DfBizClue extends BaseEntity{ /** 数据类型0客户1经纪 */ - @Excel(name = "数据类型0客户1经纪") + @Excel(name = "数据类型") @ApiModelProperty(value = "数据类型0客户1经纪") private String dataType; @@ -49,6 +51,19 @@ public class DfBizClue extends BaseEntity{ @ApiModelProperty(value = "用户id") private Long userId; + /** 用户的唯一标识 */ + + @ApiModelProperty(value = "用户的唯一标识") + private String openId; + + /** 公众号绑定id */ + + @ApiModelProperty(value = "公众号绑定id") + private String unionId; + + @ApiModelProperty(value = "平台来源") + private String fromType; + /** 用户昵称 */ @Excel(name = "用户昵称") @@ -62,13 +77,48 @@ public class DfBizClue extends BaseEntity{ @ApiModelProperty(value = "浏览时间") private Date browseTime; - /** $column.columnComment */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") - @ApiModelProperty(value = "${column.columnComment}") - private String 业务链接; + @Excel(name = "业务链接") + @ApiModelProperty(value = "业务链接") + private String businessLinks; + + @Excel(name = "头像链接") + @ApiModelProperty(value = "头像链接") + private String avatarLink; + + @Excel(name = "手机号") + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiModelProperty(value = "分享用户") + private String shareUser; + + /** 访问数量 */ + + @TableField(exist = false) + private Integer visitsNum; + + /** 客户数量 */ + + @TableField(exist = false) + private Integer userNum; + + + @TableField(exist = false) + private List avatarLinks; + + + /** + * 0产品、1名片、2文章 + * + * */ + @TableField(exist = false) + private String classify; + @TableField(exist = false) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ) + private Date createTimeVo; } diff --git a/bs-admin/src/main/java/com/bs/df/domain/DfOrder.java b/bs-admin/src/main/java/com/bs/df/domain/DfOrder.java index 143fdbb..6af02bd 100644 --- a/bs-admin/src/main/java/com/bs/df/domain/DfOrder.java +++ b/bs-admin/src/main/java/com/bs/df/domain/DfOrder.java @@ -43,6 +43,9 @@ public class DfOrder extends BaseEntity{ @ApiModelProperty(value = "客户id") private Long userId; +// @ApiModelProperty(value = "访客id") +// private Long openId; + /** 客户id */ @Excel(name = "客户") @@ -132,6 +135,32 @@ public class DfOrder extends BaseEntity{ @ApiModelProperty(value = "备注") private String remark; + @ApiModelProperty(value = "分享用户") + private String shareUser; + + /** 用户的唯一标识 */ + + @ApiModelProperty(value = "用户的唯一标识") + private String openId; + + /** 公众号绑定id */ + + @ApiModelProperty(value = "公众号绑定id") + private String unionId; + + @ApiModelProperty(value = "平台来源") + private String fromType; + + @TableField(exist = false) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ) + private Date createTimeVo; + + + @Excel(name = "联系方式") + @TableField(exist = false) + private String phone; + + @JsonFormat(pattern = "yyyy-MM-dd") @TableField(exist = false) private Date submitTimeBegin; diff --git a/bs-admin/src/main/java/com/bs/df/domain/DfProductArticle.java b/bs-admin/src/main/java/com/bs/df/domain/DfProductArticle.java index b5c9a07..b43a33e 100644 --- a/bs-admin/src/main/java/com/bs/df/domain/DfProductArticle.java +++ b/bs-admin/src/main/java/com/bs/df/domain/DfProductArticle.java @@ -1,6 +1,9 @@ package com.bs.df.domain; import java.util.Date; +import java.util.List; + +import com.bs.cm.domain.CmAttach; import com.fasterxml.jackson.annotation.JsonFormat; import com.bs.common.annotation.Excel; import com.bs.common.core.domain.BaseEntity; @@ -27,9 +30,9 @@ public class DfProductArticle extends BaseEntity{ private static final long serialVersionUID = 1L; /** 文章id */ - @TableId(value = "id",type = IdType.AUTO) + @TableId(value = "id",type = IdType.ASSIGN_UUID) @ApiModelProperty(value = "文章id") - private Long id; + private String id; /** 文章分类0产品文章1经纪文章 */ @@ -81,7 +84,9 @@ public class DfProductArticle extends BaseEntity{ private String publishTimeEnd; @TableField(exist = false) - private Long[] ids; + private String[] ids; + @TableField(exist = false) + private List files; } diff --git a/bs-admin/src/main/java/com/bs/df/domain/DfProductInfo.java b/bs-admin/src/main/java/com/bs/df/domain/DfProductInfo.java index 39a5e1f..bff69d9 100644 --- a/bs-admin/src/main/java/com/bs/df/domain/DfProductInfo.java +++ b/bs-admin/src/main/java/com/bs/df/domain/DfProductInfo.java @@ -159,6 +159,10 @@ public class DfProductInfo extends BaseEntity{ @TableField(exist = false) private String brokerIds; + //申请人数 + @TableField(exist = false) + private Long applicantNum; + @TableField(exist = false) private Long brokerId; diff --git a/bs-admin/src/main/java/com/bs/df/domain/DfProductMoment.java b/bs-admin/src/main/java/com/bs/df/domain/DfProductMoment.java index da6af71..c7d9ced 100644 --- a/bs-admin/src/main/java/com/bs/df/domain/DfProductMoment.java +++ b/bs-admin/src/main/java/com/bs/df/domain/DfProductMoment.java @@ -1,5 +1,6 @@ package com.bs.df.domain; +import com.bs.cm.domain.CmAttach; import com.bs.common.annotation.Excel; import com.bs.common.core.domain.BaseEntity; import lombok.Data; @@ -11,6 +12,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; +import java.util.List; + /** * 产品朋友圈对象 df_product_moment * @@ -25,9 +28,9 @@ public class DfProductMoment extends BaseEntity{ private static final long serialVersionUID = 1L; /** 朋友圈id */ - @TableId(value = "id",type = IdType.AUTO) + @TableId(value = "id",type = IdType.ASSIGN_UUID) @ApiModelProperty(value = "朋友圈id") - private Long id; + private String id; /** 朋友圈分类0产品朋友圈1经纪朋友圈 */ @@ -66,7 +69,10 @@ public class DfProductMoment extends BaseEntity{ private String remark; @TableField(exist = false) - private Long[] ids; + private String[] ids; + + @TableField(exist = false) + private List files; } diff --git a/bs-admin/src/main/java/com/bs/df/domain/DfProductPoster.java b/bs-admin/src/main/java/com/bs/df/domain/DfProductPoster.java index 2dd7730..d0c72f0 100644 --- a/bs-admin/src/main/java/com/bs/df/domain/DfProductPoster.java +++ b/bs-admin/src/main/java/com/bs/df/domain/DfProductPoster.java @@ -1,5 +1,6 @@ package com.bs.df.domain; +import com.bs.cm.domain.CmAttach; import com.bs.common.annotation.Excel; import com.bs.common.core.domain.BaseEntity; import lombok.Data; @@ -11,6 +12,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; +import java.util.List; + /** * 产品海报对象 df_product_poster * @@ -25,9 +28,9 @@ public class DfProductPoster extends BaseEntity{ private static final long serialVersionUID = 1L; /** 海报id */ - @TableId(value = "id",type = IdType.AUTO) + @TableId(value = "id",type = IdType.ASSIGN_UUID) @ApiModelProperty(value = "海报id") - private Long id; + private String id; /** 产品id */ @@ -76,7 +79,11 @@ public class DfProductPoster extends BaseEntity{ private String remark; @TableField(exist = false) - private Long[] ids; + private String[] ids; + + + @TableField(exist = false) + private List files; } diff --git a/bs-admin/src/main/java/com/bs/df/mapper/DfBizClueMapper.java b/bs-admin/src/main/java/com/bs/df/mapper/DfBizClueMapper.java index 5121c56..e20a0bf 100644 --- a/bs-admin/src/main/java/com/bs/df/mapper/DfBizClueMapper.java +++ b/bs-admin/src/main/java/com/bs/df/mapper/DfBizClueMapper.java @@ -2,6 +2,8 @@ package com.bs.df.mapper; import com.bs.common.mybatis.mapper.BaseMapperX; import com.bs.df.domain.DfBizClue; +import com.bs.df.domain.DfOrder; +import org.apache.ibatis.annotations.Param; /** * 业务线索Mapper接口 @@ -11,4 +13,6 @@ import com.bs.df.domain.DfBizClue; */ public interface DfBizClueMapper extends BaseMapperX { + Boolean insertClue(@Param("dfBizClue") DfBizClue dfBizClue); + } diff --git a/bs-admin/src/main/java/com/bs/df/mapper/DfOrderMapper.java b/bs-admin/src/main/java/com/bs/df/mapper/DfOrderMapper.java index 8d92351..dfa8c17 100644 --- a/bs-admin/src/main/java/com/bs/df/mapper/DfOrderMapper.java +++ b/bs-admin/src/main/java/com/bs/df/mapper/DfOrderMapper.java @@ -2,6 +2,9 @@ package com.bs.df.mapper; import com.bs.common.mybatis.mapper.BaseMapperX; import com.bs.df.domain.DfOrder; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 客户订单Mapper接口 @@ -11,4 +14,7 @@ import com.bs.df.domain.DfOrder; */ public interface DfOrderMapper extends BaseMapperX { + Boolean insertOrder(@Param("dfOrder")DfOrder dfOrder); + + } diff --git a/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java b/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java index 5257a2b..dc633e9 100644 --- a/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java +++ b/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java @@ -62,14 +62,17 @@ public class CommonController { throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); } String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); - String filePath = BsConfig.getDownloadPath() + fileName; - +// String filePath = BsConfig.getUploadPath() + fileName; + String filePath = "D:/bs/uploadPath/download/2a582a06ed46ba81c45a77d8909b15c_20240423104003A001.jpg"; response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); FileUtils.setAttachmentResponseHeader(response, realFileName); FileUtils.writeBytes(filePath, response.getOutputStream()); - if (delete) { - FileUtils.deleteFile(filePath); - } + File file = new File(filePath); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + FileUtil.downloadFile(request, response, file, false); +// if (delete) { +// FileUtils.deleteFile(filePath); +// } } catch (Exception e) { log.error("下载文件失败", e); } diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysLoginController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysLoginController.java index e10a8fc..e406eee 100644 --- a/bs-admin/src/main/java/com/bs/web/controller/system/SysLoginController.java +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysLoginController.java @@ -1,24 +1,41 @@ package com.bs.web.controller.system; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.bs.common.annotation.Anonymous; +import com.bs.common.annotation.Log; import com.bs.common.constant.Constants; import com.bs.common.core.domain.AjaxResult; -import com.bs.common.core.domain.entity.SysMenu; -import com.bs.common.core.domain.entity.SysUser; -import com.bs.common.core.domain.entity.TenantConfig; +import com.bs.common.core.domain.entity.*; import com.bs.common.core.domain.model.LoginBody; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.enums.BusinessType; import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.df.domain.DfBizClue; +import com.bs.df.mapper.DfBizClueMapper; +import com.bs.df.service.IDfBizClueService; import com.bs.framework.web.service.SysLoginService; import com.bs.framework.web.service.SysPermissionService; +import com.bs.framework.web.service.TokenService; +import com.bs.system.domain.SysUserRole; +import com.bs.system.mapper.SysRoleMapper; +import com.bs.system.mapper.SysUserMapper; +import com.bs.system.mapper.SysUserRoleMapper; import com.bs.system.service.ISysMenuService; import com.bs.system.service.ITenantConfigService; +import com.bs.system.service.SysTenantService; +import com.bs.web.utils.SignUtil; +import com.bs.web.utils.WeiXinUtil; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -40,6 +57,22 @@ public class SysLoginController @Autowired private ITenantConfigService tenantConfigService; + @Resource + private WeiXinUtil weiXinUtil; + @Autowired + private SysUserMapper sysUserMapper; + @Autowired + private TokenService tokenService; + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired + private SysTenantService tenantService; + @Autowired + private IDfBizClueService dfBizClueService; + @Autowired + private DfBizClueMapper dfBizClueMapper; /** * 登录方法 @@ -76,13 +109,213 @@ public class SysLoginController tenantConfig = new TenantConfig(); } AjaxResult ajax = AjaxResult.success(); + SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper().eq(SysUser::getUserId, user.getUserId())); + user.setAddress(sysUser.getAddress()); + user.setCompany(sysUser.getCompany()); ajax.put("user", user); ajax.put("tenantConfig", tenantConfig); ajax.put("roles", roles); ajax.put("permissions", permissions); +// ajax.put("xcxOpenId", user.getXcxOpenId()); +// ajax.put("gzhOpenId", user.getGzhOpenId()); +// ajax.put("unionId", user.getUnionId()); +// ajax.put("wechatNo", user.getWechatNo()); +// ajax.put("address", user.getAddress()); +// ajax.put("company", user.getCompany()); return ajax; } + /** + * 登录方法 + * 传 微信Code:wxCode + * + * @param loginBody 登录信息 + * @return 结果 + */ + @PostMapping("/getOpenId") + @Log(title = "用户获取公众号id", businessType = BusinessType.GRANT) + @ApiOperation(value = "获取openId,暂时无用") + public AjaxResult getGzhOpenId(@RequestBody LoginBody loginBody) { + AjaxResult ajax = AjaxResult.success(); + // 生成令牌 + if (StringUtils.isEmpty(loginBody.getWxCode())) { + return AjaxResult.error("请传入微信Code"); + } + if (StringUtils.isEmpty(loginBody.getGzhCode())) { + return AjaxResult.error("请传ghzCode"); + } + JSONObject xcxJo = weiXinUtil.getXCXOpenId(loginBody.getWxCode()); + if (StringUtils.isEmpty(xcxJo.getString("openId"))) { + return AjaxResult.error("code错误"); + } + JSONObject gzhJo = null; + gzhJo = weiXinUtil.getGZHOpenId(loginBody.getGzhCode()); + return AjaxResult.success().put("openId", xcxJo.getString("openId")) + .put("gzhOpenId", gzhJo.getString("openId")).put("unionId", xcxJo.getString("unionid")); + + } + + + /** + * 解绑微信信息 + * @return 结果 + */ + @PostMapping("/unbindWx") + @ApiOperation(value = "解绑微信") + @Log(title = "用户获取公众号id", businessType = BusinessType.GRANT) + public AjaxResult unbindWx() { + SysUser sysUser = sysUserMapper.selectById(SecurityUtils.getUserId()); + sysUser.setXcxOpenId(""); + sysUser.setGzhOpenId(""); + sysUser.setUnionId(""); + sysUserMapper.updateById(sysUser); + LoginUser loginUser = SecurityUtils.getLoginUser(); + loginUser.getUser().setXcxOpenId(""); + loginUser.getUser().setGzhOpenId(""); + loginUser.getUser().setUnionId(""); + tokenService.refreshToken(loginUser); + return AjaxResult.success("解绑成功").put("user",sysUser); + } + + + /** + * 绑定微信信息 + * @return 结果 + */ + @PostMapping("/bindingWx") + @ApiOperation(value = "绑定微信") + @Log(title = "用户获取公众号id", businessType = BusinessType.GRANT) + public AjaxResult bindingWx(@RequestBody LoginBody loginBody) { + // 生成令牌 + if (StringUtils.isEmpty(loginBody.getWxCode())) { + return AjaxResult.error("请传入微信Code"); + } + if (StringUtils.isEmpty(loginBody.getGzhCode())) { + return AjaxResult.error("请传ghzCode"); + } + JSONObject xcxJo = weiXinUtil.getXCXOpenId(loginBody.getWxCode()); + if (StringUtils.isEmpty(xcxJo.getString("openId"))) { + return AjaxResult.error("微信code错误"); + } + JSONObject gzhJo = null; + gzhJo = weiXinUtil.getGZHOpenId(loginBody.getGzhCode()); + if (StringUtils.isEmpty(gzhJo.getString("openId"))) { + return AjaxResult.error("公众号code错误"); + } + //判断微信是否被其他用户绑定 + SysUser tempUser = sysUserMapper.selectOne(new LambdaQueryWrapper().eq(SysUser::getGzhOpenId, gzhJo.getString("openId"))); + + if (tempUser!=null) { + return AjaxResult.error("此微信已被绑定"); + } + SysUser updateUser = new SysUser(); + updateUser.setXcxOpenId(""); + sysUserMapper.update(updateUser,new LambdaUpdateWrapper().eq(SysUser::getXcxOpenId, xcxJo.getString("openId"))); + SysUser sysUser = sysUserMapper.selectById(SecurityUtils.getUserId()); + if(StringUtils.isNotEmpty(sysUser.getGzhOpenId())&&!sysUser.getGzhOpenId().equals(gzhJo.getString("openId"))){ + return AjaxResult.error("您的账号已经绑定过其他微信,请先解绑"); + } + sysUser.setXcxOpenId(xcxJo.getString("openId")); + sysUser.setGzhOpenId( gzhJo.getString("openId")); + sysUser.setUnionId(xcxJo.getString("unionid")); + sysUserMapper.updateById(sysUser); + LoginUser loginUser = SecurityUtils.getLoginUser(); + loginUser.getUser().setXcxOpenId(sysUser.getXcxOpenId()); + loginUser.getUser().setGzhOpenId(sysUser.getGzhOpenId()); + loginUser.getUser().setUnionId(sysUser.getUnionId()); + tokenService.refreshToken(loginUser); + return AjaxResult.success("绑定成功").put("user",sysUser); + } + + /** + * 登录方法 + * 传 微信Code:wxCode + * + * @param loginBody 登录信息 + * @return 结果 + */ + @PostMapping("/wxlogin") + @ApiOperation(value = "微信登入") + @Log(title = "用户登入(xcx)", businessType = BusinessType.GRANT) + @Anonymous + public AjaxResult wxlogin(@RequestBody LoginBody loginBody) { + AjaxResult ajax = AjaxResult.success(); + // 生成令牌 + if (StringUtils.isEmpty(loginBody.getWxCode())) { + return AjaxResult.error("请传入微信Code"); + } + SysUser sysUser; + JSONObject xcxJo = weiXinUtil.getXCXOpenId(loginBody.getWxCode()); + if (StringUtils.isEmpty(xcxJo.getString("openId"))) { + return AjaxResult.error("code错误"); + } + JSONObject gzhJo = new JSONObject(); + if(StringUtils.isNotEmpty(loginBody.getGzhCode())){ + gzhJo = weiXinUtil.getGZHOpenId(loginBody.getGzhCode()); + } + List lsUser = sysUserMapper.selectList(new LambdaQueryWrapper().eq(SysUser::getXcxOpenId, xcxJo.getString("openId"))); + if (lsUser != null && lsUser.size() > 0) { + sysUser = lsUser.get(0); + } else { + //没找到账号,需要手动绑定 + return AjaxResult.error("未查找到用户").put("code", "501").put("openId", xcxJo.getString("openId")) + .put("gzhOpenId", gzhJo.getString("openId")!=null?gzhJo.getString("openId"):"").put("unionId", xcxJo.getString("unionid")); + } + if(StringUtils.isEmpty(sysUser.getXcxOpenId())){ + sysUser.setXcxOpenId(xcxJo.getString("openId")); + } + if(StringUtils.isEmpty(sysUser.getGzhOpenId())){ + sysUser.setGzhOpenId(gzhJo.getString("openId")!=null?gzhJo.getString("openId"):""); + } + if(StringUtils.isEmpty(sysUser.getUnionId())){ + sysUser.setUnionId(xcxJo.getString("unionid")); + } + String token = setLoginUser(sysUser); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + public String setLoginUser(SysUser user) { + LoginBody loginBody = new LoginBody(); + loginBody.setXcxOpenId(user.getXcxOpenId()); + //登入成功,查询租户配置 + if (null != user.getTenantId()) { + SysTenant tenant = tenantService.getById(user.getTenantId()); + TenantConfig config = tenantConfigService.getOne(new LambdaQueryWrapper().eq(TenantConfig::getTenantId, tenant.getId())); + if (config == null) { + config = new TenantConfig(); + config.setIsUserAstrict("0"); + config.setIsOnLine("0"); + config.setIsDefinitionName("0"); + config.setIsDefinitionLogo("0"); + config.setIsDefinitionHue("0"); + } + tenant.setTenantConfig(config); + LoginUser loginUser = createLoginUser(user, tenant); + loginService.recordLoginInfo(user.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + } + LoginUser loginUser = createLoginUser(user, null); + loginService.recordLoginInfo(user.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + } + + public LoginUser createLoginUser(SysUser user, SysTenant tenant) { + //查询用户下的权限 + LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); + userRoleWrapper.select(SysUserRole::getRoleId); + userRoleWrapper.eq(SysUserRole::getUserId,user.getUserId()); + List roleIds = sysUserRoleMapper.selectObjs(userRoleWrapper); + //查询用户下的权限 + LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); + roleWrapper.in(SysRole::getRoleId,roleIds); + user.setRoles(sysRoleMapper.selectList(roleWrapper)); + return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); + } + + /** * 获取路由信息 * @@ -95,4 +328,64 @@ public class SysLoginController List menus = menuService.selectMenuTreeByUserId(userId); return AjaxResult.success(menuService.buildMenus(menus)); } + + /** + * 添加访客 + * + * @return 结果 + */ + @PostMapping("/addVisitor") + @Anonymous + public DfBizClue addVisitor(LoginBody loginBody) + { + String nickname = null; + String headimgurl = null; + String unionId = null; + String openIdNew = null; + if (StringUtils.isNotEmpty(loginBody.getCode())) { + JSONObject gzhOpenId = weiXinUtil.getGZHOpenId(loginBody.getCode()); + String refreshToken = gzhOpenId.getString("refreshToken"); + JSONObject xinUtilRefreshToken = weiXinUtil.getRefreshToken(refreshToken); + String openid = xinUtilRefreshToken.getString("openId"); + JSONObject userInfoBySnsapi = weiXinUtil.getUserInfoBySnsapi(openid); + nickname = userInfoBySnsapi.getString("nickname"); + headimgurl = userInfoBySnsapi.getString("headimgurl"); + unionId = userInfoBySnsapi.getString("unionid"); + openIdNew = userInfoBySnsapi.getString("openid"); + } else { + unionId = loginBody.getUnionId(); + openIdNew = loginBody.getOpenId(); + } + DfBizClue dfBizClue = new DfBizClue(); + dfBizClue.setShareUser(loginBody.getShareUser()); + dfBizClue.setFromType(loginBody.getFromType()); + dfBizClue.setClueType(loginBody.getClueType()); + dfBizClue.setDataType(loginBody.getDataType()); + dfBizClue.setNickName(nickname); + dfBizClue.setAvatarLink(headimgurl); + dfBizClue.setBrowseTime(new Date()); + dfBizClue.setUnionId(unionId); + dfBizClue.setOpenId(openIdNew); + dfBizClue.setCreateTimeVo(new Date()); + dfBizClue.setTenantId(SecurityUtils.getTenantId()); + if (StringUtils.isNotEmpty(nickname)) { + dfBizClueMapper.insertClue(dfBizClue); + } +// AjaxResult ajax = AjaxResult.success(); +// ajax.put("openid", openIdNew); +// ajax.put("unionid",unionId); + return dfBizClue; + } + + /** + * 获取配置信息 + */ + @PostMapping("/getConfig") + @Anonymous + public Map getConfig(LoginBody loginBody) + { + Map config = weiXinUtil.getConfig(loginBody.getUrl()); + return config; + } + } diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysUserController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysUserController.java index aa1f255..379111c 100644 --- a/bs-admin/src/main/java/com/bs/web/controller/system/SysUserController.java +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysUserController.java @@ -2,6 +2,9 @@ package com.bs.web.controller.system; import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.cm.domain.CmAttach; +import com.bs.cm.service.ICmAttachService; +import com.bs.common.annotation.Anonymous; import com.bs.common.annotation.Log; import com.bs.common.core.controller.BaseController; import com.bs.common.core.domain.AjaxResult; @@ -67,6 +70,9 @@ public class SysUserController extends BaseController { @Resource private IDfAreaService dfAreaService; + @Resource + private ICmAttachService cmAttachService; + /** * 获取用户列表 @@ -92,6 +98,10 @@ public class SysUserController extends BaseController { List list = userService.list(wrapper); List dfBrokers = dfBrokerService.list(); List dfAreas = dfAreaService.list(); + List attachVo = cmAttachService.list(); + Map> attachMap = attachVo.stream() + .filter(cmAttach -> cmAttach.getFileId() != null) + .collect(Collectors.groupingBy(CmAttach::getFileId)); Map map = dfBrokers.stream().collect(Collectors.toMap(DfBroker::getId, DfBroker::getBrokerName)); Map mapByArea = dfAreas.stream().collect(Collectors.toMap(DfArea::getAreaId, DfArea::getName)); for (SysUser sysUser : list) { @@ -104,6 +114,11 @@ public class SysUserController extends BaseController { if (Validator.isNotEmpty(cityName)) { sysUser.setCity(cityName); } + Long id = sysUser.getUserId(); + List matchingAttachments = attachMap.get(String.valueOf(id)); + if (matchingAttachments != null) { + sysUser.setFiles(matchingAttachments); + } } return getDataTable(list); } @@ -189,6 +204,40 @@ public class SysUserController extends BaseController { return ajax; } + /** + * 根据用户编号获取详细信息 + */ + @GetMapping(value = {"/getUsers"}) + public TableDataInfo getInfosById(SysUser user) { + SysUser sysUser = userService.selectUserById(user.getUserId()); + Long deptId = sysUser.getDeptId(); + List list = dfBrokerService.list(new LambdaQueryWrapper().eq(DfBroker::getParentId, deptId)); + List idList = list.stream() + .map(DfBroker::getId) + .collect(Collectors.toList()); + if (idList.isEmpty()) { + idList.add(0L); + } + startPage(); + List sysUsers = userService.list(new LambdaQueryWrapper() + .eq(SysUser::getUserType, user.getUserType()) + .in(SysUser::getDeptId, idList)); + return getDataTable(sysUsers); + } + + /** + * 根据用户编号获取详细信息 + */ + @GetMapping(value = {"/getUser/{userId}"}) + @Anonymous + public AjaxResult getUser(@PathVariable(value = "userId", required = false) Long userId) { + SysUser sysUser = userService.selectUserById(userId); + List attachVo = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId, userId)); + sysUser.setFiles(attachVo); + return success(sysUser); + } + + /** 获取所有非admin角色,用于租户配置 @@ -217,6 +266,9 @@ public class SysUserController extends BaseController { user.setIsTenantAdmin("N"); user.setCreateBy(getUsername()); user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + if (Validator.isNotEmpty(user.getUserIdNew())) { + user.setUserId(Long.valueOf(user.getUserIdNew())); + } int i = userService.insertUser(user); if ("kh".equals(user.getUserType())) { DfUserBroker dfUserBroker = new DfUserBroker(); @@ -389,6 +441,16 @@ public class SysUserController extends BaseController { queryWrapper.eq(SysUser::getSex,sysUser.getSex()); } + //地址 + if(Validator.isNotEmpty(sysUser.getAddress())){ + queryWrapper.eq(SysUser::getAddress,sysUser.getAddress()); + } + + //公司 + if(Validator.isNotEmpty(sysUser.getCompany())){ + queryWrapper.eq(SysUser::getCompany,sysUser.getCompany()); + } + //头像地址 if(Validator.isNotEmpty(sysUser.getAvatar())){ queryWrapper.eq(SysUser::getAvatar,sysUser.getAvatar()); diff --git a/bs-admin/src/main/java/com/bs/web/utils/SignUtil.java b/bs-admin/src/main/java/com/bs/web/utils/SignUtil.java new file mode 100644 index 0000000..92e7900 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/utils/SignUtil.java @@ -0,0 +1,97 @@ +package com.bs.web.utils; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.bs.system.domain.SysConfig; +import com.bs.system.mapper.SysConfigMapper; +import com.bs.system.service.ISysConfigService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * + *
+ * 名称: WeiXinUtil
+ * 描述: 微信工具类 + * + * @author Tjw + * @date 2019年8月7日 下午3:21:16 + */ +@Slf4j +@Component +public class SignUtil { + public static Map sign(String jsapi_ticket, String url) { + Map ret = new HashMap(); + String nonce_str = create_nonce_str(); + String timestamp = create_timestamp(); + String string1; + String signature = ""; + + //注意这里参数名必须全部小写,且必须有序 + string1 = "jsapi_ticket=" + jsapi_ticket + + "&noncestr=" + nonce_str + + "×tamp=" + timestamp + + "&url=" + url; + + try + { + MessageDigest crypt = MessageDigest.getInstance("SHA-1"); + crypt.reset(); + crypt.update(string1.getBytes("UTF-8")); + signature = byteToHex(crypt.digest()); + } + catch (NoSuchAlgorithmException e) + { + e.printStackTrace(); + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + } + + ret.put("nonceStr", nonce_str); + ret.put("timestamp", timestamp); + ret.put("signature", signature); + + return ret; + } + + private static String byteToHex(final byte[] hash) { + Formatter formatter = new Formatter(); + for (byte b : hash) + { + formatter.format("%02x", b); + } + String result = formatter.toString(); + formatter.close(); + return result; + } + + private static String create_nonce_str() { + return UUID.randomUUID().toString(); + } + + private static String create_timestamp() { + return Long.toString(System.currentTimeMillis() / 1000); + } + +} diff --git a/bs-admin/src/main/java/com/bs/web/utils/WXSenMsgUtil.java b/bs-admin/src/main/java/com/bs/web/utils/WXSenMsgUtil.java new file mode 100644 index 0000000..60bdfe3 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/utils/WXSenMsgUtil.java @@ -0,0 +1,109 @@ +package com.bs.web.utils; + +import com.alibaba.fastjson2.JSONObject; +import com.bs.system.service.ISysConfigService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + + +/** + * @author: gfk + * @create: 2023/6/23 + * @Description: + * @FileName: WXSenMsgUtil + * @History: + * @自定义内容: + */ +@Slf4j +@Component +public class WXSenMsgUtil { + + @Resource + private ISysConfigService sysConfigService; + @Resource + private WeiXinUtil weiXinUtil; + + public boolean sendOpenIdToTemplateMessage(String templateKey,String openId,String path, JSONObject data) { + String templateId = getSysTemplate(templateKey); + if (!StringUtils.isEmpty(openId)) { + return weiXinUtil.sendMessage(data,openId,templateId,path); + } + return false; + } + + + /** + *
+ * 描述:模板消息发送
+ * 接口文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277 + * + * @param templateKey 从本类的静态属性取 + * @param openId openId,微信登录返回的openId + * @param path path,跳转小程序页面 + * @param values values,消息通知的值,从上到下按顺序下来 + * @return + * @throws Exception + * @date: 2019年9月5日 下午2:45:19 + * @author Tjw + */ + public boolean sendOpenIdToTemplateMessage(String templateKey,String openId,String path, List values) + { + String templateId = getSysTemplate(templateKey); + int size = values.size(); + JSONObject data = new JSONObject(); + for (int i = 0; i < size; i++) { + if (i == 0) { + JSONObject first = new JSONObject(); + first.put("value",values.get(0)); + data.put("first",first); + } else if (i == size-1) { + JSONObject remark = new JSONObject(); + remark.put("value",values.get(0)); + data.put("remark",remark); + } else { + JSONObject keyword = new JSONObject(); + keyword.put("value",values.get(i)); + data.put("keyword"+i,keyword); + } + } + if (!StringUtils.isEmpty(openId)) { + return weiXinUtil.sendMessage(data,openId,templateId,path); + } + return false; + } + + + + /** + * 获取模板的配置信息 + * @param templateCongifKey 模板key + * @return + * @throws Exception + */ + private String getSysTemplate(String templateCongifKey){ + String value = sysConfigService.selectConfigByKey(templateCongifKey); + if(StringUtils.isEmpty(value)){ + return null; + } + return value; + } + + + + + public static void main(String[] args) throws Exception { + List list = new ArrayList<>(); + list.add("123"); + list.add("456"); + list.add("789"); + list.add("10"); + list.add("abc"); + //sendOpenIdToTemplateMessage("kc6ADrWzxuFxVsvgKqM5V255LGCMe1DXg40S1CmL3Uc","otHaO4u_ISeXjLrTr3TZ5H_t0ZBw","",list); + } + +} diff --git a/bs-admin/src/main/java/com/bs/web/utils/WeiXinUtil.java b/bs-admin/src/main/java/com/bs/web/utils/WeiXinUtil.java new file mode 100644 index 0000000..88e7e8c --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/utils/WeiXinUtil.java @@ -0,0 +1,1138 @@ +package com.bs.web.utils; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.system.domain.SysConfig; +import com.bs.system.mapper.SysConfigMapper; +import com.bs.system.service.ISysConfigService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * + *
+ * 名称: WeiXinUtil
+ * 描述: 微信工具类 + * + * @author Tjw + * @date 2019年8月7日 下午3:21:16 + */ +@Slf4j +@Component +public class WeiXinUtil { + // 日期格式 + private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 微信小程序appid + //@Value("${wxConfig.appid}") + private static String appid="wx9e514cd1390086a8" ; + // 微信小程序appsecret + //@Value("${wxConfig.appsecret}") + private static String appsecret="e1e7395c8162f9d97487dae670faee5f"; + + // 微信公众号appid + //@Value("${wxConfig.gzhappid}") + private static String gzhappid="wx328dafbfac1bb1b6"; + // 微信公众号appsecret + //@Value("${wxConfig.gzhappsecret}") + private static String gzhappsecret="Dfjf3333"; + + // 微信开放号appid + private static String openAppid = ""; + // 微信开放号appsecret + private static String openAppsecret = ""; + // 微信开放号授权回调域 + private static String openUrl = ""; + @Autowired + private ISysConfigService sysConfigService; + @Resource + private SysConfigMapper sysConfigMapper; + + + /** + * + *
+ * 描述:设置参数值 + * + * @date: 2019年8月24日 上午9:58:01 + * @author Tjw + */ + private void setConfigParam() { + String cf_weixinUtil_appid = getSysConfig("cf_weixinUtil_appid"); + String cf_weixinUtil_appsecret = getSysConfig("cf_weixinUtil_appsecret"); +/* SysConfig config9 = getSysConfig("cf_weixinUtil_open_appid"); + String cf_weixinUtil_open_appid = config9.getConfigValue(); + SysConfig config10 = getSysConfig("cf_weixinUtil_open_appsecret"); + String cf_weixinUtil_open_appsecret = config10.getConfigValue(); + SysConfig config11 = getSysConfig("cf_weixinUtil_open_url"); + String cf_weixinUtil_open_url = config11.getConfigValue();*/ + + appid = cf_weixinUtil_appid; // 微信公众号appid/**/ + appsecret = cf_weixinUtil_appsecret; // 微信公众号appsecret + /*openAppid = cf_weixinUtil_open_appid; // 微信开放号appid + openAppsecret = cf_weixinUtil_open_appsecret; // 微信开放号appsecret + openUrl = cf_weixinUtil_open_url; // 微信开放号授权回调域*/ + } + + /** + * + *
+ * 描述:获取openid(小程序) + * + * @param code + * @return + * @date: 2019年8月10日 下午3:25:24 + * @author Tjw + */ + public JSONObject getXCXOpenId(String code) { + /*String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + + "&code=" + code + "&grant_type=authorization_code";*/ + String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + appsecret + + "&js_code=" + code + "&grant_type=authorization_code"; + try { + log.info("获取openid请求url:" + url); + HttpResponse response = HttpRequest.get(url) + .timeout(5 * 60 * 1000) + .execute(); + String values = response.body(); + log.info("获取openid返回数据:" +values); + JSONObject jsonObject = JSON.parseObject(values); + String openId = jsonObject.getString("openid"); + String session_key = jsonObject.getString("session_key"); + String unionid = jsonObject.getString("unionid"); + openId = openId == null ? "" : openId; + session_key = session_key == null ? "" : session_key; + unionid = unionid == null ? "" : unionid; + JSONObject jo = new JSONObject(); + jo.put("unionid",unionid); + jo.put("openId",openId); + jo.put("session_key",session_key); + return jo; + } catch (Exception e) { + log.error("openId获取异常", e); + JSONObject jo = new JSONObject(); + jo.put("msg","openId获取异常"); + jo.put("code","501"); + return jo; + } + } + + /** + * + *
+ * 描述:获取公众号openid + * + * @param code + * @return + * @date: 2019年8月10日 下午3:25:24 + * @author Tjw + */ + public JSONObject getGZHOpenId(String code) { + String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + gzhappid + "&secret=" + gzhappsecret + + "&code=" + code + "&grant_type=authorization_code"; + try { + log.info("获取openid请求url:" + url); + HttpResponse response = HttpRequest.get(url) + .timeout(5 * 60 * 1000) + .execute(); + String values = response.body(); + log.info("获取openid返回数据:" +values); + JSONObject jsonObject = JSON.parseObject(values); + String openId = jsonObject.getString("openid"); + String access_token = jsonObject.getString("access_token"); + String unionid = jsonObject.getString("unionid"); + String refresh_token = jsonObject.getString("refresh_token"); + openId = openId == null ? "" : openId; + access_token = access_token == null ? "" : access_token; + unionid = unionid == null ? "" : unionid; + refresh_token = refresh_token == null ? "" : refresh_token; + JSONObject jo = new JSONObject(); + jo.put("unionid",unionid); + jo.put("openId",openId); + jo.put("accessToken",access_token); + jo.put("refreshToken",refresh_token); + return jo; + } catch (Exception e) { + log.error("openId获取异常", e); + JSONObject jo = new JSONObject(); + jo.put("msg","openId获取异常"); + jo.put("code","501"); + return jo; + } + } + + /** + * 描述:刷新access_token + */ + public JSONObject getRefreshToken(String refreshToken) { + String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + gzhappid + "&grant_type=authorization_code" + + "&refresh_token=" + refreshToken; + try { + log.info("获取刷新access_token请求url:" + url); + HttpResponse response = HttpRequest.get(url) + .timeout(5 * 60 * 1000) + .execute(); + String values = response.body(); + log.info("获取刷新access_token返回数据:" +values); + JSONObject jsonObject = JSON.parseObject(values); + String openId = jsonObject.getString("openid"); + String access_token = jsonObject.getString("access_token"); + String unionid = jsonObject.getString("unionid"); + String refresh_token_new = jsonObject.getString("refresh_token"); + openId = openId == null ? "" : openId; + access_token = access_token == null ? "" : access_token; + unionid = unionid == null ? "" : unionid; + refresh_token_new = refresh_token_new == null ? "" : refresh_token_new; + JSONObject jo = new JSONObject(); + jo.put("unionid",unionid); + jo.put("openId",openId); + jo.put("accessToken",access_token); + jo.put("refreshToken",refresh_token_new); + return jo; + } catch (Exception e) { + log.error("openId获取异常", e); + JSONObject jo = new JSONObject(); + jo.put("msg","openId获取异常"); + jo.put("code","501"); + return jo; + } + } + + + /** + * 描述:刷新access_token + */ + public Map getConfig(String url) { + Map sign = null; + try { + String titcket = getTitcket(); + sign = SignUtil.sign(titcket, url); + } catch (Exception e) { + e.printStackTrace(); + } + sign.put("appId", gzhappid); + return sign; + } + +// /** +// * 描述:获取access_token +// */ +// public JSONObject getAccessTokenByConfig() { +// String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=authorization_code" +// + "&appid=" + gzhappid + "&secret=" + openAppsecret; +// try { +// log.info("获取刷新access_token请求url:" + url); +// HttpResponse response = HttpRequest.get(url) +// .timeout(5 * 60 * 1000) +// .execute(); +// String values = response.body(); +// log.info("获取刷新access_token返回数据:" +values); +// JSONObject jsonObject = JSON.parseObject(values); +// String access_token = jsonObject.getString("access_token"); +// access_token = access_token == null ? "" : access_token; +// JSONObject jo = new JSONObject(); +// jo.put("accessToken",access_token); +// return jo; +// } catch (Exception e) { +// log.error("openId获取异常", e); +// JSONObject jo = new JSONObject(); +// jo.put("msg","openId获取异常"); +// jo.put("code","501"); +// return jo; +// } +// } + +// /** +// * 描述:获取ticket +// */ +// public JSONObject getTicket() { +// String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=authorization_code" +// + "&appid=" + gzhappid + "&secret=" + openAppsecret; +//// https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi +// try { +// log.info("获取刷新access_token请求url:" + url); +// HttpResponse response = HttpRequest.get(url) +// .timeout(5 * 60 * 1000) +// .execute(); +// String values = response.body(); +// log.info("获取刷新access_token返回数据:" +values); +// JSONObject jsonObject = JSON.parseObject(values); +// String access_token = jsonObject.getString("access_token"); +// access_token = access_token == null ? "" : access_token; +// JSONObject jo = new JSONObject(); +// jo.put("accessToken",access_token); +// return jo; +// } catch (Exception e) { +// log.error("openId获取异常", e); +// JSONObject jo = new JSONObject(); +// jo.put("msg","openId获取异常"); +// jo.put("code","501"); +// return jo; +// } +// } + + /** + * 描述:拉取用户信息 + */ + public JSONObject getUserInfoBySnsapi(String openid) { + String url = "https://api.weixin.qq.com/sns/userinfo?access_token?appid=" + gzhappid + "&openid=" + openid + + "&lang=zh_CN"; + try { + log.info("获取用户信息请求url:" + url); + HttpResponse response = HttpRequest.get(url) + .timeout(5 * 60 * 1000) + .execute(); + String values = response.body(); + log.info("获取用户信息返回数据:" +values); + JSONObject jsonObject = JSON.parseObject(values); + String openId = jsonObject.getString("openid"); + String unionid = jsonObject.getString("unionid"); + String nickname = jsonObject.getString("nickname"); + String sex = jsonObject.getString("sex"); + String province = jsonObject.getString("province"); + String city = jsonObject.getString("city"); + String country = jsonObject.getString("country"); + String headimgurl = jsonObject.getString("headimgurl"); + String privilege = jsonObject.getString("privilege"); + openId = openId == null ? "" : openId; + unionid = unionid == null ? "" : unionid; + nickname = nickname == null ? "" : nickname; + sex = sex == null ? "" : sex; + province = province == null ? "" : province; + city = city == null ? "" : city; + country = country == null ? "" : country; + headimgurl = headimgurl == null ? "" : headimgurl; + privilege = privilege == null ? "" : privilege; + JSONObject jo = new JSONObject(); + jo.put("unionid",unionid); + jo.put("openid",openId); + jo.put("nickname",nickname); + jo.put("sex",sex); + jo.put("province",province); + jo.put("city",city); + jo.put("country",country); + jo.put("headimgurl",headimgurl); + jo.put("privilege",privilege); + return jo; + } catch (Exception e) { + log.error("openId获取异常", e); + JSONObject jo = new JSONObject(); + jo.put("msg","openId获取异常"); + jo.put("code","501"); + return jo; + } + } + + + /** + * + *
+ * 描述:获取openid + * + * @param code + * @return + * @date: 2019年8月10日 下午3:25:24 + * @author Tjw + */ + public String getPcOpenId(String code,HttpServletRequest request) { + String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + openAppid + "&secret=" + openAppsecret + + "&code=" + code + "&grant_type=authorization_code"; + try { + log.info("获取openid请求url:" + url); + HttpResponse response = HttpRequest.get(url) + .timeout(5 * 60 * 1000) + .execute(); + String values = response.body(); + log.info("获取openid返回数据:" + values); + JSONObject jsonObject = JSON.parseObject(values); + String openId = jsonObject.getString("openid"); + String access_token = jsonObject.getString("access_token"); + String unionid = jsonObject.getString("unionid"); + openId = openId == null ? "" : openId; + access_token = access_token == null ? "" : access_token; + unionid = unionid == null ? "" : unionid; + request.getSession().setAttribute("openId", openId); + request.getSession().setAttribute("access_token", access_token); + request.getSession().setAttribute("unionid", unionid); + return openId; + } catch (Exception e) { + log.error("openId获取异常", e); + return "openId获取异常"; + } + } + + /** + * + *
+ * 描述:获得code + * + * @param request + * @return + * @throws UnsupportedEncodingException + * @date: 2019年8月10日 下午3:26:00 + * @author Tjw + */ + public String getCode(HttpServletRequest request) throws UnsupportedEncodingException { + String authorize = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect"; + String url = authorize.replace("APPID", appid) + .replace("REDIRECT_URI", URLEncoder.encode(request.getRequestURL().toString(), "utf-8")) + .replace("SCOPE", "snsapi_userinfo"); + String queryString = request.getQueryString(); + if (StringUtils.isNotEmpty(queryString)) { + url = url.replace("STATE", request.getQueryString()); + } + log.info("获得code的url:" + url); + return url; + } + + /** + * + *
+ * 描述:绑定微信时PC端商户获得微信开放号code + * + * @param request + * @return + * @throws UnsupportedEncodingException + * @date: 2020年3月26日 下午3:26:00 + * @author Tjw + */ + public String getBindPcCode(HttpServletRequest request) throws UnsupportedEncodingException { + String authorize = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect"; + String url = authorize.replace("APPID", openAppid) + .replace("REDIRECT_URI", URLEncoder.encode(openUrl + "/merchant/index/bindWeixin", "utf-8")) + .replace("SCOPE", "snsapi_login"); + String queryString = request.getQueryString(); + if (StringUtils.isNotEmpty(queryString)) { + url = url.replace("STATE", request.getQueryString()); + } + log.info("获得PC端code的url:" + url); + return url; + } + + /** + * + *
+ * 描述:绑定微信时PC端服务商获得微信开放号code + * + * @param request + * @return + * @throws UnsupportedEncodingException + * @date: 2020年3月26日 下午3:26:00 + * @author Tjw + */ + public String getBindPcLedgerCode(HttpServletRequest request) throws UnsupportedEncodingException { + String authorize = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect"; + String url = authorize.replace("APPID", openAppid) + .replace("REDIRECT_URI", URLEncoder.encode(openUrl + "/ledger/index/bindWeixin", "utf-8")) + .replace("SCOPE", "snsapi_login"); + String queryString = request.getQueryString(); + if (StringUtils.isNotEmpty(queryString)) { + url = url.replace("STATE", request.getQueryString()); + } + log.info("获得PC端code的url:" + url); + return url; + } + + /** + * + *
+ * 描述:微信登录时PC端获得微信开放号code + * + * @param request + * @return + * @throws UnsupportedEncodingException + * @date: 2020年3月26日 下午3:26:00 + * @author Tjw + */ + public String getLoginPcCode(HttpServletRequest request) throws UnsupportedEncodingException { + String authorize = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect"; + String url = authorize.replace("APPID", openAppid) + .replace("REDIRECT_URI", URLEncoder.encode(openUrl + "/merchant/login/loginWeixin", "utf-8")) + .replace("SCOPE", "snsapi_login"); + String queryString = request.getQueryString(); + if (StringUtils.isNotEmpty(queryString)) { + url = url.replace("STATE", request.getQueryString()); + } + log.info("获得PC端code的url:" + url); + return url; + } + + /** + * 获取access_token + *
描述: + * @return + * @date: 2020年4月10日 下午5:38:17 + * @author tanjunwei + */ + public String getAccessToken() { + String access_token = getAccess_token(gzhappid, gzhappsecret); + return access_token; + } + + + + // xml事件推送 + public String sendImageText(HttpServletResponse httpServletResponse, String toUserName, String fromUserName, + List Title, List Description, List PicUrl, List Url) { + StringBuffer content = new StringBuffer(); + content.append("12345678" + + Title.size() + ""); + for (int i = 0; i < Url.size(); i++) { + content.append(""); + + content.append("<![CDATA["); + content.append(Title.get(i)); + content.append("]]>"); + + content.append(""); + + content.append(""); + + content.append(""); + content.append(""); + } + content.append(""); + content.append(""); + + return content.toString(); + + } + + public String sendtextContent(String ToUserName, String FromUserName, String Content) { + StringBuffer buffer = new StringBuffer(); + log.info(FromUserName + " " + ToUserName); + buffer.append("12345678"); + + return buffer.toString(); + } + + // 获取Access_token + public synchronized String getAccess_token(String appid, String appsecret) { + String access_token = getSysConfig("access_token"); + if (StringUtils.isNotEmpty(access_token)){ + JSONObject jo = JSONObject.parseObject(access_token); + jo.getString("expirettime"); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = null; + try { + date = format.parse(jo.getString("expirettime")); + } catch (ParseException e) { + throw new RuntimeException(e); + } + if(Long.valueOf(date.getTime()).compareTo(new Date().getTime()) >= 0) { + return jo.getString("accessToken"); + }else{ + SysConfig config = new SysConfig(); + config.setConfigKey("access_token"); + List sysConfigs = sysConfigService.selectConfigList(config); + SysConfig sysConfig = sysConfigs.get(0); + String url = "https://api.weixin.qq.com/cgi-bin/stable_token"; + log.info("获取Access_token请求url:" + url); + JSONObject sendObject = new JSONObject(); + sendObject.put("grant_type","client_credential"); + sendObject.put("appid",appid); + sendObject.put("secret",appsecret); + sendObject.put("force_refresh",false); + String data = httpPost(url,sendObject); + log.info("获取Access_token返回数据:" + data); + if (StringUtils.isNotEmpty(data)) { + JSONObject jsonObject = JSONObject.parseObject(data); + Long createtime = System.currentTimeMillis(); + Long expirettime = System.currentTimeMillis() + (jsonObject.getInteger("expires_in") - 200) * 1000; + JSONObject jo1 = new JSONObject(); + jo1.put("accessToken",jsonObject.getString("access_token")); + jo1.put("expirettime",new Date(expirettime)); + jo1.put("createtime",new Date(createtime)); + sysConfig.setConfigValue(jo1.toJSONString()); + sysConfigService.updateConfig(sysConfig); + return jsonObject.getString("access_token"); + } + } + } else { + String url = "https://api.weixin.qq.com/cgi-bin/stable_token"; + log.info("获取Access_token请求url:" + url); + JSONObject sendObject = new JSONObject(); + sendObject.put("grant_type","client_credential"); + sendObject.put("appid",appid); + sendObject.put("secret",appsecret); + sendObject.put("force_refresh",false); + String data = httpPost(url,sendObject); + log.info("获取Access_token返回数据:" + data); + if (StringUtils.isNotEmpty(data)) { + JSONObject jsonObject = JSONObject.parseObject(data); + Long createtime = System.currentTimeMillis(); + Long expirettime = System.currentTimeMillis() + (jsonObject.getInteger("expires_in") - 200) * 1000; + JSONObject jo = new JSONObject(); + jo.put("accessToken",jsonObject.getString("access_token")); + jo.put("expirettime",new Date(expirettime)); + jo.put("createtime",new Date(createtime)); + SysConfig sysConfig = new SysConfig(); + sysConfig.setConfigName("微信公众号的access_token"); + sysConfig.setRemark("微信公众号的access_token,存的是Json 对象,有三个字段:accessToken:accessToken,expirettime:过期时间戳,createtime:创建时间戳"); + sysConfig.setConfigType("Y"); + sysConfig.setConfigKey("access_token"); + sysConfig.setConfigValue(jo.toJSONString()); + sysConfigService.insertConfig(sysConfig); + return jsonObject.getString("access_token"); + } + } + return null; + } + + public void createBwwxMenu(String menu) { + // 此处改为自己想要的结构体,替换即可 + String access_token = getAccess_token(null, null); + + String action = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token; + try { + URL url = new URL(action); + HttpURLConnection http = (HttpURLConnection) url.openConnection(); + + http.setRequestMethod("POST"); + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + OutputStream os = http.getOutputStream(); + os.write(menu.getBytes("UTF-8"));// 传入参数 + os.flush(); + os.close(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String message = new String(jsonBytes, "UTF-8"); + log.info("createBwwxMenu返回数据:" + message); + } catch (Exception e) { + log.error("createBwwxMenu出现异常", e); + } + + } + + public String getBasicInfo(String openId) throws Exception { + String url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + getAccess_token(appid, appsecret) + + "&openid=" + openId + "&lang=zh_CN"; + return HttpRequest.get(url).execute().body(); + } + + public void createMean(String APPID, String APPSECRET) { + String ssms = "http://www.biftsce.com/weixinBf/weixin/allZixun?title=%E6%97%B6%E5%B0%9A%E4%B9%B0%E6%89%8B"; + String end = "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; + String menu = ""; + + String zymsUrl = "https://www.fengyoucai.com/weixin/web/newIndex"; + + String zyms = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + APPID + "&redirect_uri=" + + URLEncoder.encode(zymsUrl) + end; + menu = ("{\"button\":[{\"name\":\"个人中心\",\"type\":\"view\",\"url\":\"" + zyms + "\"}]}"); + + String access_token = getAccess_token(APPID, APPSECRET); + + String action = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token; + try { + URL url = new URL(action); + HttpURLConnection http = (HttpURLConnection) url.openConnection(); + + http.setRequestMethod("POST"); + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + OutputStream os = http.getOutputStream(); + os.write(menu.getBytes("UTF-8"));// 传入参数 + os.flush(); + os.close(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String message = new String(jsonBytes, "UTF-8"); + log.info("createMean返回数据:" + message); + } catch (Exception e) { + log.error("createMean出现异常", e); + } + } + + public void deleteMenu(String string, String string2) { + String menu = "{\"button\": [{\"name\": \"照片墙\",\"sub_button\": [{\"type\": \"click\",\"name\": \"我要参与\",\"key\": \"IAMJOIN\"},{\"type\": \"click\",\"name\": \"查看照片墙\",\"key\": \"VIEWPHTOT\"}]},{\"name\": \"有奖互动\", \"sub_button\": [{\"type\": \"click\",\"name\": \"比分竞猜\",\"key\": \"bifenjincai\"},{\"type\": \"click\",\"name\": \"首发预测\", \"key\": \"shoufayuce\"}]},{\"name\": \"球队\",\"sub_button\": [{\"type\": \"click\",\"name\": \"俱乐部\",\"key\": \"julebu\"},{\"type\": \"click\",\"name\": \"球队成员\",\"key\": \"qiuduichengyuan\"},{\"type\": \"click\",\"name\": \"积分榜\",\"key\": \"jifenbang\"},{\"type\": \"click\",\"name\": \"射手榜\",\"key\": \"sheshoubang\"},{\"type\": \"click\",\"name\": \"赛程\",\"key\": \"saicheng\"}]}]}"; + + // 此处改为自己想要的结构体,替换即可 + String access_token = getAccess_token(string, string2); + + String action = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + access_token; + try { + URL url = new URL(action); + HttpURLConnection http = (HttpURLConnection) url.openConnection(); + + http.setRequestMethod("POST"); + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + OutputStream os = http.getOutputStream(); + os.write(menu.getBytes("UTF-8"));// 传入参数 + os.flush(); + os.close(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String message = new String(jsonBytes, "UTF-8"); + log.info("deleteMenu返回数据:" + message); + } catch (Exception e) { + log.error("deleteMenu出现异常", e); + } + } + + + + // 获取wx名称 + public String getWxName(String url) { + String nickname = ""; + try { + URL urlGet = new URL(url); + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + + http.setRequestMethod("GET"); // 必须是get方式请求 + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + nickname = new String(jsonBytes, "UTF-8"); + + } catch (Exception e) { + log.error("获取微信名称出现异常", e); + } + + return nickname; + } + + /** + * 获取用户分组 + */ + public int createGroup(String token, String groupName) { + String url = "https://api.weixin.qq.com/cgi-bin/groups/create?access_token=" + token; + + int sb = 0; + try { + URL urlGet = new URL(url); + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + + http.setRequestMethod("GET"); // 必须是get方式请求 + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + + OutputStream outputStream = http.getOutputStream(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", groupName); + + JSONObject jsonObject2 = new JSONObject(); + jsonObject2.put("group", jsonObject); + + String json = jsonObject2.toJSONString(); + + outputStream.write(json.getBytes("UTF-8")); + + outputStream.flush(); + outputStream.close(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String message = new String(jsonBytes, "UTF-8"); + + JSONObject jsObject = JSONObject.parseObject(message); + + log.info("获取用户分组返回数据:" + jsObject); + + jsObject = jsObject.getJSONObject("group"); + + sb = jsObject.getInteger("id"); + + } catch (Exception e) { + log.error("获取用户分组出现异常", e); + } + return sb; + } + + public int updateGroup(String token, String groupName, int id) { + String url = "https://api.weixin.qq.com/cgi-bin/groups/update?access_token=" + token; + + int sb = 0; + try { + URL urlGet = new URL(url); + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + + http.setRequestMethod("POST"); // 必须是get方式请求 + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + + OutputStream outputStream = http.getOutputStream(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", groupName); + jsonObject.put("id", id); + JSONObject jsonObject2 = new JSONObject(); + jsonObject2.put("group", jsonObject); + String json = jsonObject.toJSONString(); + + outputStream.write(json.getBytes("UTF-8")); + + outputStream.flush(); + outputStream.close(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String message = new String(jsonBytes, "UTF-8"); + + JSONObject jsObject = JSONObject.parseObject(message); + + log.info("更新分组返回数据:" + jsObject); + + sb = jsObject.getInteger("errcode"); + + } catch (Exception e) { + log.error("更新分组出现异常", e); + } + return sb; + } + + public int updateUsersGroup(String token, String openid, int to_groupid) { + String url = "https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=" + token; + + int sb = 0; + try { + URL urlGet = new URL(url); + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + + http.setRequestMethod("POST"); // 必须是get方式请求 + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + + OutputStream outputStream = http.getOutputStream(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("openid", openid); + jsonObject.put("to_groupid", to_groupid); + String json = jsonObject.toJSONString(); + + outputStream.write(json.getBytes("UTF-8")); + + outputStream.flush(); + outputStream.close(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String message = new String(jsonBytes, "UTF-8"); + + JSONObject jsObject = JSONObject.parseObject(message); + + log.info("更新用户分组返回数据:" + jsObject); + + sb = jsObject.getInteger("errcode"); + + } catch (Exception e) { + log.error("更新用户分组出现异常", e); + } + return sb; + } + + public String crreateTickets(String token) { + String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + token; + + String sb = ""; + try { + URL urlGet = new URL(url); + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + + http.setRequestMethod("GET"); // 必须是get方式请求 + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + + OutputStream outputStream = http.getOutputStream(); + + outputStream.write(("{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": " + + new Random().nextInt(100000) + "}}}").getBytes("UTF-8")); + + outputStream.flush(); + outputStream.close(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String message = new String(jsonBytes, "UTF-8"); + JSONObject jsObject = JSONObject.parseObject(message); + log.info("crreateTickets返回数据:" + jsObject); + sb = jsObject.getString("ticket"); + + } catch (Exception e) { + log.error("crreateTickets出现异常", e); + } + return sb; + + } + + public Date getDate(long dateString) { + try { + return format.parse(format.format(new Date(dateString * 1000L))); + } catch (ParseException e) { + return new Date(); + } + } + + // + public String getUserInfo(String openid) { + String access_token = getAccess_token(appid, appsecret); + String url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token + "&openid=" + openid + + "&lang=zh_CN"; + String data = getWxName(url); + log.info("获取用户信息返回数据:" + data); + return data; + } + + public String accountAdd(String kf_account, String nickname, String password) { + String token = getAccess_token("wx36a52e51c224fd21", "6b9b56dd52bb4885f62c9ac397fb8cfd"); + String url = "https://api.weixin.qq.com/customservice/kfaccount/add?access_token=" + token; + + String sb = ""; + try { + URL urlGet = new URL(url); + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + + http.setRequestMethod("POST"); // 必须是get方式请求 + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + http.setDoOutput(true); + http.setDoInput(true); + System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 + System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 + + http.connect(); + + OutputStream outputStream = http.getOutputStream(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("kf_account", kf_account); + jsonObject.put("nickname", nickname); + jsonObject.put("password", password); + String value = jsonObject.toJSONString(); + + log.info("accountAdd发送数据:" + value); + outputStream.write((value).getBytes("UTF-8")); + + outputStream.flush(); + outputStream.close(); + + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String message = new String(jsonBytes, "UTF-8"); + + JSONObject jsObject = JSONObject.parseObject (message); + + log.info("accountAdd返回数据:" + jsObject); + + sb = jsObject.getString("ticket"); + } catch (Exception e) { + log.error("accountAdd出现异常", e); + } + return sb; + + } + + public String getTitcket() throws Exception { + + String accessToken = getAccess_token(appid, appsecret); + String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; + + String returnValue = httpGet(url,null); + JSONObject jsonObject = JSONObject.parseObject(returnValue); + String ticket = jsonObject.getString("ticket"); + + log.info("getTitcket返回数据:" + jsonObject); + + return ticket; + } + + // 获取带参数二维码 + public String getQrcode() { + String accessToken = getAccess_token(appid, appsecret); + return crreateTickets(accessToken); + } + + public String jmsq() throws Exception { + String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + + "&redirect_uri=http://dya.s1.natapp.cc&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"; + String returnValue = httpGet(url,null); + JSONObject jsonObject = JSONObject.parseObject(returnValue); + log.info("jmsq返回数据:" + jsonObject); + return "jsonObject"; + } + + public String getRandomStr(int length) { + String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + + } + + public String getSysConfig(String key){ + String value = sysConfigService.selectConfigByKey(key); + return value; + } + + public String httpPost(String url,JSONObject params){ + Map heads = new HashMap<>(); + heads.put("Content-Type", "application/json;charset=UTF-8"); + HttpResponse response = HttpRequest.post(url) + .headerMap(heads, false) + .body(String.valueOf(params)) + .timeout(5 * 60 * 1000) + .execute(); + return response.body(); + } + + public String httpGet(String url,JSONObject params){ + Map heads = new HashMap<>(); + heads.put("Content-Type", "application/json;charset=UTF-8"); + HttpResponse response = HttpRequest.get(url) + .headerMap(heads, false) + .body(String.valueOf(params)) + .timeout(5 * 60 * 1000) + .execute(); + return response.body(); + } + + + + /** + *
+ * 描述:微信公众号发送模板消息
+ * 接口文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277 + * + * @param openId openId,微信登录返回的openId + * @return + * @throws Exception + * @date: 2019年9月5日 下午2:45:19 + * @author Tjw + */ + public boolean sendMessage(JSONObject jsonObject, String openId, String templateId, String path) + { + if (!StringUtils.isEmpty(openId)) { + String access_token = getAccessToken(); + String url = " https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+access_token; + JSONObject params = new JSONObject(); + params.put("touser", openId); + params.put("template_id", templateId); + params.put("url",url); + params.put("data", jsonObject); + JSONObject miniprogram = new JSONObject(); + miniprogram.put("appid",appid); + miniprogram.put("pagepath",path); + params.put("miniprogram",miniprogram); + log.info("微信公众号发送模板消息请求参数:" + params.toString()); + String data = httpPost(url, params); + log.info("微信公众号发送模板消息返回数据:" + data); + JSONObject dataMap = JSONObject.parseObject(data); + if (dataMap != null && dataMap.get("errcode") != null + && Integer.parseInt(dataMap.get("errcode").toString()) == 0) { + return true; + } + } + return false; + } + + + public static void main(String[] args) { + + //System.out.println("token:"+getAccessToken()); + } + +} diff --git a/bs-admin/src/main/java/com/bs/web/utils/sign.java b/bs-admin/src/main/java/com/bs/web/utils/sign.java new file mode 100644 index 0000000..8258240 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/utils/sign.java @@ -0,0 +1,132 @@ +package com.bs.web.utils; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONException; +import cn.hutool.json.JSONObject; +import cn.hutool.json.XML; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.io.IOUtils; + +import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.io.UnsupportedEncodingException; + +class Sign { + + @Resource + private WeiXinUtil weiXinUtil; + public static void main(String[] args) { + String jsapi_ticket = " \n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + String s = convertXmlToJson(jsapi_ticket); + Map mapJson = new HashMap<>(); + try { + ObjectMapper mapper = new ObjectMapper(); + mapJson = mapper.readValue(s, Map.class); + } catch (Exception e) { + e.printStackTrace(); + } + Object messageJson = mapJson.get("Root"); + LinkedHashMap nestedMapNts = (LinkedHashMap) messageJson; + LinkedHashMap> nestedMapInfo = (LinkedHashMap>) messageJson; + Object corporation = nestedMapNts.get("Corporation"); + try { + JSONArray jsonArray = new JSONArray(corporation); + List names = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String name = jsonObject.getStr("Name"); + names.add(name); + } + System.out.println(names); + } catch (JSONException e) { + e.printStackTrace(); + } + + }; + + public static Map sign(String jsapi_ticket, String url) { + Map ret = new HashMap(); + String nonce_str = create_nonce_str(); + String timestamp = create_timestamp(); + String string1; + String signature = ""; + + //注意这里参数名必须全部小写,且必须有序 + string1 = "jsapi_ticket=" + jsapi_ticket + + "&noncestr=" + nonce_str + + "×tamp=" + timestamp + + "&url=" + url; + try + { + MessageDigest crypt = MessageDigest.getInstance("SHA-1"); + crypt.reset(); + crypt.update(string1.getBytes("UTF-8")); + signature = byteToHex(crypt.digest()); + } + catch (NoSuchAlgorithmException e) + { + e.printStackTrace(); + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + } + + ret.put("url", url); + ret.put("jsapi_ticket", jsapi_ticket); + ret.put("nonceStr", nonce_str); + ret.put("timestamp", timestamp); + ret.put("signature", signature); + + return ret; + } + + private static String byteToHex(final byte[] hash) { + Formatter formatter = new Formatter(); + for (byte b : hash) + { + formatter.format("%02x", b); + } + String result = formatter.toString(); + formatter.close(); + return result; + } + + private static String create_nonce_str() { + return UUID.randomUUID().toString(); + } + + private static String create_timestamp() { + return Long.toString(System.currentTimeMillis() / 1000); + } + + + + + public static String convertXmlToJson(String xmlString) { + JSONObject jsonObject = XML.toJSONObject(xmlString); // 使用JSON库将XML字符串转换为JSONObject对象 + String jsonString = jsonObject.toString(); // 将JSONObject对象转换为JSON字符串 + return jsonString; + } + +} diff --git a/bs-admin/src/main/resources/mapper/biz/DfBizClueMapper.xml b/bs-admin/src/main/resources/mapper/biz/DfBizClueMapper.xml index e023a94..f14c470 100644 --- a/bs-admin/src/main/resources/mapper/biz/DfBizClueMapper.xml +++ b/bs-admin/src/main/resources/mapper/biz/DfBizClueMapper.xml @@ -4,4 +4,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + INSERT INTO df_biz_clue(data_type,clue_type,user_id,nick_name,browse_time,avatar_link,phone,create_dept,create_by,create_time,tenant_id, + business_links,union_id,open_id,share_user,from_type) + VALUES(#{dfBizClue.dataType},#{dfBizClue.clueType},#{dfBizClue.userId},#{dfBizClue.nickName},#{dfBizClue.browseTime},#{dfBizClue.avatarLink}, + #{dfBizClue.phone},#{dfBizClue.createDept},#{dfBizClue.createBy},#{dfBizClue.createTimeVo},#{dfBizClue.tenantId},#{dfBizClue.businessLinks} + ,#{dfBizClue.unionId},#{dfBizClue.openId},#{dfBizClue.shareUser},#{dfBizClue.fromType}) + + + diff --git a/bs-admin/src/main/resources/mapper/order/DfOrderMapper.xml b/bs-admin/src/main/resources/mapper/order/DfOrderMapper.xml index 264f7c1..d11a97f 100644 --- a/bs-admin/src/main/resources/mapper/order/DfOrderMapper.xml +++ b/bs-admin/src/main/resources/mapper/order/DfOrderMapper.xml @@ -4,4 +4,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + INSERT INTO df_order (order_no, user_id, broker_id, product_id, product_name, submit_time, apply_amount, + limit_amount, loan_amount, loan_rate, load_month, is_first, + settle_amount, staus, remark, create_dept, create_by, create_time, tenant_id,share_user,from_type) + VALUES (#{dfOrder.orderNo}, #{dfOrder.userId}, #{dfOrder.brokerId}, #{dfOrder.productId}, #{dfOrder.productName}, #{dfOrder.submitTime}, #{dfOrder.applyAmount}, #{dfOrder.limitAmount}, #{dfOrder.loanAmount}, #{dfOrder.loanRate}, #{dfOrder.loadMonth}, #{dfOrder.isFirst}, + #{dfOrder.settleAmount}, #{dfOrder.staus}, #{dfOrder.remark}, #{dfOrder.createDept}, #{dfOrder.createBy}, + #{dfOrder.createTimeVo}, #{dfOrder.tenantId},#{dfOrder.shareUser},#{dfOrder.fromType}) + + diff --git a/bs-common/src/main/java/com/bs/common/constant/Constants.java b/bs-common/src/main/java/com/bs/common/constant/Constants.java index 6036fc9..138634b 100644 --- a/bs-common/src/main/java/com/bs/common/constant/Constants.java +++ b/bs-common/src/main/java/com/bs/common/constant/Constants.java @@ -64,6 +64,16 @@ public class Constants */ public static final String LOGIN_FAIL = "Error"; + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + /** * 验证码有效期(分钟) */ diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysUser.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysUser.java index 03024c1..e6de668 100644 --- a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysUser.java +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysUser.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; + import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; @@ -76,6 +77,15 @@ public class SysUser extends BaseEntity @ApiModelProperty(value = "简介") private String userDesc; + @Excel(name = "地址") + @ApiModelProperty(value = "地址") + private String address; + + @Excel(name = "公司") + @ApiModelProperty(value = "公司") + private String company; + + /** 用户昵称 */ @Excel(name = "用户名称") @@ -148,6 +158,12 @@ public class SysUser extends BaseEntity @TableField(exist = false) private Long[] postIds; + @TableField(exist = false) + private Object files; + + @TableField(exist = false) + private String userIdNew; + /** 角色ID */ @TableField(exist = false) private Long roleId; @@ -179,5 +195,22 @@ public class SysUser extends BaseEntity @TableField(exist = false) private String selectAll; + /** + * 微信小程序openId + */ + private String xcxOpenId; + /** + * 微信公众号openId + */ + private String gzhOpenId; + /** + * unionId 微信唯一标识 + */ + private String unionId; + /** + * 微信号 + */ + private String wechatNo; + } diff --git a/bs-common/src/main/java/com/bs/common/core/domain/model/LoginBody.java b/bs-common/src/main/java/com/bs/common/core/domain/model/LoginBody.java index a61a351..936cf1d 100644 --- a/bs-common/src/main/java/com/bs/common/core/domain/model/LoginBody.java +++ b/bs-common/src/main/java/com/bs/common/core/domain/model/LoginBody.java @@ -1,5 +1,8 @@ package com.bs.common.core.domain.model; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; + /** * 用户登录对象 * @@ -27,6 +30,51 @@ public class LoginBody */ private String uuid; + /** + * 微信小程序openId + */ +// @TableField(exist = false) + private String xcxOpenId; + /** + * 微信公众号openId + */ +// @TableField(exist = false) + private String gzhOpenId; + + /** + * 微信unionid + */ +// @TableField(exist = false) + private String unionId; + + /** + * 微信小程序Code + */ +// @TableField(exist = false) + private String wxCode; + + + /** + * 微信公众号Code + */ +// @TableField(exist = false) + private String gzhCode; + + private String url; + + private String openId; + + private String clueType; + + private String dataType; + + private String fromType; + + private String shareUser; + + + + public String getUsername() { return username; @@ -66,4 +114,117 @@ public class LoginBody { this.uuid = uuid; } + + public String getXcxOpenId() + { + return xcxOpenId; + } + + public void setXcxOpenId(String xcxOpenId) + { + this.xcxOpenId = xcxOpenId; + } + + public String getGzhOpenId() + { + return gzhOpenId; + } + + + public void setGzhOpenId(String gzhOpenId) + { + this.gzhOpenId = gzhOpenId; + } + + public String getUnionId() + { + return unionId; + } + + public void setUnionId(String unionId) + { + this.unionId = unionId; + } + + public String getWxCode() + { + return wxCode; + } + + public void setWxCode(String wxCode) + { + this.wxCode = wxCode; + } + + public String getGzhCode() + { + return gzhCode; + } + + public void setGzhCode(String gzhCode) + { + this.gzhCode = gzhCode; + } + + public String getUrl() + { + return url; + } + + public void setUrl(String url) + { + this.url = url; + } + + public String getOpenId() + { + return openId; + } + + public void setOpenId(String openId) + { + this.openId = openId; + } + + public String getClueType() + { + return clueType; + } + + public void setClueType(String clueType) + { + this.clueType = clueType; + } + + public String getDataType() + { + return dataType; + } + + public void setDataType(String dataType) + { + this.dataType = dataType; + } + + public String getFromType() + { + return fromType; + } + + public void setFromType(String fromType) + { + this.fromType = fromType; + } + + public String getShareUser() + { + return shareUser; + } + + public void setShareUser(String shareUser) + { + this.shareUser = shareUser; + } + + } diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysRoleMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysRoleMapper.java index 979bf47..2943daa 100644 --- a/bs-system/src/main/java/com/bs/system/mapper/SysRoleMapper.java +++ b/bs-system/src/main/java/com/bs/system/mapper/SysRoleMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.bs.common.core.domain.entity.SysRole; import com.bs.common.mybatis.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.io.Serializable; @@ -15,6 +16,7 @@ import java.util.List; * * @author bs */ +@Mapper public interface SysRoleMapper extends BaseMapperX { diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysUserMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysUserMapper.java index 7ead97a..6bd81d1 100644 --- a/bs-system/src/main/java/com/bs/system/mapper/SysUserMapper.java +++ b/bs-system/src/main/java/com/bs/system/mapper/SysUserMapper.java @@ -3,6 +3,7 @@ package com.bs.system.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.bs.common.core.domain.entity.SysUser; import com.bs.common.mybatis.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -11,6 +12,7 @@ import java.util.List; * * @author bs */ +@Mapper public interface SysUserMapper extends BaseMapperX { /** diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysUserRoleMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysUserRoleMapper.java index 0ee4860..a4ef1a5 100644 --- a/bs-system/src/main/java/com/bs/system/mapper/SysUserRoleMapper.java +++ b/bs-system/src/main/java/com/bs/system/mapper/SysUserRoleMapper.java @@ -2,6 +2,7 @@ package com.bs.system.mapper; import com.bs.common.mybatis.mapper.BaseMapperX; import com.bs.system.domain.SysUserRole; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -11,6 +12,7 @@ import java.util.List; * * @author bs */ +@Mapper public interface SysUserRoleMapper extends BaseMapperX { /** diff --git a/bs-ui/package.json b/bs-ui/package.json index 132efff..fbca533 100644 --- a/bs-ui/package.json +++ b/bs-ui/package.json @@ -38,9 +38,11 @@ "dependencies": { "@riophae/vue-treeselect": "0.4.0", "axios": "0.24.0", + "bigint-buffer": "^1.1.5", "clipboard": "2.0.8", "core-js": "3.25.3", "echarts": "5.4.0", + "el-tree-transfer": "^2.4.7", "element-ui": "2.15.13", "file-saver": "2.0.5", "fuse.js": "6.4.3", diff --git a/bs-ui/src/api/common/file.js b/bs-ui/src/api/common/file.js index 8dc96df..4933e9a 100644 --- a/bs-ui/src/api/common/file.js +++ b/bs-ui/src/api/common/file.js @@ -37,6 +37,21 @@ export function download(fileName) { }) } +/** + * 下载文件 + * @param {*} fileName 文件名 + */ +export function fileDownloadById(attachId) { + return request({ + url: '/common/fileDownloadById', + method: 'GET', + params: { + attachId + }, + responseType: 'blob' + }) +} + /** * 通过fileId查找附件列表 * @param {*} fileId diff --git a/bs-ui/src/api/system/user.js b/bs-ui/src/api/system/user.js index 6d9facc..81cff83 100644 --- a/bs-ui/src/api/system/user.js +++ b/bs-ui/src/api/system/user.js @@ -18,6 +18,7 @@ export function listUserByType(query) { }) } + // 查询用户详细 export function getUser(userId) { return request({ diff --git a/bs-ui/src/components/FileUpload/BannerUpload.vue b/bs-ui/src/components/FileUpload/BannerUpload.vue index 9858973..c3fac15 100644 --- a/bs-ui/src/components/FileUpload/BannerUpload.vue +++ b/bs-ui/src/components/FileUpload/BannerUpload.vue @@ -14,7 +14,7 @@ - 添加照片 @@ -80,7 +80,7 @@ export default { }, data() { return { - action: process.env.VUE_APP_BASE_API + '/api/file/upload', + action: process.env.VUE_APP_BASE_API + '/common/upload', headers: { Authorization: 'Bearer ' + getToken(), }, @@ -94,7 +94,7 @@ export default { }, methods: { getFullImageUrl(item) { - return process.env.VUE_APP_BASE_API + item.attachFileurl; + return process.env.VUE_APP_BASE_API + item.attachFileUrl; }, beforeUpload(file) { const isImg = file.type.indexOf('image/') !== -1; @@ -119,12 +119,7 @@ export default { uploadSucess(response, file, fileList) { this.fileList = []; this.loading = false; - if (response.success) { - setTimeout(() => { - // 似乎后端有延迟,延迟一下获取最新数据 - this.getImages(); - }, 1000); - } + this.getImages(); }, handleRemove(item) { this.$confirm('是否确认删除当前照片', '提示', { @@ -133,11 +128,9 @@ export default { type: 'warning', }).then(() => { this.loading = true; - deleteAttach(item.attachId).then((res) => { + deleteAttach(item.id).then((res) => { this.loading = false; - if (res.status !== 200) return; this.getImages(); - this.msgSuccess('删除成功'); }); }).catch(() => { this.loading = false; diff --git a/bs-ui/src/components/FileUpload/PictureUpload.vue b/bs-ui/src/components/FileUpload/PictureUpload.vue index 6f61244..c8994db 100644 --- a/bs-ui/src/components/FileUpload/PictureUpload.vue +++ b/bs-ui/src/components/FileUpload/PictureUpload.vue @@ -12,11 +12,11 @@ :on-remove="handleRemove"> - - - - - + + \ No newline at end of file diff --git a/bs-ui/src/components/MyImageViewer/index.vue b/bs-ui/src/components/MyImageViewer/index.vue new file mode 100644 index 0000000..da91a08 --- /dev/null +++ b/bs-ui/src/components/MyImageViewer/index.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/bs-ui/src/main.js b/bs-ui/src/main.js index d6df0d8..0729add 100644 --- a/bs-ui/src/main.js +++ b/bs-ui/src/main.js @@ -33,6 +33,7 @@ import FileUpload from "@/components/FileUpload" import ImageUpload from "@/components/ImageUpload" // 图片预览组件 import ImagePreview from "@/components/ImagePreview" +import MyImageViewer from '@/components/MyImageViewer'; // 字典标签组件 import DictTag from '@/components/DictTag' // 头部标签组件 @@ -78,6 +79,7 @@ Vue.component('MyFormItem', MyFormItem) Vue.component('MySelectButton', MySelectButton) Vue.component('BannerUpload', BannerUpload) Vue.component('PictureUpload', PictureUpload) +Vue.component('MyImageViewer', MyImageViewer) Vue.use(directive) Vue.use(plugins) diff --git a/bs-ui/src/utils/index.js b/bs-ui/src/utils/index.js index 97be225..f1d9a4a 100644 --- a/bs-ui/src/utils/index.js +++ b/bs-ui/src/utils/index.js @@ -1,5 +1,41 @@ import { parseTime } from './bs' + +export function downloadFile(obj, name, suffix) { + let reader = new FileReader(); + let resObj; + reader.readAsText(obj, 'utf-8'); + reader.onload = () => { + try { + resObj = JSON.parse(reader.result); + // 如果转换成功说明后端已经抛出异常 + this.$message.error(resObj.msg) + } catch (e) { + // 转换异常说明是正常的文件流 + oldDownloadFile(obj, name, suffix); + } + } +} + +function oldDownloadFile(obj, name, suffix) { + const url = window.URL.createObjectURL(new Blob([obj])) + const link = document.createElement('a') + link.style.display = 'none' + link.href = url + // const fileName = formatDate(new Date()) + '-' + name + '.' + suffix + const _suffix = '.' + suffix + let fileName + if (suffix) { + fileName = name + _suffix + } else { + fileName = name + } + link.setAttribute('download', fileName) + document.body.appendChild(link) + link.click() + document.body.removeChild(link) +} + /** * 表格时间格式化 */ @@ -23,7 +59,7 @@ export function formatDateToDataStr(data) { const year = curData.getFullYear() const month = curData.getMonth() + 1 < 10 ? '0' + (curData.getMonth() + 1) : curData.getMonth() + 1 const day = curData.getDate() < 10 ? '0' + curData.getDate() : curData.getDate() - + return year + '-' + month + '-' + day; } @@ -441,4 +477,4 @@ export function getDaysBetweenDate(d1, d2 = '') { const t2 = (new Date(s2)).getTime(); const time = t1 - t2; return parseInt(time / (1000 * 60 * 60 * 24)); -} \ No newline at end of file +} diff --git a/bs-ui/src/views/article/article/index.vue b/bs-ui/src/views/article/article/index.vue index a1afdee..94d6c25 100644 --- a/bs-ui/src/views/article/article/index.vue +++ b/bs-ui/src/views/article/article/index.vue @@ -251,6 +251,11 @@ + + + + +