|
@@ -1,345 +1,32 @@
|
|
|
<template>
|
|
|
- <div class="create app-pageContainer" style="min-height: 100vh;">
|
|
|
- <!-- <Header /> -->
|
|
|
-
|
|
|
- <div class="mx-auto" style="width: 60%;">
|
|
|
- <div class="container mx-auto p-4">
|
|
|
- <div class="flex flex-col gap-6">
|
|
|
- <div class="text-2xl mt-6 font-semibold">{{ $route.query.id ? '编辑角色' : '创建角色' }}</div>
|
|
|
- <div class="text-xl font-medium">基本信息</div>
|
|
|
- <div class="text-xs text-gray-400">
|
|
|
- 这些信息在机器人描述中供其他用户查看
|
|
|
- </div>
|
|
|
- <el-form :model="form" :rules="rules" ref="form" label-width="60px" class="form">
|
|
|
- <div class="flex gap-4">
|
|
|
- <div class="w-1/3 flex justify-center">
|
|
|
- <el-form-item label="" prop="picture" label-width="0">
|
|
|
- <ImageUpload v-model="form.picture" class="imgUp" :limit="1" />
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
- <!-- <div class="bg-gray-600 p-4 rounded-lg flex items-center justify-center">
|
|
|
-
|
|
|
- </div> -->
|
|
|
- <!-- <div class="text-sm mt-2 text-center">
|
|
|
- 支持PNG、JPG、JPEG、WebP及GIF格式的图片大小不超过10MB。
|
|
|
- </div> -->
|
|
|
- </div>
|
|
|
- <div class="flex-1">
|
|
|
- <div class="flex flex-col gap-4 ml-6 pb-4">
|
|
|
- <el-form-item label="名称" prop="characterName">
|
|
|
- <el-input v-model="form.characterName" placeholder="填写名称"></el-input>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="简介" prop="prologue">
|
|
|
- <el-input v-model="form.prologue" type="textarea" :autosize="{ minRows: 3, maxRows: 3 }"
|
|
|
- placeholder="介绍一下你要值造的这个机器人。应段介绍只会是示在机器人的角色详情信息中,不会出现在提示词中,也不会影响到你的机器人。"></el-input>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="性别" prop="sex">
|
|
|
- <el-radio-group v-model="form.sex">
|
|
|
- <el-radio label="0">男</el-radio>
|
|
|
- <el-radio label="1">女</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="类型" prop="type">
|
|
|
- <el-radio-group v-model="form.type">
|
|
|
- <el-radio :label="0">公开</el-radio>
|
|
|
- <el-radio :label="1">私密</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="标签" prop="labelId">
|
|
|
- <el-select v-model="form.labelId" multiple filterable placeholder="搜索并选择与你的机器人相关的标签">
|
|
|
- <el-option :label="item.labelName" :value="item.id" v-for="(item, index) in labelData"
|
|
|
- :key="index"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="text-xl font-medium my-6">机器人制作</div>
|
|
|
- <div class="p-5 rounded-lg">
|
|
|
- <el-form-item label="性格" label-width="80px" prop="characterPersonalityTags" style="margin-bottom: 20px;">
|
|
|
- <el-select :multiple-limit="3" v-model="form.characterPersonalityTags" multiple filterable
|
|
|
- placeholder="搜索并选择与你的机器人性格(最多三个)">
|
|
|
- <el-option :label="item.personalityName" :value="item.id" v-for="(item, index) in personalityList"
|
|
|
- :key="index"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
- <el-form-item label="模型" prop="modelId" label-width="80px" style="margin-bottom: 20px;">
|
|
|
- <el-radio-group class="radio" v-model="form.modelId">
|
|
|
- <el-radio-button v-for="(item, index) in modelList" :key="index" :label="item.id">
|
|
|
- {{ item.model }}
|
|
|
- </el-radio-button>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
- <el-form-item label="开场白" prop="firstContent" label-width="80px" style="margin-bottom: 20px;">
|
|
|
- <el-input v-model="form.firstContent" type="textarea" :autosize="{ minRows: 4, maxRows: 4 }"
|
|
|
- placeholder="帮您的机器人设计一段开场白吧"></el-input>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="角色描述" prop="characterIntroduction" label-width="80px" style="margin-bottom: 20px;">
|
|
|
- <el-input v-model="form.characterIntroduction" type="textarea" :autosize="{ minRows: 4, maxRows: 4 }"
|
|
|
- placeholder="请在此处提供该角色的背景资讯。 使用'{char}'來指代您的角色。 例如:{char}是一个从小娇生惯养的大小姐。"></el-input>
|
|
|
- </el-form-item>
|
|
|
- <el-collapse class="collapse">
|
|
|
- <el-collapse-item title="更多设置" name="1">
|
|
|
- <el-form-item label="场景" prop="scene" label-width="80px" style="margin-bottom: 20px;">
|
|
|
- <el-input v-model="form.scene" type="textarea" :autosize="{ minRows: 4, maxRows: 4 }"
|
|
|
- placeholder="输入您的角色所处的场景,例如:{char}和{user}现在已经交往一个月了。"></el-input>
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
- <el-form-item label="对话范例" prop="dialogue" label-width="80px">
|
|
|
- <el-input v-model="form.dialogue" type="textarea" :autosize="{ minRows: 4, maxRows: 4 }"
|
|
|
- :placeholder="'例如\n<START>\n{user}:嗨,我听说你喜欢在酒吧消磨时间。\n{char}:*兴奋*天呐,是的!'"></el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-collapse-item>
|
|
|
- </el-collapse>
|
|
|
- </div>
|
|
|
- </el-form>
|
|
|
-
|
|
|
- <div class="flex justify-center">
|
|
|
- <button class="bg-blue-600 text-white px-4 py-2 rounded-lg" @click.prevent="submitForm">
|
|
|
- 提交
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <div class="app-pageContainer">
|
|
|
+ <CreatePC v-if="!$store.state.app.isMobile" />
|
|
|
+ <CreateH5 v-else />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import { addCharacterApi, personalityListApi, updateCharacterApi } from "@/api/create.js"
|
|
|
-import { labelListApi } from "@/api/home.js"
|
|
|
-import { detailApi } from "@/api/detail.js"
|
|
|
+import CreatePC from "./createPC.vue"
|
|
|
+import CreateH5 from "./createH5.vue"
|
|
|
|
|
|
-import {
|
|
|
- getModelListApi,
|
|
|
-} from "@/api/chat.js"
|
|
|
export default {
|
|
|
+ name: "create",
|
|
|
components: {
|
|
|
+ CreatePC,
|
|
|
+ CreateH5
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
- modelList: [],
|
|
|
- labelData: [],
|
|
|
- personalityList: [],
|
|
|
- form: {
|
|
|
- modelId: null,
|
|
|
- characterName: "",// 人物名称
|
|
|
- characterIntroduction: "", //人物角色描述
|
|
|
- characterPersonalityTags: [], //人物性格标签
|
|
|
- firstContent: "", //首次聊天内容
|
|
|
- labelId: [], //标签id
|
|
|
- picture: "", //人物图片
|
|
|
- prologue: "", //人物简介
|
|
|
- sex: "", //性别(0男 1女)
|
|
|
- type: "", //公开或私密(0公开 1私密)
|
|
|
- },
|
|
|
- rules: {
|
|
|
- characterName: [
|
|
|
- { required: true, message: "请输入名称", trigger: "change" },
|
|
|
- ],
|
|
|
- characterIntroduction: [
|
|
|
- { required: true, message: "请输入人物描述", trigger: "change" },
|
|
|
- ],
|
|
|
- firstContent: [
|
|
|
- { required: true, message: "请输入开场白", trigger: "change" },
|
|
|
- ],
|
|
|
- labelId: [
|
|
|
- { required: true, message: "请选择标签", trigger: "change" },
|
|
|
- ],
|
|
|
- picture: [
|
|
|
- { required: true, message: "请上传人物图片", trigger: "change" },
|
|
|
- ],
|
|
|
- prologue: [
|
|
|
- { required: true, message: "请输入人物简介", trigger: "change" },
|
|
|
- ],
|
|
|
- sex: [
|
|
|
- { required: true, message: "请选择性别", trigger: "change" },
|
|
|
- ],
|
|
|
- type: [
|
|
|
- { required: true, message: "请选择类型", trigger: "change" },
|
|
|
- ],
|
|
|
- modelId: [
|
|
|
- { required: true, message: "请选择模型", trigger: "change" },
|
|
|
- ],
|
|
|
- }
|
|
|
+
|
|
|
}
|
|
|
},
|
|
|
mounted() {
|
|
|
|
|
|
- this.getModelList()
|
|
|
- this.getLabelList()
|
|
|
- this.getPersonalityList()
|
|
|
- console.log(this.$route.query.id, 'this.$route.query.id');
|
|
|
- if (this.$route.query.id) {
|
|
|
- detailApi(this.$route.query.id).then(res => {
|
|
|
- console.log(res, '详情');
|
|
|
- this.form = res.data
|
|
|
- })
|
|
|
- }
|
|
|
- // console.log(this.$route.params.searchValue, 'this.$route.params.searchValue');
|
|
|
},
|
|
|
methods: {
|
|
|
|
|
|
- getPersonalityList() {
|
|
|
- let params = {
|
|
|
- pageSize: 9999,
|
|
|
- pageNum: 1
|
|
|
- }
|
|
|
- personalityListApi(params).then(res => {
|
|
|
- console.log(res, '人物性格标签');
|
|
|
- this.personalityList = res.rows
|
|
|
- })
|
|
|
- },
|
|
|
- getModelList() {
|
|
|
- getModelListApi().then(res => {
|
|
|
- console.log(res, '模型列表');
|
|
|
- this.modelList = res.data
|
|
|
- this.form.modelId = this.modelList[0].id
|
|
|
- })
|
|
|
- },
|
|
|
- async addCharacter() {
|
|
|
- let data = {
|
|
|
- name: this.form.name,
|
|
|
- description: this.form.description,
|
|
|
- character: this.form.character,
|
|
|
- tags: this.form.tags,
|
|
|
- image: this.form.image,
|
|
|
- type: this.form.type,
|
|
|
- }
|
|
|
- let res = await addCharacterApi(data)
|
|
|
- console.log(res, 'res');
|
|
|
- },
|
|
|
- getLabelList() {
|
|
|
- let params = {
|
|
|
- pageSize: 9999,
|
|
|
- pageNum: 1
|
|
|
- }
|
|
|
- labelListApi(params).then(res => {
|
|
|
- console.log(res, '标签列表');
|
|
|
- this.labelData = res.rows
|
|
|
- })
|
|
|
- },
|
|
|
- submitForm() {
|
|
|
- this.$refs.form.validate((valid, object) => {
|
|
|
- if (valid) {
|
|
|
- if (this.form.id) {
|
|
|
- updateCharacterApi(this.form).then(() => {
|
|
|
- this.$message({
|
|
|
- message: '编辑成功',
|
|
|
- type: 'success'
|
|
|
- });
|
|
|
- this.$refs.form.resetFields()
|
|
|
- this.$router.push('/profile')
|
|
|
- })
|
|
|
- } else {
|
|
|
- addCharacterApi(this.form).then(() => {
|
|
|
- this.$message({
|
|
|
- message: '创建成功',
|
|
|
- type: 'success'
|
|
|
- });
|
|
|
- this.$refs.form.resetFields()
|
|
|
- this.$router.push('/profile')
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- } else {
|
|
|
- console.log(object, 'object.keys() ');
|
|
|
- let keys = Object.keys(object)
|
|
|
- this.$modal.msgError(object[keys[0]][0].message);
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- }
|
|
|
-}
|
|
|
+ },
|
|
|
+};
|
|
|
</script>
|
|
|
|
|
|
-<style lang="scss" scoped></style>
|
|
|
-<style scoped>
|
|
|
-.form>>>.el-form-item {
|
|
|
- margin-bottom: 0px;
|
|
|
-}
|
|
|
-
|
|
|
-.form>>>.el-form-item__label,
|
|
|
-.form>>>.el-radio {
|
|
|
- /* color: #fff; */
|
|
|
-}
|
|
|
-
|
|
|
-.form>>>.el-select {
|
|
|
- width: 100%;
|
|
|
-}
|
|
|
-
|
|
|
-.form>>>.el-input__inner,
|
|
|
-.form>>>.el-textarea__inner,
|
|
|
-.form>>>.el-select__input {
|
|
|
- width: 100%;
|
|
|
- /* background-color: rgba(75, 85, 99, 1); */
|
|
|
- /* color: #fff; */
|
|
|
- border-radius: 0.5rem;
|
|
|
- /* border-color: rgba(75, 85, 99, 0); */
|
|
|
-}
|
|
|
-
|
|
|
-.imgUp {}
|
|
|
-
|
|
|
-.imgUp>>>.el-upload__tip {
|
|
|
- /* color: #b8b8b8; */
|
|
|
- text-align: center;
|
|
|
-}
|
|
|
-
|
|
|
-.imgUp>>>.upload {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- width: 100%;
|
|
|
- /* padding: 20px;
|
|
|
- background: rgba(75, 85, 99, 1);
|
|
|
- border-radius: 10px; */
|
|
|
-}
|
|
|
-
|
|
|
-.imgUp>>>.el-upload {
|
|
|
- /* border-radius: 50%; */
|
|
|
-}
|
|
|
-
|
|
|
-.imgUp>>>.el-upload-list__item {
|
|
|
- /* border-radius: 50%; */
|
|
|
-}
|
|
|
-
|
|
|
-.radio>>>.el-radio-button {
|
|
|
- margin-bottom: 5px;
|
|
|
- margin-right: 10px;
|
|
|
- /* border-left: solid 1px #DCDFE6; */
|
|
|
-}
|
|
|
-
|
|
|
-.radio>>>.el-radio-button__inner {
|
|
|
- border-left: solid 1px #DCDFE6;
|
|
|
- border-radius: 4px;
|
|
|
-}
|
|
|
-
|
|
|
-.radio>>>.el-radio-button__orig-radio:checked+.el-radio-button__inner {
|
|
|
- border-left: solid 1px var(--bg-color1);
|
|
|
- background-color: var(--bg-color1);
|
|
|
- border-color: var(--bg-color1);
|
|
|
- -webkit-box-shadow: -1px 0 0 0 var(--bg-color1);
|
|
|
- box-shadow: -1px 0 0 0 var(--bg-color1);
|
|
|
-}
|
|
|
-
|
|
|
-.collapse {
|
|
|
- border: solid 1px #DCDFE6;
|
|
|
- background: #fff;
|
|
|
- border-radius: 10px;
|
|
|
- box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.12);
|
|
|
- overflow: hidden;
|
|
|
-}
|
|
|
-
|
|
|
-.collapse>>>.el-collapse-item__header {
|
|
|
- padding: 0 10px;
|
|
|
-}
|
|
|
-
|
|
|
-.collapse>>>.el-collapse-item__content {
|
|
|
- padding: 20px 10px;
|
|
|
-}
|
|
|
-</style>
|
|
|
-
|
|
|
+<style scoped lang="scss"></style>
|