From f34ab21bb1a72fe5e0f20b001f8906307529ab6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A1=9C=E8=8F=AF?= Date: Fri, 3 Mar 2023 09:38:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nuxt.config.ts | 29 +++++++------------- package-lock.json | 63 ++++++++++++++++++++++++++++++++++++++++--- package.json | 5 +++- pages/index.vue | 31 +++++++++++++++++---- server/api/drawing.ts | 23 +++++++++++++--- 5 files changed, 119 insertions(+), 32 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 784c8ae..bcc8d36 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -15,24 +15,15 @@ export default defineNuxtConfig({ }, nitro: { devProxy: { - '/api': { - target: 'http://106.15.192.42:3000/api' - } + '/api/img': { + target: 'http://106.15.192.42:3000/api/img' + }, + '/api/drawing': { + target: 'http://106.15.192.42:3000/api/drawing' + }, + '/api/text': { + target: 'http://139.224.128.24:7861//api/text_to_text' + }, }, - }, - //devServer: { - // host: '106.15.192.42', - // port: 3000, - // url: 'http://106.15.192.42:3000' - //}, - //vite: { - // server: { - // proxy: { - // '/api': { - // target: 'http://106.15.192.42:3000', - // changeOrigin: true - // } - // } - // } - //} + } }) diff --git a/package-lock.json b/package-lock.json index 74cf9a8..4c31eed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,8 @@ { - "requires": true, + "name": "drawing", + "version": "1.0.0", "lockfileVersion": 1, + "requires": true, "dependencies": { "@ampproject/remapping": { "version": "2.2.0", @@ -1356,6 +1358,11 @@ "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "autoprefixer": { "version": "10.4.13", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", @@ -1370,6 +1377,16 @@ "postcss-value-parser": "^4.2.0" } }, + "axios": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "babel-walk": { "version": "3.0.0-canary-5", "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", @@ -1905,6 +1922,14 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -2230,6 +2255,11 @@ "integrity": "sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -2795,8 +2825,17 @@ "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } }, "formdata-polyfill": { "version": "4.0.10", @@ -3869,6 +3908,19 @@ "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -4835,6 +4887,11 @@ "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", diff --git a/package.json b/package.json index 8ee6201..46fc99e 100644 --- a/package.json +++ b/package.json @@ -22,5 +22,8 @@ "url": "gitea@git.satori.love:gameui/drawing.git" }, "author": "satori.love", - "license": "MIT" + "license": "MIT", + "dependencies": { + "axios": "^1.3.4" + } } diff --git a/pages/index.vue b/pages/index.vue index 3cb96be..482db2e 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -216,7 +216,7 @@ const imageCreate = ref({ const new_task = ref({ model: 'SD2', // 模型 ckpt: '768-v-ema', // 风格参数 - prompt: 'A tabby cat, with a fluffy tail, basking in the sun, bright, warm, very cute!', // 渲染提示词 + prompt: '一只猫, 汤姆', // 渲染提示词 exclude: 'puppets, death, decay, mess', // 排除词汇 number: 1, // 生成图片数量 width: 512, // 图片宽度 @@ -282,10 +282,32 @@ const ModelsSelect = (index, model) => { imageCreate.value.models_show = false } +//// 判断是否为中文 +//const isChinese = (str) => { +// var reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/; +// return reg.test(str); +//} +// +//// 判断是否为英文 +//const isEnglish = (str) => { +// var reg = /^[a-zA-Z]+$/; +// return reg.test(str); +//} +// +//// 翻译中文为英文 +//const translate = async (str) => { +// let res = await fetch('/api/text?zh='+encodeURIComponent(str)) +// let data = await res.json() +// return data.en +//} + // 提交新任务 -const TaskSubmit = () => { - let data = new_task.value - data.exclude = imageCreate.value.exclude_on ? '' : data.exclude // 是否启用排除词汇 +const TaskSubmit = async () => { + const data = Object.assign({}, new_task.value) // 复制一份来修改 + //data.prompt = isChinese(data.prompt) ? await translate(data.prompt) : data.prompt // 翻译中文为英文 + data.exclude = imageCreate.value.exclude_on ? data.exclude : '' // 是否启用排除词汇 + console.log(data) + fetch('/api/drawing', { method: 'POST', headers: {'Content-Type': 'application/json'}, @@ -299,7 +321,6 @@ const TaskSubmit = () => { console.log(data.id, data.status, data.progress) tasks.value = tasks.value.map(x => x.id == data.id ? data : x) if (data.status == 'done') { - //data.data = ['https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png'] window.clearInterval(t2) } }) diff --git a/server/api/drawing.ts b/server/api/drawing.ts index d941476..7c14093 100644 --- a/server/api/drawing.ts +++ b/server/api/drawing.ts @@ -1,3 +1,4 @@ +import axios from 'axios' export default defineEventHandler(async event => { // 获取任务列表的状态进度(普通用户只能看到自己的) @@ -20,9 +21,18 @@ export default defineEventHandler(async event => { return tasks } + // 翻译中文到英文 + const translate = async (text: string, callback:Function) => { + if (!/^[a-zA-Z]+$/.test(text)) return + text = encodeURIComponent(text) + const {data} = await axios.get(`http://139.224.128.24:7861//api/text_to_text?zh=${text}`) + if (callback) callback(data.en) + return data.en + } + // 添加任务到队列(生成一个32位随机字符串作为任务ID) if (event.node.req.method === 'POST') { - const { + let { model = 'SD2', // 模型 ckpt = '768-v-ema', // 风格 image = '', // 图片数据(img2img) @@ -39,14 +49,19 @@ export default defineEventHandler(async event => { const id = Math.random().toString(36).substring(2, 34) // 生成随机任务ID const uid = 1234567890 // 用户ID const createdAt = new Date().getTime() // 设定创建时间 - const status = 'waiting' // 任务状态 + const status = 'translate' // 任务状态(翻译) const progress = 0.00 // 任务进度 const data:any[] = [] // 生成结果 const task = { model, ckpt, image, prompt, remove, number, width, height, seed, sampler, prompt_guidance, quality_details, id, uid, createdAt, status, progress, data } console.log('task:', task) await useStorage().setItem(`task:${task.id}`, task) // 保存任务到内存 - const tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:'))) - console.log('tasks:', tasks) + translate(prompt, (en: string) => { + task.prompt = en + task.status = 'waiting' // 任务状态(排队) + useStorage().setItem(`task:${task.id}`, task) // 修改任务状态 + }) + //const tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:'))) + //console.log('tasks:', tasks) return task }