diff --git a/api/core/types/jimeng.go b/api/core/types/jimeng.go index bd9bde14..40defd14 100644 --- a/api/core/types/jimeng.go +++ b/api/core/types/jimeng.go @@ -9,10 +9,8 @@ type JimengConfig struct { // JimengPower 即梦AI算力配置 type JimengPower struct { - TextToImage int `json:"text_to_image"` - ImageToImage int `json:"image_to_image"` - ImageEdit int `json:"image_edit"` - ImageEffects int `json:"image_effects"` - TextToVideo int `json:"text_to_video"` - ImageToVideo int `json:"image_to_video"` + Image int `json:"image"` // 图片生成算力,单位:积分/张 + Video int `json:"video"` // 视频生成算力,单位:积分/秒 + VirtualHuman int `json:"virtual_human"` // 数字人视频生成算力,单位:积分/秒 + ActionTransfer int `json:"action_transfer"` // 视频动作迁移算力,单位:积分/秒 } diff --git a/api/handler/admin/jimeng_handler.go b/api/handler/admin/jimeng_handler.go index fdccf307..1e2ec780 100644 --- a/api/handler/admin/jimeng_handler.go +++ b/api/handler/admin/jimeng_handler.go @@ -231,28 +231,20 @@ func (h *AdminJimengHandler) UpdateConfig(c *gin.Context) { } // 验证算力配置 - if req.Power.TextToImage <= 0 { - resp.ERROR(c, "文生图算力必须大于0") + if req.Power.Image <= 0 { + resp.ERROR(c, "图片生成算力必须大于0") return } - if req.Power.ImageToImage <= 0 { - resp.ERROR(c, "图生图算力必须大于0") + if req.Power.Video <= 0 { + resp.ERROR(c, "视频生成算力必须大于0") return } - if req.Power.ImageEdit <= 0 { - resp.ERROR(c, "图片编辑算力必须大于0") + if req.Power.VirtualHuman <= 0 { + resp.ERROR(c, "数字人生成算力必须大于0") return } - if req.Power.ImageEffects <= 0 { - resp.ERROR(c, "图片特效算力必须大于0") - return - } - if req.Power.TextToVideo <= 0 { - resp.ERROR(c, "文生视频算力必须大于0") - return - } - if req.Power.ImageToVideo <= 0 { - resp.ERROR(c, "图生视频算力必须大于0") + if req.Power.ActionTransfer <= 0 { + resp.ERROR(c, "视频动作迁移算力必须大于0") return } diff --git a/api/handler/jimeng_handler.go b/api/handler/jimeng_handler.go index 439da831..c7e64335 100644 --- a/api/handler/jimeng_handler.go +++ b/api/handler/jimeng_handler.go @@ -132,8 +132,8 @@ func (h *JimengHandler) CreateTask(c *gin.Context) { switch req.TaskType { case "text_to_image": - powerCost = h.getPowerFromConfig(model.JMTaskTypeTextToImage) - taskType = model.JMTaskTypeTextToImage + powerCost = h.getPowerFromConfig(model.JMTaskTypeImage) + taskType = model.JMTaskTypeImage reqKey = jimeng.ReqKeyTextToImage modelName = "即梦文生图" if req.Scale == 0 { @@ -147,8 +147,8 @@ func (h *JimengHandler) CreateTask(c *gin.Context) { "use_pre_llm": req.UsePreLLM, } case "image_to_image": - powerCost = h.getPowerFromConfig(model.JMTaskTypeImageToImage) - taskType = model.JMTaskTypeImageToImage + powerCost = h.getPowerFromConfig(model.JMTaskTypeVideo) + taskType = model.JMTaskTypeVideo reqKey = jimeng.ReqKeyImageToImagePortrait modelName = "即梦图生图" if req.Gpen == 0 { @@ -175,8 +175,8 @@ func (h *JimengHandler) CreateTask(c *gin.Context) { "seed": req.Seed, } case "image_edit": - powerCost = h.getPowerFromConfig(model.JMTaskTypeImageEdit) - taskType = model.JMTaskTypeImageEdit + powerCost = h.getPowerFromConfig(model.JMTaskTypeVirtualHuman) + taskType = model.JMTaskTypeVirtualHuman reqKey = jimeng.ReqKeyImageEdit modelName = "即梦图像编辑" if req.Scale == 0 { @@ -188,8 +188,8 @@ func (h *JimengHandler) CreateTask(c *gin.Context) { } params["image_urls"] = []string{req.ImageInput} case "image_effects": - powerCost = h.getPowerFromConfig(model.JMTaskTypeImageEffects) - taskType = model.JMTaskTypeImageEffects + powerCost = h.getPowerFromConfig(model.JMTaskTypeActionTransfer) + taskType = model.JMTaskTypeActionTransfer reqKey = jimeng.ReqKeyImageEffects modelName = "即梦图像特效" if req.Width == 0 { @@ -205,8 +205,8 @@ func (h *JimengHandler) CreateTask(c *gin.Context) { "height": req.Height, } case "text_to_video": - powerCost = h.getPowerFromConfig(model.JMTaskTypeTextToVideo) - taskType = model.JMTaskTypeTextToVideo + powerCost = h.getPowerFromConfig(model.JMTaskTypeVideo) + taskType = model.JMTaskTypeVideo reqKey = jimeng.ReqKeyTextToVideo modelName = "即梦文生视频" if req.AspectRatio == "" { @@ -217,8 +217,8 @@ func (h *JimengHandler) CreateTask(c *gin.Context) { "aspect_ratio": req.AspectRatio, } case "image_to_video": - powerCost = h.getPowerFromConfig(model.JMTaskTypeImageToVideo) - taskType = model.JMTaskTypeImageToVideo + powerCost = h.getPowerFromConfig(model.JMTaskTypeVideo) + taskType = model.JMTaskTypeVideo reqKey = jimeng.ReqKeyImageToVideo modelName = "即梦图生视频" params = map[string]any{ @@ -287,17 +287,9 @@ func (h *JimengHandler) Jobs(c *gin.Context) { switch req.Filter { case "image": - query = query.Where("type IN (?)", []model.JMTaskType{ - model.JMTaskTypeTextToImage, - model.JMTaskTypeImageToImage, - model.JMTaskTypeImageEdit, - model.JMTaskTypeImageEffects, - }) + query = query.Where("type = ?", model.JMTaskTypeImage) case "video": - query = query.Where("type IN (?)", []model.JMTaskType{ - model.JMTaskTypeTextToVideo, - model.JMTaskTypeImageToVideo, - }) + query = query.Where("type = ?", model.JMTaskTypeVideo) } if len(req.Ids) > 0 { @@ -438,18 +430,14 @@ func (h *JimengHandler) getPowerFromConfig(taskType model.JMTaskType) int { config := h.App.SysConfig.Jimeng switch taskType { - case model.JMTaskTypeTextToImage: - return config.Power.TextToImage - case model.JMTaskTypeImageToImage: - return config.Power.ImageToImage - case model.JMTaskTypeImageEdit: - return config.Power.ImageEdit - case model.JMTaskTypeImageEffects: - return config.Power.ImageEffects - case model.JMTaskTypeTextToVideo: - return config.Power.TextToVideo - case model.JMTaskTypeImageToVideo: - return config.Power.ImageToVideo + case model.JMTaskTypeImage: + return config.Power.Image + case model.JMTaskTypeVideo: + return config.Power.Video + case model.JMTaskTypeVirtualHuman: + return config.Power.VirtualHuman + case model.JMTaskTypeActionTransfer: + return config.Power.ActionTransfer default: return 10 } @@ -459,11 +447,9 @@ func (h *JimengHandler) getPowerFromConfig(taskType model.JMTaskType) int { func (h *JimengHandler) GetPowerConfig(c *gin.Context) { config := h.App.SysConfig.Jimeng resp.SUCCESS(c, gin.H{ - "text_to_image": config.Power.TextToImage, - "image_to_image": config.Power.ImageToImage, - "image_edit": config.Power.ImageEdit, - "image_effects": config.Power.ImageEffects, - "text_to_video": config.Power.TextToVideo, - "image_to_video": config.Power.ImageToVideo, + "image": config.Power.Image, + "video": config.Power.Video, + "image_edit": config.Power.VirtualHuman, + "image_effects": config.Power.ActionTransfer, }) } diff --git a/api/service/jimeng/service.go b/api/service/jimeng/service.go index 48ddd288..164658d7 100644 --- a/api/service/jimeng/service.go +++ b/api/service/jimeng/service.go @@ -199,18 +199,14 @@ func (s *Service) buildTaskRequest(job *model.JimengJob) (*SubmitTaskRequest, er // 根据任务类型设置特定参数 switch job.Type { - case model.JMTaskTypeTextToImage: + case model.JMTaskTypeImage: s.setTextToImageParams(req, params) - case model.JMTaskTypeImageToImage: + case model.JMTaskTypeVideo: s.setImageToImageParams(req, params) - case model.JMTaskTypeImageEdit: + case model.JMTaskTypeVirtualHuman: s.setImageEditParams(req, params) - case model.JMTaskTypeImageEffects: + case model.JMTaskTypeActionTransfer: s.setImageEffectsParams(req, params) - case model.JMTaskTypeTextToVideo: - s.setTextToVideoParams(req, params) - case model.JMTaskTypeImageToVideo: - s.setImageToVideoParams(req, params) default: return nil, fmt.Errorf("unsupported task type: %s", job.Type) } diff --git a/api/store/model/jimeng_job.go b/api/store/model/jimeng_job.go index 4c7c7046..5340115d 100644 --- a/api/store/model/jimeng_job.go +++ b/api/store/model/jimeng_job.go @@ -41,12 +41,10 @@ const ( type JMTaskType string const ( - JMTaskTypeTextToImage = JMTaskType("text_to_image") // 文生图 - JMTaskTypeImageToImage = JMTaskType("image_to_image") // 图生图 - JMTaskTypeImageEdit = JMTaskType("image_edit") // 图像编辑 - JMTaskTypeImageEffects = JMTaskType("image_effects") // 图像特效 - JMTaskTypeTextToVideo = JMTaskType("text_to_video") // 文生视频 - JMTaskTypeImageToVideo = JMTaskType("image_to_video") // 图生视频 + JMTaskTypeImage = JMTaskType("image") // 文生图 + JMTaskTypeVideo = JMTaskType("video") // 图生图 + JMTaskTypeVirtualHuman = JMTaskType("virtual_human") // 图像编辑 + JMTaskTypeActionTransfer = JMTaskType("action_transfer") // 图像特效 ) // TableName 返回数据表名称 diff --git a/web/src/assets/css/jimeng.scss b/web/src/assets/css/jimeng.scss index b5439284..c2a23ae2 100644 --- a/web/src/assets/css/jimeng.scss +++ b/web/src/assets/css/jimeng.scss @@ -49,16 +49,17 @@ .category-btn { display: flex; - flex-direction: column; + flex-direction: row; + justify-content: center; align-items: center; - padding: 15px 10px; + padding: 10px 15px; border: 2px solid var(--border-color, #f0f0f0); border-radius: 12px; cursor: pointer; transition: all 0.3s ease; background: var(--card-bg-secondary, #fafafa); /* 暗色主题支持 */ - [data-theme="dark"] & { + [data-theme='dark'] & { background: var(--card-bg-secondary-dark, #23242a); border-color: var(--border-color-dark, #33343a); } @@ -66,7 +67,7 @@ &:hover { border-color: var(--primary-color, #5865f2); background: var(--card-bg-hover, #f8f9ff); - [data-theme="dark"] & { + [data-theme='dark'] & { background: var(--card-bg-hover-dark, #2a2b31); } transform: translateY(-2px); @@ -76,8 +77,11 @@ border-color: var(--primary-color, #5865f2); background: var(--primary-gradient, linear-gradient(135deg, #5865f2 0%, #7289da 100%)); color: var(--primary-text-on-primary, #fff); - [data-theme="dark"] & { - background: var(--primary-gradient-dark, linear-gradient(135deg, #23242a 0%, #2a2b31 100%)); + [data-theme='dark'] & { + background: var( + --primary-gradient-dark, + linear-gradient(135deg, #23242a 0%, #2a2b31 100%) + ); color: var(--primary-text-on-primary-dark, #fff); } transform: translateY(-2px); @@ -96,108 +100,6 @@ } } } - - // 功能开关 - .function-switch { - margin-bottom: 25px; - - .switch-label { - display: flex; - align-items: center; - margin-bottom: 15px; - font-size: 16px; - font-weight: 600; - color: var(--text-theme-color); - - .el-icon { - margin-right: 8px; - color: var(--primary-color, #5865f2); - } - } - - .switch-container { - display: flex; - align-items: center; - justify-content: space-between; - padding: 5px 15px; - border: 1px solid var(--border-color, #e0e0e0); - border-radius: 10px; - background: var(--card-bg-secondary, #f9f9f9); - [data-theme="dark"] & { - background: var(--card-bg-secondary-dark, #23242a); - border-color: var(--border-color-dark, #33343a); - } - - .switch-info { - flex: 1; - - .switch-title { - font-size: 14px; - font-weight: 600; - color: var(--text-theme-color); - margin-bottom: 4px; - } - - .switch-desc { - font-size: 12px; - color: var(--text-sub-color, #666); - } - } - } - } - - // 参数容器 - .params-container { - .function-panel { - .param-line { - margin-bottom: 15px; - - &.pt { - margin-top: 20px; - } - - .label { - display: flex; - align-items: center; - margin-bottom: 8px; - font-weight: 600; - color: var(--text-theme-color); - } - } - - .item-group { - display: flex; - align-items: center; - margin-bottom: 15px; - - .label { - margin-right: 15px; - font-weight: 600; - color: var(--text-theme-color); - min-width: 80px; - } - } - - .text-info { - margin: 20px 0; - padding: 15px; - background: var(--info-bg, #f0f8ff); - border-radius: 8px; - border-left: 4px solid var(--primary-color, #5865f2); - } - - .submit-btn { - margin-top: 30px; - - .el-button { - width: 100%; - height: 50px; - font-size: 16px; - font-weight: 600; - } - } - } - } } // 右侧主要内容区域 @@ -239,6 +141,23 @@ &:hover { box-shadow: 0 4px 24px rgba(88, 101, 242, 0.12); } + + // 增强任务项悬停动画 + transition: box-shadow 3s cubic-bezier(0.4, 0, 0.2, 1), + transform 0.5s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.5s; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); + border: 1.5px solid transparent; + border-radius: 12px; + background: #fff; + position: relative; + z-index: 1; + + &:hover { + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18), 0 1.5px 8px rgba(0, 0, 0, 0.1); + border-color: #a259ff; + transform: scale(1.025) translateY(-2px); + z-index: 10; + } .task-left { width: 100%; flex: none; @@ -253,18 +172,69 @@ display: flex; align-items: center; justify-content: center; - .preview-image, .preview-video { + .preview-image, + .preview-video { width: 100%; height: 100%; object-fit: cover; } + + // 视频预览包装器 + .preview-video-wrapper { + position: relative; + width: 100%; + height: 100%; + + .video-mask { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.25); + display: flex; + justify-content: center; + align-items: center; + opacity: 0; + transition: opacity 0.2s; + z-index: 2; + } + + &:hover .video-mask { + opacity: 1; + } + + .play-btn { + width: 64px; + height: 64px; + background: rgba(255, 255, 255, 0.3); + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + cursor: pointer; + z-index: 3; + transition: background 0.2s; + + &:hover { + background: rgba(255, 255, 255, 0.4); + } + + img { + width: 36px; + height: 36px; + } + } + } .preview-placeholder { display: flex; flex-direction: column; align-items: center; color: var(--text-disabled-color, #999); font-size: 16px; - .el-icon, .iconfont { + .el-icon, + .iconfont { font-size: 32px; margin-bottom: 5px; } @@ -346,4 +316,70 @@ max-height: 220px; } } -} \ No newline at end of file +} + +// 错误信息样式 +.err-msg-clip { + display: -webkit-box; + -webkit-line-clamp: 2; + line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: normal; +} + +// 模板选择器样式 +.jimeng-template-select { + .el-select-dropdown__item { + height: 60px; + line-height: 60px; + } +} + +// 提示词指南样式 +.prompt-guide { + margin: 12px 0 16px; + + .guide-title { + display: flex; + align-items: center; + font-weight: 600; + color: #666; + } + + .guide-content { + max-height: 220px; + overflow: auto; + line-height: 1.6; + font-size: 12px; + color: #555; + padding-right: 4px; + } + + .guide-section { + margin-bottom: 10px; + } + + .guide-subtitle { + font-weight: 600; + margin-bottom: 6px; + color: #333; + } + + ul { + list-style: disc; + padding-left: 18px; + margin: 4px 0; + } + + .quote { + margin: 8px 0; + padding: 8px 10px; + border-left: 3px solid #a3a3a3; + background: #f8f8f8; + border-radius: 4px; + color: #444; + } +} diff --git a/web/src/assets/iconfont/iconfont.css b/web/src/assets/iconfont/iconfont.css index b9a0d9e8..4d63e592 100644 --- a/web/src/assets/iconfont/iconfont.css +++ b/web/src/assets/iconfont/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4125778 */ - src: url('iconfont.woff2?t=1757465848673') format('woff2'), - url('iconfont.woff?t=1757465848673') format('woff'), - url('iconfont.ttf?t=1757465848673') format('truetype'); + src: url('iconfont.woff2?t=1757571432313') format('woff2'), + url('iconfont.woff?t=1757571432313') format('woff'), + url('iconfont.ttf?t=1757571432313') format('truetype'); } .iconfont { @@ -13,6 +13,26 @@ -moz-osx-font-smoothing: grayscale; } +.icon-resize:before { + content: "\e718"; +} + +.icon-template:before { + content: "\e8a6"; +} + +.icon-error-line:before { + content: "\e868"; +} + +.icon-success-line:before { + content: "\e88c"; +} + +.icon-yunjing:before { + content: "\e69b"; +} + .icon-action:before { content: "\e658"; } diff --git a/web/src/assets/iconfont/iconfont.js b/web/src/assets/iconfont/iconfont.js index 563edbcb..d4408edb 100644 --- a/web/src/assets/iconfont/iconfont.js +++ b/web/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4125778='',(a=>{var l=(c=(c=document.getElementsByTagName("script"))[c.length-1]).getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var h,t,i,o,z,m=function(l,c){c.parentNode.insertBefore(l,c)};if(l&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}h=function(){var l,c=document.createElement("div");c.innerHTML=a._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?m(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),h()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(i=h,o=a.document,z=!1,v(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,p())})}function p(){z||(z=!0,i())}function v(){try{o.documentElement.doScroll("left")}catch(l){return void setTimeout(v,50)}p()}})(window); \ No newline at end of file +window._iconfont_svg_string_4125778='',(a=>{var l=(c=(c=document.getElementsByTagName("script"))[c.length-1]).getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var h,t,i,o,z,m=function(l,c){c.parentNode.insertBefore(l,c)};if(l&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}h=function(){var l,c=document.createElement("div");c.innerHTML=a._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?m(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),h()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(i=h,o=a.document,z=!1,v(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,p())})}function p(){z||(z=!0,i())}function v(){try{o.documentElement.doScroll("left")}catch(l){return void setTimeout(v,50)}p()}})(window); \ No newline at end of file diff --git a/web/src/assets/iconfont/iconfont.json b/web/src/assets/iconfont/iconfont.json index 98b2f5f5..bba1e767 100644 --- a/web/src/assets/iconfont/iconfont.json +++ b/web/src/assets/iconfont/iconfont.json @@ -5,6 +5,41 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "10564356", + "name": "resize", + "font_class": "resize", + "unicode": "e718", + "unicode_decimal": 59160 + }, + { + "icon_id": "1727381", + "name": "34模板、框架", + "font_class": "template", + "unicode": "e8a6", + "unicode_decimal": 59558 + }, + { + "icon_id": "9626841", + "name": "错误", + "font_class": "error-line", + "unicode": "e868", + "unicode_decimal": 59496 + }, + { + "icon_id": "9626990", + "name": "正确", + "font_class": "success-line", + "unicode": "e88c", + "unicode_decimal": 59532 + }, + { + "icon_id": "40613765", + "name": "运镜控制", + "font_class": "yunjing", + "unicode": "e69b", + "unicode_decimal": 59035 + }, { "icon_id": "5215282", "name": "动作", diff --git a/web/src/assets/iconfont/iconfont.ttf b/web/src/assets/iconfont/iconfont.ttf index d7f3fb58..4026bd2d 100644 Binary files a/web/src/assets/iconfont/iconfont.ttf and b/web/src/assets/iconfont/iconfont.ttf differ diff --git a/web/src/assets/iconfont/iconfont.woff b/web/src/assets/iconfont/iconfont.woff index 08e5884d..63c9e1b6 100644 Binary files a/web/src/assets/iconfont/iconfont.woff and b/web/src/assets/iconfont/iconfont.woff differ diff --git a/web/src/assets/iconfont/iconfont.woff2 b/web/src/assets/iconfont/iconfont.woff2 index 7fe58757..b74db5f0 100644 Binary files a/web/src/assets/iconfont/iconfont.woff2 and b/web/src/assets/iconfont/iconfont.woff2 differ diff --git a/web/src/assets/img/jimeng/texiao/Christmas_green_background.jpeg b/web/src/assets/img/jimeng/texiao/Christmas_green_background.jpeg new file mode 100644 index 00000000..dbf1393b Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/Christmas_green_background.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/Christmas_tree.jpeg b/web/src/assets/img/jimeng/texiao/Christmas_tree.jpeg new file mode 100644 index 00000000..23ee0b36 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/Christmas_tree.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/Mid-Autumn_Festival_individual.jpeg b/web/src/assets/img/jimeng/texiao/Mid-Autumn_Festival_individual.jpeg new file mode 100644 index 00000000..e5e737c7 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/Mid-Autumn_Festival_individual.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/Mid-Autumn_Festival_new_chinese_style.jpeg b/web/src/assets/img/jimeng/texiao/Mid-Autumn_Festival_new_chinese_style.jpeg new file mode 100644 index 00000000..b9fb98fc Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/Mid-Autumn_Festival_new_chinese_style.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/Spring_Festival_traditional_Chinese_architecture.png b/web/src/assets/img/jimeng/texiao/Spring_Festival_traditional_Chinese_architecture.png new file mode 100644 index 00000000..5f90d1e5 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/Spring_Festival_traditional_Chinese_architecture.png differ diff --git a/web/src/assets/img/jimeng/texiao/acrylic_ornaments.png b/web/src/assets/img/jimeng/texiao/acrylic_ornaments.png new file mode 100644 index 00000000..dcc907fe Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/acrylic_ornaments.png differ diff --git a/web/src/assets/img/jimeng/texiao/angel_figurine.png b/web/src/assets/img/jimeng/texiao/angel_figurine.png new file mode 100644 index 00000000..2692a321 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/angel_figurine.png differ diff --git a/web/src/assets/img/jimeng/texiao/birthday_photo_gorgeous.jpeg b/web/src/assets/img/jimeng/texiao/birthday_photo_gorgeous.jpeg new file mode 100644 index 00000000..c792c2a1 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/birthday_photo_gorgeous.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/birthday_photo_party.jpeg b/web/src/assets/img/jimeng/texiao/birthday_photo_party.jpeg new file mode 100644 index 00000000..0461fa0b Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/birthday_photo_party.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/birthday_photo_red.jpeg b/web/src/assets/img/jimeng/texiao/birthday_photo_red.jpeg new file mode 100644 index 00000000..fef63474 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/birthday_photo_red.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/car_miniature_ornaments.jpeg b/web/src/assets/img/jimeng/texiao/car_miniature_ornaments.jpeg new file mode 100644 index 00000000..8f5c6a87 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/car_miniature_ornaments.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/claw_machine_style.jpeg b/web/src/assets/img/jimeng/texiao/claw_machine_style.jpeg new file mode 100644 index 00000000..1a39994d Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/claw_machine_style.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/earphone_case_style.jpeg b/web/src/assets/img/jimeng/texiao/earphone_case_style.jpeg new file mode 100644 index 00000000..e1f46fe2 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/earphone_case_style.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/electronic_pet_egg_style.jpeg b/web/src/assets/img/jimeng/texiao/electronic_pet_egg_style.jpeg new file mode 100644 index 00000000..fc26eecf Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/electronic_pet_egg_style.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/felt_3d_polaroid.png b/web/src/assets/img/jimeng/texiao/felt_3d_polaroid.png new file mode 100644 index 00000000..9765c802 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/felt_3d_polaroid.png differ diff --git a/web/src/assets/img/jimeng/texiao/felt_keychain.png b/web/src/assets/img/jimeng/texiao/felt_keychain.png new file mode 100644 index 00000000..d5b29acf Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/felt_keychain.png differ diff --git a/web/src/assets/img/jimeng/texiao/furry_dream_doll.png b/web/src/assets/img/jimeng/texiao/furry_dream_doll.png new file mode 100644 index 00000000..2d8bba46 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/furry_dream_doll.png differ diff --git a/web/src/assets/img/jimeng/texiao/glass_ball.png b/web/src/assets/img/jimeng/texiao/glass_ball.png new file mode 100644 index 00000000..5dd534c5 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/glass_ball.png differ diff --git a/web/src/assets/img/jimeng/texiao/graduation_photo.png b/web/src/assets/img/jimeng/texiao/graduation_photo.png new file mode 100644 index 00000000..f16bfca2 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/graduation_photo.png differ diff --git a/web/src/assets/img/jimeng/texiao/lofi_pixel_character_mini_card.png b/web/src/assets/img/jimeng/texiao/lofi_pixel_character_mini_card.png new file mode 100644 index 00000000..abe6d4c7 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/lofi_pixel_character_mini_card.png differ diff --git a/web/src/assets/img/jimeng/texiao/lying_in_fluffy_belly.png b/web/src/assets/img/jimeng/texiao/lying_in_fluffy_belly.png new file mode 100644 index 00000000..c73b8128 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/lying_in_fluffy_belly.png differ diff --git a/web/src/assets/img/jimeng/texiao/micro_landscape_mini_world.png b/web/src/assets/img/jimeng/texiao/micro_landscape_mini_world.png new file mode 100644 index 00000000..e7c61468 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/micro_landscape_mini_world.png differ diff --git a/web/src/assets/img/jimeng/texiao/micro_landscape_mini_world_professional.png b/web/src/assets/img/jimeng/texiao/micro_landscape_mini_world_professional.png new file mode 100644 index 00000000..2bf25b68 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/micro_landscape_mini_world_professional.png differ diff --git a/web/src/assets/img/jimeng/texiao/my_world.png b/web/src/assets/img/jimeng/texiao/my_world.png new file mode 100644 index 00000000..3e30a6bf Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/my_world.png differ diff --git a/web/src/assets/img/jimeng/texiao/my_world_universal.png b/web/src/assets/img/jimeng/texiao/my_world_universal.png new file mode 100644 index 00000000..10b27fe0 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/my_world_universal.png differ diff --git a/web/src/assets/img/jimeng/texiao/patchwork_collage_style.jpeg b/web/src/assets/img/jimeng/texiao/patchwork_collage_style.jpeg new file mode 100644 index 00000000..566f572a Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/patchwork_collage_style.jpeg differ diff --git a/web/src/assets/img/jimeng/texiao/plastic_bubble_figure.png b/web/src/assets/img/jimeng/texiao/plastic_bubble_figure.png new file mode 100644 index 00000000..ed960937 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/plastic_bubble_figure.png differ diff --git a/web/src/assets/img/jimeng/texiao/plastic_bubble_figure_cartoon_text.png b/web/src/assets/img/jimeng/texiao/plastic_bubble_figure_cartoon_text.png new file mode 100644 index 00000000..09fd8138 Binary files /dev/null and b/web/src/assets/img/jimeng/texiao/plastic_bubble_figure_cartoon_text.png differ diff --git a/web/src/assets/img/jimeng/central_orbit.webp b/web/src/assets/img/jimeng/yunjing/central_orbit.webp similarity index 100% rename from web/src/assets/img/jimeng/central_orbit.webp rename to web/src/assets/img/jimeng/yunjing/central_orbit.webp diff --git a/web/src/assets/img/jimeng/clockwise_swivel.webp b/web/src/assets/img/jimeng/yunjing/clockwise_swivel.webp similarity index 100% rename from web/src/assets/img/jimeng/clockwise_swivel.webp rename to web/src/assets/img/jimeng/yunjing/clockwise_swivel.webp diff --git a/web/src/assets/img/jimeng/counterclockwise_swivel.webp b/web/src/assets/img/jimeng/yunjing/counterclockwise_swivel.webp similarity index 100% rename from web/src/assets/img/jimeng/counterclockwise_swivel.webp rename to web/src/assets/img/jimeng/yunjing/counterclockwise_swivel.webp diff --git a/web/src/assets/img/jimeng/crane_push.webp b/web/src/assets/img/jimeng/yunjing/crane_push.webp similarity index 100% rename from web/src/assets/img/jimeng/crane_push.webp rename to web/src/assets/img/jimeng/yunjing/crane_push.webp diff --git a/web/src/assets/img/jimeng/dynamic_orbit.webp b/web/src/assets/img/jimeng/yunjing/dynamic_orbit.webp similarity index 100% rename from web/src/assets/img/jimeng/dynamic_orbit.webp rename to web/src/assets/img/jimeng/yunjing/dynamic_orbit.webp diff --git a/web/src/assets/img/jimeng/handheld.webp b/web/src/assets/img/jimeng/yunjing/handheld.webp similarity index 100% rename from web/src/assets/img/jimeng/handheld.webp rename to web/src/assets/img/jimeng/yunjing/handheld.webp diff --git a/web/src/assets/img/jimeng/hitchcock_dolly_in.webp b/web/src/assets/img/jimeng/yunjing/hitchcock_dolly_in.webp similarity index 100% rename from web/src/assets/img/jimeng/hitchcock_dolly_in.webp rename to web/src/assets/img/jimeng/yunjing/hitchcock_dolly_in.webp diff --git a/web/src/assets/img/jimeng/hitchcock_dolly_out.webp b/web/src/assets/img/jimeng/yunjing/hitchcock_dolly_out.webp similarity index 100% rename from web/src/assets/img/jimeng/hitchcock_dolly_out.webp rename to web/src/assets/img/jimeng/yunjing/hitchcock_dolly_out.webp diff --git a/web/src/assets/img/jimeng/quick_pull_back.webp b/web/src/assets/img/jimeng/yunjing/quick_pull_back.webp similarity index 100% rename from web/src/assets/img/jimeng/quick_pull_back.webp rename to web/src/assets/img/jimeng/yunjing/quick_pull_back.webp diff --git a/web/src/assets/img/jimeng/rapid_push_pull.webp b/web/src/assets/img/jimeng/yunjing/rapid_push_pull.webp similarity index 100% rename from web/src/assets/img/jimeng/rapid_push_pull.webp rename to web/src/assets/img/jimeng/yunjing/rapid_push_pull.webp diff --git a/web/src/assets/img/jimeng/robo_arm.webp b/web/src/assets/img/jimeng/yunjing/robo_arm.webp similarity index 100% rename from web/src/assets/img/jimeng/robo_arm.webp rename to web/src/assets/img/jimeng/yunjing/robo_arm.webp diff --git a/web/src/components/FooterBar.vue b/web/src/components/FooterBar.vue index 69bd2ed1..4c2255ec 100644 --- a/web/src/components/FooterBar.vue +++ b/web/src/components/FooterBar.vue @@ -2,10 +2,10 @@