Compare commits

...

14 Commits

Author SHA1 Message Date
777
9247f5eb83 1231233 2026-01-20 16:58:38 +08:00
777
f4f5954e17 1231233 2026-01-20 16:58:20 +08:00
777
a388f85dee 1231233 2026-01-18 15:00:42 +08:00
777
78ffecc94f 1231233 2026-01-12 16:24:43 +08:00
777
ea7e3fb721 1231233 2026-01-12 16:23:31 +08:00
777
fd5623f696 1231233 2026-01-10 18:30:32 +08:00
777
1bdb911f15 1231233 2026-01-06 15:36:38 +08:00
777
ebac3a6ff7 1231233 2026-01-05 10:41:24 +08:00
777
b1a934793e 1231233 2025-12-22 10:17:38 +08:00
777
43f9e82c74 1231233 2025-12-10 14:52:35 +08:00
777
95419a51f5 1231233 2025-12-10 14:34:12 +08:00
777
48f404a1bc 1231233 2025-12-09 15:03:17 +08:00
777
85cf804aaf 1231233 2025-12-09 11:27:12 +08:00
777
e137e573d2 1231233 2025-12-08 15:16:14 +08:00
46 changed files with 2095 additions and 560 deletions

View File

@@ -22,4 +22,4 @@ VUE_APP_XXL_JOB_ADMIN = 'http://localhost:9100/xxl-job-admin'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
VUE_APP_LOGO_PRE = 'leyan'
VUE_APP_LOGO_PRE = 'qiumu'

View File

@@ -1,24 +0,0 @@
# 页面标题
# 生产环境配置
NODE_ENV = 'production'
BABEL_ENV = 'production'
ENV = 'muyu'
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
# 应用访问路径 例如使用前缀 /admin/
VUE_APP_CONTEXT_PATH = '/'
# 监控地址
VUE_APP_MONITRO_ADMIN = '/admin/applications'
# xxl-job 控制台地址
VUE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
# 花荷
VUE_APP_SYSTEM_HOME = '沐雨'
VUE_APP_TITLE = 沐雨后台管理系统
VUE_APP_LOGO_PRE = 'muyu'

View File

@@ -3,7 +3,7 @@
# 生产环境配置
NODE_ENV = 'production'
BABEL_ENV = 'production'
ENV = 'leyan'
ENV = 'qiumu'
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
@@ -17,8 +17,8 @@ VUE_APP_MONITRO_ADMIN = '/admin/applications'
VUE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
# 花荷
VUE_APP_SYSTEM_HOME = '乐妍'
VUE_APP_TITLE = 乐妍后台管理系统
VUE_APP_LOGO_PRE = 'leyan'
VUE_APP_SYSTEM_HOME = '秋沐'
VUE_APP_TITLE = 秋沐后台管理系统
VUE_APP_LOGO_PRE = 'qiumu'

View File

@@ -1,23 +0,0 @@
# 页面标题
# 生产环境配置
NODE_ENV = 'production'
BABEL_ENV = 'production'
ENV = 'wanyan'
VUE_APP_BASE_API = '/prod-api'
# 应用访问路径 例如使用前缀 /admin/
VUE_APP_CONTEXT_PATH = '/'
# 监控地址
VUE_APP_MONITRO_ADMIN = '/admin/applications'
# xxl-job 控制台地址
VUE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
VUE_APP_SYSTEM_HOME = '婉妍'
VUE_APP_TITLE = 婉妍后台管理系统
VUE_APP_LOGO_PRE = 'wanyan'

View File

@@ -1,24 +0,0 @@
# 页面标题
# 生产环境配置
NODE_ENV = 'production'
BABEL_ENV = 'production'
ENV = 'yuan'
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
# 应用访问路径 例如使用前缀 /admin/
VUE_APP_CONTEXT_PATH = '/'
# 监控地址
VUE_APP_MONITRO_ADMIN = '/admin/applications'
# xxl-job 控制台地址
VUE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
# 花荷
VUE_APP_SYSTEM_HOME = '予安'
VUE_APP_TITLE = 予安后台管理系统
VUE_APP_LOGO_PRE = 'yuan'

View File

@@ -7,10 +7,7 @@
"scripts": {
"dev": "vue-cli-service serve",
"build:prod": "vue-cli-service build",
"build:yuan": "vue-cli-service build --mode yuan",
"build:leyan": "vue-cli-service build --mode leyan",
"build:muyu": "vue-cli-service build --mode muyu",
"build:wanyan": "vue-cli-service build --mode wanyan",
"build:qiumu": "vue-cli-service build --mode qiumu",
"build:yanyu": "vue-cli-service build --mode yanyu",
"preview": "node build/index.js --preview",
"lint": "eslint --ext .js,.vue src"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

BIN
public/favicon-qiumu.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -25,3 +25,11 @@ export function updateAccountCoin(data) {
data: data
})
}
export function changePointsAccount(data) {
return request({
url: '/cai/account/changePoints',
method: 'post',
data: data
})
}

10
src/api/cai/loginLog.js Normal file
View File

@@ -0,0 +1,10 @@
import request from '@/utils/request'
// 查询ip访问记录列表
export function listLoginLog(query) {
return request({
url: '/cai/loginLog/list',
method: 'get',
params: query
})
}

View File

@@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询积分记录列表
export function listPointChangeLog(query) {
return request({
url: '/cai/pointChangeLog/list',
method: 'get',
params: query
})
}
// 查询积分记录详细
export function getPointChangeLog(id) {
return request({
url: '/cai/pointChangeLog/' + id,
method: 'get'
})
}
// 新增积分记录
export function addPointChangeLog(data) {
return request({
url: '/cai/pointChangeLog',
method: 'post',
data: data
})
}
// 修改积分记录
export function updatePointChangeLog(data) {
return request({
url: '/cai/pointChangeLog',
method: 'put',
data: data
})
}
// 删除积分记录
export function delPointChangeLog(id) {
return request({
url: '/cai/pointChangeLog/' + id,
method: 'delete'
})
}

51
src/api/cai/prizeInfo.js Normal file
View File

@@ -0,0 +1,51 @@
import request from '@/utils/request'
// 查询抽奖奖品列表
export function listPrizeInfo(query) {
return request({
url: '/cai/prizeInfo/list',
method: 'get',
params: query
})
}
// 查询抽奖奖品详细
export function getPrizeInfo(id) {
return request({
url: '/cai/prizeInfo/' + id,
method: 'get'
})
}
// 新增抽奖奖品
export function addPrizeInfo(data) {
return request({
url: '/cai/prizeInfo',
method: 'post',
data: data
})
}
// 修改抽奖奖品
export function updatePrizeInfo(data) {
return request({
url: '/cai/prizeInfo',
method: 'put',
data: data
})
}
// 删除抽奖奖品
export function delPrizeInfo(id) {
return request({
url: '/cai/prizeInfo/' + id,
method: 'delete'
})
}
export function prizeInfoAll() {
return request({
url: '/cai/prizeInfo/all',
method: 'get'
})
}

View File

