This commit is contained in:
Sliverber 2024-04-16 13:51:26 +08:00
parent 4ee5a0fe42
commit 1babcd6ff2
5 changed files with 319 additions and 190 deletions

View File

@ -4,5 +4,5 @@ ENV = 'production'
# base api
# VUE_APP_BASE_API = '/prod-api'
# VUE_APP_BASE_API = 'http://106.75.49.247:20400'
# VUE_APP_BASE_API = 'https://yruibao.com/admin'
VUE_APP_BASE_API = 'http://192.168.2.5:20401'
VUE_APP_BASE_API = 'https://yruibao.com/admin'
# VUE_APP_BASE_API = 'http://192.168.2.5:20401'

View File

@ -15,7 +15,16 @@ export function DelInstallments(id) {
params: data,
});
}
export function DelInstallmentschild(id) {
const data = {
id: id,
};
return request({
url: '/admin/customInstallmentsDetail/delete',
method: 'GET',
params: data,
});
}
/**
* 商品分期配置表详情
* @param id
@ -77,9 +86,9 @@ export function AddInstallments(pram) {
export function AddInstallmentsDetail(pram) {
const data = {
installmentsId: pram.id,
installmentNumber: pram.installmentNumber,
intervalCycle: pram.intervalCycle,
repaymentPercent: pram.repaymentPercent,
repaymentDeadlineStr: pram.repaymentDeadlineStr,
// repaymentDeadlineStr: pram.repaymentDeadlineStr,
};
return request({
url: '/admin/customInstallmentsDetail/save',
@ -105,3 +114,17 @@ export function UpdateInstallments(pram) {
data: data,
});
}
export function UpdateInstallmentschild(pram) {
const data = {
installmentsId: pram.id,
intervalCycle: pram.intervalCycle,
repaymentPercent: pram.repaymentPercent,
};
return request({
url: '/admin/customInstallmentsDetail/update',
method: 'post',
params: { id: pram.id },
data: data,
});
}

View File

@ -27,13 +27,14 @@
</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="id" label="渠道ID" min-width="50" align="center"/>
<el-table-column prop="createTime" label="添加日期" min-width="50" align="center"/>
<el-table-column prop="name" label="名称" min-width="50" align="center" />
<el-table-column prop="id" label="渠道ID" min-width="50" align="center" />
<el-table-column prop="createTime" label="添加日期" min-width="50" align="center" />
<el-table-column prop="address" label=" 总点击/总转化/总注册/回款率/" min-width="80">
<template slot-scope="scope">
<div class="cont" style="display: flex;flex-wrap: nowrap;justify-content: center;">
{{ scope.row.totalClickNum }}/ {{ scope.row.totalConversionRatio }} / {{ scope.row.totalRegisterNum }}/ {{ scope.row.totalReturnRate }}
{{ scope.row.totalClickNum }}/ {{ scope.row.totalConversionRatio }} / {{ scope.row.totalRegisterNum }}/ {{
scope.row.totalReturnRate }}
</div>
@ -54,9 +55,9 @@
<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" >
{{scope.row. totalAmount}} / {{ scope.row. totalOrderNum}}
<template slot-scope="scope">
<div class="cont">
{{ scope.row.totalAmount }} / {{ scope.row.totalOrderNum }}
</div>
</template>
</el-table-column>
@ -65,20 +66,20 @@
<!-- <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" >
{{scope.row.todayOrderAmount}} / {{ scope.row.todayOrderNum}}
<template slot-scope="scope">
<div class="cont">
{{ scope.row.todayOrderAmount }} / {{ scope.row.todayOrderNum }}
</div>
</template>
</el-table-column>
<!-- <el-table-column prop="todayConversionRatio" label="今日转化率" min-width="50" align="center"/> -->
<el-table-column prop="remark" label="备注 " min-width="30" />
<el-table-column prop="todayOrderNum" label="是否隐藏商品" min-width="50" align="center">
<template slot-scope="scope" >
<div class="cont" v-if="scope.row.storeHide==true" >
<template slot-scope="scope">
<div class="cont" v-if="scope.row.storeHide == true">
隐藏
</div>
<div class="cont" v-if="scope.row.storeHide==false" >
<div class="cont" v-if="scope.row.storeHide == false">
展示
</div>
</template>
@ -103,23 +104,34 @@
</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="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="img_box" style="right: 100px;">
<!-- <canvas ref="qrcodeCanvas"></canvas> -->
<!-- <div id="payQrcode"></div> -->
<div class="img_box" style="right: 70px;">
<div id="qrcodes" ref="qrcodes" style="margin-bottom: 20px;"></div>
<div class="tits" style="width: 60px;text-align: center;font-size: 12px;margin-bottom: 10px;">h5</div>
<el-button type="primary" @click="downloadimg()" style="margin-left: 0px;">下载</el-button>
</div>
<div class="img_box" style="right: 150px;">
<div id="qrcode" ref="qrcode" style="margin-bottom: 20px;"></div>
<el-button type="primary" @click="downloadimg()" style="margin-left: 0px;" >下载图片</el-button>
<div class="tits" style="width: 60px;text-align: center;font-size: 12px;margin-bottom: 10px;">微信小程序</div>
<el-button type="primary" @click="downloadimgs()" style="margin-left: 0px;">下载</el-button>
</div>
<div class="img_box" style="right: -10px;">
<!-- <canvas ref="qrcodeCanvas"></canvas> -->
<!-- <div id="payQrcode"></div> -->
<img :src="chooselist.qrCodeUrlCircleBlue" alt="" style="margin-bottom: 20px;">
<el-button type="primary" @click="downloadImage(chooselist.qrCodeUrlCircleBlue)" style="margin-left: 0px;" >下载图片</el-button>
<img :src="chooselist.qrCodeUrlCircleBlue" alt="" style="margin-bottom: 20px;width: 60px;height: 60px;">
<div class="tits" style="width: 60px;text-align: center;font-size: 12px;margin-bottom: 10px;">ali小程序</div>
<el-button type="primary" @click="downloadImage(chooselist.qrCodeUrlCircleBlue)"
style="margin-left: 0px;width: 60px;font-size: 12px;">下载</el-button>
</div>
<div class="infoli">
<div class="li">渠道名称{{ chooselist.name }} </div>
@ -131,7 +143,7 @@
<div class="li"> 总转化率{{ chooselist.totalConversionRatio }} </div>
<div class="li"> 回款率{{ chooselist.totalReturnRate }}</div>
</div>
<div class="infoli" >
<div class="infoli">
<div class="li">总注册{{ chooselist.totalRegisterNum }}</div>
<div class="li"> 总订单金额{{ chooselist.totalAmount }}</div>
<div class="li">总订单数量{{ chooselist.totalOrderNum }} </div>
@ -166,9 +178,9 @@
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;">
<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 prop="realName" label="姓名" width="100">
</el-table-column>
<el-table-column prop="createTime" label="注册日期 " align="center">
</el-table-column>
@ -186,12 +198,12 @@
<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'">
<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 class="cont" style="width: 100px;" v-if="scope.row.repaymentStatus == 'Late'">
已逾期
</div>
@ -199,8 +211,8 @@
</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" />
layout="total, sizes, prev, pager, next, jumper" :total="userdata.total"
@size-change="userhandleSizeChange" @current-change="userpageChange" />
</div>
</div>
@ -218,7 +230,7 @@
<script>
import QRCode from "qrcodejs2";
let qrcode = "";
import { ListChannel,ListChannels,Listuser, 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'; //
import download from "@/plugins/download";
@ -239,11 +251,11 @@ export default {
return {
listLoading: false,
dialogVisibles: false,
titindex:0,
titindex: 0,
channelInfo: {},
chooselist:{},
todaydata:{ list: [], total: 0 },
userdata:{},
chooselist: {},
todaydata: { list: [], total: 0 },
userdata: {},
constants: this.$constants,
listPram: {
productId: null,
@ -272,7 +284,7 @@ export default {
data: [],
total: 0,
},
codeurl:'',
codeurl: '',
};
},
@ -290,6 +302,14 @@ export default {
render: qRender,
});
},
qrcodes(qWidth, qHeight, qText, qRender) {
new QRCode("qrcodes", {
width: qWidth,
height: qHeight,
text: qText,
render: qRender,
});
},
async downloadImage(imageUrl) {
try {
const response = await fetch(imageUrl);
@ -322,13 +342,29 @@ export default {
console.error("无法找到二维码画布。");
}
},
downloadimgs() {
// canvas
const canvas = document.querySelector("#qrcodes canvas");
if (canvas) {
// a
const link = document.createElement('a');
// canvasDataURL
link.href = canvas.toDataURL("image/png");
//
link.download = 'qrcode.png';
//
link.click();
} else {
console.error("无法找到二维码画布。");
}
},
handleClose() {
this.userPrams.page=1
this.listPrams.page=1
this.userPrams.page = 1
this.listPrams.page = 1
this.dialogVisibles = false;
},
pageChange(page) {
@ -339,34 +375,34 @@ export default {
this.tableFrom.limit = val;
this.getList();
},
handleSizeChanges(val){
handleSizeChanges(val) {
this.listPrams.limit = val;
this.gettodaylist()
},
userhandleSizeChange(val){
userhandleSizeChange(val) {
this.userPrams.limit = val;
this.getuserlist()
},
todaypageChange(page){
todaypageChange(page) {
this.listPrams.page = page;
this.gettodaylist()
},
userpageChange(page){
userpageChange(page) {
this.userPrams.page = page;
this.getuserlist()
},
gettodaylist(){
gettodaylist() {
ListChannels(this.listPrams)
.then((res) => {
this. todaydata= res;
this.todaydata = res;
})
.catch(() => {
});
},
copyurl(url){
copyurl(url) {
console.log(url);
const textarea = document.createElement('textarea');
textarea.value = url;
@ -385,31 +421,36 @@ export default {
// console.error('URL:', err);
// });
},
getuserlist(){
getuserlist() {
Listuser(this.userPrams)
.then((res) => {
this.userdata = res;
console.log( this.todaydata,'returnRatereturnRatereturnRate');
console.log(this.todaydata, 'returnRatereturnRatereturnRate');
})
.catch(() => {
});
},
async showdlg(row) {
this.listPrams.channelId=row.id
this.userPrams.channelId=row.id
this.listPrams.channelId = row.id
this.userPrams.channelId = row.id
this.gettodaylist()
this.getuserlist()
console.log(row,'rowrow');
this.chooselist=row
console.log(row, 'rowrow');
this.chooselist = row
this.dialogVisibles = true
// await this.generateQRCode(row.url)
if (this.$refs.qrcode) this.$refs.qrcode.innerHTML = "";
this.$nextTick(function () {
this.qrcode(100, 100, row.url, "canvas");
this.qrcode(60, 60, row.url, "canvas");
console.log(QRCode.CorrectLevel.L);
});
this.$nextTick(function () {
this.qrcodes(60, 60, row.wxurl, "canvas");
console.log(QRCode.CorrectLevel.L);
});
},
formatPercentage(value) {
@ -535,7 +576,8 @@ export default {
font-size: 20px;
font-variation-settings: "opsz" auto;
cursor: pointer;
.act1{
.act1 {
font-weight: 700;
font-size: 25px;
}
@ -545,7 +587,7 @@ export default {
font-family: Source Han Sans;
font-size: 20px;
font-weight: bold;
line-height:30px;
line-height: 30px;
letter-spacing: 0px;
}
@ -555,17 +597,20 @@ export default {
margin: 5px auto;
display: flex;
flex-wrap: wrap;
.img_box{
.img_box {
right: 70px;
position: absolute;
width: 80px;
height: 80px;
img{
img {
width: 100px;
height: 100px;
// background-color: red;
}
}
.infoli {
width: 100%;
display: flex;

View File

@ -6,12 +6,12 @@
width="500px"
:before-close="handleClose">
<el-form :model="user" :rules="rules" ref="user" label-width="100px" class="demo-ruleForm" v-loading="loading">
<el-form-item label="第几期" >
<el-select v-model="user.installmentNumber" placeholder="请选择" style="width: 20%">
<el-form-item label="间隔时间" >
<el-select v-model="user.intervalCycle" placeholder="请选择" style="width: 40%">
<el-option v-for="item in installmentNumberTreeData" :key="item" :label="item" :value="item">
</el-option>
</el-select>
<span></span>
<span></span>
</el-form-item>
<el-form-item label="还款比例(%)" >
<el-input-number style="width: 50%;float: left"
@ -23,9 +23,9 @@
/>
<span class="el-input-group__append">%</span>
</el-form-item>
<el-form-item label="还款时间" prop="repaymentDeadlineStr">
<!-- <el-form-item label="还款时间" prop="repaymentDeadlineStr">
<el-date-picker v-model="user.repaymentDeadlineStr" type="date" placeholder="选择日期" />
</el-form-item>
</el-form-item> -->
<!-- <el-form-item label="分期提示" prop="tips">-->
<!-- <el-input v-model="user.tips" placeholder="请输入分期提示"></el-input>-->
<!-- </el-form-item>-->
@ -62,7 +62,7 @@ export default {
data() {
return {
detailVisible: false,
installmentNumberTreeData: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],
installmentNumberTreeData: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],
formValidate: Object.assign({}, obj),
loading: false,
rules: {

View File

@ -2,57 +2,75 @@
<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:setting:save']"
>添加套餐</el-button>
<el-button type="primary" class="mr10" @click="add" size="small"
v-hasPermi="['admin:setting:save']">添加套餐</el-button>
</div>
<el-table v-loading="listLoading" :data="listData.list" style="width: 100%" size="mini">
<el-table-column prop="id" label="ID" min-width="50" />
<el-table-column prop="name" label="分期套餐名称" min-width="100" />
<el-table-column prop="tips" label="提示内容" min-width="100" />
<el-table v-loading="listLoading" :data="listData.list" style="width: 100%" size="mini" row-key="name"
:tree-props="{ children: 'child', hasChildren: 'hasChildren' }">
<!-- <el-table-column prop="id" label="ID" min-width="50" /> -->
<el-table-column prop="name" label="分期套餐名称" min-width="100" align="center" />
<el-table-column prop="tips" label="提示内容" min-width="100" align="center" />
<el-table-column prop="intervalCycle" label="间隔时间" min-width="100" align="center" />
<el-table-column prop="installmentNumber" label="期数" min-width="100" align="center" />
<el-table-column prop="repaymentPercent" label="还款比例(%)" min-width="100" align="center" />
<!-- <el-table-column prop="repaymentDeadline" label="还款时间" min-width="100" align="center" /> -->
<el-table-column label="操作" min-width="120" fixed="right" align="center">
<template slot-scope="scope">
<el-button
type="text"
size="small"
@click="addDetail(scope.row)"
class="mr10"
:disabled="scope.row.pid > 0"
>添加自定义账单</el-button>
<el-button
type="text"
size="small"
@click="edit(scope.row)"
class="mr10"
v-hasPermi="['admin:setting:update']"
>编辑</el-button>
<el-button
type="text"
size="small"
@click="handleDelete(scope.row.id, scope.$index)"
v-hasPermi="['admin:setting:delete']"
>删除</el-button>
<el-button v-if="scope.row.tips" type="text" size="small" @click="addDetail(scope.row)" class="mr10"
:disabled="scope.row.pid > 0">添加自定义账单</el-button>
<el-button v-if="scope.row.tips" type="text" size="small" @click="edit(scope.row)" class="mr10"
v-hasPermi="['admin:setting:update']">编辑</el-button>
<el-button v-if="scope.row.tips" type="text" size="small" @click="handleDelete(scope.row.id, scope.$index)"
v-hasPermi="['admin:setting:delete']">删除</el-button>
<el-button v-if="scope.row.installmentNumber" type="text" size="small"
@click="handleDeletechild(scope.row.id, scope.$index)"
v-hasPermi="['admin:setting:delete']">删除</el-button>
<el-button v-if="scope.row.installmentNumber" type="text" size="small"
@click="changechild(scope.row)" v-hasPermi="['admin:setting:delete']">编辑</el-button>
</template>
</el-table-column>
</el-table>
<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-setting ref="grades" :user="userInfo"></creat-setting>
<creat-detail ref="grades1" :user="detailInfo"></creat-detail>
<el-dialog v-if="detailVisible" title="添加自定义账单" :visible.sync="detailVisible" width="500px"
:before-close="handleClose">
<el-form :rules="rules" label-width="100px" class="demo-ruleForm" v-loading="loading">
<el-form-item label="间隔时间">
<el-select v-model="user.intervalCycle" placeholder="请选择" style="width: 40%">
<el-option v-for="item in installmentNumberTreeData" :key="item" :label="item" :value="item">
</el-option>
</el-select>
<span></span>
</el-form-item>
<el-form-item label="还款比例(%)">
<el-input-number style="width: 50%;float: left" v-model="user.repaymentPercent" :min="0" :step="1"
step-strictly placeholder="请输入还款比例" />
<span class="el-input-group__append">%</span>
</el-form-item>
<!-- <el-form-item label="还款时间" prop="repaymentDeadlineStr">
<el-date-picker v-model="user.repaymentDeadline" type="date" placeholder="选择日期" />
</el-form-item> -->
<!-- <el-form-item label="分期提示" prop="tips">-->
<!-- <el-input v-model="user.tips" placeholder="请输入分期提示"></el-input>-->
<!-- </el-form-item>-->
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm('user')"> </el-button>
<el-button type="primary" @click="submitForm('formValidate')"
v-hasPermi="['admin:setting:update', 'admin:setting:save']"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { ListInstallments,UpdateInstallments,DelInstallments} from '@/api/systemInstallment';
import { ListInstallments, UpdateInstallments, DelInstallments, DelInstallmentschild,UpdateInstallmentschild } from '@/api/systemInstallment';
import creatSetting from './creatSetting';
import creatDetail from './creatDetail';
import { checkPermi } from '@/utils/permission'; //
@ -86,6 +104,15 @@ export default {
data: [],
total: 0,
},
detailVisible:false,
user:{},
loading: false,
installmentNumberTreeData: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],
rules: {
name: [{ required: true, message: '请输入分期套餐名称', trigger: 'blur' }],
},
// detailVisible: false,
};
},
mounted() {
@ -94,19 +121,30 @@ export default {
},
methods: {
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){
handleClose() {
this.detailVisible = false;
// this.user = Object.assign({}, '')
},
formatNumber(value) {
if (value == 0) {
return "-";
}else {
} else {
return value + "期";
}
},
resetForm(formName) {
this.detailVisible = false;
// this[formName] = {};
// this.$nextTick(() => {
// this.$refs.formData.resetFields();
// })
},
checkPermi,
seachList() {
this.getList();
@ -116,7 +154,7 @@ export default {
this.userInfo = {};
},
addDetail(detailInfo) {
console.log("detailInfo-----------"+JSON.stringify(detailInfo))
console.log("detailInfo-----------" + JSON.stringify(detailInfo))
this.$refs.grades1.detailVisible = true;
this.detailInfo = detailInfo;
},
@ -125,6 +163,10 @@ export default {
this.userInfo = user;
this.$refs.grades.dialogVisible = true;
},
changechild(item){
this.user=item
this.detailVisible=true
},
//
getList() {
this.listLoading = true;
@ -146,6 +188,14 @@ export default {
});
});
},
handleDeletechild(id, idx) {
this.$modalSure('删除吗?删除会导致对应分期套餐配置数据清空,请谨慎操作!').then(() => {
DelInstallmentschild(id).then(() => {
this.$message.success('删除成功');
this.getList();
});
});
},
handleSizeChange(val) {
this.listPram.limit = val;
this.handlerGetListData(this.listPram);
@ -154,6 +204,16 @@ export default {
this.listPram.page = val;
this.handlerGetListData(this.listPram);
},
submitForm() {
UpdateInstallmentschild(this.user)
.then((res) => {
this.$message.success('修改成功');
this.detailVisible = false;
})
.catch(() => {
});
},
onchangeIsShow(row) {
if (row.isShow == false) {
row.isShow = !row.isShow;
@ -187,6 +247,7 @@ export default {
.el-switch.is-disabled {
opacity: 1;
}
::v-deep .el-switch__label {
cursor: pointer !important;
}