Skip to content

Commit e655b4d

Browse files
committed
【代码新增】AI:写作管理节点
1 parent c76b622 commit e655b4d

File tree

7 files changed

+278
-11
lines changed

7 files changed

+278
-11
lines changed

src/api/ai/writer/index.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { fetchEventSource } from '@microsoft/fetch-event-source'
2+
import request from '@/config/axios'
23

34
import { getAccessToken } from '@/utils/auth'
45
import { config } from '@/config/axios/config'
@@ -12,6 +13,12 @@ export interface WriteVO {
1213
format: number // 格式
1314
tone: number // 语气
1415
language: number // 语言
16+
userId?: number // 用户编号
17+
platform?: string // 平台
18+
model?: string // 模型
19+
generatedContent?: string // 生成的内容
20+
errorMessage: string // 错误信息
21+
createTime?: Date // 创建时间
1522
}
1623

1724
// TODO @hhero:搞成 WriteApi,类似 ConversationApi 一样。这样更有类的概念,后续引入某个 Api,然后调用它的方法就可以了。
@@ -43,3 +50,16 @@ export const writeStream = ({
4350
signal: ctrl.signal
4451
})
4552
}
53+
54+
// AI 写作 API
55+
export const WriteApi = {
56+
// 查询AI 写作分页
57+
getWritePage: async (params: any) => {
58+
return await request.get({ url: `/ai/write/page`, params })
59+
},
60+
61+
// 删除AI 写作
62+
deleteWrite: async (id: number) => {
63+
return await request.delete({ url: `/ai/write/delete?id=` + id })
64+
}
65+
}

src/utils/dict.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,5 +222,10 @@ export enum DICT_TYPE {
222222
AI_PLATFORM = 'ai_platform', // AI 平台
223223
AI_IMAGE_STATUS = 'ai_image_status', // AI 图片状态
224224
AI_MUSIC_STATUS = 'ai_music_status', // AI 音乐状态
225-
AI_GENERATE_MODE = 'ai_generate_mode' // AI 生成模式
225+
AI_GENERATE_MODE = 'ai_generate_mode', // AI 生成模式
226+
AI_WRITE_TYPE = 'ai_write_type', // AI 写作类型
227+
AI_WRITE_LENGTH = 'ai_write_length', // AI 写作长度
228+
AI_WRITE_FORMAT = 'ai_write_format', // AI 写作格式
229+
AI_WRITE_TONE = 'ai_write_tone', // AI 写作语气
230+
AI_WRITE_LANGUAGE = 'ai_write_language' // AI 写作语言
226231
}

src/views/ai/image/index/index.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
ref="otherRef"
2424
@on-draw-complete="handleDrawComplete"
2525
/>
26-
2726
</div>
2827
</div>
2928
<div class="main">

src/views/ai/music/manager/index.vue

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,19 @@
99
label-width="68px"
1010
>
1111
<el-form-item label="用户编号" prop="userId">
12-
<el-input
12+
<el-select
1313
v-model="queryParams.userId"
14-
placeholder="请输入用户编号"
1514
clearable
16-
@keyup.enter="handleQuery"
15+
placeholder="请输入用户编号"
1716
class="!w-240px"
18-
/>
17+
>
18+
<el-option
19+
v-for="item in userList"
20+
:key="item.id"
21+
:label="item.nickname"
22+
:value="item.id"
23+
/>
24+
</el-select>
1925
</el-form-item>
2026
<el-form-item label="音乐名称" prop="title">
2127
<el-input

src/views/ai/utils/constants.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export const OtherPlatformEnum:ImageModelVO [] = [
3434
}
3535
]
3636

37-
3837
/**
3938
* AI 图像生成状态的枚举
4039
*/

