diff --git a/src/api/image-management.js b/src/api/image-management.js new file mode 100644 index 0000000..2fe46fe --- /dev/null +++ b/src/api/image-management.js @@ -0,0 +1,75 @@ +import request from '@/utils/request' + +// 获取图像管理列表 +export function getImageList(params) { + return request({ + url: '/image-model/page', + method: 'post', + params: params // 使用params而不是data,这样参数会作为URL查询参数传递 + }) +} + +// 获取图像详情 +export function getImageDetail(id) { + return request({ + url: `/api/image-management/${id}`, + method: 'get' + }) +} + +// 创建图像 +export function createImage(data) { + return request({ + url: '/api/image-management', + method: 'post', + data + }) +} + +// 更新图像 +export function updateImage(id, data) { + return request({ + url: `/api/image-management/${id}`, + method: 'put', + data + }) +} + +// 删除图像 +export function deleteImage(uuid) { + return request({ + url: `/image-model/delete/${uuid}`, + method: 'delete' + }) +} + +// 批量删除图像 +export function batchDeleteImages(ids) { + return request({ + url: '/api/image-management/batch-delete', + method: 'post', + data: { ids } + }) +} + +// 上传素材 +export function uploadMaterial(formData, params = {}) { + return request({ + url: '/image-model/upload', + method: 'post', + data: formData, + params: params, // 添加查询参数 + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +// 去除水印 +export function removeWatermark(data) { + return request({ + url: '/image-model/removeWatermar', + method: 'post', + data + }) +} diff --git a/src/api/legal-model.js b/src/api/legal-model.js new file mode 100644 index 0000000..8d8f7a7 --- /dev/null +++ b/src/api/legal-model.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' + +/** + * 法律模型咨询API + * @param {Object} data 咨询数据 + * @param {string} data.consultationType 咨询类型 + * @param {string} data.model 法律模型 + * @param {string} data.coreDemand 核心诉求 + * @param {string} data.consultationPurpose 咨询目的 + * @param {string} data.inputText 咨询内容 + * @returns {Promise} 返回咨询结果 + */ +export function legalConsult(data) { + return request({ + url: '/translation/legal', + method: 'post', + data: data, + timeout: 50000 // 设置50秒超时 + }) +} + +/** + * 获取法律模型列表 + * @returns {Promise} 返回模型列表 + */ +export function getLegalModels() { + return request({ + url: '/legal/models', + method: 'get' + }) +} + +/** + * 获取咨询类型列表 + * @returns {Promise} 返回咨询类型列表 + */ +export function getConsultationTypes() { + return request({ + url: '/api/legal/consultation-types', + method: 'get' + }) +} diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue new file mode 100644 index 0000000..f246640 --- /dev/null +++ b/src/components/Pagination/index.vue @@ -0,0 +1,101 @@ + + + + + + + + + diff --git a/src/directive/waves/index.js b/src/directive/waves/index.js new file mode 100644 index 0000000..5036af5 --- /dev/null +++ b/src/directive/waves/index.js @@ -0,0 +1,66 @@ +import './waves.css' + +const context = '@@wavesContext' + +function handleClick(el, binding) { + function handle(e) { + const customOpts = Object.assign({}, binding.value) + const opts = Object.assign({ + ele: el, // 波纹作用元素 + type: 'hit', // hit 点击位置扩散 center中心点扩展 + color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 + }, + customOpts + ) + const target = opts.ele + if (target) { + target.style.position = 'relative' + target.style.overflow = 'hidden' + const rect = target.getBoundingClientRect() + let ripple = target.querySelector('.waves-ripple') + if (!ripple) { + ripple = document.createElement('span') + ripple.className = 'waves-ripple' + ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px' + target.appendChild(ripple) + } else { + ripple.className = 'waves-ripple' + } + switch (opts.type) { + case 'center': + ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px' + ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px' + break + default: + ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || document.body.scrollTop) + 'px' + ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || document.body.scrollLeft) + 'px' + } + ripple.style.backgroundColor = opts.color + ripple.className = 'waves-ripple z-active' + return false + } + } + if (!el[context]) { + el[context] = { + removeHandle: handle + } + } else { + el[context].removeHandle = handle + } + return handle +} + +export default { + bind(el, binding) { + el.addEventListener('click', handleClick(el, binding), false) + }, + update(el, binding) { + el.removeEventListener('click', el[context].removeHandle, false) + el.addEventListener('click', handleClick(el, binding), false) + }, + unbind(el) { + el.removeEventListener('click', el[context].removeHandle, false) + el[context] = null + delete el[context] + } +} diff --git a/src/directive/waves/waves.css b/src/directive/waves/waves.css new file mode 100644 index 0000000..b8b0989 --- /dev/null +++ b/src/directive/waves/waves.css @@ -0,0 +1,26 @@ +.waves-ripple { + position: absolute; + border-radius: 100%; + background-color: rgba(0, 0, 0, 0.15); + background-clip: padding-box; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + opacity: 1; +} + +.waves-ripple.z-active { + opacity: 0; + -webkit-transform: scale(2); + -ms-transform: scale(2); + transform: scale(2); + -webkit-transition: opacity 0.8s ease-out, -webkit-transform 0.8s ease-out; + transition: opacity 0.8s ease-out, -webkit-transform 0.8s ease-out; + transition: opacity 0.8s ease-out, transform 0.8s ease-out; + transition: opacity 0.8s ease-out, transform 0.8s ease-out, -webkit-transform 0.8s ease-out; +} diff --git a/src/router/index.js b/src/router/index.js index ade7452..e172a74 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -288,6 +288,52 @@ export const constantRoutes = [ name: 'Translation', component: () => import('@/views/text-model/translation'), meta: { title: '翻译模型', icon: 'el-icon-translation' } + }, + { + path: 'legal-model', + name: 'LegalModel', + component: () => import('@/views/text-model/legal-model'), + meta: { title: '法律模型', icon: 'el-icon-scale' } + } + ] + }, + + { + path: '/image-model', + component: Layout, + redirect: '/image-model/background-model', + name: 'ImageModelRoot', + meta: { title: '图像模型', icon: 'el-icon-picture' }, + children: [ + { + path: 'image-list', + name: 'ImageList', + component: () => import('@/views/image-model/image-list'), + meta: { title: '图像管理列表', icon: 'el-icon-picture' } + }, + { + path: 'poster-generation', + name: 'PosterGeneration', + component: () => import('@/views/image-model/poster-generation'), + meta: { title: '海报生成', icon: 'el-icon-picture-outline-round' } + }, + { + path: 'remove-watermark', + name: 'RemoveWatermark', + component: () => import('@/views/image-model/remove-watermark'), + meta: { title: '去除水印', icon: 'el-icon-brush' } + }, + { + path: 'background-model', + name: 'BackgroundModel', + component: () => import('@/views/image-model/background-model'), + meta: { title: '图像背景模型', icon: 'el-icon-picture-outline' } + }, + { + path: 'virtual-model', + name: 'VirtualModel', + component: () => import('@/views/image-model/virtual-model'), + meta: { title: '虚拟模特儿模型', icon: 'el-icon-user' } } ] }, diff --git a/src/utils/scroll-to.js b/src/utils/scroll-to.js new file mode 100644 index 0000000..c5d8e04 --- /dev/null +++ b/src/utils/scroll-to.js @@ -0,0 +1,58 @@ +Math.easeInOutQuad = function(t, b, c, d) { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b +} + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +var requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } +})() + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +function move(amount) { + document.documentElement.scrollTop = amount + document.body.parentNode.scrollTop = amount + document.body.scrollTop = amount +} + +function position() { + return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop +} + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export function scrollTo(to, duration, callback) { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + var animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + var val = Math.easeInOutQuad(currentTime, start, change, duration) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() +} diff --git a/src/views/image-model/background-model.vue b/src/views/image-model/background-model.vue new file mode 100644 index 0000000..22261d5 --- /dev/null +++ b/src/views/image-model/background-model.vue @@ -0,0 +1,26 @@ + + + + + 图像背景模型 + + + + + + + + + + + + + diff --git a/src/views/image-model/image-list.vue b/src/views/image-model/image-list.vue new file mode 100644 index 0000000..f7196d1 --- /dev/null +++ b/src/views/image-model/image-list.vue @@ -0,0 +1,910 @@ + + + + + + + + + + + + + + + + + + 搜索 + + + 新增 + + + 上传素材 + + + 批量删除 + + + + + + + + + {{ (listQuery.current - 1) * listQuery.size + scope.$index + 1 }} + + + + + {{ scope.row.imageName }} + + + + + {{ scope.row.modelName }} + + + + + {{ scope.row.ownerName }} + + + + + {{ scope.row.ownerPhone }} + + + + + + {{ getImageTypeText(scope.row.imageType) }} + + + + + + + 查看 + + - + + + + + + 查看 + + - + + + + + {{ scope.row.prompt || '-' }} + + + + + {{ scope.row.functionName || '-' }} + + + + + {{ scope.row.scaleFactor || '-' }} + + + + + {{ formatDateTime(scope.row.updateTime) }} + + + + + + 查看 + + + 编辑 + + + 去除水印 + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 将文件拖到此处,或点击上传 + 只能上传jpg/png文件,且不超过10MB + + + + + + + + + + + + + + + + + diff --git a/src/views/image-model/poster-generation.vue b/src/views/image-model/poster-generation.vue new file mode 100644 index 0000000..a599aa7 --- /dev/null +++ b/src/views/image-model/poster-generation.vue @@ -0,0 +1,27 @@ + + + + + 海报生成 + + + + + + + + + + + + + + diff --git a/src/views/image-model/remove-watermark.vue b/src/views/image-model/remove-watermark.vue new file mode 100644 index 0000000..095785e --- /dev/null +++ b/src/views/image-model/remove-watermark.vue @@ -0,0 +1,26 @@ + + + + + 去除水印 + + + + + + + + + + + + + diff --git a/src/views/image-model/virtual-model.vue b/src/views/image-model/virtual-model.vue new file mode 100644 index 0000000..b7db46f --- /dev/null +++ b/src/views/image-model/virtual-model.vue @@ -0,0 +1,26 @@ + + + + + 虚拟模特儿模型 + + + + + + + + + + + + + diff --git a/src/views/text-model/index.vue b/src/views/text-model/index.vue index 4b42b18..601d73a 100644 --- a/src/views/text-model/index.vue +++ b/src/views/text-model/index.vue @@ -19,12 +19,12 @@ - + - + - 文本生成 - 智能文本生成,即将上线 + 法律模型 + 专业法律咨询,提供法律问题解答服务 @@ -50,6 +50,9 @@ export default { methods: { goToTranslation() { this.$router.push('/text-model/translation') + }, + goToLegalModel() { + this.$router.push('/text-model/legal-model') } } } diff --git a/src/views/text-model/legal-model.vue b/src/views/text-model/legal-model.vue new file mode 100644 index 0000000..63ded89 --- /dev/null +++ b/src/views/text-model/legal-model.vue @@ -0,0 +1,311 @@ + + + + + + 法律模型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ processing ? '处理中...' : '提交咨询' }} + + 清空 + + + + + + + + + + + + + 输入tokens: + {{ usageInfo.input_tokens }} + + + 输出tokens: + {{ usageInfo.output_tokens }} + + + 总tokens: + {{ usageInfo.total_tokens }} + + + + + + + + + + + + +