202505281110

This commit is contained in:
张潘 2025-05-28 11:10:46 +08:00
parent 65c01d1a05
commit 4af16aaea6
22 changed files with 3267 additions and 391 deletions

2
.gitignore vendored
View File

@ -6,6 +6,8 @@
.history/ .history/
.vscode/ .vscode/
.github/ .github/
node_modules/
!gradle/wrapper/gradle-wrapper.jar !gradle/wrapper/gradle-wrapper.jar

1
public/index.html Normal file
View File

@ -0,0 +1 @@

View File

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

View File

@ -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]
// }
/** /**
* 新增项目报价--工艺分类 * 新增项目报价--工艺分类
*/ */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

BIN
ruoyi-ui.7z Normal file

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 = "修改项目报价--工艺分类"
}) })

View File

@ -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="请输入名称" />

View File

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

View File

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