@@ -0,0 +1,27 @@
import request from '@/utils/request'
// 查询已发布奖品列表
export function listPrizeOnline(query) {
return request({
url: '/cai/prizeOnline/list',
method: 'get',
params: query
})
}
// 查询已发布奖品详细
export function getPrizeOnline(id) {
return request({
url: '/cai/prizeOnline/' + id,
method: 'get'
})
}
// 新增已发布奖品
export function resetPrizeOnline(gender,data) {
return request({
url: '/cai/prizeOnline/reset/'+gender,
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,35 @@
import request from '@/utils/request'
// 查询中奖记录列表
export function listPrizeWinningRecord(query) {
return request({
url: '/cai/prizeWinningRecord/list',
method: 'get',
params: query
})
}
// 查询中奖记录详细
export function getPrizeWinningRecord(id) {
return request({
url: '/cai/prizeWinningRecord/' + id,
method: 'get'
})
}
// 修改中奖记录
export function givePrizeWinningRecord(data) {
return request({
url: '/cai/prizeWinningRecord/give',
method: 'post',
data: data
})
}
// 删除中奖记录
export function delPrizeWinningRecord(id) {
return request({
url: '/cai/prizeWinningRecord/' + id,
method: 'delete'
})
}

View File

@@ -7,6 +7,17 @@ export function listBusinessConfigList() {
})
}
export function listBusinessConfigV2List(businessType) {
return request({
url: '/cai/systemConfig/business/v2/all',
method: 'get',
params: {
businessType: businessType
}
})
}
export function updateBusinessConfig(data) {
return request({
url: '/cai/systemConfig/business/update',

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -338,3 +338,36 @@ export const topStatusList = [
{ value: 2, label: '过期', listClass: listClass.info},
{ value: 3, label: '待生效', listClass: listClass.warning},
]
/**
* PAY("1","充值"),
* SYSTEM("2","系统调整"),
* INVITE("3","分销"),
* USE("4","抽奖"),
*/
export const pointChangeLogActionTypeList = [
{ value: "1", label: '充值',listClass: listClass.info},
{ value: "2", label: '系统调整',listClass: listClass.danger},
{ value: "3", label: '分销',listClass: listClass.primary},
{ value: "4", label: '抽奖',listClass: listClass.primary},
]
// 奖品类型 1-谢谢惠顾 2-普通奖 3-大奖
export const prizeTypeList = [
{ value: 1, label: '谢谢惠顾', listClass: listClass.warning },
{ value: 2, label: '普通奖', listClass: listClass.primary },
{ value: 3, label: '大奖', listClass: listClass.danger }
]
export const prizeAutoGiveList = [
{ value: false, label: '手工派发',listClass: listClass.warning},
{ value: true, label: '自动派发',listClass: listClass.primary},
]
/**
* 奖品兑换情况 0-未兑换 1-已兑换
*/
export const winningRecordGiveStatusList= [
{ value: 0, label: '未兑换',listClass: listClass.danger},
{ value: 1, label: '已兑换',listClass: listClass.primary},
]

View File

@@ -0,0 +1,124 @@
<template>
<el-dialog :title="title" :close-on-click-modal="false" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="是否执行分销" prop="distribution">
<el-radio-group v-model="form.distribution">
<el-radio :label="false">不执行</el-radio>
<el-radio :label="true">执行</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="调整积分" prop="changePoints">
<el-input v-model="form.changePoints" placeholder="请输入调整积分" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入" />
</el-form-item>
<el-form-item :label="systemName+'号'" prop="usercode">
<el-autocomplete
class="inline-input"
v-model="form.usercode"
:fetch-suggestions="querySearch"
placeholder="请输入内容"
@select="handleSelect"
></el-autocomplete>
</el-form-item>
<el-form-item label="昵称" v-if="info.nickname">
{{ info.nickname }} {{ info.usercode }}
</el-form-item>
<el-form-item label="头像" v-if="info.avatar">
<image-avatar :src="info.avatar"/>
</el-form-item>
<el-form-item>
注意调整积分为负减余额正则加积分 请保证积分不能减为负数
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="open = false"> </el-button>
</div>
</el-dialog>
</template>
<script>
import {getUserByUsercode, listUserByUserCode} from "@/api/cai/user";
import {changePointsAccount} from "@/api/cai/account";
export default {
components: {
},
data () {
return {
systemName: process.env.VUE_APP_SYSTEM_HOME,
open: false,
title: '',
form:{
usercode: undefined,
changePoints: undefined,
remark: undefined,
distribution: false
},
info:{
},
// 表单校验
rules: {
distribution: [
{ required: true, message: "数据不能为空", trigger: "blur" }
],
usercode: [
{ required: true, message: "数据不能为空", trigger: "blur" }
],
changePoints: [
{ required: true, message: "数据不能为空", trigger: "blur" }
],
remark: [
{ required: true, message: "数据不能为空", trigger: "blur" }
],
},
buttonLoading: false,
}
},
created() {
},
methods: {
init () {
this.open = true;
this.title = "调整用户积分"
this.info = {};
this.form.usercode = undefined
this.form.rechargeCoin = undefined
this.form.remark = undefined
},
querySearch(querySearch,cb){
listUserByUserCode(querySearch).then(res => {
cb(res.data.map((terminal) => {
return {
value: terminal,
name: terminal,
};
}))
})
},
handleSelect(item){
getUserByUsercode(item.value).then(res => {
this.info = res.data
})
},
// 表单提交
submitForm () {
this.$refs['form'].validate((valid) => {
if (valid) {
this.buttonLoading = true;
changePointsAccount(this.form).then(data => {
this.$modal.msgSuccess("操作成功");
this.buttonLoading = false;
this.open = false
this.$emit('refreshDataList')
}).finally(() => {
this.buttonLoading = false;
});
}
})
},
}
}
</script>

View File

@@ -34,6 +34,16 @@
v-hasPermi="['cai:account:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-plus"
size="mini"
@click="handleAddPoints"
v-hasPermi="['cai:account:add']"
>新增积分</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@@ -60,7 +70,7 @@
<el-table-column label="余额" align="center" prop="coin" sortable="custom" :sort-orders="['descending', 'ascending']" />
<el-table-column label="收益" align="center" prop="incomeCoin" sortable="custom" :sort-orders="['descending', 'ascending']"/>
<el-table-column label="积分" align="center" prop="points" sortable="custom" :sort-orders="['descending', 'ascending']"/>
<el-table-column label="非原生充值" align="center" prop="totalTrdMoney" sortable="custom" :sort-orders="['descending', 'ascending']"/>
<!-- <el-table-column label="非原生充值" align="center" prop="totalTrdMoney" sortable="custom" :sort-orders="['descending', 'ascending']"/>-->
<el-table-column label="充值总额" align="center" prop="totalBuyMoney" sortable="custom" :sort-orders="['descending', 'ascending']"/>
<el-table-column label="充值总紫贝" align="center" prop="totalBuyCoin" sortable="custom" :sort-orders="['descending', 'ascending']"/>
<el-table-column label="聊天总收入" align="center" prop="messageIncomeCoin" sortable="custom" :sort-orders="['descending', 'ascending']"/>
@@ -92,8 +102,10 @@
@pagination="getList"
/>
<add-account-dialog v-if="addAccountDialogVisible" ref="addAccountDialog" @refreshDataList="getList"/>
<add-account-dialog v-if="addAccountDialogVisible" ref="addAccountDialog" @refreshDataList="getList"/>
<account-change-info v-if="accountChangeInfoVisible" ref="accountChangeInfo" />
<add-account-points-dialog v-if="addAccountPointsVisible" ref="addAccountPoints" />
</div>
</template>
@@ -102,11 +114,14 @@ import {listAccount} from "@/api/cai/account";
import {genderList, isAnchorList, userStatusList, yesOrNoList} from "@/constant/statusMap";
import AddAccountDialog from "@/views/cai/account/add-account-dialog";
import AccountChangeInfo from "@/views/cai/account/account-change-info";
import AddAccountPointsDialog from "@/views/cai/account/add-account-points-dialog.vue";
export default {
name: "Account",
components:{
AddAccountPointsDialog,
AccountChangeInfo,
AddAccountDialog
},
@@ -115,6 +130,7 @@ export default {
genderList, userStatusList, yesOrNoList, isAnchorList,
addAccountDialogVisible: false,
accountChangeInfoVisible: false,
addAccountPointsVisible: false,
systemName: process.env.VUE_APP_SYSTEM_HOME,
// 遮罩层
loading: true,
@@ -187,6 +203,12 @@ export default {
this.$refs.addAccountDialog.init(row?.usercode)
})
},
handleAddPoints(row) {
this.addAccountPointsVisible = true
this.$nextTick(() => {
this.$refs.addAccountPoints.init(row?.usercode)
})
},
}
};
</script>

View File

@@ -0,0 +1,145 @@
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-refresh"
size="mini"
@click="getList"
>重新查询</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="configList" >
<el-table-column label="名称" align="center" prop="desc" />
<el-table-column label="数值" align="center" prop="value" >
<template v-slot="scope">
<span v-if="scope.row.inputType !== 'textarea'">{{ scope.row.value }}</span>
<span v-if="scope.row.inputType === 'textarea'" v-html="scope.row.valueTextArea"></span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template v-slot="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
v-hasPermi="['cai:businessConfig:edit']"
@click="handleUpdate(scope.row)"
>修改</el-button>
</template>
</el-table-column>
</el-table>
<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-item label="名称" prop="desc">
<el-input v-model="form.desc" placeholder="请输入" disabled/>
</el-form-item>
<el-form-item label="数值" prop="value">
<el-input v-model="form.value" placeholder="请输入数值" v-if="form.inputType !== 'textarea'" />
<el-input v-model="form.value" placeholder="请输入数值" type="textarea" autosize v-if="form.inputType === 'textarea'" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {listBusinessConfigV2List, updateBusinessConfig} from "@/api/cai/systemConfig";
export default {
props: {
businessType: {
type: String,
required: true, // 必填
default: "base" // 默认值
},
},
name: "BusinessConfig",
components: {
},
data() {
return {
// 遮罩层
buttonLoading: false,
loading: true,
// 显示搜索条件
showSearch: true,
queryParams:{},
form:{},
// 轮播表格数据
configList: [],
title: "",
open: false,
rules:[]
};
},
created() {
this.getList();
},
methods: {
/** 查询轮播列表 */
getList() {
this.loading = true;
listBusinessConfigV2List(this.businessType).then(response => {
response.data.forEach(i => {
if(i.inputType === 'textarea'){
i.valueTextArea = i.value.replace(/\n/g, "<br/>");
}
})
this.configList = response.data;
}).finally(()=>{
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
reset() {
this.form = {
key: undefined,
desc: undefined,
value: undefined,
inputType: undefined
};
this.resetForm("form");
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form = {
key: row.key,
desc: row.desc,
value: row.value,
inputType: row.inputType
};
this.open = true;
this.title = "修改业务设置";
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
this.buttonLoading = true;
updateBusinessConfig(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
}
});
},
}
};
</script>

View File

@@ -0,0 +1,129 @@
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="configList" >
<el-table-column label="名称" align="center" prop="desc" />
<el-table-column label="数值" align="center" prop="value" >
<template v-slot="scope">
<span v-if="scope.row.inputType !== 'textarea'">{{ scope.row.value }}</span>
<span v-if="scope.row.inputType === 'textarea'" v-html="scope.row.valueTextArea"></span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template v-slot="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
v-hasPermi="['cai:businessConfig:edit']"
@click="handleUpdate(scope.row)"
>修改</el-button>
</template>
</el-table-column>
</el-table>
<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-item label="名称" prop="desc">
<el-input v-model="form.desc" placeholder="请输入" disabled/>
</el-form-item>
<el-form-item label="数值" prop="value">
<el-input v-model="form.value" placeholder="请输入数值" v-if="form.inputType !== 'textarea'" />
<el-input v-model="form.value" placeholder="请输入数值" type="textarea" autosize v-if="form.inputType === 'textarea'" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {listBusinessConfigList, updateBusinessConfig} from "@/api/cai/systemConfig";
export default {
name: "BusinessConfig",
components: {
},
data() {
return {
// 遮罩层
buttonLoading: false,
loading: true,
// 显示搜索条件
showSearch: true,
queryParams:{},
form:{},
// 轮播表格数据
configList: [],
title: "",
open: false,
rules:[]
};
},
created() {
this.getList();
},
methods: {
/** 查询轮播列表 */
getList() {
this.loading = true;
listBusinessConfigList().then(response => {
response.data.forEach(i => {
if(i.inputType === 'textarea'){
i.valueTextArea = i.value.replace(/\n/g, "<br/>");
}
})
this.configList = response.data;
}).finally(()=>{
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
reset() {
this.form = {
key: undefined,
desc: undefined,
value: undefined,
inputType: undefined
};
this.resetForm("form");
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form = {
key: row.key,
desc: row.desc,
value: row.value,
inputType: row.inputType
};
this.open = true;
this.title = "修改业务设置";
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
this.buttonLoading = true;
updateBusinessConfig(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
}
});
},
}
};
</script>

View File

@@ -1,130 +1,47 @@
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="configList" >
<el-table-column label="名称" align="center" prop="desc" />
<el-table-column label="数值" align="center" prop="value" >
<template v-slot="scope">
<span v-if="scope.row.inputType !== 'textarea'">{{ scope.row.value }}</span>
<span v-if="scope.row.inputType === 'textarea'" v-html="scope.row.valueTextArea"></span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template v-slot="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
v-hasPermi="['cai:businessConfig:edit']"
@click="handleUpdate(scope.row)"
>修改</el-button>
</template>
</el-table-column>
</el-table>
<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-item label="名称" prop="desc">
<el-input v-model="form.desc" placeholder="请输入" disabled/>
</el-form-item>
<el-form-item label="数值" prop="value">
<el-input v-model="form.value" placeholder="请输入数值" v-if="form.inputType !== 'textarea'" />
<el-input v-model="form.value" placeholder="请输入数值" type="textarea" autosize v-if="form.inputType === 'textarea'" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-tabs v-model="activeTabs" @tab-click="handleClick">
<el-tab-pane label="业务配置" name="business">
<config-table business-type="business" />
</el-tab-pane>
<el-tab-pane label="安全配置" name="security">
<config-table business-type="security" />
</el-tab-pane>
<el-tab-pane label="支付配置" name="pay">
<config-table business-type="pay" />
</el-tab-pane>
<el-tab-pane label="域名配置" name="domain">
<config-table business-type="domain" />
</el-tab-pane>
<el-tab-pane label="抽奖配置" name="DRAW">
<config-table business-type="DRAW" />
</el-tab-pane>
<el-tab-pane label="系统配置" name="system">
<config-table business-type="system" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BannerAddUpdateDialog from '@/views/cai/banner/banner-add-update-dialog.vue'
import {listBusinessConfigList, updateBusinessConfig, updateSystemConfig} from "@/api/cai/systemConfig";
import ConfigTable from "@/views/cai/businessConfig/config-table.vue";
export default {
name: "Banner",
name: "SystemConfig",
components: {
BannerAddUpdateDialog
ConfigTable
},
data() {
return {
// 遮罩层
buttonLoading: false,
loading: true,
// 显示搜索条件
showSearch: true,
queryParams:{},
form:{},
// 轮播表格数据
configList: [],
title: "",
open: false,
rules:[]
activeTabs: "business",
};
},
created() {
this.getList();
},
methods: {
/** 查询轮播列表 */
getList() {
this.loading = true;
listBusinessConfigList().then(response => {
response.data.forEach(i => {
if(i.inputType === 'textarea'){
i.valueTextArea = i.value.replace(/\n/g, "<br/>");
}
})
this.configList = response.data;
}).finally(()=>{
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
reset() {
this.form = {
key: undefined,
desc: undefined,
value: undefined,
inputType: undefined
};
this.resetForm("form");
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form = {
key: row.key,
desc: row.desc,
value: row.value,
inputType: row.inputType
};
this.open = true;
this.title = "修改业务设置";
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
this.buttonLoading = true;
updateBusinessConfig(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
}
});
handleClick(tab, event){
console.log(tab, event);
},
}
};

View File

@@ -13,6 +13,9 @@
<el-form-item label="微信云贝数量" prop="wxAmount">
<el-input v-model="form.wxAmount" placeholder="请输入微信云贝数量" />
</el-form-item>
<el-form-item label="赠送积分" prop="givePoint">
<el-input v-model="form.givePoint" placeholder="请输入赠送积分数量" />
</el-form-item>
<el-form-item label="说明" prop="remark">
<el-input v-model="form.remark" placeholder="请输入说明" type="textarea" :rows="2"/>
</el-form-item>
@@ -42,10 +45,14 @@ export default {
price: undefined,
amount: undefined,
wxAmount: undefined,
givePoint: undefined,
remark: undefined,
},
// 表单校验
rules: {
givePoint: [
{ required: true, message: "数据不能为空", trigger: "blur" }
],
amount: [
{ required: true, message: "数据不能为空", trigger: "blur" }
],

View File

@@ -40,6 +40,7 @@
{{scope.row.amount - scope.row.wxAmount}}
</template>
</el-table-column>
<el-table-column label="赠送积分" align="center" prop="givePoint" />
<el-table-column label="状态" align="center" prop="status" >
<template v-slot="scope">
<el-switch

View File

@@ -0,0 +1,87 @@
<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="mobile">
<el-input
v-model="queryParams.mobile"
placeholder="请输入手机号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery" v-loading="loading">搜索</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">
<span style="color: red">请输入手机号可以查询单日的最近10条原始登录记录请勿一直查询查询比较慢</span>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="ipRecordList" @selection-change="handleSelectionChange">
<el-table-column label="详情" align="left" prop="info" />
</el-table>
</div>
</template>
<script>
import {listLoginLog} from "@/api/cai/loginLog";
export default {
name: "IpRecord",
data() {
return {
// 按钮loading
buttonLoading: false,
// 遮罩层
loading: false,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// ip访问记录表格数据
ipRecordList: [],
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
mobile: undefined
},
};
},
created() {
},
methods: {
/** 查询ip访问记录列表 */
getList() {
this.loading = true;
listLoginLog(this.queryParams).then(response => {
this.ipRecordList = response.data;
this.loading = false;
});
},
/** 搜索按钮操作 */
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
},
}
};
</script>

View File

@@ -121,9 +121,6 @@ export default {
name: [
{ required: true, message: "支付名称不能为空", trigger: "blur" }
],
notifyUrl: [
{ required: true, message: "回调域名不能为空", trigger: "blur" }
],
mchId: [
{ required: true, message: "商户ID不能为空", trigger: "blur" }
],

View File

@@ -0,0 +1,199 @@
<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="systemName+'号'" prop="usercode">
<el-input
v-model="queryParams.usercode"
:placeholder="'请输入'+systemName+'号'"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="手机号" prop="mobile">
<el-input
v-model="queryParams.mobile"
placeholder="请输入手机号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="奖品名称" prop="prizeName">
<el-input
v-model="queryParams.prizeName"
placeholder="请输入奖品名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="自动兑奖" prop="autoGive">
<el-select v-model="queryParams.autoGive" size="small">
<el-option
v-for="dict in prizeAutoGiveList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="giveStatus">
<el-select v-model="queryParams.giveStatus" size="small">
<el-option
v-for="dict in winningRecordGiveStatusList"
: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-table v-loading="loading" :data="prizeWinningRecordList" @selection-change="handleSelectionChange">
<el-table-column label="抽奖时间" align="center" prop="createTime" width="140"/>
<el-table-column :label="systemName+'号'" align="center" prop="usercode"/>
<el-table-column label="手机号" align="center" prop="mobile"/>
<el-table-column label="昵称" align="center" prop="nickname"/>
<el-table-column label="奖品类型" align="center" prop="prizeType" >
<template v-slot="scope">
<cai-dict-tag :options="prizeTypeList" :value="scope.row.prizeType" />
</template>
</el-table-column>
<el-table-column label="奖品名称" align="center" prop="prizeName" />
<el-table-column label="奖品描述" align="center" prop="prizeDesc" />
<el-table-column label="奖品图片" align="center" prop="prizeImg" >
<template v-slot="scope">
<image-avatar :src="scope.row.prizeImg"/>
</template>
</el-table-column>
<el-table-column label="奖品价值" align="center" prop="prizePrice" />
<el-table-column label="自动兑奖" align="center" prop="autoGive" >
<template v-slot="scope">
<cai-dict-tag :options="prizeAutoGiveList" :value="scope.row.autoGive" />
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="giveStatus" >
<template v-slot="scope">
<cai-dict-tag :options="winningRecordGiveStatusList" :value="scope.row.giveStatus" />
</template>
</el-table-column>
<el-table-column label="兑奖备注" align="center" prop="giveRemark" />
<el-table-column label="中奖率" align="center" prop="winProbability" />
<el-table-column label="保底抽数" align="center" prop="guaranteeDraws" />
<el-table-column label="最低抽数" align="center" prop="minWinDraws" />
<el-table-column label="操作" align="center" fixed="right" 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="['cai:prizeWinningRecord:edit']"
>已领奖</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"
/>
</div>
</template>
<script>
import {givePrizeWinningRecord, listPrizeWinningRecord} from "@/api/cai/prizeWinningRecord";
import {prizeAutoGiveList, prizeTypeList, winningRecordGiveStatusList} from "@/constant/statusMap";
export default {
name: "PrizeWinningRecord",
data() {
return {
winningRecordGiveStatusList,prizeTypeList, prizeAutoGiveList,
systemName: process.env.VUE_APP_SYSTEM_HOME,
// 按钮loading
buttonLoading: false,
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 中奖记录表格数据
prizeWinningRecordList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
usercode: undefined,
mobile: undefined,
prizeName: undefined,
autoGive: undefined,
giveStatus: undefined,
},
};
},
created() {
this.getList();
},
methods: {
/** 查询中奖记录列表 */
getList() {
this.loading = true;
listPrizeWinningRecord(this.queryParams).then(response => {
this.prizeWinningRecordList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 搜索按钮操作 */
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
},
/** 修改按钮操作 */
handleUpdate(row) {
this.$prompt('可输入的备注', "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
closeOnClickModal: false,
}).then(({ value }) => {
givePrizeWinningRecord({
id: row.id,
giveRemark: value,
}).then(response => {
this.$modal.msgSuccess("修改成功");
this.getList();
});
}).catch(() => {});
},
}
};
</script>

View File

@@ -0,0 +1,38 @@
<template>
<div class="app-container">
<el-tabs v-model="activeTabs" @tab-click="handleClick">
<el-tab-pane label="中奖记录" name="drawWinningRecordTabs">
<draw-winning-record-tabs />
</el-tab-pane>
<el-tab-pane label="积分记录" name="pointRecordTabs">
<point-change-log-tabs />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import DrawWinningRecordTabs from "@/views/cai/pointChangeLog/draw-winning-record-tabs.vue";
import PointChangeLogTabs from "@/views/cai/pointChangeLog/point-change-log-tabs.vue";
export default {
name: "PrizeInfo",
components: {
DrawWinningRecordTabs,
PointChangeLogTabs,
},
data() {
return {
activeTabs: "drawWinningRecordTabs",
};
},
created() {
},
methods: {
handleClick(tab, event){
console.log(tab, event);
},
}
};
</script>

View File

@@ -0,0 +1,153 @@
<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="systemName+'号'" prop="usercode">
<el-input
v-model="queryParams.usercode"
:placeholder="'请输入'+systemName+'号'"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="来源" prop="actionType">
<el-select v-model="queryParams.actionType" placeholder="来源" clearable size="small">
<el-option
v-for="dict in pointChangeLogActionTypeList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
@keyup.enter.native="handleQuery"
/>
</el-select>
</el-form-item>
<el-form-item label="链路号" prop="traceId">
<el-input
v-model="queryParams.traceId"
placeholder="请输入链路号"
clearable
@keyup.enter.native="handleQuery"
/>
</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-table v-loading="loading" :data="pointChangeLogList" @selection-change="handleSelectionChange">
<el-table-column :label="systemName+'号'" align="center" prop="usercode" />
<el-table-column label="来源" align="center" prop="actionType" >
<template v-slot="scope">
<cai-dict-tag :options="pointChangeLogActionTypeList" :value="scope.row.actionType"/>
</template>
</el-table-column>
<el-table-column label="变动" align="center" prop="changeValue" >
<template v-slot="scope" >
<span :class="scope.row.changeValue >= 0 ?'font-red':'font-green'">{{scope.row.changeValue}}</span>
</template>
</el-table-column>
<el-table-column label="说明" align="center" prop="message" min-width="200">
<template v-slot="scope">
<div class="context-avatar-center">
<span>{{scope.row.message}}</span><image-preview v-if="scope.row.tarImg" :src="scope.row.tarImg" :width="32" :height="32"/>
</div>
</template>
</el-table-column>
<el-table-column label="后台操作" align="center" prop="isAdmin" >
<template v-slot="scope">
<cai-dict-tag :options="yesOrNoList" :value="scope.row.isAdmin?1:0"/>
</template>
</el-table-column>
<el-table-column label="操作时间" align="center" prop="createTime" width="160" />
<el-table-column label="链路号" align="center" prop="traceId" show-overflow-tooltip/>
<!-- <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-info"
v-if="scope.row.traceId"
@click="handleInfo(scope.row)"
>关联业务</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"
/>
</div>
</template>
<script>
import {listPointChangeLog} from "@/api/cai/pointChangeLog";
import {pointChangeLogActionTypeList, yesOrNoList} from "@/constant/statusMap";
export default {
name: "PointChangeLog",
data() {
return {
systemName: process.env.VUE_APP_SYSTEM_HOME,
pointChangeLogActionTypeList,yesOrNoList,
// 按钮loading
buttonLoading: false,
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 积分记录表格数据
pointChangeLogList: [],
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
usercode: undefined,
actionType: undefined,
traceId:undefined
},
};
},
created() {
this.getList();
},
methods: {
/** 查询积分记录列表 */
getList() {
this.loading = true;
listPointChangeLog(this.queryParams).then(response => {
this.pointChangeLogList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 搜索按钮操作 */
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
},
}
};
</script>

View File

@@ -1,181 +1,70 @@
<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="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入用户"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="积分" prop="points">
<el-input
v-model="queryParams.points"
placeholder="请输入积分"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="消费方用户" prop="sourceUserId">
<el-input
v-model="queryParams.sourceUserId"
placeholder="请输入消费方用户"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="消费方用户" prop="sourceUsercode">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item :label="'消费方'+systemName+'号'" prop="sourceUsercode">
<el-input
v-model="queryParams.sourceUsercode"
placeholder="请输入消费方用户"
:placeholder="'请输入'+systemName+'号'"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="消费方用户" prop="sourcePhone">
<el-input
v-model="queryParams.sourcePhone"
placeholder="请输入消费方用户"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分销方" prop="oneUserId">
<el-input
v-model="queryParams.oneUserId"
placeholder="请输入分销方"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分销方" prop="oneUsercode">
<el-form-item :label="'邀请方'+systemName+'号'" prop="oneUsercode">
<el-input
v-model="queryParams.oneUsercode"
placeholder="请输入分销方"
:placeholder="'请输入邀请方'+systemName+'号'"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分销" prop="onePhone">
<el-input
v-model="queryParams.onePhone"
placeholder="请输入分销方"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分销方提成比例" prop="oneRate">
<el-input
v-model="queryParams.oneRate"
placeholder="请输入分销方提成比例"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="分销方积分" prop="onePoints">
<el-input
v-model="queryParams.onePoints"
placeholder="请输入分销方积分"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="来源ID" prop="sourceId">
<el-input
v-model="queryParams.sourceId"
placeholder="请输入来源ID"
clearable
<el-form-item label="分销" prop="status">
<el-select v-model="queryParams.status" clearable size="small">
<el-option
v-for="dict in consumeLogStatusList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
@keyup.enter.native="handleQuery"
/>
</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="['cai:pointRecordLog: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="['cai:pointRecordLog: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="['cai:pointRecordLog: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="['cai:pointRecordLog:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="pointRecordLogList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="" align="center" prop="id" v-if="true"/>
<el-table-column label="用户" align="center" prop="userId" />
<el-table-column label="积分" align="center" prop="points" />
<el-table-column label="消费方用户" align="center" prop="sourceUserId" />
<el-table-column label="消费方用户" align="center" prop="sourceUsercode" />
<el-table-column label="消费方用户" align="center" prop="sourcePhone" />
<el-table-column label="分销方" align="center" prop="oneUserId" />
<el-table-column label="分销方" align="center" prop="oneUsercode" />
<el-table-column label="分销方" align="center" prop="onePhone" />
<el-table-column label="分销方提成比例" align="center" prop="oneRate" />
<el-table-column label="分销方积分" align="center" prop="onePoints" />
<el-table-column label="状态 -1-无须分销 0-待分销 1-已分销" align="center" prop="status" />
<el-table-column label="状态" align="center" prop="status" width="80" >
<template v-slot="scope">
<cai-dict-tag :options="consumeLogStatusList" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="消费方" align="center" prop="sourceUser" width="200">
<template v-slot="scope">
<span style="font-weight: bold">{{systemName}}:</span><span>{{scope.row.sourceUsercode}}</span> <br>
<span style="font-weight: bold">手机号:</span><span>{{scope.row.sourcePhone}}</span><br>
</template>
</el-table-column>
<el-table-column label="发生积分" align="center" prop="points" />
<el-table-column label="邀请方" align="center" prop="invite" min-width="200" >
<template v-slot="scope">
<div v-if="scope.row.oneUsercode">
<span style="font-weight: bold">邀请人:</span><span>{{scope.row.oneUsercode}}({{scope.row.onePhone}})</span> <br>
<span style="font-weight: bold">分销:</span><span :class="joinColor(scope.row.oneJoin)">{{scope.row.oneJoin ? '参与' : '不参与'}}</span><br>
<span style="font-weight: bold">费率/金额:</span>
<span>
<span class="font-green">{{scope.row.oneRate}}</span>
/
<span class="font-red">{{scope.row.onePoints}}</span>
</span> <br>
</div>
<span v-if="!scope.row.oneUsercode">-</span>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" />
<el-table-column label="来源" align="center" prop="sourceType" />
<el-table-column label="来源ID" align="center" prop="sourceId" />
<el-table-column label="备注" align="center" prop="remark" />
<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="['cai:pointRecordLog:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['cai:pointRecordLog:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
@@ -185,62 +74,19 @@
: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="userId">
<el-input v-model="form.userId" placeholder="请输入用户" />
</el-form-item>
<el-form-item label="积分" prop="points">
<el-input v-model="form.points" placeholder="请输入积分" />
</el-form-item>
<el-form-item label="消费方用户" prop="sourceUserId">
<el-input v-model="form.sourceUserId" placeholder="请输入消费方用户" />
</el-form-item>
<el-form-item label="消费方用户" prop="sourceUsercode">
<el-input v-model="form.sourceUsercode" placeholder="请输入消费方用户" />
</el-form-item>
<el-form-item label="消费方用户" prop="sourcePhone">
<el-input v-model="form.sourcePhone" placeholder="请输入消费方用户" />
</el-form-item>
<el-form-item label="分销方" prop="oneUserId">
<el-input v-model="form.oneUserId" placeholder="请输入分销方" />
</el-form-item>
<el-form-item label="分销方" prop="oneUsercode">
<el-input v-model="form.oneUsercode" placeholder="请输入分销方" />
</el-form-item>
<el-form-item label="分销方" prop="onePhone">
<el-input v-model="form.onePhone" placeholder="请输入分销方" />
</el-form-item>
<el-form-item label="分销方提成比例" prop="oneRate">
<el-input v-model="form.oneRate" placeholder="请输入分销方提成比例" />
</el-form-item>
<el-form-item label="分销方积分" prop="onePoints">
<el-input v-model="form.onePoints" placeholder="请输入分销方积分" />
</el-form-item>
<el-form-item label="来源ID" prop="sourceId">
<el-input v-model="form.sourceId" placeholder="请输入来源ID" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listPointRecordLog, getPointRecordLog, delPointRecordLog, addPointRecordLog, updatePointRecordLog } from "@/api/cai/pointRecordLog";
import {listPointRecordLog} from "@/api/cai/pointRecordLog";
import {consumeLogCalculateStatusList, consumeLogStatusList, consumeLogTypeList} from "@/constant/statusMap";
export default {
name: "PointRecordLog",
data() {
return {
systemName: process.env.VUE_APP_SYSTEM_HOME,
consumeLogTypeList,consumeLogStatusList,consumeLogCalculateStatusList,
// 按钮loading
buttonLoading: false,
// 遮罩层
@@ -257,87 +103,23 @@ export default {
total: 0,
// 用户积分分销表格数据
pointRecordLogList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
userId: undefined,
points: undefined,
sourceUserId: undefined,
sourceUsercode: undefined,
sourcePhone: undefined,
oneUserId: undefined,
oneUsercode: undefined,
onePhone: undefined,
oneRate: undefined,
onePoints: undefined,
status: undefined,
sourceType: undefined,
sourceId: undefined,
},
// 表单参数
form: {},
// 表单校验
rules: {
id: [
{ required: true, message: "不能为空", trigger: "blur" }
],
userId: [
{ required: true, message: "用户不能为空", trigger: "blur" }
],
points: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
sourceUserId: [
{ required: true, message: "消费方用户不能为空", trigger: "blur" }
],
sourceUsercode: [
{ required: true, message: "消费方用户不能为空", trigger: "blur" }
],
sourcePhone: [
{ required: true, message: "消费方用户不能为空", trigger: "blur" }
],
oneUserId: [
{ required: true, message: "分销方不能为空", trigger: "blur" }
],
oneUsercode: [
{ required: true, message: "分销方不能为空", trigger: "blur" }
],
onePhone: [
{ required: true, message: "分销方不能为空", trigger: "blur" }
],
oneRate: [
{ required: true, message: "分销方提成比例不能为空", trigger: "blur" }
],
onePoints: [
{ required: true, message: "分销方积分不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态 -1-无须分销 0-待分销 1-已分销不能为空", trigger: "change" }
],
sourceType: [
{ required: true, message: "来源不能为空", trigger: "change" }
],
sourceId: [
{ required: true, message: "来源ID不能为空", trigger: "blur" }
],
remark: [
{ required: true, message: "备注不能为空", trigger: "blur" }
],
createTime: [
{ required: true, message: "创建时间不能为空", trigger: "blur" }
]
}
};
},
created() {
this.getList();
},
methods: {
joinColor(join){
return join ? 'font-blue' : 'font-red'
},
/** 查询用户积分分销列表 */
getList() {
this.loading = true;
@@ -347,33 +129,6 @@ export default {
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
id: undefined,
userId: undefined,
points: undefined,
sourceUserId: undefined,
sourceUsercode: undefined,
sourcePhone: undefined,
oneUserId: undefined,
oneUsercode: undefined,
onePhone: undefined,
oneRate: undefined,
onePoints: undefined,
status: undefined,
sourceType: undefined,
sourceId: undefined,
remark: undefined,
createTime: undefined
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
@@ -390,70 +145,17 @@ export default {
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加用户积分分销";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.loading = true;
this.reset();
const id = row.id || this.ids
getPointRecordLog(id).then(response => {
this.loading = false;
this.form = response.data;
this.open = true;
this.title = "修改用户积分分销";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
this.buttonLoading = true;
if (this.form.id != null) {
updatePointRecordLog(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
} else {
addPointRecordLog(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除用户积分分销编号为"' + ids + '"的数据项?').then(() => {
this.loading = true;
return delPointRecordLog(ids);
}).then(() => {
this.loading = false;
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {
}).finally(() => {
this.loading = false;
});
},
/** 导出按钮操作 */
handleExport() {
this.download('cai/pointRecordLog/export', {
...this.queryParams
}, `pointRecordLog_${new Date().getTime()}.xlsx`)
}
}
};
</script>
<style lang="scss" scoped>
.font-red {
color: red;
}
.font-green {
color: green;
}
.font-blue {
color: blue;
}
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="app-container">
<el-tabs v-model="activeTabs" @tab-click="handleClick">
<el-tab-pane label="奖品模板" name="prizeInfoTab">
<prize-info-tab business-type="prizeInfoTab" />
</el-tab-pane>
<el-tab-pane label="男用户奖品" name="prizeOnlineManTab">
<prize-online-man-tab business-type="prizeOnlineManTab" :gender="2" />
</el-tab-pane>
<el-tab-pane label="女用户奖品" name="pay">
<prize-online-man-tab business-type="prizeOnlineManTab" :gender="1" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import PrizeInfoTab from "@/views/cai/prizeInfo/prize-info-tab.vue";
import PrizeOnlineManTab from "@/views/cai/prizeInfo/prize-online-man-tab.vue";
export default {
name: "PrizeInfo",
components: {
PrizeInfoTab,
PrizeOnlineManTab,
},
data() {
return {
activeTabs: "prizeInfoTab",
};
},
created() {
},
methods: {
handleClick(tab, event){
console.log(tab, event);
},
}
};
</script>

View File

@@ -0,0 +1,156 @@
<template>
<el-dialog :title="title" :close-on-click-modal="false" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="奖品类型" prop="prizeType">
<el-select v-model="form.prizeType" size="small">
<el-option
v-for="dict in prizeTypeList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="奖品名称" prop="prizeName">
<el-input v-model="form.prizeName" placeholder="请输入奖品名称" />
</el-form-item>
<el-form-item label="奖品描述" prop="prizeDesc">
<el-input v-model="form.prizeDesc" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="奖品图片" prop="prizeImg">
<image-upload2 v-model="form.prizeImg"/>
</el-form-item>
<el-form-item label="中奖率" prop="winProbability">
<el-input-number v-model="form.winProbability" placeholder="请输入中奖率" min="0" max="1" />
</el-form-item>
<el-form-item label="保底抽数" prop="guaranteeDraws" v-if="form.prizeType == 3">
<el-input v-model="form.guaranteeDraws" placeholder="请输入保底抽数" />
</el-form-item>
<el-form-item label="最低中奖抽数" prop="minWinDraws" v-if="form.prizeType == 3" >
<el-input v-model="form.minWinDraws" placeholder="请输入最低中奖抽数" />
</el-form-item>
<el-form-item label="奖品价值" prop="prizePrice">
<el-input v-model="form.prizePrice" placeholder="请输入奖品价值估算" />
</el-form-item>
<el-form-item label="自动兑奖" prop="autoGive">
<el-select v-model="form.autoGive" size="small">
<el-option
v-for="dict in prizeAutoGiveList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="open = false"> </el-button>
</div>
</el-dialog>
</template>
<script>
import {prizeAutoGiveList, prizeTypeList} from '@/constant/statusMap'
import {addPrizeInfo, getPrizeInfo, updatePrizeInfo} from "@/api/cai/prizeInfo";
export default {
components: {
},
data () {
return {
prizeTypeList,prizeAutoGiveList,
open: false,
title: '',
form:{
id: undefined,
prizeName: undefined,
prizeDesc: undefined,
prizeImg: undefined,
winProbability: undefined,
guaranteeDraws: undefined,
minWinDraws: undefined,
prizeType: undefined,
prizePrice: undefined,
autoGive: undefined,
},
// 表单校验
rules: {
prizeName: [
{ required: true, message: "奖品名称不能为空", trigger: "blur" }
],
prizeDesc: [
{ required: true, message: "奖品描述不能为空", trigger: "blur" }
],
prizeImg: [
{ required: true, message: "奖品图片不能为空", trigger: "blur" }
],
winProbability: [
{ required: true, message: "中奖率不能为空", trigger: "blur" }
],
guaranteeDraws: [
{ required: true, message: "保底抽数不能为空", trigger: "blur" }
],
minWinDraws: [
{ required: true, message: "中奖抽数不能为空", trigger: "blur" }
],
prizeType: [
{ required: true, message: "奖品类型不能为空", trigger: "change" }
],
prizePrice: [
{ required: true, message: "奖品价值不能为空", trigger: "blur" }
],
autoGive: [
{ required: true, message: "自动兑奖不能为空", trigger: "blur" }
],
},
buttonLoading: false,
}
},
created() {
},
methods: {
init (id) {
this.form.id = id || undefined;
this.title = (id ? "修改" : "新增") + "奖品库";
this.open = true;
this.$nextTick(() => {
this.$refs['form'].resetFields();
if(this.form.id){
getPrizeInfo(id).then(response => {
this.form = response.data;
});
}
})
},
// 表单提交
submitForm () {
this.$refs['form'].validate((valid) => {
if (valid) {
this.buttonLoading = true;
if (this.form.id != null) {
updatePrizeInfo(this.form).then(data => {
this.$modal.msgSuccess("修改成功");
this.$modal.buttonLoading = false;
this.open = false
this.$emit('refreshDataList')
}).finally(() => {
this.buttonLoading = false;
});
}else{
addPrizeInfo(this.form).then(data => {
this.$modal.msgSuccess("新增成功");
this.buttonLoading = false;
this.open = false
this.$emit('refreshDataList')
}).finally(() => {
this.buttonLoading = false;
});
}
}
})
},
}
}
</script>

View File

@@ -0,0 +1,220 @@
<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="prizeName">
<el-input
v-model="queryParams.prizeName"
placeholder="请输入奖品名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="奖品描述" prop="prizeDesc">
<el-input
v-model="queryParams.prizeDesc"
placeholder="请输入奖品描述"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="奖品类型" prop="prizeType">
<el-select v-model="queryParams.prizeType" placeholder="奖品类型" clearable size="small">
<el-option
v-for="dict in prizeTypeList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
@keyup.enter.native="handleQuery"
/>
</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="['cai:prizeInfo:add']"
>新增</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="['cai:prizeInfo:remove']"
>删除</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="prizeInfoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="奖品类型" align="center" prop="prizeType" >
<template v-slot="scope">
<cai-dict-tag :options="prizeTypeList" :value="scope.row.prizeType" />
</template>
</el-table-column>
<el-table-column label="奖品名称" align="center" prop="prizeName" />
<el-table-column label="奖品描述" align="center" prop="prizeDesc" />
<el-table-column label="奖品图片" align="center" prop="prizeImg" >
<template v-slot="scope">
<image-avatar :src="scope.row.prizeImg"/>
</template>
</el-table-column>
<el-table-column label="中奖率" align="center" prop="winProbability" />
<el-table-column label="保底抽数" align="center" prop="guaranteeDraws" />
<el-table-column label="最低抽数" align="center" prop="minWinDraws" />
<el-table-column label="奖品价值" align="center" prop="prizePrice" />
<el-table-column label="自动兑奖" align="center" prop="autoGive" >
<template v-slot="scope">
<cai-dict-tag :options="prizeAutoGiveList" :value="scope.row.autoGive" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
v-if="scope.row.id != 1"
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['cai:prizeInfo:edit']"
>修改</el-button>
<el-button
v-if="scope.row.id != 1"
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['cai:prizeInfo: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"
/>
<prize-info-add-update-dialog v-if="prizeInfoAddUpdateDialogVisible" ref="prizeInfoAddUpdateDialog" @refreshDataList="getList" />
</div>
</template>
<script>
import {delPrizeInfo, listPrizeInfo} from "@/api/cai/prizeInfo";
import {prizeAutoGiveList, prizeTypeList} from "@/constant/statusMap";
import PrizeInfoAddUpdateDialog from "@/views/cai/prizeInfo/prize-info-add-update-dialog.vue";
export default {
name: "PrizeInfo",
components: {
PrizeInfoAddUpdateDialog,
},
data() {
return {
prizeTypeList, prizeAutoGiveList,
prizeInfoAddUpdateDialogVisible: false,
// 按钮loading
buttonLoading: false,
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 抽奖奖品表格数据
prizeInfoList: [],
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
prizeName: undefined,
prizeDesc: undefined,
prizeType: undefined,
},
};
},
created() {
this.getList();
},
methods: {
/** 查询抽奖奖品列表 */
getList() {
this.loading = true;
listPrizeInfo(this.queryParams).then(response => {
this.prizeInfoList = response.rows;
this.total = response.total;
this.loading = false;
});
},
/** 搜索按钮操作 */
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.prizeInfoAddUpdateDialogVisible = true
this.$nextTick(() => {
this.$refs.prizeInfoAddUpdateDialog.init()
})
},
/** 修改按钮操作 */
handleUpdate(row) {
this.prizeInfoAddUpdateDialogVisible = true
this.$nextTick(() => {
this.$refs.prizeInfoAddUpdateDialog.init(row.id)
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除抽奖奖品编号为"' + ids + '"的数据项?').then(() => {
this.loading = true;
return delPrizeInfo(ids);
}).then(() => {
this.loading = false;
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {
}).finally(() => {
this.loading = false;
});
},
}
};
</script>

View File

@@ -0,0 +1,131 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<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="handleReset"
v-hasPermi="['cai:prizeOnline:add']"
>调整</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="prizeOnlineList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="奖品类型" align="center" prop="prizeType" >
<template v-slot="scope">
<cai-dict-tag :options="prizeTypeList" :value="scope.row.prizeType" />
</template>
</el-table-column>
<el-table-column label="奖品名称" align="center" prop="prizeName" />
<el-table-column label="奖品描述" align="center" prop="prizeDesc" />
<el-table-column label="奖品图片" align="center" prop="prizeImg" >
<template v-slot="scope">
<image-avatar :src="scope.row.prizeImg"/>
</template>
</el-table-column>
<el-table-column label="中奖率" align="center" prop="winProbability" />
<el-table-column label="保底抽数" align="center" prop="guaranteeDraws" />
<el-table-column label="最低抽数" align="center" prop="minWinDraws" />
<el-table-column label="奖品价值" align="center" prop="prizePrice" />
<el-table-column label="自动兑奖" align="center" prop="autoGive" >
<template v-slot="scope">
<cai-dict-tag :options="prizeAutoGiveList" :value="scope.row.autoGive" />
</template>
</el-table-column>
</el-table>
<prize-online-reset-dialog v-if="prizeOnlineResetDialogVisible" ref="prizeOnlineResetDialog" @refreshDataList="getList" :gender="this.gender"/>
</div>
</template>
<script>
import {listPrizeOnline} from "@/api/cai/prizeOnline";
import {prizeAutoGiveList, prizeTypeList} from "@/constant/statusMap";
import PrizeOnlineResetDialog from "@/views/cai/prizeInfo/prize-online-reset-dialog.vue";
export default {
props: {
gender: {
type: Number, // 参数类型
required: true // 是否必传
},
},
name: "PrizeOnline",
components: {
PrizeOnlineResetDialog
},
data() {
return {
prizeTypeList, prizeAutoGiveList,
// 按钮loading
buttonLoading: false,
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 已发布奖品表格数据
prizeOnlineList: [],
// 查询参数
queryParams: {
gender: this.gender
},
prizeOnlineResetDialogVisible: false
};
},
created() {
this.getList();
},
methods: {
/** 查询已发布奖品列表 */
getList() {
this.loading = true;
listPrizeOnline(this.queryParams).then(response => {
this.prizeOnlineList = response.data;
this.loading = false;
});
},
/** 搜索按钮操作 */
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
},
handleReset() {
this.prizeOnlineResetDialogVisible = true
this.$nextTick(() => {
this.$refs.prizeOnlineResetDialog.init()
})
},
}
};
</script>

View File

@@ -0,0 +1,312 @@
<template>
<div class="app-container">
<el-dialog title="调整奖品" :close-on-click-modal="false" :visible.sync="open" width="1000px" append-to-body>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="prizeOnlineList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="奖品类型" align="center" prop="prizeType" >
<template v-slot="scope">
<cai-dict-tag :options="prizeTypeList" :value="scope.row.prizeType" />
</template>
</el-table-column>
<el-table-column label="奖品名称" align="center" prop="prizeName" />
<el-table-column label="奖品描述" align="center" prop="prizeDesc" />
<el-table-column label="奖品图片" align="center" prop="prizeImg" >
<template v-slot="scope">
<image-avatar :src="scope.row.prizeImg"/>
</template>
</el-table-column>
<el-table-column label="中奖率" align="center" prop="winProbability" />
<el-table-column label="保底抽数" align="center" prop="guaranteeDraws" />
<el-table-column label="最低抽数" align="center" prop="minWinDraws" />
<el-table-column label="奖品价值" align="center" prop="prizePrice" />
<el-table-column label="自动兑奖" align="center" prop="autoGive" >
<template v-slot="scope">
<cai-dict-tag :options="prizeAutoGiveList" :value="scope.row.autoGive" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
v-if="scope.row.prizeId != 1"
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['cai:prizeInfo:edit']"
>修改</el-button>
<el-button
v-if="scope.row.prizeId != 1"
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['cai:prizeInfo:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="open = false"> </el-button>
</div>
</el-dialog>
<el-dialog title="新增奖品" :close-on-click-modal="false" :visible.sync="addOpen" width="700px" append-to-body>
<el-form ref="addForm" :model="addForm" label-width="80px" >
<el-form-item label="奖品模板" prop="prizeInfoTemplate">
<el-select v-model="addForm.prizeInfoTemplate" size="small">
<el-option
v-for="dict in prizeInfoSelectList"
:key="dict.id"
:label="dict.prizeName"
:value="dict.id"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="addSubmitForm"> </el-button>
<el-button @click="addOpen = false"> </el-button>
</div>
</el-dialog>
<el-dialog title="修改奖品" :close-on-click-modal="false" :visible.sync="updateOpen" width="700px" append-to-body>
<el-form ref="updateForm" :model="updateForm" :rules="updateRules" label-width="80px">
<el-form-item label="奖品类型" prop="prizeType">
<el-select v-model="updateForm.prizeType" size="small">
<el-option
v-for="dict in prizeTypeList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="奖品名称" prop="prizeName">
<el-input v-model="updateForm.prizeName" placeholder="请输入奖品名称" />
</el-form-item>
<el-form-item label="奖品描述" prop="prizeDesc">
<el-input v-model="updateForm.prizeDesc" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="奖品图片" prop="prizeImg">
<image-upload2 v-model="updateForm.prizeImg"/>
</el-form-item>
<el-form-item label="中奖率" prop="winProbability">
<el-input-number v-model="updateForm.winProbability" placeholder="请输入中奖率" min="0" max="1" />
</el-form-item>
<el-form-item label="保底抽数" prop="guaranteeDraws" v-if="updateForm.prizeType == 3">
<el-input v-model="updateForm.guaranteeDraws" placeholder="请输入保底抽数" />
</el-form-item>
<el-form-item label="最低中奖抽数" prop="minWinDraws" v-if="updateForm.prizeType == 3" >
<el-input v-model="updateForm.minWinDraws" placeholder="请输入最低中奖抽数" />
</el-form-item>
<el-form-item label="奖品价值" prop="prizePrice">
<el-input v-model="updateForm.prizePrice" placeholder="请输入奖品价值估算" />
</el-form-item>
<el-form-item label="自动兑奖" prop="autoGive">
<el-select v-model="updateForm.autoGive" size="small">
<el-option
v-for="dict in prizeAutoGiveList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<!-- <el-button :loading="buttonLoading" type="primary" @click="updateSubmitForm"> </el-button>-->
<el-button @click="updateOpen = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {listPrizeOnline, resetPrizeOnline} from "@/api/cai/prizeOnline";
import {prizeAutoGiveList, prizeTypeList} from "@/constant/statusMap";
import {prizeInfoAll} from "@/api/cai/prizeInfo";
export default {
props: {
gender: {
type: Number, // 参数类型
required: true // 是否必传
},
},
name: "PrizeOnline",
data() {
return {
prizeTypeList, prizeAutoGiveList,
// 按钮loading
buttonLoading: false,
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 已发布奖品表格数据
prizeOnlineList: [],
// 查询参数
queryParams: {
gender: this.gender
},
open: false,
// add
addOpen: false,
addForm:{
prizeInfoTemplate: undefined
},
prizeInfoSelectList: [],
// update
updateOpen: false,
updateForm: {},
updateRules: {
prizeName: [
{ required: true, message: "奖品名称不能为空", trigger: "blur" }
],
prizeDesc: [
{ required: true, message: "奖品描述不能为空", trigger: "blur" }
],
prizeImg: [
{ required: true, message: "奖品图片不能为空", trigger: "blur" }
],
winProbability: [
{ required: true, message: "中奖率不能为空", trigger: "blur" }
],
guaranteeDraws: [
{ required: true, message: "保底抽数不能为空", trigger: "blur" }
],
minWinDraws: [
{ required: true, message: "中奖抽数不能为空", trigger: "blur" }
],
prizeType: [
{ required: true, message: "奖品类型不能为空", trigger: "change" }
],
prizePrice: [
{ required: true, message: "奖品价值不能为空", trigger: "blur" }
],
autoGive: [
{ required: true, message: "自动兑奖不能为空", trigger: "blur" }
],
},
};
},
created() {
},
methods: {
init (id) {
this.open = true;
this.$nextTick(() => {
this.getList();
})
},
/** 查询已发布奖品列表 */
getList() {
this.loading = true;
listPrizeOnline(this.queryParams).then(response => {
this.prizeOnlineList = response.data;
this.prizeOnlineList.forEach(item => {
item.uuid = item.id;
})
this.loading = false;
});
},
/** 搜索按钮操作 */
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.addOpen = true;
this.$nextTick(() => {
this.$refs['addForm'].resetFields();
this.refreshPrizeInfoAll();
})
},
handleUpdate(row){
this.updateOpen = true;
this.$nextTick(() => {
this.updateForm = row;
})
},
handleDelete(row){
// 找到目标项的索引
const index = this.prizeOnlineList.findIndex(item => item.uuid === row.uuid);
// 只有找到索引index !== -1时才执行删除
if (index !== -1) {
// splice(起始索引, 删除数量),返回被删除的项
return this.prizeOnlineList.splice(index, 1);
}
},
refreshPrizeInfoAll(){
prizeInfoAll().then(response => {
this.prizeInfoSelectList = response.data;
})
},
addSubmitForm(){
let find = this.prizeInfoSelectList.find(item => item.id === this.addForm.prizeInfoTemplate);
if(find){
const newObj = Object.assign({}, find);
newObj.uuid = this.generateUUID()
newObj.prizeId = newObj.id
newObj.id = undefined
this.prizeOnlineList.push(newObj);
}
},
submitForm() {
resetPrizeOnline(this.gender,this.prizeOnlineList).then(response => {
this.$modal.msgSuccess("调整成功");
this.$modal.buttonLoading = false;
this.open = false
this.$emit('refreshDataList')
}).finally(() => {
this.buttonLoading = false;
})
},
generateUUID() {
// UUID v4 的格式为xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
// 其中 4 是版本号固定位y 只能是 8/9/a/b 中的一个
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0; // 生成 0-15 的随机数
const v = c === 'x' ? r : (r & 0x3 | 0x8); // 处理 y 位的规则
return v.toString(16); // 转换为 16 进制字符串
});
},
}
};
</script>

View File

@@ -92,6 +92,7 @@
<el-table-column label="商品名称" align="center" prop="rechargeName" />
<el-table-column label="充值紫贝" align="center" prop="rechargeCoin" />
<el-table-column label="价格" align="center" prop="price" />
<el-table-column label="积分" align="center" prop="givePoint" />
<el-table-column label="平台" align="center" prop="platformType">
<template v-slot="scope">
<cai-dict-tag :options="platformTypeList" :value="scope.row.platformType" />

View File

@@ -165,7 +165,7 @@
<el-tag v-if="!scope.row.enableIm && !scope.row.imSpeck" :disable-transitions="true" type="danger">封禁+禁言</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120" fixed="right">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140" fixed="right">
<template v-slot="scope">
<el-button
size="mini"

View File

@@ -80,6 +80,7 @@
<el-table-column label="好友礼物分成" align="center" prop="giftIncomeRate" />
<el-table-column label="好友视频分成" align="center" prop="videoIncomeRate" />
<el-table-column label="好友充值分成" align="center" prop="payIncomeRate" />
<el-table-column label="好友积分充值分成" align="center" prop="pointRate" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template v-slot="scope">
<el-button

View File

@@ -16,6 +16,9 @@
<el-form-item label="好友充值分成" prop="payIncomeRate">
<el-input-number v-model="form.payIncomeRate" :precision="2" :step="0.01" :min="0" :max="0.6" style="width: 90%"/>
</el-form-item>
<el-form-item label="好友积分充值分成" prop="pointRate">
<el-input-number v-model="form.pointRate" :precision="2" :step="0.01" :min="0" :max="0.6" style="width: 90%"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
@@ -44,9 +47,13 @@ export default {
giftIncomeRate: undefined,
videoIncomeRate: undefined,
payIncomeRate: undefined,
pointRate: undefined,
},
// 表单校验
rules: {
pointRate: [
{ required: true, message: "数据不能为空", trigger: "blur" }
],
guardIncomeRate: [
{ required: true, message: "数据不能为空", trigger: "blur" }
],