diff --git a/.idea/工程代码.iml b/.idea/工程代码.iml index 24643cc..23a6ace 100644 --- a/.idea/工程代码.iml +++ b/.idea/工程代码.iml @@ -5,6 +5,8 @@ + + diff --git a/admin-ui/dist.zip b/admin-ui/dist.zip deleted file mode 100644 index f20d132..0000000 Binary files a/admin-ui/dist.zip and /dev/null differ diff --git a/portal-ui/dist.zip b/portal-ui/dist.zip deleted file mode 100644 index b3ac661..0000000 Binary files a/portal-ui/dist.zip and /dev/null differ diff --git a/portal-ui/src/assets/styles/quill.bubble.css b/portal-ui/src/assets/styles/quill.bubble.css index 7445b66..be73178 100644 --- a/portal-ui/src/assets/styles/quill.bubble.css +++ b/portal-ui/src/assets/styles/quill.bubble.css @@ -7,4 +7,4 @@ */ .ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked] > .ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked] > .ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor > *{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li > .ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked] > .ql-ui,.ql-editor li[data-list=unchecked] > .ql-ui{color:#777}.ql-editor li[data-list=bullet] > .ql-ui:before{content:'\2022'}.ql-editor li[data-list=checked] > .ql-ui:before{content:'\2611'}.ql-editor li[data-list=unchecked] > .ql-ui:before{content:'\2610'}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered] > .ql-ui:before{content:counter(list-0, decimal) '. '}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1 > .ql-ui:before{content:counter(list-1, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2 > .ql-ui:before{content:counter(list-2, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3 > .ql-ui:before{content:counter(list-3, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4 > .ql-ui:before{content:counter(list-4, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5 > .ql-ui:before{content:counter(list-5, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6 > .ql-ui:before{content:counter(list-6, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7 > .ql-ui:before{content:counter(list-7, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8 > .ql-ui:before{content:counter(list-8, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9 > .ql-ui:before{content:counter(list-9, decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl > .ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-bubble.ql-toolbar:after,.ql-bubble .ql-toolbar:after{clear:both;content:'';display:table}.ql-bubble.ql-toolbar button,.ql-bubble .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-bubble.ql-toolbar button svg,.ql-bubble .ql-toolbar button svg{float:left;height:100%}.ql-bubble.ql-toolbar button:active:hover,.ql-bubble .ql-toolbar button:active:hover{outline:none}.ql-bubble.ql-toolbar input.ql-image[type=file],.ql-bubble .ql-toolbar input.ql-image[type=file]{display:none}.ql-bubble.ql-toolbar button:hover,.ql-bubble .ql-toolbar button:hover,.ql-bubble.ql-toolbar button:focus,.ql-bubble .ql-toolbar button:focus,.ql-bubble.ql-toolbar button.ql-active,.ql-bubble .ql-toolbar button.ql-active,.ql-bubble.ql-toolbar .ql-picker-label:hover,.ql-bubble .ql-toolbar .ql-picker-label:hover,.ql-bubble.ql-toolbar .ql-picker-label.ql-active,.ql-bubble .ql-toolbar .ql-picker-label.ql-active,.ql-bubble.ql-toolbar .ql-picker-item:hover,.ql-bubble .ql-toolbar .ql-picker-item:hover,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected{color:#fff}.ql-bubble.ql-toolbar button:hover .ql-fill,.ql-bubble .ql-toolbar button:hover .ql-fill,.ql-bubble.ql-toolbar button:focus .ql-fill,.ql-bubble .ql-toolbar button:focus .ql-fill,.ql-bubble.ql-toolbar button.ql-active .ql-fill,.ql-bubble .ql-toolbar button.ql-active .ql-fill,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-bubble.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-bubble.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#fff}.ql-bubble.ql-toolbar button:hover .ql-stroke,.ql-bubble .ql-toolbar button:hover .ql-stroke,.ql-bubble.ql-toolbar button:focus .ql-stroke,.ql-bubble .ql-toolbar button:focus .ql-stroke,.ql-bubble.ql-toolbar button.ql-active .ql-stroke,.ql-bubble .ql-toolbar button.ql-active .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-bubble.ql-toolbar button:hover .ql-stroke-miter,.ql-bubble .ql-toolbar button:hover .ql-stroke-miter,.ql-bubble.ql-toolbar button:focus .ql-stroke-miter,.ql-bubble .ql-toolbar button:focus .ql-stroke-miter,.ql-bubble.ql-toolbar button.ql-active .ql-stroke-miter,.ql-bubble .ql-toolbar button.ql-active .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#fff}@media (pointer:coarse){.ql-bubble.ql-toolbar button:hover:not(.ql-active),.ql-bubble .ql-toolbar button:hover:not(.ql-active){color:#ccc}.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#ccc}.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#ccc}}.ql-bubble{box-sizing:border-box}.ql-bubble *{box-sizing:border-box}.ql-bubble .ql-hidden{display:none}.ql-bubble .ql-out-bottom,.ql-bubble .ql-out-top{visibility:hidden}.ql-bubble .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-bubble .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-bubble .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-bubble .ql-formats{display:inline-block;vertical-align:middle}.ql-bubble .ql-formats:after{clear:both;content:'';display:table}.ql-bubble .ql-stroke{fill:none;stroke:#ccc;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-bubble .ql-stroke-miter{fill:none;stroke:#ccc;stroke-miterlimit:10;stroke-width:2}.ql-bubble .ql-fill,.ql-bubble .ql-stroke.ql-fill{fill:#ccc}.ql-bubble .ql-empty{fill:none}.ql-bubble .ql-even{fill-rule:evenodd}.ql-bubble .ql-thin,.ql-bubble .ql-stroke.ql-thin{stroke-width:1}.ql-bubble .ql-transparent{opacity:.4}.ql-bubble .ql-direction svg:last-child{display:none}.ql-bubble .ql-direction.ql-active svg:last-child{display:inline}.ql-bubble .ql-direction.ql-active svg:first-child{display:none}.ql-bubble .ql-editor h1{font-size:2em}.ql-bubble .ql-editor h2{font-size:1.5em}.ql-bubble .ql-editor h3{font-size:1.17em}.ql-bubble .ql-editor h4{font-size:1em}.ql-bubble .ql-editor h5{font-size:.83em}.ql-bubble .ql-editor h6{font-size:.67em}.ql-bubble .ql-editor a{text-decoration:underline}.ql-bubble .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-bubble .ql-editor code,.ql-bubble .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-bubble .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-bubble .ql-editor code{font-size:85%;padding:2px 4px}.ql-bubble .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-bubble .ql-editor img{max-width:100%}.ql-bubble .ql-picker{color:#ccc;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-bubble .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-bubble .ql-picker-label::before{display:inline-block;line-height:22px}.ql-bubble .ql-picker-options{background-color:#444;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-bubble .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-bubble .ql-picker.ql-expanded .ql-picker-label{color:#777;z-index:2}.ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#777}.ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#777}.ql-bubble .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-bubble .ql-color-picker,.ql-bubble .ql-icon-picker{width:28px}.ql-bubble .ql-color-picker .ql-picker-label,.ql-bubble .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-bubble .ql-color-picker .ql-picker-label svg,.ql-bubble .ql-icon-picker .ql-picker-label svg{right:4px}.ql-bubble .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-bubble .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-bubble .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-bubble .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-bubble .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before{content:attr(data-label)}.ql-bubble .ql-picker.ql-header{width:98px}.ql-bubble .ql-picker.ql-header .ql-picker-label::before,.ql-bubble .ql-picker.ql-header .ql-picker-item::before{content:'Normal'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{content:'Heading 1'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{content:'Heading 2'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{content:'Heading 3'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{content:'Heading 4'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{content:'Heading 5'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{content:'Heading 6'}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{font-size:2em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{font-size:1.5em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{font-size:1.17em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{font-size:1em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{font-size:.83em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{font-size:.67em}.ql-bubble .ql-picker.ql-font{width:108px}.ql-bubble .ql-picker.ql-font .ql-picker-label::before,.ql-bubble .ql-picker.ql-font .ql-picker-item::before{content:'Sans Serif'}.ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{content:'Serif'}.ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{content:'Monospace'}.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{font-family:Georgia,Times New Roman,serif}.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{font-family:Monaco,Courier New,monospace}.ql-bubble .ql-picker.ql-size{width:98px}.ql-bubble .ql-picker.ql-size .ql-picker-label::before,.ql-bubble .ql-picker.ql-size .ql-picker-item::before{content:'Normal'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=small]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before{content:'Small'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=large]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before{content:'Large'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{content:'Huge'}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before{font-size:10px}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before{font-size:18px}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{font-size:32px}.ql-bubble .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-bubble .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-bubble .ql-toolbar .ql-formats{margin:8px 12px 8px 0}.ql-bubble .ql-toolbar .ql-formats:first-child{margin-left:12px}.ql-bubble .ql-color-picker svg{margin:1px}.ql-bubble .ql-color-picker .ql-picker-item.ql-selected,.ql-bubble .ql-color-picker .ql-picker-item:hover{border-color:#fff}.ql-bubble .ql-tooltip{background-color:#444;border-radius:25px;color:#fff}.ql-bubble .ql-tooltip-arrow{border-left:6px solid transparent;border-right:6px solid transparent;content:" ";display:block;left:50%;margin-left:-6px;position:absolute}.ql-bubble .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow{border-bottom:6px solid #444;top:-6px}.ql-bubble .ql-tooltip.ql-flip .ql-tooltip-arrow{border-top:6px solid #444;bottom:-6px}.ql-bubble .ql-tooltip.ql-editing .ql-tooltip-editor{display:block}.ql-bubble .ql-tooltip.ql-editing .ql-formats{visibility:hidden}.ql-bubble .ql-tooltip-editor{display:none}.ql-bubble .ql-tooltip-editor input[type=text]{background:transparent;border:none;color:#fff;font-size:13px;height:100%;outline:none;padding:10px 20px;position:absolute;width:100%}.ql-bubble .ql-tooltip-editor a{top:10px;position:absolute;right:20px}.ql-bubble .ql-tooltip-editor a:before{color:#ccc;content:"\00D7";font-size:16px;font-weight:bold}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close){position:relative;white-space:nowrap}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::before{background-color:#444;border-radius:15px;top:-5px;font-size:12px;color:#fff;content:attr(href);font-weight:normal;overflow:hidden;padding:5px 15px;text-decoration:none;z-index:1}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::after{border-top:6px solid #444;border-left:6px solid transparent;border-right:6px solid transparent;top:0;content:" ";height:0;width:0}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::before,.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::after{left:0;margin-left:50%;position:absolute;transform:translate(-50%,-100%);transition:visibility 0s ease 200ms;visibility:hidden}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close):hover::before,.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close):hover::after{visibility:visible} -/*# sourceMappingURL=quill.bubble.css.map*/ \ No newline at end of file +/* Quill bubble styles - source map removed to fix build error */ \ No newline at end of file diff --git a/portal-ui/src/assets/styles/quill.core.css b/portal-ui/src/assets/styles/quill.core.css index 8541b2b..e0c219c 100644 --- a/portal-ui/src/assets/styles/quill.core.css +++ b/portal-ui/src/assets/styles/quill.core.css @@ -615,4 +615,4 @@ right: 15px } -/*# sourceMappingURL=quill.core.css.map*/ \ No newline at end of file +/* Quill core styles - source map removed to fix build error */ \ No newline at end of file diff --git a/portal-ui/src/assets/styles/quill.snow.css b/portal-ui/src/assets/styles/quill.snow.css index 650a402..e777356 100644 --- a/portal-ui/src/assets/styles/quill.snow.css +++ b/portal-ui/src/assets/styles/quill.snow.css @@ -1286,4 +1286,4 @@ border: 1px solid #ccc } -/*# sourceMappingURL=quill.snow.css.map*/ \ No newline at end of file +/* Quill snow styles - source map removed to fix build error */ \ No newline at end of file diff --git a/portal-ui/src/lang/en_US/common.js b/portal-ui/src/lang/en_US/common.js index fc55fe9..efe9486 100644 --- a/portal-ui/src/lang/en_US/common.js +++ b/portal-ui/src/lang/en_US/common.js @@ -143,6 +143,14 @@ export default { cardNoRequired: 'Please enter card number', cardNameRequired: 'Please enter cardholder name', rechargeFailed: 'Recharge failed', + // Model selection + selectModel: 'Select Model', + seedance20: 'Seedance 2.0', + seedance20Fast: 'Seedance 2.0 Fast', + // Rich text editor + insertImage: 'Insert Image', + mentionImage: 'Mention Image', + noImageToMention: 'No images to mention', // VM支付相关 vmCardInfo: 'Credit Card Information', cardNumber: 'Card Number', @@ -175,5 +183,9 @@ export default { country: 'Country', countryPlaceholder: 'Select country', countryRequired: 'Please select country', - submit: 'Submit' + videoGen: 'Video Generation', + uploadFirstImage: 'Upload Reference Image', + insertImage: 'Insert Image', + submit: 'Submit', + cancel: 'Cancel' } \ No newline at end of file diff --git a/portal-ui/src/lang/en_US/route.js b/portal-ui/src/lang/en_US/route.js index ed15100..c24a4e9 100644 --- a/portal-ui/src/lang/en_US/route.js +++ b/portal-ui/src/lang/en_US/route.js @@ -1,11 +1,12 @@ export default { index: 'Home', - imageToImage: 'One-click undressing', + imageToImage: 'Image-to-Image 1', imageToImage2: 'Image-to-Image2', changeFace: 'Swap Face', changeFaceVideo: 'Swap Video Face', fastImage: 'Gen Image', fastVideo: 'Gen Video', + videoGen: 'Video Generation', recharge: 'Quick Recharge', help: 'Help Center', moneyInvite: 'Reward Invitation' diff --git a/portal-ui/src/lang/zh_HK/common.js b/portal-ui/src/lang/zh_HK/common.js index fd25525..72b01d7 100644 --- a/portal-ui/src/lang/zh_HK/common.js +++ b/portal-ui/src/lang/zh_HK/common.js @@ -145,6 +145,14 @@ export default { cardNoRequired: '請輸入銀行卡號', cardNameRequired: '請輸入銀行卡姓名', rechargeFailed: '充值失敗', + // 模型选择 + selectModel: '選擇模型', + seedance20: 'Seedance 2.0', + seedance20Fast: 'Seedance 2.0 Fast', + // 富文本编辑器 + insertImage: '插入圖片', + mentionImage: '引用圖片', + noImageToMention: '暫無可引用的圖片', // VM支付相關 vmCardInfo: '信用卡信息', cardNumber: '信用卡卡號', @@ -178,6 +186,9 @@ export default { country: '國家', countryPlaceholder: '請選擇國家', countryRequired: '請選擇國家', + videoGen: '視頻生成', + uploadFirstImage: '上傳首圖', + insertImage: '插入圖片', submit: '提交', cancel: '取消' } \ No newline at end of file diff --git a/portal-ui/src/lang/zh_HK/route.js b/portal-ui/src/lang/zh_HK/route.js index daa151e..797bc58 100644 --- a/portal-ui/src/lang/zh_HK/route.js +++ b/portal-ui/src/lang/zh_HK/route.js @@ -6,6 +6,7 @@ export default { changeFaceVideo: '視頻換臉', fastImage: '快捷生圖', fastVideo: '快捷生視頻', + videoGen: '視頻生成', recharge: '快速充值', help: '幫助中心', moneyInvite: '有獎邀請' diff --git a/portal-ui/src/layout/components/User.vue b/portal-ui/src/layout/components/User.vue index d03a350..4ee2a11 100644 --- a/portal-ui/src/layout/components/User.vue +++ b/portal-ui/src/layout/components/User.vue @@ -29,11 +29,12 @@ :title="$t('common.moneyInvite')"> - + @@ -67,7 +68,6 @@ import { mapGetters } from 'vuex' import i18n from '@/lang/i18n' import Money from './Money.vue' import UserAccount from './UserAccount.vue' -import RechargeRecord from './RechargeRecord.vue' import ResumeRecord from './ResumeRecord.vue' import RewardRecord from './RewardRecord.vue' @@ -93,7 +93,6 @@ export default { Register, Money, UserAccount, - RechargeRecord, ResumeRecord, RewardRecord }, diff --git a/portal-ui/src/main.js b/portal-ui/src/main.js index c8b3d39..ec6d0af 100644 --- a/portal-ui/src/main.js +++ b/portal-ui/src/main.js @@ -9,9 +9,11 @@ import router from './router' import '@/assets/styles/base.less' -import '@/assets/styles/quill.bubble.css' -import '@/assets/styles/quill.core.css' -import '@/assets/styles/quill.snow.css' +// Quill 样式 - 临时注释避免 source map 文件缺失导致的构建错误 +// 如果后续需要使用 Quill 富文本编辑器,可取消注释 +// import '@/assets/styles/quill.bubble.css' +// import '@/assets/styles/quill.core.css' +// import '@/assets/styles/quill.snow.css' const app = createApp(App) app.use(router) diff --git a/portal-ui/src/router/index.js b/portal-ui/src/router/index.js index 488c41d..85c72d7 100644 --- a/portal-ui/src/router/index.js +++ b/portal-ui/src/router/index.js @@ -69,49 +69,47 @@ export const constantRoutes = [{ permission: "pass", icon: 'btn_tst' } - }, - // { - // path: 'image-to-image?type=2', - // name: 'image-to-image2', - // component: () => import('@/views/Image.vue'), - // meta: { - // title: 'imageToImage2', - // menuItem: true, - // permission: "pass", - // icon: 'btn_tst' - // } - // }, { - // path: 'change-face', - // name: 'change-face', - // component: () => import('@/views/ChangeFace.vue'), - // meta: { - // title: 'changeFace', - // menuItem: true, - // permission: "pass", - // icon: 'btn_yjhl' - // } - // }, { - // path: 'change-face-video', - // name: 'change-face-video', - // component: () => import('@/views/ChangeFace.vue'), - // meta: { - // title: 'changeFaceVideo', - // menuItem: true, - // permission: "pass", - // icon: 'btn_yjhl' - // } - // }, { - // path: 'fast-image', - // name: 'fast-image', - // component: () => import('@/views/FastImage.vue'), - // meta: { - // title: 'fastImage', - // menuItem: true, - // permission: "pass", - // icon: 'btn_kjst' - // } - // }, - { + }, { + path: 'image-to-image?type=2', + name: 'image-to-image2', + component: () => import('@/views/Image.vue'), + meta: { + title: 'imageToImage2', + menuItem: true, + permission: "pass", + icon: 'btn_tst' + } + }, { + path: 'change-face', + name: 'change-face', + component: () => import('@/views/ChangeFace.vue'), + meta: { + title: 'changeFace', + menuItem: true, + permission: "pass", + icon: 'btn_yjhl' + } + }, { + path: 'change-face-video', + name: 'change-face-video', + component: () => import('@/views/ChangeFace.vue'), + meta: { + title: 'changeFaceVideo', + menuItem: true, + permission: "pass", + icon: 'btn_yjhl' + } + }, { + path: 'fast-image', + name: 'fast-image', + component: () => import('@/views/FastImage.vue'), + meta: { + title: 'fastImage', + menuItem: true, + permission: "pass", + icon: 'btn_kjst' + } + }, { path: 'fast-video', name: 'fast-video', component: () => import('@/views/FastVideo.vue'), @@ -121,6 +119,16 @@ export const constantRoutes = [{ permission: "pass", icon: 'btn_kjsp' } + }, { + path: 'video-gen', + name: 'video-gen', + component: () => import('@/views/VideoGen.vue'), + meta: { + title: 'videoGen', + menuItem: true, + permission: "pass", + icon: 'btn_video' + } }, { path: 'recharge', name: 'recharge', diff --git a/portal-ui/src/views/FastVideo.vue b/portal-ui/src/views/FastVideo.vue index b9d91e4..02ae213 100644 --- a/portal-ui/src/views/FastVideo.vue +++ b/portal-ui/src/views/FastVideo.vue @@ -81,11 +81,15 @@ - + + + import { mapGetters } from 'vuex' +import RichTextEditor from '@/components/RichTextEditor.vue' + export default { data() { return { @@ -195,6 +201,7 @@ export default { firstUrl: '', lastUrl: '', text: '', + editorContent: '', interval: null, videoUrl: null, videoLoading: false, @@ -221,9 +228,14 @@ export default { { label: 'Seedance 2.0', value: 'ep-20260326165811-dlkth' }, { label: 'Seedance 2.0 Fast', value: 'ep-20260326170056-dkj9m' } ], - selectedModel: 'ep-20260326165811-dlkth' + selectedModel: 'ep-20260326165811-dlkth', + // 已上传的图片列表(用于@功能) + uploadedImages: [] } }, + components: { + RichTextEditor + }, beforeUnmount() { this.destroyInterval() }, @@ -335,8 +347,25 @@ export default { // 繁体中文显示 chineseContent,其他语言显示 englishContent if (this.lang === 'zh_HK') { return template.chineseContent || template.name || '' + }else{ + return template.englishContent || template.name || '' + } + }, + // 处理富文本内容变化 + handleTextChange(content) { + this.editorContent = content + // 同步到旧的 text 字段以保持兼容性 + this.text = content + }, + // 处理上传的图片(用于@功能) + handleImageUpload(imageInfo) { + if (imageInfo && imageInfo.url) { + this.uploadedImages.push({ + url: imageInfo.url, + name: imageInfo.name || 'image' + }) } - return template.englishContent || template.name || '' + }, // 确认选择模板 handleConfirmTemplate() { @@ -496,7 +525,7 @@ export default { this.generateLoading = true let params = { - text: this.text, + text: this.editorContent || this.text, firstUrl: firstImageUrl, functionType: '21', model: this.selectedModel // 新增模型参数 @@ -638,6 +667,59 @@ export default { border-color: rgba(255,255,255,0.1); } } + + /* 富文本编辑器样式 */ + .rich-editor-root { + margin-bottom: 20px; + + .toolbar { + display: flex; + gap: 8px; + margin-bottom: 12px; + padding: 8px; + background-color: #1a1b20; + border-radius: 6px; + border: 1px solid rgba(255,255,255,0.1); + + .tool-btn { + padding: 6px 12px; + background-color: rgba(255,255,255,0.05); + border: 1px solid rgba(255,255,255,0.1); + color: #fff; + border-radius: 4px; + cursor: pointer; + font-size: 13px; + + &:hover { + background-color: rgba(255,255,255,0.1); + border-color: rgba(255,255,255,0.2); + } + } + } + + .rich-editor { + min-height: 160px; + padding: 16px; + background-color: #1a1b20; + border: 1px solid rgba(255,255,255,0.1); + border-radius: 6px; + color: #fff; + font-size: 14px; + line-height: 1.6; + outline: none; + resize: none; + + &:focus { + border-color: rgb(var(--primary-6)); + } + + &[data-placeholder]:empty::before { + content: attr(data-placeholder); + color: #5c5d68; + pointer-events: none; + } + } + } &-title { display: flex; align-items: center; diff --git a/portal-ui/src/views/Image.vue b/portal-ui/src/views/Image.vue index f10baa8..a623579 100644 --- a/portal-ui/src/views/Image.vue +++ b/portal-ui/src/views/Image.vue @@ -74,13 +74,15 @@ - + + + import { mapGetters } from 'vuex' +import RichTextEditor from '@/components/RichTextEditor.vue' export default { data() { @@ -198,9 +201,14 @@ export default { { label: 'Seedance 2.0', value: 'ep-20260326165811-dlkth' }, { label: 'Seedance 2.0 Fast', value: 'ep-20260326170056-dkj9m' } ], - selectedModel: 'ep-20260326165811-dlkth' + selectedModel: 'ep-20260326165811-dlkth', + // 已上传的图片列表(用于@功能) + uploadedImages: [] } }, + components: { + RichTextEditor + }, computed: { ...mapGetters(['lang']), }, @@ -352,6 +360,21 @@ export default { this.templateDialogVisible = false // 不重置selectedTemplate,保持用户的选择状态,方便二次选择 }, + // 处理富文本内容变化 + handleTextChange(content) { + this.editorContent = content + // 同步到旧的 text 字段以保持兼容性 + this.text = content + }, + // 处理上传的图片(用于@功能) + handleImageUpload(imageInfo) { + if (imageInfo && imageInfo.url) { + this.uploadedImages.push({ + url: imageInfo.url, + name: imageInfo.name || 'image' + }) + } + }, close() { this.showResult = false }, @@ -415,7 +438,7 @@ export default { url: 'api/ai/imgToImg', method: 'POST', data: { - text: this.text, + text: this.editorContent || this.text, firstUrl: this.firstUrl.url, functionType: this.current == 1 ? '11' : '12', tags: tags.join(','), @@ -531,6 +554,59 @@ export default { border-color: rgba(255,255,255,0.1); } } + + /* 富文本编辑器样式 */ + .rich-editor-root { + margin-bottom: 20px; + + .toolbar { + display: flex; + gap: 8px; + margin-bottom: 12px; + padding: 8px; + background-color: #1a1b20; + border-radius: 6px; + border: 1px solid rgba(255,255,255,0.1); + + .tool-btn { + padding: 6px 12px; + background-color: rgba(255,255,255,0.05); + border: 1px solid rgba(255,255,255,0.1); + color: #fff; + border-radius: 4px; + cursor: pointer; + font-size: 13px; + + &:hover { + background-color: rgba(255,255,255,0.1); + border-color: rgba(255,255,255,0.2); + } + } + } + + .rich-editor { + min-height: 160px; + padding: 16px; + background-color: #1a1b20; + border: 1px solid rgba(255,255,255,0.1); + border-radius: 6px; + color: #fff; + font-size: 14px; + line-height: 1.6; + outline: none; + resize: none; + + &:focus { + border-color: rgb(var(--primary-6)); + } + + &[data-placeholder]:empty::before { + content: attr(data-placeholder); + color: #5c5d68; + pointer-events: none; + } + } + } &-title { display: flex; align-items: center;