修改产品信息

master
username 10 months ago
parent d6027d1dbd
commit 7297c23585

@ -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 */

@ -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<DfBizClue> queryWrapper = new LambdaQueryWrapper();
// condition(queryWrapper,dfBizClue);
List<DfBizClue> list = dfBizClueService.list(queryWrapper);
Map<String, Integer> 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<String, DfBizClue> 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<DfBizClue> 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<DfBizClue> 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<DfBizClue> 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<DfBizClue> list = dfBizClueService.list(queryWrapper);
List<DfBizClue> uniqueList = list.stream()
.collect(Collectors.toMap(
DfBizClue::getUserId, // 指定键的抽取函数
dfBizClueVo -> dfBizClueVo, // 指定值的映射函数
(existing, replacement) -> existing // 处理重复键的方式,这里选择保留第一个出现的元素
))
.values()
.stream()
.collect(Collectors.toList());
List<String> 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());
}
}

@ -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<Long, String> userIdToNameMap = userList.stream()
.collect(Collectors.toMap(SysUser::getUserId, SysUser::getUserName));
Map<Long, String> userIdToPhoneMap = userList.stream()
.collect(Collectors.toMap(SysUser::getUserId, SysUser::getPhonenumber));
Map<Long, String> 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));
}
/**
*
*/

@ -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<CmAttach> attachVo = cmAttachService.list();
Map<String, List<CmAttach>> 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<CmAttach> 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<CmAttach> attachVo = cmAttachService.list(new LambdaQueryWrapper<CmAttach>().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<DfProductArticle> 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<Long> ids) {
public AjaxResult remove(@PathVariable List<String> ids) {
return toAjax(dfProductArticleService.removeBatchByIds(ids));
}

@ -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<DfProductInfo> list = dfProductInfoService.list(queryWrapper);
List<DfOrder> dfOrders = dfOrderService.list();
Map<Long, Integer> 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<String, String> cityMap = new HashMap<>();
List<DfArea> 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<DfBrokerProduct> list = dfBrokerProductService.list(new LambdaQueryWrapper<DfBrokerProduct>().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));
}

@ -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<DfProductMoment> queryWrapper = new LambdaQueryWrapper();
condition(queryWrapper,dfProductMoment);
List<DfProductMoment> list = dfProductMomentService.list(queryWrapper);
List<CmAttach> attachVo = cmAttachService.list();
Map<String, List<CmAttach>> 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<CmAttach> 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<CmAttach> attachVo = cmAttachService.list(new LambdaQueryWrapper<CmAttach>().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<DfProductMoment> 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<Long> ids) {
public AjaxResult remove(@PathVariable List<String> ids) {
return toAjax(dfProductMomentService.removeBatchByIds(ids));
}

@ -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<DfProductPoster> list = dfProductPosterService.list(queryWrapper);
List<CmAttach> attachVo = cmAttachService.list();
Map<String, List<CmAttach>> attachMap = attachVo.stream()
.filter(cmAttach -> cmAttach.getFileId() != null)
.collect(Collectors.groupingBy(CmAttach::getFileId));
for (DfProductPoster dfProductPosterVo : list) {
String id = dfProductPosterVo.getId();
List<CmAttach> 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<CmAttach> attachVo = cmAttachService.list(new LambdaQueryWrapper<CmAttach>().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<DfProductPoster> 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<Long> ids) {
public AjaxResult remove(@PathVariable List<String> ids) {
return toAjax(dfProductPosterService.removeBatchByIds(ids));
}

@ -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<String> avatarLinks;
/**
* 012
*
* */
@TableField(exist = false)
private String classify;
@TableField(exist = false)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" )
private Date createTimeVo;
}

@ -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;

@ -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<CmAttach> files;
}

@ -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;

@ -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<CmAttach> files;
}

@ -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<CmAttach> files;
}

@ -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<DfBizClue> {
Boolean insertClue(@Param("dfBizClue") DfBizClue dfBizClue);
}

@ -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<DfOrder> {
Boolean insertOrder(@Param("dfOrder")DfOrder dfOrder);
}

@ -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);
}