src/views/ai/write/manager/index.vue

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
<template>
2+
<ContentWrap>
3+
<!-- 搜索工作栏 -->
4+
<el-form
5+
class="-mb-15px"
6+
:model="queryParams"
7+
ref="queryFormRef"
8+
:inline="true"
9+
label-width="68px"
10+
>
11+
<el-form-item label="用户编号" prop="userId">
12+
<el-select
13+
v-model="queryParams.userId"
14+
clearable
15+
placeholder="请输入用户编号"
16+
class="!w-240px"
17+
>
18+
<el-option
19+
v-for="item in userList"
20+
:key="item.id"
21+
:label="item.nickname"
22+
:value="item.id"
23+
/>
24+
</el-select>
25+
</el-form-item>
26+
<el-form-item label="写作类型" prop="type">
27+
<el-select
28+
v-model="queryParams.type"
29+
placeholder="请选择写作类型"
30+
clearable
31+
class="!w-240px"
32+
>
33+
<el-option
34+
v-for="dict in getIntDictOptions(DICT_TYPE.AI_WRITE_TYPE)"
35+
:key="dict.value"
36+
:label="dict.label"
37+
:value="dict.value"
38+
/>
39+
</el-select>
40+
</el-form-item>
41+
<el-form-item label="平台" prop="platform">
42+
<el-select v-model="queryParams.status" placeholder="请选择平台" clearable class="!w-240px">
43+
<el-option
44+
v-for="dict in getStrDictOptions(DICT_TYPE.AI_PLATFORM)"
45+
:key="dict.value"
46+
:label="dict.label"
47+
:value="dict.value"
48+
/>
49+
</el-select>
50+
</el-form-item>
51+
<el-form-item label="创建时间" prop="createTime">
52+
<el-date-picker
53+
v-model="queryParams.createTime"
54+
value-format="YYYY-MM-DD HH:mm:ss"
55+
type="daterange"
56+
start-placeholder="开始日期"
57+
end-placeholder="结束日期"
58+
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
59+
class="!w-240px"
60+
/>
61+
</el-form-item>
62+
<el-form-item>
63+
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
64+
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
65+
<el-button
66+
type="primary"
67+
plain
68+
@click="openForm('create')"
69+
v-hasPermi="['ai:write:create']"
70+
>
71+
<Icon icon="ep:plus" class="mr-5px" /> 新增
72+
</el-button>
73+
<el-button
74+
type="success"
75+
plain
76+
@click="handleExport"
77+
:loading="exportLoading"
78+
v-hasPermi="['ai:write:export']"
79+
>
80+
<Icon icon="ep:download" class="mr-5px" /> 导出
81+
</el-button>
82+
</el-form-item>
83+
</el-form>
84+
</ContentWrap>
85+
86+
<!-- 列表 -->
87+
<ContentWrap>
88+
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
89+
<el-table-column label="编号" align="center" prop="id" width="120" fixed="left" />
90+
<el-table-column label="用户" align="center" prop="userId" width="180">
91+
<template #default="scope">
92+
<span>{{ userList.find((item) => item.id === scope.row.userId)?.nickname }}</span>
93+
</template>
94+
</el-table-column>
95+
<el-table-column label="写作类型" align="center" prop="type">
96+
<template #default="scope">
97+
<dict-tag :type="DICT_TYPE.AI_WRITE_TYPE" :value="scope.row.type" />
98+
</template>
99+
</el-table-column>
100+
<el-table-column label="平台" align="center" prop="platform" width="120">
101+
<template #default="scope">
102+
<dict-tag :type="DICT_TYPE.AI_PLATFORM" :value="scope.row.platform" />
103+
</template>
104+
</el-table-column>
105+
<el-table-column label="模型" align="center" prop="model" width="180" />
106+
<el-table-column label="生成内容提示" align="center" prop="prompt" width="180" />
107+
<el-table-column label="生成的内容" align="center" prop="generatedContent" width="180" />
108+
<el-table-column label="原文" align="center" prop="originalContent" width="180" />
109+
<el-table-column label="长度" align="center" prop="length">
110+
<template #default="scope">
111+
<dict-tag :type="DICT_TYPE.AI_WRITE_LENGTH" :value="scope.row.length" />
112+
</template>
113+
</el-table-column>
114+
<el-table-column label="格式" align="center" prop="format">
115+
<template #default="scope">
116+
<dict-tag :type="DICT_TYPE.AI_WRITE_FORMAT" :value="scope.row.format" />
117+
</template>
118+
</el-table-column>
119+
<el-table-column label="语气" align="center" prop="tone">
120+
<template #default="scope">
121+
<dict-tag :type="DICT_TYPE.AI_WRITE_TONE" :value="scope.row.tone" />
122+
</template>
123+
</el-table-column>
124+
<el-table-column label="语言" align="center" prop="language">
125+
<template #default="scope">
126+
<dict-tag :type="DICT_TYPE.AI_WRITE_LANGUAGE" :value="scope.row.language" />
127+
</template>
128+
</el-table-column>
129+
<el-table-column
130+
label="创建时间"
131+
align="center"
132+
prop="createTime"
133+
:formatter="dateFormatter"
134+
width="180px"
135+
/>
136+
<el-table-column label="错误信息" align="center" prop="errorMessage" />
137+
<el-table-column label="操作" align="center">
138+
<template #default="scope">
139+
<el-button
140+
link
141+
type="primary"
142+
@click="openForm('update', scope.row.id)"
143+
v-hasPermi="['ai:write:update']"
144+
>
145+
编辑
146+
</el-button>
147+
<el-button
148+
link
149+
type="danger"
150+
@click="handleDelete(scope.row.id)"
151+
v-hasPermi="['ai:write:delete']"
152+
>
153+
删除
154+
</el-button>
155+
</template>
156+
</el-table-column>
157+
</el-table>
158+
<!-- 分页 -->
159+
<Pagination
160+
:total="total"
161+
v-model:page="queryParams.pageNo"
162+
v-model:limit="queryParams.pageSize"
163+
@pagination="getList"
164+
/>
165+
</ContentWrap>
166+
</template>
167+
168+
<script setup lang="ts">
169+
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
170+
import { dateFormatter } from '@/utils/formatTime'
171+
// TODO 芋艿:这里应该是 write
172+
import { WriteApi, WriteVO } from '@/api/ai/writer'
173+
import * as UserApi from '@/api/system/user'
174+
175+
/** AI 写作列表 */
176+
defineOptions({ name: 'AiWriteManager' })
177+
178+
const message = useMessage() // 消息弹窗
179+
const { t } = useI18n() // 国际化
180+
181+
const loading = ref(true) // 列表的加载中
182+
const list = ref<WriteVO[]>([]) // 列表的数据
183+
const total = ref(0) // 列表的总页数
184+
const queryParams = reactive({
185+
pageNo: 1,
186+
pageSize: 10,
187+
userId: undefined,
188+
type: undefined,
189+
platform: undefined,
190+
createTime: []
191+
})
192+
const queryFormRef = ref() // 搜索的表单
193+
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
194+
195+
/** 查询列表 */
196+
const getList = async () => {
197+
loading.value = true
198+
try {
199+
const data = await WriteApi.getWritePage(queryParams)
200+
list.value = data.list
201+
total.value = data.total
202+
} finally {
203+
loading.value = false
204+
}
205+
}
206+
207+
/** 搜索按钮操作 */
208+
const handleQuery = () => {
209+
queryParams.pageNo = 1
210+
getList()
211+
}
212+
213+
/** 重置按钮操作 */
214+
const resetQuery = () => {
215+
queryFormRef.value.resetFields()
216+
handleQuery()
217+
}
218+
219+
/** 删除按钮操作 */
220+
const handleDelete = async (id: number) => {
221+
try {
222+
// 删除的二次确认
223+
await message.delConfirm()
224+
// 发起删除
225+
await WriteApi.deleteWrite(id)
226+
message.success(t('common.delSuccess'))
227+
// 刷新列表
228+
await getList()
229+
} catch {}
230+
}
231+
232+
/** 初始化 **/
233+
onMounted(async () => {
234+
getList()
235+
// 获得用户列表
236+
userList.value = await UserApi.getSimpleUserList()
237+
})
238+
</script>

