202505281110
This commit is contained in:
parent
65c01d1a05
commit
4af16aaea6
|
|
@ -6,6 +6,8 @@
|
||||||
.history/
|
.history/
|
||||||
.vscode/
|
.vscode/
|
||||||
.github/
|
.github/
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!gradle/wrapper/gradle-wrapper.jar
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
|
||||||
|
|
@ -0,0 +1,122 @@
|
||||||
|
package com.ruoyi.system.controller;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import com.ruoyi.system.domain.SiteDelivery;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
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.PutMapping;
|
||||||
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import com.ruoyi.common.annotation.Log;
|
||||||
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
|
import com.ruoyi.common.enums.BusinessType;
|
||||||
|
import com.ruoyi.system.domain.AdvImg;
|
||||||
|
import com.ruoyi.system.service.IAdvImgService;
|
||||||
|
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||||
|
import com.ruoyi.common.core.page.TableDataInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 广告配置Controller
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2025-05-26
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/system/AdvImg")
|
||||||
|
public class AdvImgController extends BaseController
|
||||||
|
{
|
||||||
|
@Autowired
|
||||||
|
private IAdvImgService advImgService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询广告配置列表
|
||||||
|
*/
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:AdvImg:list')")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo list(AdvImg advImg)
|
||||||
|
{
|
||||||
|
startPage();
|
||||||
|
List<AdvImg> list = advImgService.selectAdvImgList(advImg);
|
||||||
|
return getDataTable(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出广告配置列表
|
||||||
|
*/
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:AdvImg:export')")
|
||||||
|
@Log(title = "广告配置", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(HttpServletResponse response, AdvImg advImg)
|
||||||
|
{
|
||||||
|
List<AdvImg> list = advImgService.selectAdvImgList(advImg);
|
||||||
|
ExcelUtil<AdvImg> util = new ExcelUtil<AdvImg>(AdvImg.class);
|
||||||
|
util.exportExcel(response, list, "广告配置数据");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取广告配置详细信息
|
||||||
|
*/
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:AdvImg:query')")
|
||||||
|
@GetMapping(value = "/{id}")
|
||||||
|
public AjaxResult getInfo(@PathVariable("id") Long id)
|
||||||
|
{
|
||||||
|
return success(advImgService.selectAdvImgById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增广告配置
|
||||||
|
*/
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:AdvImg:add')")
|
||||||
|
@Log(title = "广告配置", businessType = BusinessType.INSERT)
|
||||||
|
@PostMapping
|
||||||
|
public AjaxResult add(@RequestBody AdvImg advImg)
|
||||||
|
{
|
||||||
|
return toAjax(advImgService.insertAdvImg(advImg));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改广告配置
|
||||||
|
*/
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:AdvImg:edit')")
|
||||||
|
@Log(title = "广告配置", businessType = BusinessType.UPDATE)
|
||||||
|
@PutMapping
|
||||||
|
public AjaxResult edit(@RequestBody AdvImg advImg)
|
||||||
|
{
|
||||||
|
return toAjax(advImgService.updateAdvImg(advImg));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务状态修改
|
||||||
|
*/
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:AdvImg:changeStatus')")
|
||||||
|
@Log(title = "修改状态", businessType = BusinessType.UPDATE)
|
||||||
|
@PutMapping("/changeStatus")
|
||||||
|
public AjaxResult changeStatus(@RequestBody AdvImg advImg)
|
||||||
|
{
|
||||||
|
AdvImg newAdvImg = advImgService.selectAdvImgById(advImg.getId());
|
||||||
|
newAdvImg.setStatus(advImg.getStatus());
|
||||||
|
return toAjax(advImgService.updateAdvImg(newAdvImg));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除广告配置
|
||||||
|
*/
|
||||||
|
@PreAuthorize("@ss.hasPermi('system:AdvImg:remove')")
|
||||||
|
@Log(title = "广告配置", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public AjaxResult remove(@PathVariable Long[] ids)
|
||||||
|
{
|
||||||
|
return toAjax(advImgService.deleteAdvImgByIds(ids));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,9 +2,12 @@ package com.ruoyi.system.controller;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.ruoyi.system.domain.QuoteCraft;
|
import com.ruoyi.system.domain.QuoteCraft;
|
||||||
|
|
@ -129,9 +132,29 @@ public class QuoteTypeController extends BaseController
|
||||||
@GetMapping(value = "/{id}")
|
@GetMapping(value = "/{id}")
|
||||||
public AjaxResult getInfo(@PathVariable("id") Long id)
|
public AjaxResult getInfo(@PathVariable("id") Long id)
|
||||||
{
|
{
|
||||||
return success(quoteTypeService.selectQuoteTypeById(id));
|
|
||||||
|
QuoteType quoteType = quoteTypeService.selectQuoteTypeById(id);
|
||||||
|
if (quoteType.getGoodId()!=null){
|
||||||
|
String str = "[\"45\", \"47\", \"48\", \"49\", \"5\", \"52\"]";
|
||||||
|
List<String> stringList = JSON.parseArray(str, String.class);
|
||||||
|
List<Integer> intList = stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
|
||||||
|
quoteType.setGoodsintids(intList);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return success(quoteType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
// String str = "[\"45\", \"47\", \"48\", \"49\", \"5\", \"52\"]";
|
||||||
|
// List<String> stringList = JSON.parseArray(str, String.class);
|
||||||
|
// List<Integer> intList = stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
|
||||||
|
// System.out.println(intList); // 输出: [45, 47, 48, 49, 5, 52]
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增项目报价--工艺分类
|
* 新增项目报价--工艺分类
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,158 @@
|
||||||
|
package com.ruoyi.system.domain;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
|
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||||
|
import com.ruoyi.common.annotation.Excel;
|
||||||
|
import com.ruoyi.common.core.domain.BaseEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 广告配置对象 adv_img
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2025-05-26
|
||||||
|
*/
|
||||||
|
public class AdvImg extends BaseEntity
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/** $column.columnComment */
|
||||||
|
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/** 名称 */
|
||||||
|
@Excel(name = "名称")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
/** 位置 */
|
||||||
|
@Excel(name = "位置")
|
||||||
|
private Long type;
|
||||||
|
|
||||||
|
/** 图片 */
|
||||||
|
@Excel(name = "图片")
|
||||||
|
private String image;
|
||||||
|
|
||||||
|
/** 链接 */
|
||||||
|
@Excel(name = "链接")
|
||||||
|
private String link;
|
||||||
|
|
||||||
|
/** 排序 */
|
||||||
|
@Excel(name = "排序")
|
||||||
|
private Long sort;
|
||||||
|
|
||||||
|
/** 状态 */
|
||||||
|
@Excel(name = "状态")
|
||||||
|
private Long status;
|
||||||
|
|
||||||
|
/** $column.columnComment */
|
||||||
|
private Date createdAt;
|
||||||
|
|
||||||
|
/** $column.columnComment */
|
||||||
|
private Date updatedAt;
|
||||||
|
|
||||||
|
public void setId(Long id)
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title)
|
||||||
|
{
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle()
|
||||||
|
{
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(Long type)
|
||||||
|
{
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getType()
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImage(String image)
|
||||||
|
{
|
||||||
|
this.image = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getImage()
|
||||||
|
{
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLink(String link)
|
||||||
|
{
|
||||||
|
this.link = link;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLink()
|
||||||
|
{
|
||||||
|
return link;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSort(Long sort)
|
||||||
|
{
|
||||||
|
this.sort = sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getSort()
|
||||||
|
{
|
||||||
|
return sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(Long status)
|
||||||
|
{
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getStatus()
|
||||||
|
{
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedAt(Date createdAt)
|
||||||
|
{
|
||||||
|
this.createdAt = createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getCreatedAt()
|
||||||
|
{
|
||||||
|
return createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdatedAt(Date updatedAt)
|
||||||
|
{
|
||||||
|
this.updatedAt = updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getUpdatedAt()
|
||||||
|
{
|
||||||
|
return updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||||
|
.append("id", getId())
|
||||||
|
.append("title", getTitle())
|
||||||
|
.append("type", getType())
|
||||||
|
.append("image", getImage())
|
||||||
|
.append("link", getLink())
|
||||||
|
.append("sort", getSort())
|
||||||
|
.append("status", getStatus())
|
||||||
|
.append("createdAt", getCreatedAt())
|
||||||
|
.append("updatedAt", getUpdatedAt())
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@ package com.ruoyi.system.domain;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||||
|
|
@ -44,6 +45,11 @@ public class QuoteType extends BaseEntity
|
||||||
|
|
||||||
private List<String> goodsids;
|
private List<String> goodsids;
|
||||||
|
|
||||||
|
private List<Integer> goodsintids;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** 创建时间 */
|
/** 创建时间 */
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||||
@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
|
@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
|
||||||
|
|
@ -140,6 +146,14 @@ public class QuoteType extends BaseEntity
|
||||||
this.goodsids = goodsids;
|
this.goodsids = goodsids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Integer> getGoodsintids() {
|
||||||
|
return goodsintids;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGoodsintids(List<Integer> goodsintids) {
|
||||||
|
this.goodsintids = goodsintids;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.ruoyi.system.mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import com.ruoyi.system.domain.AdvImg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 广告配置Mapper接口
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2025-05-26
|
||||||
|
*/
|
||||||
|
public interface AdvImgMapper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 查询广告配置
|
||||||
|
*
|
||||||
|
* @param id 广告配置主键
|
||||||
|
* @return 广告配置
|
||||||
|
*/
|
||||||
|
public AdvImg selectAdvImgById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询广告配置列表
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 广告配置集合
|
||||||
|
*/
|
||||||
|
public List<AdvImg> selectAdvImgList(AdvImg advImg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增广告配置
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int insertAdvImg(AdvImg advImg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改广告配置
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int updateAdvImg(AdvImg advImg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除广告配置
|
||||||
|
*
|
||||||
|
* @param id 广告配置主键
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteAdvImgById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除广告配置
|
||||||
|
*
|
||||||
|
* @param ids 需要删除的数据主键集合
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteAdvImgByIds(Long[] ids);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.ruoyi.system.service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import com.ruoyi.system.domain.AdvImg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 广告配置Service接口
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2025-05-26
|
||||||
|
*/
|
||||||
|
public interface IAdvImgService
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 查询广告配置
|
||||||
|
*
|
||||||
|
* @param id 广告配置主键
|
||||||
|
* @return 广告配置
|
||||||
|
*/
|
||||||
|
public AdvImg selectAdvImgById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询广告配置列表
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 广告配置集合
|
||||||
|
*/
|
||||||
|
public List<AdvImg> selectAdvImgList(AdvImg advImg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增广告配置
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int insertAdvImg(AdvImg advImg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改广告配置
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int updateAdvImg(AdvImg advImg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除广告配置
|
||||||
|
*
|
||||||
|
* @param ids 需要删除的广告配置主键集合
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteAdvImgByIds(Long[] ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除广告配置信息
|
||||||
|
*
|
||||||
|
* @param id 广告配置主键
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteAdvImgById(Long id);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,93 @@
|
||||||
|
package com.ruoyi.system.service.impl;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import com.ruoyi.system.mapper.AdvImgMapper;
|
||||||
|
import com.ruoyi.system.domain.AdvImg;
|
||||||
|
import com.ruoyi.system.service.IAdvImgService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 广告配置Service业务层处理
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
* @date 2025-05-26
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class AdvImgServiceImpl implements IAdvImgService
|
||||||
|
{
|
||||||
|
@Autowired
|
||||||
|
private AdvImgMapper advImgMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询广告配置
|
||||||
|
*
|
||||||
|
* @param id 广告配置主键
|
||||||
|
* @return 广告配置
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AdvImg selectAdvImgById(Long id)
|
||||||
|
{
|
||||||
|
return advImgMapper.selectAdvImgById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询广告配置列表
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 广告配置
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<AdvImg> selectAdvImgList(AdvImg advImg)
|
||||||
|
{
|
||||||
|
return advImgMapper.selectAdvImgList(advImg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增广告配置
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int insertAdvImg(AdvImg advImg)
|
||||||
|
{
|
||||||
|
return advImgMapper.insertAdvImg(advImg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改广告配置
|
||||||
|
*
|
||||||
|
* @param advImg 广告配置
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int updateAdvImg(AdvImg advImg)
|
||||||
|
{
|
||||||
|
return advImgMapper.updateAdvImg(advImg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除广告配置
|
||||||
|
*
|
||||||
|
* @param ids 需要删除的广告配置主键
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int deleteAdvImgByIds(Long[] ids)
|
||||||
|
{
|
||||||
|
return advImgMapper.deleteAdvImgByIds(ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除广告配置信息
|
||||||
|
*
|
||||||
|
* @param id 广告配置主键
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int deleteAdvImgById(Long id)
|
||||||
|
{
|
||||||
|
return advImgMapper.deleteAdvImgById(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.ruoyi.system.mapper.AdvImgMapper">
|
||||||
|
|
||||||
|
<resultMap type="AdvImg" id="AdvImgResult">
|
||||||
|
<result property="id" column="id" />
|
||||||
|
<result property="title" column="title" />
|
||||||
|
<result property="type" column="type" />
|
||||||
|
<result property="image" column="image" />
|
||||||
|
<result property="link" column="link" />
|
||||||
|
<result property="sort" column="sort" />
|
||||||
|
<result property="status" column="status" />
|
||||||
|
<result property="createdAt" column="created_at" />
|
||||||
|
<result property="updatedAt" column="updated_at" />
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<sql id="selectAdvImgVo">
|
||||||
|
select id, title, type, image, link, sort, status, created_at, updated_at from adv_img
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<select id="selectAdvImgList" parameterType="AdvImg" resultMap="AdvImgResult">
|
||||||
|
<include refid="selectAdvImgVo"/>
|
||||||
|
<where>
|
||||||
|
<if test="title != null and title != ''"> and title like concat('%',#{title},'%')</if>
|
||||||
|
<if test="type != null "> and type = #{type}</if>
|
||||||
|
<if test="image != null and image != ''"> and image = #{image}</if>
|
||||||
|
<if test="link != null and link != ''"> and link = #{link}</if>
|
||||||
|
<if test="sort != null "> and sort = #{sort}</if>
|
||||||
|
<if test="status != null "> and status = #{status}</if>
|
||||||
|
</where>
|
||||||
|
order by id desc
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectAdvImgById" parameterType="Long" resultMap="AdvImgResult">
|
||||||
|
<include refid="selectAdvImgVo"/>
|
||||||
|
where id = #{id}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<insert id="insertAdvImg" parameterType="AdvImg" useGeneratedKeys="true" keyProperty="id">
|
||||||
|
insert into adv_img
|
||||||
|
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||||
|
<if test="title != null and title != ''">title,</if>
|
||||||
|
<if test="type != null">type,</if>
|
||||||
|
<if test="image != null">image,</if>
|
||||||
|
<if test="link != null">link,</if>
|
||||||
|
<if test="sort != null">sort,</if>
|
||||||
|
<if test="status != null">status,</if>
|
||||||
|
created_at,
|
||||||
|
updated_at
|
||||||
|
</trim>
|
||||||
|
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||||
|
<if test="title != null and title != ''">#{title},</if>
|
||||||
|
<if test="type != null">#{type},</if>
|
||||||
|
<if test="image != null">#{image},</if>
|
||||||
|
<if test="link != null">#{link},</if>
|
||||||
|
<if test="sort != null">#{sort},</if>
|
||||||
|
<if test="status != null">#{status},</if>
|
||||||
|
NOW(),
|
||||||
|
NOW()
|
||||||
|
</trim>
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<update id="updateAdvImg" parameterType="AdvImg">
|
||||||
|
update adv_img
|
||||||
|
<trim prefix="SET" suffixOverrides=",">
|
||||||
|
<if test="title != null and title != ''">title = #{title},</if>
|
||||||
|
<if test="type != null">type = #{type},</if>
|
||||||
|
<if test="image != null">image = #{image},</if>
|
||||||
|
<if test="link != null">link = #{link},</if>
|
||||||
|
<if test="sort != null">sort = #{sort},</if>
|
||||||
|
<if test="status != null">status = #{status},</if>
|
||||||
|
updated_at=NOW()
|
||||||
|
</trim>
|
||||||
|
where id = #{id}
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<delete id="deleteAdvImgById" parameterType="Long">
|
||||||
|
delete from adv_img where id = #{id}
|
||||||
|
</delete>
|
||||||
|
|
||||||
|
<delete id="deleteAdvImgByIds" parameterType="String">
|
||||||
|
delete from adv_img where id in
|
||||||
|
<foreach item="id" collection="array" open="(" separator="," close=")">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
</delete>
|
||||||
|
</mapper>
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,55 @@
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询广告配置列表
|
||||||
|
export function listAdvImg(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/AdvImg/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询广告配置详细
|
||||||
|
export function getAdvImg(id) {
|
||||||
|
return request({
|
||||||
|
url: '/system/AdvImg/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 任务状态修改
|
||||||
|
export function changefenleiStatus(id, status) {
|
||||||
|
const data = {
|
||||||
|
id,
|
||||||
|
status
|
||||||
|
}
|
||||||
|
return request({
|
||||||
|
url: '/system/AdvImg/changeStatus',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 新增广告配置
|
||||||
|
export function addAdvImg(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/AdvImg',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改广告配置
|
||||||
|
export function updateAdvImg(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/AdvImg',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除广告配置
|
||||||
|
export function delAdvImg(id) {
|
||||||
|
return request({
|
||||||
|
url: '/system/AdvImg/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,303 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<SkuForm
|
||||||
|
:source-attribute="sourceAttribute"
|
||||||
|
:attribute.sync="attribute"
|
||||||
|
:sku.sync="sku"
|
||||||
|
:structure="structure"
|
||||||
|
ref="skuForm"
|
||||||
|
:theme="2"
|
||||||
|
>
|
||||||
|
<template #score="slotProps">
|
||||||
|
<div>
|
||||||
|
<el-rate v-model="slotProps.row.score" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #pic="slotProps">
|
||||||
|
|
||||||
|
<div class="upimg">
|
||||||
|
<div class="imgs"> <image-upload v-model="slotProps.row.pic" :limit="1" :isShowTip="false" /></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</SkuForm>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import SkuForm from './skufrom.vue'
|
||||||
|
export default {
|
||||||
|
components:{
|
||||||
|
SkuForm
|
||||||
|
},
|
||||||
|
props:{
|
||||||
|
info:{
|
||||||
|
type:String,
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch:{
|
||||||
|
info:{
|
||||||
|
handler() {
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted(){
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
data:{},
|
||||||
|
sourceAttribute: [
|
||||||
|
{
|
||||||
|
name: '颜色',
|
||||||
|
item: ['黑', '金', '白']
|
||||||
|
}
|
||||||
|
],
|
||||||
|
attribute: [
|
||||||
|
{
|
||||||
|
name: '颜色',
|
||||||
|
item: ['黑', '金', '白']
|
||||||
|
}
|
||||||
|
],
|
||||||
|
sku: [
|
||||||
|
{
|
||||||
|
"sku": "黑;16G",
|
||||||
|
"pic": "2121",
|
||||||
|
"price": "212121",
|
||||||
|
"stock":"999"
|
||||||
|
|
||||||
|
}
|
||||||
|
],
|
||||||
|
structure:[
|
||||||
|
{
|
||||||
|
name: 'pic',
|
||||||
|
type: 'slot',
|
||||||
|
label: '图片',
|
||||||
|
batch:false
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'price',
|
||||||
|
type: 'input',
|
||||||
|
label: '价格',
|
||||||
|
batch:false,
|
||||||
|
required: true
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'stock',
|
||||||
|
type: 'input',
|
||||||
|
label: '库存',
|
||||||
|
batch:false,
|
||||||
|
required: true
|
||||||
|
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
parseInfoToSkuData(infoStr) {
|
||||||
|
let data;
|
||||||
|
try {
|
||||||
|
data = typeof infoStr === 'string' ? JSON.parse(infoStr) : infoStr;
|
||||||
|
} catch {
|
||||||
|
return {
|
||||||
|
sourceAttribute: [],
|
||||||
|
attribute: [],
|
||||||
|
sku: []
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const attrs = data.attrs || {};
|
||||||
|
const attrArr = Object.keys(attrs).map(name => ({
|
||||||
|
name,
|
||||||
|
item: attrs[name]
|
||||||
|
}));
|
||||||
|
// 生成sku字段
|
||||||
|
return {
|
||||||
|
sourceAttribute: JSON.parse(JSON.stringify(attrArr)),
|
||||||
|
attribute: JSON.parse(JSON.stringify(attrArr)),
|
||||||
|
sku: Array.isArray(data.sku) ? data.sku.map(item => {
|
||||||
|
const specNames = Object.keys(attrs);
|
||||||
|
const skuValue = specNames.map(name => item[name]).join(';');
|
||||||
|
return {
|
||||||
|
sku: skuValue,
|
||||||
|
...item
|
||||||
|
}
|
||||||
|
}) : []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
init(){
|
||||||
|
if(this.info){
|
||||||
|
this.data=JSON.parse(this.info);
|
||||||
|
// 新增:自动转换
|
||||||
|
const parsed = this.parseInfoToSkuData(this.info);
|
||||||
|
this.sourceAttribute = parsed.sourceAttribute;
|
||||||
|
this.attribute = parsed.attribute;
|
||||||
|
this.sku = parsed.sku;
|
||||||
|
this.$refs.skuForm.init()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
TodoData(){
|
||||||
|
// 1. 组装 attrs
|
||||||
|
const attrs = {};
|
||||||
|
// 取规格名和规格值(数组)
|
||||||
|
this.$refs.skuForm.getArray().forEach(attr => {
|
||||||
|
if(attr.name && Array.isArray(attr.item)){
|
||||||
|
attrs[attr.name] = attr.item.map(r => r.name || r);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 2. 组装 sku
|
||||||
|
// 取所有规格名
|
||||||
|
const specNames = Object.keys(attrs);
|
||||||
|
console.log(specNames,this.sku)
|
||||||
|
// 每个sku对象包含所有规格名及其值、图片、价格、库存等字段
|
||||||
|
|
||||||
|
const skuList = (this.sku || []).map(row => {
|
||||||
|
const result = {};
|
||||||
|
// 规格属性
|
||||||
|
const _txt=row.sku.split(';');
|
||||||
|
|
||||||
|
_txt.forEach((name,index) => {
|
||||||
|
result[specNames[index]] = name;
|
||||||
|
})
|
||||||
|
|
||||||
|
// 其他字段
|
||||||
|
this.structure.forEach(col => {
|
||||||
|
if(row[col.name] !== undefined) result[col.name] = row[col.name];
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: 'many',
|
||||||
|
attrs,
|
||||||
|
sku: skuList
|
||||||
|
};
|
||||||
|
},
|
||||||
|
submit() {
|
||||||
|
let _IS=false
|
||||||
|
|
||||||
|
this.$refs.skuForm.validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
|
||||||
|
_IS=JSON.stringify(this.TodoData())
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
_IS=false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return _IS
|
||||||
|
},
|
||||||
|
add(){
|
||||||
|
this.sourceAttribute.push({
|
||||||
|
"name": "",
|
||||||
|
"item": [],
|
||||||
|
"input":""
|
||||||
|
})
|
||||||
|
this.attribute.push({
|
||||||
|
"name": "",
|
||||||
|
"item": []
|
||||||
|
})
|
||||||
|
this.$refs.skuForm.init()
|
||||||
|
this.generateSku()
|
||||||
|
},
|
||||||
|
itemAdd(row){
|
||||||
|
if(row.input){
|
||||||
|
row.item.push(row.input)
|
||||||
|
row.input = ""
|
||||||
|
}else{
|
||||||
|
this.$message.error("请输入内容")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
generateSku() {
|
||||||
|
// 清空之前的SKU数据
|
||||||
|
this.sku = [];
|
||||||
|
|
||||||
|
// 获取所有规格项
|
||||||
|
let specs = this.sourceAttribute.map(attr => {
|
||||||
|
return {
|
||||||
|
name: attr.name,
|
||||||
|
items: attr.item
|
||||||
|
};
|
||||||
|
}).filter(spec => spec.name && spec.items.length > 0);
|
||||||
|
|
||||||
|
// 如果没有规格项,直接返回
|
||||||
|
if (specs.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成规格组合
|
||||||
|
const generateCombinations = (specs) => {
|
||||||
|
if (specs.length === 0) return [[]];
|
||||||
|
|
||||||
|
const [first, ...rest] = specs;
|
||||||
|
const combinations = generateCombinations(rest);
|
||||||
|
|
||||||
|
return first.items.flatMap(item =>
|
||||||
|
combinations.map(combination => [item, ...combination])
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 生成所有可能的组合
|
||||||
|
const combinations = generateCombinations(specs);
|
||||||
|
|
||||||
|
// 构建SKU数据
|
||||||
|
this.sku = combinations.map(combination => {
|
||||||
|
const skuItem = {
|
||||||
|
specs: {},
|
||||||
|
price: 0,
|
||||||
|
stock: 0,
|
||||||
|
imageUrl: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
// 设置规格值
|
||||||
|
specs.forEach((spec, index) => {
|
||||||
|
skuItem.specs[spec.name] = combination[index];
|
||||||
|
});
|
||||||
|
|
||||||
|
return skuItem;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 更新attribute数据
|
||||||
|
this.attribute = specs.map(spec => ({
|
||||||
|
name: spec.name,
|
||||||
|
item: spec.items
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
itemDelete(row){
|
||||||
|
console.log(row)
|
||||||
|
this.sourceAttribute.splice(row.vmCount, 1);
|
||||||
|
this.attribute.splice(row.vmCount, )
|
||||||
|
this.$refs.skuForm.init()
|
||||||
|
this.generateSku()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.upimg {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
::v-deep .el-upload--picture-card {
|
||||||
|
width: 60px !important;
|
||||||
|
height: 60px !important;
|
||||||
|
line-height: 66px !important;
|
||||||
|
}
|
||||||
|
::v-deep .el-upload-list--picture-card .el-upload-list__item {
|
||||||
|
width: 60px !important;
|
||||||
|
height: 60px !important;
|
||||||
|
line-height: 60px !important;
|
||||||
|
}
|
||||||
|
.imgs {
|
||||||
|
margin-right: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,753 @@
|
||||||
|
<template>
|
||||||
|
<div class="sku-container">
|
||||||
|
|
||||||
|
<el-row type="flex" class="row-bg" justify="end">
|
||||||
|
|
||||||
|
<el-col :span="6" >
|
||||||
|
|
||||||
|
<el-input
|
||||||
|
v-model="inputname"
|
||||||
|
size="small"
|
||||||
|
placeholder="新增一个属性"
|
||||||
|
class="add-attr"
|
||||||
|
style="margin-bottom: 15px;"
|
||||||
|
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
slot="append"
|
||||||
|
size="small"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
type="danger"
|
||||||
|
style="color: #fff;"
|
||||||
|
@click.stop="addlist()"
|
||||||
|
>添加</el-button
|
||||||
|
>
|
||||||
|
</el-input>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div v-if="!disabled" class="sku-check">
|
||||||
|
<div v-if="theme == 1" class="theme-1">
|
||||||
|
<el-card
|
||||||
|
v-for="(item, index) in myAttribute"
|
||||||
|
:key="index"
|
||||||
|
class="item"
|
||||||
|
shadow="never"
|
||||||
|
|
||||||
|
>
|
||||||
|
<div slot="header">
|
||||||
|
<el-input
|
||||||
|
placeholder="请输入内容"
|
||||||
|
:value="item.name"
|
||||||
|
style="width: 200px"
|
||||||
|
clearable
|
||||||
|
>
|
||||||
|
</el-input>
|
||||||
|
</div>
|
||||||
|
<el-checkbox
|
||||||
|
v-for="(item2, index2) in item.item"
|
||||||
|
:key="index2"
|
||||||
|
v-model="item2.checked"
|
||||||
|
:label="item2.name"
|
||||||
|
size="small"
|
||||||
|
/>
|
||||||
|
<el-input
|
||||||
|
v-if="item.canAddAttribute"
|
||||||
|
v-model="item.addAttribute"
|
||||||
|
size="small"
|
||||||
|
placeholder="新增一个规格11"
|
||||||
|
class="add-attr"
|
||||||
|
@keyup.enter.native="onAddAttribute(index)"
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
slot="append"
|
||||||
|
size="small"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
@click="onAddAttribute(index)"
|
||||||
|
>添加</el-button
|
||||||
|
>
|
||||||
|
<el-button type="danger" icon="el-icon-delete" circle @click="delsuk(scope.$index)"></el-button>
|
||||||
|
</el-input>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
<el-table v-else :data="myAttribute" :show-header="false" class="theme-2" border >
|
||||||
|
<el-table-column prop="name" :resizable="false" width="180px">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-input
|
||||||
|
placeholder="请输入内容"
|
||||||
|
v-model="scope.row.name"
|
||||||
|
style="width: 150px"
|
||||||
|
clearable
|
||||||
|
>
|
||||||
|
</el-input>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<div style="display: flex;flex-wrap: wrap;gap: 10px;">
|
||||||
|
<template v-for="(item2, index2) in scope.row.item" >
|
||||||
|
|
||||||
|
<el-button type="primary" size="mini" plain style="margin-left: 0px;" :key="index2" v-if="item2.checked">
|
||||||
|
{{ item2.name }}
|
||||||
|
<span @click="delitem(scope.row, index2)">
|
||||||
|
<el-icon class="el-icon-delete"></el-icon
|
||||||
|
></span>
|
||||||
|
</el-button>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column align="right">
|
||||||
|
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-input
|
||||||
|
v-model="scope.row.addAttribute"
|
||||||
|
size="small"
|
||||||
|
placeholder="新增一个规格"
|
||||||
|
class="add-attr"
|
||||||
|
style="width: 190px;margin-right: 15px;"
|
||||||
|
@keyup.enter.native="onAddAttribute(scope.$index)"
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
slot="append"
|
||||||
|
size="small"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
@click="onAddAttribute(scope.$index)"
|
||||||
|
>添加</el-button
|
||||||
|
>
|
||||||
|
</el-input>
|
||||||
|
<el-button type="danger" size="mini" icon="el-icon-delete" circle @click="delsuk(scope.$index)"></el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="sku-list">
|
||||||
|
|
||||||
|
<el-form ref="form" :model="form" status-icon inline-message>
|
||||||
|
<el-table :data="form.skuData" stripe border highlight-current-row >
|
||||||
|
<!-- 考虑到异步加载的情况,如果 attribute 数据先加载完成,则表头会立马展示,效果不理想,故使用emitAttribute 数据,该数据为计算属性,通过 myAttribute 生成,结构与 attribute 一致 -->
|
||||||
|
<el-table-column
|
||||||
|
v-if="emitAttribute.length > 0"
|
||||||
|
type="index"
|
||||||
|
width="50"
|
||||||
|
align="center"
|
||||||
|
:resizable="false"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
v-for="(attr, index) in emitAttribute"
|
||||||
|
:key="`attribute-${index}`"
|
||||||
|
:label="attr.name"
|
||||||
|
:prop="attr.name"
|
||||||
|
width="120"
|
||||||
|
align="center"
|
||||||
|
:resizable="false"
|
||||||
|
sortable
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
v-for="(item, index) in structure"
|
||||||
|
:key="`structure-${index}`"
|
||||||
|
:label="item.label"
|
||||||
|
:prop="item.name"
|
||||||
|
align="center"
|
||||||
|
:resizable="false"
|
||||||
|
min-width="120px"
|
||||||
|
>
|
||||||
|
<!-- 自定义表头 -->
|
||||||
|
<template slot="header">
|
||||||
|
<span :class="{ required_title: item.required }">
|
||||||
|
{{ item.label }}
|
||||||
|
</span>
|
||||||
|
<el-tooltip
|
||||||
|
v-if="item.tip"
|
||||||
|
effect="dark"
|
||||||
|
:content="item.tip"
|
||||||
|
placement="top"
|
||||||
|
>
|
||||||
|
<i class="el-icon-info" />
|
||||||
|
</el-tooltip>
|
||||||
|
</template>
|
||||||
|
<!-- 自定义表格内部展示 -->
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<!-- 增加是 key 是为了保证异步验证不会出现 skuData 数据变化后无法验证的 bug -->
|
||||||
|
<el-form-item
|
||||||
|
v-if="item.type == 'input'"
|
||||||
|
:key="`structure-input-${index}-${scope.row.sku}`"
|
||||||
|
:prop="'skuData.' + scope.$index + '.' + item.name"
|
||||||
|
:rules="rules[item.name]"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-model="scope.row[item.name]"
|
||||||
|
:placeholder="`请输入${item.label}`"
|
||||||
|
size="small"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
v-else-if="item.type == 'slot'"
|
||||||
|
:key="`structure-input-${index}-${scope.row.sku}`"
|
||||||
|
:prop="'skuData.' + scope.$index + '.' + item.name"
|
||||||
|
:rules="rules[item.name]"
|
||||||
|
>
|
||||||
|
<slot
|
||||||
|
:name="item.name"
|
||||||
|
:$index="scope.$index"
|
||||||
|
:row="scope.row"
|
||||||
|
:column="scope.column"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<!-- 批量设置,当 sku 数超过 2 个时出现 -->
|
||||||
|
<template v-if="isBatch && form.skuData.length > 2" slot="append">
|
||||||
|
<el-table :data="[{}]" :show-header="false">
|
||||||
|
<el-table-column
|
||||||
|
:width="attribute.length * 120 + 50"
|
||||||
|
align="center"
|
||||||
|
:resizable="false"
|
||||||
|
>批量设置</el-table-column
|
||||||
|
>
|
||||||
|
<el-table-column
|
||||||
|
v-for="(item, index) in structure"
|
||||||
|
:key="`batch-structure-${index}`"
|
||||||
|
align="center"
|
||||||
|
:resizable="false"
|
||||||
|
min-width="120px"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-if="item.type == 'input' && item.batch != false"
|
||||||
|
v-model="batch[item.name]"
|
||||||
|
:placeholder="`填写一个${item.label}`"
|
||||||
|
size="small"
|
||||||
|
@keyup.enter.native="onBatchSet(item.name)"
|
||||||
|
/>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</template>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "SkuForm",
|
||||||
|
props: {
|
||||||
|
/**
|
||||||
|
* 原始规格数据
|
||||||
|
* sourceAttribute: [
|
||||||
|
* { name: '颜色', item: ['黑', '金', '白'] },
|
||||||
|
* { name: '内存', item: ['16G', '32G'] },
|
||||||
|
* { name: '运营商', item: ['电信', '移动', '联通'] }
|
||||||
|
* ]
|
||||||
|
*/
|
||||||
|
sourceAttribute: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 已使用的规格数据,用于复原数据,支持.sync修饰符
|
||||||
|
* attribute: [
|
||||||
|
* { name: '颜色', item: ['黑'] },
|
||||||
|
* { name: '运营商', item: ['电信', '移动', '联通'] }
|
||||||
|
* ]
|
||||||
|
*/
|
||||||
|
attribute: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 用于复原sku数据,支持.sync修饰符
|
||||||
|
* sku: [
|
||||||
|
* { sku: '黑;电信', price: 1, stock: 1 },
|
||||||
|
* { sku: '黑;移动', price: 2, stock: 2 },
|
||||||
|
* { sku: '黑;联通', price: 3, stock: 3 }
|
||||||
|
* ]
|
||||||
|
*/
|
||||||
|
sku: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 表格结构,注意name字段,用于输出sku数据
|
||||||
|
*/
|
||||||
|
structure: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [
|
||||||
|
{ name: "price", type: "input", label: "价格" },
|
||||||
|
{ name: "stock", type: "input", label: "库存" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// sku 字段分隔符
|
||||||
|
separator: {
|
||||||
|
type: String,
|
||||||
|
default: ";",
|
||||||
|
},
|
||||||
|
// 无规格的 sku
|
||||||
|
emptySku: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
// 是否显示 sku 选择栏
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
// 主题风格
|
||||||
|
theme: {
|
||||||
|
type: Number,
|
||||||
|
default: 2,
|
||||||
|
},
|
||||||
|
// 是否开启异步加载
|
||||||
|
async: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
inputname: "",
|
||||||
|
isInit: false,
|
||||||
|
myAttribute: [],
|
||||||
|
form: {
|
||||||
|
skuData: [],
|
||||||
|
},
|
||||||
|
batch: {},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
rules() {
|
||||||
|
// 重新生成验证规则
|
||||||
|
let rules = {};
|
||||||
|
this.structure.forEach((v) => {
|
||||||
|
if (v.type == "input") {
|
||||||
|
rules[v.name] = [];
|
||||||
|
if (v.required) {
|
||||||
|
rules[v.name].push({
|
||||||
|
required: true,
|
||||||
|
message: `${v.label}不能为空`,
|
||||||
|
trigger: "blur",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (v.validate) {
|
||||||
|
rules[v.name].push({
|
||||||
|
validator: this.customizeValidate,
|
||||||
|
trigger: "blur",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (v.type == "slot") {
|
||||||
|
rules[v.name] = [];
|
||||||
|
if (v.required) {
|
||||||
|
rules[v.name].push({
|
||||||
|
required: true,
|
||||||
|
message: `${v.label}不能为空`,
|
||||||
|
trigger: ["change", "blur"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (v.validate) {
|
||||||
|
rules[v.name].push({
|
||||||
|
validator: this.customizeValidate,
|
||||||
|
trigger: ["change", "blur"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return rules;
|
||||||
|
},
|
||||||
|
isBatch() {
|
||||||
|
return this.structure.some((item) => {
|
||||||
|
return item.type == "input" && item.batch != false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 将 myAttribute 数据还原会 attribute 数据的结构,用于更新 attribute
|
||||||
|
emitAttribute() {
|
||||||
|
let attribute = [];
|
||||||
|
this.myAttribute.forEach((v1) => {
|
||||||
|
const obj = {
|
||||||
|
name: v1.name,
|
||||||
|
item: [],
|
||||||
|
};
|
||||||
|
v1.item.forEach((v2) => {
|
||||||
|
if (v2.checked) {
|
||||||
|
obj.item.push(v2.name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (obj.item.length !== 0) {
|
||||||
|
attribute.push(obj);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return attribute;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
myAttribute: {
|
||||||
|
handler() {
|
||||||
|
if (!this.isInit) {
|
||||||
|
// 更新父组件
|
||||||
|
this.$emit("update:attribute", this.emitAttribute);
|
||||||
|
}
|
||||||
|
// 解决通过 $emit 更新后无法拿到 attribute 最新数据的问题
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (this.attribute.length !== 0) {
|
||||||
|
this.combinationAttribute();
|
||||||
|
} else {
|
||||||
|
this.form.skuData = [];
|
||||||
|
if(this.emptySku){
|
||||||
|
const obj = {
|
||||||
|
sku: this.emptySku,
|
||||||
|
};
|
||||||
|
this.structure.forEach((v) => {
|
||||||
|
if (!(v.type == "slot" && v.skuProperty == false)) {
|
||||||
|
obj[v.name] =
|
||||||
|
typeof v.defaultValue != "undefined" ? v.defaultValue : "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.form.skuData.push(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
this.clearValidate();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
deep: true,
|
||||||
|
},
|
||||||
|
"form.skuData": {
|
||||||
|
handler(newValue, oldValue) {
|
||||||
|
if (
|
||||||
|
!this.isInit ||
|
||||||
|
(newValue.length == 1 && newValue[0].sku == this.emptySku)
|
||||||
|
) {
|
||||||
|
// 如果有老数据,或者 sku 数据为空,则更新父级 sku 数据
|
||||||
|
if (oldValue.length || !this.sku.length) {
|
||||||
|
// 更新父组件
|
||||||
|
const arr = [];
|
||||||
|
newValue.forEach((v1) => {
|
||||||
|
const obj = {
|
||||||
|
sku: v1.sku,
|
||||||
|
};
|
||||||
|
this.structure.forEach((v2) => {
|
||||||
|
if (!(v2.type == "slot" && v2.skuProperty == false)) {
|
||||||
|
obj[v2.name] =
|
||||||
|
v1[v2.name] ||
|
||||||
|
(typeof v2.defaultValue != "undefined"
|
||||||
|
? v2.defaultValue
|
||||||
|
: "");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
arr.push(obj);
|
||||||
|
});
|
||||||
|
this.$emit("update:sku", arr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
!this.async && this.init();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
delitem(row, index) {
|
||||||
|
console.log(row, index);
|
||||||
|
row.item.splice(index, 1);
|
||||||
|
// row.item[index].checked=false;
|
||||||
|
// 删除规格
|
||||||
|
},
|
||||||
|
delsuk(index){
|
||||||
|
this.myAttribute.splice(index,1)
|
||||||
|
},
|
||||||
|
addlist() {
|
||||||
|
if (this.inputname) {
|
||||||
|
const flag = this.myAttribute.find((item) => {
|
||||||
|
return item.name == this.inputname;
|
||||||
|
});
|
||||||
|
if (!flag) {
|
||||||
|
this.myAttribute.push({ name: this.inputname, item: [] });
|
||||||
|
this.inputname = "";
|
||||||
|
} else {
|
||||||
|
this.$message({
|
||||||
|
type: "warning",
|
||||||
|
message: "请勿添加相同规格",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
this.$message({
|
||||||
|
type: "warning",
|
||||||
|
message: "请填属性名称",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
init() {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.isInit = true;
|
||||||
|
// 初始化 myAttribute
|
||||||
|
let myAttribute = [];
|
||||||
|
// 根据 sourceAttribute 复原 myAttribute 的结构
|
||||||
|
this.sourceAttribute.forEach((v) => {
|
||||||
|
const temp = {
|
||||||
|
name: v.name,
|
||||||
|
canAddAttribute:
|
||||||
|
typeof v.canAddAttribute != "undefined"
|
||||||
|
? v.canAddAttribute
|
||||||
|
: true,
|
||||||
|
addAttribute: "",
|
||||||
|
item: [],
|
||||||
|
};
|
||||||
|
v.item.forEach((itemName) => {
|
||||||
|
temp.item.push({
|
||||||
|
name: itemName,
|
||||||
|
checked: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
myAttribute.push(temp);
|
||||||
|
});
|
||||||
|
// 根据 attribute 更新 myAttribute
|
||||||
|
this.attribute.forEach((attrVal) => {
|
||||||
|
myAttribute.forEach((myAttrVal) => {
|
||||||
|
if (attrVal.name === myAttrVal.name) {
|
||||||
|
attrVal.item.forEach((attrName) => {
|
||||||
|
if (
|
||||||
|
!myAttrVal.item.some((myAttrItem) => {
|
||||||
|
if (attrName === myAttrItem.name) {
|
||||||
|
myAttrItem.checked = true;
|
||||||
|
}
|
||||||
|
return attrName === myAttrItem.name;
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
myAttrVal.item.push({
|
||||||
|
name: attrName,
|
||||||
|
checked: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this.myAttribute = myAttribute;
|
||||||
|
// 通过 sku 更新 skuData,但因为 skuData 是实时监听 myAttribute 变化并自动生成,而 watch 是在 methods 后执行,所以增加 setTimeout 方法,确保 skuData 生成后在执行下面的代码
|
||||||
|
setTimeout(() => {
|
||||||
|
this.sku.forEach((skuItem) => {
|
||||||
|
this.form.skuData.forEach((skuDataItem) => {
|
||||||
|
if (skuItem.sku === skuDataItem.sku) {
|
||||||
|
this.structure.forEach((structureItem) => {
|
||||||
|
skuDataItem[structureItem.name] = skuItem[structureItem.name];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this.isInit = false;
|
||||||
|
}, 0);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 根据 attribute 进行排列组合,生成 skuData 数据
|
||||||
|
combinationAttribute(index = 0, dataTemp = []) {
|
||||||
|
if (index === 0) {
|
||||||
|
for (let i = 0; i < this.attribute[0].item.length; i++) {
|
||||||
|
const obj = {
|
||||||
|
sku: this.attribute[0].item[i],
|
||||||
|
[this.attribute[0].name]: this.attribute[0].item[i],
|
||||||
|
};
|
||||||
|
this.structure.forEach((v) => {
|
||||||
|
if (!(v.type == "slot" && v.skuProperty == false)) {
|
||||||
|
obj[v.name] =
|
||||||
|
typeof v.defaultValue != "undefined" ? v.defaultValue : "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dataTemp.push(obj);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const temp = [];
|
||||||
|
for (let i = 0; i < dataTemp.length; i++) {
|
||||||
|
for (let j = 0; j < this.attribute[index].item.length; j++) {
|
||||||
|
temp.push(JSON.parse(JSON.stringify(dataTemp[i])));
|
||||||
|
temp[temp.length - 1][this.attribute[index].name] =
|
||||||
|
this.attribute[index].item[j];
|
||||||
|
temp[temp.length - 1]["sku"] = [
|
||||||
|
temp[temp.length - 1]["sku"],
|
||||||
|
this.attribute[index].item[j],
|
||||||
|
].join(this.separator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dataTemp = temp;
|
||||||
|
}
|
||||||
|
if (index !== this.attribute.length - 1) {
|
||||||
|
this.combinationAttribute(index + 1, dataTemp);
|
||||||
|
} else {
|
||||||
|
if (!this.isInit || this.async) {
|
||||||
|
// 将原有的 sku 数据和新的 sku 数据比较,相同的 sku 则把原有的 sku 数据覆盖到新的 sku 数据里
|
||||||
|
for (let i = 0; i < this.form.skuData.length; i++) {
|
||||||
|
for (let j = 0; j < dataTemp.length; j++) {
|
||||||
|
if (this.form.skuData[i].sku === dataTemp[j].sku) {
|
||||||
|
dataTemp[j] = this.form.skuData[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.form.skuData = dataTemp;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 新增一个规格
|
||||||
|
onAddAttribute(index) {
|
||||||
|
this.myAttribute[index].addAttribute =
|
||||||
|
this.myAttribute[index].addAttribute.trim();
|
||||||
|
if (this.myAttribute[index].addAttribute !== "") {
|
||||||
|
if (!this.myAttribute[index].addAttribute.includes(this.separator)) {
|
||||||
|
const flag = this.myAttribute[index].item.some((item) => {
|
||||||
|
return item.name === this.myAttribute[index].addAttribute;
|
||||||
|
});
|
||||||
|
if (!flag) {
|
||||||
|
this.myAttribute[index].item.push({
|
||||||
|
name: this.myAttribute[index].addAttribute,
|
||||||
|
checked: true,
|
||||||
|
});
|
||||||
|
this.myAttribute[index].addAttribute = "";
|
||||||
|
} else {
|
||||||
|
this.$message({
|
||||||
|
type: "warning",
|
||||||
|
message: "请勿添加相同规格",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.$message({
|
||||||
|
type: "warning",
|
||||||
|
message: `规格里不允许出现「 ${this.separator} 」字符,请检查后重新添加`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onBatchSet(type) {
|
||||||
|
if (this.batch[type] != "") {
|
||||||
|
this.form.skuData.forEach((v) => {
|
||||||
|
v[type] = this.batch[type];
|
||||||
|
});
|
||||||
|
this.batch[type] = "";
|
||||||
|
// 批量设置完成后,触发一次当前列的验证
|
||||||
|
this.validateFieldByColumns([type], () => {});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 自定义输入框验证,通过调用 structure 里的 validate 方法实现,重点是 callback 要带过去
|
||||||
|
customizeValidate(rule, value, callback) {
|
||||||
|
let [model, index, name] = rule.field.split(".");
|
||||||
|
this.structure.forEach((v) => {
|
||||||
|
if (v.name == name) {
|
||||||
|
v.validate(this.form[model], index, callback);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// sku 表单验证
|
||||||
|
validate(callback) {
|
||||||
|
this.$refs["form"].validate((valid) => {
|
||||||
|
callback(valid);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
validateFieldByColumns(colums, callback) {
|
||||||
|
let props = [];
|
||||||
|
this.form.skuData.forEach((v, i) => {
|
||||||
|
colums.forEach((v) => {
|
||||||
|
props.push(`skuData.${i}.${v}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this.$refs["form"].validateField(props, (valid) => {
|
||||||
|
callback(valid);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
validateFieldByRows(index, prop, callback) {
|
||||||
|
this.$refs["form"].validateField(
|
||||||
|
[`skuData.${index}.${prop}`],
|
||||||
|
(valid) => {
|
||||||
|
callback(valid);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
clearValidate() {
|
||||||
|
this.$refs["form"].clearValidate();
|
||||||
|
},
|
||||||
|
getArray(){
|
||||||
|
return this.myAttribute
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.sku-container {
|
||||||
|
::v-deep .el-card {
|
||||||
|
margin: 10px 0;
|
||||||
|
.el-card__header {
|
||||||
|
line-height: initial;
|
||||||
|
padding: 10px 20px;
|
||||||
|
}
|
||||||
|
.el-card__body {
|
||||||
|
padding: 10px 20px 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.sku-check {
|
||||||
|
.theme-1 {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
.item {
|
||||||
|
width: 32%;
|
||||||
|
&:last-child:nth-child(3n - 1) {
|
||||||
|
margin-right: calc(100% - 32% * 2 - 4% / 2) !important;
|
||||||
|
}
|
||||||
|
.add-attr {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.theme-2 {
|
||||||
|
border: 1px solid #ebeef5;
|
||||||
|
border-bottom: 0;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.sku-name {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.batch-set {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
.sku-list {
|
||||||
|
line-height: initial;
|
||||||
|
::v-deep .el-input__inner {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
::v-deep .el-table__append-wrapper {
|
||||||
|
overflow: initial;
|
||||||
|
.el-table {
|
||||||
|
overflow: initial;
|
||||||
|
.el-table__body-wrapper {
|
||||||
|
overflow: initial;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::v-deep .el-form-item {
|
||||||
|
margin-bottom: 0;
|
||||||
|
.el-form-item__content {
|
||||||
|
line-height: initial;
|
||||||
|
.el-form-item__error {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.required_title::before {
|
||||||
|
content: "*";
|
||||||
|
color: #f56c6c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,359 @@
|
||||||
|
<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="title">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.title"
|
||||||
|
placeholder="请输入名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="位置" prop="type">
|
||||||
|
<el-select v-model="queryParams.type" placeholder="请选择位置" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in dict.type.adv_img_type"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||||
|
</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="['system:AdvImg: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:AdvImg: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:AdvImg:remove']"
|
||||||
|
>删除</el-button>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="1.5">
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
icon="el-icon-download"
|
||||||
|
size="mini"
|
||||||
|
@click="handleExport"
|
||||||
|
v-hasPermi="['system:AdvImg:export']"
|
||||||
|
>导出</el-button>
|
||||||
|
</el-col>
|
||||||
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-table v-loading="loading" :data="AdvImgList" @selection-change="handleSelectionChange">
|
||||||
|
<el-table-column type="selection" width="55" align="center" />
|
||||||
|
<el-table-column label="ID" width="55" align="center" prop="id" />
|
||||||
|
<el-table-column label="标题" align="center" prop="title" />
|
||||||
|
<el-table-column label="位置" align="center" prop="type">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<dict-tag :options="dict.type.adv_img_type" :value="scope.row.type"/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="图片" align="center" prop="image" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<image-preview :src="scope.row.image" :width="50" :height="50"/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column label="排序" align="center" prop="sort" />
|
||||||
|
|
||||||
|
<el-table-column label="状态" width="85" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-switch
|
||||||
|
v-model="scope.row.status"
|
||||||
|
:active-value="1"
|
||||||
|
:inactive-value="0"
|
||||||
|
@change="handlefenleiStatusChange(scope.row)"
|
||||||
|
></el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" align="center" prop="createdAt" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" align="center" prop="updatedAt" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button
|
||||||
|
size="mini"
|
||||||
|
type="text"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click="handleUpdate(scope.row)"
|
||||||
|
v-hasPermi="['system:AdvImg:edit']"
|
||||||
|
>修改</el-button>
|
||||||
|
<el-button
|
||||||
|
size="mini"
|
||||||
|
type="text"
|
||||||
|
icon="el-icon-delete"
|
||||||
|
@click="handleDelete(scope.row)"
|
||||||
|
v-hasPermi="['system:AdvImg:remove']"
|
||||||
|
>删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
v-show="total>0"
|
||||||
|
:total="total"
|
||||||
|
:page.sync="queryParams.pageNum"
|
||||||
|
:limit.sync="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- 添加或修改广告配置对话框 -->
|
||||||
|
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||||
|
<el-form-item label="名称" prop="title">
|
||||||
|
<el-input v-model="form.title" placeholder="请输入名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="位置" prop="type">
|
||||||
|
<el-select v-model="form.type" placeholder="请选择位置">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in dict.type.adv_img_type"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="parseInt(dict.value)"
|
||||||
|
></el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="图片" prop="image">
|
||||||
|
<image-upload v-model="form.image"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="链接" prop="link">
|
||||||
|
<el-input v-model="form.link" placeholder="请输入链接" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="排序" prop="sort">
|
||||||
|
<el-input v-model="form.sort" placeholder="请输入排序" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="${comment}" prop="createdAt">
|
||||||
|
<el-date-picker clearable
|
||||||
|
v-model="form.createdAt"
|
||||||
|
type="date"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
placeholder="请选择${comment}">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="${comment}" prop="updatedAt">
|
||||||
|
<el-date-picker clearable
|
||||||
|
v-model="form.updatedAt"
|
||||||
|
type="date"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
placeholder="请选择${comment}">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||||
|
<el-button @click="cancel">取 消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { listAdvImg, getAdvImg, delAdvImg, addAdvImg, updateAdvImg ,changefenleiStatus} from "@/api/system/AdvImg"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "AdvImg",
|
||||||
|
dicts: ['adv_img_type'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 遮罩层
|
||||||
|
loading: true,
|
||||||
|
// 选中数组
|
||||||
|
ids: [],
|
||||||
|
// 非单个禁用
|
||||||
|
single: true,
|
||||||
|
// 非多个禁用
|
||||||
|
multiple: true,
|
||||||
|
// 显示搜索条件
|
||||||
|
showSearch: true,
|
||||||
|
// 总条数
|
||||||
|
total: 0,
|
||||||
|
// 广告配置表格数据
|
||||||
|
AdvImgList: [],
|
||||||
|
// 弹出层标题
|
||||||
|
title: "",
|
||||||
|
// 是否显示弹出层
|
||||||
|
open: false,
|
||||||
|
// 查询参数
|
||||||
|
queryParams: {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
title: null,
|
||||||
|
type: null,
|
||||||
|
image: null,
|
||||||
|
link: null,
|
||||||
|
sort: null,
|
||||||
|
status: null,
|
||||||
|
},
|
||||||
|
// 表单参数
|
||||||
|
form: {},
|
||||||
|
// 表单校验
|
||||||
|
rules: {
|
||||||
|
title: [
|
||||||
|
{ required: true, message: "名称不能为空", trigger: "blur" }
|
||||||
|
],
|
||||||
|
type: [
|
||||||
|
{ required: true, message: "位置不能为空", trigger: "change" }
|
||||||
|
],
|
||||||
|
sort: [
|
||||||
|
{ required: true, message: "排序不能为空", trigger: "blur" }
|
||||||
|
],
|
||||||
|
status: [
|
||||||
|
{ required: true, message: "状态不能为空", trigger: "change" }
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 查询广告配置列表 */
|
||||||
|
getList() {
|
||||||
|
this.loading = true
|
||||||
|
listAdvImg(this.queryParams).then(response => {
|
||||||
|
this.AdvImgList = response.rows
|
||||||
|
this.total = response.total
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 取消按钮
|
||||||
|
cancel() {
|
||||||
|
this.open = false
|
||||||
|
this.reset()
|
||||||
|
},
|
||||||
|
// 表单重置
|
||||||
|
reset() {
|
||||||
|
this.form = {
|
||||||
|
id: null,
|
||||||
|
title: null,
|
||||||
|
type: null,
|
||||||
|
image: null,
|
||||||
|
link: null,
|
||||||
|
sort: null,
|
||||||
|
status: null,
|
||||||
|
createdAt: null,
|
||||||
|
updatedAt: null
|
||||||
|
}
|
||||||
|
this.resetForm("form")
|
||||||
|
},
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
handleQuery() {
|
||||||
|
this.queryParams.pageNum = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
resetQuery() {
|
||||||
|
this.resetForm("queryForm")
|
||||||
|
this.handleQuery()
|
||||||
|
},
|
||||||
|
handlefenleiStatusChange(row) {
|
||||||
|
let text = row.status === "0" ? "启用" : "停用"
|
||||||
|
this.$modal.confirm('确认要"' + text + '""' + row.title + '"状态吗?').then(function() {
|
||||||
|
return changefenleiStatus(row.id, row.status)
|
||||||
|
}).then(() => {
|
||||||
|
this.$modal.msgSuccess(text + "成功")
|
||||||
|
}).catch(function() {
|
||||||
|
row.status = row.status === "0" ? "1" : "0"
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 多选框选中数据
|
||||||
|
handleSelectionChange(selection) {
|
||||||
|
this.ids = selection.map(item => item.id)
|
||||||
|
this.single = selection.length!==1
|
||||||
|
this.multiple = !selection.length
|
||||||
|
},
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
handleAdd() {
|
||||||
|
this.reset()
|
||||||
|
this.open = true
|
||||||
|
this.title = "添加广告配置"
|
||||||
|
},
|
||||||
|
/** 修改按钮操作 */
|
||||||
|
handleUpdate(row) {
|
||||||
|
this.reset()
|
||||||
|
const id = row.id || this.ids
|
||||||
|
getAdvImg(id).then(response => {
|
||||||
|
this.form = response.data
|
||||||
|
this.open = true
|
||||||
|
this.title = "修改广告配置"
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 提交按钮 */
|
||||||
|
submitForm() {
|
||||||
|
this.$refs["form"].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
if (this.form.id != null) {
|
||||||
|
updateAdvImg(this.form).then(response => {
|
||||||
|
this.$modal.msgSuccess("修改成功")
|
||||||
|
this.open = false
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
addAdvImg(this.form).then(response => {
|
||||||
|
this.$modal.msgSuccess("新增成功")
|
||||||
|
this.open = false
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
handleDelete(row) {
|
||||||
|
const ids = row.id || this.ids
|
||||||
|
this.$modal.confirm('是否确认删除广告配置编号为"' + ids + '"的数据项?').then(function() {
|
||||||
|
return delAdvImg(ids)
|
||||||
|
}).then(() => {
|
||||||
|
this.getList()
|
||||||
|
this.$modal.msgSuccess("删除成功")
|
||||||
|
}).catch(() => {})
|
||||||
|
},
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
handleExport() {
|
||||||
|
this.download('system/AdvImg/export', {
|
||||||
|
...this.queryParams
|
||||||
|
}, `AdvImg_${new Date().getTime()}.xlsx`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -209,113 +209,92 @@
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- 添加或修改商品订单对话框 -->
|
<!-- 添加或修改商品订单对话框 -->
|
||||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
|
||||||
<el-form-item label="主订单号" prop="mainOrderId">
|
<el-row :gutter="20">
|
||||||
<el-input v-model="form.mainOrderId" placeholder="请输入主订单号" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="订单号" prop="orderId">
|
||||||
<el-form-item label="订单号" prop="orderId">
|
<el-input v-model="form.orderId" placeholder="请输入订单号" />
|
||||||
<el-input v-model="form.orderId" placeholder="请输入订单号" />
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="微信支付单号" prop="transactionId">
|
<el-col :span="24">
|
||||||
<el-input v-model="form.transactionId" placeholder="请输入微信支付单号" />
|
<el-form-item label="微信支付单号" prop="transactionId">
|
||||||
</el-form-item>
|
<el-input v-model="form.transactionId" placeholder="请输入微信支付单号" />
|
||||||
<el-form-item label="用户" prop="uid">
|
</el-form-item>
|
||||||
<el-input v-model="form.uid" placeholder="请输入用户" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
<el-form-item label="商品" prop="productId">
|
<el-form-item label="用户" prop="uid">
|
||||||
<el-input v-model="form.productId" placeholder="请输入商品" />
|
<el-input v-model="form.uid" placeholder="请输入用户" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="姓名" prop="name">
|
</el-col>
|
||||||
<el-input v-model="form.name" placeholder="请输入姓名" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="商品" prop="productId">
|
||||||
<el-form-item label="电话" prop="phone">
|
<el-input v-model="form.productId" placeholder="请输入商品" />
|
||||||
<el-input v-model="form.phone" placeholder="请输入电话" />
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="地址" prop="address">
|
<el-col :span="24">
|
||||||
<el-input v-model="form.address" placeholder="请输入地址" />
|
<el-form-item label="数量" prop="num">
|
||||||
</el-form-item>
|
<el-input-number v-model="form.num" :min="1" style="width: 120px;" />
|
||||||
<el-form-item label="数量" prop="num">
|
</el-form-item>
|
||||||
<el-input v-model="form.num" placeholder="请输入数量" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
<el-form-item label="总价" prop="totalPrice">
|
<el-form-item label="总价" prop="totalPrice">
|
||||||
<el-input v-model="form.totalPrice" placeholder="请输入总价" />
|
<el-input v-model="form.totalPrice" placeholder="请输入总价" prefix-icon="el-icon-money" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商品金额" prop="goodPrice">
|
</el-col>
|
||||||
<el-input v-model="form.goodPrice" placeholder="请输入商品金额" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="支付金额" prop="payPrice">
|
||||||
<el-form-item label="服务金额" prop="servicePrice">
|
<el-input v-model="form.payPrice" placeholder="请输入支付金额" prefix-icon="el-icon-money" />
|
||||||
<el-input v-model="form.servicePrice" placeholder="请输入服务金额" />
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="支付金额" prop="payPrice">
|
<el-col :span="24">
|
||||||
<el-input v-model="form.payPrice" placeholder="请输入支付金额" />
|
<el-form-item label="抵扣金额" prop="deduction">
|
||||||
</el-form-item>
|
<el-input v-model="form.deduction" placeholder="请输入抵扣金额" />
|
||||||
<el-form-item label="抵扣金额" prop="deduction">
|
</el-form-item>
|
||||||
<el-input v-model="form.deduction" placeholder="请输入抵扣金额" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
<el-form-item label="邮费" prop="postage">
|
<el-form-item label="支付时间" prop="payTime">
|
||||||
<el-input v-model="form.postage" placeholder="请输入邮费" />
|
<el-date-picker clearable v-model="form.payTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择支付时间" style="width:100%" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="支付时间" prop="payTime">
|
</el-col>
|
||||||
<el-date-picker clearable
|
<el-col :span="24">
|
||||||
v-model="form.payTime"
|
<el-form-item label="订单状态" prop="status">
|
||||||
type="date"
|
<el-radio-group v-model="form.status">
|
||||||
value-format="yyyy-MM-dd"
|
<el-radio :label="1">待支付</el-radio>
|
||||||
placeholder="请选择支付时间">
|
<el-radio :label="2">已支付</el-radio>
|
||||||
</el-date-picker>
|
<el-radio :label="3">待发货</el-radio>
|
||||||
</el-form-item>
|
<el-radio :label="4">待收货</el-radio>
|
||||||
<el-form-item label="快递" prop="deliveryId">
|
<el-radio :label="5">已完成</el-radio>
|
||||||
<el-input v-model="form.deliveryId" placeholder="请输入快递" />
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="快递单号" prop="deliveryNum">
|
</el-col>
|
||||||
<el-input v-model="form.deliveryNum" placeholder="请输入快递单号" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="关联地址" prop="addressId">
|
||||||
<el-form-item label="发货时间" prop="sendTime">
|
<el-input v-model="form.addressId" placeholder="请输入关联地址" />
|
||||||
<el-date-picker clearable
|
</el-form-item>
|
||||||
v-model="form.sendTime"
|
</el-col>
|
||||||
type="date"
|
<el-col :span="24">
|
||||||
value-format="yyyy-MM-dd"
|
<el-form-item label="备注" prop="mark">
|
||||||
placeholder="请选择发货时间">
|
<el-input v-model="form.mark" type="textarea" placeholder="请输入备注" />
|
||||||
</el-date-picker>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="备注" prop="mark">
|
<el-col :span="24">
|
||||||
<el-input v-model="form.mark" placeholder="请输入备注" />
|
<el-form-item label="创建时间" prop="createdAt">
|
||||||
</el-form-item>
|
<el-date-picker clearable v-model="form.createdAt" type="date" value-format="yyyy-MM-dd" placeholder="请选择创建时间" style="width:100%" />
|
||||||
<el-form-item label="关联地址" prop="addressId">
|
</el-form-item>
|
||||||
<el-input v-model="form.addressId" placeholder="请输入关联地址" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
<el-form-item label="多规格产品" prop="sku">
|
<el-form-item label="更新时间" prop="updatedAt">
|
||||||
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
|
<el-date-picker clearable v-model="form.updatedAt" type="date" value-format="yyyy-MM-dd" placeholder="请选择更新时间" style="width:100%" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="${comment}" prop="createdAt">
|
</el-col>
|
||||||
<el-date-picker clearable
|
</el-row>
|
||||||
v-model="form.createdAt"
|
<div class="dialog-footer" style="text-align:left;margin-top:20px;">
|
||||||
type="date"
|
<el-button @click="reset">重置</el-button>
|
||||||
value-format="yyyy-MM-dd"
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
placeholder="请选择${comment}">
|
</div>
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="updatedAt">
|
|
||||||
<el-date-picker clearable
|
|
||||||
v-model="form.updatedAt"
|
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="请选择${comment}">
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="deletedAt">
|
|
||||||
<el-date-picker clearable
|
|
||||||
v-model="form.deletedAt"
|
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="请选择${comment}">
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
</el-form>
|
||||||
<div slot="footer" class="dialog-footer">
|
|
||||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
|
||||||
<el-button @click="cancel">取 消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
||||||
|
|
@ -203,110 +203,119 @@
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- 添加或修改服务内容对话框 -->
|
<!-- 添加或修改服务内容对话框 -->
|
||||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
<el-drawer :title="title" :visible.sync="open" size="60%" append-to-body >
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
<div style="padding:0 30px;">
|
||||||
<el-form-item label="标题" prop="title">
|
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||||
<el-input v-model="form.title" placeholder="请输入标题" />
|
<el-tabs v-model="activeTab">
|
||||||
</el-form-item>
|
<el-tab-pane label="基本信息" name="base">
|
||||||
<el-form-item label="图标" prop="icon">
|
<el-form-item label="标题" prop="title">
|
||||||
<image-upload v-model="form.icon"/>
|
<el-input v-model="form.title" placeholder="请输入标题" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="轮播图" prop="imgs">
|
<el-form-item label="副标题" prop="subTitle">
|
||||||
<image-upload v-model="form.imgs"/>
|
<el-input v-model="form.subTitle" placeholder="请输入副标题" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="副标题" prop="subTitle">
|
<el-form-item label="图标" prop="icon">
|
||||||
<el-input v-model="form.subTitle" placeholder="请输入副标题" />
|
<image-upload v-model="form.icon"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="简介" prop="info">
|
<el-form-item label="轮播图" prop="imgs">
|
||||||
<el-input v-model="form.info" type="textarea" placeholder="请输入内容" />
|
<image-upload v-model="form.imgs"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="价格" prop="price">
|
<el-form-item label="简介" prop="info">
|
||||||
<el-input v-model="form.price" placeholder="请输入价格" />
|
<el-input v-model="form.info" type="textarea" placeholder="请输入内容" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="列表价格显示" prop="priceZn">
|
<el-form-item label="价格" prop="price">
|
||||||
<el-input v-model="form.priceZn" placeholder="请输入列表价格显示" />
|
<el-input v-model="form.price" placeholder="请输入价格" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="销量" prop="sales">
|
<el-form-item label="列表价格显示" prop="priceZn">
|
||||||
<el-input v-model="form.sales" placeholder="请输入销量" />
|
<el-input v-model="form.priceZn" placeholder="请输入列表价格显示" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="库存" prop="stock">
|
<el-form-item label="分类" prop="cateId">
|
||||||
<el-input v-model="form.stock" placeholder="请输入库存" />
|
<el-select v-model="form.cateId" placeholder="请选择分类">
|
||||||
</el-form-item>
|
<el-option v-for="cate in serviceCateList" :key="cate.id" :label="cate.title" :value="cate.id" />
|
||||||
<el-form-item label="状态" prop="status">
|
</el-select>
|
||||||
<el-radio-group v-model="form.status">
|
</el-form-item>
|
||||||
<el-radio
|
<el-form-item label="保证金" prop="margin">
|
||||||
v-for="dict in dict.type.service_goods_status"
|
<el-input v-model="form.margin" placeholder="请输入保证金" />
|
||||||
:key="dict.value"
|
</el-form-item>
|
||||||
:label="dict.value"
|
<el-form-item label="所需技能" prop="skillIds">
|
||||||
>{{dict.label}}</el-radio>
|
<el-input v-model="form.skillIds" type="textarea" placeholder="请输入内容" />
|
||||||
</el-radio-group>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-tab-pane>
|
||||||
<el-form-item label="详情" prop="description">
|
<el-tab-pane label="营销配置" name="marketing">
|
||||||
<el-input v-model="form.description" type="textarea" placeholder="请输入内容" />
|
<el-form-item label="销量" prop="sales" required>
|
||||||
</el-form-item>
|
<el-input-number
|
||||||
<el-form-item label="规格" prop="sku">
|
v-model="form.sales"
|
||||||
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
|
:min="0"
|
||||||
</el-form-item>
|
:step="1"
|
||||||
<el-form-item label="经度" prop="latitude">
|
controls-position="both"
|
||||||
<el-input v-model="form.latitude" placeholder="请输入经度" />
|
style="width: 200px"
|
||||||
</el-form-item>
|
/>
|
||||||
<el-form-item label="纬度" prop="longitude">
|
</el-form-item>
|
||||||
<el-input v-model="form.longitude" placeholder="请输入纬度" />
|
<el-form-item label="排序" prop="sort" required>
|
||||||
</el-form-item>
|
<el-input-number
|
||||||
<el-form-item label="分类" prop="cateId">
|
v-model="form.sort"
|
||||||
<el-input v-model="form.cateId" placeholder="请输入分类" />
|
:min="0"
|
||||||
</el-form-item>
|
:step="1"
|
||||||
<el-form-item label="服务项目" prop="project">
|
controls-position="both"
|
||||||
<el-input v-model="form.project" type="textarea" placeholder="请输入内容" />
|
style="width: 200px"
|
||||||
</el-form-item>
|
/>
|
||||||
<el-form-item label="排序" prop="sort">
|
</el-form-item>
|
||||||
<el-input v-model="form.sort" placeholder="请输入排序" />
|
<el-form-item label="库存" prop="stock">
|
||||||
</el-form-item>
|
<el-input-number
|
||||||
<el-form-item label="物料费用" prop="material">
|
v-model="form.stock"
|
||||||
<el-input v-model="form.material" type="textarea" placeholder="请输入内容" />
|
:min="0"
|
||||||
</el-form-item>
|
:step="1"
|
||||||
<el-form-item label="邮费" prop="postage">
|
controls-position="both"
|
||||||
<el-input v-model="form.postage" placeholder="请输入邮费" />
|
style="width: 200px"
|
||||||
</el-form-item>
|
/>
|
||||||
<el-form-item label="基检现象" prop="basic">
|
</el-form-item>
|
||||||
<el-input v-model="form.basic" type="textarea" placeholder="请输入内容" />
|
<el-form-item label="状态" prop="status">
|
||||||
</el-form-item>
|
<el-switch
|
||||||
<el-form-item label="保证金" prop="margin">
|
v-model="form.status"
|
||||||
<el-input v-model="form.margin" placeholder="请输入保证金" />
|
active-value="1"
|
||||||
</el-form-item>
|
inactive-value="0"
|
||||||
<el-form-item label="所需技能" prop="skillIds">
|
/>
|
||||||
<el-input v-model="form.skillIds" type="textarea" placeholder="请输入内容" />
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-tab-pane>
|
||||||
<el-form-item label="${comment}" prop="createdAt">
|
<el-tab-pane label="规格配置" name="spec">
|
||||||
<el-date-picker clearable
|
<el-form-item label="规格">
|
||||||
v-model="form.createdAt"
|
<el-radio-group v-model="skuType">
|
||||||
type="date"
|
<el-radio-button label="single">单规格</el-radio-button>
|
||||||
value-format="yyyy-MM-dd"
|
<el-radio-button label="multi">多规格</el-radio-button>
|
||||||
placeholder="请选择${comment}">
|
</el-radio-group>
|
||||||
</el-date-picker>
|
</el-form-item>
|
||||||
</el-form-item>
|
<div v-if="skuType === 'single'">
|
||||||
<el-form-item label="${comment}" prop="updatedAt">
|
<el-form-item label="规格名">
|
||||||
<el-date-picker clearable
|
<el-input v-model="form.skuName" placeholder="请输入规格名" />
|
||||||
v-model="form.updatedAt"
|
</el-form-item>
|
||||||
type="date"
|
<el-form-item label="规格值">
|
||||||
value-format="yyyy-MM-dd"
|
<el-input v-model="form.skuValue" placeholder="请输入规格值" />
|
||||||
placeholder="请选择${comment}">
|
</el-form-item>
|
||||||
</el-date-picker>
|
</div>
|
||||||
</el-form-item>
|
<div v-else>
|
||||||
<el-form-item label="${comment}" prop="deletedAt">
|
<Sku :info="form.sku" ref="skuRef"></Sku>
|
||||||
<el-date-picker clearable
|
</div>
|
||||||
v-model="form.deletedAt"
|
</el-tab-pane>
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
<el-tab-pane label="详情配置" name="detail">
|
||||||
placeholder="请选择${comment}">
|
<el-form-item label="详情" prop="description">
|
||||||
</el-date-picker>
|
<editor v-model="form.description" :min-height="200" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="服务项目" prop="project">
|
||||||
|
<editor v-model="form.project" :min-height="200" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="物料费用" prop="material">
|
||||||
|
<editor v-model="form.material" :min-height="200" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div slot="footer" class="dialog-footer">
|
<div slot="footer" class="dialog-footer">
|
||||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||||
<el-button @click="cancel">取 消</el-button>
|
<el-button @click="cancel">取 消</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</div>
|
||||||
|
</el-drawer>
|
||||||
|
|
||||||
<el-dialog :visible.sync="audioDialogVisible" title="录音播放" width="400px">
|
<el-dialog :visible.sync="audioDialogVisible" title="录音播放" width="400px">
|
||||||
<audio v-if="currentAudioUrl" :src="currentAudioUrl" controls style="width:100%"></audio>
|
<audio v-if="currentAudioUrl" :src="currentAudioUrl" controls style="width:100%"></audio>
|
||||||
|
|
@ -330,10 +339,12 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { listServiceGoods, getServiceGoods, delServiceGoods, addServiceGoods, updateServiceGoods ,changefenleiStatus,selectServiceCateList} from "@/api/system/ServiceGoods"
|
import { listServiceGoods, getServiceGoods, delServiceGoods, addServiceGoods, updateServiceGoods ,changefenleiStatus,selectServiceCateList} from "@/api/system/ServiceGoods"
|
||||||
|
import Editor from '@/components/Editor'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ServiceGoods",
|
name: "ServiceGoods",
|
||||||
dicts: ['service_goods_status'],
|
dicts: ['service_goods_status'],
|
||||||
|
components: { Editor },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
|
|
@ -402,6 +413,11 @@ export default {
|
||||||
editFieldLabel: '',
|
editFieldLabel: '',
|
||||||
editRow: null,
|
editRow: null,
|
||||||
daterangeCreatedAt: [],
|
daterangeCreatedAt: [],
|
||||||
|
activeTab: 'base',
|
||||||
|
skuType: 'single',
|
||||||
|
skuList: [ { name: '', value: '' } ],
|
||||||
|
specList: [ { name: '', values: [''] } ],
|
||||||
|
skuTable: [],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
|
@ -514,6 +530,18 @@ export default {
|
||||||
},
|
},
|
||||||
/** 提交按钮 */
|
/** 提交按钮 */
|
||||||
submitForm() {
|
submitForm() {
|
||||||
|
if( this.$refs.skuRef.submit()){
|
||||||
|
this.form.sku=this.$refs.skuRef.submit();
|
||||||
|
}else{
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// if(this.$refs.skuRef.submit()){}
|
||||||
|
|
||||||
|
|
||||||
this.$refs["form"].validate(valid => {
|
this.$refs["form"].validate(valid => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
if (this.form.id != null) {
|
if (this.form.id != null) {
|
||||||
|
|
@ -582,6 +610,47 @@ export default {
|
||||||
this.$message.error('修改失败');
|
this.$message.error('修改失败');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
addSpec() {
|
||||||
|
this.specList.push({ name: '', values: [''] });
|
||||||
|
this.updateSkuTable();
|
||||||
|
},
|
||||||
|
removeSpec(idx) {
|
||||||
|
this.specList.splice(idx, 1);
|
||||||
|
this.updateSkuTable();
|
||||||
|
},
|
||||||
|
addSpecValue(specIdx) {
|
||||||
|
this.specList[specIdx].values.push('');
|
||||||
|
this.updateSkuTable();
|
||||||
|
},
|
||||||
|
removeSpecValue(specIdx, valIdx) {
|
||||||
|
this.specList[specIdx].values.splice(valIdx, 1);
|
||||||
|
this.updateSkuTable();
|
||||||
|
},
|
||||||
|
updateSkuTable() {
|
||||||
|
if (this.specList.length === 0) {
|
||||||
|
this.skuTable = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const valueArr = this.specList.map(spec => spec.values.filter(v => v));
|
||||||
|
if (valueArr.some(arr => arr.length === 0)) {
|
||||||
|
this.skuTable = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const cartesian = (arr) => arr.reduce((a, b) => a.flatMap(d => b.map(e => [].concat(d, e))));
|
||||||
|
const combos = cartesian(valueArr);
|
||||||
|
this.skuTable = combos.map(combo => {
|
||||||
|
const row = {};
|
||||||
|
this.specList.forEach((spec, i) => row[spec.name] = combo[i]);
|
||||||
|
return Object.assign(row, { imageUrl: '', price: 0, stock: 0 });
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleImageSuccess(idx, file) {
|
||||||
|
// 这里只做本地预览,实际应上传到服务器后赋值url
|
||||||
|
this.$set(this.skuTable[idx], 'imageUrl', URL.createObjectURL(file.raw));
|
||||||
|
},
|
||||||
|
removeSkuImage(idx) {
|
||||||
|
this.$set(this.skuTable[idx], 'imageUrl', '');
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -328,156 +328,92 @@
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- 添加或修改服务订单对话框 -->
|
<!-- 添加或修改服务订单对话框 -->
|
||||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
<el-drawer :title="title" :visible.sync="open" size="60%" append-to-body>
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
|
||||||
<el-form-item label="主订单号" prop="mainOrderId">
|
<el-row :gutter="20">
|
||||||
<el-input v-model="form.mainOrderId" placeholder="请输入主订单号" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="订单号" prop="orderId">
|
||||||
<el-form-item label="订单号" prop="orderId">
|
<el-input v-model="form.orderId" placeholder="请输入订单号" />
|
||||||
<el-input v-model="form.orderId" placeholder="请输入订单号" />
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="微信支付单号" prop="transactionId">
|
<el-col :span="24">
|
||||||
<el-input v-model="form.transactionId" placeholder="请输入微信支付单号" />
|
<el-form-item label="微信支付单号" prop="transactionId">
|
||||||
</el-form-item>
|
<el-input v-model="form.transactionId" placeholder="请输入微信支付单号" />
|
||||||
<el-form-item label="后台下单用户手机号" prop="createPhone">
|
</el-form-item>
|
||||||
<el-input v-model="form.createPhone" placeholder="请输入后台下单用户手机号" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
<el-form-item label="用户" prop="uid">
|
<el-form-item label="用户" prop="uid">
|
||||||
<el-input v-model="form.uid" placeholder="请输入用户" />
|
<el-input v-model="form.uid" placeholder="请输入用户" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商品" prop="productId">
|
</el-col>
|
||||||
<el-input v-model="form.productId" placeholder="请输入商品" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="商品" prop="productId">
|
||||||
<el-form-item label="姓名" prop="name">
|
<el-input v-model="form.productId" placeholder="请输入商品" />
|
||||||
<el-input v-model="form.name" placeholder="请输入姓名" />
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="电话" prop="phone">
|
<el-col :span="24">
|
||||||
<el-input v-model="form.phone" placeholder="请输入电话" />
|
<el-form-item label="数量" prop="num">
|
||||||
</el-form-item>
|
<el-input-number v-model="form.num" :min="1" style="width: 120px;" />
|
||||||
<el-form-item label="地址" prop="address">
|
</el-form-item>
|
||||||
<el-input v-model="form.address" placeholder="请输入地址" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
<el-form-item label="预约时间-天" prop="makeTime">
|
<el-form-item label="总价" prop="totalPrice">
|
||||||
<el-input v-model="form.makeTime" placeholder="请输入预约时间-天" />
|
<el-input v-model="form.totalPrice" placeholder="请输入总价" prefix-icon="el-icon-money" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="预约时间-小时" prop="makeHour">
|
</el-col>
|
||||||
<el-input v-model="form.makeHour" placeholder="请输入预约时间-小时" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="支付金额" prop="payPrice">
|
||||||
<el-form-item label="数量" prop="num">
|
<el-input v-model="form.payPrice" placeholder="请输入支付金额" prefix-icon="el-icon-money" />
|
||||||
<el-input v-model="form.num" placeholder="请输入数量" />
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="总价" prop="totalPrice">
|
<el-col :span="24">
|
||||||
<el-input v-model="form.totalPrice" placeholder="请输入总价" />
|
<el-form-item label="抵扣金额" prop="deduction">
|
||||||
</el-form-item>
|
<el-input v-model="form.deduction" placeholder="请输入抵扣金额" />
|
||||||
<el-form-item label="商品金额" prop="goodPrice">
|
</el-form-item>
|
||||||
<el-input v-model="form.goodPrice" placeholder="请输入商品金额" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
<el-form-item label="服务金额" prop="servicePrice">
|
<el-form-item label="支付时间" prop="payTime">
|
||||||
<el-input v-model="form.servicePrice" placeholder="请输入服务金额" />
|
<el-date-picker clearable v-model="form.payTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择支付时间" style="width:100%" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="支付金额" prop="payPrice">
|
</el-col>
|
||||||
<el-input v-model="form.payPrice" placeholder="请输入支付金额" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="订单状态" prop="status">
|
||||||
<el-form-item label="优惠券ID" prop="couponId">
|
<el-radio-group v-model="form.status">
|
||||||
<el-input v-model="form.couponId" placeholder="请输入优惠券ID" />
|
<el-radio :label="1">待支付</el-radio>
|
||||||
</el-form-item>
|
<el-radio :label="2">已支付</el-radio>
|
||||||
<el-form-item label="抵扣金额" prop="deduction">
|
<el-radio :label="3">待发货</el-radio>
|
||||||
<el-input v-model="form.deduction" placeholder="请输入抵扣金额" />
|
<el-radio :label="4">待收货</el-radio>
|
||||||
</el-form-item>
|
<el-radio :label="5">已完成</el-radio>
|
||||||
<el-form-item label="支付时间" prop="payTime">
|
</el-radio-group>
|
||||||
<el-date-picker clearable
|
</el-form-item>
|
||||||
v-model="form.payTime"
|
</el-col>
|
||||||
type="date"
|
<el-col :span="24">
|
||||||
value-format="yyyy-MM-dd"
|
<el-form-item label="关联地址" prop="addressId">
|
||||||
placeholder="请选择支付时间">
|
<el-input v-model="form.addressId" placeholder="请输入关联地址" />
|
||||||
</el-date-picker>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="1:开始服务 2:暂停服务" prop="isPause">
|
<el-col :span="24">
|
||||||
<el-input v-model="form.isPause" placeholder="请输入1:开始服务 2:暂停服务" />
|
<el-form-item label="备注" prop="mark">
|
||||||
</el-form-item>
|
<el-input v-model="form.mark" type="textarea" placeholder="请输入备注" />
|
||||||
<el-form-item label="备注" prop="mark">
|
</el-form-item>
|
||||||
<el-input v-model="form.mark" placeholder="请输入备注" />
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
<el-form-item label="关联地址" prop="addressId">
|
<el-form-item label="创建时间" prop="createdAt">
|
||||||
<el-input v-model="form.addressId" placeholder="请输入关联地址" />
|
<el-date-picker clearable v-model="form.createdAt" type="date" value-format="yyyy-MM-dd" placeholder="请选择创建时间" style="width:100%" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="多规格产品" prop="sku">
|
</el-col>
|
||||||
<el-input v-model="form.sku" type="textarea" placeholder="请输入内容" />
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="更新时间" prop="updatedAt">
|
||||||
<el-form-item label="师傅ID" prop="workerId">
|
<el-date-picker clearable v-model="form.updatedAt" type="date" value-format="yyyy-MM-dd" placeholder="请选择更新时间" style="width:100%" />
|
||||||
<el-input v-model="form.workerId" placeholder="请输入师傅ID" />
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="转单之后,第一次接单的师傅" prop="firstWorkerId">
|
</el-row>
|
||||||
<el-input v-model="form.firstWorkerId" placeholder="请输入转单之后,第一次接单的师傅" />
|
<div class="dialog-footer" style="text-align:left;margin-top:20px;">
|
||||||
</el-form-item>
|
<el-button @click="reset">重置</el-button>
|
||||||
<el-form-item label="接单时间" prop="receiveTime">
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
<el-date-picker clearable
|
</div>
|
||||||
v-model="form.receiveTime"
|
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="请选择接单时间">
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="1:已评价 0:未评价" prop="isComment">
|
|
||||||
<el-input v-model="form.isComment" placeholder="请输入1:已评价 0:未评价" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="1:已经接单" prop="isAccept">
|
|
||||||
<el-input v-model="form.isAccept" placeholder="请输入1:已经接单" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="中间虚拟号" prop="middlePhone">
|
|
||||||
<el-input v-model="form.middlePhone" placeholder="请输入中间虚拟号" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="用户手机号" prop="userPhone">
|
|
||||||
<el-input v-model="form.userPhone" placeholder="请输入用户手机号" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="师傅手机号" prop="workerPhone">
|
|
||||||
<el-input v-model="form.workerPhone" placeholder="请输入师傅手机号" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="addressEn">
|
|
||||||
<el-input v-model="form.addressEn" placeholder="请输入${comment}" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="uidAdmin">
|
|
||||||
<el-input v-model="form.uidAdmin" placeholder="请输入${comment}" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="addressAdmin">
|
|
||||||
<el-input v-model="form.addressAdmin" placeholder="请输入${comment}" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="logJson">
|
|
||||||
<el-input v-model="form.logJson" type="textarea" placeholder="请输入内容" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="logImages">
|
|
||||||
<image-upload v-model="form.logImages"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="createdAt">
|
|
||||||
<el-date-picker clearable
|
|
||||||
v-model="form.createdAt"
|
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="请选择${comment}">
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="updatedAt">
|
|
||||||
<el-date-picker clearable
|
|
||||||
v-model="form.updatedAt"
|
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="请选择${comment}">
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="${comment}" prop="deletedAt">
|
|
||||||
<el-date-picker clearable
|
|
||||||
v-model="form.deletedAt"
|
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="请选择${comment}">
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
</el-form>
|
||||||
<div slot="footer" class="dialog-footer">
|
</el-drawer>
|
||||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
|
||||||
<el-button @click="cancel">取 消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-dialog>
|
|
||||||
|
|
||||||
<!-- 通话记录弹窗 -->
|
<!-- 通话记录弹窗 -->
|
||||||
<call-record
|
<call-record
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item> -->
|
</el-form-item> -->
|
||||||
<el-form-item label="服务项目" prop="goodId">
|
<el-form-item label="服务项目" prop="goodId">
|
||||||
<el-select v-model="queryParams.goodId" filterable placeholder="请选择服务项目" clearable>
|
<el-select v-model="queryParams.goodsids" filterable placeholder="请选择服务项目" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="type in typeDataList"
|
v-for="type in typeDataList"
|
||||||
:key="type.id"
|
:key="type.id"
|
||||||
|
|
@ -138,13 +138,10 @@
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- 添加或修改项目报价--工艺分类对话框 -->
|
<!-- 添加或修改项目报价--工艺分类对话框 -->
|
||||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||||
<el-form-item label="名称" prop="title">
|
|
||||||
<el-input v-model="form.title" placeholder="请输入名称" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="服务项目" prop="goodId">
|
<el-form-item label="服务项目" prop="goodId">
|
||||||
<el-select v-model="form.goodId" placeholder="请选择服务项目">
|
<el-select v-model="form.goodId" placeholder="请选择服务项目" style="width: 100%" multiple filterable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="type in typeDataList"
|
v-for="type in typeDataList"
|
||||||
:key="type.id"
|
:key="type.id"
|
||||||
|
|
@ -153,38 +150,19 @@
|
||||||
></el-option>
|
></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="名称" prop="title">
|
||||||
|
<el-input v-model="form.title" placeholder="请输入名称" />
|
||||||
|
</el-form-item>
|
||||||
<el-form-item label="排序" prop="sort">
|
<el-form-item label="排序" prop="sort">
|
||||||
<el-input v-model="form.sort" placeholder="请输入排序" />
|
<el-input-number v-model="form.sort" :min="1" style="width: 120px;" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-radio-group v-model="form.status">
|
<el-switch v-model="form.status" :active-value="1" :inactive-value="0" />
|
||||||
<el-radio
|
|
||||||
v-for="dict in dict.type.sys_quote_status"
|
|
||||||
:key="dict.value"
|
|
||||||
:label="parseInt(dict.value)"
|
|
||||||
>{{dict.label}}</el-radio>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="创建时间" prop="createdAt">
|
|
||||||
<el-date-picker clearable
|
|
||||||
v-model="form.createdAt"
|
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="请选择创建时间">
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="更新时间" prop="updatedAt">
|
|
||||||
<el-date-picker clearable
|
|
||||||
v-model="form.updatedAt"
|
|
||||||
type="date"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
placeholder="请选择更新时间">
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div slot="footer" class="dialog-footer">
|
<div class="dialog-footer" style="text-align:left;margin-top:20px;">
|
||||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
<el-button @click="reset">重置</el-button>
|
||||||
<el-button @click="cancel">取 消</el-button>
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -321,7 +299,14 @@ export default {
|
||||||
this.reset()
|
this.reset()
|
||||||
const id = row.id || this.ids
|
const id = row.id || this.ids
|
||||||
getQuoteType(id).then(response => {
|
getQuoteType(id).then(response => {
|
||||||
this.form = response.data
|
const data = response.data
|
||||||
|
// 处理 goodId 为多选数组
|
||||||
|
if (typeof data.goodId === 'string') {
|
||||||
|
data.goodId = data.goodId.split(',').map(i => i.trim()).filter(i => i)
|
||||||
|
} else if (!Array.isArray(data.goodId)) {
|
||||||
|
data.goodId = []
|
||||||
|
}
|
||||||
|
this.form = data
|
||||||
this.open = true
|
this.open = true
|
||||||
this.title = "修改项目报价--工艺分类"
|
this.title = "修改项目报价--工艺分类"
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -164,7 +164,7 @@
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- 添加或修改服务分类对话框 -->
|
<!-- 添加或修改服务分类对话框 -->
|
||||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
<el-dialog :title="title" :visible.sync="open" width="40%" append-to-body>
|
||||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px" class="dialog-form">
|
<el-form ref="form" :model="form" :rules="rules" label-width="80px" class="dialog-form">
|
||||||
<el-form-item label="名称" prop="title">
|
<el-form-item label="名称" prop="title">
|
||||||
<el-input v-model="form.title" placeholder="请输入名称" />
|
<el-input v-model="form.title" placeholder="请输入名称" />
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,559 @@
|
||||||
|
<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="name">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入昵称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="电话" prop="phone">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.phone"
|
||||||
|
placeholder="请输入电话"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="工号" prop="jobNumber">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.jobNumber"
|
||||||
|
placeholder="请输入工号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="状态" prop="status">
|
||||||
|
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in dict.type.users_status"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="等级" prop="level">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.level"
|
||||||
|
placeholder="请输入工号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="使用状态" prop="loginStatus">
|
||||||
|
<el-select v-model="queryParams.loginStatus" placeholder="请选择使用状态" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in dict.type.users_login_status"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="当前佣金" prop="priceRange" label-width="auto">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.commissionMin"
|
||||||
|
placeholder="最低价"
|
||||||
|
style="width: 100px; margin-right: 10px;"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
<span style="margin: 0 5px;">-</span>
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.commissionMax"
|
||||||
|
placeholder="最高价"
|
||||||
|
style="width: 100px;"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
|
||||||
|
<el-form-item label="质保金" prop="priceRange" label-width="auto">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.marginMin"
|
||||||
|
placeholder="最低价"
|
||||||
|
style="width: 100px; margin-right: 10px;"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
<span style="margin: 0 5px;">-</span>
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.marginMax"
|
||||||
|
placeholder="最高价"
|
||||||
|
style="width: 100px;"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
|
||||||
|
<el-form-item label="累计提现" prop="priceRange" label-width="auto">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.totalCommMin"
|
||||||
|
placeholder="最低价"
|
||||||
|
style="width: 100px; margin-right: 10px;"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
<span style="margin: 0 5px;">-</span>
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.totalCommMax"
|
||||||
|
placeholder="最高价"
|
||||||
|
style="width: 100px;"
|
||||||
|
type="number"
|
||||||
|
min="0"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||||
|
</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="['system:users: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:users: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:users:remove']"
|
||||||
|
>删除</el-button>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="1.5">
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
plain
|
||||||
|
icon="el-icon-download"
|
||||||
|
size="mini"
|
||||||
|
@click="handleExport"
|
||||||
|
v-hasPermi="['system:users:export']"
|
||||||
|
>导出</el-button>
|
||||||
|
</el-col>
|
||||||
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-table v-loading="loading" :data="usersList" @selection-change="handleSelectionChange">
|
||||||
|
<el-table-column type="selection" width="55" align="center" />
|
||||||
|
<el-table-column label="ID" align="center" width="55" prop="id" />
|
||||||
|
<el-table-column label="工号" align="center" prop="jobNumber" />
|
||||||
|
<el-table-column label="姓名" align="center" prop="name" />
|
||||||
|
<el-table-column label="电话" align="center" prop="phone" />
|
||||||
|
<el-table-column label="openid" align="center" prop="openid" />
|
||||||
|
<el-table-column label="头像" align="center" prop="avatar" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<image-preview :src="scope.row.avatar" :width="50" :height="50"/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="使用状态" align="center" prop="loginStatus">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<dict-tag :options="dict.type.users_login_status" :value="scope.row.loginStatus"/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column label="状态" width="85" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-switch
|
||||||
|
v-model="scope.row.status"
|
||||||
|
:active-value="1"
|
||||||
|
:inactive-value="0"
|
||||||
|
@change="handleStatusChange(scope.row)"
|
||||||
|
></el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="本月累计单量" align="center" prop="toa" />
|
||||||
|
<el-table-column label="签到时间" align="center" prop="createdAt" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ parseTime(scope.row.workerTime, '{y}-{m}-{d}') }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="等级" align="center" prop="level" />
|
||||||
|
<el-table-column label="当前佣金" align="center" prop="commission" />
|
||||||
|
<el-table-column label="累计佣金" align="center" prop="totalComm" />
|
||||||
|
<el-table-column label="质保金" align="center" prop="margin" />
|
||||||
|
<el-table-column label="累计提现" align="center" prop="propose" />
|
||||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button
|
||||||
|
size="mini"
|
||||||
|
type="text"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click="handleUpdate(scope.row)"
|
||||||
|
v-hasPermi="['system:users:edit']"
|
||||||
|
>修改</el-button>
|
||||||
|
<el-button
|
||||||
|
size="mini"
|
||||||
|
type="text"
|
||||||
|
icon="el-icon-delete"
|
||||||
|
@click="handleDelete(scope.row)"
|
||||||
|
v-hasPermi="['system:users:remove']"
|
||||||
|
>删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
v-show="total>0"
|
||||||
|
:total="total"
|
||||||
|
:page.sync="queryParams.pageNum"
|
||||||
|
:limit.sync="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- 添加或修改用户列表对话框 -->
|
||||||
|
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||||
|
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||||
|
<el-form-item label="昵称" prop="name">
|
||||||
|
<el-input v-model="form.name" placeholder="请输入昵称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="微信昵称" prop="nickname">
|
||||||
|
<el-input v-model="form.nickname" placeholder="请输入微信昵称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="电话" prop="phone">
|
||||||
|
<el-input v-model="form.phone" placeholder="请输入电话" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="${comment}" prop="password">
|
||||||
|
<el-input v-model="form.password" placeholder="请输入${comment}" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="${comment}" prop="rememberToken">
|
||||||
|
<el-input v-model="form.rememberToken" placeholder="请输入${comment}" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="${comment}" prop="openid">
|
||||||
|
<el-input v-model="form.openid" placeholder="请输入${comment}" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="头像" prop="avatar">
|
||||||
|
<image-upload v-model="form.avatar"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="师傅签到时间" prop="workerTime">
|
||||||
|
<el-date-picker clearable
|
||||||
|
v-model="form.workerTime"
|
||||||
|
type="date"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
placeholder="请选择师傅签到时间">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="可用积分" prop="integral">
|
||||||
|
<el-input v-model="form.integral" placeholder="请输入可用积分" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="累计积分" prop="totalIntegral">
|
||||||
|
<el-input v-model="form.totalIntegral" placeholder="请输入累计积分" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="1:启用 0:关闭" prop="status">
|
||||||
|
<el-radio-group v-model="form.status">
|
||||||
|
<el-radio
|
||||||
|
v-for="dict in dict.type.users_status"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="parseInt(dict.value)"
|
||||||
|
>{{dict.label}}</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="师傅等级" prop="level">
|
||||||
|
<el-input v-model="form.level" placeholder="请输入师傅等级" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="师傅佣金" prop="commission">
|
||||||
|
<el-input v-model="form.commission" placeholder="请输入师傅佣金" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="累计佣金" prop="totalComm">
|
||||||
|
<el-input v-model="form.totalComm" placeholder="请输入累计佣金" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="质保金" prop="margin">
|
||||||
|
<el-input v-model="form.margin" placeholder="请输入质保金" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="工号" prop="jobNumber">
|
||||||
|
<el-input v-model="form.jobNumber" placeholder="请输入工号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="禁止接单开始时间" prop="prohibitTime">
|
||||||
|
<el-date-picker clearable
|
||||||
|
v-model="form.prohibitTime"
|
||||||
|
type="date"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
placeholder="请选择禁止接单开始时间">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="禁止接单时长" prop="prohibitTimeNum">
|
||||||
|
<el-input v-model="form.prohibitTimeNum" placeholder="请输入禁止接单时长" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="师傅累计接单" prop="toa">
|
||||||
|
<el-input v-model="form.toa" placeholder="请输入师傅累计接单" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="师傅服务城市" prop="serviceCityPid">
|
||||||
|
<el-input v-model="form.serviceCityPid" placeholder="请输入师傅服务城市" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="师傅服务区域" prop="serviceCityIds">
|
||||||
|
<el-input v-model="form.serviceCityIds" type="textarea" placeholder="请输入内容" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="师傅技能ID" prop="skillIds">
|
||||||
|
<el-input v-model="form.skillIds" type="textarea" placeholder="请输入内容" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="累计提现" prop="propose">
|
||||||
|
<el-input v-model="form.propose" placeholder="请输入累计提现" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="0:默认 1:停止接单" prop="isStop">
|
||||||
|
<el-input v-model="form.isStop" placeholder="请输入0:默认 1:停止接单" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="1:虚拟号码-已认证" prop="middleAuth">
|
||||||
|
<el-input v-model="form.middleAuth" placeholder="请输入1:虚拟号码-已认证" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="${comment}" prop="createdAt">
|
||||||
|
<el-date-picker clearable
|
||||||
|
v-model="form.createdAt"
|
||||||
|
type="date"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
placeholder="请选择${comment}">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="${comment}" prop="updatedAt">
|
||||||
|
<el-date-picker clearable
|
||||||
|
v-model="form.updatedAt"
|
||||||
|
type="date"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
placeholder="请选择${comment}">
|
||||||
|
</el-date-picker>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||||
|
<el-button @click="cancel">取 消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { listUsers, getUsers, delUsers, addUsers, updateUsers,getUserDataList,changetypeStatus } from "@/api/system/users"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "Users",
|
||||||
|
dicts: ['users_status','users_login_status'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 遮罩层
|
||||||
|
loading: true,
|
||||||
|
// 选中数组
|
||||||
|
ids: [],
|
||||||
|
// 非单个禁用
|
||||||
|
single: true,
|
||||||
|
// 非多个禁用
|
||||||
|
multiple: true,
|
||||||
|
// 显示搜索条件
|
||||||
|
showSearch: true,
|
||||||
|
// 总条数
|
||||||
|
total: 0,
|
||||||
|
userDataList: [],
|
||||||
|
// 用户列表表格数据
|
||||||
|
usersList: [],
|
||||||
|
// 弹出层标题
|
||||||
|
title: "",
|
||||||
|
// 是否显示弹出层
|
||||||
|
open: false,
|
||||||
|
// 查询参数
|
||||||
|
queryParams: {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
totalCommMin: null,
|
||||||
|
totalCommMax: null,
|
||||||
|
marginMin: null,
|
||||||
|
marginMax: null,
|
||||||
|
commissionMin: null,
|
||||||
|
commissionMax: null,
|
||||||
|
jobNumber: null,
|
||||||
|
type: '2',
|
||||||
|
name: null,
|
||||||
|
phone: null,
|
||||||
|
status: null,
|
||||||
|
},
|
||||||
|
// 表单参数
|
||||||
|
form: {},
|
||||||
|
// 表单校验
|
||||||
|
rules: {
|
||||||
|
name: [
|
||||||
|
{ required: true, message: "昵称不能为空", trigger: "blur" }
|
||||||
|
],
|
||||||
|
phone: [
|
||||||
|
{ required: true, message: "电话不能为空", trigger: "blur" }
|
||||||
|
],
|
||||||
|
status: [
|
||||||
|
{ required: true, message: "1:启用 0:关闭不能为空", trigger: "change" }
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getList()
|
||||||
|
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/** 查询用户列表列表 */
|
||||||
|
getList() {
|
||||||
|
this.loading = true
|
||||||
|
listUsers(this.queryParams).then(response => {
|
||||||
|
this.usersList = response.rows
|
||||||
|
this.total = response.total
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 取消按钮
|
||||||
|
cancel() {
|
||||||
|
this.open = false
|
||||||
|
this.reset()
|
||||||
|
},
|
||||||
|
// 表单重置
|
||||||
|
reset() {
|
||||||
|
this.form = {
|
||||||
|
id: null,
|
||||||
|
name: null,
|
||||||
|
nickname: null,
|
||||||
|
phone: null,
|
||||||
|
password: null,
|
||||||
|
rememberToken: null,
|
||||||
|
openid: null,
|
||||||
|
avatar: null,
|
||||||
|
type: null,
|
||||||
|
workerTime: null,
|
||||||
|
integral: null,
|
||||||
|
totalIntegral: null,
|
||||||
|
status: null,
|
||||||
|
level: null,
|
||||||
|
commission: null,
|
||||||
|
totalComm: null,
|
||||||
|
margin: null,
|
||||||
|
jobNumber: null,
|
||||||
|
prohibitTime: null,
|
||||||
|
prohibitTimeNum: null,
|
||||||
|
toa: null,
|
||||||
|
serviceCityPid: null,
|
||||||
|
serviceCityIds: null,
|
||||||
|
skillIds: null,
|
||||||
|
propose: null,
|
||||||
|
loginStatus: null,
|
||||||
|
isStop: null,
|
||||||
|
middleAuth: null,
|
||||||
|
createdAt: null,
|
||||||
|
updatedAt: null
|
||||||
|
}
|
||||||
|
this.resetForm("form")
|
||||||
|
},
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
handleQuery() {
|
||||||
|
this.queryParams.pageNum = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
resetQuery() {
|
||||||
|
this.resetForm("queryForm")
|
||||||
|
this.handleQuery()
|
||||||
|
},
|
||||||
|
// 多选框选中数据
|
||||||
|
handleSelectionChange(selection) {
|
||||||
|
this.ids = selection.map(item => item.id)
|
||||||
|
this.single = selection.length!==1
|
||||||
|
this.multiple = !selection.length
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
handleAdd() {
|
||||||
|
this.reset()
|
||||||
|
this.open = true
|
||||||
|
this.title = "添加用户列表"
|
||||||
|
},
|
||||||
|
/** 修改按钮操作 */
|
||||||
|
handleUpdate(row) {
|
||||||
|
this.reset()
|
||||||
|
const id = row.id || this.ids
|
||||||
|
getUsers(id).then(response => {
|
||||||
|
this.form = response.data
|
||||||
|
this.open = true
|
||||||
|
this.title = "修改用户列表"
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 状态修改
|
||||||
|
handleStatusChange(row) {
|
||||||
|
let text = row.status === "0" ? "启用" : "停用"
|
||||||
|
this.$modal.confirm('确认要"' + text + '""' + row.name + '"状态吗?').then(function() {
|
||||||
|
return changetypeStatus(row.id, row.status)
|
||||||
|
}).then(() => {
|
||||||
|
this.$modal.msgSuccess(text + "成功")
|
||||||
|
}).catch(function() {
|
||||||
|
row.status = row.status === "0" ? "1" : "0"
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 提交按钮 */
|
||||||
|
submitForm() {
|
||||||
|
this.$refs["form"].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
if (this.form.id != null) {
|
||||||
|
updateUsers(this.form).then(response => {
|
||||||
|
this.$modal.msgSuccess("修改成功")
|
||||||
|
this.open = false
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
addUsers(this.form).then(response => {
|
||||||
|
this.$modal.msgSuccess("新增成功")
|
||||||
|
this.open = false
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
handleDelete(row) {
|
||||||
|
const ids = row.id || this.ids
|
||||||
|
this.$modal.confirm('是否确认删除用户列表编号为"' + ids + '"的数据项?').then(function() {
|
||||||
|
return delUsers(ids)
|
||||||
|
}).then(() => {
|
||||||
|
this.getList()
|
||||||
|
this.$modal.msgSuccess("删除成功")
|
||||||
|
}).catch(() => {})
|
||||||
|
},
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
handleExport() {
|
||||||
|
this.download('system/users/export', {
|
||||||
|
...this.queryParams
|
||||||
|
}, `users_${new Date().getTime()}.xlsx`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,254 @@
|
||||||
|
<template>
|
||||||
|
<div class="sysseting-container">
|
||||||
|
<el-tabs v-model="activeTab">
|
||||||
|
<el-tab-pane label="基本信息" name="base">
|
||||||
|
<el-form :model="baseForm" label-width="120px" class="tab-form">
|
||||||
|
<el-form-item label="投诉电话">
|
||||||
|
<el-input v-model="baseForm.phone" placeholder="请输入投诉电话" style="width: 300px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="抢单开始时间">
|
||||||
|
<el-time-picker v-model="baseForm.startTime" placeholder="选择时间" format="HH:mm" value-format="HH:mm" style="width: 150px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="抢单结束时间">
|
||||||
|
<el-time-picker v-model="baseForm.endTime" placeholder="选择时间" format="HH:mm" value-format="HH:mm" style="width: 150px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="质保金扣除比例">
|
||||||
|
<el-input-number v-model="baseForm.marginRate" :min="0" :max="100" />
|
||||||
|
<span style="margin-left: 8px">%</span>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="下单送积分">
|
||||||
|
<el-input v-model="baseForm.orderScore" style="width: 120px" />
|
||||||
|
<el-tooltip content="下单支付金额多少元赠送1积分,不填则不赠送" placement="right">
|
||||||
|
<i class="el-icon-question" style="margin-left: 8px; color: #999" />
|
||||||
|
</el-tooltip>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="搜索热词">
|
||||||
|
<el-select v-model="baseForm.hotwords" multiple filterable allow-create default-first-option placeholder="请输入热词" style="width: 600px">
|
||||||
|
<el-option v-for="item in baseForm.hotwords" :key="item" :label="item" :value="item" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="客服二维码">
|
||||||
|
<el-upload
|
||||||
|
class="avatar-uploader"
|
||||||
|
action="#"
|
||||||
|
:show-file-list="false"
|
||||||
|
:on-change="handleQrChange"
|
||||||
|
:before-upload="beforeQrUpload"
|
||||||
|
>
|
||||||
|
<img v-if="baseForm.qrUrl" :src="baseForm.qrUrl" class="qr-img" />
|
||||||
|
<i v-else class="el-icon-plus avatar-uploader-icon" />
|
||||||
|
</el-upload>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="submitBase">提交</el-button>
|
||||||
|
<el-button @click="resetBase">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="文本配置" name="text">
|
||||||
|
<el-form :model="textForm" label-width="120px" class="tab-form">
|
||||||
|
<el-form-item label="公司名称">
|
||||||
|
<el-input v-model="textForm.company" placeholder="请输入公司名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="简介">
|
||||||
|
<el-input type="textarea" v-model="textForm.intro" :rows="4" placeholder="请输入公司简介" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="质保金说明">
|
||||||
|
<quill-editor v-model="textForm.marginDesc" :options="editorOptions" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="submitText">提交</el-button>
|
||||||
|
<el-button @click="resetText">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="下单时间配置" name="orderTime">
|
||||||
|
<el-form label-width="120px" class="tab-form">
|
||||||
|
<el-form-item label="下单时间">
|
||||||
|
<div v-for="(item, idx) in orderTimes" :key="idx" style="display: flex; align-items: center; margin-bottom: 8px;">
|
||||||
|
<el-input v-model="item.time" placeholder="如 8:00-10:00" style="width: 30%; margin-right: 12px;" />
|
||||||
|
<el-input-number v-model="item.count" :min="0" style="width: 25%; margin-right: 12px;" />
|
||||||
|
<el-button icon="el-icon-delete" type="danger" @click="removeOrderTime(idx)" circle />
|
||||||
|
</div>
|
||||||
|
<el-button type="primary" icon="el-icon-plus" @click="addOrderTime">新增</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="submitOrderTime">提交</el-button>
|
||||||
|
<el-button @click="resetOrderTime">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="时间配置" name="time">
|
||||||
|
<el-form :model="timeForm" label-width="120px" class="tab-form">
|
||||||
|
<el-form-item label="每月提现时间">
|
||||||
|
<el-select v-model="timeForm.withdrawDays" multiple placeholder="请选择日期" style="width: 300px">
|
||||||
|
<el-option v-for="d in 31" :key="d" :label="d + '号'" :value="d + '号'" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="定时接单时长">
|
||||||
|
<el-input-number v-model="timeForm.autoOrderMinutes" :min="1" style="width: 120px" />
|
||||||
|
<span style="margin-left: 8px">分钟</span>
|
||||||
|
<div class="el-form-item__tip">订单无人接单时多少分钟后,自动重新派单。单位(分钟)</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="取消订单时长">
|
||||||
|
<el-input-number v-model="timeForm.cancelOrderDays" :min="1" style="width: 120px" />
|
||||||
|
<span style="margin-left: 8px">天</span>
|
||||||
|
<div class="el-form-item__tip">师傅到达之后,多久之后没有报工则取消订单。单位(天)</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="submitTime">提交</el-button>
|
||||||
|
<el-button @click="resetTime">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { quillEditor } from 'vue-quill-editor'
|
||||||
|
import 'quill/dist/quill.core.css'
|
||||||
|
import 'quill/dist/quill.snow.css'
|
||||||
|
import 'quill/dist/quill.bubble.css'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'SysSeting',
|
||||||
|
components: {
|
||||||
|
quillEditor
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
activeTab: 'base',
|
||||||
|
// 基本信息
|
||||||
|
baseForm: {
|
||||||
|
phone: '',
|
||||||
|
startTime: '',
|
||||||
|
endTime: '',
|
||||||
|
marginRate: 10,
|
||||||
|
orderScore: 100,
|
||||||
|
hotwords: ['水电维修', '家电清洗', '灯具维修', '墙面翻新', '门窗家具', '疏通维修', '防水维修'],
|
||||||
|
qrUrl: ''
|
||||||
|
},
|
||||||
|
// 文本配置
|
||||||
|
textForm: {
|
||||||
|
company: '',
|
||||||
|
intro: '',
|
||||||
|
marginDesc: ''
|
||||||
|
},
|
||||||
|
// 下单时间配置
|
||||||
|
orderTimes: [
|
||||||
|
{ time: '8:00-10:00', count: 99 },
|
||||||
|
{ time: '10:00-12:00', count: 99 },
|
||||||
|
{ time: '12:00-14:00', count: 99 },
|
||||||
|
{ time: '14:00-16:00', count: 99 },
|
||||||
|
{ time: '16:00-18:00', count: 99 },
|
||||||
|
{ time: '18:00-20:00', count: 99 },
|
||||||
|
{ time: '20:00-22:00', count: 99 },
|
||||||
|
{ time: '22:00-24:00', count: 99 }
|
||||||
|
],
|
||||||
|
// 时间配置
|
||||||
|
timeForm: {
|
||||||
|
withdrawDays: ['8号', '18号', '28号'],
|
||||||
|
autoOrderMinutes: 10,
|
||||||
|
cancelOrderDays: 7
|
||||||
|
},
|
||||||
|
editorOptions: {
|
||||||
|
placeholder: '请输入质保金说明...'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 基本信息
|
||||||
|
submitBase() {
|
||||||
|
this.$message.success('提交成功(模拟)')
|
||||||
|
},
|
||||||
|
resetBase() {
|
||||||
|
this.$refs.baseForm && this.$refs.baseForm.resetFields && this.$refs.baseForm.resetFields()
|
||||||
|
},
|
||||||
|
handleQrChange(file) {
|
||||||
|
// 模拟上传二维码
|
||||||
|
const reader = new FileReader()
|
||||||
|
reader.onload = e => {
|
||||||
|
this.baseForm.qrUrl = e.target.result
|
||||||
|
}
|
||||||
|
reader.readAsDataURL(file.raw)
|
||||||
|
},
|
||||||
|
beforeQrUpload(file) {
|
||||||
|
const isImg = file.type.startsWith('image/')
|
||||||
|
if (!isImg) {
|
||||||
|
this.$message.error('只能上传图片格式')
|
||||||
|
}
|
||||||
|
return isImg
|
||||||
|
},
|
||||||
|
// 文本配置
|
||||||
|
submitText() {
|
||||||
|
this.$message.success('提交成功(模拟)')
|
||||||
|
},
|
||||||
|
resetText() {
|
||||||
|
this.textForm = { company: '', intro: '', marginDesc: '' }
|
||||||
|
},
|
||||||
|
// 下单时间配置
|
||||||
|
addOrderTime() {
|
||||||
|
this.orderTimes.push({ time: '', count: 99 })
|
||||||
|
},
|
||||||
|
removeOrderTime(idx) {
|
||||||
|
this.orderTimes.splice(idx, 1)
|
||||||
|
},
|
||||||
|
submitOrderTime() {
|
||||||
|
this.$message.success('提交成功(模拟)')
|
||||||
|
},
|
||||||
|
resetOrderTime() {
|
||||||
|
this.orderTimes = [
|
||||||
|
{ time: '8:00-10:00', count: 99 },
|
||||||
|
{ time: '10:00-12:00', count: 99 },
|
||||||
|
{ time: '12:00-14:00', count: 99 },
|
||||||
|
{ time: '14:00-16:00', count: 99 },
|
||||||
|
{ time: '16:00-18:00', count: 99 },
|
||||||
|
{ time: '18:00-20:00', count: 99 },
|
||||||
|
{ time: '20:00-22:00', count: 99 },
|
||||||
|
{ time: '22:00-24:00', count: 99 }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// 时间配置
|
||||||
|
submitTime() {
|
||||||
|
this.$message.success('提交成功(模拟)')
|
||||||
|
},
|
||||||
|
resetTime() {
|
||||||
|
this.timeForm = { withdrawDays: ['8号', '18号', '28号'], autoOrderMinutes: 10, cancelOrderDays: 7 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.sysseting-container {
|
||||||
|
background: #fff;
|
||||||
|
padding: 24px;
|
||||||
|
min-height: 600px;
|
||||||
|
}
|
||||||
|
.tab-form {
|
||||||
|
max-width: 900px;
|
||||||
|
}
|
||||||
|
.qr-img {
|
||||||
|
width: 120px;
|
||||||
|
height: 120px;
|
||||||
|
border: 1px solid #eee;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.avatar-uploader .el-upload {
|
||||||
|
border: 1px dashed #d9d9d9;
|
||||||
|
border-radius: 6px;
|
||||||
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 120px;
|
||||||
|
height: 120px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.avatar-uploader-icon {
|
||||||
|
font-size: 32px;
|
||||||
|
color: #8c939d;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Loading…
Reference in New Issue