fix:1,修改商户管理bug

main
YuanJian 2025-09-23 09:17:35 +08:00
parent 3416e62a1b
commit ae7f914b70
24 changed files with 436 additions and 83 deletions

View File

@ -5,4 +5,4 @@ VITE_APP_TITLE = 代理管理系统
VITE_APP_ENV = 'development'
# 代理管理系统/开发环境
VITE_APP_BASE_API = '/dev-api'
VITE_APP_BASE_API = '/ff-api'

BIN
dist.rar

Binary file not shown.

View File

@ -24,3 +24,13 @@ export function cleanOperlog() {
method: 'delete'
})
}
//用户转账日志
export function superTransferList(query) {
return request({
url: '/super/transfer/list',
method: 'get',
params: query
})
}

View File

@ -0,0 +1,32 @@
<template>
<el-input
v-model="code"
:maxlength="maxlength"
:placeholder="placeholder"
@input="onInput"
/>
</template>
<script setup>
import { ref, watch } from "vue"
const props = defineProps({
modelValue: String,
maxlength: { type: Number, default: 6 },
placeholder: { type: String, default: "请输入验证码" }
})
const emit = defineEmits(["update:modelValue"])
const code = ref(props.modelValue || "")
//
watch(() => props.modelValue, v => code.value = v || "")
//
const onInput = (val) => {
val = val.replace(/\D/g, "").slice(0, props.maxlength)
code.value = val
emit("update:modelValue", val)
}
</script>

View File

@ -94,7 +94,7 @@
<el-input v-model="passwordFormData.confirmPassword" placeholder="请确认新密码" type="password" show-password/>
</el-form-item>
<el-form-item label="谷歌验证码" prop="codeGoogle">
<el-input v-model="passwordFormData.codeGoogle" maxlength="6" placeholder="请输入谷歌验证码"/>
<CodeInput v-model="passwordFormData.codeGoogle" maxlength="6" placeholder="请输入谷歌验证码"/>
</el-form-item>
</el-form>
</el-scrollbar>
@ -117,6 +117,7 @@ import useAppStore from '@/store/modules/app'
import useSettingsStore from '@/store/modules/settings'
import usePermissionStore from '@/store/modules/permission'
import useUserStore from '@/store/modules/user'
import CodeInput from "@/components/CodeInput";
import { getLocalStorage } from "@/utils/auth";
import { updateUserProfile,getUserProfile,updateUserPwd } from "@/api/system/user";
@ -135,6 +136,9 @@ const nickName = ref(getLocalStorage('userInfo')?.nickName);
const dialogVisible = ref(false);
const rules = ref({
nickName:[
{ required: true, message: '请输入昵称', trigger: 'change' },
]
});
const formData = ref({
});

View File

