临时提交

This commit is contained in:
磷叶 2025-05-30 11:59:14 +08:00
parent 1091ef94e3
commit ba3e032f72
12 changed files with 103 additions and 50 deletions

View File

@ -75,6 +75,12 @@
overflow: hidden !important; overflow: hidden !important;
text-overflow: ellipsis !important; text-overflow: ellipsis !important;
white-space: nowrap !important; white-space: nowrap !important;
border-right: 3px solid transparent !important;
}
.el-menu-item.is-active {
background-color: $base-menu-background-active !important;
border-right: 3px solid $base-menu-background-active-border !important;
} }
// menu hover // menu hover
@ -84,7 +90,7 @@
line-height: $base-sidbar-height !important; line-height: $base-sidbar-height !important;
&:hover { &:hover {
background-color: rgba(0, 0, 0, 0.06) !important; background-color: $base-menu-background-active !important;
} }
} }
@ -99,7 +105,7 @@
line-height: $base-sidbar-height !important; line-height: $base-sidbar-height !important;
&:hover { &:hover {
background-color: rgba(0, 0, 0, 0.06) !important; background-color: $base-menu-background-active !important;
} }
} }

View File

@ -11,6 +11,8 @@ $panGreen: #30B08F;
// 默认菜单主题风格 // 默认菜单主题风格
$base-menu-color:#bfcbd9; $base-menu-color:#bfcbd9;
$base-menu-color-active:#f4f4f5; $base-menu-color-active:#f4f4f5;
$base-menu-background-active:#e5f0ff;
$base-menu-background-active-border:#829dff;
$base-menu-background:#304156; $base-menu-background:#304156;
$base-logo-title-color: #ffffff; $base-logo-title-color: #ffffff;

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="avatar-wrapper" :style="{backgroundColor: backgroundColor}"> <div class="avatar-wrapper" :style="{backgroundColor: isEmpty(src) ? backgroundColor : ''}">
<el-avatar :size="size" :src="src" v-if="src"/> <el-avatar :size="size" :src="src" v-if="src"/>
<el-avatar :size="size" v-else :style="{fontSize: fontSize}"> <el-avatar :size="size" v-else :style="{fontSize: fontSize}">
{{ displayChar }} {{ displayChar }}
@ -8,6 +8,7 @@
</template> </template>
<script> <script>
import { isEmpty } from '@/utils/index.js';
export default { export default {
name: 'Avatar', name: 'Avatar',
props: { props: {
@ -63,6 +64,9 @@ export default {
return colors[index] return colors[index]
} }
}, },
methods: {
isEmpty,
}
} }
</script> </script>

View File