@ -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<SysUser>().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;
}
/**
*
* CodewxCode
*
* @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<SysUser>().eq(SysUser::getGzhOpenId, gzhJo.getString("openId")));
if (tempUser!=null) {
return AjaxResult.error("此微信已被绑定");
}
SysUser updateUser = new SysUser();
updateUser.setXcxOpenId("");
sysUserMapper.update(updateUser,new LambdaUpdateWrapper<SysUser>().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);
}
/**
*
* CodewxCode
*
* @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<SysUser> lsUser = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().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<TenantConfig>().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<SysUserRole> userRoleWrapper = new LambdaQueryWrapper<>();
userRoleWrapper.select(SysUserRole::getRoleId);
userRoleWrapper.eq(SysUserRole::getUserId,user.getUserId());
List<Object> roleIds = sysUserRoleMapper.selectObjs(userRoleWrapper);
//查询用户下的权限
LambdaQueryWrapper<SysRole> 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<SysMenu> 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<String, String> getConfig(LoginBody loginBody)
{
Map<String, String> config = weiXinUtil.getConfig(loginBody.getUrl());
return config;
}
}

@ -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<SysUser> list = userService.list(wrapper);
List<DfBroker> dfBrokers = dfBrokerService.list();
List<DfArea> dfAreas = dfAreaService.list();
List<CmAttach> attachVo = cmAttachService.list();
Map<String, List<CmAttach>> attachMap = attachVo.stream()
.filter(cmAttach -> cmAttach.getFileId() != null)
.collect(Collectors.groupingBy(CmAttach::getFileId));
Map<Long, String> map = dfBrokers.stream().collect(Collectors.toMap(DfBroker::getId, DfBroker::getBrokerName));
Map<String, String> 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<CmAttach> 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<DfBroker> list = dfBrokerService.list(new LambdaQueryWrapper<DfBroker>().eq(DfBroker::getParentId, deptId));
List<Long> idList = list.stream()
.map(DfBroker::getId)
.collect(Collectors.toList());
if (idList.isEmpty()) {
idList.add(0L);
}
startPage();
List<SysUser> sysUsers = userService.list(new LambdaQueryWrapper<SysUser>()
.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<CmAttach> attachVo = cmAttachService.list(new LambdaQueryWrapper<CmAttach>().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());

@ -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.*;
/**
*
* <br>
* WeiXinUtil <br>
*
*
* @author Tjw
* @date 201987 3:21:16
*/
@Slf4j
@Component
public class SignUtil {
public static Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = "";
//注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"&timestamp=" + 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);
}
}

@ -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;
}
/**
* <br>
* <br>
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277
*
* @param templateKey
* @param openId openIdopenId
* @param path path
* @param values values
* @return
* @throws Exception
* @date: 201995 2:45:19
* @author Tjw
*/
public boolean sendOpenIdToTemplateMessage(String templateKey,String openId,String path, List<String> 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<String> list = new ArrayList<>();
list.add("123");
list.add("456");
list.add("789");
list.add("10");
list.add("abc");
//sendOpenIdToTemplateMessage("kc6ADrWzxuFxVsvgKqM5V255LGCMe1DXg40S1CmL3Uc","otHaO4u_ISeXjLrTr3TZ5H_t0ZBw","",list);
}
}

File diff suppressed because it is too large Load Diff

@ -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 = " <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<Root>\n" +
" <Corporation Name=\"三明市***电脑贸易有限公司\"/>\n" +
" <Corporation Name=\"三明市**运输有限公司\"/>\n" +
" <Corporation Name=\"东山县****有限公司\"/>\n" +
" <Corporation Name=\"中科**(福建)****有限公司\"/>\n" +
" <Corporation Name=\"仙游县*****铜门加工厂\"/>\n" +
" <Corporation Name=\"光泽县****开发有限公司\"/>\n" +
" <Corporation Name=\"南安市******有限公司\"/>\n" +
" <Corporation Name=\"南安市****加工厂\"/>\n" +
" <Corporation Name=\"南安****有限公司\"/>\n" +
" <Corporation Name=\"南靖县******有限公司\"/>\n" +
"</Root>";
String s = convertXmlToJson(jsapi_ticket);
Map<String, Object> 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<String, Object> nestedMapNts = (LinkedHashMap<String, Object>) messageJson;
LinkedHashMap<String, LinkedHashMap<String, Object>> nestedMapInfo = (LinkedHashMap<String, LinkedHashMap<String, Object>>) messageJson;
Object corporation = nestedMapNts.get("Corporation");
try {
JSONArray jsonArray = new JSONArray(corporation);
List<String> 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<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = "";
//注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"&timestamp=" + 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;
}
}

@ -4,4 +4,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bs.df.mapper.DfBizClueMapper">
<insert id="insertClue" parameterType="com.bs.df.domain.DfBizClue">
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})
</insert>
</mapper>

@ -4,4 +4,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bs.df.mapper.DfOrderMapper">
<insert id="insertOrder" parameterType="com.bs.df.domain.DfOrder">
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})
</insert>
</mapper>

@ -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";
/**
*
*/

@ -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;
}

@ -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;
}
}