@ -111,7 +111,7 @@
</el-input-number>
</el-form-item>
<el-form-item :label="t('谷歌验证码')" prop="googleCode">
<el-input v-model="form.googleCode" :maxlength="6" style="width: 260px;" :placeholder="t('请输入谷歌验证码')" />
<CodeInput v-model="form.googleCode" :maxlength="6" style="width: 260px;" :placeholder="t('请输入谷歌验证码')" />
</el-form-item>
<!-- <div class="label-scoreRatio">
@ -146,7 +146,7 @@
</el-dialog>
<!-- 详情 -->
<el-dialog :title="t('成本比例')" align-center v-model="openView" width="820px" append-to-body>
<el-dialog :title="t('编辑代理')" align-center v-model="openView" width="820px" append-to-body>
<el-scrollbar max-height="600px">
<el-form :model="form" ref="agentEditRef" :rules="rules" label-width="120px">
<el-form-item :label="t('代理账号')" prop="account">
@ -163,7 +163,7 @@
</el-input-number>
</el-form-item>
<el-form-item :label="t('谷歌验证码')" prop="googleCode">
<el-input v-model="form.googleCode" :maxlength="6" style="width: 260px;" :placeholder="t('请输入谷歌验证码')" />
<CodeInput v-model="form.googleCode" :maxlength="6" style="width: 260px;" :placeholder="t('请输入谷歌验证码')" />
</el-form-item>
<!-- <el-form-item :label="t('商户模式')" prop="tenantType">
<el-radio-group v-model="form.tenantType" :disabled="openView">
@ -210,6 +210,7 @@
import { superAgentList, createSuperAgent,updateSuperAgentResetPwd,updateSuperAgentEdit } from "@/api/super/agent";
import { selectPlatform,superPlatformSystem } from "@/api/agent";
import CustomSelect from '@/components/CustomSelect';
import CodeInput from '@/components/CodeInput';
import BaseSwitch from '@/components/BaseSwitch'
import CopyIcon from '@/components/CopyIcon'
import { ElMessage, ElMessageBox } from 'element-plus'
@ -455,6 +456,7 @@ function submitForm() {
walletAddress: form.value.walletAddress,
currencyAgreement: form.value.currencyAgreement,
proportion: form.value.proportion||0,
googleCode: form.value.googleCode,
}
createSuperAgent(dataObj).then(response => {
loadingButton.value = false;
@ -476,6 +478,7 @@ const submitFormEdit = () => {
walletAddress: form.value.walletAddress,
currencyAgreement: form.value.currencyAgreement,
profitRatio: form.value.proportion||0,
googleCode: form.value.googleCode,
}
updateSuperAgentEdit(dataObj).then(response => {
loadingButton.value = false;

View File

@ -73,7 +73,7 @@
{{ t(' (万法定货币=1万通用额度)') }}
</el-form-item>
<el-form-item :label="t('谷歌验证码')" prop="googleCode">
<el-input v-model="form.googleCode" :maxlength="6" style="width: 260px;" :placeholder="t('请输入谷歌验证码')" />
<CodeInput v-model="form.googleCode" :maxlength="6" style="width: 260px;" :placeholder="t('请输入谷歌验证码')" />
</el-form-item>
<div class="label-scoreRatio">
<span>{{ t('平台比例') }}</span>
@ -159,6 +159,7 @@
<script setup name="Agent">
import { listAgent, createAgent, selectPlatform,superPlatformSystem } from "@/api/agent";
import Crontab from '@/components/Crontab'
import CodeInput from '@/components/CodeInput'
import CustomSelect from '@/components/CustomSelect'
import { superCommonTimeZone } from "@/api/super/tenant.js";
import { parseTime } from '@/utils/ruoyi'; //

View File

@ -40,13 +40,13 @@
/>
</el-form-item>
<el-form-item :label="t('币种')" prop="currencyCode">
<CustomSelect v-if="showLoding1" v-model="queryParams.currencyCode" clearable filterable :options="sys_job_group" placeholder="请选择币种" style="width: 200px" />
<CustomSelect v-if="showLoding1" v-model="queryParams.currencyCode" clearable filterable :options="sys_job_group" placeholder="请选择币种" style="width: 200px" />
</el-form-item>
<!-- <el-form-item :label="t('游戏类型')" prop="gameType">
<CustomSelect v-model="queryParams.gameType" dictKey="ff_game_type" placeholder="请选择游戏类型" style="width: 200px" />
</el-form-item> -->
<el-form-item :label="t('平台类型')" prop="gameType">
<CustomSelect v-if="showLoding2" v-model="queryParams.gameType" :options="sys_job_statusSelect" placeholder="请选择平台类型" style="width: 200px" />
<CustomSelect v-if="showLoding2" v-model="queryParams.gameType" filterable :options="sys_job_statusSelect" placeholder="请选择平台类型" style="width: 200px" />
</el-form-item>
<el-form-item :label="t('游戏平台')" prop="platformCode">
<CustomSelect v-if="showLoding2" v-model="queryParams.platformCode" filterable :options="sys_job_status" placeholder="请选择平台类型" style="width: 200px" />
@ -58,9 +58,9 @@
<el-table v-loading="loading" class="c-table-main" :data="agentList" border>
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column :label="t('币种')" width="100" align="center" prop="currencyCode" />
<el-table-column :label="t('商户账号')" align="center" min-width="150" prop="tenantKey" :show-overflow-tooltip="true" />
<el-table-column :label="t('玩家账号')" align="center" min-width="120" prop="ourAccount" :show-overflow-tooltip="true" />
<el-table-column :label="t('三方玩家账号')" align="center" min-width="150" prop="account" :show-overflow-tooltip="true" />
<el-table-column :label="t('商户账号')" align="center" min-width="150" prop="tenantKey" />
<el-table-column :label="t('玩家账号')" align="center" min-width="120" prop="ourAccount" />
<el-table-column :label="t('三方玩家账号')" align="center" min-width="170" prop="account" />
<el-table-column :label="t('游戏平台')" min-width="100" align="center" prop="platformCode" />
<el-table-column :label="t('平台类型')" min-width="100" align="center" prop="gameType" >
<template #default="{row}">
@ -68,6 +68,7 @@
</template>
</el-table-column>
<el-table-column :label="t('游戏名称')" min-width="100" align="center" prop="gameName" />
<el-table-column :label="t('游戏ID')" min-width="130" align="center" prop="gameId" />
<el-table-column :label="t('投注额')" min-width="100" align="center" prop="betAmount" />
<el-table-column :label="t('有效投注额')" min-width="100" align="center" prop="betAmount" />
<el-table-column :label="t('输赢金额')" min-width="100" align="center" prop="payoffAmount" >
@ -122,6 +123,7 @@
import TableSearchDate from '@/components/TableSearchDate'
import Crontab from '@/components/Crontab'
import { parseTime } from '@/utils/ruoyi'; //
import { onMounted } from "vue";
const router = useRouter();
const { proxy } = getCurrentInstance();
const { ff_tenant_type, ff_tenant_status } = proxy.useDict("ff_tenant_type", "ff_tenant_status");
@ -311,9 +313,12 @@ const getsuperCommonPlatformTypeSelect = async () => {
});
}
getList();
getsuperCommonCurrencySelect();
getsuperCommonPlatformTypeSelect();
//
onMounted(() => {
getList();
getsuperCommonCurrencySelect();
getsuperCommonPlatformTypeSelect();
})
</script>
<style scoped lang="scss">

View File

@ -4,7 +4,14 @@
<template #left>
<table-search-date ref="searchDateRef" v-model:dateRange="dateRange" @dateChange="handleQuery" v-model:operateTimeType="operateTimeType"></table-search-date>
<select-input-form ref="selectInputFormRef" :queryParamsList="queryParamsList" :queryParams="queryParams"></select-input-form>
<!-- <el-form-item :label="t('操作类型')" prop="operationType">
<el-form-item prop="gameQuotaFlowId">
<el-input v-model="queryParams.gameQuotaFlowId" style="width: 240px" :placeholder="t('流水ID')" />
</el-form-item>
<el-form-item prop="auditAndOrderId">
<el-input v-model="queryParams.auditAndOrderId" style="width: 240px" :placeholder="t('请输入审计订单id或者系统订单id')" />
</el-form-item>
<el-form-item :label="t('操作类型')" prop="operationType">
<el-select v-if="operationTypeOption.length > 0" v-model="queryParams.operationType" clearable style="width:220px;" :placeholder="t('请选择')">
<el-option
v-for="dict in operationTypeOption"
@ -13,7 +20,7 @@
:value="dict.value"
></el-option>
</el-select>
</el-form-item> -->
</el-form-item>
</template>
<template #right>
</template>
@ -129,12 +136,6 @@
const queryParamsList = reactive([{
label: proxy.t('商户账号'),
value: 'tenantKey',
},{ //
label: proxy.t('流水ID'),
value: 'gameQuotaFlowId',
},{ //
label: proxy.t('审计订单ID'),
value: 'auditAndOrderId',
}])
const { queryParams, form, rules } = toRefs(data);
const dateRange = ref([]),operateTimeType = ref("day");

View File

@ -83,7 +83,7 @@
<el-input v-model="userInfos.walletAddress" disabled auto-complete="off" placeholder="请输入钱包地址" />
</el-form-item>
<el-form-item :label="t('谷歌验证码')" prop="googleCode">
<el-input v-model="form.googleCode" :maxlength="6" :placeholder="t('请输入谷歌验证码')" />
<CodeInput v-model="form.googleCode" :maxlength="6" :placeholder="t('请输入谷歌验证码')" />
</el-form-item>
</el-form>
<template #footer>
@ -98,7 +98,8 @@
<script setup name="Commission">
import { listCommission,getCommissionInfo,updateAgentCommission,updateAgentWithdraw } from "@/api/commission";
import Crontab from '@/components/Crontab'
import Crontab from '@/components/Crontab';
import CodeInput from '@/components/CodeInput';
import { parseTime } from '@/utils/ruoyi'; //
const router = useRouter();
const { proxy } = getCurrentInstance();

View File

@ -17,7 +17,7 @@
<div class="card-title">{{ card.title }}</div>
<div class="card-value">
<span class="" :style="card.cardClass =='pink' ? 'cursor: pointer;':card.cardClass =='green'?'cursor: pointer;':'cursor: pointer;'" @click="goPage(card.cardClass)">{{ card.value }}</span>
<span class="" :style="card.cardClass =='pink' ? 'cursor: pointer;border-bottom: 2px solid #fff;':card.cardClass =='green'?'cursor: pointer;border-bottom: 2px solid #fff;':'cursor: pointer;border-bottom: 2px solid #fff;'" @click="goPage(card.cardClass)">{{ card.value }}</span>
</div>
<div class="card-subtitle" v-html="card.subtitle" @click="handleClick"></div>
</div>
@ -239,7 +239,7 @@
min-height: 40px;
}
:deep(.card-subtitle a){
text-decoration: none !important;
text-decoration: underline!important;
}
.percentage {
font-size: 14px;

View File

@ -7,7 +7,7 @@
<CheckboxSelect v-model="platformCodes" dataType="platformSelectList" collapse-tags collapse-tags-tooltip filterable :placeholder="t('请选择平台')" style="width: 220px;"
@change="getHomeIndexs" @allSelect="getHomeIndexs"></CheckboxSelect>
<CheckboxSelect v-model="tenantKeys" dataType="tenantSelectList" collapse-tags collapse-tags-tooltip :placeholder="t('请选择商户')" style="width: 220px;"
<CheckboxSelect v-model="tenantKeys" dataType="tenantSelectList" filterable collapse-tags collapse-tags-tooltip :placeholder="t('请选择商户')" style="width: 220px;"
@change="getHomeIndexs" @allSelect="getHomeIndexs"></CheckboxSelect>
</div>
<el-row v-hasPermi="['home:data:admin']">

View File

@ -91,7 +91,7 @@
<el-dialog v-model="goodDialogVisible" style="margin-top: 45vh !important;" :title="t('温馨提示')" width="418" :before-close="handleClose">
<div style="width: 90%;margin-bottom: 20px;">{{ t('请用手机打开客服端Google身份验证器,输入验证码') }}</div>
<div class="">
<el-input v-model="gooleCode" :maxlength="6" style="width: 90%" :placeholder="t('验证码只能为数字')" />
<CodeInput v-model="gooleCode" :maxlength="6" style="width: 90%" :placeholder="t('验证码只能为数字')" />
</div>
<template #footer>
<div class="dialog-footer">
@ -111,7 +111,7 @@
</div>
<el-form ref="authenticatorRef" :model="authenticatorForm" :rules="authenticatorRules">
<el-form-item label="谷歌验证码" prop="authenticatorCode">
<el-input v-model="authenticatorForm.authenticatorCode" :maxlength="6" :digit="2" style="width: 100%;height: 36px;" :placeholder="t('验证码只能为数字')" />
<CodeInput v-model="authenticatorForm.authenticatorCode" :maxlength="6" :digit="2" style="width: 100%;height: 36px;" :placeholder="t('验证码只能为数字')" />
</el-form-item>
</el-form>
<div class="" style="margin-top: 20px;margin-bottom: 20px;">
@ -140,7 +140,7 @@ import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt";
import useUserStore from '@/store/modules/user';
import { i18nScope } from "@/languages"
import NumberInput from "@/components/NumberInput";
import CodeInput from "@/components/CodeInput";
import Vcode from "vue3-puzzle-vcode";
import { setToken } from '@/utils/auth'
import {selectListLang} from '@/api/super/agent'

View File

@ -111,7 +111,7 @@
{{ t('如需扣余额,则输入负数,例如:-10.50') }}
</div>
<el-form-item :label="t('谷歌验证码')" prop="googleCode">
<el-input v-model="formAdjustment.googleCode" :maxlength="6" :placeholder="t('请输入谷歌验证码')" />
<CodeInput v-model="formAdjustment.googleCode" :maxlength="6" :placeholder="t('请输入谷歌验证码')" />
</el-form-item>
<el-form-item :label="t('备注')" prop="remark">
<el-input type="textarea" rows="4" v-model="formAdjustment.remark" :placeholder="t('请输入备注')" />
@ -131,6 +131,7 @@ import { nextTick, ref } from "vue";
import { getLocalStorage } from "@/utils/auth";
import { ElMessage, ElMessageBox } from 'element-plus'
import CustomSelect from '@/components/CustomSelect'
import CodeInput from '@/components/CodeInput';
import NumberInput from '@/components/NumberInput'
import { reactify } from "@vueuse/core";
import { number } from "echarts";

View File

@ -28,7 +28,7 @@
</div>
</el-form-item>
<el-form-item :label="t('谷歌验证码')" prop="googleCode">
<el-input v-model="formAdjustment.googleCode" :maxlength="6" :placeholder="t('请输入谷歌验证码')" />
<CodeInput v-model="formAdjustment.googleCode" :maxlength="6" :placeholder="t('请输入谷歌验证码')" />
</el-form-item>
<el-form-item :label="t('备注')" prop="remark">
<el-input type="textarea" rows="4" v-model="formAdjustment.remark" :placeholder="t('请输入备注')" />
@ -48,6 +48,7 @@ import { getLocalStorage } from "@/utils/auth";
import { ElMessage, ElMessageBox } from 'element-plus'
import CustomSelect from '@/components/CustomSelect'
import NumberInput from '@/components/NumberInput'
import CodeInput from '@/components/CodeInput'
import { reactify } from "@vueuse/core";
import { number } from "echarts";
const { proxy } = getCurrentInstance()

View File

@ -69,7 +69,8 @@
<el-table-column :label="t('状态')" align="center">
<template #default="{row}">
<!-- <dict-tag :options="ff_tenant_status" :value="String(scope.row.tenantStatus)" /> -->
<base-switch v-model="row.tenantStatus" :active-value="true" :inactive-value="false"
<base-switch v-model="row.tenantStatus" :active-text="t('开启')"
:inactive-text="t('关闭')" :active-value="true" :inactive-value="false"
:before-change="() => beforeSwitchChange(row, 'tenantStatus')" v-hasPermi="['super:tenant:switch']" />
</template>
</el-table-column>
@ -296,12 +297,12 @@ currencySelectArr.value = res.map(item => {
/** 查询列表 */
function getList() {
loading.value = true;
let queryParams={
let query={
pageNum: 1,
pageSize: 10,
tenantKey: "",
}
superTenantList(queryParams).then(response => {
superTenantList(queryParams.value).then(response => {
agentList.value = response.rows;
total.value = response.total;
loading.value = false;

View File

@ -12,13 +12,13 @@
@keyup.enter="handleQuery"
/>
</el-form-item> -->
<el-form-item :label="t('商户账号')" prop="tenantKey">
<el-form-item :label="t('商户账号')" v-hasPermi="['super:tenant:list']" prop="tenantKey">
<el-select
v-model="queryParams.tenantKey"
filterable
clearable
reserve-keyword
placeholder="请输入租户Key搜索"
placeholder="请输入商户账号搜索"
:remote-method="loadOptions"
:loading="loadingSelect"
style="width: 240px"
@ -116,12 +116,12 @@
</template>
</el-table-column>
<!-- <el-table-column :label="t('前缀')" width="100" align="center" prop="tenantSn" /> -->
<el-table-column :label="t('玩家账号')" align="center" prop="memberAccount" min-width="120px" :show-overflow-tooltip="true" >
<el-table-column :label="t('玩家账号')" align="center" prop="memberAccount" min-width="180px" >
<template #default="{row}">
{{ row.memberAccount? row.memberAccount : '--' }}
</template>
</el-table-column>
<el-table-column :label="t('游戏账号')" align="center" prop="gameAccount" min-width="130px" :show-overflow-tooltip="true" >
<el-table-column :label="t('游戏账号')" align="center" prop="gameAccount" min-width="180px" >
<template #default="{row}">
{{ row.gameAccount? row.gameAccount : '--' }}
</template>
@ -132,7 +132,6 @@
{{ row.platformName? row.platformName : '--' }}
</template>
</el-table-column>
<el-table-column align="center" prop="exchangeMoney" min-width="110px">
<template #header>
{{ t('转账金额') }}
@ -279,6 +278,7 @@
import IconTips from '@/components/IconTips'
import { parseTime } from '@/utils/ruoyi'; //
import { nextTick, onMounted } from "vue";
import auth from '@/plugins/auth'
import { get } from "@vueuse/core";
const router = useRouter();
const { proxy } = getCurrentInstance();
@ -552,7 +552,9 @@ const loadMore = async () => {
//
onMounted(() => {
getList();
loadOptions('');
if (auth.hasPermi('super:tenant:list') == true){
loadOptions('');
}
getsuperCommonCurrencySelect();
getSuperCommonOperationTypes();
getsuperCommonPlatformTypeSelect();

View File

@ -0,0 +1,284 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="订单编号" prop="orderId">
<el-input
v-model="queryParams.orderId"
placeholder="请输入订单编号"
clearable
style="width: 240px;"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="交易ID" prop="transactionId">
<el-input
v-model="queryParams.transactionId"
placeholder="请输入交易ID"
clearable
style="width: 240px;"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="操作时间" style="width: 308px">
<el-date-picker
v-model="dateRange"
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-date-picker>
</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-table ref="operlogRef" v-loading="loading" :data="operlogList">
<el-table-column label="订单编号" align="center" prop="orderId" min-width="150"/>
<el-table-column label="交易ID" align="center" prop="transactionId" min-width="150"/>
<el-table-column label="兑换货币" align="center" prop="exchangeMoney" min-width="200">
<template #default="{row}">
<el-popover :width="260" trigger="hover">
{{ row.exchangeMoney }}
<template #reference>
<div class="two-line-clamp">{{ row.exchangeMoney }}</div>
</template>
</el-popover>
</template>
</el-table-column>
<el-table-column label="org请求" align="center" prop="orgRequest" min-width="200">
<template #default="{row}">
<el-popover :width="260" trigger="hover">
{{ row.orgRequest }}
<template #reference>
<div class="two-line-clamp">{{ row.orgRequest }}</div>
</template>
</el-popover>
</template>
</el-table-column>
<el-table-column label="请求参数" align="center" prop="request" min-width="200">
<template #default="{row}">
<el-popover :width="260" trigger="hover">
{{ row.request }}
<template #reference>
<div class="two-line-clamp">{{ row.request }}</div>
</template>
</el-popover>
</template>
</el-table-column>
<el-table-column label="返回参数" align="center" min-width="200" prop="response" >
<template #default="{row}">
<el-popover :width="260" trigger="hover">
{{ row.response }}
<template #reference>
<div class="two-line-clamp">{{ row.response }}</div>
</template>
</el-popover>
</template>
</el-table-column>
<el-table-column label="交换类型" align="center" prop="exchangeType">
<template #default="{row}">
<span v-if="row.exchangeType == 1">{{ t('') }}</span>
<span v-if="row.exchangeType == 2">{{ t('') }}</span>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleView(scope.row, scope.index)" v-hasPermi="['monitor:operlog:query']"></el-button>
</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-dialog title="用户转账日志详细" align-center v-model="open" width="800px" append-to-body>
<el-scrollbar max-height="700px">
<el-form :model="form" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="订单编号:">{{ form.orderId }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="交易ID:"
>{{ form.transactionId }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="交换类型:">
<span v-if="form.exchangeType == 1">{{ t('') }}</span>
<span v-if="form.exchangeType == 2">{{ t('') }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建时间">{{ parseTime(form.createTime) }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="兑换货币:">
<div style="width: 100%;">
{{ form.exchangeMoney }}
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="org请求">
<div style="width: 100%;">
{{ form.orgRequest }}
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="请求参数:">
<div style="width: 100%;">
{{ form.request }}
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-scrollbar>
<template #footer>
<div class="dialog-footer">
<el-button @click="open = false"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Operlog">
import { superTransferList, delOperlog, cleanOperlog } from "@/api/monitor/operlog";
const { proxy } = getCurrentInstance();
const { sys_oper_type, sys_common_status } = proxy.useDict("sys_oper_type","sys_common_status");
const operlogList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const dateRange = ref([]);
const defaultSort = ref({ prop: "operTime", order: "descending" });
const data = reactive({
form: {},
queryParams: {
pageNo: 1,
pageSize: 10,
}
});
const { queryParams, form } = toRefs(data);
/** 查询登录日志 */
function getList() {
loading.value = true;
superTransferList(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
operlogList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}
/** 操作日志类型字典翻译 */
function typeFormat(row, column) {
return proxy.selectDictLabel(sys_oper_type.value, row.businessType);
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
dateRange.value = [];
proxy.resetForm("queryRef");
queryParams.value.pageNum = 1;
proxy.$refs["operlogRef"].sort(defaultSort.value.prop, defaultSort.value.order);
handleQuery();
}
/** 多选框选中数据 */
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.operId);
multiple.value = !selection.length;
}
/** 排序触发事件 */
function handleSortChange(column, prop, order) {
queryParams.value.orderByColumn = column.prop;
queryParams.value.isAsc = column.order;
getList();
}
/** 详细按钮操作 */
function handleView(row) {
open.value = true;
form.value = row;
}
/** 删除按钮操作 */
function handleDelete(row) {
const operIds = row.operId || ids.value;
proxy.$modal.confirm('是否确认删除日志编号为"' + operIds + '"的数据项?').then(function () {
return delOperlog(operIds);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}
/** 清空按钮操作 */
function handleClean() {
proxy.$modal.confirm("是否确认清空所有操作日志数据项?").then(function () {
return cleanOperlog();
}).then(() => {
getList();
proxy.$modal.msgSuccess("清空成功");
}).catch(() => {});
}
/** 导出按钮操作 */
function handleExport() {
proxy.download("monitor/operlog/export",{
...queryParams.value,
}, `config_${new Date().getTime()}.xlsx`);
}
getList();
</script>
<style scoped lang="scss">
.two-line-clamp {
width: 100%;
height: auto;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
text-overflow: ellipsis;
flex-wrap: nowrap;
line-height: 23px;
}
</style>

View File

@ -11,7 +11,10 @@
<template #default="scope">{{ parseTime(scope.row.createTime) }}</template>
</el-table-column>
<el-table-column :label="t('更新时间')" align="center" prop="updateTime" :show-overflow-tooltip="true">
<template #default="scope">{{ parseTime(scope.row.updateTime) }}</template>
<template #default="scope">
<span v-if="scope.row.updateTime">{{ parseTime(scope.row.updateTime) }}</span>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column :label="t('操作')" align="center">
<template #default="scope">
@ -58,7 +61,7 @@
<el-form-item :label="t('创建时间')" prop="createTime">
<el-input v-model="form.createTime" disabled :placeholder="t('请输入创建时间')" />
</el-form-item>
<el-form-item :label="t('更新时间')" prop="updateTime">
<el-form-item :label="t('更新时间')" v-if="form.updateTime" prop="updateTime">
<el-input v-model="form.updateTime" disabled :placeholder="t('请输入更新时间')" />
</el-form-item>
</el-form>

View File

@ -180,7 +180,7 @@
<div style="margin-bottom: 10px;display: flex;justify-content: space-between;" v-if="rowOpenRevise.id != ''">
<div>{{ t('禁用币种') }}</div>
<div>
<CustomSelect v-model="currencyCodes" :options="currencyCodesOptions" filterable placeholder="请选择币种" style="width: 200px;margin-right: 10px;" />
<CheckboxSelect v-model="currencyCodes" collapse-tags collapse-tags-tooltip :options="currencyCodesOptions" filterable placeholder="请选择币种" style="width: 200px;margin-right: 10px;" />
<el-button type="primary" @click="addCurrency">{{ t('') }}</el-button>
</div>
</div>
@ -234,6 +234,7 @@
import { parseTime } from '@/utils/ruoyi'; //
import NumberInput from '@/components/NumberInput'
import CustomSelect from '@/components/CustomSelect'
import CheckboxSelect from '@/components/CheckboxSelect'
import BaseSwitch from '@/components/BaseSwitch'
import SelectInputForm from '@/components/SelectInputForm';
import { id } from "element-plus/es/locales.mjs";
@ -246,7 +247,7 @@ import { nextTick, ref } from "vue";
currencyCodesOptions.value = resData.map(item => {
return { label:`${item.currencyName}(${item.currencyCode})`, value: item.currencyCode }
})
const currencyCodes = ref('VND');
const currencyCodes = ref(['VND']);
const loadingButton = ref(false);
const agentList = ref([]);
const open = ref(false);
@ -404,27 +405,28 @@ const handleDelete = (row) => {
rowOpenRevise.gameCurrencies.splice(index, 1)
}
}
//
//
const addCurrency = () => {
// gameId
const gameId = rowOpenRevise.gameId
//
const newItem = {
gameId,
currencyCode: currencyCodes.value
}
// currencyCodes
currencyCodes.value.forEach(code => {
const newItem = {
gameId,
currencyCode: code
}
// gameId + currencyCode
const exists = rowOpenRevise.gameCurrencies.some(
item => item.gameId == gameId && item.currencyCode == currencyCodes.value
)
//
const exists = rowOpenRevise.gameCurrencies.some(
item => item.gameId == gameId && item.currencyCode == code
)
if (!exists) {
rowOpenRevise.gameCurrencies.push(newItem)
} else {
proxy.$modal.msgSuccess(proxy.t('已存在相同的币种记录'));
}
if (!exists) {
rowOpenRevise.gameCurrencies.push(newItem)
} else {
proxy.$modal.msgSuccess(proxy.t(`币种 ${code} 已存在`))
}
})
}
//
@ -533,7 +535,7 @@ const switchBeforeChange = () => {
const handleOpenRevise = (row) => {
Object.assign(rowOpenRevise, row);
openRevise.value = true;
currencyCodes.value = 'VND';
currencyCodes.value = ['VND'];
oldForm.value = JSON.stringify(rowOpenRevise);
}

View File

@ -90,7 +90,7 @@
</span>
</div>
</el-descriptions-item>
<el-descriptions-item label-width="150" label-align="right" :label="t('币种')">
<el-descriptions-item label-width="150" label-align="right" :label="t('支持的币种')">
<div style="width: 100%;display: flex;flex-wrap: wrap;">
<span v-for="(item,index) in Object.keys(formInterface.currencyInfo)">
{{ item }}<span v-if="index != Object.keys(formInterface.currencyInfo).length - 1">,</span>

View File

@ -31,8 +31,7 @@
<template #default="{ row }">
<div v-if="row.sysUsers.length > 0">
<span v-for="(item, index) in row.sysUsers.slice(0, 5)" :key="item.userId" @click="handleUserListClick(row)" style="color: rgb(64, 158, 255);cursor: pointer;">
{{ item.userName }}
<span v-if="index < Math.min(5, row.sysUsers.length) - 1">,</span>
{{ item.userName }}<span v-if="index < Math.min(5, row.sysUsers.length) - 1">,</span>
</span>
<span v-if="row.sysUsers.length > 5"> ...</span>
</div>
@ -387,6 +386,8 @@ function getList() {
roleList.value = response.rows;
total.value = response.total;
loading.value = false;
}).catch(() => {
loading.value = false;
});
}

View File

@ -7,7 +7,7 @@
</template>
<el-form :model="formGoogle" :rules="rulesGoogle" ref="googleRef" label-width="130px">
<el-form-item label="Google验证码" prop="googleCode">
<el-input v-model="formGoogle.googleCode" placeholder="请输入您的Google验证码" maxlength="6" />
<CodeInput v-model="formGoogle.googleCode" placeholder="请输入您的Google验证码" maxlength="6" />
</el-form-item>
</el-form>
<template #footer>
@ -22,6 +22,7 @@
</template>
<script setup>
import { nextTick, ref } from "vue";
import CodeInput from "@/components/CodeInput";
const { proxy } = getCurrentInstance()
const emits = defineEmits(['submit', 'update:show']) //
const props = defineProps({ //

View File

@ -24,25 +24,25 @@ export default defineConfig(({ mode, command }) => {
port: 80,
host: true,
open: true,
// proxy: {
// '/dev-api': {
// target: 'http://192.168.50.234:9080',
// // target: 'http://192.168.50.11:9080',
// // target: 'http://192.168.50.178:8080',
// // target: 'http://192.168.50.99:8080',
// changeOrigin: true,
// rewrite: (p) => p.replace(/^\/dev-api/, '')
// }
// },
proxy: {
'/dev-api': {
target: 'http://192.168.50.233:9080',
// target: 'http://192.168.50.11:9080',
// target: 'http://192.168.50.178:8080',
// target: 'http://192.168.50.99:8080',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '')
'/ff-api': {
target: 'https://apiadmin.tt-gaming.com', // 线上接口地址
changeOrigin: true, // 是否允许跨域
pathRewrite: {
'^/ff-api': '' // 如果你需要去掉前缀,例如将 /api/xxx 替换为 /xxx
}
}
},
// proxy: {
// '/ff-api': {
// target: 'https://apiadmin.tt-gaming.com', // 线上接口地址
// changeOrigin: true, // 是否允许跨域
// pathRewrite: {
// '^/ff-api': '' // 如果你需要去掉前缀,例如将 /api/xxx 替换为 /xxx
// }
// }
// }
}
},
css: {
postcss: {