This commit is contained in:
2025-07-03 16:49:28 +08:00
parent bc67220ef1
commit 3da5817404
7 changed files with 401 additions and 204 deletions

View File

@ -44,3 +44,11 @@ export function delTmMemberPlatform(data) {
})
}
//修改TmMemberPlatform的字符
export function tmMemberPlatformChangeChar(data){
return request({
url: '/api/v1/tm-member-platform/change-chars',
method: 'post',
data: data
})
}

View File

@ -1,78 +1,86 @@
import request from '@/utils/request'
import request from "@/utils/request";
// 查询TmMember列表
export function listTmMember(query) {
return request({
url: '/api/v1/tm-member',
method: 'get',
params: query
})
url: "/api/v1/tm-member",
method: "get",
params: query,
});
}
// 查询TmMember详细
export function getTmMember(id) {
return request({
url: '/api/v1/tm-member/' + id,
method: 'get'
})
url: "/api/v1/tm-member/" + id,
method: "get",
});
}
// 新增TmMember
export function addTmMember(data) {
return request({
url: '/api/v1/tm-member',
method: 'post',
data: data
})
url: "/api/v1/tm-member",
method: "post",
data: data,
});
}
// 修改TmMember
export function updateTmMember(data) {
return request({
url: '/api/v1/tm-member/' + data.id,
method: 'put',
data: data
})
url: "/api/v1/tm-member/" + data.id,
method: "put",
data: data,
});
}
// 删除TmMember
export function delTmMember(data) {
return request({
url: '/api/v1/tm-member',
method: 'delete',
data: data
})
url: "/api/v1/tm-member",
method: "delete",
data: data,
});
}
// 获取API Key
export function getMyKey() {
return request({
url: '/api/v1/tm-member/api-key',
method: 'get'
})
url: "/api/v1/tm-member/api-key",
method: "get",
});
}
// 获取使用量统计
export function getTranslateDataStatistic() {
return request({
url: '/api/v1/translate/datastatistics',
method: 'get'
})
url: "/api/v1/translate/datastatistics",
method: "get",
});
}
// 字符充值
export function tmMemberRecharge(data) {
// export function tmMemberRecharge(data) {
// return request({
// url: '/api/v1/tm-member/recharge',
// method: 'post',
// data: data
// })
// }
export function tmMemberManageRecharge(data) {
return request({
url: '/api/v1/tm-member/recharge',
method: 'post',
data: data
})
url: "/api/v1/tm-member/manager-recharge",
method: "post",
data: data,
});
}
export function changeTmMemberStatus(data) {
return request({
url: '/api/v1/tm-member/status',
method: 'put',
data: data
})
url: "/api/v1/tm-member/status",
method: "put",
data: data,
});
}

View File