@ -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<SysRole>
{

@ -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<SysUser> {
/**

@ -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<SysUserRole>
{
/**

@ -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",

@ -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

@ -18,6 +18,7 @@ export function listUserByType(query) {
})
}
// 查询用户详细
export function getUser(userId) {
return request({

@ -14,7 +14,7 @@
<el-pagination layout="prev, pager, next" hide-on-single-page small :current-page="currentPage" :page-size="1"
:total="imageDatas.length" @current-change="currentPageChange">
</el-pagination>
<el-upload style="margin-top: 10px;" v-if="imageDatas.length < maxLength && !readonly" :action="action" :headers="headers" name="files" accept="image"
<el-upload style="margin-top: 10px;" v-if="imageDatas.length < maxLength && !readonly" :action="action" :headers="headers" name="file" accept="image"
:data="{ fileId: bannerId, businessUnits: businessUnits }" :disabled="!bannerId" :before-upload="beforeUpload" multiple :limit="limit"
:show-file-list="false" :file-list="fileList" :on-success="uploadSucess">
<el-button size="small" type="primary">添加照片</el-button>
@ -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;

@ -12,11 +12,11 @@
:on-remove="handleRemove">
<i class="el-icon-plus"></i>
</el-upload>
<!-- <my-image-viewer ref="previewImage" v-model="fileList" :options="{-->
<!-- edit: !readonly,-->
<!-- check: !readonly,-->
<!-- delete: !readonly,-->
<!-- }"></my-image-viewer>-->
<my-image-viewer ref="previewImage" v-model="fileList" :options="{
edit: !readonly,
check: !readonly,
delete: !readonly,
}"></my-image-viewer>
</div>
</template>
<script>
@ -126,7 +126,7 @@ export default {
});
},
handlePreview(item,) {
const index = this.fileList.findIndex(val => val.attachId === item.attachId);
const index = this.fileList.findIndex(val => val.id === item.id);
this.$refs.previewImage.open(index);
// this.previewUrl = item.url;
// this.$nextTick(() => {

@ -0,0 +1,385 @@
<template>
<transition name="viewer-fade">
<div tabindex="-1" ref="el-image-viewer__wrapper" class="el-image-viewer__wrapper"
:style="{ 'z-index': viewerZIndex }">
<div class="el-image-viewer__mask" @click.self="handleMaskClick"></div>
<!-- CLOSE -->
<span class="el-image-viewer__btn el-image-viewer__close" @click="hide">
<i class="el-icon-close"></i>
</span>
<!-- ARROW -->
<template v-if="!isSingle">
<span class="el-image-viewer__btn el-image-viewer__prev" :class="{ 'is-disabled': !infinite && isFirst }"
@click="prev">
<i class="el-icon-arrow-left" />
</span>
<span class="el-image-viewer__btn el-image-viewer__next" :class="{ 'is-disabled': !infinite && isLast }"
@click="next">
<i class="el-icon-arrow-right" />
</span>
</template>
<!-- ACTIONS -->
<div v-loading="toolLoading" class="el-image-viewer__btn el-image-viewer__actions" style="width: auto;">
<div class="el-image-viewer__actions__inner i__space">
<i class="el-icon-zoom-out" @click="handleActions('zoomOut')"></i>
<i class="el-icon-zoom-in" @click="handleActions('zoomIn')"></i>
<i class="el-image-viewer__actions__divider"></i>
<i :class="mode.icon" @click="toggleMode"></i>
<i class="el-image-viewer__actions__divider"></i>
<i class="el-icon-refresh-left" @click="handleActions('anticlocelise')"></i>
<i class="el-icon-refresh-right" @click="handleActions('clocelise')"></i>
<i class="el-icon-download" v-if="extraOptions.download" @click="handleExtraActions('download')"></i>
<i class="el-icon-printer" v-if="extraOptions.print" @click="handleExtraActions('print')"></i>
<el-popover v-if="extraOptions.edit" v-model="nameVisible" placement="top" title="修改附件名称" width="300"
trigger="click">
<el-input v-model="filename" placeholder="输入附件名称" style="margin-bottom: 20px;"></el-input>
<div style="text-align: right; margin: 0">
<el-button size="mini" type="text" @click="nameVisible = false">取消</el-button>
<el-button type="primary" size="mini" @click="handleExtraActions('edit')"></el-button>
</div>
<i class="el-icon-edit" slot="reference" style="margin-left: 15px;"></i>
</el-popover>
<el-popconfirm v-if="extraOptions.check" title="保存当前图片方向吗?" @confirm="handleExtraActions('check')">
<i class="el-icon-check" slot="reference" style="margin-left: 15px;"></i>
</el-popconfirm>
<el-popconfirm v-if="extraOptions.delete" title="确定删除当前图片附件吗?" @confirm="handleExtraActions('delete')">
<i class="el-icon-delete-solid" slot="reference" style="margin-left: 25px;"></i>
</el-popconfirm>
</div>
</div>
<!-- CANVAS -->
<div class="el-image-viewer__canvas">
<img v-for="(url, i) in urlList" v-if="i === index" ref="img" class="el-image-viewer__img" :key="url"
:src="currentImg" :style="imgStyle" @load="handleImgLoad" @error="handleImgError" @mousedown="handleMouseDown">
</div>
</div>
</transition>
</template>
<script>
import { on, off } from 'element-ui/src/utils/dom';
import { rafThrottle, isFirefox } from 'element-ui/src/utils/util';
import { PopupManager } from 'element-ui/lib/utils/popup';
const Mode = {
CONTAIN: {
name: 'contain',
icon: 'el-icon-full-screen'
},
ORIGINAL: {
name: 'original',
icon: 'el-icon-c-scale-to-original'
}
};
const mousewheelEventName = isFirefox() ? 'DOMMouseScroll' : 'mousewheel';
export default {
name: 'elImageViewer',
props: {
urlList: {
type: Array,
default: () => []
},
nameList: {
type: Array,
default: () => []
},
zIndex: {
type: Number,
default: 2000
},
onSwitch: {
type: Function,
default: () => { }
},
onClose: {
type: Function,
default: () => { }
},
initialIndex: {
type: Number,
default: 0
},
appendToBody: {
type: Boolean,
default: true
},
maskClosable: {
type: Boolean,
default: true
},
options: {
type: Object,
default: () => ({ })
},
toolLoading: false,
},
data() {
return {
index: this.initialIndex,
isShow: false,
infinite: true,
loading: false,
mode: Mode.CONTAIN,
transform: {
scale: 1,
deg: 0,
offsetX: 0,
offsetY: 0,
enableTransition: false
},
nameVisible: false,
filename: this.nameList[this.initialIndex] || '',
};
},
computed: {
extraOptions() {
return Object.assign({
download: true,
print: true,
edit: false,
check: false,
delete: false,
}, this.options);
},
isSingle() {
return this.urlList.length <= 1;
},
isFirst() {
return this.index === 0;
},
isLast() {
return this.index === this.urlList.length - 1;
},
currentImg() {
return this.urlList[this.index];
},
imgStyle() {
const { scale, deg, offsetX, offsetY, enableTransition } = this.transform;
const style = {
transform: `scale(${scale}) rotate(${deg}deg)`,
transition: enableTransition ? 'transform .3s' : '',
'margin-left': `${offsetX}px`,
'margin-top': `${offsetY}px`
};
if (this.mode === Mode.CONTAIN) {
style.maxWidth = style.maxHeight = '100%';
}
return style;
},
viewerZIndex() {
const nextZIndex = PopupManager.nextZIndex();
return this.zIndex > nextZIndex ? this.zIndex : nextZIndex;
}
},
watch: {
nameList: {
handler(val) {
if (val && val.length) {
this.filename = val[this.index];
}
}
},
index: {
handler: function (val) {
this.reset();
this.onSwitch(val);
if (val >= 0 && this.nameList && this.nameList.length) {
this.filename = this.nameList[val];
}
}
},
currentImg(val) {
this.$nextTick(_ => {
const $img = this.$refs.img[0];
if (!$img.complete) {
this.loading = true;
}
});
}
},
methods: {
hide() {
this.deviceSupportUninstall();
this.onClose();
},
deviceSupportInstall() {
this._keyDownHandler = e => {
e.stopPropagation();
const keyCode = e.keyCode;
switch (keyCode) {
// ESC
case 27:
this.hide();
break;
// SPACE
case 32:
this.toggleMode();
break;
// LEFT_ARROW
case 37:
this.prev();
break;
// UP_ARROW
case 38:
this.handleActions('zoomIn');
break;
// RIGHT_ARROW
case 39:
this.next();
break;
// DOWN_ARROW
case 40:
this.handleActions('zoomOut');
break;
}
};
this._mouseWheelHandler = rafThrottle(e => {
const delta = e.wheelDelta ? e.wheelDelta : -e.detail;
if (delta > 0) {
this.handleActions('zoomIn', {
zoomRate: 0.015,
enableTransition: false
});
} else {
this.handleActions('zoomOut', {
zoomRate: 0.015,
enableTransition: false
});
}
});
on(document, 'keydown', this._keyDownHandler);
on(document, mousewheelEventName, this._mouseWheelHandler);
},
deviceSupportUninstall() {
off(document, 'keydown', this._keyDownHandler);
off(document, mousewheelEventName, this._mouseWheelHandler);
this._keyDownHandler = null;
this._mouseWheelHandler = null;
},
handleImgLoad(e) {
this.loading = false;
},
handleImgError(e) {
this.loading = false;
e.target.alt = '加载失败';
},
handleMouseDown(e) {
if (this.loading || e.button !== 0) return;
const { offsetX, offsetY } = this.transform;
const startX = e.pageX;
const startY = e.pageY;
this._dragHandler = rafThrottle(ev => {
this.transform.offsetX = offsetX + ev.pageX - startX;
this.transform.offsetY = offsetY + ev.pageY - startY;
});
on(document, 'mousemove', this._dragHandler);
on(document, 'mouseup', ev => {
off(document, 'mousemove', this._dragHandler);
});
e.preventDefault();
},
handleMaskClick() {
if (this.maskClosable) {
this.hide();
}
},
reset() {
this.transform = {
scale: 1,
deg: 0,
offsetX: 0,
offsetY: 0,
enableTransition: false
};
},
toggleMode() {
if (this.loading) return;
const modeNames = Object.keys(Mode);
const modeValues = Object.values(Mode);
const index = modeValues.indexOf(this.mode);
const nextIndex = (index + 1) % modeNames.length;
this.mode = Mode[modeNames[nextIndex]];
this.reset();
},
prev() {
if (this.isFirst && !this.infinite) return;
const len = this.urlList.length;
this.index = (this.index - 1 + len) % len;
},
next() {
if (this.isLast && !this.infinite) return;
const len = this.urlList.length;
this.index = (this.index + 1) % len;
},
handleActions(action, options = {}) {
if (this.loading) return;
const { zoomRate, rotateDeg, enableTransition } = {
zoomRate: 0.2,
rotateDeg: 90,
enableTransition: true,
...options
};
const { transform } = this;
switch (action) {
case 'zoomOut':
if (transform.scale > 0.2) {
transform.scale = parseFloat((transform.scale - zoomRate).toFixed(3));
}
break;
case 'zoomIn':
transform.scale = parseFloat((transform.scale + zoomRate).toFixed(3));
break;
case 'clocelise':
transform.deg += rotateDeg;
break;
case 'anticlocelise':
transform.deg -= rotateDeg;
break;
}
transform.enableTransition = enableTransition;
},
handleExtraActions(action) {
let deg = this.transform.deg % 360;
if (deg < 0) {
deg += 360;
}
const params = {
index: this.index,
deg: deg,
filename: this.filename,
}
this.$emit(action, params);
this.nameVisible = false;
},
},
mounted() {
this.deviceSupportInstall();
if (this.appendToBody) {
document.body.appendChild(this.$el);
}
// add tabindex then wrapper can be focusable via Javascript
// focus wrapper so arrow key can't cause inner scroll behavior underneath
this.$refs['el-image-viewer__wrapper'].focus();
},
destroyed() {
// if appendToBody is true, remove DOM node after destroy
if (this.appendToBody && this.$el && this.$el.parentNode) {
this.$el.parentNode.removeChild(this.$el);
}
}
};
</script>
<style lang="scss" scoped>
.i__space {
i+i {
margin-left: 15px;
}
}
</style>

@ -0,0 +1,149 @@
<template>
<image-viewer v-if="show" ref="viewer" :tool-loading="loading" :options="options"
:name-list="files.map(val => val.oldName)" :url-list="srcList" :initial-index="initialIndex"
:on-switch="onSwitch" @download="download" @print="print" @edit="edit" @check="check"
@delete="deleteImage" :onClose="close"></image-viewer>
</template>
<script>
import ImageViewer from './image-viewer';
// import {update, fileDownload, deleteFile} from '@/api/system/file';
import {getAttachList,deleteFile as deleteFile,download as fileDownload,fileDownloadById} from "@/api/common/file";
import {downloadFile} from '@/utils';
export default {
name: 'MyImageViewer',
components: {
ImageViewer,
},
props: {
// options
// download: true,
// print: true,
// edit: false,
// check: false,
options: {
type: Object,
default: () => ({})
},
files: {
type: Array,
default: () => []
},
},
model: {
event: 'change',
prop: 'files',
},
data() {
return {
show: false,
initialIndex: 0,
loading: false,
};
},
computed: {
srcList() {
return this.files.map(val => process.env.VUE_APP_BASE_API + val.attachFileUrl);
}
},
methods: {
close() {
this.show = false;
},
open(index) {
this.initialIndex = index;
this.$nextTick(() => {
this.show = true;
});
},
// index
onSwitch(index) {
},
//
download(params) {
const {index} = params;
const item = this.files[index];
this.loading = true;
fileDownloadById(item.id).then((res) => {
const url = process.env.VUE_APP_BASE_API + item.attachFileUrl;
downloadFile(res, item.oldName);
this.loading = false;
}).catch(e => {
this.loading = false;
});
},
//
print(params) {
this.$print(this.$refs.viewer.$refs.img[0], {});
},
//
edit(params) {
const {filename, index} = params;
const item = this.files[index];
this.loading = true;
update({
attachId: item.attachId,
refId: item.refId,
oldName: filename,
}).then(res => {
this.loading = false;
item.oldName = filename;
item.name = filename;
this.$emit('change', [...this.files]);
this.$message.success('保存成功');
}).catch(e => {
this.loading = false;
});
},
//
check(params) {
const {deg, index} = params;
if (deg === 0) return;
const item = this.files[index];
this.loading = true;
update({
attachId: item.attachId,
refId: item.refId,
angle: deg,
}).then(res => {
this.loading = false;
item.attachFileurl = res.data.attachFileurl;
item.url = process.env.VUE_APP_BASE_API + res.data.attachFileurl;
// this.files[index] = res.data;
this.$emit('change', [...this.files]);
this.$refs.viewer && this.$refs.viewer.reset();
this.$message.success('保存成功');
}).catch(e => {
this.loading = false;
});
},
deleteImage(params) {
const {index} = params;
const item = this.files[index];
this.loading = true;
deleteFile(item.attachId).then(res => {
this.loading = false;
const newList = this.files.filter(val => {
return item.attachId !== val.attachId;
});
this.$emit('change', newList);
if (this.initialIndex > 0) {
//
this.initialIndex -= 1;
}
if (newList.length === 0) {
//
this.show = false;
}
this.$message.success('删除成功');
}).catch(e => {
this.loading = false;
});
}
}
}
</script>
<style></style>

@ -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)

@ -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));
}
}

@ -251,6 +251,11 @@
</el-form-item>
</el-col>
</el-row>
<el-form-item label="上传" prop="field">
<el-form :model="form">
<PictureUpload :biz-id="form.id" ></PictureUpload>
</el-form>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@ -263,6 +268,7 @@
<script>
import {pageListArticle, getArticle, delArticle, addArticle, updateArticle,changeStatusByArticle} from "@/api/article/article";
import {changeStatus} from "@/api/product/info";
import {addMoment, updateMoment} from "@/api/moment/moment";
export default {
name: "Article",
@ -414,6 +420,9 @@ export default {
this.open = true;
this.form.publishTime = new Date();
this.title = "添加产品文章";
const { v4: uuidv4 } = require('uuid');
const uniqueID = uuidv4().replace(/-/g, '');
this.$set(this.form, 'id', uniqueID);
},
/** 修改按钮操作 */
handleUpdate(row) {
@ -429,7 +438,21 @@ export default {
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
// if (this.form.id != null) {
// updateArticle(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// } else {
// addArticle(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// }
if (this.title.indexOf('修改') !== -1) {
updateArticle(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;

@ -1,9 +1,9 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="数据类型" prop="dataType">
<el-select v-model="queryParams.dataType" placeholder="选择数据类型" clearable @keyup.enter.native="handleQuery">
<el-option v-for="dict in dict.type.data_type" :key="dict.value" :label="dict.label"
<el-form-item label="线索类型" prop="dataType">
<el-select v-model="queryParams.dataType" placeholder="选择线索类型" clearable @keyup.enter.native="handleQuery">
<el-option v-for="dict in dict.type.clue_type" :key="dict.value" :label="dict.label"
:value="dict.value"/>
</el-select>
</el-form-item>
@ -41,41 +41,41 @@
</el-form>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="primary"-->
<!-- plain-->
<!-- icon="el-icon-plus"-->
<!-- size="mini"-->
<!-- @click="handleAdd"-->
<!-- v-hasPermi="['biz:clue:add']"-->
<!-- >新增-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="success"-->
<!-- plain-->
<!-- icon="el-icon-edit"-->
<!-- size="mini"-->
<!-- :disabled="single"-->
<!-- @click="handleUpdate"-->
<!-- v-hasPermi="['biz:clue:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="danger"-->
<!-- plain-->
<!-- icon="el-icon-delete"-->
<!-- size="mini"-->
<!-- :disabled="multiple"-->
<!-- @click="handleDelete"-->
<!-- v-hasPermi="['biz:clue:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['biz:clue:add']"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['biz:clue:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['biz:clue:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
@ -95,17 +95,23 @@
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="数据类型" align="center" prop="dataType" sortable='custom'>
<template slot-scope="scope">
<dict-tag :options="dict.type.data_type" :value="scope.row.dataType"/>
<dict-tag :options="dict.type.product_classify" :value="scope.row.dataType"/>
</template>
</el-table-column>
<el-table-column label="线索类型" align="center" prop="clueType" sortable='custom'>
<template slot-scope="scope">
<dict-tag :options="dict.type.clue_type" :value="scope.row.clueType"/>
</template>
</el-table-column>
<el-table-column label="线索类型" align="center" prop="clueType" sortable='custom'/>
<el-table-column label="用户昵称" align="center" prop="nickName" sortable='custom'/>
<el-table-column label="浏览时间" align="center" prop="browseTime" width="180" sortable='custom'>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.browseTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="${comment}" align="center" prop="业务链接" sortable='custom'/>
<el-table-column label="业务链接" align="center" prop="businessLinks" sortable='custom'/>
<el-table-column label="头像链接" align="center" prop="avatarLink" sortable='custom' />
<el-table-column label="手机号" align="center" prop="phone" sortable='custom' />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
@ -129,7 +135,6 @@
</el-table>
<pagination
hide-on-single-page
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@ -139,14 +144,38 @@
<!-- 添加或修改业务线索对话框 -->
<el-dialog :title="title" :visible.sync="open" width="70%" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-col :span="12">
<el-form-item label="数据类型0客户1经纪" prop="dataType">
<el-select v-model="form.dataType" placeholder="请选择数据类型0客户1经纪">
<el-option
v-for="dict in dict.type.product_classify"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="线索类型" prop="clueType">
<el-select v-model="form.clueType" placeholder="请选择线索类型">
<el-option
v-for="dict in dict.type.clue_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户id" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户id"/>
<el-input v-model="form.userId" placeholder="请输入用户id" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户昵称"/>
<el-input v-model="form.nickName" placeholder="请输入用户昵称" />
</el-form-item>
</el-col>
<el-col :span="12">
@ -160,8 +189,18 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="${comment}" prop="业务链接">
<el-input v-model="form." placeholder="请输入${comment}"/>
<el-form-item label="头像链接" prop="avatarLink">
<el-input v-model="form.avatarLink" placeholder="请输入头像链接" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手机号" prop="phone">
<el-input v-model="form.phone" placeholder="请输入手机号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="业务链接" prop="businessLinks">
<el-input v-model="form.businessLinks" placeholder="请输入业务链接"/>
</el-form-item>
</el-col>
</el-form>
@ -178,7 +217,7 @@ import {pageListClue, getClue, delClue, addClue, updateClue} from "@/api/biz/clu
export default {
name: "Clue",
dicts: ["data_type"],
dicts: ["data_type","product_classify","clue_type"],
data() {
return {
dateRange: [],
@ -211,7 +250,7 @@ export default {
userId: null,
nickName: null,
browseTime: null,
业务链接: null
businessLinks: null
},
//
form: {},
@ -232,9 +271,9 @@ export default {
browseTime: [
{required: true, message: "浏览时间不能为空", trigger: "blur"}
],
业务链接: [
{required: true, message: "$comment不能为空", trigger: "blur"}
]
// businessLinks: [
// {required: true, message: "", trigger: "blur"}
// ]
}
};
},
@ -267,7 +306,7 @@ export default {
userId: null,
nickName: null,
browseTime: null,
业务链接: null
businessLinks: null
};
this.resetForm("form");
},

@ -3,43 +3,43 @@
<el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="用户名称" prop="userName">
<el-input
v-model="queryParams.userName"
placeholder="请输入用户名称"
clearable
@keyup.enter.native="handleQuery"
v-model="queryParams.userName"
placeholder="请输入用户名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input
v-model="queryParams.phonenumber"
placeholder="请输入手机号码"
clearable
@keyup.enter.native="handleQuery"
v-model="queryParams.phonenumber"
placeholder="请输入手机号码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="用户状态"
clearable
v-model="queryParams.status"
placeholder="用户状态"
clearable
>
<el-option
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.label"
:value="dict.value"
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="dateRange"
style="width: 200px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
v-model="dateRange"
style="width: 200px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
@ -51,37 +51,37 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
:disabled="!deptId"
v-hasPermi="['system:user:add']"
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
:disabled="!deptId"
v-hasPermi="['system:user:add']"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:user:edit']"
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:user:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:user:remove']"
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:user:remove']"
>删除
</el-button>
</el-col>
@ -97,12 +97,12 @@
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:user:export']"
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:user:export']"
>导出
</el-button>
</el-col>
@ -113,20 +113,22 @@
<el-table-column type="selection" width="50" align="center"/>
<el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible"
:show-overflow-tooltip="true" fixed="left"/>
<el-table-column label="所属代理商" align="center" prop="deptName" :show-overflow-tooltip="true" width="120"/>
<el-table-column label="所属代理商" align="center" prop="deptName" :show-overflow-tooltip="true" width="120"/>
<el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible"/>
<el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible"
:show-overflow-tooltip="true"/>
<el-table-column label="简介" align="center" prop="userDesc" show-overflow-tooltip/>
<el-table-column label="简介" align="center" prop="userDesc" show-overflow-tooltip/>
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible"
width="120"/>
<el-table-column label="地址" align="center" prop="address" sortable='custom'/>
<el-table-column label="公司" align="center" prop="company" sortable='custom'/>
<el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
active-value="0"
inactive-value="1"
@change="handleStatusChange(scope.row)"
v-model="scope.row.status"
active-value="0"
inactive-value="1"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
@ -136,27 +138,27 @@
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
width="160"
class-name="small-padding fixed-width"
fixed="right"
label="操作"
align="center"
width="160"
class-name="small-padding fixed-width"
fixed="right"
>
<template slot-scope="scope" v-if="scope.row.userId !== 1&&scope.row.isTenantAdmin !=='Y'">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:user:edit']"
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:user:edit']"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:user:remove']"
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:user:remove']"
>删除
</el-button>
<el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)"
@ -175,10 +177,10 @@
</el-table-column>
</el-table>
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改代理商经纪对话框 -->
@ -192,8 +194,9 @@
</el-col>
<el-col :span="12">
<el-form-item label="归属部门" prop="deptId">
<treeselect v-model="form.deptId" :options="brokerList" props="lable" :show-count="true" :defaultExpandLevel="Infinity"
placeholder="请选择归属部门" :normalizer="tenantIdnormalizer" />
<treeselect v-model="form.deptId" :options="brokerList" props="lable" :show-count="true"
:defaultExpandLevel="Infinity"
placeholder="请选择归属部门" :normalizer="tenantIdnormalizer"/>
</el-form-item>
</el-col>
</el-row>
@ -211,12 +214,12 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName">
<el-form-item v-if="title == '添加用户'" label="用户名称" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
<el-form-item v-if="title == '添加用户'" label="用户密码" prop="password">
<el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password/>
</el-form-item>
</el-col>
@ -226,10 +229,10 @@
<el-form-item label="用户性别">
<el-select v-model="form.sex" placeholder="请选择性别" style="width: 100%">
<el-option
v-for="dict in dict.type.sys_user_sex"
:key="dict.value"
:label="dict.label"
:value="dict.value"
v-for="dict in dict.type.sys_user_sex"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
@ -238,9 +241,9 @@
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.value"
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
@ -252,11 +255,11 @@
<el-form-item label="岗位">
<el-select v-model="form.postIds" multiple placeholder="请选择岗位" style="width: 100%">
<el-option
v-for="item in postOptions"
:key="item.postId"
:label="item.postName"
:value="item.postId"
:disabled="item.status == 1"
v-for="item in postOptions"
:key="item.postId"
:label="item.postName"
:value="item.postId"
:disabled="item.status == 1"
></el-option>
</el-select>
</el-form-item>
@ -265,16 +268,28 @@
<el-form-item label="角色">
<el-select v-model="form.roleIds" multiple placeholder="请选择角色" style="width: 100%">
<el-option
v-for="item in roleOptions"
:key="item.roleId"
:label="item.roleName"
:value="item.roleId"
:disabled="item.status == 1"
v-for="item in roleOptions"
:key="item.roleId"
:label="item.roleName"
:value="item.roleId"
:disabled="item.status == 1"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="地址" prop="address">
<el-input v-model="form.address" placeholder="请输入地址"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="公司" prop="company">
<el-input v-model="form.company" placeholder="请输入公司"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="简介" prop="userDesc">
@ -295,7 +310,6 @@
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
@ -499,10 +513,10 @@ export default {
getList() {
this.loading = true;
listUserByType(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
this.userList = response.rows;
this.total = response.total;
this.loading = false;
}
this.userList = response.rows;
this.total = response.total;
this.loading = false;
}
);
},
/** 查询部门下拉树结构 */

@ -204,6 +204,11 @@
</el-form-item>
</el-col>
</el-row>
<el-form-item label="上传" prop="field">
<el-form :model="form">
<PictureUpload :biz-id="form.id" ></PictureUpload>
</el-form>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@ -215,6 +220,7 @@
<script>
import {pageListMoment, getMoment, delMoment, addMoment, updateMoment,changeStatusByMoment} from "@/api/moment/moment";
import {addPoster, updatePoster} from "@/api/poster/poster";
export default {
name: "Moment",
@ -358,6 +364,9 @@ export default {
this.reset();
this.open = true;
this.title = "添加产品朋友圈";
const { v4: uuidv4 } = require('uuid');
const uniqueID = uuidv4().replace(/-/g, '');
this.$set(this.form, 'id', uniqueID);
},
/** 修改按钮操作 */
handleUpdate(row) {
@ -373,7 +382,20 @@ export default {
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
// if (this.form.id != null) {
// updateMoment(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// } else {
// addMoment(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// }
if (this.title.indexOf('修改') !== -1) {
updateMoment(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
@ -386,6 +408,7 @@ export default {
this.getList();
});
}
}
});
},

@ -87,17 +87,17 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="primary"-->
<!-- plain-->
<!-- icon="el-icon-plus"-->
<!-- size="mini"-->
<!-- @click="handleAdd"-->
<!-- v-hasPermi="['order:order:add']"-->
<!-- >新增-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['order:order:add']"
>新增
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="success"-->
@ -142,6 +142,7 @@
<!-- <el-table-column label="id" align="center" prop="id" sortable='custom' />-->
<el-table-column label="订单号" align="center" prop="orderNo" sortable='custom' width="90px"/>
<el-table-column label="客户" align="center" prop="userName"/>
<el-table-column label="联系方式" align="center" prop="phone"/>
<el-table-column label="代理商" align="center" prop="brokerName" width="90px"/>
<el-table-column label="产品名称" align="center" prop="productName" sortable='custom' width="100px"/>
<el-table-column label="提交时间" align="center" prop="submitTime" width="180" sortable='custom'>

@ -414,6 +414,9 @@ export default {
this.reset();
this.open = true;
this.title = "添加产品海报";
const { v4: uuidv4 } = require('uuid');
const uniqueID = uuidv4().replace(/-/g, '');
this.$set(this.form, 'id', uniqueID);
},
/** 修改按钮操作 */
handleUpdate(row) {
@ -438,7 +441,7 @@ export default {
this.form.posterTag = this.form.posterTag.join(',');
}
if (valid) {
if (this.form.id != null) {
if (this.title.indexOf('修改') !== -1) {
updatePoster(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
@ -451,6 +454,19 @@ export default {
this.getList();
});
}
// if (this.form.id != null) {
// updatePoster(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// } else {
// addPoster(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// }
}
});
},

@ -46,7 +46,7 @@
</div>
<el-tabs v-model="activeTab">
<el-tab-pane label="基本资料" name="userinfo">
<userInfo :user="user" />
<userInfo :user="user"/>
</el-tab-pane>
<el-tab-pane label="修改密码" name="resetPwd">
<resetPwd />

@ -2,7 +2,7 @@
<el-form ref="form" :model="user" :rules="rules" label-width="80px">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="user.nickName" maxlength="30" />
</el-form-item>
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="user.phonenumber" maxlength="11" />
</el-form-item>
@ -15,6 +15,10 @@
<el-radio label="1"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="二维码" prop="field">
<BannerUpload v-show="user.userId" :bannerId="user.userId" :maxLength="1">
</BannerUpload>
</el-form-item>
<el-form-item>
<el-button type="primary" size="mini" @click="submit"></el-button>
<el-button type="danger" size="mini" @click="close"></el-button>

Loading…
Cancel
Save