src/views/ai/writer/index/components/Left.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,13 @@
8181
</template>
8282

8383
<ReuseLabel label="长度" />
84-
<Tag v-model="formData.length" :tags="getIntDictOptions('ai_write_length')" />
84+
<Tag v-model="formData.length" :tags="getIntDictOptions(DICT_TYPE.AI_WRITE_LENGTH)" />
8585
<ReuseLabel label="格式" />
86-
<Tag v-model="formData.format" :tags="getIntDictOptions('ai_write_format')" />
86+
<Tag v-model="formData.format" :tags="getIntDictOptions(DICT_TYPE.AI_WRITE_FORMAT)" />
8787
<ReuseLabel label="语气" />
88-
<Tag v-model="formData.tone" :tags="getIntDictOptions('ai_write_tone')" />
88+
<Tag v-model="formData.tone" :tags="getIntDictOptions(DICT_TYPE.AI_WRITE_TONE)" />
8989
<ReuseLabel label="语言" />
90-
<Tag v-model="formData.language" :tags="getIntDictOptions('ai_write_language')" />
90+
<Tag v-model="formData.language" :tags="getIntDictOptions(DICT_TYPE.AI_WRITE_LANGUAGE)" />
9191

9292
<div class="flex items-center justify-center mt-3">
9393
<el-button :disabled="isWriting" @click="reset">重置</el-button>

0 commit comments

Comments
 (0)