基本功能近期同步

This commit is contained in:
Lys 2026-01-19 15:15:48 +08:00
parent a74e04b203
commit 715e263ffb
18 changed files with 1954 additions and 81 deletions

View File

@ -33,4 +33,4 @@ VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
VITE_APP_WEBSOCKET = false
# sse 开关
VITE_APP_SSE = true
VITE_APP_SSE = false

View File

@ -4,6 +4,11 @@ export interface GradeVO {
*/
id: string | number;
/**
*
*/
name: string;
/**
*
*/
@ -12,39 +17,34 @@ export interface GradeVO {
/**
*
*/
giftDays: number;
/**
*
*/
firstGiftDays: number;
giftDays?: number;
/**
* ()
*/
amount: number;
amount?: number;
/**
* ()
*/
averagePrice: number;
averagePrice?: number;
/**
* ()
*/
originalAmount: number;
originalAmount?: number;
/**
*
*/
rechargeStatusVisibility: string;
rechargeStatusVisibility?: string;
/**
* ID
*/
appleProductId: string | number;
appleProductId?: string | number;
flag: boolean;
flag?: boolean;
}
export interface GradeForm extends BaseEntity {
@ -53,6 +53,11 @@ export interface GradeForm extends BaseEntity {
*/
id?: string | number;
/**
*
*/
name?: string;
/**
*
*/
@ -63,11 +68,6 @@ export interface GradeForm extends BaseEntity {
*/
giftDays?: number;
/**
*
*/
firstGiftDays?: number;
/**
* ()
*/
@ -112,11 +112,6 @@ export interface GradeQuery extends PageQuery {
*/
giftDays?: number;
/**
*
*/
firstGiftDays?: number;
/**
* ()
*/

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { GradeGiftRuleVO, GradeGiftRuleForm, GradeGiftRuleQuery } from '@/api/net/gradeGiftRule/types';
/**
*
* @param query
* @returns {*}
*/
export const listGradeGiftRule = (query?: GradeGiftRuleQuery): AxiosPromise<GradeGiftRuleVO[]> => {
return request({
url: '/net/gradeGiftRule/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getGradeGiftRule = (id: string | number): AxiosPromise<GradeGiftRuleVO> => {
return request({
url: '/net/gradeGiftRule/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addGradeGiftRule = (data: GradeGiftRuleForm) => {
return request({
url: '/net/gradeGiftRule',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateGradeGiftRule = (data: GradeGiftRuleForm) => {
return request({
url: '/net/gradeGiftRule',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delGradeGiftRule = (id: string | number | Array<string | number>) => {
return request({
url: '/net/gradeGiftRule/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,83 @@
export interface GradeGiftRuleVO {
/**
* ID
*/
id: string | number;
/**
* ID
*/
gradeId: string | number;
/**
*
*/
startTime: string;
/**
*
*/
endTime: string;
/**
*
*/
giftDays: number;
}
export interface GradeGiftRuleForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* ID
*/
gradeId?: string | number;
/**
*
*/
startTime?: string;
/**
*
*/
endTime?: string;
/**
*
*/
giftDays?: number;
}
export interface GradeGiftRuleQuery extends PageQuery {
/**
* ID
*/
gradeId?: string | number;
/**
*
*/
startTime?: string;
/**
*
*/
endTime?: string;
/**
*
*/
giftDays?: number;
/**
*
*/
params?: any;
}

View File

@ -66,7 +66,7 @@ export const delInvitation = (id: string | number | Array<string | number>) => {
*
* @param data
*/
export const linkGrade = (data: { userId: string; gradeIds: string }) => {
export const linkGrade = (data: { invitationId: string; gradeIds: string }) => {
return request({
url: '/net/invitation/linkGrade',
method: 'put',

View File

@ -87,23 +87,38 @@ export interface NodeVO {
/**
*
*/
serverName: string;
disguiseServerName: string;
/**
*
*/
disguiseServerPort: number;
/**
*
*/
allowInsecure: boolean;
/**
*
*/
privateKey: string;
/**
*
*/
publicKey: string;
/**
* SNI伪装域名
*/
sni: string;
/**
*
*/
shortIds: string | number;
/**
*
*/
dest: string;
/**
* ws连接路径
*/
@ -161,6 +176,7 @@ export interface NodeForm extends BaseEntity {
*
*/
routeIds?: string | number;
routeIdArray?: (string | number)[];
/**
*
@ -205,23 +221,38 @@ export interface NodeForm extends BaseEntity {
/**
*
*/
serverName?: string;
disguiseServerName?: string;
/**
*
*/
disguiseServerPort?: number;
/**
*
*/
allowInsecure?: boolean;
/**
*
*/
privateKey?: string;
/**
*
*/
publicKey?: string;
/**
* SNI伪装域名
*/
sni?: string;
/**
*
*/
shortIds?: string | number;
/**
*
*/
dest?: string;
/**
* ws连接路径
*/

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { OrderVO, OrderForm, OrderQuery } from '@/api/net/order/types';
/**
*
* @param query
* @returns {*}
*/
export const listOrder = (query?: OrderQuery): AxiosPromise<OrderVO[]> => {
return request({
url: '/net/order/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getOrder = (id: string | number): AxiosPromise<OrderVO> => {
return request({
url: '/net/order/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addOrder = (data: OrderForm) => {
return request({
url: '/net/order',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateOrder = (data: OrderForm) => {
return request({
url: '/net/order',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delOrder = (id: string | number | Array<string | number>) => {
return request({
url: '/net/order/' + id,
method: 'delete'
});
};

273
src/api/net/order/types.ts Normal file
View File

@ -0,0 +1,273 @@
export interface OrderVO {
/**
* ID
*/
id: string | number;
/**
* ID
*/
userId: string | number;
/**
*
*/
temporaryAccount: string;
/**
* ID
*/
invitationCodeId: string | number;
/**
*
*/
invitationCodeName: string;
/**
*
*/
rechargeDays: number;
/**
*
*/
rechargeMoney: number;
/**
*
*/
currency: string;
/**
*
*/
orderNumber: string;
/**
*
*/
payConfigId: string | number;
/**
*
*/
platformOrderNumber: string;
/**
*
*/
deviceType: string;
/**
*
*/
payStatus: number;
/**
* IP
*/
payIp: string;
/**
*
*/
payType: string;
/**
*
*/
rechargeTime: string;
/**
*
*/
payTime: string;
/**
* ()
*/
giftTime: number;
/**
* 退
*/
refundTime: string;
/**
*
*/
notifyTime: string;
/**
*
*/
rechargeBeforeTime: string;
/**
*
*/
rechargeAfterTime: string;
}
export interface OrderForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* ID
*/
userId?: string | number;
/**
*
*/
temporaryAccount?: string;
/**
* ID
*/
invitationCodeId?: string | number;
/**
*
*/
invitationCodeName?: string;
/**
*
*/
rechargeDays?: number;
/**
*
*/
rechargeMoney?: number;
/**
*
*/
currency?: string;
/**
*
*/
orderNumber?: string;
/**
*
*/
payConfigName?: string | number;
/**
*
*/
platformOrderNumber?: string;
/**
*
*/
deviceType?: string;
/**
*
*/
payStatus?: number;
/**
* IP
*/
payIp?: string;
/**
*
*/
payType?: string;
/**
*
*/
rechargeTime?: string;
/**
*
*/
payTime?: string;
/**
* ()
*/
giftTime?: number;
/**
* 退
*/
refundTime?: string;
/**
*
*/
notifyTime?: string;
/**
*
*/
rechargeBeforeTime?: string;
/**
*
*/
rechargeAfterTime?: string;
}
export interface OrderQuery extends PageQuery {
/**
*
*/
temporaryAccount?: string;
/**
*
*/
invitationCodeName?: string;
/**
*
*/
rechargeDays?: number;
/**
*
*/
orderNumber?: string;
/**
*
*/
payConfigName?: string | number;
/**
*
*/
deviceType?: string;
/**
*
*/
payStatus?: number;
/**
*
*/
payType?: string;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,100 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { PayConfigVO, PayConfigForm, PayConfigQuery } from '@/api/net/payConfig/types';
/**
*
* @param query
* @returns {*}
*/
export const listPayConfig = (query?: PayConfigQuery): AxiosPromise<PayConfigVO[]> => {
return request({
url: '/net/payConfig/list',
method: 'get',
params: query
});
};
/**
*
* @param query
* @returns {*}
*/
export const listAllPayConfig = (query?: PayConfigQuery): AxiosPromise<PayConfigVO[]> => {
return request({
url: '/net/payConfig/listAll',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getPayConfig = (id: string | number): AxiosPromise<PayConfigVO> => {
return request({
url: '/net/payConfig/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addPayConfig = (data: PayConfigForm) => {
return request({
url: '/net/payConfig',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updatePayConfig = (data: PayConfigForm) => {
return request({
url: '/net/payConfig',
method: 'put',
data: data
});
};
/**
*
* @param data
*/
export const topPay = (data: PayConfigForm) => {
return request({
url: '/net/payConfig/topPay',
method: 'put',
data: data
});
};
/**
*
* @param data
*/
export const enablePay = (data: PayConfigForm) => {
return request({
url: '/net/payConfig/enablePay',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delPayConfig = (id: string | number | Array<string | number>) => {
return request({
url: '/net/payConfig/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,123 @@
export interface PayConfigVO {
/**
*
*/
id: string | number;
/**
*
*/
name: string;
/**
*
*/
payStrategy: string;
/**
*
*/
mchNo: string;
/**
*
*/
privateKey: string;
/**
*
*/
publicKey: string;
/**
*
*/
enableFlag: string | number;
/**
*
*/
alipayParam: string;
/**
*
*/
wxpayParam: string;
/**
*
*/
gatewayUrl?: string;
}
export interface PayConfigForm extends BaseEntity {
/**
*
*/
id?: string | number;
/**
*
*/
name?: string;
/**
*
*/
payStrategy?: string;
/**
*
*/
mchNo?: string;
/**
*
*/
privateKey?: string;
/**
*
*/
publicKey?: string;
/**
*
*/
alipayParam?: string;
/**
*
*/
wxpayParam?: string;
/**
*
*/
gatewayUrl?: string;
/**
*
*/
enableFlag?: string | number;
}
export interface PayConfigQuery extends PageQuery {
/**
*
*/
name?: string;
/**
*
*/
payStrategy?: string;
/**
*
*/
params?: any;
}

View File

@ -7,7 +7,6 @@ import { ServerRouteVO, ServerRouteForm, ServerRouteQuery } from '@/api/net/serv
* @param query
* @returns {*}
*/
export const listServerRoute = (query?: ServerRouteQuery): AxiosPromise<ServerRouteVO[]> => {
return request({
url: '/net/serverRoute/list',
@ -16,6 +15,18 @@ export const listServerRoute = (query?: ServerRouteQuery): AxiosPromise<ServerRo
});
};
/**
*
* @param query
* @returns {*}
*/
export const listAll = (): AxiosPromise<ServerRouteVO[]> => {
return request({
url: '/net/serverRoute/listAll',
method: 'get'
});
};
/**
*
* @param id

View File

@ -0,0 +1,286 @@
<template>
<div class="p-2">
<div class="panel">
<h4 class="panel-title">基本信息</h4>
<el-form :model="gradeInfo" :inline="true">
<el-row :gutter="10">
<el-col :span="2.5">
<el-form-item label="商品名称" prop="name">
<el-input v-model="gradeInfo.name" disabled />
</el-form-item>
</el-col>
<el-col :span="2.5">
<el-form-item label="充值天数" prop="days">
<el-input v-model="gradeInfo.days" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div class="panel">
<h4 class="panel-title">赠送规则</h4>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="赠送天数" prop="giftDays">
<el-input v-model="queryParams.giftDays" placeholder="请输入赠送天数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['net:gradeGiftRule:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['net:gradeGiftRule:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['net:gradeGiftRule:remove']">删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="gradeGiftRuleList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="开始时间" align="center" prop="startTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="结束时间" align="center" prop="endTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="赠送天数" align="center" prop="giftDays" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['net:gradeGiftRule:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['net:gradeGiftRule:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改充值商品赠送规则对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="gradeGiftRuleFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="开始时间" prop="startTime">
<el-date-picker clearable
v-model="form.startTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择开始时间">
</el-date-picker>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker clearable
v-model="form.endTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择结束时间">
</el-date-picker>
</el-form-item>
<el-form-item label="赠送天数" prop="giftDays">
<el-input v-model="form.giftDays" placeholder="请输入赠送天数" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</div>
</template>
<script setup name="GiftRule" lang="ts">
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
import { GradeVO } from '@/api/net/grade/types';
import { getGrade } from '@/api/net/grade/index';
import { listGradeGiftRule, getGradeGiftRule, delGradeGiftRule, addGradeGiftRule, updateGradeGiftRule } from '@/api/net/gradeGiftRule';
import { GradeGiftRuleVO, GradeGiftRuleQuery, GradeGiftRuleForm } from '@/api/net/gradeGiftRule/types';
const route = useRoute();
const gradeGiftRuleList = ref<GradeGiftRuleVO[]>([]);
const gradeInfo = ref<GradeVO>({
id: '',
name: '',
days: 0
});
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const gradeGiftRuleFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: GradeGiftRuleForm = {
id: undefined,
gradeId: undefined,
startTime: undefined,
endTime: undefined,
giftDays: undefined
}
const data = reactive<PageData<GradeGiftRuleForm, GradeGiftRuleQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
gradeId: undefined,
startTime: undefined,
endTime: undefined,
giftDays: undefined,
params: {
}
},
rules: {
gradeId: [
{ required: true, message: "商品ID不能为空", trigger: "blur" }
],
startTime: [
{ required: true, message: "开始时间不能为空", trigger: "blur" }
],
endTime: [
{ required: true, message: "结束时间不能为空", trigger: "blur" }
],
giftDays: [
{ required: true, message: "赠送天数不能为空", trigger: "blur" }
]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询充值商品赠送规则列表 */
const getList = async () => {
loading.value = true;
const res = await listGradeGiftRule(queryParams.value);
gradeGiftRuleList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
gradeGiftRuleFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: GradeGiftRuleVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加充值商品赠送规则";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: GradeGiftRuleVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getGradeGiftRule(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改充值商品赠送规则";
}
/** 提交按钮 */
const submitForm = () => {
gradeGiftRuleFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
form.value.gradeId = route.params.gradeId as string;
if (form.value.id) {
await updateGradeGiftRule(form.value).finally(() => buttonLoading.value = false);
} else {
await addGradeGiftRule(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: GradeGiftRuleVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除充值商品赠送规则编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delGradeGiftRule(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('net/gradeGiftRule/export', {
...queryParams.value
}, `gradeGiftRule_${new Date().getTime()}.xlsx`)
}
/** 获取充值商品信息 */
const getGradeInfo = async () => {
const gradeId = route.params.gradeId as string;
const res = await getGrade(gradeId);
Object.assign(gradeInfo.value, res.data);
}
onMounted(() => {
getGradeInfo();
getList();
});
</script>

View File

@ -43,12 +43,11 @@
<el-table v-loading="loading" border :data="gradeList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" width="200" align="center" prop="id" v-if="true" />
<el-table-column label="商品名称" align="center" prop="name" />
<el-table-column label="充值天数" align="center" prop="days" />
<el-table-column label="赠送天数" align="center" prop="giftDays" />
<el-table-column label="首充赠送天数" align="center" prop="firstGiftDays" />
<el-table-column label="金额(分)" align="center" prop="amount" />
<el-table-column label="平均月金额(分)" align="center" prop="averagePrice" />
<el-table-column label="原价(分)" align="center" prop="originalAmount" />
<el-table-column label="金额(元)" align="center" prop="amount" />
<el-table-column label="原价(元)" align="center" prop="originalAmount" />
<el-table-column label="充值状态限制" width="250" align="center">
<template #default="scope">
<dict-tag :options="net_recharge_status" :value="scope.row.rechargeStatusVisibilityList"/>
@ -60,6 +59,9 @@
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['net:grade:edit']"></el-button>
</el-tooltip>
<el-tooltip content="赠送规则" placement="top">
<el-button link type="primary" icon="Link" @click="handleGiftRule(scope.row)" v-hasPermi="['net:grade:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['net:grade:remove']"></el-button>
</el-tooltip>
@ -72,21 +74,18 @@
<!-- 添加或修改商品对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="gradeFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="商品名称" prop="name">
<el-input v-model="form.name" placeholder="请输入商品名称" />
</el-form-item>
<el-form-item label="充值天数" prop="days">
<el-input v-model="form.days" placeholder="请输入充值天数" />
</el-form-item>
<el-form-item label="赠送天数" prop="giftDays">
<el-input v-model="form.giftDays" placeholder="请输入赠送天数" />
</el-form-item>
<el-form-item label="首充赠送天数" prop="firstGiftDays">
<el-input v-model="form.firstGiftDays" placeholder="请输入首充赠送天数" />
</el-form-item>
<el-form-item label="金额(分)" prop="amount">
<el-input v-model="form.amount" placeholder="请输入金额(分)" />
</el-form-item>
<el-form-item label="平均月金额(分)" prop="averagePrice">
<el-input v-model="form.averagePrice" placeholder="请输入平均月金额(分)" />
</el-form-item>
<el-form-item label="原价(分)" prop="originalAmount">
<el-input v-model="form.originalAmount" placeholder="请输入原价(分)" />
</el-form-item>
@ -117,6 +116,7 @@
<script setup name="Grade" lang="ts">
import { listGrade, getGrade, delGrade, addGrade, updateGrade } from '@/api/net/grade';
import { GradeVO, GradeQuery, GradeForm } from '@/api/net/grade/types';
import router from '@/router';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { net_recharge_status } = toRefs<any>(proxy?.useDict('net_recharge_status'));
@ -142,7 +142,6 @@ const initFormData: GradeForm = {
id: undefined,
days: undefined,
giftDays: undefined,
firstGiftDays: undefined,
amount: undefined,
averagePrice: undefined,
originalAmount: undefined,
@ -156,7 +155,6 @@ const data = reactive<PageData<GradeForm, GradeQuery>>({
pageSize: 10,
days: undefined,
giftDays: undefined,
firstGiftDays: undefined,
amount: undefined,
averagePrice: undefined,
originalAmount: undefined,
@ -237,6 +235,13 @@ const handleUpdate = async (row?: GradeVO) => {
dialog.title = "修改商品";
}
/** 赠送规则按钮操作 */
const handleGiftRule = async (row?: GradeVO) => {
const _id = row?.id || ids.value[0];
const route = useRoute();
router.push(`/netUser/grade/giftRule/${_id}`);
}
/** 提交按钮 */
const submitForm = () => {
gradeFormRef.value?.validate(async (valid: boolean) => {

View File

@ -11,7 +11,9 @@
<el-input v-model="queryParams.invitationName" placeholder="请输入渠道名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="加速计划" prop="planId">
<el-input v-model="queryParams.planId" placeholder="请输入加速计划ID" clearable @keyup.enter="handleQuery" />
<el-select v-model="queryParams.planId" placeholder="选择加速计划" clearable>
<el-option v-for="plan in planList" :key="plan.id" :label="plan.planName" :value="plan.id" />
</el-select>
</el-form-item>
<el-form-item label="保护地区" prop="protectedArea">
<el-input v-model="queryParams.protectedArea" placeholder="请输入保护地区" clearable @keyup.enter="handleQuery" />
@ -91,7 +93,9 @@
<el-input v-model="form.smsTemplate" placeholder="请输入短信模板" />
</el-form-item>
<el-form-item label="加速计划" prop="planId">
<el-input v-model="form.planId" placeholder="请输入加速计划ID" />
<el-select v-model="form.planId" placeholder="加速计划" clearable>
<el-option v-for="plan in planList" :key="plan.id" :label="plan.planName" :value="plan.id" />
</el-select>
</el-form-item>
<el-form-item label="IP天数" prop="ipRegisterDay">
<el-input v-model="form.ipRegisterDay" placeholder="请输入最近多少天" />
@ -140,7 +144,9 @@
<script setup name="Invitation" lang="ts">
import { listInvitation, getInvitation, delInvitation, addInvitation, updateInvitation } from '@/api/net/invitation';
import { allPlan } from '@/api/net/plan';
import { InvitationVO, InvitationQuery, InvitationForm } from '@/api/net/invitation/types';
import { PlanVO } from '@/api/net/plan/types';
import router from '@/router';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@ -154,6 +160,7 @@ const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const planList = ref<PlanVO[]>([]);
const queryFormRef = ref<ElFormInstance>();
const invitationFormRef = ref<ElFormInstance>();
@ -212,6 +219,24 @@ const getList = async () => {
loading.value = false;
}
const getAllPlan = async () => {
const res = await allPlan();
planList.value = res.data;
}
const getPlanName = (id) => {
let name = "";
console.log(planList.value);
console.log(id);
planList.value.forEach(plan => {
if (plan.id == id) {
name = plan.planName
}
});
return name; // ID
};
/** 取消按钮 */
const cancel = () => {
reset();
@ -301,5 +326,6 @@ const handleExport = () => {
onMounted(() => {
getList();
getAllPlan();
});
</script>

View File

@ -86,10 +86,8 @@ const tableRef = ref<ElTableInstance>();
/** 单击选中行数据 */
const clickRow = (row: GradeVO) => {
if (checkSelectable(row)) {
row.flag = !row.flag;
tableRef.value?.toggleRowSelection(row, row.flag);
}
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: GradeVO[]) => {
@ -99,10 +97,6 @@ const handleSelectionChange = (selection: GradeVO[]) => {
const getRowKey = (row: GradeVO): string => {
return String(row.id);
};
/** 检查角色状态 */
const checkSelectable = (row: GradeVO): boolean => {
return row.status === '0';
};
/** 关闭按钮 */
const close = () => {
const obj: RouteLocationNormalized = {

View File

@ -120,12 +120,17 @@
<dict-tag :options="net_flow" :value="scope.row.flow"/>
</template>
</el-table-column>
<el-table-column v-if="columns[17].visible" label="伪装域名" align="center" prop="serverName" />
<el-table-column v-if="columns[18].visible" label="加密私钥" align="center" prop="privateKey" />
<el-table-column v-if="columns[19].visible" label="加密标识" align="center" prop="shortIds" />
<el-table-column v-if="columns[20].visible" label="目标地址" align="center" prop="dest" />
<el-table-column v-if="columns[21].visible" label="ws路径" align="center" prop="path" />
<el-table-column v-if="columns[22].visible" label="grpc名称" align="center" prop="serviceName" />
<el-table-column v-if="columns[17].visible" label="伪装域名" align="center" prop="disguiseServerName" />
<el-table-column v-if="columns[18].visible" label="伪装域名的端口" align="center" prop="disguiseServerPort" />
<el-table-column v-if="columns[19].visible" label="允许不安全" align="center" prop="allowInsecure">
<template #default="scope">
<dict-tag :options="net_true_false" :value="scope.row.allowInsecure"/>
</template>
</el-table-column>
<el-table-column v-if="columns[20].visible" label="加密公钥" align="center" prop="publicKey" />
<el-table-column v-if="columns[21].visible" label="SNI伪装域名" align="center" prop="sni" />
<el-table-column v-if="columns[22].visible" label="ws路径" align="center" prop="path" />
<el-table-column v-if="columns[23].visible" label="grpc名称" align="center" prop="serviceName" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
@ -162,7 +167,9 @@
<el-input v-model="form.flowRate" placeholder="请输入流量倍率" />
</el-form-item>
<el-form-item label="路由组" prop="routeIds">
<el-input v-model="form.routeIds" placeholder="请输入路由组" />
<el-select v-model="form.routeIdArray" filterable multiple placeholder="请选择">
<el-option v-for="item in routeList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="加速协议" prop="protocolType">
<el-select v-model="form.protocolType" placeholder="请选择加速协议">
@ -236,18 +243,27 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="伪装域名" prop="serverName" v-if="form.tlsType=='reality'">
<el-input v-model="form.serverName" placeholder="请输入伪装域名" />
<el-form-item label="伪装域名" prop="disguiseServerName" v-if="form.tlsType=='reality'">
<el-input v-model="form.disguiseServerName" placeholder="请输入伪装域名" />
</el-form-item>
<el-form-item label="伪装域名的端口" prop="disguiseServerPort" v-if="form.tlsType=='reality'">
<el-input v-model.number="form.disguiseServerPort" placeholder="请输入伪装域名的端口" />
</el-form-item>
<el-form-item label="允许不安全" prop="allowInsecure" v-if="form.tlsType=='reality'">
<el-switch v-model="form.allowInsecure"></el-switch>
</el-form-item>
<el-form-item label="加密私钥" prop="privateKey" v-if="form.tlsType=='reality'">
<el-input v-model="form.privateKey" placeholder="请输入加密私钥" />
</el-form-item>
<el-form-item label="加密公钥" prop="publicKey" v-if="form.tlsType=='reality'">
<el-input v-model="form.publicKey" placeholder="请输入加密公钥" />
</el-form-item>
<el-form-item label="SNI伪装域名" prop="sni" v-if="form.tlsType=='tls'">
<el-input v-model="form.sni" placeholder="请输入SNI伪装域名" />
</el-form-item>
<el-form-item label="加密标识" prop="shortIds" v-if="form.tlsType=='reality'">
<el-input v-model="form.shortIds" placeholder="请输入加密标识" />
</el-form-item>
<el-form-item label="目标地址" prop="dest" v-if="form.tlsType=='reality'">
<el-input v-model="form.dest" placeholder="请输入目标地址" />
</el-form-item>
<el-form-item label="ws路径" prop="path" v-if="form.streamType=='ws'">
<el-input v-model="form.path" placeholder="请输入ws连接路径" />
</el-form-item>
@ -271,6 +287,8 @@
<script setup name="Node" lang="ts">
import { listNode, getNode, delNode, addNode, updateNode } from '@/api/net/node';
import { NodeVO, NodeQuery, NodeForm } from '@/api/net/node/types';
import { listAll } from '@/api/net/serverRoute';
import { ServerRouteVO } from '@/api/net/serverRoute/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { net_tls_type, net_stream_type, net_enable_flag, net_true_false, net_flow, net_protocol_type, net_flow_type } = toRefs<any>(proxy?.useDict('net_tls_type', 'net_stream_type', 'net_enable_flag', 'net_true_false', 'net_flow', 'net_protocol_type', 'net_flow_type'));
@ -283,6 +301,7 @@ const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const routeList = ref<ServerRouteVO[]>([]);
const queryFormRef = ref<ElFormInstance>();
const nodeFormRef = ref<ElFormInstance>();
@ -307,11 +326,12 @@ const columns = ref<FieldOption[]>([
{ key: 15, label: `加密方式`, visible: false, children: [] },
{ key: 16, label: `加密类型`, visible: false, children: [] },
{ key: 17, label: `伪装域名`, visible: false, children: [] },
{ key: 18, label: `加密私钥`, visible: false, children: [] },
{ key: 19, label: `加密标识`, visible: false, children: [] },
{ key: 20, label: `目标地址`, visible: false, children: [] },
{ key: 21, label: `ws路径`, visible: false, children: [] },
{ key: 22, label: `grpc名称`, visible: false, children: [] },
{ key: 18, label: `伪装域名的端口`, visible: false, children: [] },
{ key: 19, label: `允许不安全`, visible: false, children: [] },
{ key: 20, label: `加密私钥`, visible: false, children: [] },
{ key: 21, label: `加密标识`, visible: false, children: [] },
{ key: 22, label: `ws路径`, visible: false, children: [] },
{ key: 23, label: `grpc名称`, visible: false, children: [] },
]);
const dialog = reactive<DialogOption>({
@ -337,10 +357,13 @@ const initFormData: NodeForm = {
streamType: undefined,
tlsType: undefined,
flow: undefined,
serverName: undefined,
disguiseServerName: undefined,
disguiseServerPort: undefined,
allowInsecure: undefined,
privateKey: undefined,
publicKey: undefined,
sni: undefined,
shortIds: undefined,
dest: undefined,
path: undefined,
serviceName: undefined,
}
@ -403,6 +426,23 @@ const getList = async () => {
loading.value = false;
}
/** 获取路由组名称 */
const getRouteName = (id) => {
let name = "";
routeList.value.forEach(route => {
if (route.id == id) {
name = route.name
}
});
return name; // ID
};
/** 查询所有的路由组 */
const listAllRoutes = async () => {
const res = await listAll();
routeList.value = res.data;
}
/** 取消按钮 */
const cancel = () => {
reset();
@ -484,7 +524,8 @@ const handleExport = () => {
}, `node_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
onMounted(async () => {
await listAllRoutes();
getList();
});
</script>

View File

@ -0,0 +1,474 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="临时账号" prop="temporaryAccount">
<el-input v-model="queryParams.temporaryAccount" placeholder="请输入临时账号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="渠道名称" prop="invitationCodeName">
<el-input v-model="queryParams.invitationCodeName" placeholder="请输入渠道名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="充值天数" prop="rechargeDays">
<el-input v-model="queryParams.rechargeDays" placeholder="请输入充值天数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="订单号" prop="orderNumber">
<el-input v-model="queryParams.orderNumber" placeholder="请输入订单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="支付平台" prop="payConfigName">
<el-input v-model="queryParams.payConfigName" placeholder="请输入支付平台" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="queryParams.deviceType" placeholder="请选择设备类型" clearable >
<el-option v-for="dict in sys_device_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="支付状态" prop="payStatus">
<el-select v-model="queryParams.payStatus" placeholder="请选择支付状态" clearable >
<el-option v-for="dict in net_order_status" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
</el-select>
</el-form-item>
<el-form-item label="支付方式" prop="payType">
<el-select v-model="queryParams.payType" placeholder="请选择支付方式" clearable >
<el-option v-for="dict in net_pay_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="支付时间" style="width: 308px">
<el-date-picker v-model="dateRangePayTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['net:order:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['net:order:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['net:order:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['net:order:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="orderList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column v-if="columns[0].visible" label="ID" align="center" prop="id" />
<el-table-column v-if="columns[1].visible" label="用户ID" align="center" prop="userId" />
<el-table-column v-if="columns[2].visible" label="临时账号" align="center" prop="temporaryAccount" />
<el-table-column v-if="columns[3].visible" label="渠道号ID" align="center" prop="invitationCodeId" />
<el-table-column v-if="columns[4].visible" label="渠道名称" align="center" prop="invitationCodeName" />
<el-table-column v-if="columns[5].visible" label="充值天数" align="center" prop="rechargeDays" />
<el-table-column v-if="columns[6].visible" label="充值金额" align="center" prop="rechargeMoney" />
<el-table-column v-if="columns[7].visible" label="币种" align="center" prop="currency" />
<el-table-column v-if="columns[8].visible" label="三方订单" align="center" prop="orderNumber" />
<el-table-column v-if="columns[9].visible" label="支付平台" align="center" prop="payConfigName" />
<el-table-column v-if="columns[10].visible" label="平台订单号" align="center" prop="platformOrderNumber" />
<el-table-column v-if="columns[11].visible" label="设备类型" align="center" prop="deviceType">
<template #default="scope">
<dict-tag :options="sys_device_type" :value="scope.row.deviceType"/>
</template>
</el-table-column>
<el-table-column v-if="columns[12].visible" label="支付状态" align="center" prop="payStatus">
<template #default="scope">
<dict-tag :options="net_order_status" :value="scope.row.payStatus"/>
</template>
</el-table-column>
<el-table-column v-if="columns[13].visible" label="支付IP" align="center" prop="payIp" />
<el-table-column v-if="columns[14].visible" label="支付方式" align="center" prop="payType">
<template #default="scope">
<dict-tag :options="net_pay_type" :value="scope.row.payType"/>
</template>
</el-table-column>
<el-table-column v-if="columns[15].visible" label="充值发起时间" align="center" prop="rechargeTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.rechargeTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column v-if="columns[16].visible" label="实际支付时间" align="center" prop="payTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.payTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column v-if="columns[17].visible" label="赠送时长(分钟)" align="center" prop="giftTime" />
<el-table-column v-if="columns[18].visible" label="退款时间" align="center" prop="refundTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.refundTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column v-if="columns[19].visible" label="回调通知时间" align="center" prop="notifyTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.notifyTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column v-if="columns[20].visible" label="充值前有效期" align="center" prop="rechargeBeforeTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.rechargeBeforeTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column v-if="columns[21].visible" label="充值后有效期" align="center" prop="rechargeAfterTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.rechargeAfterTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['net:order:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['net:order:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改支付订单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="orderFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户ID" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户ID" />
</el-form-item>
<el-form-item label="临时账号" prop="temporaryAccount">
<el-input v-model="form.temporaryAccount" placeholder="请输入临时账号" />
</el-form-item>
<el-form-item label="渠道号ID" prop="invitationCodeId">
<el-input v-model="form.invitationCodeId" placeholder="请输入渠道号ID" />
</el-form-item>
<el-form-item label="渠道名称" prop="invitationCodeName">
<el-input v-model="form.invitationCodeName" placeholder="请输入渠道名称" />
</el-form-item>
<el-form-item label="充值天数" prop="rechargeDays">
<el-input v-model="form.rechargeDays" placeholder="请输入充值天数" />
</el-form-item>
<el-form-item label="充值金额" prop="rechargeMoney">
<el-input v-model="form.rechargeMoney" placeholder="请输入充值金额" />
</el-form-item>
<el-form-item label="币种" prop="currency">
<el-input v-model="form.currency" placeholder="请输入币种" />
</el-form-item>
<el-form-item label="三方订单" prop="orderNumber">
<el-input v-model="form.orderNumber" placeholder="请输入三方订单" />
</el-form-item>
<el-form-item label="支付平台" prop="payConfigName">
<el-input v-model="form.payConfigName" placeholder="请输入支付平台" />
</el-form-item>
<el-form-item label="平台订单号" prop="platformOrderNumber">
<el-input v-model="form.platformOrderNumber" placeholder="请输入平台订单号" />
</el-form-item>
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="form.deviceType" placeholder="请选择设备类型">
<el-option
v-for="dict in sys_device_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="支付状态" prop="payStatus">
<el-select v-model="form.payStatus" placeholder="请选择支付状态">
<el-option
v-for="dict in net_order_status"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="支付IP" prop="payIp">
<el-input v-model="form.payIp" placeholder="请输入支付IP" />
</el-form-item>
<el-form-item label="支付方式" prop="payType">
<el-select v-model="form.payType" placeholder="请选择支付方式">
<el-option
v-for="dict in net_pay_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="充值发起时间" prop="rechargeTime">
<el-date-picker clearable
v-model="form.rechargeTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择充值发起时间">
</el-date-picker>
</el-form-item>
<el-form-item label="实际支付时间" prop="payTime">
<el-date-picker clearable
v-model="form.payTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择实际支付时间">
</el-date-picker>
</el-form-item>
<el-form-item label="赠送时长(分钟)" prop="giftTime">
<el-input v-model="form.giftTime" placeholder="请输入赠送时长(分钟)" />
</el-form-item>
<el-form-item label="退款时间" prop="refundTime">
<el-date-picker clearable
v-model="form.refundTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择退款时间">
</el-date-picker>
</el-form-item>
<el-form-item label="回调通知时间" prop="notifyTime">
<el-date-picker clearable
v-model="form.notifyTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择回调通知时间">
</el-date-picker>
</el-form-item>
<el-form-item label="充值前有效期" prop="rechargeBeforeTime">
<el-date-picker clearable
v-model="form.rechargeBeforeTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择充值前有效期">
</el-date-picker>
</el-form-item>
<el-form-item label="充值后有效期" prop="rechargeAfterTime">
<el-date-picker clearable
v-model="form.rechargeAfterTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择充值后有效期">
</el-date-picker>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Order" lang="ts">
import { listOrder, getOrder, delOrder, addOrder, updateOrder } from '@/api/net/order';
import { OrderVO, OrderQuery, OrderForm } from '@/api/net/order/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { sys_device_type, net_order_status, net_pay_type } = toRefs<any>(proxy?.useDict('sys_device_type', 'net_order_status', 'net_pay_type'));
const orderList = ref<OrderVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const dateRangePayTime = ref<[DateModelType, DateModelType]>(['', '']);
const queryFormRef = ref<ElFormInstance>();
const orderFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `ID`, visible: false, children: [] },
{ key: 1, label: `用户ID`, visible: false, children: [] },
{ key: 2, label: `临时账号`, visible: true, children: [] },
{ key: 3, label: `渠道号ID`, visible: false, children: [] },
{ key: 4, label: `渠道名称`, visible: true, children: [] },
{ key: 5, label: `充值天数`, visible: true, children: [] },
{ key: 6, label: `充值金额`, visible: true, children: [] },
{ key: 7, label: `币种`, visible: false, children: [] },
{ key: 8, label: `三方订单`, visible: false, children: [] },
{ key: 9, label: `支付平台`, visible: true, children: [] },
{ key: 10, label: `平台订单号`, visible: false, children: [] },
{ key: 11, label: `设备类型`, visible: false, children: [] },
{ key: 12, label: `支付状态`, visible: true, children: [] },
{ key: 13, label: `支付IP`, visible: false, children: [] },
{ key: 14, label: `支付方式`, visible: false, children: [] },
{ key: 15, label: `充值发起时间`, visible: false, children: [] },
{ key: 16, label: `实际支付时间`, visible: true, children: [] },
{ key: 17, label: `赠送时长`, visible: true, children: [] },
{ key: 18, label: `退款时间`, visible: false, children: [] },
{ key: 19, label: `回调通知时间`, visible: false, children: [] },
{ key: 20, label: `充值前有效期`, visible: false, children: [] },
{ key: 21, label: `充值后有效期`, visible: true, children: [] },
]);
const initFormData: OrderForm = {
id: undefined,
userId: undefined,
temporaryAccount: undefined,
invitationCodeId: undefined,
invitationCodeName: undefined,
rechargeDays: undefined,
rechargeMoney: undefined,
currency: undefined,
orderNumber: undefined,
payConfigName: undefined,
platformOrderNumber: undefined,
deviceType: undefined,
payStatus: undefined,
payIp: undefined,
payType: undefined,
rechargeTime: undefined,
payTime: undefined,
giftTime: undefined,
refundTime: undefined,
notifyTime: undefined,
rechargeBeforeTime: undefined,
rechargeAfterTime: undefined,
}
const data = reactive<PageData<OrderForm, OrderQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
temporaryAccount: undefined,
invitationCodeName: undefined,
rechargeDays: undefined,
orderNumber: undefined,
payConfigName: undefined,
deviceType: undefined,
payStatus: 1,
payType: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
userId: [
{ required: true, message: "用户ID不能为空", trigger: "blur" }
],
invitationCodeId: [
{ required: true, message: "渠道号ID不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询支付订单列表 */
const getList = async () => {
loading.value = true;
proxy?.addDateRange(queryParams.value, dateRangePayTime.value, 'PayTime');
const res = await listOrder(queryParams.value);
orderList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
dateRangePayTime.value = ['', ''];
form.value = {...initFormData};
orderFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: OrderVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加支付订单";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: OrderVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getOrder(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改支付订单";
}
/** 提交按钮 */
const submitForm = () => {
orderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateOrder(form.value).finally(() => buttonLoading.value = false);
} else {
await addOrder(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: OrderVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除支付订单编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delOrder(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('net/order/export', {
...queryParams.value
}, `order_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,305 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="平台名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入平台名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="处理策略" prop="payStrategy">
<el-select v-model="queryParams.payStrategy" placeholder="请选择处理策略" clearable >
<el-option v-for="dict in net_pay_strategy" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['net:payConfig:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['net:payConfig:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['net:payConfig:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['net:payConfig:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="payConfigList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" v-if="true" />
<el-table-column label="平台名称" align="center" prop="name" />
<el-table-column label="处理策略" align="center" prop="payStrategy">
<template #default="scope">
<dict-tag :options="net_pay_strategy" :value="scope.row.payStrategy"/>
</template>
</el-table-column>
<el-table-column label="商户编号" align="center" prop="mchNo" />
<el-table-column label="开启状态" align="center" prop="enableFlag">
<template #default="scope">
<el-switch
v-model="scope.row.enableFlag"
@change="(val) => handleEnableChange(scope.row, val)"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
:active-value="1"
:inactive-value="2"
/>
</template>
</el-table-column>
<el-table-column label="公钥" align="center" prop="publicKey" show-overflow-tooltip/>
<el-table-column label="支付宝参数" align="center" prop="alipayParam" />
<el-table-column label="微信参数" align="center" prop="wxpayParam" />
<el-table-column label="支付网关" align="center" prop="gatewayUrl" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['net:payConfig:edit']"></el-button>
</el-tooltip>
<el-tooltip content="置顶" placement="top">
<el-button link type="primary" icon="Top" @click="handleTop(scope.row)" v-hasPermi="['net:payConfig:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['net:payConfig:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改支付配置对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="550px" append-to-body>
<el-form ref="payConfigFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="平台名称" prop="name">
<el-input v-model="form.name" placeholder="请输入平台名称" />
</el-form-item>
<el-form-item label="处理策略" prop="payStrategy">
<el-select v-model="form.payStrategy" placeholder="请选择处理策略">
<el-option
v-for="dict in net_pay_strategy"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="商户编号" prop="mchNo">
<el-input v-model="form.mchNo" placeholder="请输入商户编号" />
</el-form-item>
<el-form-item label="私钥" prop="privateKey">
<el-input v-model="form.privateKey" placeholder="请输入私钥" />
</el-form-item>
<el-form-item label="公钥" prop="publicKey">
<el-input v-model="form.publicKey" placeholder="请输入公钥" />
</el-form-item>
<el-form-item label="支付宝参数" prop="alipayParam">
<el-input v-model="form.alipayParam" placeholder="请输入支付宝参数(nonsupport表示不支持)" />
</el-form-item>
<el-form-item label="微信参数" prop="wxpayParam">
<el-input v-model="form.wxpayParam" placeholder="请输入微信参数(nonsupport表示不支持)" />
</el-form-item>
<el-form-item label="支付网关" prop="gatewayUrl">
<el-input v-model="form.gatewayUrl" placeholder="请输入支付网关" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="PayConfig" lang="ts">
import { listAllPayConfig, getPayConfig, delPayConfig, addPayConfig, updatePayConfig, enablePay, topPay } from '@/api/net/payConfig';
import { PayConfigVO, PayConfigQuery, PayConfigForm } from '@/api/net/payConfig/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { net_pay_strategy } = toRefs<any>(proxy?.useDict('net_pay_strategy'));
const payConfigList = ref<PayConfigVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const payConfigFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: PayConfigForm = {
id: undefined,
name: undefined,
payStrategy: undefined,
mchNo: undefined,
privateKey: undefined,
publicKey: undefined,
alipayParam: undefined,
wxpayParam: undefined,
}
const data = reactive<PageData<PayConfigForm, PayConfigQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
name: undefined,
payStrategy: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询支付配置列表 */
const getList = async () => {
loading.value = true;
const res = await listAllPayConfig(queryParams.value);
payConfigList.value = res.data;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
payConfigFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: PayConfigVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加支付配置";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: PayConfigVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getPayConfig(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改支付配置";
}
/** 置顶排序操作 */
const handleTop = async (row?: PayConfigVO) => {
const data: PayConfigForm = {
id: row?.id
};
await topPay(data);
proxy?.$modal.msgSuccess("操作成功");
await getList();
}
/** 提交按钮 */
const submitForm = () => {
payConfigFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updatePayConfig(form.value).finally(() => buttonLoading.value = false);
} else {
await addPayConfig(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: PayConfigVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除支付配置编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delPayConfig(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('net/payConfig/export', {
...queryParams.value
}, `payConfig_${new Date().getTime()}.xlsx`)
}
/** 开启或关闭(使用 change 事件,失败时回滚状态) */
const handleEnableChange = async (row: PayConfigVO, val: any) => {
//
const flag = typeof val === 'string' ? Number(val) : val;
const rollback = flag === 1 ? 2 : 1;
try {
const data: PayConfigForm = {
id: row.id,
enableFlag: flag
};
await enablePay(data);
proxy?.$modal.msgSuccess('操作成功');
} catch (err) {
// UI
row.enableFlag = rollback as any;
proxy?.$modal.msgError?.('操作失败');
}
}
onMounted(() => {
getList();
});
</script>