Initial commit: 小众厨房项目代码

Co-authored-by: Cursor <cursoragent@cursor.com>
这个提交包含在:
可乐加冰
2026-09-23 17:04:10 +08:00
当前提交 f7d3d7d1bd
共有 1761 个文件被更改,包括 453668 次插入 和 0 次删除

查看文件

@@ -0,0 +1,442 @@
<link rel="stylesheet" href="__CDN__/assets/addons/shopro/libs/element/element.css">
<link rel="stylesheet" href="__CDN__/assets/addons/shopro/libs/common.css">
<style>
#userWalletApply {
padding-bottom: 30px;
background: #fff;
border-radius: 10px 10px 0px 0px;
}
.custom-tabs-wrap {
padding: 12px 24px 0;
border-bottom: 2px solid #e6e6e6;
margin-bottom: 20px;
position: relative;
}
.custom-tabs-wrap .el-tabs__header {
margin: 0;
}
.custom-tabs-wrap .tabs-export {
position: absolute;
top: 24px;
right: 24px;
color: #7438D5;
cursor: pointer;
}
.custom-tabs-wrap .tabs-export i {
margin-right: 6px;
}
.custom-refresh-button {
margin-right: 14px;
}
.custom-filter-wrap .custom-refresh-button {
margin-bottom: 14px;
}
.custom-filter-wrap {
flex-wrap: wrap;
padding: 0 24px;
}
.custom-filter-wrap .custom-filter-item {
margin-bottom: 14px;
margin-right: 24px;
}
.custom-filter-wrap .custom-filter-button-wrap {
margin-bottom: 14px;
}
.custom-filter-wrap .custom-filter-label {
flex-shrink: 0;
margin-right: 14px;
font-size: 12px;
color: #666;
}
.custom-filter-wrap .custom-filter-content-input {
width: 104px;
}
.custom-table-wrap {
margin: 0 24px;
}
.custom-margin-14 {
margin-right: 14px !important;
}
.custom-table-operation-text {
margin-right: 14px;
cursor: pointer;
}
.custom-table-operation-text:last-child {
margin-right: 0;
}
.custom-table-image {
width: 32px;
height: 32px;
border-radius: 50%;
border: 1px solid #E6E6E6;
margin-right: 8px;
flex-shrink: 0;
overflow: hidden;
}
.custom-table-color-primary {
color: #6E3DC8;
}
.custom-table-color-success {
color: #70C140;
}
.custom-table-color-error {
color: #ED5B56;
}
.custom-table-color-warning {
color: #EFAF41;
}
.custom-table-color-info {
color: #999999;
}
.pagination-container-b {
justify-content: space-between;
}
.table-checked-all {
margin-right: 12px !important;
}
.get-type-iamge {
width: 26px;
height: 26px;
margin-right: 8px;
border-radius: none;
border: none;
}
.refuse-dialog.el-dialog {
width: 474px !important;
}
.refuse-dialog.el-dialog .el-dialog__body {
padding: 10px 20px 0;
}
.refuse-dialog.el-dialog .el-dialog__title {
font-size: 18px !important;
color: #444;
}
.agree-dialog.el-dialog .el-dialog__body {
display: none;
}
.el-date-editor.el-input,
.el-date-editor.el-input__inner {
width: 350px;
}
.el-range-editor--small .el-range-separator {
line-height: 25px;
}
.el-date-editor .el-range-separator {
width: 7%;
}
.table-popover-jump {
cursor: pointer;
color: #7438D5;
}
.log-dialog.el-dialog {
width: fit-content !important;
}
.custom-table-checkbox .el-table__header .el-table_1_column_1.el-table-column--selection .el-checkbox {
display: none;
}
.custom-copy-message {
margin-left: 14px;
cursor: pointer;
}
.custom-copy-message:hover {
color: #7438D5;
}
</style>
<script src="__CDN__/assets/addons/shopro/libs/vue.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/element/element.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/moment.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/clipboard.min.js"></script>
<div id="userWalletApply" v-cloak>
<div class="custom-tabs-wrap">
<el-tabs v-model="searchForm.status" @tab-click="changeApplyStatus">
<el-tab-pane v-for="w in filterRule.status" :label="w.name" :name="w.type+''">
</el-tab-pane>
</el-tabs>
<div class="tabs-export" @click="exportApply">
<i class="el-icon-download"></i>
列表导出
</div>
</div>
<div class="custom-filter-wrap display-flex">
<div class="custom-refresh display-flex custom-refresh-button" @click="getWalletApply(offset,limit)">
<i class="el-icon-refresh"></i>
</div>
<div class="custom-filter-item display-flex">
<div class="custom-filter-label">申请时间</div>
<div class="custom-filter-content">
<el-date-picker v-model="searchForm.createtime" type="daterange" value-format="yyyy-MM-dd HH:mm:ss"
format="yyyy-MM-dd HH:mm:ss" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
:picker-options="pickerOptions" align="right" size="small" :default-time="['00:00:00', '23:59:59']">
</el-date-picker>
</div>
</div>
<div class="custom-filter-item display-flex">
<div class="custom-filter-label">上次操作时间</div>
<div class="custom-filter-content">
<el-date-picker v-model="searchForm.updatetime" type="daterange" value-format="yyyy-MM-dd HH:mm:ss"
format="yyyy-MM-dd HH:mm:ss" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
:picker-options="pickerOptions" align="right" size="small" :default-time="['00:00:00', '23:59:59']">
</el-date-picker>
</div>
</div>
<div class="custom-filter-item display-flex">
<div class="custom-filter-content">
<el-input placeholder="请输入内容" v-model="searchForm.form_1_value" class="input-with-select" size="small">
<el-select v-model="searchForm.form_1_key" slot="prepend" placeholder="请选择">
<el-option label="用户ID" value="user_id"></el-option>
<el-option label="用户昵称" value="user_nickname"></el-option>
<el-option label="用户手机号" value="user_mobile"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="custom-filter-item display-flex">
<div class="custom-filter-label">提现方式</div>
<div class="custom-filter-content custom-filter-content-input">
<el-select v-model="searchForm.apply_type" size="small">
<el-option v-for="type in filterRule.apply_type" :label="type.name" :value="type.type">
</el-option>
</el-select>
</div>
</div>
<div class="custom-filter-button-wrap display-flex">
<el-button class="filter-reset-button" @click="filterEmpty" size="small">重置</el-button>
<el-button class="filter-button" @click="filterConfirm()" type="primary" size="small">筛选</el-button>
</div>
</div>
<div class="custom-table-wrap"
:class="(searchForm.status!='0' && searchForm.status!='1')?'custom-table-checkbox':''">
<el-table ref="multipleTable" :data="walletApplyData" border stripe @selection-change="tableSelect">
<el-table-column type="selection" width="40" align="center" :selectable="checkSelectable">
</el-table-column>
<el-table-column prop="id" min-width="74" label="ID">
</el-table-column>
<el-table-column min-width="120" label="申请用户" align="left">
<template slot-scope="scope">
<template v-if="scope.row.user">
<div v-if="scope.row.user.avatar" class="custom-table-image">
<el-image :src="Fast.api.cdnurl(scope.row.user.avatar)" fit="cover">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</div>
<el-popover placement="top" width="200" trigger="hover">
<div class="table-popover-wrap">
<div>
<span>ID:</span>
<span class="table-popover-jump"
@click="openUser(scope.row.user.id)">{{scope.row.user.id}}</span>
</div>
<div>
<span>手机号:</span>
<span>{{scope.row.user.mobile?scope.row.user.mobile:'-'}}</span>
</div>
</div>
<div class="ellipsis-item table-popover-jump" slot="reference">
<span @click="openUser(scope.row.user.id)">{{scope.row.user.nickname}}</span>
</div>
</el-popover>
</template>
<template v-else>-</template>
</template>
</el-table-column>
<el-table-column width="200" label="实际到账/提现金额">
<template slot-scope="scope">
{{scope.row.actual_money}} <span>元</span>/{{scope.row.money}} <span>元</span>
</template>
</el-table-column>
<el-table-column min-width="150" label="费率/手续费">
<template slot-scope="scope">
<span>{{scope.row.service_fee*100}}%</span>/<span>{{scope.row.charge_money}}元</span>
</template>
</el-table-column>
<el-table-column width="120" label="提现方式" align="left">
<template slot-scope="scope">
<div class="custom-table-image get-type-iamge">
<el-image :src="'/assets/addons/shopro/img/user_wallet_apply/'+scope.row.apply_type+'.png'"
fit="cover">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</div>
<div class="ellipsis-item">{{scope.row.apply_type_text}}</div>
</template>
</el-table-column>
<el-table-column width="240" label="打款信息" align="left">
<template slot-scope="scope">
<div>
<template v-if="scope.row.apply_info">
<div class="display-flex" v-for="(key,kindex) in scope.row.apply_info_text">
<span class="ellipsis-item">{{kindex}}:&nbsp;{{key}}</span>
<span class="custom-copy-message" :class="'custom-copy-message'+scope.$index+key"
:data-clipboard-text="key" @click="copyMessage(scope.$index+key)">
<i class="el-icon-copy-document"></i>
</span>
</div>
</template>
<template v-if="!scope.row.apply_info">-</template>
</div>
</template>
</el-table-column>
<el-table-column width="150" label="申请时间">
<template slot-scope="scope">
{{moment(scope.row.createtime*1000).format('YYYY-MM-DD HH:mm:ss')}}
</template>
</el-table-column>
<el-table-column width="150" label="上次操作时间">
<template slot-scope="scope">
{{moment(scope.row.updatetime*1000).format('YYYY-MM-DD HH:mm:ss')}}
</template>
</el-table-column>
<el-table-column width="88" fixed="right" label="状态">
<template slot-scope="scope">
<span v-if="scope.row.status==-1" class="custom-table-color-error">{{scope.row.status_text}}</span>
<span v-if="scope.row.status==0" class="custom-table-color-info">{{scope.row.status_text}}</span>
<span v-if="scope.row.status==1" class="custom-table-color-warning">{{scope.row.status_text}}</span>
<span v-if="scope.row.status==2" class="custom-table-color-success">{{scope.row.status_text}}</span>
</template>
</el-table-column>
<el-table-column min-width="140" fixed="right" label="操作" align="left">
<template slot-scope="scope">
<span v-if="scope.row.status==0" class="custom-table-operation-text custom-table-color-primary"
@click="openAgreeDialog(scope.row)">同意</span>
<span v-if="scope.row.status==1" class="custom-table-operation-text custom-table-color-primary"
@click="openImmediatelyDialog(scope.row)">立即打款</span>
<span v-if="scope.row.status==0 || scope.row.status==1"
class="custom-table-operation-text custom-table-color-error"
@click="openRefuseDialog(scope.row)">拒绝</span>
<span class="custom-table-operation-text custom-table-color-primary"
@click="openLogDialog(scope.row.id)">
<i class="el-icon-time"></i>
</span>
</template>
</el-table-column>
</el-table>
<div class="pagination-container"
:class="(searchForm.status=='0' || searchForm.status=='1')?'pagination-container-b':''">
<div v-if="searchForm.status=='0' || searchForm.status=='1'">
<el-checkbox class="table-checked-all" :indeterminate="isIndeterminate"
:disabled="walletApplyData.length==0" v-model="tableCheckedAll" @change="changeCheckedAll">
</el-checkbox>
<el-button v-if="searchForm.status=='0'" :type="tableCheckedAll?'primary':''"
:disabled="!tableCheckedAll" plain size="small" @click="openAgreeDialog(multipleSelection)">同意
</el-button>
<el-button v-if="searchForm.status=='1'" :type="tableCheckedAll?'primary':''"
:disabled="!tableCheckedAll" plain size="small" @click="openImmediatelyDialog(multipleSelection)">
立即打款
</el-button>
<el-button v-if="searchForm.status=='0' || searchForm.status=='1'" :type="tableCheckedAll?'danger':''"
:disabled="!tableCheckedAll" plain size="small" @click="openRefuseDialog(multipleSelection)">拒绝
</el-button>
</div>
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="limit"
layout="total, sizes, prev, pager, next, jumper" :total="totalPage">
</el-pagination>
</div>
</div>
<!-- 同意 -->
<el-dialog custom-class="refuse-dialog agree-dialog" title="操作提示" :visible.sync="agreeDialogVisible"
:before-close="closeAgreeDialog">
<span slot="footer">
<el-button @click="closeAgreeDialog" size="small">取消</el-button>
<el-button type="primary" @click="agreePayment()" size="small" plain>同意</el-button>
<el-button type="primary" @click="confirmPayment()" size="small">同意&打款</el-button>
</span>
</el-dialog>
<!-- 立即打款 -->
<el-dialog custom-class="refuse-dialog agree-dialog" title="操作提示" :visible.sync="immediatelyDialogVisible"
:before-close="closeImmediatelyDialog">
<span slot="footer">
<el-button @click="closeImmediatelyDialog" size="small">取消</el-button>
<el-button type="primary" @click="immediatelyPayment()" size="small" plain>确定</el-button>
</span>
</el-dialog>
<!-- 拒绝 -->
<el-dialog custom-class="refuse-dialog" title="拒绝理由" :visible.sync="refuseDialogVisible"
:before-close="closeRefuseDialog">
<div>
<el-input v-model="refuseForm.status_msg" placeholder="请输入拒绝理由"></el-input>
</div>
<span slot="footer">
<el-button @click="closeRefuseDialog" size="small">取消</el-button>
<el-button type="danger" @click="refusePayment()" size="small">拒绝</el-button>
</span>
</el-dialog>
<!-- 操作日志 -->
<el-dialog custom-class="log-dialog" title="操作日志" :visible.sync="logDialogVisible" :before-close="closeLogDialog">
<div>
<el-table :data="logList" border stripe max-height="450">
<el-table-column prop="oper_info" min-width="300" label="日志" align="left">
<template slot-scope="scope">
{{scope.row.oper_info}}
</template>
</el-table-column>
<el-table-column width="100" label="操作人类型">
<template slot-scope="scope">
<span v-if="scope.row.oper">{{scope.row.oper.type}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column width="150" label="操作人" align="left">
<template slot-scope="scope">
<div v-if="scope.row.oper" class="display-flex">
<div v-if="scope.row.oper.avatar" class="custom-table-image">
<el-image :src="Fast.api.cdnurl(scope.row.oper.avatar)" fit="cover">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</div>
<span class="ellipsis-item">{{scope.row.oper.name}}</span>
</div>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column width="150" label="操作时间">
<template slot-scope="scope">
{{moment(scope.row.oper_time*1000).format('YYYY-MM-DD HH:mm:ss')}}
</template>
</el-table-column>
</el-table>
</div>
</el-dialog>
</div>