@ -66,9 +66,6 @@
<!-- 上传提示 --> <!-- 上传提示 -->
<div class="el-upload__tip" slot="tip" v-if="showTip"> <div class="el-upload__tip" slot="tip" v-if="showTip">
<div style="color: #909399; margin-bottom: 8px;">
建议尺寸700×286
</div>
请上传 请上传
<template v-if="fileSize">大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b></template> <template v-if="fileSize">大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b></template>
<template v-if="fileType">格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b></template> <template v-if="fileType">格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b></template>
@ -91,10 +88,10 @@
</template> </template>
<script> <script>
import { getToken } from '@/utils/auth' import { getQiniuToken } from '@/api/common';
import { getQiniuToken } from '@/api/common' import { getExt, getFileIcon, getFileNameWithTime, getRealUrl, isImage, isVideo } from '@/utils';
import axios from 'axios' import { getToken } from '@/utils/auth';
import { getRealUrl, getFileIcon, getExt, isImage, getFileNameWithTime, isVideo } from '@/utils' import axios from 'axios';
export default { export default {
props: { props: {
@ -493,6 +490,9 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.el-upload__tip {
line-height: 2em;
}
/* 上传区域基础样式 */ /* 上传区域基础样式 */
::v-deep .el-upload { ::v-deep .el-upload {
display: flex; display: flex;

View File

@ -217,9 +217,8 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="广告图片" prop="picture"> <el-form-item label="广告图片" prop="picture">
<div class="upload-wrapper">
<image-upload v-model="form.picture" :limit="1"/> <image-upload v-model="form.picture" :limit="1"/>
</div> 建议尺寸 700x286
</el-form-item> </el-form-item>
<el-form-item label="广告状态" prop="status"> <el-form-item label="广告状态" prop="status">
<template> <template>
@ -253,14 +252,13 @@
</template> </template>
<script> <script>
import { listAd, getAd, delAd, addAd, updateAd } from "@/api/bst/ad"; import { addAd, delAd, getAd, handleAudit, listAd, updateAd } from "@/api/bst/ad";
import { $showColumns } from '@/utils/mixins'; import { enableDevice } from "@/api/bst/device";
import FormCol from "@/components/FormCol/index.vue"; import AreaRemoteSelect from "@/components/Business/Area/AreaRemoteSelect.vue";
import AreaRemoteSelect from "@/components/Business/Area/AreaRemoteSelect.vue"; import FormCol from "@/components/FormCol/index.vue";
import {isSysAdmin} from "@/utils/permission"; import { AdStatus } from "@/utils/enums";
import {handleAudit} from "@/api/bst/ad"; import { $showColumns } from '@/utils/mixins';
import {AdStatus} from "@/utils/enums"; import { isSysAdmin } from "@/utils/permission";
import {enableDevice} from "@/api/bst/device";
// //
const defaultSort = { const defaultSort = {

View File

@ -202,7 +202,7 @@ export default {
{key: 'refundAmount', visible: true, label: '已退款', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, {key: 'refundAmount', visible: true, label: '已退款', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'prePayTime', visible: true, label: '预计分成', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"}, {key: 'prePayTime', visible: true, label: '预计分成', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"},
{key: 'payTime', visible: true, label: '实际分成', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"}, {key: 'payTime', visible: true, label: '实际分成', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"},
{key: 'toBalance', visible: false, label: '余额变动', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, {key: 'toBalance', visible: true, label: '余额变动', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'createTime', visible: true, label: '创建时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"}, {key: 'createTime', visible: true, label: '创建时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
], ],
// //

View File

@ -8,6 +8,9 @@
<form-col :span="span" label="渠道名称" prop="name"> <form-col :span="span" label="渠道名称" prop="name">
<el-input v-model="form.name" placeholder="请输入渠道名称"/> <el-input v-model="form.name" placeholder="请输入渠道名称"/>
</form-col> </form-col>
<form-col :span="span" label="对外名称" prop="outName">
<el-input v-model="form.outName" placeholder="请输入对外名称"/>
</form-col>
<form-col :span="span" label="类型" prop="type"> <form-col :span="span" label="类型" prop="type">
<el-select v-model="form.type" placeholder="请选择类型" style="width: 100%;"> <el-select v-model="form.type" placeholder="请选择类型" style="width: 100%;">
<el-option v-for="item in dict.type.channel_type" :key="item.value" :label="item.label" :value="item.value"/> <el-option v-for="item in dict.type.channel_type" :key="item.value" :label="item.label" :value="item.value"/>
@ -26,6 +29,13 @@
<form-col :span="24" label="绑定APP" prop="appIds" tip="有哪些APP可以使用该渠道" label-width="7em"> <form-col :span="24" label="绑定APP" prop="appIds" tip="有哪些APP可以使用该渠道" label-width="7em">
<app-select v-model="form.appIds" multiple/> <app-select v-model="form.appIds" multiple/>
</form-col> </form-col>
<form-col :span="24" label="可用业务" prop="bstTypes" tip="有哪些业务可以使用该渠道" label-width="7em">
<el-checkbox-group v-model="form.bstTypes" placeholder="请选择业务类型" style="width: 100%;">
<el-checkbox v-for="item in dict.type.channel_bst_type" :key="item.value" :label="item.value">
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</form-col>
</el-row> </el-row>
<div class="api-config-title">API配置</div> <div class="api-config-title">API配置</div>
<el-row> <el-row>
@ -96,13 +106,13 @@
</template> </template>
<script> <script>
import { updateChannel, addChannel, getChannel } from "@/api/bst/channel"; import { addChannel, getChannel, updateChannel } from "@/api/bst/channel";
import { ChannelType, ChannelApiType } from "@/utils/enums"; import AppSelect from '@/components/Business/App/AppSelect.vue';
import AppSelect from '@/components/Business/App/AppSelect.vue' import { ChannelApiType, ChannelType } from "@/utils/enums";
export default { export default {
name: "ChannelEditDialog", name: "ChannelEditDialog",
dicts: ['channel_api_type', 'channel_type'], dicts: ['channel_api_type', 'channel_type', 'channel_bst_type'],
components: { AppSelect }, components: { AppSelect },
props: { props: {
show: { show: {
@ -182,6 +192,7 @@ export default {
serviceRate: null, serviceRate: null,
costRate: null, costRate: null,
appIds: [], appIds: [],
bstTypes: [],
type: ChannelType.CUSTOM, type: ChannelType.CUSTOM,
channelConfig: {} channelConfig: {}
}; };

View File

@ -41,26 +41,26 @@
<el-table v-loading="loading" :data="channelList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="channelList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="channelId" width="80"/> <el-table-column label="ID" align="center" prop="channelId" width="80"/>
<el-table-column label="图片" align="center" prop="picture" width="80"> <el-table-column label="渠道" align="left" prop="name" width="300">
<image-preview slot-scope="d" :src="d.row.picture" :width="32" :height="32"/>
</el-table-column>
<el-table-column label="渠道名称" align="center" prop="name"/>
<el-table-column label="类型" align="center" prop="type">
<template slot-scope="d"> <template slot-scope="d">
<dict-tag :value="d.row.type" :options="dict.type.channel_type"/> <avatar :src="d.row.picture" :size="24" :name="d.row.name" :char-index="-1" style="margin-right:4px"/>
{{ d.row.name | dv }}
<dict-tag :value="d.row.type" :options="dict.type.channel_type" size="mini" style="margin-left:4px"/>
<dict-tag :value="d.row.apiType" :options="dict.type.channel_api_type" size="mini" style="margin-left:4px"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="是否启用" align="center" prop="enabled"> <el-table-column label="启用" align="center" prop="enabled">
<template slot-scope="d"> <template slot-scope="d">
<el-switch v-model="d.row.enabled" @change="(nv) => {onChangeEnabled(d.row, nv)}"/> <el-switch v-model="d.row.enabled" @change="(nv) => {onChangeEnabled(d.row, nv)}"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="API类型" align="center" prop="apiType"> <el-table-column label="对外名称" align="center" prop="outName"/>
<el-table-column label="可用业务" align="center" prop="bstTypes" width="300">
<template slot-scope="d"> <template slot-scope="d">
<dict-tag :value="d.row.apiType" :options="dict.type.channel_api_type"/> <dict-tag :value="d.row.bstTypes" :options="dict.type.channel_bst_type" size="mini" style="margin-left:4px"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="渠道成本" align="center" prop="costRate"> <el-table-column label="成本" align="center" prop="costRate">
<template slot-scope="d">{{d.row.costRate | fix2}} %</template> <template slot-scope="d">{{d.row.costRate | fix2}} %</template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime"/> <el-table-column label="创建时间" align="center" prop="createTime"/>
@ -95,13 +95,14 @@
</template> </template>
<script> <script>
import { listChannel, delChannel, addChannel, updateChannel } from "@/api/bst/channel"; import { addChannel, delChannel, listChannel, updateChannel } from "@/api/bst/channel";
import ChannelEditDialog from '@/views/bst/channel/components/ChannelEditDialog.vue' import Avatar from '@/components/Avatar/index.vue';
import ChannelEditDialog from '@/views/bst/channel/components/ChannelEditDialog.vue';
export default { export default {
name: "Channel", name: "Channel",
dicts: ['channel_api_type', 'channel_type'], dicts: ['channel_api_type', 'channel_type', 'channel_bst_type'],
components: { ChannelEditDialog }, components: { ChannelEditDialog, Avatar },
data() { data() {
return { return {
row: {}, row: {},

View File

@ -9,6 +9,9 @@
> >
<el-form ref="form" :model="form" :rules="rules" label-width="80px" v-loading="loading"> <el-form ref="form" :model="form" :rules="rules" label-width="80px" v-loading="loading">
<el-row> <el-row>
<form-col :span="span" label="LOGO" prop="logo">
<image-upload v-model="form.logo" :limit="1" />
</form-col>
<form-col :span="span" label="名称" prop="name"> <form-col :span="span" label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称" /> <el-input v-model="form.name" placeholder="请输入名称" />
</form-col> </form-col>
@ -45,7 +48,6 @@ import AreaRemoteSelect from "@/components/Business/Area/AreaRemoteSelect.vue";
import FormCol from "@/components/FormCol/index.vue"; import FormCol from "@/components/FormCol/index.vue";
import { CreditStatus } from "@/utils/enums"; import { CreditStatus } from "@/utils/enums";
export default { export default {
name: 'CreditEditDialog', name: 'CreditEditDialog',
components: { FormCol, AreaRemoteSelect }, components: { FormCol, AreaRemoteSelect },

View File

@ -34,7 +34,7 @@
<el-form-item label="业务类型" prop="bstType"> <el-form-item label="业务类型" prop="bstType">
<el-select v-model="queryParams.bstType" placeholder="请选择业务类型" clearable @change="handleQuery"> <el-select v-model="queryParams.bstType" placeholder="请选择业务类型" clearable @change="handleQuery">
<el-option <el-option
v-for="dict in dict.type.credit_pay_bst_type" v-for="dict in dict.type.pay_bst_type"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value" :value="dict.value"
@ -99,7 +99,7 @@
</template> </template>
<template v-else-if="column.key === 'description'"> <template v-else-if="column.key === 'description'">
{{ d.row.description | dv }} {{ d.row.description | dv }}
<dict-tag :options="dict.type.credit_pay_bst_type" :value="d.row.bstType" size="mini" style="margin-left: 4px;"/> <dict-tag :options="dict.type.pay_bst_type" :value="d.row.bstType" size="mini" style="margin-left: 4px;"/>
<dict-tag :options="dict.type.credit_pay_status" :value="d.row.status" size="mini" style="margin-left: 4px;"/> <dict-tag :options="dict.type.credit_pay_status" :value="d.row.status" size="mini" style="margin-left: 4px;"/>
</template> </template>
<template v-else-if="['amount', 'refundAmount', 'paymentAmount'].includes(column.key)"> <template v-else-if="['amount', 'refundAmount', 'paymentAmount'].includes(column.key)">
@ -155,7 +155,7 @@
<form-col :span="span" label="业务类型" prop="bstType"> <form-col :span="span" label="业务类型" prop="bstType">
<el-select v-model="form.bstType" placeholder="请选择业务类型"> <el-select v-model="form.bstType" placeholder="请选择业务类型">
<el-option <el-option
v-for="dict in dict.type.credit_pay_bst_type" v-for="dict in dict.type.pay_bst_type"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value" :value="dict.value"
@ -200,7 +200,7 @@ const defaultSort = {
export default { export default {
name: "CreditPay", name: "CreditPay",
mixins: [$showColumns], mixins: [$showColumns],
dicts: ['credit_pay_status', 'credit_pay_bst_type'], dicts: ['credit_pay_status', 'pay_bst_type'],
components: {FormCol, CreditRemoteSelect, AreaRemoteSelect}, components: {FormCol, CreditRemoteSelect, AreaRemoteSelect},
data() { data() {
return { return {

View File

@ -164,7 +164,24 @@
<div> <div>
<el-row :gutter="8"> <el-row :gutter="8">
<el-col :span="12" v-if="d.row.ridingFee != null">骑行{{d.row.ridingFee | fix2 | dv}} </el-col> <el-col :span="12" v-if="d.row.ridingFee != null">骑行{{d.row.ridingFee | fix2 | dv}} </el-col>
<el-col :span="12" v-if="d.row.depositFee != null">押金{{d.row.depositFee | fix2 | dv}} </el-col> <el-col :span="12" v-if="d.row.depositFee != null">
<el-popover
placement="bottom"
width="200"
trigger="hover"
>
<div>
<div v-if="d.row.creditName">挂账方{{d.row.creditName | fix2 | dv}} </div>
<div v-if="d.row.creditUserName">挂账人{{d.row.creditUserName | fix2 | dv}} </div>
<div>押金{{d.row.depositFee | fix2 | dv}} </div>
</div>
<div slot="reference">
押金{{d.row.depositFee | fix2 | dv}}
<el-tag v-if="d.row.isCredit" type="success" size="mini">挂账</el-tag>
<i class="el-icon-info" v-else />
</div>
</el-popover>
</el-col>
<el-col :span="12" v-if="d.row.totalFee != null"> <el-col :span="12" v-if="d.row.totalFee != null">
<el-popover <el-popover
placement="bottom" placement="bottom"

View File

@ -12,11 +12,23 @@
</el-statistic> </el-statistic>
</el-col> </el-col>
<el-col> <el-col>
<el-statistic title="押金" :value="detail.depositFee" :precision="2" suffix="元"> <el-popover placement="bottom" width="200" trigger="hover">
<template slot="prefix"> <div>
<i class="el-icon-money" style="color: #67C23A"></i> <div v-if="detail.creditName">挂账方{{detail.creditName | fix2 | dv}} </div>
</template> <div v-if="detail.creditUserName">挂账人{{detail.creditUserName | fix2 | dv}} </div>
</el-statistic> <div>押金{{detail.depositFee | fix2 | dv}} </div>
</div>
<el-statistic slot="reference" title="押金" :value="detail.depositFee" :precision="2" suffix="元">
<template slot="prefix">
<i class="el-icon-money" style="color: #67C23A"></i>
</template>
<template slot="title">
押金
<el-tag v-if="detail.isCredit" type="success" size="mini">挂账</el-tag>
<i class="el-icon-info" v-else />
</template>
</el-statistic>
</el-popover>
</el-col> </el-col>
<el-col v-if="detail.ridePayAmount"> <el-col v-if="detail.ridePayAmount">
<el-statistic title="结算支付" :value="detail.ridePayAmount" :precision="2" suffix="元"> <el-statistic title="结算支付" :value="detail.ridePayAmount" :precision="2" suffix="元">