代码更新

This commit is contained in:
sliverber 2024-02-06 17:57:38 +08:00
parent 447dd43a65
commit 90eb656176
7 changed files with 543 additions and 325 deletions

View File

@ -4,6 +4,8 @@ ENV = 'development'
# base api
# VUE_APP_BASE_API = '/dev-api'
VUE_APP_BASE_API = 'http://117.50.215.20:20400'
# VUE_APP_BASE_API = 'http://yruibao.com:81'
# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
# to control whether the babel-plugin-dynamic-import-node plugin is enabled.

View File

@ -53,7 +53,7 @@
"fuse.js": "3.4.4",
"js-cookie": "2.2.0",
"jsonlint": "1.6.3",
"jszip": "3.2.1",
"jszip": "^3.10.1",
"mpvue-calendar": "^2.3.7",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
@ -80,7 +80,7 @@
"xlsx": "0.14.1"
},
"devDependencies": {
"@babel/core": "7.0.0",
"@babel/core": "^7.23.9",
"@babel/register": "7.0.0",
"@vue/cli-plugin-babel": "3.5.3",
"@vue/cli-plugin-eslint": "^3.9.1",
@ -94,15 +94,15 @@
"connect": "3.6.6",
"eslint": "5.15.3",
"eslint-plugin-vue": "5.2.2",
"prettier": "^2.5.1",
"html-webpack-plugin": "3.2.0",
"husky": "1.3.1",
"lint-staged": "8.1.5",
"mockjs": "1.0.1-beta3",
"plop": "2.3.0",
"prettier": "^2.5.1",
"runjs": "^4.3.2",
"script-loader": "^0.7.2",
"script-ext-html-webpack-plugin": "2.1.3",
"script-loader": "^0.7.2",
"serve-static": "^1.13.2",
"svg-sprite-loader": "4.1.3",
"svgo": "1.2.0",

View File

@ -50,7 +50,42 @@ export function ListChannel(pram) {
params: data,
});
}
/**
* 渠道统计列表
* @param pram
* @constructor
*/
export function ListChannels(pram) {
const data = {
channelId: pram.channelId,
page: pram.page,
limit: pram.limit,
};
return request({
url: '/admin/channel/statistics',
method: 'GET',
params: data,
});
}
/**
* 渠道统计列表
* @param pram
* @constructor
*/
export function Listuser(pram) {
const data = {
channelId: pram.channelId,
page: pram.page,
limit: pram.limit,
};
return request({
url: '/admin/channel/user',
method: 'GET',
params: data,
});
}
/**
* 新增渠道表
* @param pram

View File

@ -10,7 +10,7 @@
<el-form-item label="渠道名称" prop="name">
<el-input v-model="channelInfo.name" placeholder="请输入渠道名称"></el-input>
</el-form-item>
<el-form-item label="链接" prop="url">
<el-form-item label="链接" prop="url" v-show="false">
<el-input v-model="channelInfo.url" placeholder="请输入链接"></el-input>
</el-form-item>
<el-form-item label="单价(元)" >

View File

@ -2,54 +2,164 @@
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<el-button type="primary" class="mr10" @click="add" size="small" v-hasPermi="['admin:channel:save']"
>添加渠道</el-button>
<el-button type="primary" class="mr10" @click="add" size="small"
v-hasPermi="['admin:channel:save']">添加渠道</el-button>
</div>
<el-table v-loading="listLoading" :data="listData.list" style="width: 100%" size="mini">
<el-table v-loading="listLoading" :data="listData.list" style="width: 100%" size="mini" v-if="false">
<el-table-column prop="id" label="ID" min-width="50" />
<el-table-column prop="name" label="渠道名称" min-width="100" />
<el-table-column prop="url" label="链接" min-width="100" />
<el-table-column prop="status" label="开关" min-width="100" >
<el-table-column prop="status" label="开关" min-width="100">
<template slot-scope="scope" v-if="checkPermi(['admin:category:update:status'])">
<el-switch
v-model="scope.row.status"
:active-value="true"
:inactive-value="false"
active-text="打开"
inactive-text="关闭"
@change="onchangeIsShow(scope.row)"
/>
<el-switch v-model="scope.row.status" :active-value="true" :inactive-value="false" active-text="打开"
inactive-text="关闭" @change="onchangeIsShow(scope.row)" />
</template>
</el-table-column>
<el-table-column prop="price" label="单价(元)" min-width="100" />
<el-table-column label="操作" min-width="120" fixed="right" align="center">
<template slot-scope="scope">
<el-button
type="text"
size="small"
@click="edit(scope.row)"
class="mr10"
v-hasPermi="['admin:channel:update']"
>编辑</el-button>
<el-button
type="text"
size="small"
@click="handleDelete(scope.row.id, scope.$index)"
v-hasPermi="['admin:channel:delete']"
>删除</el-button>
<el-button type="text" size="small" @click="edit(scope.row)" class="mr10"
v-hasPermi="['admin:channel:update']">编辑</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, scope.$index)"
v-hasPermi="['admin:channel:delete']">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-table v-loading="listLoading" :data="listData.list" style="width: 100%" size="mini">
<el-table-column prop="name" label="名称" min-width="50" align="center"/>
<el-table-column prop="createTime" label="添加日期" min-width="50" align="center"/>
<el-table-column prop="totalClickNum" label="总点击" min-width="50" align="center"/>
<el-table-column prop="totalRegisterNum" label="总注册" min-width="50" align="center"/>
<!-- <el-table-column prop="totalOrderNum" label="总订单(金额/数量)" min-width="120" /> -->
<el-table-column prop="totalOrderNum" label="总订单(金额/数量)" min-width="100" align="center">
<template slot-scope="scope" >
<div class="cont" style="width: 100px;">
{{scope.row. totalAmount}} / {{ scope.row. totalOrderNum}}
</div>
</template>
</el-table-column>
<el-table-column prop="totalConversionRatio" label="总转化率" min-width="50" align="center"/>
<el-table-column prop="totalReturnRate" label="回款率" min-width="50" align="center"/>
<el-table-column prop="todayRegisterNum" label="今日进件" min-width="50" align="center"/>
<el-table-column prop="todayOrderNum" label="今日订单(金额/数量)" min-width="100" align="center">
<template slot-scope="scope" >
<div class="cont" style="width: 100px;">
{{scope.row.todayOrderAmount}} / {{ scope.row.todayOrderNum}}
</div>
</template>
</el-table-column>
<el-table-column prop="todayConversionRatio" label="今日转化率" min-width="50" />
<el-table-column prop="remark" label="备注 " min-width="50" />
<!-- <el-table-column prop="price" label="单价(元)" min-width="100" /> -->
<el-table-column label="操作" min-width="120" fixed="right" align="center">
<template slot-scope="scope">
<el-button type="text" size="small" @click="edit(scope.row)" class="mr10"
v-hasPermi="['admin:channel:update']">编辑</el-button>
<el-button type="text" size="small" @click="edit(scope.row)" class="mr10"
v-hasPermi="['admin:channel:update']">复制链接</el-button>
<el-button type="text" size="small" @click="edit(scope.row)" class="mr10"
v-hasPermi="['admin:channel:update']">账号密码复制</el-button>
<el-button type="text" size="small" @click="showdlg(scope.row)" class="mr10"
v-hasPermi="['admin:channel:update']">查看</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, scope.$index)"
v-hasPermi="['admin:channel:delete']">删除</el-button>
<!-- <el-switch v-model="scope.row.status" :active-value="true" :inactive-value="false" active-text="打开"
inactive-text="关闭" @change="onchangeIsShow(scope.row)" /> -->
</template>
</el-table-column>
</el-table>
<el-dialog title="" :visible.sync="dialogVisibles" width="1388px" :before-close="handleClose">
<div class="detailbox">
<div class="tit"> <span :class="titindex==0?'act1':''" style="margin-right: 10px;" @click="titindex=0">统计报表</span> <span :class="titindex==1?'act1':''" @click="titindex=1"> 注册用户</span> </div>
<div class="tj" v-show="titindex==0">
<div class="mintit">基础信息</div>
<div class="infobox">
<div class="infoli">
<div class="li">渠道名称{{ chooselist.name }} </div>
<div class="li"> 添加日期{{ chooselist.createTime }} </div>
<div class="li">备注{{ chooselist.remark }} </div>
</div>
<div class="infoli">
<div class="li"> 总点击{{ chooselist.totalClickNum }}</div>
<div class="li"> 总转化率{{ chooselist.totalConversionRatio }} </div>
<div class="li"> 回款率{{ chooselist.totalReturnRate }}</div>
</div>
<div class="infoli">
<div class="li">总注册{{ chooselist.totalRegisterNum }}</div>
<div class="li"> 总订单金额{{ chooselist.totalAmount }}</div>
<div class="li">总订单数量{{ chooselist.totalOrderNum }} </div>
</div>
<div class="infoli">
<div class="li" style="width: 100%;">渠道链接{{ chooselist.url }}</div>
</div>
</div>
<div class="mintit">日统计报表 </div>
<el-table :data="todaydata.list" stripe style="width: 100%">
<el-table-column prop="date" label="日期" width="180" align="center">
</el-table-column>
<el-table-column prop="clickNum" label="点击数" width="180" align="center">
</el-table-column>
<el-table-column prop="registerNum" label="进件" align="center">
</el-table-column>
<el-table-column prop="amount" label="订阅金额" align="center">
</el-table-column>
<el-table-column prop="num" label="订阅数量" align="center">
</el-table-column>
<el-table-column prop="conversionRatio" label="转化率" align="center">
</el-table-column>
<el-table-column prop="returnRate" label="回款率" align="center">
</el-table-column>
</el-table>
<el-pagination :page-sizes="[10, 15,]" :page-size="tableFrom.limit" :current-page="tableFrom.page"
layout="total, sizes, prev, pager, next, jumper" :total="todaydata.total" @size-change="handleSizeChanges"
@current-change="todaypageChange" />
</div>
<div class="yh" v-show="titindex==1" style="padding-top: 20px;">
<el-table :data="userdata.list" stripe style="width: 100%">
<el-table-column prop="realName" label="姓名" width="100" >
</el-table-column>
<el-table-column prop="createTime" label="注册日期 " align="center">
</el-table-column>
<el-table-column prop="phone" label="手机号" align="center">
</el-table-column>
<el-table-column prop="email" label="邮箱" min-width="130" align="center">
</el-table-column>
<el-table-column prop="idCardNumber" label="身份证" min-width="160" align="center">
</el-table-column>
<el-table-column prop="orderNum" label="订单数" align="center">
</el-table-column>
<el-table-column prop="orderAmount" label=" 订单总金额" align="center">
</el-table-column>
<el-table-column prop="pendingRepayment" label=" 待还金额" align="center">
</el-table-column>
<el-table-column prop="address" label=" 状态(逾期/待还款)" min-width="130" align="center">
<template slot-scope="scope" >
<div class="cont" style="width: 120px;" v-if="scope.row.repaymentStatus=='Pending'">
待还款
</div>
<div class="cont" style="width: 100px;" v-if="scope.row.repaymentStatus=='Late'">
已逾期
</div>
</template>
</el-table-column>
</el-table>
<el-pagination :page-sizes="[10, 15,]" :page-size="tableFrom.limit" :current-page="tableFrom.page"
layout="total, sizes, prev, pager, next, jumper" :total="userdata.total" @size-change="userhandleSizeChange"
@current-change="userpageChange" />
</div>
</div>
</el-dialog>
<div class="block mb20">
<el-pagination
:current-page="listPram.page"
:page-sizes="constants.page.limit"
:layout="constants.page.layout"
:total="listData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<el-pagination :current-page="listPram.page" :page-sizes="constants.page.limit" :layout="constants.page.layout"
:total="listData.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</el-card>
<creat-channel ref="grades" :channelInfo="channelInfo"></creat-channel>
@ -57,7 +167,7 @@
</template>
<script>
import { ListChannel,AddChannel,UpdateChannel,InfoChannel,DelChannel} from '@/api/channel';
import { ListChannel,ListChannels,Listuser, AddChannel, UpdateChannel, InfoChannel, DelChannel } from '@/api/channel';
import creatChannel from './creatChannel';
import { checkPermi } from '@/utils/permission'; //
export default {
@ -75,8 +185,13 @@ export default {
components: { creatChannel },
data() {
return {
listLoading: true,
listLoading: false,
dialogVisibles: false,
titindex:0,
channelInfo: {},
chooselist:{},
todaydata:{ list: [], total: 0 },
userdata:{},
constants: this.$constants,
listPram: {
productId: null,
@ -84,6 +199,22 @@ export default {
page: 1,
limit: this.$constants.page.limit[0],
},
listPrams: {
channelId: null,
page: 1,
limit: 10,
},
userPrams: {
channelId: null,
page: 1,
limit: 10,
},
tableFrom: {
page: 1,
limit: 10,
},
listData: { list: [], total: 0 },
tableData: {
data: [],
@ -96,17 +227,71 @@ export default {
this.getList();
},
methods: {
pageChange(page) {
this.tableFrom.page = page;
this.getList();
},
handleSizeChange(val) {
this.tableFrom.limit = val;
this.getList();
},
handleSizeChanges(val){
this.listPrams.limit = val;
this.gettodaylist()
},
userhandleSizeChange(val){
this.userPrams.limit = val;
this.gettodaylist()
},
todaypageChange(page){
this.listPrams.page = page;
this.getuserlist()
},
userpageChange(page){
this.userPrams.page = page;
this.getuserlist()
},
gettodaylist(){
ListChannels(this.listPrams)
.then((res) => {
this. todaydata= res;
})
.catch(() => {
});
},
getuserlist(){
Listuser(this.userPrams)
.then((res) => {
this.userdata = res;
console.log( this.todaydata,'returnRatereturnRatereturnRate');
})
.catch(() => {
});
},
showdlg(row) {
this.listPrams.channelId=row.id
this.userPrams.channelId=row.id
this.gettodaylist()
this.getuserlist()
console.log(row,'rowrow');
this.chooselist=row
this.dialogVisibles = true
},
formatPercentage(value) {
if(value == "0.00" || value == "0.0" || value == "0" || value == 0 || value == null){
if (value == "0.00" || value == "0.0" || value == "0" || value == 0 || value == null) {
return "-";
}else {
} else {
return (value * 100).toFixed(2) + '%';
}
},
formatNumber(value){
if(value == 0){
formatNumber(value) {
if (value == 0) {
return "-";
}else {
} else {
return value + "期";
}
},
@ -116,7 +301,7 @@ export default {
},
add() {
this.$refs.grades.dialogVisible = true;
this.channelInfo = {status:true};
this.channelInfo = { status: true };
},
edit(channelInfo) {
// this.$refs.grades.info(id)
@ -185,9 +370,83 @@ export default {
</script>
<style scoped lang="scss">
.detailbox::-webkit-scrollbar {
width: 10px;
}
.detailbox::-webkit-scrollbar-track {
background-color: #FFFFFF;
}
.detailbox::-webkit-scrollbar-thumb {
background-color: #EAF4FF;
border-radius: 10px;
// height: .625rem;
}
.detailbox::-webkit-scrollbar-thumb:hover {
background-color: #EAF4FF;
}
.detailbox {
padding: 10px 60px;
width: 100%;
max-height: 670px;
overflow-x: hidden;
overflow-y: auto;
min-height: 600px;
.tit {
width: 100%;
text-align: center;
font-family: Source Han Sans;
font-weight: 400;
font-size: 20px;
font-variation-settings: "opsz" auto;
cursor: pointer;
.act1{
font-weight: 700;
font-size: 25px;
}
}
.mintit {
font-family: Source Han Sans;
font-size: 20px;
font-weight: bold;
line-height: 70px;
letter-spacing: 0px;
}
.infobox {
width: 90%;
margin: 20px auto;
display: flex;
flex-wrap: wrap;
.infoli {
width: 100%;
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
align-items: flex-start; // 使
.li {
width: 33%;
font-size: 20px;
font-weight: normal;
line-height: 70px;
letter-spacing: 0px;
align-self: flex-start; // 使 .li
}
}
}
}
.el-switch.is-disabled {
opacity: 1;
}
::v-deep .el-switch__label {
cursor: pointer !important;
}

View File

@ -724,8 +724,8 @@
</template>
<script>
const PDFJS = require("pdfjs-dist");
PDFJS.GlobalWorkerOptions.workerSrc = require("pdfjs-dist/build/pdf.worker.min");
// const PDFJS = require("pdfjs-dist");
// PDFJS.GlobalWorkerOptions.workerSrc = require("pdfjs-dist/build/pdf.worker.min");
import {
orderListDataApi,
orderStatusNumApi,
@ -919,17 +919,17 @@ export default {
});
});
},
showht(url){
// this.pdfUrl='@/assets/222.pdf'
this.pdfUrl='http://api.yruibao.com/crmebimage/public/content/2024/02/03/0eba557ba62041e190b8d819a9f69ca3884hdh9izs.pdf'
const CMAP_URL = "https://cdn.jsdelivr.net/npm/pdfjs-dist@2.0.943/cmaps/";
let obj = {};
obj.url = this.pdfUrl; //pdf
obj.cMapUrl = CMAP_URL;
obj.cMapPacked = true;
this.init(obj);
this.htVisible=true
},
// showht(url){
// // this.pdfUrl='@/assets/222.pdf'
// this.pdfUrl='http://api.yruibao.com/crmebimage/public/content/2024/02/03/0eba557ba62041e190b8d819a9f69ca3884hdh9izs.pdf'
// const CMAP_URL = "https://cdn.jsdelivr.net/npm/pdfjs-dist@2.0.943/cmaps/";
// let obj = {};
// obj.url = this.pdfUrl; //pdf
// obj.cMapUrl = CMAP_URL;
// obj.cMapPacked = true;
// this.init(obj);
// this.htVisible=true
// },
htClose(){
this.htVisible=false
},

View File

@ -6,14 +6,8 @@
<el-tab-pane :label="item.name" :name="item.type.toString()" v-for="(item, index) in headeNum" :key="index" />
</el-tabs>
<div class="container">
<el-form
inline
size="small"
:model="userFrom"
ref="userFrom"
:label-position="labelPosition"
label-width="100px"
>
<el-form inline size="small" :model="userFrom" ref="userFrom" :label-position="labelPosition"
label-width="100px">
<el-row>
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
@ -26,58 +20,25 @@
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
<el-form-item label="用户等级:">
<el-select
v-model="levelData"
placeholder="请选择"
class="selWidth"
clearable
filterable
multiple
>
<el-option
:value="item.id"
v-for="(item, index) in levelList"
:key="index"
:label="item.name"
></el-option>
<el-select v-model="levelData" placeholder="请选择" class="selWidth" clearable filterable multiple>
<el-option :value="item.id" v-for="(item, index) in levelList" :key="index"
:label="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="用户分组:">
<el-select
v-model="groupData"
placeholder="请选择"
class="selWidth"
clearable
filterable
multiple
>
<el-option
:value="item.id"
v-for="(item, index) in groupList"
:key="index"
:label="item.groupName"
></el-option>
<el-select v-model="groupData" placeholder="请选择" class="selWidth" clearable filterable multiple>
<el-option :value="item.id" v-for="(item, index) in groupList" :key="index"
:label="item.groupName"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="用户标签:">
<el-select
v-model="labelData"
placeholder="请选择"
class="selWidth"
clearable
filterable
multiple
>
<el-option
:value="item.id"
v-for="(item, index) in labelLists"
:key="index"
:label="item.name"
></el-option>
<el-select v-model="labelData" placeholder="请选择" class="selWidth" clearable filterable multiple>
<el-option :value="item.id" v-for="(item, index) in labelLists" :key="index"
:label="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
@ -85,13 +46,8 @@
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
<el-form-item label="国家:">
<el-select
v-model="userFrom.country"
placeholder="请选择"
class="selWidth"
clearable
@on-change="changeCountry"
>
<el-select v-model="userFrom.country" placeholder="请选择" class="selWidth" clearable
@on-change="changeCountry">
<el-option value="" label="全部"></el-option>
<el-option value="CN" label="中国"></el-option>
<el-option value="OTHER" label="国外"></el-option>
@ -100,15 +56,8 @@
</el-col>
<el-col v-bind="grid" v-if="userFrom.country === 'CN'">
<el-form-item label="省份:">
<el-cascader
:options="addresData"
:props="propsCity"
filterable
v-model="address"
@change="handleChange"
clearable
class="selWidth"
></el-cascader>
<el-cascader :options="addresData" :props="propsCity" filterable v-model="address"
@change="handleChange" clearable class="selWidth"></el-cascader>
</el-form-item>
</el-col>
<el-col v-bind="grid">
@ -126,20 +75,9 @@
</el-col>
<el-col v-bind="grid">
<el-form-item label="时间选择:" class="timeBox">
<el-date-picker
v-model="timeVal"
align="right"
unlink-panels
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
size="small"
type="daterange"
placement="bottom-end"
placeholder="自定义时间"
class="selWidth"
:picker-options="pickerOptions"
@change="onchangeTime"
/>
<el-date-picker v-model="timeVal" align="right" unlink-panels value-format="yyyy-MM-dd"
format="yyyy-MM-dd" size="small" type="daterange" placement="bottom-end" placeholder="自定义时间"
class="selWidth" :picker-options="pickerOptions" @change="onchangeTime" />
</el-form-item>
</el-col>
</el-col>
@ -200,15 +138,8 @@
</template>
<el-col :xs="24" :sm="24" :md="24" :lg="6" :xl="6" class="text-right userFrom">
<el-form-item>
<el-button
type="primary"
icon="ios-search"
label="default"
class="mr15"
size="small"
@click="userSearchs"
>搜索</el-button
>
<el-button type="primary" icon="ios-search" label="default" class="mr15" size="small"
@click="userSearchs">搜索</el-button>
<el-button class="ResetSearch mr10" @click="reset('userFrom')" size="small">重置</el-button>
<a class="ivu-ml-8" @click="collapse = !collapse">
<template v-if="!collapse"> 展开 <i class="el-icon-arrow-down"></i> </template>
@ -220,26 +151,16 @@
</el-form>
</div>
<div class="btn_bt">
<el-button class="mr10" size="small" @click="onSend" type="primary" v-hasPermi="['admin:coupon:user:receive']"
>发送优惠券</el-button
>
<el-button class="mr10" size="small" @click="setBatch('group')" v-hasPermi="['admin:user:group']"
>批量设置分组</el-button
>
<el-button class="mr10" size="small" @click="setBatch('label')" v-hasPermi="['admin:user:tag']"
>批量设置标签</el-button
>
<el-button class="mr10" size="small" @click="onSend" type="primary"
v-hasPermi="['admin:coupon:user:receive']">发送优惠券</el-button>
<el-button class="mr10" size="small" @click="setBatch('group')"
v-hasPermi="['admin:user:group']">批量设置分组</el-button>
<el-button class="mr10" size="small" @click="setBatch('label')"
v-hasPermi="['admin:user:tag']">批量设置标签</el-button>
</div>
</div>
<el-table
ref="table"
v-loading="listLoading"
:data="tableData.data"
style="width: 100%"
size="mini"
@selection-change="onSelectTab"
highlight-current-row
>
<el-table ref="table" v-loading="listLoading" :data="tableData.data" style="width: 100%" size="mini"
@selection-change="onSelectTab" highlight-current-row v-if="false">
<el-table-column type="expand">
<template slot-scope="props">
<el-form label-position="left" inline class="demo-table-expand">
@ -272,11 +193,8 @@
<el-table-column label="头像" min-width="80" v-if="checkedCities.includes('头像')">
<template slot-scope="scope">
<div class="demo-image__preview">
<el-image
style="width: 36px; height: 36px"
:src="scope.row.avatar"
:preview-src-list="[scope.row.avatar]"
/>
<el-image style="width: 36px; height: 36px" :src="scope.row.avatar"
:preview-src-list="[scope.row.avatar]" />
</div>
</template>
</el-table-column>
@ -309,74 +227,107 @@
<el-table-column prop="integral" label="积分" min-width="100" v-if="checkedCities.includes('积分')" />
<el-table-column label="操作" min-width="130" fixed="right" align="center" :render-header="renderHeader">
<template slot-scope="scope">
<el-button
type="text"
@click="editUser(scope.row.uid)"
size="small"
v-hasPermi="['admin:user:infobycondition']"
>编辑</el-button
>
<el-button type="text" @click="editUser(scope.row.uid)" size="small"
v-hasPermi="['admin:user:infobycondition']">编辑</el-button>
<el-dropdown trigger="click">
<span class="el-dropdown-link"> 更多<i class="el-icon-arrow-down el-icon--right" /> </span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="onDetails(scope.row.uid)" v-if="checkPermi(['admin:user:topdetail'])"
>账户详情</el-dropdown-item
>
<el-dropdown-item @click.native="onIdentityInfo(scope.row.uid)" v-if="checkPermi(['admin:user:topdetail'])"
>身份信息</el-dropdown-item
>
<el-dropdown-item
@click.native="editPoint(scope.row.uid)"
v-if="checkPermi(['admin:user:operate:founds'])"
>积分余额</el-dropdown-item
>
<el-dropdown-item @click.native="setBatch('group', scope.row)" v-if="checkPermi(['admin:user:group'])"
>设置分组</el-dropdown-item
>
<el-dropdown-item @click.native="setBatch('label', scope.row)" v-if="checkPermi(['admin:user:tag'])"
>设置标签</el-dropdown-item
>
<el-dropdown-item @click.native="setPhone(scope.row)" v-if="checkPermi(['admin:user:update:phone'])"
>修改手机号</el-dropdown-item
>
<el-dropdown-item
@click.native="onLevel(scope.row.uid, scope.row.level)"
v-if="checkPermi(['admin:user:update:level'])"
>修改用户等级</el-dropdown-item
>
<el-dropdown-item
@click.native="setExtension(scope.row)"
v-if="checkPermi(['admin:user:update:spread'])"
>修改上级推广人</el-dropdown-item
>
<el-dropdown-item
@click.native="clearSpread(scope.row)"
v-if="scope.row.spreadUid && scope.row.spreadUid > 0 && checkPermi(['admin:retail:spread:clean'])"
>清除上级推广人</el-dropdown-item
>
<el-dropdown-item @click.native="onDetails(scope.row.uid)"
v-if="checkPermi(['admin:user:topdetail'])">账户详情</el-dropdown-item>
<el-dropdown-item @click.native="onIdentityInfo(scope.row.uid)"
v-if="checkPermi(['admin:user:topdetail'])">身份信息</el-dropdown-item>
<el-dropdown-item @click.native="editPoint(scope.row.uid)"
v-if="checkPermi(['admin:user:operate:founds'])">积分余额</el-dropdown-item>
<el-dropdown-item @click.native="setBatch('group', scope.row)"
v-if="checkPermi(['admin:user:group'])">设置分组</el-dropdown-item>
<el-dropdown-item @click.native="setBatch('label', scope.row)"
v-if="checkPermi(['admin:user:tag'])">设置标签</el-dropdown-item>
<el-dropdown-item @click.native="setPhone(scope.row)"
v-if="checkPermi(['admin:user:update:phone'])">修改手机号</el-dropdown-item>
<el-dropdown-item @click.native="onLevel(scope.row.uid, scope.row.level)"
v-if="checkPermi(['admin:user:update:level'])">修改用户等级</el-dropdown-item>
<el-dropdown-item @click.native="setExtension(scope.row)"
v-if="checkPermi(['admin:user:update:spread'])">修改上级推广人</el-dropdown-item>
<el-dropdown-item @click.native="clearSpread(scope.row)"
v-if="scope.row.spreadUid && scope.row.spreadUid > 0 && checkPermi(['admin:retail:spread:clean'])">清除上级推广人</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<el-table ref="table" v-loading="listLoading" :data="tableData.data" style="width: 100%" size="mini"
@selection-change="onSelectTab" highlight-current-row>
<el-table-column type="expand">
<template slot-scope="props">
<el-form label-position="left" inline class="demo-table-expand">
<el-form-item label="身份:">
<span>{{ props.row.isPromoter | filterIsPromoter }}</span>
</el-form-item>
<el-form-item label="首次访问:">
<span>{{ props.row.createTime | filterEmpty }}</span>
</el-form-item>
<el-form-item label="近次访问:">
<span>{{ props.row.lastLoginTime | filterEmpty }}</span>
</el-form-item>
<el-form-item label="手机号:">
<span>{{ props.row.phone | filterEmpty }}</span>
</el-form-item>
<el-form-item label="标签:">
<span>{{ props.row.tagName | filterEmpty }}</span>
</el-form-item>
<el-form-item label="地址:">
<span>{{ props.row.addres | filterEmpty }}</span>
</el-form-item>
<el-form-item label="备注:" style="width: 100%; display: flex; margin-right: 10px">
<span>{{ props.row.mark | filterEmpty }}</span>
</el-form-item>
</el-form>
</template>
</el-table-column>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column prop="realName" label="姓名" min-width="80" align="center" />
<el-table-column prop="createTime" label="注册日期" min-width="80" align="center" />
<el-table-column prop="phone" label="手机号" min-width="80" />
<el-table-column prop="email" label="邮箱" min-width="80" align="center" />
<el-table-column prop="idCardNumber" label="身份证" min-width="80" align="center" />
<el-table-column prop="orderNum" label="订单数" min-width="80" align="center" />
<el-table-column prop="orderAmount" label=" 订单总金额" width="180" align="center">
</el-table-column>
<el-table-column prop="pendingRepayment" label=" 待还金额" width="100">
</el-table-column>
<el-table-column prop="address" label=" 状态(逾期/待还款)" width="180">
<template slot-scope="scope">
<div class="cont" style="width: 100px;" v-if="scope.row.repaymentStatus == 'Pending'">
待还款
</div>
<div class="cont" style="width: 100px;" v-if="scope.row.repaymentStatus == 'Late'">
已逾期
</div>
</template>
</el-table-column>
<el-table-column label="操作" min-width="120" fixed="right" align="center">
<template slot-scope="scope">
<el-button type="text" size="small" @click="edit(scope.row)" class="mr10"
>查看用户详情</el-button>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination
:page-sizes="[15, 30, 45, 60]"
:page-size="userFrom.limit"
:current-page="userFrom.page"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="pageChange"
/>
<el-pagination :page-sizes="[15, 30, 45, 60]" :page-size="userFrom.limit" :current-page="userFrom.page"
layout="total, sizes, prev, pager, next, jumper" :total="tableData.total" @size-change="handleSizeChange"
@current-change="pageChange" />
</div>
</el-card>
<div class="card_abs" v-show="card_select_show" :style="{ top: collapse ? 570 + 'px' : 270 + 'px' }">
<template>
<div class="cell_ht">
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange"
>全选</el-checkbox
>
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">全选</el-checkbox>
<el-button type="text" @click="checkSave()">保存</el-button>
</div>
<el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
@ -386,15 +337,8 @@
</div>
<!--修改推广人-->
<el-dialog title="修改推广人" :visible.sync="extensionVisible" width="500px" :before-close="handleCloseExtension">
<el-form
class="formExtension mt20"
ref="formExtension"
:model="formExtension"
:rules="ruleInline"
label-width="120px"
@submit.native.prevent
v-loading="loading"
>
<el-form class="formExtension mt20" ref="formExtension" :model="formExtension" :rules="ruleInline"
label-width="120px" @submit.native.prevent v-loading="loading">
<el-form-item label="用户头像:" prop="image">
<div class="upLoadPicBox" @click="modalPicTap">
<div v-if="formExtension.image" class="pictrue"><img :src="formExtension.image" /></div>
@ -418,36 +362,18 @@
</el-dialog>
<!--批量设置-->
<el-dialog title="设置" :visible.sync="dialogVisible" width="500px" :before-close="handleClose">
<el-form
:model="dynamicValidateForm"
ref="dynamicValidateForm"
label-width="100px"
class="demo-dynamic"
v-loading="loading"
>
<el-form-item
prop="groupId"
label="用户分组"
:rules="[{ required: true, message: '请选择用户分组', trigger: 'change' }]"
v-if="batchName === 'group'"
key="1"
>
<el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="100px" class="demo-dynamic"
v-loading="loading">
<el-form-item prop="groupId" label="用户分组" :rules="[{ required: true, message: '请选择用户分组', trigger: 'change' }]"
v-if="batchName === 'group'" key="1">
<el-select v-model="dynamicValidateForm.groupId" placeholder="请选择分组" style="width: 80%" filterable>
<el-option
:value="item.id"
v-for="(item, index) in groupList"
:key="index"
:label="item.groupName"
></el-option>
<el-option :value="item.id" v-for="(item, index) in groupList" :key="index"
:label="item.groupName"></el-option>
</el-select>
</el-form-item>
<el-form-item
prop="groupId"
label="用户标签"
:rules="[{ required: true, message: '请选择用户标签', trigger: 'change' }]"
v-else
>
<el-select v-model="dynamicValidateForm.groupId" placeholder="请选择标签" style="width: 80%" multiple filterable>
<el-form-item prop="groupId" label="用户标签" :rules="[{ required: true, message: '请选择用户标签', trigger: 'change' }]"
v-else>
<el-select v-model="dynamicValidateForm.groupId" placeholder="请选择标签" style="width: 80%" multiple filterable>
<el-option :value="item.id" v-for="(item, index) in labelLists" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
@ -462,20 +388,10 @@
<edit-from v-if="visible" :uid="uid" @resetForm="resetForm"></edit-from>
</el-dialog>
<!--积分余额-->
<el-dialog
title="积分余额"
:visible.sync="VisiblePoint"
width="500px"
:close-on-click-modal="false"
:before-close="handlePointClose"
>
<el-form
:model="PointValidateForm"
ref="PointValidateForm"
label-width="100px"
class="demo-dynamic"
v-loading="loadingPoint"
>
<el-dialog title="积分余额" :visible.sync="VisiblePoint" width="500px" :close-on-click-modal="false"
:before-close="handlePointClose">
<el-form :model="PointValidateForm" ref="PointValidateForm" label-width="100px" class="demo-dynamic"
v-loading="loadingPoint">
<el-form-item label="修改余额" required>
<el-radio-group v-model="PointValidateForm.moneyType">
<el-radio :label="1">增加</el-radio>
@ -483,14 +399,8 @@
</el-radio-group>
</el-form-item>
<el-form-item label="余额" required>
<el-input-number
type="text"
v-model="PointValidateForm.moneyValue"
:precision="2"
:step="0.1"
:min="0"
:max="999999"
></el-input-number>
<el-input-number type="text" v-model="PointValidateForm.moneyValue" :precision="2" :step="0.1" :min="0"
:max="999999"></el-input-number>
</el-form-item>
<el-form-item label="修改积分" required>
<el-radio-group v-model="PointValidateForm.integralType">
@ -499,13 +409,8 @@
</el-radio-group>
</el-form-item>
<el-form-item label="积分" required>
<el-input-number
type="text"
step-strictly
v-model="PointValidateForm.integralValue"
:min="0"
:max="999999"
></el-input-number>
<el-input-number type="text" step-strictly v-model="PointValidateForm.integralValue" :min="0"
:max="999999"></el-input-number>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
@ -791,7 +696,7 @@ export default {
sendNews() {
if (this.selectionList.length === 0) return this.$message.warning('请先选择用户');
const _this = this;
this.$modalArticle(function (row) {}, 'send');
this.$modalArticle(function (row) { }, 'send');
},
//
onSend() {
@ -889,25 +794,25 @@ export default {
this.loading = true;
this.batchName === 'group'
? groupPiApi({ groupId: this.dynamicValidateForm.groupId, id: this.userIds })
.then((res) => {
this.$message.success('设置成功');
this.loading = false;
this.handleClose();
this.getList();
})
.catch(() => {
this.loading = false;
})
.then((res) => {
this.$message.success('设置成功');
this.loading = false;
this.handleClose();
this.getList();
})
.catch(() => {
this.loading = false;
})
: tagPiApi({ tagId: this.dynamicValidateForm.groupId.join(','), id: this.userIds })
.then((res) => {
this.$message.success('设置成功');
this.loading = false;
this.handleClose();
this.getList();
})
.catch(() => {
this.loading = false;
});
.then((res) => {
this.$message.success('设置成功');
this.loading = false;
this.handleClose();
this.getList();
})
.catch(() => {
this.loading = false;
});
} else {
return false;
}
@ -1099,21 +1004,21 @@ export default {
onchangeIsShow(row) {
row.isShow
? putOnShellApi(row.id)
.then(() => {
this.$message.success('上架成功');
this.getList();
})
.catch(() => {
row.isShow = !row.isShow;
})
.then(() => {
this.$message.success('上架成功');
this.getList();
})
.catch(() => {
row.isShow = !row.isShow;
})
: offShellApi(row.id)
.then(() => {
this.$message.success('下架成功');
this.getList();
})
.catch(() => {
row.isShow = !row.isShow;
});
.then(() => {
this.$message.success('下架成功');
this.getList();
})
.catch(() => {
row.isShow = !row.isShow;
});
},
renderHeader(h) {
return (
@ -1161,50 +1066,64 @@ export default {
color: #409eff;
font-size: 12px;
}
.el-icon-arrow-down {
font-size: 12px;
}
.text-right {
text-align: right;
}
.demo-table-expand {
font-size: 0;
}
.demo-table-expand label {
width: 90px;
color: #99a9bf;
}
.demo-table-expand .el-form-item {
margin-right: 0;
margin-bottom: 0;
width: 33.33%;
}
.selWidth {
width: 100% !important;
}
.seachTiele {
line-height: 30px;
}
.container {
min-width: 821px;
::v-deepel-form-item {
width: 100%;
}
::v-deepel-form-item__content {
width: 72%;
}
}
.ivu-ml-8 {
font-size: 12px;
color: #1682e6;
}
.btn_bt {
border-top: 1px dashed #ccc;
padding-top: 20px;
}
.relative {
position: relative;
}
.card_abs {
position: absolute;
padding-bottom: 15px;
@ -1214,6 +1133,7 @@ export default {
z-index: 99999;
box-shadow: 0px 0px 14px 0px rgba(0, 0, 0, 0.1);
}
.cell_ht {
height: 50px;
padding: 15px 20px;
@ -1223,11 +1143,13 @@ export default {
justify-content: space-between;
align-items: center;
}
.check_cell {
width: 100%;
padding: 15px 20px 0;
}
::v-deep .el-checkbox__input.is-checked + .el-checkbox__label {
::v-deep .el-checkbox__input.is-checked+.el-checkbox__label {
color: #606266;
}
</style>