@ -79,6 +79,9 @@
:style="{ width: '100%' }"
/>
</el-form-item>
<el-form-item label="默认赠送字符数">
<el-input v-model="form.tm_gift_characters" placeholder="请输入默认赠送字符数"></el-input>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
@ -121,7 +124,8 @@ export default {
sys_user_initPassword: undefined,
sys_index_skinName: undefined,
sys_index_sideTheme: undefined,
trx_receive_address: undefined
trx_receive_address: undefined,
tm_gift_characters: undefined
},
rules: {
sys_app_name: [{
@ -144,7 +148,8 @@ export default {
message: '请选择侧栏主题',
trigger: 'change'
}],
trx_receive_address: [{ required: true, message: '请输入TRX收货地址', trigger: 'blur' }]
trx_receive_address: [{ required: true, message: '请输入TRX收货地址', trigger: 'blur' }],
tm_gift_characters: [{ required: true, message: '请输入默认赠送字符数', trigger: 'blur' }]
},
otherRules: {

View File

@ -3,23 +3,13 @@
<template #wrapper>
<el-card class="box-card">
<el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
<el-form-item label="用户昵称" prop="nickName"><el-input
v-model="queryParams.nickName"
placeholder="请输入用户昵称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
<el-form-item label="用户昵称" prop="nickName"><el-input v-model="queryParams.nickName" placeholder="请输入用户昵称"
clearable size="small" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" clearable placeholder="请选择">
<el-option
v-for="dict in statusOptions"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-option v-for="dict in statusOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -49,23 +39,33 @@
<el-table v-loading="loading" :data="tmMemberList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="Id" align="center" prop="userId" width="80" />
<el-table-column label="用户昵称" align="center" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column label="Key" align="center" prop="apiKey" />
<!-- <el-table-column label="总字符" align="center" prop="totalChars" /> -->
<el-table-column label="剩余字符" align="center" prop="remainChars">
<el-table-column label="已用字符" align="center">
<template slot-scope="scope">
<div v-for="(item,index) in scope.row.platforms" :key="'remains'+index">{{ item.name }}{{ item.remainChars }}</div>
<div v-for="(item, index) in scope.row.usedPlatform" :key="'used' + index">
{{ item.name }}{{ item.totalChars }}
<!-- <el-button v-permisaction="['admin:tmMember:changeChars']"
size="mini" type="text" icon="el-icon-edit" class="char-btn">修改
</el-button> -->
</div>
</template>
</el-table-column>
<el-table-column label="状态" align="center" :show-overflow-tooltip="true">
<el-table-column label="剩余字符" align="center" prop="remainChars">
<template slot-scope="scope">
<el-switch
v-if="checkPermisAction(['admin:tmMember:changeStatus'])"
v-model="scope.row.status"
:active-value="1"
:inactive-value="2"
@change="handleStatusChange(scope.row)"
/>
<div v-for="(item, index) in scope.row.platforms" :key="'remains' + index">{{ item.name }}{{
item.totalChars }} <el-button v-permisaction="['admin:tmMember:changeChars']" size="mini" type="text"
icon="el-icon-edit" class="char-btn"
@click="handleChangeChar(item, scope.row.nickName, 1)">修改</el-button>
</div>
</template>
</el-table-column>
<el-table-column label="状态" align="center" width="80px">
<template slot-scope="scope">
<el-switch v-if="checkPermisAction(['admin:tmMember:changeStatus'])" v-model="scope.row.status"
:active-value="1" :inactive-value="2" @change="handleStatusChange(scope.row)" />
<div v-else>
<el-tag v-if="scope.row.status === 1" type="success">启用</el-tag>
<el-tag v-else type="danger">禁用</el-tag>
@ -73,18 +73,18 @@
<!-- -->
</template>
</el-table-column>
<el-table-column label="用户状态" align="center">
<el-table-column label="用户状态" align="center" width="100">
<template slot-scope="scope">
<el-tag v-if="scope.row.userStatus === 2" type="success">正常</el-tag>
<el-tag v-else type="danger">禁用</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" prop="createdAt" sortable="custom" width="155">
<el-table-column label="创建时间" prop="createdAt" sortable="custom" width="150">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120">
<template slot-scope="scope">
<!-- <el-popconfirm class="delete-popconfirm" title="确认要修改吗?" confirm-button-text="修改"
@confirm="handleUpdate(scope.row)">
@ -98,19 +98,10 @@
type="text" icon="el-icon-delete">删除
</el-button>
</el-popconfirm> -->
<el-popconfirm
class="delete-popconfirm"
title="确认要充值吗?"
confirm-button-text="充值"
@confirm="handleRecharge(scope.row)"
>
<el-button
slot="reference"
v-permisaction="['admin:tmMember:recharge']"
size="mini"
type="text"
icon="el-icon-edit"
>充值
<el-popconfirm class="delete-popconfirm" title="确认要充值吗?" confirm-button-text="充值"
@confirm="handleRecharge(scope.row)">
<el-button slot="reference" v-permisaction="['admin:tmMember:recharge']" size="mini" type="text"
icon="el-icon-edit">充值
</el-button>
</el-popconfirm>
@ -118,13 +109,8 @@
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageIndex"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageIndex"
:limit.sync="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改对话框 -->
<!-- <el-dialog :title="title" :visible.sync="open" width="500px">
@ -165,13 +151,14 @@
</div>
</el-dialog> -->
<tm-member-recharge
:id="rechargeId"
v-model="showRecharge"
:api-key="showApiKey"
:nick-name="showNickName"
@close="handleRechargeClose"
/>
<tm-member-recharge :userId="showRechargeData.UserId" v-model="showRecharge" :memberId="showRechargeData.memberId"
:api-key="showRechargeData.showApiKey" :nick-name="showRechargeData.showNickName" @close="handleRechargeClose" />
<!-- <tm-member-change :visible.sync="showChange" :memberId="showCangeData.memberId"
:userId="showCangeData.userId"
:userName="showCangeData.nickName" :platformName="showCangeData.platformName"
:totalNum="showCangeData.totalNum" :platformId="showCangeData.platformId"
@close="handleChangeCharClose" /> -->
</el-card>
</template>
</BasicLayout>
@ -181,11 +168,13 @@
import { addTmMember, delTmMember, getTmMember, listTmMember, updateTmMember, changeTmMemberStatus } from '@/api/admin/tm-member'
import TmMemberRecharge from './tm-member-recharge.vue'
import checkPermisAction from '@/utils/permisaction'
import TmMemberChange from './tm-member-change.vue'
export default {
name: 'TmMember',
components: {
TmMemberRecharge
TmMemberRecharge,
TmMemberChange
},
data() {
return {
@ -205,8 +194,20 @@ export default {
open: false,
isEdit: false,
showRecharge: false,
showApiKey: undefined,
showNickName: undefined,
showRechargeData: {
showApiKey: undefined,
showNickName: undefined,
memberId: undefined,
userId: undefined,
},
showChange: false,
showCangeData: {
nickName: undefined,
platformId: undefined,
platformName: undefined,
totalNum: undefined,
type: undefined,
},
rechargeId: undefined,
// 类型数据字典
typeOptions: [],
@ -282,10 +283,10 @@ export default {
}
this.resetForm('form')
},
getImgList: function() {
getImgList: function () {
this.form[this.fileIndex] = this.$refs['fileChoose'].resultList[0].fullUrl
},
fileClose: function() {
fileClose: function () {
this.fileOpen = false
},
areaCodeFormat(row) {
@ -321,7 +322,7 @@ export default {
handleUpdate(row) {
this.reset()
const id =
row.id || this.ids
row.id || this.ids
getTmMember(id).then(response => {
this.form = response.data
this.open = true
@ -330,7 +331,7 @@ export default {
})
},
/** 提交按钮 */
submitForm: function() {
submitForm: function () {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.id !== undefined) {
@ -365,7 +366,7 @@ export default {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
}).then(function () {
return delTmMember({ 'ids': Ids })
}).then((response) => {
if (response.code === 200) {
@ -375,13 +376,16 @@ export default {
} else {
this.msgError(response.msg)
}
}).catch(function() {
}).catch(function () {
})
},
handleRecharge(row) {
this.rechargeId = row.id
this.showApiKey = row.apiKey
this.showNickName = row.nickName
this.showRechargeData={
UserId: row.userId,
memberId: row.id,
showApiKey: row.apiKey,
showNickName: row.nickName
}
this.showRecharge = true
},
handleRechargeClose() {
@ -404,7 +408,31 @@ export default {
.finally(() => {
this.loading = false
})
},
handleChangeChar(row, nickName, type) {
this.showCangeData = {
nickName: nickName,
platformId: row.platformId,
platformName: row.name,
memberId: row.memberId,
userId: row.userId,
totalNum: row.totalChars,
type: type
}
this.showChange = true
},
// 修改字符关闭事件
handleChangeCharClose() {
this.getList()
}
}
}
</script>
<style scoped>
.char-btn {
margin-left: 5px;
}
</style>

View File

@ -0,0 +1,119 @@
<template>
<el-dialog title="字符充值" :visible.sync="visible" width="500px" @close="handleClose" @open="handleOpen">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="用户" prop="userName">{{ userName }}</el-form-item>
<el-form-item label="平台名称" prop="platformName">
{{ platformName }}
</el-form-item>
<el-form-item label="剩余字符数量" prop="changeNum">
<el-input v-model.number="form.changeNum" placeholder="请输入剩余字符数量"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" :loading="loading" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { tmMemberPlatformChangeChar } from '@/api/admin/tm-member-platform'
export default {
name: 'TmMemberChange',
props: {
type:{
type:Number,
default:1
},
memberId: {
type: Number,
required: true,
default: 0
},
userName: {
type: String,
default: ''
},
platformId:{
type:Number,
default:0
},
platformName: {
type: String,
default: ''
},
totalNum: {
type: Number,
default: 0
},
visible: {
type: Boolean,
default: false
}
},
data() {
return {
form: {
memberId: undefined,
platformId: undefined,
changeNum: 0
},
rules: {
changeNum: [
{ required: true, message: '请输入剩余字符数量', trigger: 'blur' }]
},
loading: false
}
},
// watch:{
// totalNum(newVal,oldVal){
// if(newVal!==oldVal){
// this.form.changeNum=newVal
// }
// }
// },
methods: {
resetForm() {
this.form = {
memberId: undefined,
platformId: undefined,
changeNum: 0
}
},
handleOpen() {
this.form.changeNum = this.totalNum
},
handleClose() {
this.resetForm()
this.$emit('update:visible', false)
this.$emit('close')
},
cancel() {
this.loading = false
this.handleClose()
},
submitForm() {
this.$refs['form'].validate(valid => {
if (valid) {
this.loading = true
this.form.memberId = this.memberId
this.form.platformId = this.platformId
this.form.type=this.type
tmMemberPlatformChangeChar(this.form).then(response => {
if (response.code === 200) {
this.$message.success('修改成功')
this.handleClose()
} else {
this.$message.error(response.message)
}
})
.finally(() => {
this.loading = false
})
}
})
}
}
}
</script>

View File

@ -1,114 +1,141 @@
<template>
<el-dialog title="字符充值" :visible.sync="value" width="500px" @close="handleClose" @open="handleOpen">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="用户昵称" prop="nickName">
{{ nickName }}
</el-form-item>
<el-form-item label="翻译平台" prop="platformId">
<el-select v-model="form.platformId" placeholder="请选择翻译平台">
<el-option v-for="item in platformList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="apiKey">
{{ apiKey }}
</el-form-item>
<el-form-item label="充值字符(万)" prop="totalChars">
<el-input v-model.number="form.totalChars" placeholder="充值字符(万)" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" :loading="loading" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog title="字符充值" :visible.sync="value" width="500px" @close="handleClose" @open="handleOpen">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="用户昵称" prop="nickName">
{{ nickName }}
</el-form-item>
<el-form-item label="翻译平台" prop="platformId">
<el-select v-model="form.platformId" placeholder="请选择翻译平台">
<el-option v-for="item in platformList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="apiKey">
{{ apiKey }}
</el-form-item>
<el-form-item label="充值金额(U)" prop="amount">
<el-input v-model.number="form.amount" placeholder="充值金额(U)" />
</el-form-item>
<el-form-item label="充值字符(万)" prop="totalChars">
<el-input v-model.number="form.totalChars" placeholder="充值字符(万)" />
</el-form-item>
<el-form-item label="过期时间(天)" prop="expireDays">
<el-input v-model.number="form.expireDays" placeholder="过期时间(天)" />
</el-form-item>
<el-form-item label="收款渠道">
<el-select v-model="form.payChannel" clearable placeholder="请选择收款渠道">
<el-option label="TRX" value="TRX" />
</el-select>
</el-form-item>
<el-form-item label="收款地址">
<el-input v-model="form.payAddress" placeholder="收款地址" />
</el-form-item>
<el-form-item label="交易hash">
<el-input v-model="form.txHash" placeholder="交易hash" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" :loading="loading" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { tmMemberRecharge } from '@/api/admin/tm-member'
import { tmMemberManageRecharge } from '@/api/admin/tm-member'
import { listTmPlatform } from '@/api/admin/tm-platform'
export default {
name: 'TmMemberRecharge',
props: {
value: {
type: Boolean,
default: false
},
apiKey: {
type: String,
default: ''
},
nickName: {
type: String,
default: ''
},
id: {
type: Number,
default: 0
}
},
data() {
return {
loading: false,
form: {},
remainChars: 0,
rules: {
platformId: [{ required: true, message: '请选择翻译平台', trigger: 'blur' }],
totalChars: [{ required: true, message: '请输入充值字符(万)', trigger: 'blur' }]
},
platformList: []
}
},
methods: {
handleOpen() {
this.getPlatform()
},
getPlatform() {
listTmPlatform({ pageIndex: 1, pageSize: 1000 }).then(response => {
if (response.code === 200) {
this.platformList = response.data.list
name: 'TmMemberRecharge',
props: {
value: {
type: Boolean,
default: false
},
apiKey: {
type: String,
default: ''
},
nickName: {
type: String,
default: ''
},
memberId: {
type: Number,
default: 0
},
userId: {
type: Number,
default: 0
}
})
},
resetForm() {
this.form = {
id: undefined,
apiKey: undefined,
totalChars: undefined
}
data() {
return {
loading: false,
form: {},
remainChars: 0,
rules: {
platformId: [{ required: true, message: '请选择翻译平台', trigger: 'blur' }],
totalChars: [{ required: true, message: '请输入充值字符(万)', trigger: 'blur' }],
expireDays: [{ required: true, message: '请输入过期时间(天)', trigger: 'blur' }]
},
platformList: []
}
},
handleClose() {
this.resetForm()
this.$emit('input', false)
this.$emit('close')
},
cancel() {
this.loading = false
this.handleClose()
},
submitForm() {
this.$refs['form'].validate(valid => {
if (valid) {
this.loading = true
this.form.id = this.id
const platform = this.platformList.find(item => item.id === this.form.platformId)
this.form.platformCode = platform.code
tmMemberRecharge(this.form).then(response => {
if (response.code === 200) {
this.$message.success('充值成功!')
this.handleClose()
} else {
this.$message.error(response.message)
methods: {
handleOpen() {
this.getPlatform()
},
getPlatform() {
listTmPlatform({ pageIndex: 1, pageSize: 1000 }).then(response => {
if (response.code === 200) {
this.platformList = response.data.list
}
})
},
resetForm() {
this.form = {
id: undefined,
apiKey: undefined,
totalChars: undefined,
userId:undefined,
memberId:undefined,
expireDays: undefined,
}
})
.finally(() => {
this.loading = false
},
handleClose() {
this.resetForm()
this.$emit('input', false)
this.$emit('close')
},
cancel() {
this.loading = false
this.handleClose()
},
submitForm() {
this.$refs['form'].validate(valid => {
if (valid) {
this.loading = true
this.form.memberId = this.memberId
this.form.userId = this.userId
const platform = this.platformList.find(item => item.id === this.form.platformId)
this.form.platformCode = platform.code
tmMemberManageRecharge(this.form).then(response => {
if (response.code === 200) {
this.$message.success('充值成功!')
this.handleClose()
} else {
this.$message.error(response.message)
}
})
.finally(() => {
this.loading = false
})
}
})
}
})
}
}
}
</script>
</script>

View File

@ -109,11 +109,13 @@
icon="el-icon-view"
@click="handlePreview(scope.row)"
>预览</el-button>
<el-popconfirm
class="delete-popconfirm"
title="正在使用代码生成请确认?"
confirm-button-text="生成"
@onConfirm="handleToProject(scope.row)"
@confirm="handleToProject(scope.row)"
>
<el-button
slot="reference"
@ -127,7 +129,7 @@
class="delete-popconfirm"
title="正在使用【菜单以及API生成到数据库】请确认?"
confirm-button-text="写入DB"
@onConfirm="handleToDB(scope.row)"
@confirm="handleToDB(scope.row)"
>
<el-button
slot="reference"
@ -141,7 +143,7 @@
class="delete-popconfirm"
title="正在使用代码生成配置迁移脚本请确认?"
confirm-button-text="生成"
@onConfirm="handleToApiFile(scope.row)"
@confirm="handleToApiFile(scope.row)"
>
<el-button
slot="reference"
@ -154,7 +156,7 @@
<el-popconfirm
class="delete-popconfirm"
title="确认删除数据项?"
@onConfirm="handleSingleDelete(scope.row)"
@confirm="handleSingleDelete(scope.row)"
>
<el-button
slot="reference"