diff --git a/src/api/depth-canvas.ts b/src/api/depth-canvas.ts index 76a1db7..8570ee8 100644 --- a/src/api/depth-canvas.ts +++ b/src/api/depth-canvas.ts @@ -39,3 +39,16 @@ export const deleteDepthCanvas = (id: string) => { loading: true, }) } + +/** + * 获取分隔后图片 + * @param data 分隔参数数据 + * @returns 分隔后图片数据 + */ +export const getSegAnythingImage = (data: object) => { + return request({ + url: `/api/python/segAnything`, + method: 'post', + data, + }) +} diff --git a/src/api/user.ts b/src/api/user.ts index d96a8fc..ff68dd5 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -133,3 +133,18 @@ export const getAvatarLimit = () => { }) } +/** + * 获取用户风格图片列表 + * @param params 获取用户风格图片列表的参数 + * @param params.pageNum 页码 + * @param params.pageSize 每页数量 + * @returns 用户风格图片列表 +*/ +export const GetUserStyleImages = (params) => { + return request({ + url: '/api/user/style/images', + method: 'get', + params, + loading: true, + }) +} diff --git a/src/assets/css/style.css b/src/assets/css/style.css index ac0dcd0..a697b4c 100644 --- a/src/assets/css/style.css +++ b/src/assets/css/style.css @@ -96,3 +96,10 @@ body, --el-color-primary-dark-2: #565656; /* 深灰色(加深20%) */ } +.mini-scrollbar::-webkit-scrollbar { + width: 0.4rem; +} +.mini-scrollbar::-webkit-scrollbar-thumb { + border-radius: 0.4rem; + background: rgba(0, 0, 0, 0.2); +} diff --git a/src/assets/css/style.less b/src/assets/css/style.less index fd26490..cece99a 100644 --- a/src/assets/css/style.less +++ b/src/assets/css/style.less @@ -105,3 +105,15 @@ body, --el-color-primary-light-9: #e3e3e3; /* 极浅的灰色(混合60%白) */ --el-color-primary-dark-2: #565656; /* 深灰色(加深20%) */ } + + +// 迷你滚动条 +.mini-scrollbar { + &::-webkit-scrollbar { + width: 0.4rem; + } + &::-webkit-scrollbar-thumb { + border-radius: 0.4rem; + background: rgba(0, 0, 0, 0.2); + } +} diff --git a/src/assets/icons/clipAdd.svg b/src/assets/icons/clipAdd.svg new file mode 100644 index 0000000..d7b4773 --- /dev/null +++ b/src/assets/icons/clipAdd.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/clipMinus.svg b/src/assets/icons/clipMinus.svg new file mode 100644 index 0000000..dec342c --- /dev/null +++ b/src/assets/icons/clipMinus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/dc/create.svg b/src/assets/icons/dc/create.svg new file mode 100644 index 0000000..a3aa896 --- /dev/null +++ b/src/assets/icons/dc/create.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/dc/reset.svg b/src/assets/icons/dc/reset.svg new file mode 100644 index 0000000..eae205a --- /dev/null +++ b/src/assets/icons/dc/reset.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/history.svg b/src/assets/icons/history.svg index 0c4a0d5..a6b935f 100644 --- a/src/assets/icons/history.svg +++ b/src/assets/icons/history.svg @@ -1,3 +1,3 @@ - + diff --git a/src/components/Assistant/assistant.vue b/src/components/Assistant/assistant.vue index 64a8193..502b225 100644 --- a/src/components/Assistant/assistant.vue +++ b/src/components/Assistant/assistant.vue @@ -86,7 +86,7 @@ width: 46.69rem; height: 56.6rem; flex-shrink: 0; - // background-color: #fff; + background-color: #fff; box-shadow: 0px 19.44px 27.22px 0px #0000000d; border: 1px solid; border-image-source: linear-gradient( diff --git a/src/components/Canvas/DepthCanvas/components/ai-selectbox-panel.vue b/src/components/Canvas/DepthCanvas/components/ai-selectbox-panel.vue index 58f33bf..879e978 100644 --- a/src/components/Canvas/DepthCanvas/components/ai-selectbox-panel.vue +++ b/src/components/Canvas/DepthCanvas/components/ai-selectbox-panel.vue @@ -10,7 +10,14 @@ {{ item.label }} - + + @@ -21,6 +28,8 @@ import depthSlider from './tools/depth-slider.vue' import { OperationType } from '../tools/layerHelper' import brushControlPanel from './brush-control-panel.vue' + import { useI18n } from 'vue-i18n' + const { t } = useI18n() const props = defineProps({ currentTool: { required: true, type: [String, null] } @@ -37,22 +46,22 @@ { type: OperationType.AISELECT_ADD, name: 'dc-add_sb', - label: 'Add' + label: t('DepthCanvas.add') }, { type: OperationType.AISELECT_REMOVE, name: 'dc-remove_sb', - label: 'Remove' + label: t('DepthCanvas.remove') }, { type: OperationType.AISELECT_DRAW, name: 'dc-brush_sb', - label: 'Brush' + label: t('DepthCanvas.brush') }, { type: OperationType.AISELECT_ERASER, name: 'dc-erase_sb', - label: 'Erase' + label: t('DepthCanvas.erase') } ]) const onClickItem = (type: string) => { @@ -61,6 +70,9 @@ const onCreate = () => { stateManager.aiSelectboxToolManager.createSelectbox() } + const onReset = () => { + stateManager.aiSelectboxToolManager.resetDemoObject() + } diff --git a/src/components/Canvas/DepthCanvas/components/depth-header-tools.vue b/src/components/Canvas/DepthCanvas/components/depth-header-tools.vue index 1a52eb3..a9622f7 100644 --- a/src/components/Canvas/DepthCanvas/components/depth-header-tools.vue +++ b/src/components/Canvas/DepthCanvas/components/depth-header-tools.vue @@ -30,7 +30,7 @@ @@ -49,6 +49,8 @@ import { ref, inject, computed } from 'vue' import { exportCanvasToImage } from '../tools/exportMethod' import { OperationType, BlendMode } from '../tools/layerHelper' + import { useI18n } from 'vue-i18n' + const { t } = useI18n() const props = defineProps({ zoom: { default: 1, type: Number }, step: { default: 0.1, type: Number } @@ -86,37 +88,37 @@ child: [ { name: OperationType.RECTANGLE, - label: 'Rectangle', + label: t('DepthCanvas.rectangle'), icon: 'dc-rectangle', iconSize: 13 }, { name: OperationType.LINE, - label: 'Line', + label: t('DepthCanvas.line'), icon: 'dc-line', iconSize: 10 }, { name: OperationType.ARROW, - label: 'Arrow', + label: t('DepthCanvas.arrow'), icon: 'dc-arrow', iconSize: 11 }, { name: OperationType.ELLIPSE, - label: 'Ellipse', + label: t('DepthCanvas.ellipse'), icon: 'dc-ellipse', iconSize: 15 }, { name: OperationType.TRIANGLE, - label: 'Polygon', + label: t('DepthCanvas.triangle'), icon: 'dc-triangle', iconSize: 14 }, { name: OperationType.STAR, - label: 'Star', + label: t('DepthCanvas.star'), icon: 'dc-star', iconSize: 15 } diff --git a/src/components/Canvas/DepthCanvas/components/details-panel/basic-info.vue b/src/components/Canvas/DepthCanvas/components/details-panel/basic-info.vue index da5b100..c0e7f53 100644 --- a/src/components/Canvas/DepthCanvas/components/details-panel/basic-info.vue +++ b/src/components/Canvas/DepthCanvas/components/details-panel/basic-info.vue @@ -1,64 +1,153 @@ diff --git a/src/lang/en.ts b/src/lang/en.ts index 31f6a52..b49ec3e 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -81,7 +81,8 @@ export default { userAgreement: 'User Agreement', privacyPolicy: 'Privacy Policy', view: 'View', - remainingNum: 'Remaining number of times to upload profile picture:' + remainingNum: 'Remaining number of times to upload profile picture:', + notFound: 'Project not found', }, Country: { unitedStates: 'United States', @@ -135,7 +136,9 @@ export default { confirm: 'Confirm', styleTitle: 'Settings', createProject: 'Create Project', - trendingReport: 'Trending report' + trendingReport: 'Trending report', + reportPlaceholder: + 'Generate a furniture trending report for 2026, including popular styles and design directions.' }, area: { unitedStates: 'United States', @@ -200,5 +203,54 @@ export default { threeModel: { loading: 'Loading', download: 'Download' + }, + DepthCanvas: { + layer: "Layer", + editDetails: "Edit Details", + export: "Export", + save: "Save", + workbench: "Workbench", + position: "Position", + size: "Size", + appearance: "Appearance", + opacity: "Opacity", + cornerRadius: "Cor Radius", + strokeWidth: "Stroke Width", + color: "Color", + image: "Image", + settings: "Settings", + rotation: "Rotation", + scale: "Scale", + gapX: "Gap X", + gapY: "Gap Y", + offset: "Offset", + emptyLayer: "Empty Layer", + aiGroupLayer: "AI Group Layer", + textLayer: "Text Layer", + rectLayer: "Rect Layer", + lineLayer: "Line Layer", + ellipseLayer: "Ellipse Layer", + triangleLayer: "Triangle Layer", + starLayer: "Star Layer", + arrowLayer: "Arrow Layer", + imageLayer: "Image Layer", + mergeLayer: "Merge Layer", + rectangle: "Rectangle", + line: "Line", + arrow: "Arrow", + ellipse: "Ellipse", + triangle: "Triangle", + star: "Star", + add: "Add", + remove: "Remove", + brush: "Brush", + erase: "Erase", + create: "Create", + reset: "Reset" + }, + clipDialog: { + title: 'Upload your profile photo', + cancel: 'Cancel', + confirm: 'Save' } } diff --git a/src/lang/zh-cn.ts b/src/lang/zh-cn.ts index e7e33e4..2c9e030 100644 --- a/src/lang/zh-cn.ts +++ b/src/lang/zh-cn.ts @@ -82,7 +82,8 @@ export default { userAgreement: '用户协议', privacyPolicy: '隐私政策', view: '查看', - remainingNum: '剩余上传头像次数:' + remainingNum: '剩余上传头像次数:', + notFound: '项目不存在', }, Country: { unitedStates: '美国', @@ -128,7 +129,8 @@ export default { confirm: '确认', styleTitle: '设置', createProject: '创建项目', - trendingReport: '趋势报告' + trendingReport: '趋势报告', + reportPlaceholder: '生成一份2026年家具流行趋势报告,内容包括流行风格和设计方向。' }, area: { unitedStates: '美国', @@ -153,7 +155,7 @@ export default { quote: '引用', delete: '删除', edit: '编辑', - generatingReport:'正在为您生成报告,可能需要几分钟时间,生成期间你可以继续进行其他任务' + generatingReport: '正在为您生成报告,可能需要几分钟时间,生成期间你可以继续进行其他任务' }, // Version Tree @@ -197,5 +199,54 @@ export default { threeModel: { loading: '加载中', download: '下载' + }, + DepthCanvas: { + layer: "图层", + editDetails: "编辑详情", + export: "导出", + save: "保存", + workbench: "工作台", + position: "位置", + size: "大小", + appearance: "外观", + opacity: "透明度", + cornerRadius: "圆角半径", + strokeWidth: "边框宽度", + color: "颜色", + image: "图片", + settings: "设置", + rotation: "旋转角度", + scale: "缩放", + gapX: "水平间距", + gapY: "垂直间距", + offset: "偏移量", + emptyLayer: "空图层", + aiGroupLayer: "智能选区组", + textLayer: "文本图层", + rectLayer: "矩形图层", + lineLayer: "直线图层", + ellipseLayer: "椭圆图层", + triangleLayer: "三角形图层", + starLayer: "五角星图层", + arrowLayer: "箭头图层", + imageLayer: "图片图层", + mergeLayer: "合并图层", + rectangle: "矩形", + line: "直线", + arrow: "箭头", + ellipse: "椭圆", + triangle: "三角形", + star: "五角星", + add: "添加", + remove: "删除", + brush: "画笔", + erase: "擦除", + create: "创建", + reset: "重置" + }, + clipDialog: { + title: '上传您的个人资料照片', + cancel: '取消', + confirm: '保存' } } diff --git a/src/views/home/agent/components/Agent.vue b/src/views/home/agent/components/Agent.vue index ad6cfdd..7033d44 100644 --- a/src/views/home/agent/components/Agent.vue +++ b/src/views/home/agent/components/Agent.vue @@ -56,7 +56,7 @@ const isGenerating = ref(false) const isPaused = ref(false) // 标记是否为主动暂停 const params = reactive({ - projectID: projectStore.state.id, + projectID: null, message: '', token: userStore.state.token, versionID: '', @@ -170,13 +170,16 @@ const abortController = createAbortController() // console.log('token---', params.token, '参数---', params) - + params.projectID = projectStore.state.id try { const urlParams = new URLSearchParams({ ...params, configParams: JSON.stringify(params.configParams) }) const BASEURL = import.meta.env.VITE_APP_URL + // console.log('params', params) + + // debugger const response = await fetch(`${BASEURL}${chatUrl}?${urlParams.toString()}`, { method: 'GET', signal: abortController.signal @@ -496,6 +499,7 @@ let combinedThinkingText = item.reasoning || '' let combinedImageUrl = item.image_url || null let reportName = item.reportName || null + let webAddress = item.webAddress || null // 继续往后找连续的 assistant 消息 let j = i + 1 while (j < dialogue.length && dialogue[j].role === 'assistant') { @@ -508,6 +512,12 @@ if (dialogue[j].reportName) { reportName = dialogue[j].reportName } + if (dialogue[j].webAddress) { + combinedContent += `` + webAddress = dialogue[j].webAddress + // console.log('webAddress22222222222222', dialogue[j].webAddress) + // debugger + } j++ } @@ -523,6 +533,7 @@ thinkingText: combinedThinkingText, text: combinedContent, image_url: combinedImageUrl, + webAddress: !!webAddress ? JSON.parse(webAddress) : null, isUser: false, id: result.length + 1, sessionId: sessionId diff --git a/src/views/home/agent/components/Item.vue b/src/views/home/agent/components/Item.vue index 629b508..bc149b1 100644 --- a/src/views/home/agent/components/Item.vue +++ b/src/views/home/agent/components/Item.vue @@ -76,7 +76,7 @@ {{ content.webAddress?.length }} web pages have been retrieved. - +
() + // watch( + // () => props.content, + // (newVal) => { + // console.log('props', newVal) + // }, + // { deep: true,immediate: true } + // ) + const emit = defineEmits(['regenerate']) const userAvatar = computed(() => { @@ -321,12 +329,14 @@ width: 100%; height: 100%; border-radius: 50%; + object-fit: cover; } } .message-context { line-height: 2rem; font-size: 1.4rem; width: 82%; + word-break: break-word; } &.is-user .message-context { width: fit-content; diff --git a/src/views/home/agent/components/Pause.vue b/src/views/home/agent/components/Pause.vue index 452052e..eccfa75 100644 --- a/src/views/home/agent/components/Pause.vue +++ b/src/views/home/agent/components/Pause.vue @@ -13,11 +13,12 @@ width: 100%; height: 3.6rem; line-height: 3.6rem; - column-gap: 0.6rem; - padding: 0 1.2rem; + column-gap: 0.6rem; + padding: 0 1.2rem; background-color: #fffcf4; - border-radius: 0.4rem; - margin-top: 1rem; + border-radius: 0.4rem; + margin-top: 1rem; + color: #ff7a51; &::before { content: ''; @@ -30,22 +31,18 @@ rgba(233, 121, 60, 0.3) 1.61%, rgba(255, 207, 144, 0.3) 101.01% ); - -webkit-mask: - linear-gradient(#fff 0 0) content-box, - linear-gradient(#fff 0 0); - mask: - linear-gradient(#fff 0 0) content-box, - linear-gradient(#fff 0 0); + -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; } - .c-svg{ - width: initial; - .svg-icon{ - width: 1.2rem; - height: 1.2rem; - } - } + .c-svg { + width: initial; + .svg-icon { + width: 1.2rem; + height: 1.2rem; + } + } } diff --git a/src/views/home/agent/components/ReportCard.vue b/src/views/home/agent/components/ReportCard.vue index 6f17ef1..f73cac9 100644 --- a/src/views/home/agent/components/ReportCard.vue +++ b/src/views/home/agent/components/ReportCard.vue @@ -1,8 +1,8 @@