修改AI模块

This commit is contained in:
lichenguang
2025-07-29 12:10:08 +07:00
parent 57b0328c18
commit 489bbb37b0
19 changed files with 612 additions and 324 deletions
+21 -21
View File
@@ -9,37 +9,37 @@ import request from '@/utils/request'
// 添加
export function aitemplateAdd(data) {
return request({
url: '/api/web/aitemplate/add',
method: 'post',
data
})
return request({
url: '/api/web/aitemplate/add',
method: 'post',
data
})
}
// 删除
export function aitemplateDel(data) {
return request({
url: '/api/web/aitemplate/del',
method: 'post',
data
})
return request({
url: '/api/web/aitemplate/del',
method: 'post',
data
})
}
// 查询
export function aitemplateSearch(data) {
return request({
url: '/api/web/aitemplate/list',
method: 'post',
filterParam: true,
data
})
return request({
url: '/api/web/aitemplate/list',
method: 'post',
filterParam: true,
data
})
}
// 修改
export function aitemplateUpdate(data) {
return request({
url: '/api/web/aitemplate/update',
method: 'post',
data
})
return request({
url: '/api/web/aitemplate/update',
method: 'post',
data
})
}
+28 -1
View File
@@ -19,10 +19,37 @@ export function aiTextToImageList(data) {
data
})
}
// 查询ai小说列表
export function aiTextToNovelList(data) {
return request({
url: '/api/web/aitexttonovel/list',
method: 'post',
filterParam: true,
data
})
}
// 删除ai小说列表
export function deleteNovel(data) {
return request({
url: '/api/web/aitexttonovel/del',
method: 'post',
filterParam: true,
data
})
}
// 退款AI小说
export function updateNovel(data) {
return request({
url: '/api/web/aitexttonovel/update',
method: 'post',
filterParam: true,
data
})
}
// 修改图生视频列表
export function aiTextToImageUpdate(data) {
return request({
url: '/api/web/aitexttoimage/modify',
url: '/api/web/aitexttoimage/update',
method: 'post',
data
})
+6
View File
@@ -1097,6 +1097,12 @@ export const serverRouter = [
name: 'AiTxtToImg',
api_url: [],
meta: { title: 'AI文生图', noCache: true, icon: 'el-icon-chat-dot-square' }
},
{
path: 'aiNovelList',
name: 'AiNovelList',
api_url: [],
meta: { title: 'AI小说', noCache: true, icon: 'el-icon-chat-dot-square' }
}
]
},
+1
View File
@@ -189,6 +189,7 @@ const map = {
AiStripOrder: () => import('@/views/aiManagement/aiStripOrder/index.vue'), // ai脱衣订单
AiImgToVideo: () => import('@/views/aiManagement/aiImgToVideo/index.vue'), // ai图生视频
AiTxtToImg: () => import('@/views/aiManagement/aiTxtToImg/index.vue'), // ai文生图
AiNovelList: () => import('@/views/aiManagement/aiNovelList/index.vue'), // ai文生图
// 其他管理
OtherConfig: Layout,
Jumptab: () => import('@/views/otherConfig/jumptab/index.vue'), // 首页跳转按钮
@@ -25,6 +25,14 @@
<el-option label="AI脱衣" :value="3" />
<el-option label="AI女友" :value="4" />
<el-option label="文生图" :value="5" />
<el-option label="图生视频" :value="6" />
</el-select>
</el-form-item>
</el-col>
<el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12">
<el-form-item label="广告模式" prop="advertisingId">
<el-select placeholder="请选择广告模式" clearable v-model="form.adsType" filterable>
<el-option :key="item.value" :label="item.label" :value="item.value" v-for="item in videoTypeMode" />
</el-select>
</el-form-item>
</el-col>
@@ -46,6 +54,8 @@
<script>
import { AiContentTypeList } from '@/filters/aiManagement/aiTemplate'
import { aitemplateCategoryAdd, aitemplateCategoryUpdate } from '@/api/aiManagement/aiOrder'
import { videoTypeMode } from '@/filters/videoManagement/videoType'
export default {
name: 'AddOrEdit',
props: ['data'],
@@ -53,6 +63,7 @@ export default {
data() {
return {
AiContentTypeList: AiContentTypeList(),
videoTypeMode: videoTypeMode(),
Visible: true,
title: '',
time: [],
@@ -67,7 +78,8 @@ export default {
rank: undefined,
showType: undefined,
status: undefined,
updatedAt: undefined
updatedAt: undefined,
adsType: undefined
},
rules: {}
}
@@ -31,6 +31,9 @@
</el-table-column>
<el-table-column align="center" label="展示方式">
<template slot-scope="scope">{{ scope.row.showType | changeAiContentType }}</template>
</el-table-column>
<el-table-column align="center" label="广告模式" width="80">
<template slot-scope="scope">{{ scope.row.adsType | changeVideoTypeMode }}</template>
</el-table-column>
<el-table-column align="center" label="是否启用">
<template slot-scope="scope">
@@ -1,8 +1,20 @@
<template>
<el-dialog :title="title" :visible.sync="Visible" width="780px" center class="ac-dialog" :close-on-click-modal="false"
<el-dialog
:title="title"
:visible.sync="Visible"
width="780px"
center
class="ac-dialog"
:close-on-click-modal="false"
@close="close">
<el-form :inline="true" :model="form" :rules="rules" ref="form" class="demo-form-inline" label-width="120px"
<el-form
:inline="true"
:model="form"
:rules="rules"
ref="form"
class="demo-form-inline"
label-width="120px"
label-position="right">
<el-row :gutter="24">
<el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12">
@@ -31,8 +43,7 @@
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="Visible = false"> </el-button>
<el-button type="primary" @click="submit('form')"> </el-button>
@@ -64,15 +75,15 @@ export default {
formData: {},
// 表单数据
form: {
"byWay": undefined,
"id": undefined,
"modifyImgs": undefined,
"modifyVideoUrl": undefined,
"reason": undefined,
"status": 0,
"updatedAt": undefined
'byWay': undefined,
'id': undefined,
'modifyImgs': undefined,
'modifyVideoUrl': undefined,
'reason': undefined,
'status': 0,
'updatedAt': undefined
},
rules: {},
rules: {}
}
},
mounted() {
@@ -83,22 +94,20 @@ export default {
}
},
methods: {
//TODO:新增应用列表数据
filterM3u8(v) {
// TODO:新增应用列表数据
filterM3u8(v) {
return /\.m3u8/g.test(v) ? v : v + '.m3u8'
},
//TODO:编辑应用列表数据
// TODO:编辑应用列表数据
update(data) {
aiorderFacechangeUpdate(data).then((res) => {
if (res && res.code === 200) {
this.$message.success(res.data ? res.data : '更新成功')
} else {
this.$message.error(res.data?res.data:'更新失败')
this.$message.error(res.data ? res.data : '更新失败')
}
this.Visible = false
this.Visible = false
})
},
// 提交按钮
@@ -133,16 +142,16 @@ export default {
changeCoverImgUrl(data) {
this.form.modifyImgs = data
},
// 关闭编辑
close() {
this.$emit('close')
},
onClear(data) {
this.form[data] = undefined
},
},
}
}
}
</script>
@@ -1,45 +1,25 @@
<template>
<el-dialog
:title="title"
:visible.sync="Visible"
width="780px"
center
class="ac-dialog"
:close-on-click-modal="false"
<el-dialog :title="title" :visible.sync="Visible" width="780px" center class="ac-dialog" :close-on-click-modal="false"
@close="close">
<el-row :gutter="24">
<el-col >
<h3>AI生成的视频URl</h3>
<div v-if="form.vidUrl" style="width: 380px; height: 240px; overflow: hidden">
<DPlayer
ref="player"
v-if="form.vidUrl.indexOf('mp4') === -1"
:video="{
<DPlayer ref="player" v-if="form.vidUrl.indexOf('mp4') === -1" :video="{
url: '/api/web/media/m3u8/' + filterM3u8(form.vidUrl),
type: 'hls',
pic: '',
}"
hotkey ></DPlayer>
<DPlayer
ref="player"
v-else
:video="{
}" hotkey ></DPlayer>
<DPlayer ref="player" v-else :video="{
url: this.$store.getters.getSystemConfig.mp4Url + form.vidUrl,
type: 'mp4',
pic: '',
}"
hotkey ></DPlayer>
}" hotkey ></DPlayer>
</div>
</el-col>
</el-row>
<el-form
:inline="true"
:model="form"
:rules="rules"
ref="form"
class="demo-form-inline"
label-width="120px"
<el-form :inline="true" :model="form" :rules="rules" ref="form" class="demo-form-inline" label-width="120px"
label-position="right">
<el-row :gutter="24">
<el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12">
@@ -64,6 +44,7 @@ label-width="120px"
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="Visible = false"> </el-button>
<el-button type="primary" @click="submit('form')"> </el-button>
@@ -95,15 +76,15 @@ export default {
formData: {},
// 表单数据
form: {
'byWay': undefined,
'id': undefined,
'modifyImgs': undefined,
'vidUrl': undefined,
'reason': undefined,
'status': 0,
'updatedAt': undefined
"byWay": undefined,
"id": undefined,
"modifyImgs": undefined,
"vidUrl": undefined,
"reason": undefined,
"status": 0,
"updatedAt": undefined
},
rules: {}
rules: {},
}
},
mounted() {
@@ -114,20 +95,22 @@ export default {
}
},
methods: {
// TODO:新增应用列表数据
//TODO:新增应用列表数据
filterM3u8(v) {
filterM3u8(v) {
return /\.m3u8/g.test(v) ? v : v + '.m3u8'
},
// TODO:编辑应用列表数据
//TODO:编辑应用列表数据
update(data) {
aiorderFacechangeUpdate(data).then((res) => {
if (res && res.code === 200) {
this.$message.success(res.data ? res.data : '更新成功')
} else {
this.$message.error(res.data ? res.data : '更新失败')
this.$message.error(res.data ? res.data : '更新失败')
}
this.Visible = false
this.Visible = false
})
},
// 提交按钮
@@ -170,8 +153,8 @@ export default {
onClear(data) {
this.form[data] = undefined
}
}
},
},
}
</script>
+64 -66
View File
@@ -102,7 +102,7 @@
<template slot-scope="scope">
<el-button @click="handleEdit(scope.$index, scope.row)" size="mini" type="primary">编辑</el-button>
<el-button v-if="!scope.row.isRefund && (scope.row.status===5 || scope.row.status===6)" @click="orderSumbit(scope.$index, scope.row)" size="mini" type="success">重新生成</el-button>
</template>
</el-table-column>
</el-table>
@@ -116,8 +116,7 @@
:total="total"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper"
/>
layout="total, sizes, prev, pager, next, jumper"/>
</div>
<!-- 新增及编辑 -->
<Edit :data="editData" v-if="editVisible" @close="closeEdit" />
@@ -126,18 +125,18 @@
</template>
<script>
// 引入模块
import Edit from './components/AddOrEditPhoto';
import ShowImg from '@/components/ShowImg/index.vue';
import ShowVideo from '@/components/ShowVideo/index.vue';
import { aiFacechangeSearch,facechangeResubmit } from '@/api/aiManagement/aiOrder';
import { AiContentTypeList } from '@/filters/aiManagement/aiTemplate';
import { aiOrderFaceChangeList, aiFaceOrderList } from '@/filters/aiManagement/aiFaceOrder';
import Edit from './components/AddOrEditPhoto'
import ShowImg from '@/components/ShowImg/index.vue'
import ShowVideo from '@/components/ShowVideo/index.vue'
import { aiFacechangeSearch, facechangeResubmit } from '@/api/aiManagement/aiOrder'
import { AiContentTypeList } from '@/filters/aiManagement/aiTemplate'
import { aiOrderFaceChangeList, aiFaceOrderList } from '@/filters/aiManagement/aiFaceOrder'
export default {
name: 'AiOrder',
components: {
ShowImg,
ShowVideo,
Edit,
Edit
},
data() {
return {
@@ -151,7 +150,7 @@ export default {
byWay: undefined,
aoContentType: 1,
pageNum: 1,
pageSize: 10,
pageSize: 10
},
resData: [], // el-table表格数据
editVisible: false,
@@ -159,120 +158,119 @@ export default {
loading: true, // 列表加载状态
AiContentTypeList: AiContentTypeList(),
aiOrderFaceChangeList: aiOrderFaceChangeList(),
aiFaceOrderList: aiFaceOrderList(),
};
aiFaceOrderList: aiFaceOrderList()
}
},
mounted() {
this.getGameInfo();
this.getGameInfo()
},
methods: {
orderSumbit(index,row){
orderSumbit(index, row) {
this.$confirm('此操作将重新提交该订单, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
center: true
}).then(async() => {
const res = await facechangeResubmit({id:row.id})
if(res.code===200){
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
center: true
}).then(async() => {
const res = await facechangeResubmit({ id: row.id })
if (res.code === 200) {
this.$message({
type: 'success',
message: '提交成功!'
});
}else{
})
} else {
this.$message({
type: 'error',
message: '提交失败!'
});
}
}).catch(() => {
});
})
}
}).catch(() => {
})
},
//TODO:请求应用列表数据
// TODO:请求应用列表数据
getGameInfo() {
aiFacechangeSearch(this.searchData).then(res => {
if (res.code === 200) {
this.resData = res.data.list;
this.total = res.data.total;
this.resData = res.data.list
this.total = res.data.total
} else {
this.resData = [];
this.total = 0;
this.$message.error('请求列表失败!');
this.resData = []
this.total = 0
this.$message.error('请求列表失败!')
}
this.loading = false;
});
this.loading = false
})
},
//TODO:删除应用列表数据
// TODO:删除应用列表数据
handleDelete(index, row) {
this.$confirm('确定删除?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
type: 'warning'
}).then(() => {
AppInfoDel({ id: row.id }).then(res => {
if (res.code === 200) {
this.getGameInfo();
this.$message.success('成功删除!');
this.getGameInfo()
this.$message.success('成功删除!')
} else {
this.$message.error('操作失败');
this.$message.error('操作失败')
}
});
});
})
})
},
onSearch() {
this.searchData.pageNum = 1;
this.searchData.pageSize = 10;
this.getGameInfo();
this.searchData.pageNum = 1
this.searchData.pageSize = 10
this.getGameInfo()
},
// 切换每页数据量
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getGameInfo();
this.searchData.pageSize = val
this.getGameInfo()
},
// 切换页数
handleCurrentChange(val) {
this.searchData.pageNum = val;
this.getGameInfo();
this.searchData.pageNum = val
this.getGameInfo()
},
// 新增按钮
add() {
this.editVisible = true;
this.editVisible = true
},
// 编辑按钮
handleEdit(index, row) {
this.editVisible = true;
this.editVisible = true
this.editData = {
title: '编辑',
data: row,
};
data: row
}
},
// 关闭编辑弹窗
closeEdit() {
this.editData = {
title: '新增',
data: {},
};
this.editVisible = false;
this.getGameInfo();
data: {}
}
this.editVisible = false
this.getGameInfo()
},
// 清空某一项筛选列表
onClear(key) {
this.searchData[key] = undefined;
this.getGameInfo();
this.searchData[key] = undefined
this.getGameInfo()
},
// 视频查看
checkMedia(url, data) {
this.$refs.showvideo.open(url, data, data.id);
},
},
};
this.$refs.showvideo.open(url, data, data.id)
}
}
}
</script>
+64 -66
View File
@@ -110,7 +110,7 @@
<template slot-scope="scope">
<el-button @click="handleEdit(scope.$index, scope.row)" size="mini" type="primary">编辑</el-button>
<el-button v-if="!scope.row.isRefund && (scope.row.status===5 || scope.row.status===6)" @click="orderSumbit(scope.$index, scope.row)" size="mini" type="success">重新生成</el-button>
</template>
</el-table-column>
</el-table>
@@ -124,8 +124,7 @@
:total="total"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper"
/>
layout="total, sizes, prev, pager, next, jumper"/>
</div>
<!-- 新增及编辑 -->
<Edit :data="editData" v-if="editVisible" @close="closeEdit" />
@@ -134,18 +133,18 @@
</template>
<script>
// 引入模块
import Edit from './components/AddOrEditVideo';
import ShowImg from '@/components/ShowImg/index.vue';
import ShowVideo from '@/components/ShowVideo/index.vue';
import { aiFacechangeSearch,facechangeResubmit } from '@/api/aiManagement/aiOrder';
import { AiContentTypeList } from '@/filters/aiManagement/aiTemplate';
import { aiOrderFaceChangeList, aiFaceOrderList } from '@/filters/aiManagement/aiFaceOrder';
import Edit from './components/AddOrEditVideo'
import ShowImg from '@/components/ShowImg/index.vue'
import ShowVideo from '@/components/ShowVideo/index.vue'
import { aiFacechangeSearch, facechangeResubmit } from '@/api/aiManagement/aiOrder'
import { AiContentTypeList } from '@/filters/aiManagement/aiTemplate'
import { aiOrderFaceChangeList, aiFaceOrderList } from '@/filters/aiManagement/aiFaceOrder'
export default {
name: 'AiOrder',
components: {
ShowImg,
ShowVideo,
Edit,
Edit
},
data() {
return {
@@ -159,7 +158,7 @@ export default {
byWay: undefined,
aoContentType: 2,
pageNum: 1,
pageSize: 10,
pageSize: 10
},
resData: [], // el-table表格数据
editVisible: false,
@@ -167,120 +166,119 @@ export default {
loading: true, // 列表加载状态
AiContentTypeList: AiContentTypeList(),
aiOrderFaceChangeList: aiOrderFaceChangeList(),
aiFaceOrderList: aiFaceOrderList(),
};
aiFaceOrderList: aiFaceOrderList()
}
},
mounted() {
this.getGameInfo();
this.getGameInfo()
},
methods: {
orderSumbit(index,row){
orderSumbit(index, row) {
this.$confirm('此操作将重新提交该订单, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
center: true
}).then(async() => {
const res = await facechangeResubmit({id:row.id})
if(res.code===200){
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
center: true
}).then(async() => {
const res = await facechangeResubmit({ id: row.id })
if (res.code === 200) {
this.$message({
type: 'success',
message: '提交成功!'
});
}else{
})
} else {
this.$message({
type: 'error',
message: '提交失败!'
});
}
}).catch(() => {
});
})
}
}).catch(() => {
})
},
//TODO:请求应用列表数据
// TODO:请求应用列表数据
getGameInfo() {
aiFacechangeSearch(this.searchData).then(res => {
if (res.code === 200) {
this.resData = res.data.list;
this.total = res.data.total;
this.resData = res.data.list
this.total = res.data.total
} else {
this.resData = [];
this.total = 0;
this.$message.error('请求列表失败!');
this.resData = []
this.total = 0
this.$message.error('请求列表失败!')
}
this.loading = false;
});
this.loading = false
})
},
//TODO:删除应用列表数据
// TODO:删除应用列表数据
handleDelete(index, row) {
this.$confirm('确定删除?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
type: 'warning'
}).then(() => {
AppInfoDel({ id: row.id }).then(res => {
if (res.code === 200) {
this.getGameInfo();
this.$message.success('成功删除!');
this.getGameInfo()
this.$message.success('成功删除!')
} else {
this.$message.error('操作失败');
this.$message.error('操作失败')
}
});
});
})
})
},
onSearch() {
this.searchData.pageNum = 1;
this.searchData.pageSize = 10;
this.getGameInfo();
this.searchData.pageNum = 1
this.searchData.pageSize = 10
this.getGameInfo()
},
// 切换每页数据量
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getGameInfo();
this.searchData.pageSize = val
this.getGameInfo()
},
// 切换页数
handleCurrentChange(val) {
this.searchData.pageNum = val;
this.getGameInfo();
this.searchData.pageNum = val
this.getGameInfo()
},
// 新增按钮
add() {
this.editVisible = true;
this.editVisible = true
},
// 编辑按钮
handleEdit(index, row) {
this.editVisible = true;
this.editVisible = true
this.editData = {
title: '编辑',
data: row,
};
data: row
}
},
// 关闭编辑弹窗
closeEdit() {
this.editData = {
title: '新增',
data: {},
};
this.editVisible = false;
this.getGameInfo();
data: {}
}
this.editVisible = false
this.getGameInfo()
},
// 清空某一项筛选列表
onClear(key) {
this.searchData[key] = undefined;
this.getGameInfo();
this.searchData[key] = undefined
this.getGameInfo()
},
// 视频查看
checkMedia(url, data) {
this.$refs.showvideo.open(url, data, data.id);
},
},
};
this.$refs.showvideo.open(url, data, data.id)
}
}
}
</script>
@@ -14,6 +14,13 @@
</el-select>
</el-form-item>
</el-col>
<el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12">
<el-form-item label="场景类型">
<el-select placeholder="请选择场景类型" clearable v-model="form.sceneType">
<el-option :key="item.value" :label="item.label" :value="item.value" v-for="item in sceneTypes" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
@@ -37,8 +44,18 @@ export default {
// 表单数据
form: {
remark: undefined, // 备注
status: undefined // 状态
}
status: undefined, // 状态
sceneType: undefined
},
sceneTypes: [
{ label: '掀衣露乳', value: 0 },
{ label: '男人撕衣', value: 1 },
{ label: '神屌射脸', value: 2 },
{ label: '阿黑颜', value: 3 },
{ label: '接吻', value: 4 },
{ label: '吸奶', value: 5 },
{ label: '露逼', value: 6 }
]
}
},
@@ -39,6 +39,11 @@
<el-button :type="scope.row.isDelete ? 'danger' : 'success'" plain size="mini">{{ scope.row.isDelete ? '已删除' : '未删除' }}</el-button>
</template>
</el-table-column>
<el-table-column width="100" align="center" label="场景类型">
<template slot-scope="scope">
{{ sceneTypes[scope.row.sceneType] }}
</template>
</el-table-column>
<el-table-column width="100" align="center" label="是否使用免费次数">
<template slot-scope="scope">
<el-button :type="scope.row.isFreeTimes ? 'danger' : 'success'" plain size="mini">{{ scope.row.isFreeTimes ? '是' : '否' }}</el-button>
@@ -115,7 +120,7 @@ export default {
{ id: 4, name: '生成失败' },
{ id: 5, name: '退款' }
],
sceneTypes: ['掀衣露乳', '男人撕衣', '神屌射脸', '阿黑颜', '接吻', '吸奶', '露逼'],
// 请求列表参数
searchData: {
userId: undefined,
@@ -0,0 +1,251 @@
<template>
<div class="pf-warpper">
<el-row class="table-form">
<el-form :inline="true" :model="searchData" class="form-inline" size="mini">
<el-form-item>
<el-input clearable placeholder="ID" v-model="searchData.id" @clear="onClear('id')" />
</el-form-item>
<el-form-item>
<el-input clearable placeholder="用户ID" v-model.number="searchData.uid" @clear="onClear('userId')" />
</el-form-item>
<el-form-item>
<el-select placeholder="请选择任务进度" clearable v-model="searchData.status" @clear="onClear('status')">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in aiImgToVideoStatusList" />
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="getDataList" plain>搜索</el-button>
</el-form-item>
<el-form-item>
<el-button @click="refreshView" icon="el-icon-refresh" plain type="info">刷新</el-button>
</el-form-item>
</el-form>
</el-row>
<el-table :data="resData" element-loading-text="拼命加载中" border height="750" highlight-current-row style="width: 100%">
<el-table-column label="ID" prop="id" />
<el-table-column label="用户ID" prop="uid" />
<el-table-column label="故事情节" prop="description" />
<el-table-column label="小说正文" prop="content" width="200">
<template slot-scope="scope">
<div style="display: flex;" v-if="scope.row.content">
<span class="ellipsis2">
{{ scope.row.content }}
</span>
<el-button class="view-btn" type="text" @click="view(scope.row.content)" plain icon="el-icon-zoom-in"></el-button>
</div>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column label="状态" prop="status">
<template slot-scope="scope">
{{ handleStatus(scope.row.status) }}
</template>
</el-table-column>
<el-table-column label="地点场景" prop="scene" />
<el-table-column label="故事背景" prop="background" />
<el-table-column label="其他要求" prop="other" />
<el-table-column label="小说模型" prop="modelType">
<template slot-scope="scope">
{{ handleModelType(scope.row.modelType) }}
</template>
</el-table-column>
<el-table-column label="金币" prop="coin" />
<el-table-column label="扣除金币个数" prop="debitAmountCoin" />
<el-table-column label="扣除收益金币个数" prop="debitIncomeCoin" />
<el-table-column label="备注" prop="remark" />
<el-table-column label="创建时间" prop="createdAt">
<template slot-scope="scope">
{{scope.row.createdAt | BeiJingTime}}
</template>
</el-table-column>
<el-table-column label="更新时间" prop="updatedAt">
<template slot-scope="scope">
{{scope.row.updatedAt | BeiJingTime}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="200">
<template slot-scope="scope">
<el-button @click="changeStatus(scope.row)" size="mini">退款</el-button>
<el-button @click="handleDelete(scope.row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="table-pagination">
<el-pagination
:current-page="searchData.pageNum"
:page-size="searchData.pageSize"
:page-sizes="[10, 20, 30, 50, 100]"
:total="total"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper"/>
</div>
<el-dialog
title="预览"
:visible.sync="dialogVisible"
width="600px"
:before-handleClose="handleClose"
:handleClose-on-click-modal="false"
class="look-dialog">
<div class="viewContent" v-html="currentContent"></div>
</el-dialog>
</div>
</template>
<script>
import { aiTextToNovelList, updateNovel, deleteNovel } from '@/api/aiManagement/aiTxtToImg.js'
export default {
name: 'AiNovelList',
data() {
return {
aiImgToVideoStatusList: [
{ id: 1, name: '下单成功' },
{ id: 2, name: '已提交' },
{ id: 3, name: '生成成功' },
{ id: 4, name: '生成失败' },
{ id: 5, name: '退款' }
],
// 请求列表参数
searchData: {
userId: undefined,
status: undefined,
id: undefined,
pageNum: 1,
pageSize: 10
},
total: 0,
resData: [],
appOpts: [],
currentContent: '',
dialogVisible: false
}
},
watch: {},
mounted() {
this.getDataList()
},
methods: {
handleStatus(status) {
if (!status) {
return '--'
}
const obj = this.aiImgToVideoStatusList.find(item => item.id === status)
return obj.name || '--'
},
handleModelType(type) {
if (!type) {
return '--'
}
return type === 1 ? 'AI小艺' : 'AI小萌'
},
async getDataList() {
try {
const r = await aiTextToNovelList(this.searchData)
const data = r.data
this.total = data.total
this.resData = data.list
} catch (error) {
console.error('查询失败:', error)
}
},
// 刷新数据
refreshView() {
this.searchData = {
pageNum: 1,
pageSize: 10
}
this.getDataList()
},
// TODO:删除金币管理列表数据
handleDelete(row) {
this.$confirm('确定删除?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteNovel({ id: row.id }).then(res => {
if (res.code === 200) {
this.getDataList()
this.$message.success('成功删除!')
} else {
this.$message.error('操作失败')
}
})
})
},
changeStatus(row) {
this.$confirm('确定退款?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
updateNovel({ id: row.id, status: 5 }).then(res => {
if (res.code === 200) {
this.getDataList()
this.$message.success('已退款!')
} else {
this.$message.error('操作失败')
}
})
})
},
view(text) {
this.currentContent = text.replace(/\n/g, '<br>')
this.dialogVisible = true
},
handleClose() {
this.dialogVisible = false
},
// 切换每页数据量
handleSizeChange(val) {
this.searchData.pageSize = val
this.getDataList()
},
// 切换页数
handleCurrentChange(val) {
this.searchData.pageNum = val
this.getDataList()
}
}
}
</script>
<style lang="scss" scoped>
.ai-novel-list {
/deep/ .el-button {
padding: 9px 15px;
}
/deep/ .el-image {
width: 100px;
height: 100px;
img {
object-fit: contain;
}
}
}
.ellipsis2 {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
margin-right: 5px;
}
.view-btn {
width: 35px;
}
.look-dialog {
text-align: center;
}
.viewContent {
border: 2px solid;
color: #121327;
border-radius: 8px;
padding: 10px 4px;
}
</style>
@@ -1,46 +1,26 @@
<template>
<el-dialog
:title="title"
:visible.sync="Visible"
width="780px"
center
class="ac-dialog"
:close-on-click-modal="false"
<el-dialog :title="title" :visible.sync="Visible" width="780px" center class="ac-dialog" :close-on-click-modal="false"
@close="close">
<el-row :gutter="24">
<el-col>
<h3>AI生成的视频URl</h3>
<div v-if="form.modifyVideoUrl" style="width: 380px; height: 240px; overflow: hidden">
<DPlayer
ref="player"
v-if="form.modifyVideoUrl.indexOf('mp4') === -1"
:video="{
<DPlayer ref="player" v-if="form.modifyVideoUrl.indexOf('mp4') === -1" :video="{
url: '/api/web/media/m3u8/' + filterM3u8(form.modifyVideoUrl),
type: 'hls',
pic: '',
}"
hotkey ></DPlayer>
<DPlayer
ref="player"
v-else
:video="{
}" hotkey ></DPlayer>
<DPlayer ref="player" v-else :video="{
url: this.$store.getters.getSystemConfig.mp4Url + form.modifyVideoUrl,
type: 'mp4',
pic: '',
}"
hotkey ></DPlayer>
}" hotkey ></DPlayer>
</div>
</el-col>
</el-row>
<el-form
:inline="true"
:model="form"
:rules="rules"
ref="form"
class="demo-form-inline"
label-width="120px"
<el-form :inline="true" :model="form" :rules="rules" ref="form" class="demo-form-inline" label-width="120px"
label-position="right">
<el-row :gutter="24">
<el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12">
@@ -51,10 +31,7 @@ label-width="120px"
<el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12">
<el-form-item label="换脸方式">
<el-select placeholder="请选择换脸方式" clearable v-model="form.byWay">
<el-option
:key="item.value"
:label="item.label"
:value="item.value"
<el-option :key="item.value" :label="item.label" :value="item.value"
v-for="item in aiOrderFaceChangeList" />
</el-select>
</el-form-item>
@@ -74,6 +51,7 @@ label-width="120px"
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="Visible = false"> </el-button>
<el-button type="primary" @click="submit('form')"> </el-button>
@@ -105,15 +83,15 @@ export default {
formData: {},
// 表单数据
form: {
'byWay': undefined,
'id': undefined,
'modifyImgs': undefined,
'modifyVideoUrl': undefined,
'reason': undefined,
'status': 0,
'updatedAt': undefined
"byWay": undefined,
"id": undefined,
"modifyImgs": undefined,
"modifyVideoUrl": undefined,
"reason": undefined,
"status": 0,
"updatedAt": undefined
},
rules: {}
rules: {},
}
},
mounted() {
@@ -124,15 +102,18 @@ export default {
}
},
methods: {
// TODO:新增应用列表数据
//TODO:新增应用列表数据
filterM3u8(v) {
return /\.m3u8/g.test(v) ? v : v + '.m3u8'
},
// TODO:编辑应用列表数据
//TODO:编辑应用列表数据
update(data) {
aiorderStripUpdate(data).then((res) => {
if (res && res.code === 200) {
if (res && res.code === 200) {
this.$message.success(res.data ? res.data : '更新成功')
} else {
this.$message.error(res.data ? res.data : '更新失败')
@@ -180,8 +161,8 @@ export default {
onClear(data) {
this.form[data] = undefined
}
}
},
},
}
</script>
+48 -49
View File
@@ -106,8 +106,7 @@
:total="total"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper"
/>
layout="total, sizes, prev, pager, next, jumper"/>
</div>
<!-- 新增及编辑 -->
<Edit :data="editData" v-if="editVisible" @close="closeEdit" />
@@ -116,18 +115,18 @@
</template>
<script>
// 引入模块
import Edit from './components/AddOrEdit';
import ShowImg from '@/components/ShowImg/index.vue';
import ShowVideo from '@/components/ShowVideo/index.vue';
import { aiStripSearch } from '@/api/aiManagement/aiOrder';
import { AiContentTypeList } from '@/filters/aiManagement/aiTemplate';
import { aiOrderFaceChangeList, aiFaceOrderList } from '@/filters/aiManagement/aiFaceOrder';
import Edit from './components/AddOrEdit'
import ShowImg from '@/components/ShowImg/index.vue'
import ShowVideo from '@/components/ShowVideo/index.vue'
import { aiStripSearch } from '@/api/aiManagement/aiOrder'
import { AiContentTypeList } from '@/filters/aiManagement/aiTemplate'
import { aiOrderFaceChangeList, aiFaceOrderList } from '@/filters/aiManagement/aiFaceOrder'
export default {
name: 'AiOrder',
components: {
ShowImg,
ShowVideo,
Edit,
Edit
},
data() {
return {
@@ -141,7 +140,7 @@ export default {
byWay: undefined,
aoContentType: undefined,
pageNum: 1,
pageSize: 10,
pageSize: 10
},
resData: [], // el-table表格数据
editVisible: false,
@@ -149,96 +148,96 @@ export default {
loading: true, // 列表加载状态
AiContentTypeList: AiContentTypeList(),
aiOrderFaceChangeList: aiOrderFaceChangeList(),
aiFaceOrderList: aiFaceOrderList(),
};
aiFaceOrderList: aiFaceOrderList()
}
},
mounted() {
this.getGameInfo();
this.getGameInfo()
},
methods: {
//TODO:请求应用列表数据
// TODO:请求应用列表数据
getGameInfo() {
aiStripSearch(this.searchData).then(res => {
if (res.code === 200) {
this.resData = res.data.list;
this.total = res.data.total;
this.resData = res.data.list
this.total = res.data.total
} else {
this.resData = [];
this.total = 0;
this.$message.error('请求列表失败!');
this.resData = []
this.total = 0
this.$message.error('请求列表失败!')
}
this.loading = false;
});
this.loading = false
})
},
//TODO:删除应用列表数据
// TODO:删除应用列表数据
handleDelete(index, row) {
this.$confirm('确定删除?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
type: 'warning'
}).then(() => {
AppInfoDel({ id: row.id }).then(res => {
if (res.code === 200) {
this.getGameInfo();
this.$message.success('成功删除!');
this.getGameInfo()
this.$message.success('成功删除!')
} else {
this.$message.error('操作失败');
this.$message.error('操作失败')
}
});
});
})
})
},
onSearch() {
this.searchData.pageNum = 1;
this.searchData.pageSize = 10;
this.getGameInfo();
this.searchData.pageNum = 1
this.searchData.pageSize = 10
this.getGameInfo()
},
// 切换每页数据量
handleSizeChange(val) {
this.searchData.pageSize = val;
this.getGameInfo();
this.searchData.pageSize = val
this.getGameInfo()
},
// 切换页数
handleCurrentChange(val) {
this.searchData.pageNum = val;
this.getGameInfo();
this.searchData.pageNum = val
this.getGameInfo()
},
// 新增按钮
add() {
this.editVisible = true;
this.editVisible = true
},
// 编辑按钮
handleEdit(index, row) {
this.editVisible = true;
this.editVisible = true
this.editData = {
title: '编辑',
data: row,
};
data: row
}
},
// 关闭编辑弹窗
closeEdit() {
this.editData = {
title: '新增',
data: {},
};
this.editVisible = false;
this.getGameInfo();
data: {}
}
this.editVisible = false
this.getGameInfo()
},
// 清空某一项筛选列表
onClear(key) {
this.searchData[key] = undefined;
this.getGameInfo();
this.searchData[key] = undefined
this.getGameInfo()
},
// 视频查看
checkMedia(url, data) {
this.$refs.showvideo.open(url, data, data.id);
},
},
};
this.$refs.showvideo.open(url, data, data.id)
}
}
}
</script>
@@ -81,7 +81,7 @@
</template>
<script>
import UploadImg from '@/components/UploadImg/index'
import { AtTypeList, AiContentTypeList, AiEnableList , styleTypeList } from '@/filters/aiManagement/aiTemplate'
import { AtTypeList, AiContentTypeList, AiEnableList, styleTypeList } from '@/filters/aiManagement/aiTemplate'
import { aitemplateAdd, aitemplateUpdate } from '@/api/aiManagement/aiTemplate'
import { changeMoneyYuan, changeMoneyFen } from '@/filters/index'
// import UploadVideo from '@/components/UploadVideo/index'
+1 -1
View File
@@ -46,7 +46,7 @@
</el-table-column>
<el-table-column align="center" label="风格类型">
<template slot-scope="scope">{{ scope.row.styleType | changeStyleType }}</template>
</el-table-column>
</el-table-column>
<el-table-column align="center" label="售卖次数(虚拟)">
<template slot-scope="scope">{{ scope.row.fakeSells }}</template>
</el-table-column>
+3 -3
View File
@@ -98,7 +98,7 @@
// 引入模块
import Edit from './components/AddOrEdit'
import ShowImg from '@/components/ShowImg/index.vue'
import { aiTextToImageList, aiTextToImageeDel, aiTextToImageeUpdate } from '@/api/aiManagement/aiTxtToImg.js'
import { aiTextToImageList, aiTextToImageDel, aiTextToImageUpdate } from '@/api/aiManagement/aiTxtToImg.js'
export default {
name: 'Gold',
@@ -179,7 +179,7 @@ export default {
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
aiTextToImageeDel({ id: row.id }).then(res => {
aiTextToImageDel({ id: row.id }).then(res => {
if (res.code === 200) {
this.getGoldList()
this.$message.success('成功删除!')
@@ -195,7 +195,7 @@ export default {
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
aiTextToImageeUpdate({ id: row.id, status: 5 }).then(res => {
aiTextToImageUpdate({ id: row.id, status: 5 }).then(res => {
if (res.code === 200) {
this.getGoldList()
this.$message.success('已退款!')