Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite

This commit is contained in:
李志鹏
2026-01-02 11:26:09 +08:00
64 changed files with 6180 additions and 3862 deletions

BIN
dist.7z

Binary file not shown.

53
prod_build_manual.yaml Normal file
View File

@@ -0,0 +1,53 @@
name: AiDA WEB-Node.js StableVersion 分支构建部署
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 18.18.0 ]
steps:
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: StableVersion
- name: 2.打印当前分支信息
run: |
echo "Current branch being deployed is: $(git rev-parse --abbrev-ref HEAD)"
echo "The code is from the 'main' branch, as specified in 'actions/checkout'."
- name: 3.设置 Node.js 环境 ${{ matrix.node-version }}
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm run build
- run: ls -l
- name: 3.5. 手动安装 AWS CLI v2 # 新增步骤:确保 aws 命令可用
run: |
echo "安装 AWS CLI V2..."
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update
aws --version
echo "AWS CLI V2 安装完成。"
- name: 4.配置 AWS 凭证
uses: aws-actions/configure-aws-credentials@main
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: 'ap-east-1'
- name: 5.同步 dist 目录到 S3
run: |
aws s3 sync dist/ s3://${{ secrets.S3_BUCKET_NAME }}/ --acl public-read
- name: 6.部署完成
run: echo "构建和部署到 S3 任务完成。"

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

View File

@@ -1,7 +1,16 @@
<template>
<router-view/>
<div class="loading" v-show="loading"><a-spin :delay="0.5" /></div>
</template>
<script setup>
import { computed } from 'vue';
import { useStore } from 'vuex';
const store = useStore();
const loading = computed(() => store.state.loading || store.state.view_loading);
</script>
<style lang="less">
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
@@ -9,7 +18,19 @@
-moz-osx-font-smoothing: grayscale;
height: 100%;
}
.loading{
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.4);
display: flex;
align-items: center;
justify-content: center;
z-index: 999999999999;
color: #fff;
}
.ipad{
*{
-webkit-touch-callout:none;

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2427_2565)">
<path d="M12 0C5.37264 0 0 5.37264 0 12C0 17.6275 3.87456 22.3498 9.10128 23.6467V15.6672H6.62688V12H9.10128V10.4198C9.10128 6.33552 10.9498 4.4424 14.9597 4.4424C15.72 4.4424 17.0318 4.59168 17.5685 4.74048V8.06448C17.2853 8.03472 16.7933 8.01984 16.1822 8.01984C14.2147 8.01984 13.4544 8.76528 13.4544 10.703V12H17.3741L16.7006 15.6672H13.4544V23.9122C19.3963 23.1946 24.0005 18.1354 24.0005 12C24 5.37264 18.6274 0 12 0Z" fill="#2C2C2C"/>
</g>
<defs>
<clipPath id="clip0_2427_2565">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 691 B

View File

@@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2427_2564)">
<path d="M22.2234 0H1.77187C0.792187 0 0 0.773438 0 1.72969V22.2656C0 23.2219 0.792187 24 1.77187 24H22.2234C23.2031 24 24 23.2219 24 22.2703V1.72969C24 0.773438 23.2031 0 22.2234 0ZM7.12031 20.4516H3.55781V8.99531H7.12031V20.4516ZM5.33906 7.43438C4.19531 7.43438 3.27188 6.51094 3.27188 5.37187C3.27188 4.23281 4.19531 3.30937 5.33906 3.30937C6.47813 3.30937 7.40156 4.23281 7.40156 5.37187C7.40156 6.50625 6.47813 7.43438 5.33906 7.43438ZM20.4516 20.4516H16.8937V14.8828C16.8937 13.5563 16.8703 11.8453 15.0422 11.8453C13.1906 11.8453 12.9094 13.2938 12.9094 14.7891V20.4516H9.35625V8.99531H12.7687V10.5609H12.8156C13.2891 9.66094 14.4516 8.70938 16.1813 8.70938C19.7859 8.70938 20.4516 11.0813 20.4516 14.1656V20.4516V20.4516Z" fill="#2C2C2C"/>
</g>
<defs>
<clipPath id="clip0_2427_2564">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 997 B

View File

@@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2426_2350)">
<path d="M23.5233 7.12823C23.5233 7.12823 23.2913 5.49009 22.5766 4.77079C21.6717 3.8241 20.6601 3.81946 20.196 3.76377C16.8733 3.52246 11.8846 3.52246 11.8846 3.52246H11.8754C11.8754 3.52246 6.88669 3.52246 3.564 3.76377C3.09994 3.81946 2.08828 3.8241 1.18336 4.77079C0.468703 5.49009 0.241312 7.12823 0.241312 7.12823C0.241312 7.12823 0 9.05409 0 10.9753V12.7759C0 14.6971 0.236672 16.6229 0.236672 16.6229C0.236672 16.6229 0.468703 18.2611 1.17872 18.9804C2.08364 19.9271 3.27164 19.8946 3.80067 19.9967C5.70333 20.1777 11.88 20.2334 11.88 20.2334C11.88 20.2334 16.8733 20.2241 20.196 19.9874C20.6601 19.9317 21.6717 19.9271 22.5766 18.9804C23.2913 18.2611 23.5233 16.6229 23.5233 16.6229C23.5233 16.6229 23.76 14.7017 23.76 12.7759V10.9753C23.76 9.05409 23.5233 7.12823 23.5233 7.12823ZM9.42511 14.9616V8.28374L15.8431 11.6343L9.42511 14.9616Z" fill="#2C2C2C"/>
</g>
<defs>
<clipPath id="clip0_2426_2350">
<rect width="23.76" height="23.76" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,3 @@
<svg width="21" height="24" viewBox="0 0 21 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.9218 0H10.9175V16.1843C10.9175 18.1127 9.37747 19.6967 7.4609 19.6967C5.54433 19.6967 4.00424 18.1127 4.00424 16.1843C4.00424 14.2905 5.51011 12.7408 7.35825 12.672V8.60871C3.28553 8.67755 0 12.0177 0 16.1843C0 20.3854 3.35398 23.76 7.49514 23.76C11.6362 23.76 14.9902 20.351 14.9902 16.1843V7.88555C16.4961 8.98748 18.3442 9.64174 20.295 9.67619V5.61287C17.2833 5.50957 14.9218 3.03026 14.9218 0Z" fill="#2C2C2C"/>
</svg>

After

Width:  |  Height:  |  Size: 532 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -8,14 +8,6 @@
"id": 2,
"title":"AiDA X SFT AI Fashion Award 2024",
"imgUrl": "/image/events/Fashion-Award-2024.png"
},{
"id": 3,
"title":"✨New Year 2025🎉Let's kick off the year with a burst of inspiration and design!",
"imgUrl": "/image/events/AiDA2025-En.jpg"
},{
"id": 4,
"title":"Welcome back Subscribe with the discount code to enjoy 50% OFF!",
"imgUrl": "/image/events/Welcome-back-En.jpg"
}
],
"eventsItem":[
@@ -96,106 +88,6 @@
]
}
]
},{
"id":3,
"title":"✨New Year 2025🎉Let's kick off the year with a burst of inspiration and design!",
"imgUrl": "/image/events/AiDA2025-En.jpg",
"textList":[
{
"paragraph":[
{
"text":"Share your work and get 1 month of free access to AiDA"
}
]
},{
"paragraph":[
{
"text":" Just do the following:"
}
]
},{
"paragraph":[
{
"text":" ✅Share your designs on AiDA's Gallery "
},{
"text":" ✅Add the tag #NewYear_2025 in the work description"
},{
"text":" ✅At least 20 likes "
}
]
},{
"paragraph":[
{
"text":"📅 Duration: January 1, 2025 January 31, 2025"
}
]
},{
"paragraph":[
{
"text":"Join in the fun and embark on a new year's journey of design. Mix your creativity with tech to make amazing, unique creations! Get your friends to help you seize this opportunity! Invite them to give your design some love with their likes💗"
}
]
},{
"paragraph":[
{
"text":"👍 AiDA is waiting for you to unlock a new world of design!"
}
]
}
]
},{
"id":4,
"title":"Welcome back Subscribe with the discount code to enjoy 50% OFF!",
"imgUrl": "/image/events/Welcome-back-En.jpg",
"textList":[
{
"paragraph":[
{
"text":"💠 In February, AiDA underwent a legendary transformation"
},{
"text":"💠 A silky-smooth interface and a turbocharged upgrade to all functions"
},{
"text":"😆 Long-time users are saying: “Wait… is this still the AiDA I knew?!"
}
]
},{
"paragraph":[
{
"text":"Demo video👉 <a href='https://sg834.apps.aliyunpds.com/disk/s/R6SsxBaju9h' target='_blank'>https://sg834.apps.aliyunpds.com/disk/s/R6SsxBaju9h</a>"
}
]
},{
"paragraph":[
{
"text":"⚡️ To welcome back our trial users, weve prepared an exclusive design power-up:"
},{
"text":"✔️ Use the promo code「RIINRMKK」 and enjoy 50% off your subscription"
},{
"text":"✔️ Boost your efficiency by 60%—save hours on every project"
},{
"text":"✔️ sNo design background? No problem! Get stunning drafts in just 5 minutes"
}
]
},{
"paragraph":[
{
"text":"⏳ The countdown is on:"
},{
"text":"✨Ignite your creativity like a volcanic eruption"
},{
"text":"✨Let your inspiration flow like a cosmic waterfall"
}
]
},{
"paragraph":[
{
"text":"Promotional Code: <strong>RIINRMKK</strong>"
},{
"text":"Duration: June 10 to June 30, 2025 After that, subscriptions return to full price. Dont miss it!"
}
]
}
]
}
]
}

View File

@@ -8,14 +8,6 @@
"id": 2,
"title":"AiDA X SFT AI时尚设计比赛2024",
"imgUrl": "/image/events/Fashion-Award-2024.png"
},{
"id": 3,
"title":"🎉搭上2025的列车打开新设计的大门",
"imgUrl": "/image/events/AiDA2025-Cn.jpg"
},{
"id": 4,
"title":"设计时速狂飙AiDA 618半价让灵感永不限流",
"imgUrl": "/image/events/Welcome-back-Cn.jpg"
}
],
"eventsItem":[
@@ -96,112 +88,6 @@
]
}
]
},{
"id":3,
"title":"🎉搭上2025的列车打开新设计的大门",
"imgUrl": "/image/events/AiDA2025-Cn.jpg",
"textList":[
{
"paragraph":[
{
"text":"快来发布作品获得1个月免费使用AiDA的福利"
}
]
},{
"paragraph":[
{
"text":" 只需要:"
}
]
},{
"paragraph":[
{
"text":" ✅在AiDA将设计作品分享至广场/Gallery"
},{
"text":" ✅点赞至少20"
},{
"text":" ✅在作品描述加上tag #NewYear_2025"
}
]
},{
"paragraph":[
{
"text":"📅 活动时间2025.1.1—2025.1.31"
}
]
},{
"paragraph":[
{
"text":"快来参与,让我们共同开启新年的设计之旅,让创意与科技完美融合,创造出属于你的独一无二的作品!机会难得,叫上你的朋友们助你一臂之力,为你点上大拇指哦!"
}
]
},{
"paragraph":[
{
"text":"👍 点赞即启程AiDA等你来解锁设计新世界"
}
]
}
]
},{
"id":4,
"title":"设计时速狂飙AiDA 618半价让灵感永不限流",
"imgUrl": "/image/events/Welcome-back-En.jpg",
"textList":[
{
"paragraph":[
{
"text":"618的钟声敲响AiDA的AI设计宇宙正式进入「超维折扣纪元」"
}
]
},{
"paragraph":[
{
"text":"💠 就在今年2月AiDA完成史诗级进化"
},{
"text":"💠 界面如丝绸般顺滑,功能矩阵全面升级。"
},{
"text":"😆 旧版用户惊呼这还是我认识的AiDA吗⁉"
}
]
},{
"paragraph":[
{
"text":"演示视频👉 <a href='https://sg834.apps.aliyunpds.com/disk/s/R6SsxBaju9h' target='_blank'>https://sg834.apps.aliyunpds.com/disk/s/R6SsxBaju9h</a>"
}
]
},{
"paragraph":[
{
"text":"⚡️ 618特供「专属暴击福利」💥"
},{
"text":"✔️ 输入口令“RIINRMKK”订阅直接享受半价"
},{
"text":"✔️ 效率提升60%,设计实践节省一大半!"
},{
"text":"✔️ 零基础也能5分钟出稿轻松搞定设计需求"
}
]
},{
"paragraph":[
{
"text":"⏳ 倒计时警报:"
},{
"text":"👉 让设计如火山喷发般炽热"
},{
"text":"👉 让灵感似银河倾泻般璀璨"
}
]
},{
"paragraph":[
{
"text":"优惠码:<strong>RIINRMKK</strong>"
},{
"text":"活动日期2025.6.10-6.30(后续订阅费用将恢复至原价)"
}
]
}
]
}
]
}

View File

@@ -168,6 +168,7 @@ li {
}
.ant-modal-mask {
background-color: #666666;
opacity: 0.5;
}
.select_block {
height: 4rem;
@@ -1249,10 +1250,14 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
background: #000 !important;
border-color: #000 !important;
}
.ant-spin .ant-spin-dot {
width: 1.5em;
height: 1.5em;
}
.ant-spin-dot-item {
background-color: #000000 !important;
width: 9px !important;
height: 9px !important;
width: 0.9em !important;
height: 0.9em !important;
}
.ant-spin {
color: #000;
@@ -1357,7 +1362,7 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
}
.admin_page .admin_state_item > span {
white-space: nowrap;
width: 13rem;
min-width: 13rem;
}
.admin_page .admin_state_item > span > span {
color: red;

View File

@@ -173,6 +173,7 @@ input:focus{
}
.ant-modal-mask{
background-color: #666666;
opacity: .5;
}
.select_block{
height: 4rem;
@@ -1377,10 +1378,14 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
}
}
//loding样式
.ant-spin .ant-spin-dot{
width: 1.5em;
height: 1.5em;
}
.ant-spin-dot-item{
background-color: #000000 !important;
width: 9px !important;
height: 9px !important;
width: .9em !important;
height: .9em !important;
}
.ant-spin{
color: #000;
@@ -1489,7 +1494,7 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
align-items: center;
>span{
white-space: nowrap;
width: 13rem;
min-width: 13rem;
>span{
color: red;
}

View File

@@ -17,7 +17,8 @@
<div class="generalModel_btn">
<div class="generalModel_closeIcon" @click.stop="cancelDsign()">
<svg
width="100%" height="100%"
width="100%"
height="100%"
viewBox="0 0 46 46"
fill="none"
xmlns="http://www.w3.org/2000/svg"
@@ -49,7 +50,10 @@
</div>
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>{{ $t('admin.UserName') }}: <span>*</span></span>
<span>
{{ $t('admin.UserName') }}:
<span>*</span>
</span>
<input
v-model="userName"
:placeholder="$t('admin.enterUserName')"
@@ -58,7 +62,10 @@
/>
</div>
<div class="admin_state_item">
<span>{{ $t('admin.UserEmail') }}: <span>*</span></span>
<span>
{{ $t('admin.UserEmail') }}:
<span>*</span>
</span>
<input
v-model="userEmail"
:placeholder="$t('admin.enterEmail')"
@@ -67,7 +74,10 @@
/>
</div>
<div class="admin_state_item">
<span>{{ $t('admin.Password') }}: <span>*</span></span>
<span>
{{ $t('admin.Password') }}:
<span>*</span>
</span>
<input
@focus="focus"
@blur="blur"
@@ -86,6 +96,19 @@
style="width: 250px"
/>
</div>
<div class="admin_state_item" v-if="title?.value == 'Edit'">
<span>
{{ $t('admin.SubscribePlan') }}:
<span>*</span>
</span>
<a-select
v-model:value="subscriptionPlanId"
style="width: 250px"
:options="activePlanOptions"
:field-names="{ label: 'name', value: 'id' }"
:placeholder="$t('admin.SelectPlan')"
></a-select>
</div>
</div>
<div class="allUserPoeration_btn admin_page">
<div class="admin_search_item" @click="cancelDsign">{{ $t('admin.Close') }}</div>
@@ -96,7 +119,7 @@
<a-spin size="large" />
</div>
</template>
<script>
<script lang="ts">
import {
defineComponent,
ref,
@@ -105,90 +128,114 @@ import {
onMounted,
nextTick,
toRefs,
} from "vue";
import { Https } from "@/tool/https";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import { formatTime, isEmail } from "@/tool/util";
import md5 from "md5";
computed
} from 'vue'
import { Https } from '@/tool/https'
import { Modal, message } from 'ant-design-vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { formatTime, isEmail } from '@/tool/util'
import md5 from 'md5'
import { useI18n } from 'vue-i18n'
export default defineComponent({
components: {},
emits: ["searchHistoryList"],
props: {
planOptions: {
type: Array,
default: () => []
}
},
emits: ['searchHistoryList'],
setup(props, { emit }) {
const {t} = useI18n()
const { t } = useI18n()
const { planOptions } = toRefs(props)
// 筛选出状态为 ACTIVE 的订阅计划
const activePlanOptions = computed(() => {
if (!planOptions.value || !Array.isArray(planOptions.value)) {
return []
}
return planOptions.value.filter((plan: any) => plan.status === 'ACTIVE')
})
let operations = reactive({
operationsModal: false,
operationsEdit: false,
loadingShow: false,
title: null,
});
title: null
})
let operationsData = reactive({
accountId: -1,
userName: "",
userEmail: "",
password: "",
oldPassword: "",
credits: "",
});
userName: '',
userEmail: '',
password: '',
oldPassword: '',
credits: '',
subscriptionPlanId: '',
oldSubscriptionPlanId: ''
})
let state = ref([
{
label: "visitor",
value: "0",
label: 'visitor',
value: '0'
},
{
label: "yearly",
value: "1",
label: 'yearly',
value: '1'
},
{
label: "monthly",
value: "2",
label: 'monthly',
value: '2'
},
{
label: "trial",
value: "3",
},
]);
label: 'trial',
value: '3'
}
])
let init = (funStr, data) => {
operations.operationsModal = true;
operations.operationsEdit = true;
operations.title = funStr;
if (funStr.value == "Add") operations.operationsEdit = false;
if (funStr.value == "Edit") {
operationsData.accountId = data.id;
operationsData.userName = data.userName;
operationsData.userEmail = data.userEmail;
operationsData.password = data.userPassword?data.userPassword:null;
operationsData.oldPassword = data.userPassword;
operations.operationsModal = true
operations.operationsEdit = true
operations.title = funStr
if (funStr.value == 'Add') operations.operationsEdit = false
if (funStr.value == 'Edit') {
operationsData.accountId = data.id
operationsData.userName = data.userName
operationsData.userEmail = data.userEmail
operationsData.password = data.userPassword ? data.userPassword : null
operationsData.oldPassword = data.userPassword
// operationsData.validStartTime='2024-08-05T00:00:06'
// operationsData.validEndTime='2024-08-05T00:00:06'
operationsData.credits = data.creditsUsageLimit;
operationsData.credits = data.creditsUsageLimit
operationsData.subscriptionPlanId = data.subscriptionPlanId || ''
operationsData.oldSubscriptionPlanId = data.subscriptionPlanId || ''
// operationsData.accountId = data.accountId
// operationsData.userName = data.userName
// operationsData.userEmail = data.userEmail
// operationsData.validStartTime = formatTime(data.validStartTime)
// operationsData.validEndTime = formatTime(data.validEndTime)
}
};
let focus = (event) => {
if (funStr.value == 'Add') {
operationsData.subscriptionPlanId = ''
operationsData.oldSubscriptionPlanId = ''
}
}
let focus = event => {
if (operationsData.password == operationsData.oldPassword) {
operationsData.password = "";
operationsData.password = ''
}
}
let blur = event => {
console.log(operationsData.password == '' && operationsData.oldPassword)
if (operationsData.password == '' && operationsData.oldPassword) {
operationsData.password = operationsData.oldPassword
}
};
let blur = (event) => {
console.log(operationsData.password == "" && operationsData.oldPassword);
if (operationsData.password == "" && operationsData.oldPassword) {
operationsData.password = operationsData.oldPassword;
}
};
let setAddData = () => {
return {
creditsUsageLimit: operationsData.credits,
userEmail: operationsData.userEmail,
userPassword: operationsData.password?md5(operationsData.password + "abc"):'',
userPassword: operationsData.password ? md5(operationsData.password + 'abc') : '',
userName: operationsData.userName,
};
};
subscriptionPlanId: operationsData.subscriptionPlanId
}
}
let setEditData = () => {
return {
id: operationsData.accountId,
@@ -198,57 +245,63 @@ export default defineComponent({
userPassword:
operationsData.password == operationsData.oldPassword
? null
: md5(operationsData.password + "abc"),
};
};
: md5(operationsData.password + 'abc'),
subscriptionPlanId: operationsData.subscriptionPlanId
}
}
let cancelDsign = () => {
operationsData.accountId = -1;
operationsData.userName = "";
operationsData.userEmail = "";
operationsData.password = "";
operationsData.credits = "";
operations.operationsModal = false;
};
operationsData.accountId = -1
operationsData.userName = ''
operationsData.userEmail = ''
operationsData.password = ''
operationsData.credits = ''
operationsData.subscriptionPlanId = ''
operationsData.oldSubscriptionPlanId = ''
operations.operationsModal = false
}
let setOk = () => {
let data;
if (operations.title?.value == "Add") {
data = setAddData();
let data
if (operations.title?.value == 'Add') {
data = setAddData()
if (!isEmail(data.userEmail)) {
message.info(t('admin.jsContent1'));
return;
message.info(t('admin.jsContent1'))
return
}
if (
!data.userName ||
!data.userEmail ||
!data.userPassword
)
return message.warning(t('admin.jsContent2'));
Https.axiosPost(Https.httpUrls.addOrUpdateSubAccount, data).then(
(rv) => {
if (!data.userName || !data.userEmail || !data.userPassword)
return message.warning(t('admin.jsContent2'))
Https.axiosPost(Https.httpUrls.addOrUpdateSubAccount, data).then(rv => {
if (rv) {
cancelDsign();
emit("searchHistoryList");
cancelDsign()
emit('searchHistoryList')
}
}
);
})
} else {
data = setEditData();
data = setEditData()
if (!isEmail(data.userEmail)) {
message.info("The email format is incorrect");
return;
message.info('The email format is incorrect')
return
}
if (!data.userName || !data.userEmail)
return message.warning("Please check the input box marked with *");
Https.axiosPost(Https.httpUrls.addOrUpdateSubAccount, data).then(
(rv) => {
if (!data.userName || !data.userEmail || !data.subscriptionPlanId)
return message.warning('Please check the input box marked with *')
const needSwitchPlan =
operationsData.subscriptionPlanId &&
operationsData.subscriptionPlanId !== operationsData.oldSubscriptionPlanId
Https.axiosPost(Https.httpUrls.addOrUpdateSubAccount, data).then(async rv => {
if (rv) {
cancelDsign();
emit("searchHistoryList");
if (needSwitchPlan) {
await Https.axiosGet(Https.httpUrls.switchSubAccountSubscribePlan, {
params: {
targetSubscriptionPlanId: operationsData.subscriptionPlanId,
subAccId: operationsData.accountId
}
})
}
cancelDsign()
emit('searchHistoryList')
}
})
}
}
);
}
};
return {
...toRefs(operations),
...toRefs(operationsData),
@@ -258,14 +311,16 @@ export default defineComponent({
focus,
blur,
setOk,
};
planOptions,
activePlanOptions
}
},
data() {
return {};
return {}
},
mounted() {},
methods: {},
});
methods: {}
})
</script>
<style lang="less" scoped>
:deep(.allUserPoeration_modal) {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -585,7 +585,6 @@ export class ExportManager {
restoreOpacityInRedGreen && true
);
if (cloned) {
// 调整对象位置:将原画布坐标转换为以固定图层为原点的相对坐标
cloned.set({
left: canvasWidth / 2,
top: canvasHeight / 2,

View File

@@ -61,7 +61,7 @@
<model
ref="model"
:key="positionKey"
@addDetail="addDetail"
@canvasReload="canvasReload"
@detailEdit="detailEdit"
@addSketch="()=>isEditPattern.value = ''"
@@ -78,7 +78,16 @@
<div class="item detailRight" :class="{canvas:isEditPattern.value}">
<div class="submit">
</div>
<div class="contentRight" v-if="currentDetailType && !isEditPattern.value">
<div class="contentRight" v-if="currentDetailType === 'sketch' && !selectDetail?.newDetail?.[currentDetailType] && !selectDetail.sketchString && !isEditPattern.value">
<img
style="width: 100%; height: 100%;object-fit: contain;"
:src="
'/image/toolsGuide/' +
(locale == 'ENGLISH' ? 'detailEN' : 'detailCN') +
'.png'
" alt="">
</div>
<div class="contentRight" v-else-if="currentDetailType && !isEditPattern.value">
<detailRight ref="detailRight"></detailRight>
<div class="btn"
v-show="
@@ -102,7 +111,7 @@
</div> -->
</div>
</div>
<addDetails ref="addDetails" @setSloganData="setSloganData"></addDetails>
</a-modal>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
@@ -128,17 +137,18 @@ import { useI18n } from 'vue-i18n'
import addDetails from '@/component/Detail/addDetails.vue'
export default defineComponent({
components:{
detailLeft,model,detailRight,canvasBox
detailLeft,model,detailRight,canvasBox,addDetails
},
emits:['destroy'],
setup(props,{emit}) {
const store = useStore();
const {locale} = useI18n()
const detailDom = reactive({
model:null,
canvasBox,
detailRight,
detailLeft:null as any,
addDetails:null as any,
})
const userDetail = computed(()=>{
return store.state.UserHabit.userDetail
@@ -506,6 +516,17 @@ export default defineComponent({
sessionStorage.setItem('revocation', JSON.stringify(revocation));
sessionStorage.setItem('oppositeRevocation',JSON.stringify([]));
}
const addDetail = () =>{
let addDetails:any = detailDom.addDetails
addDetails.init(detailData.selectDetail,'')
}
const setSloganData = (data:any)=>{
detailData.selectDetail.sketchString = data
if(detailData.currentDetailType == 'sketch' && detailData.selectDetail?.newDetail?.sketch){
detailData.selectDetail.newDetail.sketch = null
}
}
onMounted(()=>{
window.addEventListener('resize', handleResize);
})
@@ -518,6 +539,7 @@ export default defineComponent({
})
return{
locale,
...toRefs(detailDom),
...toRefs(detailData),
closeModal,
@@ -531,6 +553,8 @@ export default defineComponent({
canvasReload,
modelOnLoad,
sketchSysToLibrary,
addDetail,
setSloganData,
}
},

View File

@@ -238,7 +238,7 @@ export default defineComponent({
let size = {
...detailData.canvasConfig,
}
store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
segmentImage(value,full,size).then(async (rv)=>{
let front = detailData.frontBack.front[detailData.imgDomIndex]
let back = detailData.frontBack.back[detailData.imgDomIndex]
@@ -251,7 +251,7 @@ export default defineComponent({
let base64 = await resizeImageWithNativeCanvas(front.oldMaskUrl,value)
front.maskUrl = base64
back.imageUrl = rv.targetBackUrl
store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
// store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
})
}

View File

@@ -141,6 +141,7 @@ export default defineComponent({
JSON.stringify(colorData.selectDetail.color.gradient) == JSON.stringify(color?.gradient)
&& colorData.selectDetail.color.rgba?.r
){
console.log('---',index)
isNoSelect = true
colorData.selectColor = item
colorData.colorList.index = index
@@ -160,8 +161,8 @@ export default defineComponent({
if(color?.gradient){
item.gradient = color?.gradient
}
colorData.colorList.index = index
colorData.selectColor = item
// colorData.colorList.index = index
// colorData.selectColor = item
}
colorData.colorList.list[newVal].push(item)
}

View File

@@ -6,7 +6,6 @@
<element v-show="currentDetailType == 'element'"></element>
<accessory v-show="currentDetailType == 'accessory'"></accessory>
<models v-show="currentDetailType == 'models'"></models>
<addDetails ref="addDetails" @setSloganData="setSloganData"></addDetails>
</div>
</template>
<script lang="ts">
@@ -22,12 +21,12 @@ import color from './colorBox/index.vue'
import element from './element.vue'
import accessory from './accessory.vue'
import models from './models.vue'
import addDetails from '@/component/Detail/addDetails.vue'
export default defineComponent({
components:{
sketch,print,color,addDetails,element,models,accessory
sketch,print,color,element,models,accessory
},
emit:['addDetail'],
setup(props,{emit}) {
const store = useStore();
const detailData = reactive({
@@ -45,14 +44,7 @@ export default defineComponent({
sketch:null as any,
})
const addDetail = () =>{
let addDetails:any = getDetailListDom.addDetails
addDetails.init(detailData.selectDetail,'')
}
const setSloganData = (data:any)=>{
detailData.selectDetail.sketchString = data
if(detailData.currentDetailType == 'sketch' && detailData.selectDetail?.newDetail?.sketch){
detailData.selectDetail.newDetail.sketch = null
}
emit('addDetail')
}
const sketchSysToLibrary = ()=>{//系统sketch添加到library更新library
getDetailListDom.sketch.sketchSysToLibrary()
@@ -63,7 +55,6 @@ export default defineComponent({
...toRefs(getDetailListData),
...toRefs(getDetailListDom),
addDetail,
setSloganData,
sketchSysToLibrary,
}
},

View File

@@ -350,6 +350,7 @@ export default defineComponent({
margin-top: 1rem;
justify-content: space-between;
align-content: flex-start;
padding-bottom: 2rem;
// &::-webkit-scrollbar{display: none;}
> .content_img_item{
width: calc((50% - 1rem));
@@ -368,9 +369,12 @@ export default defineComponent({
> .material_content_list_loding{
width: 100%;
aspect-ratio: 1/1;
height: 4rem;
overflow: hidden;
> img{
width: 100%;
height: 100%;
object-fit: contain;
}
}
}

View File

@@ -5,7 +5,7 @@
<!-- <img :src="selectDetail?.sketchString?selectDetail?.sketchString:selectDetail.path" alt=""> -->
<img :src="selectDetail.path" alt="">
<!-- <img :src="selectDetail.sketchString || selectDetail.path" alt=""> -->
<i :title="$t('DesignDetail.editSketchTitle')" class="fi fi-rs-pencil-paintbrush" @click.stop="openAddDetail"></i>
<!-- <i :title="$t('DesignDetail.editSketchTitle')" class="fi fi-rs-pencil-paintbrush" @click.stop="openAddDetail"></i> -->
</div>
<div class="select_sketch" v-else>
<div>

View File

@@ -14,6 +14,7 @@
<i class="icon iconfont icon-chehui" @click="revocation"></i>
<i class="icon iconfont icon-fanchehui" @click="oppositeRevocation"></i>
<!-- 编辑 -->
<i class="fi fi-rs-pencil-paintbrush" :title="$t('DesignDetail.editSketchTitle')" :class="{'pointerEventsNone':!selectDetail?.id}" @click="()=>$emit('addDetail')"></i>
<i class="fi fi-rr-edit" :title="$t('DesignDetail.editTitle')" :class="{active:isEditPattern.value == 'canvasEditor','pointerEventsNone':!selectDetail?.id}" @click="showDesignImgDetail('canvasEditor')"></i>
<i class="icon iconfont icon-clothes" :title="$t('Canvas.editFrontBack')" style="font-size: 3.2rem;" @click="showDesignImgDetail('redGreenExample')" :class="{active:isEditPattern.value == 'redGreenExample','pointerEventsNone':!selectDetail?.id}"></i>
@@ -50,7 +51,7 @@ export default defineComponent({
components:{
position,modelNav
},
emits:['detailEdit','canvasReload','addSketch','revocation','oppositeRevocation','modelOnLoad','sketchSysToLibrary'],
emits:['detailEdit','canvasReload','addSketch','revocation','oppositeRevocation','modelOnLoad','sketchSysToLibrary','addDetail'],
setup(props,{emit}) {
const {t} = useI18n()
const store = useStore();

View File

@@ -286,7 +286,8 @@
@click="generageAdd(item)"
:class="[
item.status != 'Success' ? 'hideEvents' : '',
item?.checked ? 'active' : ''
item?.checked ? 'active' : '',
(type_.type2 == 'Printboard' && item?.imgUrl)? 'maskBg' : ''
]"
>
<img v-if="item?.imgUrl" v-lazy="item.imgUrl" @click.stop="generageAdd(item)" />
@@ -1359,6 +1360,10 @@ export default defineComponent({
width: calc(25% - 2rem);
aspect-ratio: 1 / 1;
position: relative;
&.maskBg{
background-image: url("data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23666' fill-opacity='0.4'%3E%3Crect x='20' width='20' height='20'/%3E%3Crect y='20' width='20' height='20'/%3E%3C/g%3E%3C/svg%3E");
background-size: 2rem 2rem; /* 调整图案密度 */
}
&.active {
opacity: 0.5;
// border: 2px solid;
@@ -1379,6 +1384,7 @@ export default defineComponent({
display: flex;
align-items: center;
justify-content: center;
position: absolute;
}
img {
// width: calc(10rem*1.2);
@@ -1386,6 +1392,7 @@ export default defineComponent({
width: 100%;
height: 100%;
object-fit: contain;
}
&:hover .delete_like_file_block {
// display: block;

View File

@@ -486,7 +486,7 @@ export default defineComponent({
.my_material_header_left{
margin-right: auto;
.select_block{
border: calc(0.1rem* 1.2) solid #F1F1F1;
// border: calc(0.1rem* 1.2) solid #F1F1F1;
margin-right: calc(2.3rem*1.2);
height: auto;
.ant-select-selector{

View File

@@ -34,8 +34,8 @@
</div>
</div>
<div class="layout_centent" :class="{active:flex_direction}" id="layoutCentent">
<div v-for="item,index in layoutList" :key="item" :class="moodbClassName[index]" class="modal_imgItem" v-layout="item" @mousedown="setpitch(item,index)" @touchstart="setpitch(item,index)" ref="content" >
<img crossOrigin="anonymous" :src="item.imgUrl" :style="{'transform':`translate(-50%, -50%) scale(${item.zoom?item.zoom:1}) rotateZ(${item.angle?item.angle:0}deg)`}" draggable="false" :class="moodbClassName[index]" v-modelImg>
<div v-for="item,index in layoutList" :key="item" :class="moodbClassName[index]" class="modal_imgItem" v-layout="item" @mousedown="setpitch(item,index)" @touchstart="setpitch(item,index)" ref="content" :style="{'background-image':`url(${item.imgUrl})`,'transform':`scale(${item.zoom?item.zoom:1}) rotateZ(${item.angle?item.angle:0}deg)`}">
<!-- <img crossOrigin="anonymous" :src="item.imgUrl" :style="{'transform':`translate(-50%, -50%) scale(${item.zoom?item.zoom:1}) rotateZ(${item.angle?item.angle:0}deg)`}" draggable="false" :class="moodbClassName[index]" v-modelImg> -->
<ul v-show="item.setPitch" class="layout_btn" >
<li class="layout_btn_top" v-compile.stop="'top'"></li>
<li class="layout_btn_bottom" v-compile.stop="'bottom'"></li>
@@ -736,6 +736,7 @@ export default defineComponent({
setmoodb(item:any){
this.moodbClassName = item
this.$emit('setmoodbClass',this.moodbClassName)
this.styleObj.class = this.moodbClassName
if(this.content){
for (item of (this.content as any)) {
item.classList.remove('active')
@@ -772,7 +773,7 @@ export default defineComponent({
initDomStyle(){
nextTick(()=>{
this.content.forEach((item:any,index:any) => {
if(this.styleObj.domStyle[index]){
if(this.styleObj.domStyle[index]?.left){
item.classList.add('active')
this.initStyle(item,this.styleObj.domStyle[index])
}
@@ -794,7 +795,7 @@ export default defineComponent({
})
},
initStyle(dom:any,style:any){
if(!style)return
if(!style || !dom)return
for (const [property, value] of Object.entries(style)) {
dom.style.setProperty(property, value);
@@ -806,7 +807,7 @@ export default defineComponent({
this.styleObj.domStyle.push(this.setStyle(item.style))
this.domObj.dom.forEach((domName:any,index:any) => {
let style = this.domObj.domStyle[index]
let dom = item.querySelector(domName)
let dom = item.querySelector(domName) || item
this.styleObj[style].push(this.setStyle(dom.style))
})
});
@@ -840,7 +841,6 @@ export default defineComponent({
let config:any = {headers:{'Content-Type':'multipart/form-data','Accept':'*/*' }}
Https.axiosPost(Https.httpUrls.elementUpload,param,config)
.then((rv: any) => {
// console.log(rv);
rv.imgUrl = rv.url
this.layout = false
this.loadingShow = false
@@ -1062,27 +1062,12 @@ export default defineComponent({
// height: 100%;
// }
overflow: hidden;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
&.active{
position: absolute;
}
img{
// object-fit: cover;
// width: 100%;
// height: 100%;
pointer-events: none;
float: left;
user-select:none;
-webkit-user-drag: none;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%) scale(1);
}
::selection {
// background: rgba(0,0,0,0);
// background: yellow;
}
}
}
.wh1{

View File

@@ -19,7 +19,8 @@
<div class="generalModel_closeIcon" @click.stop="cancelDsign()">
<!-- <i class="fi fi-rr-cross-small"></i> -->
<svg
width="100%" height="100%"
width="100%"
height="100%"
viewBox="0 0 46 46"
fill="none"
xmlns="http://www.w3.org/2000/svg"
@@ -49,20 +50,32 @@
<div class="renewContent">
<div class="left">
<div class="video">
<video autoplay loop muted playsinline src="@/assets/images/icon/paymentVideo.mp4"></video>
<video
autoplay
loop
muted
playsinline
src="@/assets/images/icon/paymentVideo.mp4"
></video>
<div class="mask"></div>
</div>
<div class="title">{{ $t("Renew.Strengths") }}</div>
<div class="title">{{ $t('Renew.Strengths') }}</div>
<div class="content">
<div class="benefitsItem">
<div class="describe">
<div class="icon">
<img src="@/assets/images/icon/paymentIntroduce1.png" alt="">
<img src="@/assets/images/icon/paymentIntroduce1.png" alt="" />
</div>
<div class="text">
<p class="title">{{ $t("Renew.StrengthsTitle1") }}<br>{{ $t("Renew.StrengthsTitle1_1") }}</p>
<p class="title">
{{ $t('Renew.StrengthsTitle1') }}
<br />
{{ $t('Renew.StrengthsTitle1_1') }}
</p>
<p class="info">
{{ $t("Renew.StrengthsInfo1") }}<br>{{ $t("Renew.StrengthsInfo1_1") }}
{{ $t('Renew.StrengthsInfo1') }}
<br />
{{ $t('Renew.StrengthsInfo1_1') }}
</p>
</div>
</div>
@@ -70,12 +83,18 @@
<div class="benefitsItem">
<div class="describe">
<div class="icon">
<img src="@/assets/images/icon/paymentIntroduce2.png" alt="">
<img src="@/assets/images/icon/paymentIntroduce2.png" alt="" />
</div>
<div class="text">
<p class="title">{{ $t("Renew.StrengthsTitle2") }}<br>{{ $t("Renew.StrengthsTitle2_1") }}</p>
<p class="title">
{{ $t('Renew.StrengthsTitle2') }}
<br />
{{ $t('Renew.StrengthsTitle2_1') }}
</p>
<p class="info">
{{ $t("Renew.StrengthsInfo2") }}<br>{{ $t("Renew.StrengthsInfo2_1") }}
{{ $t('Renew.StrengthsInfo2') }}
<br />
{{ $t('Renew.StrengthsInfo2_1') }}
</p>
</div>
</div>
@@ -83,13 +102,21 @@
<div class="benefitsItem">
<div class="describe">
<div class="icon">
<img src="@/assets/images/icon/paymentIntroduce3.png" alt="">
<img src="@/assets/images/icon/paymentIntroduce3.png" alt="" />
</div>
<div class="text">
<p class="title"></p>
<p class="title">{{ $t("Renew.StrengthsTitle3") }}<br>{{ $t("Renew.StrengthsTitle3_1") }}</p>
<p class="title">
{{ $t('Renew.StrengthsTitle3') }}
<br />
{{ $t('Renew.StrengthsTitle3_1') }}
</p>
<p class="info">
{{ $t("Renew.StrengthsInfo3") }}<br>{{ $t("Renew.StrengthsInfo3_1") }}<br>{{ $t("Renew.StrengthsInfo3_2") }}
{{ $t('Renew.StrengthsInfo3') }}
<br />
{{ $t('Renew.StrengthsInfo3_1') }}
<br />
{{ $t('Renew.StrengthsInfo3_2') }}
</p>
</div>
</div>
@@ -97,12 +124,18 @@
<div class="benefitsItem">
<div class="describe">
<div class="icon">
<img src="@/assets/images/icon/paymentIntroduce4.png" alt="">
<img src="@/assets/images/icon/paymentIntroduce4.png" alt="" />
</div>
<div class="text">
<p class="title">{{ $t("Renew.StrengthsTitle4") }}<br>{{ $t("Renew.StrengthsTitle4_1") }}</p>
<p class="title">
{{ $t('Renew.StrengthsTitle4') }}
<br />
{{ $t('Renew.StrengthsTitle4_1') }}
</p>
<p class="info">
{{ $t("Renew.StrengthsInfo4") }}<br>{{ $t("Renew.StrengthsInfo4_1") }}
{{ $t('Renew.StrengthsInfo4') }}
<br />
{{ $t('Renew.StrengthsInfo4_1') }}
</p>
</div>
</div>
@@ -111,7 +144,7 @@
</div>
<div class="right">
<div class="title">
{{ $t("Renew.title") }}
{{ $t('Renew.title') }}
</div>
<!-- <div class="info">{{ $t("Renew.unlimited") }}</div> -->
<div class="content">
@@ -119,36 +152,31 @@
class="productItem"
:class="{
active: item.price == current.price,
sellWell: item.sellWell,
sellWell: item.sellWell
}"
v-for="item in personage"
:key="item.price"
@click="setPromotionData(item)"
>
<div class="popular" v-show="item.sellWell">{{ $t("Renew.MOSTPOPULAR") }}</div>
<div class="popular" v-show="item.sellWell">
{{ $t('Renew.MOSTPOPULAR') }}
</div>
<div class="priceBox">
<div class="left">
<p class="productType">1 {{ item.type.label }}</p>
<p class="price">${{ item.price }}</p>
<p class="price">HK $ {{ item.price }}</p>
</div>
<div class="right">
<div class="promotion">
<div
class="succeed"
v-show="item.promotionData.error == 'true'"
>
<div class="succeed" v-show="item.promotionData.error == 'true'">
{{ item.promotionData.code }}
<i
class="fi fi-sr-times-hexagon"
@click="clearPromotionCode"
></i>
<i class="fi fi-sr-times-hexagon" @click="clearPromotionCode"></i>
</div>
<div
class="input"
@click.stop
v-show="
!item.promotionData.error ||
item.promotionData.error == 'false'
!item.promotionData.error || item.promotionData.error == 'false'
"
>
<input
@@ -156,14 +184,11 @@
:placeholder="$t('Renew.promotionCode')"
v-model="item.promotionData.code"
/>
<div style="cursor: pointer; background-color: #000; font-size: 1.2rem; color: #fff; padding: 0 .5rem;" @click="examine(item)">
{{ $t("Renew.use") }}
<div class="apply-btn" @click="examine(item)">
{{ $t('Renew.use') }}
</div>
</div>
<div
class="error"
v-show="item.promotionData.error == 'false'"
>
<div class="error" v-show="item.promotionData.error == 'false'">
{{ item.promotionData.str }}
</div>
</div>
@@ -181,7 +206,7 @@
<div class="payment">
<div class="allocation">
<div class="selectType">
<div class="text">{{ $t("Renew.Payment") }}:</div>
<div class="text">{{ $t('Renew.Payment') }}:</div>
<label>
<input
name="payment"
@@ -190,7 +215,7 @@
v-model="PaymentType"
@change="setPaymentType('CreditCard')"
/>
{{ $t("Renew.CreditCard") }}
{{ $t('Renew.CreditCard') }}
</label>
<label>
<input
@@ -200,43 +225,47 @@
v-model="PaymentType"
@change="setPaymentType('Alipay')"
/>
{{ $t("Renew.Alipay") }}
{{ $t('Renew.Alipay') }}
</label>
</div>
</div>
<div class="gallery_btn gallery_btn_radius" @click="payment">
{{ $t("upgradePlan.Continue") }}
{{ $t('upgradePlan.Continue') }}
</div>
<div class="payMethod_payAffirm_clause" ref="labelDisclaimer">
<label>
<!-- <input type="checkbox" v-model="clause" /> -->
<span class="generalModelDescription"
>{{ $t("upgradePlan.policy")}}
<span class="generalModelDescription">
{{ $t('upgradePlan.policy') }}
<a
href="https://code-create.com.hk/aida-terms-and-conditions/"
target="_blank">
{{ $t("upgradePlan.policy1") }}
target="_blank"
>
{{ $t('upgradePlan.policy1') }}
</a>
&
<a
href="https://code-create.com.hk/aida-subscription-agreement/"
target="_blank">
{{ $t("upgradePlan.policy2") }}
target="_blank"
>
{{ $t('upgradePlan.policy2') }}
</a>
<!-- . * -->
</span
>
</span>
</label>
<label class="secure">
<span><i class="fi fi-rr-shield-check"></i>Pay safe & secure</span>
<span>
<i class="fi fi-rr-shield-check"></i>
Pay safe & secure
</span>
</label>
<label class="payIcon">
<img class="stripe" src="@/assets/images/icon/stripe.svg" alt="">
<img class="alipay" src="@/assets/images/icon/alipay.svg" alt="">
<img class="alipay" src="@/assets/images/icon/jcbPay.svg" alt="">
<img class="alipay" src="@/assets/images/icon/mastercardPay.svg" alt="">
<img class="alipay" src="@/assets/images/icon/yinlianPay.svg" alt="">
<img class="alipay" src="@/assets/images/icon/visaPay.svg" alt="">
<img class="stripe" src="@/assets/images/icon/stripe.svg" alt="" />
<img class="alipay" src="@/assets/images/icon/alipay.svg" alt="" />
<img class="alipay" src="@/assets/images/icon/jcbPay.svg" alt="" />
<img class="alipay" src="@/assets/images/icon/mastercardPay.svg" alt="" />
<img class="alipay" src="@/assets/images/icon/yinlianPay.svg" alt="" />
<img class="alipay" src="@/assets/images/icon/visaPay.svg" alt="" />
</label>
</div>
<!-- <div class="paySecure">
@@ -250,101 +279,104 @@
<a-spin size="large" />
</div>
<div class="mark_loading" v-show="isShowMark" state="true">
<div class="mark_loading_title">{{ $t("upgradePlan.completed") }}</div>
<div class="mark_loading_intro">{{ $t("upgradePlan.hint") }}</div>
<div class="mark_loading_title">{{ $t('upgradePlan.completed') }}</div>
<div class="mark_loading_intro">{{ $t('upgradePlan.hint') }}</div>
<div class="mark_loading_title_box">
<div class="mark_loading_btn mark_loading_btn2" @click="setPaidBack">
{{ $t("upgradePlan.Back") }}
{{ $t('upgradePlan.Back') }}
</div>
<div class="mark_loading_btn" @click="completePayment">OK</div>
</div>
</div>
</a-modal>
<payMethod
ref="payMethod"
@completePayment="cancelDsign"
type="renew"
></payMethod>
</template>
<payMethod ref="payMethod" @completePayment="cancelDsign" type="renew"></payMethod>
</template>
<script lang="ts">
import { defineComponent, computed, reactive, toRefs, onMounted, onBeforeUnmount } from "vue";
import { message } from "ant-design-vue";
import payMethod from "@/component/Pay/payMethod.vue";
import { useStore } from "vuex";
import { useI18n } from "vue-i18n";
import { Https } from "@/tool/https";
import md5 from "md5";
export default defineComponent({
<script lang="ts">
import {
defineComponent,
computed,
reactive,
toRefs,
onMounted,
onBeforeUnmount
} from 'vue'
import { message } from 'ant-design-vue'
import payMethod from '@/component/Pay/payMethod.vue'
import { useStore } from 'vuex'
import { useI18n } from 'vue-i18n'
import { Https } from '@/tool/https'
import md5 from 'md5'
export default defineComponent({
components: {
payMethod,
payMethod
},
setup() {
const store = useStore();
const { t } = useI18n();
const store = useStore()
const { t } = useI18n()
let renew = reactive({
renewModel: false,
renewModelMask: true,
pageWidth: "50%",
});
pageWidth: '50%'
})
let payMethodData = reactive({
clause: false,
labelDisclaimer: null as any,
newWindow: null as any,
isShowMark: false,
isShowMark_: false,
});
isShowMark_: false
})
let renewData = reactive({
personage: [
{
price: "100",
price: '100',
sellWell: true,
activity: false, //活动打折
type: {
value: "EcoMonth",
label: computed(()=>t("Renew.Monthly")),
value: 'EcoMonth',
label: computed(() => t('Renew.Monthly'))
},
// PaymentType: "CreditCard",
promotionData: {
code: "",
error: "",
str: "",
price: "",
},
code: '',
error: '',
str: '',
price: ''
}
},
{
price: "500",
price: '500',
sellWell: false,
activity: false, //活动打折
type: {
value: "Month",
label: computed(()=>t("Renew.Monthly")),
value: 'Month',
label: computed(() => t('Renew.Monthly'))
},
// PaymentType: "CreditCard",
promotionData: {
code: "",
error: "",
str: "",
price: "",
},
code: '',
error: '',
str: '',
price: ''
}
},
{
price: "5,000",
price: '5,000',
sellWell: false,
activity: false, //活动打折
typeValue: "year",
typeValue: 'year',
type: {
value: "Year",
label: computed(()=>t("Renew.Yearly")),
value: 'Year',
label: computed(() => t('Renew.Yearly'))
},
// PaymentType: "CreditCard",
promotionData: {
code: "",
error: "",
str: "",
price: "",
},
},
code: '',
error: '',
str: '',
price: ''
}
}
],
// personage:computed(()=>{
// return {
@@ -365,55 +397,55 @@
// }),
firm: computed(() => {
return {
title: "Education Edition",
title: 'Education Edition',
price: {
year: "500",
year: '500'
},
unit: {
year: "HKD / Year",
year: 'HKD / Year'
},
type: "year",
type: 'year',
autoRenewal: {
text: t("Renew.automatically"),
value: true,
text: t('Renew.automatically'),
value: true
},
typeList: ["year"],
info: "Customised plan",
};
typeList: ['year'],
info: 'Customised plan'
}
}),
education: computed(() => {
return {
title: "Enterprise Edition",
title: 'Enterprise Edition',
price: {
year: "500",
year: '500'
},
unit: {
year: "HKD / Year",
year: 'HKD / Year'
},
type: "year",
type: 'year',
autoRenewal: {
text: t("Renew.automatically"),
value: true,
text: t('Renew.automatically'),
value: true
},
typeList: ["year"],
info: "Customised plan",
};
typeList: ['year'],
info: 'Customised plan'
}
}),
current: {} as any,
payMethod: null as any,
PaymentType: "CreditCard",
});
PaymentType: 'CreditCard'
})
const init = () => {
renew.renewModel = true;
renewData.current = renewData.personage[1];
};
renew.renewModel = true
renewData.current = renewData.personage[1]
}
const cancelDsign = () => {
renew.renewModel = false;
renew.renewModel = false
store.dispatch('getUserDetail')
};
}
const setPaymentType = (str: any) => {
renewData.PaymentType = str;
};
renewData.PaymentType = str
}
const payment = () => {
// if (!payMethodData.clause) {
// let labelDisclaimer: any = payMethodData.labelDisclaimer;
@@ -425,104 +457,92 @@
// }
// return;
// }
if (!renewData.PaymentType)
return message.info(t("Renew.PleaseSelectPayment"));
let url = window.location.origin + "/paySucceed";
if (!renewData.PaymentType) return message.info(t('Renew.PleaseSelectPayment'))
let url = window.location.origin + '/paySucceed'
let data = {
autoRenewal: renewData.PaymentType != "Alipay", //false为不自动续费
productName: "Subscription",
autoRenewal: renewData.PaymentType != 'Alipay', //false为不自动续费
productName: 'Subscription',
quantity: 1,
returnUrl: url,
subscribeType: renewData.current.type.value, //yearly为年费monthly为月费
wallet: "ALIPAYHK",
promotionCode: renewData.current.promotionData.code,
};
let httpsUrl = Https.httpUrls.payStripe;
payMethodData.isShowMark_ = true;
wallet: 'ALIPAYHK',
promotionCode: renewData.current.promotionData.code
}
let httpsUrl = Https.httpUrls.payStripe
payMethodData.isShowMark_ = true
Https.axiosPost(httpsUrl, data)
.then((rv: any) => {
var width = 800;
var height = 600;
var left = (screen.width - width) / 2;
var top = (screen.height - height) / 2;
var width = 800
var height = 600
var left = (screen.width - width) / 2
var top = (screen.height - height) / 2
payMethodData.newWindow = window.open(
"",
"_blank",
"width=" +
width +
", height=" +
height +
", left=" +
left +
", top=" +
top
);
let herf = rv;
'',
'_blank',
'width=' + width + ', height=' + height + ', left=' + left + ', top=' + top
)
let herf = rv
if (payMethodData.newWindow) {
payMethodData.newWindow.location.href = herf;
payMethodData.newWindow.location.href = herf
} else {
// window.open(herf, '_blank');
window.location.href = herf;
window.location.href = herf
}
payMethodData.newWindow = null;
payMethodData.isShowMark = true;
payMethodData.isShowMark_ = false;
payMethodData.newWindow = null
payMethodData.isShowMark = true
payMethodData.isShowMark_ = false
})
.catch(res => {
payMethodData.isShowMark_ = false
})
.catch((res) => {
payMethodData.isShowMark_ = false;
});
// renewData.payMethod.init(data)
};
}
const setPaidBack = () => {
payMethod.payMethodModel = false;
payMethodData.isShowMark = false;
payMethodData.clause = false;
};
payMethod.payMethodModel = false
payMethodData.isShowMark = false
payMethodData.clause = false
}
const completePayment = () => {
renew.renewModel = false;
setPaidBack();
};
renew.renewModel = false
setPaidBack()
}
const examine = (item: any) => {
// renewData.promotionData.error
let price = item?.price;
const normalNumber = Number(price.replace(/,/g, ""));
let price = item?.price
const normalNumber = Number(price.replace(/,/g, ''))
if (!item.promotionData.code) {
return;
return
}
let data = {
promotionCode: item.promotionData.code,
price: normalNumber,
};
Https.axiosGet(Https.httpUrls.checkCoupon, { params: data }).then(
(rv: any) => {
price: normalNumber
}
Https.axiosGet(Https.httpUrls.checkCoupon, { params: data }).then((rv: any) => {
if (rv) {
renewData.personage.forEach((personageItem: any) => {
if (personageItem.price == item.price) {
if (rv.status == "valid") {
item.promotionData.error = "true";
item.promotionData.price = Number(
rv.discountedPrice
).toLocaleString();
if (rv.status == 'valid') {
item.promotionData.error = 'true'
item.promotionData.price = Number(rv.discountedPrice).toLocaleString()
} else {
item.promotionData.error = "false";
item.promotionData.str = rv.message;
item.promotionData.error = 'false'
item.promotionData.str = rv.message
}
}
});
})
} else {
}
})
}
);
};
const clearPromotionCode = () => {
renewData.current.promotionData.error = "";
renewData.current.promotionData.code = "";
renewData.current.promotionData.price = "";
};
renewData.current.promotionData.error = ''
renewData.current.promotionData.code = ''
renewData.current.promotionData.price = ''
}
const setPromotionData = (item: any) => {
renewData.current = item;
};
renewData.current = item
}
return {
store,
...toRefs(renew),
@@ -536,21 +556,21 @@
completePayment,
examine,
clearPromotionCode,
setPromotionData,
};
setPromotionData
}
},
data() {
return {};
return {}
},
methods: {
turnToWindow(url: any) {
window.open(url);
},
},
});
</script>
<style lang="less" scoped>
.renew {
window.open(url)
}
}
})
</script>
<style lang="less" scoped>
.renew {
:deep(.ant-modal-body) {
padding: 0;
}
@@ -590,24 +610,24 @@
position: relative;
display: flex;
flex-direction: column;
> .video{
> .video {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
> video{
> video {
width: 100%;
height: 100%;
object-fit: cover;
}
> .mask{
> .mask {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
background: rgba(0,0,0,.5);
background: rgba(0, 0, 0, 0.5);
}
}
@@ -679,10 +699,11 @@
margin-bottom: 1rem;
border-radius: 1rem;
overflow: hidden;
border: 1.5px solid #eaecf0;
border: 1.5px solid #e7ebff;
cursor: pointer;
> .popular {
background: #2d9f75;
background: #1b223c;
font-weight: 600;
display: flex;
justify-content: center;
@@ -705,14 +726,14 @@
> .price {
font-size: 1.8rem;
margin-top: 0.4rem;
opacity: 0.4;
// opacity: 0.4;
font-weight: 500;
}
}
> .left {
> p:nth-child(1) {
font-size: 2rem;
opacity: 0.7;
// opacity: 0.7;
font-weight: 700;
}
}
@@ -744,15 +765,31 @@
display: flex;
align-items: center;
border-radius: 2rem;
border: 2px solid #000;
border: 1.5px solid rgb(216, 218, 220);
overflow: hidden;
padding: 0 1rem;
background-color: #fff;
input {
border: none;
height: 3rem;
width: 10rem;
font-size: 1.2rem;
background: rgba(0, 0, 0, 0);
&::placeholder {
color: #c4c4c4;
}
}
.apply-btn {
cursor: pointer;
background-color: rgb(27, 34, 60);
font-size: 0.8rem;
color: #fff;
width: 3.3rem;
height: 1.4rem;
line-height: 1.4rem;
display: flex;
align-items: center;
justify-content: center;
}
}
> .error {
@@ -767,24 +804,14 @@
}
}
}
&.active {
background: #0ea98233;
border: 2px solid #0ea982;
> .priceBox {
> .left {
> p:nth-child(1) {
opacity: 1;
}
}
> .right {
> .discountsPrice {
opacity: 1;
}
}
}
&.active,
&:hover {
// 40% opacity
background: rgba(231, 235, 255, 0.4);
// border: 2px solid #0ea982;
}
&.sellWell {
border: 2px solid #0ea982;
// border: 2px solid #0ea982;
}
}
> .productItem:last-child {
@@ -819,8 +846,15 @@
> .gallery_btn {
width: 100%;
margin: 2rem 0;
margin-bottom: .5rem;
margin-bottom: 0.5rem;
margin-top: 1rem;
background: #1b223c;
color: #fff;
// width: 41.8rem;
height: 4rem;
box-sizing: border-box;
line-height: 4rem;
border-radius: 0.6rem;
}
> .payMethod_payAffirm_clause {
text-align: center;
@@ -842,27 +876,27 @@
}
}
}
> .secure{
> .secure {
border: 1px solid #ededed;
background: #f1fbf9;
color: #1cb36c;
padding: .4rem .8rem;
border-radius: .5rem;
padding: 0.4rem 0.8rem;
border-radius: 0.5rem;
margin-top: 4rem;
> span{
> span {
display: flex;
align-items: center;
}
i{
i {
display: flex;
margin-right: .5rem;
margin-right: 0.5rem;
}
}
> .payIcon{
> .payIcon {
height: 2rem;
margin-top: 1rem;
img{
margin: 0 .3rem;
img {
margin: 0 0.3rem;
height: 100%;
}
}
@@ -958,6 +992,5 @@
background: rgba(0, 0, 0, 0);
}
}
}
</style>
}
</style>

View File

@@ -41,7 +41,7 @@
<i v-else class="fi fi-br-check" @click="editChek('brandSlogan')"></i>
</div>
</div>
<div class="compute" style="flex:1;text-align: right;" v-show="fall?.list?.length > 0">
<div class="compute" style="margin-left: auto;text-align: right;" v-show="fall?.list?.length > 0">
<!-- <div @click="setProgress(50)">123123123</div> -->
<div class="gallery_btn" @click="compute" :class="{'loading':!(schedule.num == 1||(schedule.num == 0 && !schedule.state))}">
{{$t('brandDNA.Compute')}}
@@ -546,6 +546,7 @@ export default defineComponent({
}
.gallery_btn{
&.loading{
width: min-content;
pointer-events: none;
color: #5F5F5F;
}

View File

@@ -6,7 +6,7 @@
<!-- <div class="icon" @click="toGmailLogin"> -->
<div class="icon">
<img src="@/assets/images/loginPage/gmailIcon.svg" alt="">
<span>{{ $props.text }}</span>
<span>{{ displayText }}</span>
</div>
</div>
</template>
@@ -21,7 +21,7 @@
props: {
text: {
type: String,
default: 'Sign in with Google'
default: ''
}
},
setup(props, { emit }) {
@@ -108,6 +108,9 @@
const toGmailLogin = ()=>{
message.info(t('account.canNotUtilize'))
}
const displayText = computed(() => {
return props.text || t('Login.LoginWithGoogle')
})
onBeforeUnmount(()=>{
var existingScript = document.querySelector(`script[src="${data.scriptSrc}"]`);
if(existingScript){
@@ -120,6 +123,7 @@
})
return {
toGmailLogin,
displayText,
}
},
})

View File

@@ -9,14 +9,14 @@
<div>
<div class="login_form_content" :state="emailStap">
<div v-show="emailStap === 1">
<div class="login_form_title marign_top30">Enterprise</div>
<div class="login_form_title marign_top30">{{ t('LoginEnterprise.Enterprise') }}</div>
<div class="generalModel_state">
<div
class="generalModel_state_item"
style="width: 100%; margin: 0"
>
<a-select
placeholder="Select a school"
:placeholder="t('LoginEnterprise.SelectEnterprise')"
v-model:value="selectEnterprise"
:options="schoolList"
@change="schoolListChange"
@@ -36,21 +36,21 @@
</a-select>
</div>
</div>
<div class="login_form_title marign_top30">Email</div>
<div class="login_form_title marign_top30">{{ t('LoginEnterprise.Email') }}</div>
<input
class="login_form_input"
placeholder="Enter your email address"
:placeholder="t('LoginEnterprise.EnterEmail')"
v-model="email"
@keydown.enter="submitPerLogin()"
/>
<div class="login_form_title marign_top30">
<div>Password</div>
<div>{{ t('LoginEnterprise.Password') }}</div>
</div>
<div class="password_input_block">
<input
class="login_form_input"
:type="passwordType"
placeholder="Enter your password"
:placeholder="t('LoginEnterprise.EnterPassword')"
v-model="password"
@keydown.enter="submitPerLogin()"
/>
@@ -79,15 +79,15 @@
</div> -->
<div class="email_last_step_bottom">
<div class="email_last_step_des">
<div class="sent_email_content">Enter Code</div>
<div class="sent_email_content">{{ t('LoginEnterprise.EnterCode') }}</div>
<div class="tip_content">
<span v-show="time">{{ time }}s</span>
<span v-show="!time" @click="emailNextStepFun()"
>Resend</span
>{{ t('LoginEnterprise.Resend') }}</span
>
</div>
</div>
<div class="codeEmail">Weve sent an code to your email <span>{{ email }}</span></div>
<div class="codeEmail">{{ t('LoginEnterprise.SentCodeToEmail') }} <span>{{ email }}</span></div>
<div class="codeEmailInput">
<VerificationCodeInput
:ct="emailCode"
@@ -103,10 +103,10 @@
<label :class="{ active: emailStap == 2 }">
<input :state="emailStap" type="checkbox" v-model="checked" />
<span>
I agree to the
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">Terms</a>,
<a href="https://aida.com.hk/privacy-policy.html" target="_blank" style="text-decoration: underline;color: #000;">Privacy Policy</a>,
and Fees.
{{ t('LoginEnterprise.AgreeTo') }}
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">{{ t('LoginEnterprise.Terms') }}</a>,
<a href="https://aida.com.hk/privacy-policy.html" target="_blank" style="text-decoration: underline;color: #000;">{{ t('LoginEnterprise.PrivacyPolicy') }}</a>,
{{ t('LoginEnterprise.AndFees') }}
</span>
</label>
</div>
@@ -125,7 +125,7 @@
:state="emailStap"
@click="submitPerLogin()"
>
Sign in
{{ t('LoginEnterprise.SignIn') }}
</div>
<!-- <div class="login_text">
@@ -151,14 +151,14 @@
>
<!-- <i class="fi fi-br-arrow-left"></i> -->
<i class="fi fi-br-angle-left"></i>
<span class="forget_password_content_title">Retrieve password</span>
<span class="forget_password_content_title">{{ t('LoginEnterprise.RetrievePassword') }}</span>
</div>
<div v-show="frogetPasswordStep === 1">
<div class="forget_passored_form_content">
<div class="forget_passored_form_title">Email</div>
<div class="forget_passored_form_title">{{ t('LoginEnterprise.Email') }}</div>
<input
class="forget_passored_form_input"
placeholder="Enter your email"
:placeholder="t('LoginEnterprise.EnterEmail')"
v-model="forgetPasswordEmail"
@keydown.enter="forgetPasswordNextStepFun()"
/>
@@ -167,20 +167,20 @@
class="forget_submit_button marign_top40"
@click="forgetPasswordNextStepFun()"
>
Next step
{{ t('LoginEnterprise.NextStep') }}
</div>
</div>
<div v-show="frogetPasswordStep === 2">
<div class="forget_verif_code_des">Verification Code</div>
<div class="forget_verif_code_des">{{ t('LoginEnterprise.VerificationCode') }}</div>
<div class="email_last_step_des">
<div class="sent_email_content">
Sent to {{ forgetPasswordEmail }}
{{ t('LoginEnterprise.SentTo') }} {{ forgetPasswordEmail }}
</div>
<div class="tip_content">
<span v-show="time">{{ time }}s</span>
<span v-show="!time" @click="forgetPasswordNextStepFun()"
>Resend</span
>{{ t('LoginEnterprise.Resend') }}</span
>
</div>
</div>
@@ -192,7 +192,7 @@
<div v-show="frogetPasswordStep === 3">
<div class="forget_passored_form_content">
<div class="forget_passored_form_title">Password</div>
<div class="forget_passored_form_title">{{ t('LoginEnterprise.Password') }}</div>
<div v-show="passwordConditionShow" class="conditionShow">
<div class="item">
<div class="icon">
@@ -205,7 +205,7 @@
class="fi fi-br-check"
></i>
</div>
<div class="text">At least 8 characters long</div>
<div class="text">{{ t('LoginEnterprise.AtLeast8Chars') }}</div>
</div>
<div class="item">
<div class="icon">
@@ -218,7 +218,7 @@
class="fi fi-br-check"
></i>
</div>
<div class="text">Must contain special characters</div>
<div class="text">{{ t('LoginEnterprise.MustContainSpecial') }}</div>
</div>
<div class="item">
<div class="icon">
@@ -232,13 +232,13 @@
></i>
</div>
<div class="text">
Mix of uppercase, lowercase and numbers
{{ t('LoginEnterprise.MixUpperLowerNumbers') }}
</div>
</div>
</div>
<input
class="forget_passored_form_input"
placeholder="Enter a new password"
:placeholder="t('LoginEnterprise.EnterNewPassword')"
v-model="newPassword"
@focus="() => (passwordConditionShow = true)"
@blur="() => (passwordConditionShow = false)"
@@ -250,7 +250,7 @@
class="forget_submit_button marign_top40"
@click="submitResetPassword()"
>
Submit
{{ t('LoginEnterprise.Submit') }}
</div>
</div>
</div>
@@ -263,7 +263,7 @@
</template>
<script lang="ts">
import { defineComponent, ref, onMounted, reactive, toRefs } from "vue";
import { defineComponent, ref, onMounted, reactive, toRefs, inject } from "vue";
import { Https } from "@/tool/https";
import { isEmail } from "@/tool/util";
import { setCookie, WriteCookie } from "@/tool/cookie";
@@ -273,7 +273,6 @@ import googleLogin from "@/component/LoginPage/googleLogin.vue";
import weiXinLogin from "@/component/LoginPage/weiXinLogin.vue";
import phoneLogin from "@/component/LoginPage/phoneLogin.vue";
import { useStore } from "vuex";
import { useI18n } from "vue-i18n";
import { setLang } from "@/tool/guide";
import md5 from "md5";
export default defineComponent({
@@ -285,7 +284,8 @@ export default defineComponent({
},
setup() {
let timer: any = 0;
const { locale } = useI18n();
// 从父组件注入 i18n
const i18n = inject('i18n') as { t: any, locale: any };
const store = useStore();
let loadingShow = ref(false);
const data = reactive({
@@ -320,7 +320,8 @@ export default defineComponent({
...toRefs(data),
store,
timer,
locale,
locale: i18n?.locale,
t: i18n?.t,
loadingShow,
schoolListChange,
filterOption,
@@ -383,7 +384,7 @@ export default defineComponent({
//邮箱登录的下一步
emailNextStepFun() {
if (!isEmail(this.email)) {
message.info("The email format is incorrect");
message.info(this.t('LoginEnterprise.IncorrectEmailFormat'));
return;
}
let data = {
@@ -413,7 +414,7 @@ export default defineComponent({
//忘记密码的下一步
forgetPasswordNextStepFun() {
if (!isEmail(this.forgetPasswordEmail)) {
message.info("The email format is incorrect");
message.info(this.t('LoginEnterprise.IncorrectEmail'));
return;
}
let data = {
@@ -468,26 +469,26 @@ export default defineComponent({
return;
} else {
if (!this.password) {
message.info("Please enter your account number or password");
message.info(this.t('LoginEnterprise.PleaseEnterYourAccountNumberOrPassword'));
return;
}
//输入邮箱
if (!this.email) {
message.info("Please enter your email address");
message.info(this.t('LoginEnterprise.NeedEmail'));
return;
}
if (!this.selectEnterprise) {
message.info("Please select a school");
message.info(this.t('LoginEnterprise.SelectEnterprise'));
return;
}
//判断邮箱格式是否正确
if (!isEmail(this.email)) {
message.info("The email format is incorrect");
message.info(this.t('LoginEnterprise.IncorrectEmailFormat'));
return;
}
//判断是否同意隐私政策
if (!this.checked) {
message.info("Agree to all terms, privacy fees and policies");
message.info(this.t('Login.AgreePolicies'));
return;
}
let data = {
@@ -547,7 +548,7 @@ export default defineComponent({
});
},
isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies");
message.info(this.t('Login.AgreePolicies'));
},
//谷歌登录
@@ -584,7 +585,7 @@ export default defineComponent({
if (window.innerWidth < 768) {
message.info(
"If you need to design, please log in using an iPad or computer."
this.t('Login.Device')
);
this.turnToHomePage("/Square");
} else {
@@ -613,7 +614,7 @@ export default defineComponent({
//修改密码提交
submitResetPassword() {
if (this.isPassword(this.newPassword) < 3) {
message.info("You must satisfy ALL password conditions to register.");
message.info(this.t('Login.PasswordConditions'));
return;
}
let data = {

View File

@@ -14,21 +14,21 @@
v-model="username"
/> -->
<div v-show="emailStap === 1">
<div class="login_form_title marign_top30">Email</div>
<div class="login_form_title marign_top30">{{ t('LoginPersonal.Email') }}</div>
<input
class="login_form_input"
placeholder="Enter your email address"
:placeholder="t('LoginPersonal.EnterEmail')"
v-model="email"
@keydown.enter="submitPerLogin()"
/>
<div class="login_form_title marign_top30">
<div>Password</div>
<div>{{ t('LoginPersonal.Password') }}</div>
</div>
<div class="password_input_block">
<input
class="login_form_input"
:type="passwordType"
placeholder="Enter your password"
:placeholder="t('LoginPersonal.EnterPassword')"
v-model="password"
@keydown.enter="submitPerLogin()"
/>
@@ -57,15 +57,15 @@
</div> -->
<div class="email_last_step_bottom">
<div class="email_last_step_des">
<div class="sent_email_content">Enter Code</div>
<div class="sent_email_content">{{ t('LoginPersonal.EnterCode') }}</div>
<div class="tip_content">
<span v-show="time">{{ time }}s</span>
<span v-show="!time" @click="emailNextStepFun()"
>Resend</span
>{{ t('LoginPersonal.Resend') }}</span
>
</div>
</div>
<div class="codeEmail">Weve sent an code to your email <span>{{ email }}</span></div>
<div class="codeEmail">{{ t('LoginPersonal.SentCodeToEmail') }} <span>{{ email }}</span></div>
<div class="codeEmailInput">
<VerificationCodeInput
ref="verificationCodeInputDom"
@@ -80,17 +80,17 @@
<div class="login_text" v-show="emailStap !== 2">
<div class="forget_password_text" @click="changeIsLogin(2)">
Forgot your password
{{ t('LoginPersonal.ForgotPassword') }}
</div>
</div>
<div class="login_form_title marign_top40">
<label :class="{ active: emailStap == 2 }">
<input :state="emailStap" type="checkbox" v-model="checked" />
<span>
I agree to the
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">Terms</a>,
<a href="https://aida.com.hk/privacy-policy.html" target="_blank" style="text-decoration: underline;color: #000;">Privacy Policy</a>,
and Fees.
{{ t('LoginPersonal.AgreeTo') }}
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">{{ t('LoginPersonal.Terms') }}</a>,
<a href="https://aida.com.hk/privacy-policy.html" target="_blank" style="text-decoration: underline;color: #000;">{{ t('LoginPersonal.PrivacyPolicy') }}</a>,
{{ t('LoginPersonal.AndFees') }}
</span>
</label>
</div>
@@ -102,12 +102,12 @@
@click="submitPerLogin()"
@mousedown="loginBtnMousedown"
>
Sign in
{{ t('LoginPersonal.SignIn') }}
</div>
<div class="NewAccount" @click="newAccount()">Create New Account</div>
<div class="NewAccount" @click="newAccount()">{{ t('LoginPersonal.CreateNewAccount') }}</div>
<div class="segmentation">
<div class="wire"></div>
<div class="text">or</div>
<div class="text">{{ t('LoginPersonal.Or') }}</div>
<div class="wire"></div>
</div>
<div class="thirdPartyLogin marign_top30">
@@ -147,14 +147,14 @@
> -->
<!-- <i class="fi fi-br-arrow-left"></i> -->
<i class="fi fi-br-angle-left"></i>
<span class="forget_password_content_title">Retrieve password</span>
<span class="forget_password_content_title">{{ t('LoginPersonal.RetrievePassword') }}</span>
</div>
<div v-show="frogetPasswordStep === 1">
<div class="forget_passored_form_content">
<div class="forget_passored_form_title">Email</div>
<div class="forget_passored_form_title">{{ t('LoginPersonal.Email') }}</div>
<input
class="forget_passored_form_input"
placeholder="Enter your email"
:placeholder="t('LoginPersonal.EnterEmail')"
v-model="forgetPasswordEmail"
@keydown.enter="forgetPasswordNextStepFun()"
/>
@@ -163,20 +163,20 @@
class="forget_submit_button marign_top40"
@click="forgetPasswordNextStepFun()"
>
Next step
{{ t('LoginPersonal.NextStep') }}
</div>
</div>
<div v-show="frogetPasswordStep === 2">
<div class="forget_verif_code_des">Verification Code</div>
<div class="forget_verif_code_des">{{ t('LoginPersonal.VerificationCode') }}</div>
<div class="email_last_step_des">
<div class="sent_email_content">
Sent to {{ forgetPasswordEmail }}
{{ t('LoginPersonal.SentTo') }} {{ forgetPasswordEmail }}
</div>
<div class="tip_content">
<span v-show="time">{{ time }}s</span>
<span v-show="!time" @click="forgetPasswordNextStepFun()"
>Resend</span
>{{ t('LoginPersonal.Resend') }}</span
>
</div>
</div>
@@ -188,7 +188,7 @@
<div v-show="frogetPasswordStep === 3">
<div class="forget_passored_form_content">
<div class="forget_passored_form_title">Password</div>
<div class="forget_passored_form_title">{{ t('LoginPersonal.Password') }}</div>
<div v-show="passwordConditionShow" class="conditionShow">
<div class="item">
<div class="icon">
@@ -201,7 +201,7 @@
class="fi fi-br-check"
></i>
</div>
<div class="text">At least 8 characters long</div>
<div class="text">{{ t('LoginPersonal.AtLeast8Chars') }}</div>
</div>
<div class="item">
<div class="icon">
@@ -214,7 +214,7 @@
class="fi fi-br-check"
></i>
</div>
<div class="text">Must contain special characters</div>
<div class="text">{{ t('LoginPersonal.MustContainSpecial') }}</div>
</div>
<div class="item">
<div class="icon">
@@ -228,13 +228,13 @@
></i>
</div>
<div class="text">
Mix of uppercase, lowercase and numbers
{{ t('LoginPersonal.MixUpperLowerNumbers') }}
</div>
</div>
</div>
<input
class="forget_passored_form_input"
placeholder="Enter a new password"
:placeholder="t('LoginPersonal.EnterNewPassword')"
v-model="newPassword"
@focus="() => (passwordConditionShow = true)"
@blur="() => (passwordConditionShow = false)"
@@ -246,7 +246,7 @@
class="forget_submit_button marign_top40"
@click="submitResetPassword()"
>
Submit
{{ t('LoginPersonal.Submit') }}
</div>
</div>
</div>
@@ -290,7 +290,7 @@
</template>
<script lang="ts">
import { defineComponent, ref, onMounted } from "vue";
import { defineComponent, ref, onMounted, inject } from "vue";
import { Https } from "@/tool/https";
import { isEmail } from "@/tool/util";
import { setCookie, WriteCookie } from "@/tool/cookie";
@@ -300,11 +300,9 @@ import googleLogin from "@/component/LoginPage/googleLogin.vue";
import weiXinLogin from "@/component/LoginPage/weiXinLogin.vue";
import phoneLogin from "@/component/LoginPage/phoneLogin.vue";
import { useStore } from "vuex";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
import { setLang } from "@/tool/guide";
import md5 from "md5";
import router from "@/router";
import { pass } from "three/tsl";
export default defineComponent({
components: {
VerificationCodeInput,
@@ -316,17 +314,18 @@ export default defineComponent({
let timer: any = 0;
let router = useRouter()
const { locale } = useI18n();
// 从父组件注入 i18n
const i18n = inject('i18n') as { t: any, locale: any };
const store = useStore();
let loadingShow = ref(false);
const newAccount = ()=>{
// router.spuh({path:'/register'})
router.push({path:'/register'})
}
return {
store,
timer,
locale,
locale: i18n?.locale,
t: i18n?.t,
loadingShow,
newAccount,
};
@@ -389,7 +388,7 @@ export default defineComponent({
//邮箱登录的下一步
emailNextStepFun() {
if (!isEmail(this.email)) {
message.info("The email format is incorrect");
message.info(this.$t('LoginPersonal.IncorrectEmailFormat'));
return;
}
let data = {
@@ -419,7 +418,7 @@ export default defineComponent({
//忘记密码的下一步
forgetPasswordNextStepFun() {
if (!isEmail(this.forgetPasswordEmail)) {
message.info("The email format is incorrect");
message.info(this.t('LoginPersonal.IncorrectEmail'));
return;
}
let data = {
@@ -473,7 +472,7 @@ export default defineComponent({
let verificationCodeInputDom:any = this.$refs.verificationCodeInputDom
let code = verificationCodeInputDom.getCtData.map(item => item).join('');
if(code.length !== this.emailCode.length){
message.info("Please enter the complete verification code.");
message.info(this.t('LoginPersonal.CompleteVerificationCode'));
}else{
this.submitEmailLogin(code)
}
@@ -482,22 +481,22 @@ export default defineComponent({
return;
} else {
if (!this.password) {
message.info("Please enter your account number or password");
message.info(this.t('LoginPersonal.PleaseEnterYourAccountNumberOrPassword'));
return;
}
//输入邮箱
if (!this.email) {
message.info("Please enter your email address");
message.info(this.t('LoginPersonal.NeedEmail'));
return;
}
//判断邮箱格式是否正确
if (!isEmail(this.email)) {
message.info("The email format is incorrect");
message.info(this.t('LoginPersonal.IncorrectEmailFormat'));
return;
}
//判断是否同意隐私政策
if (!this.checked) {
message.info("Agree to all terms, privacy fees and policies");
message.info(this.t('Login.AgreePolicies'));
return;
}
let data = {
@@ -554,18 +553,19 @@ export default defineComponent({
loginType: "EMAIL",
userId: this.userId,
};
this.$emit('update:isMask',true)
this.store.commit('set_loading', true)
Https.axiosPost(Https.httpUrls.accountLogin, data)
.then((rv: any) => {
this.setSuccessLogin(rv);
this.store.commit('set_loading', false)
})
.catch((res) => {
this.$emit('update:isMask',false)
this.store.commit('set_loading', false)
});
},1000)
},
isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies");
message.info(this.t('Login.AgreePolicies'));
},
//谷歌登录
googelLogin(value: any) {
@@ -601,7 +601,7 @@ export default defineComponent({
if (window.innerWidth < 768) {
message.info(
"If you need to design, please log in using an iPad or computer."
this.t('Login.Device')
);
this.turnToHomePage("/Square");
} else {
@@ -630,7 +630,7 @@ export default defineComponent({
//修改密码提交
submitResetPassword() {
if (this.isPassword(this.newPassword) < 3) {
message.info("You must satisfy ALL password conditions to register.");
message.info(this.t('Login.PasswordConditions'));
return;
}
let data = {

View File

@@ -9,14 +9,14 @@
<div>
<div class="login_form_content" :state="emailStap">
<div v-show="emailStap === 1">
<div class="login_form_title marign_top30">School</div>
<div class="login_form_title marign_top30">{{ t('LoginSchool.School') }}</div>
<div class="generalModel_state">
<div
class="generalModel_state_item"
style="width: 100%; margin: 0"
>
<a-select
placeholder="Select a school"
:placeholder="t('LoginSchool.SelectSchool')"
v-model:value="selectSchool"
:options="schoolList"
@change="schoolListChange"
@@ -36,21 +36,21 @@
</a-select>
</div>
</div>
<div class="login_form_title marign_top30">Email</div>
<div class="login_form_title marign_top30">{{ t('LoginSchool.Email') }}</div>
<input
class="login_form_input"
placeholder="Enter your email address"
:placeholder="t('LoginSchool.EnterEmail')"
v-model="email"
@keydown.enter="submitPerLogin()"
/>
<div class="login_form_title marign_top30">
<div>Password</div>
<div>{{ t('LoginSchool.Password') }}</div>
</div>
<div class="password_input_block">
<input
class="login_form_input"
:type="passwordType"
placeholder="Enter your password"
:placeholder="t('LoginSchool.EnterPassword')"
v-model="password"
@keydown.enter="submitPerLogin()"
/>
@@ -79,15 +79,15 @@
</div> -->
<div class="email_last_step_bottom">
<div class="email_last_step_des">
<div class="sent_email_content">Enter Code</div>
<div class="sent_email_content">{{ t('LoginSchool.EnterCode') }}</div>
<div class="tip_content">
<span v-show="time">{{ time }}s</span>
<span v-show="!time" @click="emailNextStepFun()"
>Resend</span
>{{ t('LoginSchool.Resend') }}</span
>
</div>
</div>
<div class="codeEmail">Weve sent an code to your email <span>{{ email }}</span></div>
<div class="codeEmail">{{ t('LoginSchool.SentCodeToEmail') }} <span>{{ email }}</span></div>
<div class="codeEmailInput">
<VerificationCodeInput
ref="verificationCodeInputDom"
@@ -101,17 +101,17 @@
</div>
<div class="login_text" v-show="emailStap !== 2">
<div class="forget_password_text" @click="changeIsLogin(2)">
Forgot your password
{{ t('LoginSchool.ForgotPassword') }}
</div>
</div>
<div class="login_form_title marign_top30">
<label :class="{ active: emailStap == 2 }">
<input :state="emailStap" type="checkbox" v-model="checked" />
<span>
I agree to the
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">Terms</a>,
<a href="https://aida.com.hk/privacy-policy.html" target="_blank" style="text-decoration: underline;color: #000;">Privacy Policy</a>,
and Fees.
{{ t('LoginSchool.AgreeTo') }}
<a href="https://code-create.com.hk/aida-terms-and-conditions/" style="text-decoration: underline;color: #000;">{{ t('LoginSchool.Terms') }}</a>,
<a href="https://aida.com.hk/privacy-policy.html" target="_blank" style="text-decoration: underline;color: #000;">{{ t('LoginSchool.PrivacyPolicy') }}</a>,
{{ t('LoginSchool.AndFees') }}
</span>
</label>
</div>
@@ -132,7 +132,7 @@
@click="submitPerLogin()"
@mousedown="loginBtnMousedown"
>
Sign in
{{ t('LoginSchool.SignIn') }}
</div>
<!-- <div class="login_text">
@@ -158,14 +158,14 @@
>
<!-- <i class="fi fi-br-arrow-left"></i> -->
<i class="fi fi-br-angle-left"></i>
<span class="forget_password_content_title">Retrieve password</span>
<span class="forget_password_content_title">{{ t('LoginSchool.RetrievePassword') }}</span>
</div>
<div v-show="frogetPasswordStep === 1">
<div class="forget_passored_form_content">
<div class="forget_passored_form_title">Email</div>
<div class="forget_passored_form_title">{{ t('LoginSchool.Email') }}</div>
<input
class="forget_passored_form_input"
placeholder="Enter your email"
:placeholder="t('LoginSchool.EnterEmail')"
v-model="forgetPasswordEmail"
@keydown.enter="forgetPasswordNextStepFun()"
/>
@@ -174,20 +174,20 @@
class="forget_submit_button marign_top40"
@click="forgetPasswordNextStepFun()"
>
Next step
{{ t('LoginSchool.NextStep') }}
</div>
</div>
<div v-show="frogetPasswordStep === 2">
<div class="forget_verif_code_des">Verification Code</div>
<div class="forget_verif_code_des">{{ t('LoginSchool.VerificationCode') }}</div>
<div class="email_last_step_des">
<div class="sent_email_content">
Sent to {{ forgetPasswordEmail }}
{{ t('LoginSchool.SentTo') }} {{ forgetPasswordEmail }}
</div>
<div class="tip_content">
<span v-show="time">{{ time }}s</span>
<span v-show="!time" @click="forgetPasswordNextStepFun()"
>Resend</span
>{{ t('LoginSchool.Resend') }}</span
>
</div>
</div>
@@ -199,7 +199,7 @@
<div v-show="frogetPasswordStep === 3">
<div class="forget_passored_form_content">
<div class="forget_passored_form_title">Password</div>
<div class="forget_passored_form_title">{{ t('LoginSchool.Password') }}</div>
<div v-show="passwordConditionShow" class="conditionShow">
<div class="item">
<div class="icon">
@@ -212,7 +212,7 @@
class="fi fi-br-check"
></i>
</div>
<div class="text">At least 8 characters long</div>
<div class="text">{{ t('LoginSchool.AtLeast8Chars') }}</div>
</div>
<div class="item">
<div class="icon">
@@ -225,7 +225,7 @@
class="fi fi-br-check"
></i>
</div>
<div class="text">Must contain special characters</div>
<div class="text">{{ t('LoginSchool.MustContainSpecial') }}</div>
</div>
<div class="item">
<div class="icon">
@@ -239,13 +239,13 @@
></i>
</div>
<div class="text">
Mix of uppercase, lowercase and numbers
{{ t('LoginSchool.MixUpperLowerNumbers') }}
</div>
</div>
</div>
<input
class="forget_passored_form_input"
placeholder="Enter a new password"
:placeholder="t('LoginSchool.EnterNewPassword')"
v-model="newPassword"
@focus="() => (passwordConditionShow = true)"
@blur="() => (passwordConditionShow = false)"
@@ -257,7 +257,7 @@
class="forget_submit_button marign_top40"
@click="submitResetPassword()"
>
Submit
{{ t('LoginSchool.Submit') }}
</div>
</div>
</div>
@@ -270,7 +270,7 @@
</template>
<script lang="ts">
import { defineComponent, ref, onMounted, reactive, toRefs } from "vue";
import { defineComponent, ref, onMounted, reactive, toRefs, inject } from "vue";
import { Https } from "@/tool/https";
import { isEmail } from "@/tool/util";
import { setCookie, WriteCookie } from "@/tool/cookie";
@@ -280,7 +280,6 @@ import googleLogin from "@/component/LoginPage/googleLogin.vue";
import weiXinLogin from "@/component/LoginPage/weiXinLogin.vue";
import phoneLogin from "@/component/LoginPage/phoneLogin.vue";
import { useStore } from "vuex";
import { useI18n } from "vue-i18n";
import { setLang } from "@/tool/guide";
import md5 from "md5";
export default defineComponent({
@@ -292,7 +291,8 @@ export default defineComponent({
},
setup() {
let timer: any = 0;
const { locale } = useI18n();
// 从父组件注入 i18n
const i18n = inject('i18n') as { t: any, locale: any };
const store = useStore();
let loadingShow = ref(false);
const data = reactive({
@@ -331,7 +331,8 @@ export default defineComponent({
...toRefs(data),
store,
timer,
locale,
locale: i18n?.locale,
t: i18n?.t,
loadingShow,
schoolListChange,
filterOption,
@@ -396,7 +397,7 @@ export default defineComponent({
//邮箱登录的下一步
emailNextStepFun() {
if (!isEmail(this.email)) {
message.info("The email format is incorrect");
message.info(this.t('LoginSchool.IncorrectEmailFormat'));
return;
}
let data = {
@@ -426,7 +427,7 @@ export default defineComponent({
//忘记密码的下一步
forgetPasswordNextStepFun() {
if (!isEmail(this.forgetPasswordEmail)) {
message.info("The email format is incorrect");
message.info(this.t('LoginSchool.IncorrectEmail'));
return;
}
let data = {
@@ -482,7 +483,7 @@ export default defineComponent({
let code = verificationCodeInputDom.getCtData.map(item => item).join('');
console.log(code)
if(code.length !== this.emailCode.length){
message.info("Please enter the complete verification code.");
message.info(this.t('LoginSchool.CompleteVerificationCode'));
}else{
this.submitEmailLogin(code)
}
@@ -491,26 +492,26 @@ export default defineComponent({
return;
} else {
if (!this.password) {
message.info("Please enter your account number or password");
message.info(this.t('LoginSchool.PleaseEnterYourAccountNumberOrPassword'));
return;
}
//输入邮箱
if (!this.email) {
message.info("Please enter your email address");
message.info(this.t('LoginSchool.NeedEmail'));
return;
}
if (!this.selectSchool) {
message.info("Please select a school");
message.info(this.t('LoginSchool.SelectSchool'));
return;
}
//判断邮箱格式是否正确
if (!isEmail(this.email)) {
message.info("The email format is incorrect");
message.info(this.t('LoginSchool.IncorrectEmailFormat'));
return;
}
//判断是否同意隐私政策
if (!this.checked) {
message.info("Agree to all terms, privacy fees and policies");
message.info(this.t('Login.AgreePolicies'));
return;
}
let data = {
@@ -576,7 +577,7 @@ export default defineComponent({
},1000)
},
isCheckAgreement() {
message.info("Agree to all terms, privacy fees and policies");
message.info(this.t('Login.AgreePolicies'));
},
//谷歌登录
googelLogin(value: any) {
@@ -612,7 +613,7 @@ export default defineComponent({
if (window.innerWidth < 768) {
message.info(
"If you need to design, please log in using an iPad or computer."
this.t('Login.Device')
);
this.turnToHomePage("/Square");
} else {
@@ -641,7 +642,7 @@ export default defineComponent({
//修改密码提交
submitResetPassword() {
if (this.isPassword(this.newPassword) < 3) {
message.info("You must satisfy ALL password conditions to register.");
message.info(this.t('Login.PasswordConditions'));
return;
}
let data = {

View File

@@ -62,10 +62,8 @@
},
methods: {
onInput(val, index) {
console.log("input", val, index);
clearTimeout(this.timeout);
this.timeout = setTimeout(() => {
console.log("input=>", val, index);
// val = val.replace(/[^0-9]/g, '');
val = String(val).replace(/\D/g, "");
this.getCtData[index] = val;

View File

@@ -2,7 +2,7 @@
<div class="Container">
<div class="icon" @click="openWeiXinModel">
<img src="@/assets/images/loginPage/weiXinIcon.svg" alt="" />
<span>{{ $props.text }}</span>
<span>{{ displayText }}</span>
</div>
<weiXinModel ref="weiXinModel"></weiXinModel>
</div>
@@ -18,6 +18,7 @@ import {
toRefs,
} from "vue";
import weiXinModel from "./weiXinModel.vue";
import { useI18n } from 'vue-i18n'
export default defineComponent({
name: "login",
components: {
@@ -26,20 +27,25 @@ export default defineComponent({
props: {
text: {
type: String,
default: "Sign in with Wechat",
default: ''
},
},
setup() {
setup(props) {
let weiXinDom = reactive({
weiXinModel: null,
});
const { t } = useI18n()
const openWeiXinModel = () => {
weiXinDom.weiXinModel.init();
};
const displayText = computed(() => {
return props.text || t('Login.LoginWithWechat')
})
onMounted(() => {});
return {
...toRefs(weiXinDom),
openWeiXinModel,
displayText,
};
},
});

View File

@@ -113,8 +113,8 @@
<img v-for="item in scaleImageData?.designPythonOutfitList" v-lazy="item.designUrl">
</div>
</div>
<div v-if="userDetail.systemList.indexOf(1) > -1 && scaleImageData.isMine != 1 && scaleImageData.selected != 1 && scaleImageData.openSource != 0" class="started_btn" @click="setChoose" >{{$t('newScaleImage.SecondaryCreation')}}</div>
<!-- <div v-if="systemUser.value == 1 && scaleImageData.isMine != 1 && scaleImageData.selected != 1" class="started_btn" @click="setChoose" :title="systemUser.value != 1?$t('newScaleImage.jsContent1'): scaleImageData.openSource == 0?$t('newScaleImage.jsContent2'):''" :class="{active:systemUser.value != 1?true:scaleImageData.openSource == 0}">{{$t('newScaleImage.SecondaryCreation')}}</div> -->
<!-- <div v-if="userDetail.systemList.indexOf(1) > -1 && scaleImageData.isMine != 1 && scaleImageData.selected != 1 && scaleImageData.openSource != 0" class="started_btn" @click="setChoose" >{{$t('newScaleImage.SecondaryCreation')}}</div> -->
<div v-if="userDetail.systemList.indexOf(1) > -1 && scaleImageData.openSource != 0" class="started_btn" @click="setChoose" >{{$t('newScaleImage.SecondaryCreation')}}</div>
</div>
<div v-else class="newScaleImage_right_content_generate">
<div class="scaleImage_chunk_item content_left_generate_item">
@@ -437,26 +437,37 @@ export default defineComponent({
})
}
let setChoose = async () =>{
let flag = true
let setChoose = async()=>{
if(!flag) return
flag = false
try {
if(userDetail.value.systemList.indexOf(1) == -1){
return message.info(t('newScaleImage.jsContent1'))
message.info(t('newScaleImage.jsContent1'))
return
}
const targetDate = new Date('2025-09-01T00:00:00');
// 解析输入日期字符串
const inputDate = new Date(imgData.scaleImageData.createDate);
if(inputDate < targetDate){
return message.info(t('newScaleImage.jsContent2'))
message.info(t('newScaleImage.jsContent2'))
return
}
if(imgData.scaleImageData.openSource == 0){
return message.info(t('newScaleImage.jsContent2'))
message.info(t('newScaleImage.jsContent2'))
return
}
store.state.Workspace.cachedRoutes = [];
let id = await getWorks(imgData.scaleImageData.id)
router.push(`/home/history/${id}`)
// router.push({name:'home',params: {id:imgData.scaleImageData.id,type:'Works'}})
await router.push(`/home/history/${id}`)
store.commit('setChooseIsDesign',false)
// router.push({name:'homePage',params: {id:imgData.scaleImageData.userLikeGroupSourceId,type:'Works'}})
} finally {
// 函数执行完成后恢复为 true确保无论成功还是失败都能再次点击
flag = true
}
}
let setCommentReply = (value:any,str:any)=>{
imgData.commentReply.leve1Id = value.id
imgData.commentReply.leve2Id = null

View File

@@ -132,8 +132,8 @@
</div>
<div class="modal_img_max">
<div v-if="!modalImg[0]?.id" class="modal_img" id="modal_img" :class="{active:flex_direction}">
<div v-for="item,index in layoutList" :class="[moodb_className[index]]" class="modal_imgItem">
<img :src="item.imgUrl" v-modelImg>
<!-- <div class="modal_img" id="modal_img" :class="{active:flex_direction}"> -->
<div v-for="item,index in layoutList" :class="[moodb_className[index]]" :style="{'background-image':`url(${item.imgUrl})`}" class="modal_imgItem">
</div>
</div>
<div v-else class="modal_img">
@@ -244,30 +244,6 @@ export default defineComponent({
this.token = getCookie("token") || "";
this.uploadUrl = getUploadUrl();
},
directives:{
modelImg:{
mounted(el) {
let parentNode = el.parentNode
if(parentNode.offsetHeight >= parentNode.offsetWidth){
el.style.height = 100+'%'
el.style.width = 'auto'
}else{
el.style.width = 100+'%'
el.style.height = 'auto'
}
},
updated (el) {
let parentNode = el.parentNode
if(parentNode.offsetHeight >= parentNode.offsetWidth){
el.style.height = 100+'%'
el.style.width = 'auto'
}else{
el.style.width = 100+'%'
el.style.height = 'auto'
}
}
}
},
methods: {
open(num: Number) {
this.openClick = num;
@@ -445,7 +421,7 @@ export default defineComponent({
}
}
this.edieShow = true
if(this.moodb_[arr.length-1].length == 2){
if(this.moodb_[arr.length-1].length == 1){
this.moodb_className = this.moodb_[arr.length-1][0]
}else{
this.moodb_className = this.moodb_[arr.length-1][random]
@@ -628,6 +604,7 @@ export default defineComponent({
height: calc(5rem*1.2);
overflow-x: hidden;
display: flex;
&.modal_img::-webkit-scrollbar {
display: none;
}
@@ -706,15 +683,9 @@ export default defineComponent({
position: relative;
overflow: hidden;
text-align: center;
img{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
float: left;
user-select:none;
-webkit-user-drag: none;
}
background-repeat: no-repeat;
background-position: center;
background-size: cover;
}
.wh1{
width: 23%;

View File

@@ -155,7 +155,7 @@
<textarea
ref="textareaRef"
class="textarea"
:placeholder="$t('Generate.inputContent1')"
:placeholder="inputPlaceholder"
@input="ifMaximumLength"
@keydown.enter.prevent="getPrductimg()"
v-model="productimgSearchName"
@@ -242,7 +242,16 @@
</div>
</div>
<div class="prompt-input-container" v-show="!showMotion">
<div class="title">{{ $t('ProductImg.Prompt') }}</div>
<div class="title">
<span>{{ $t('ProductImg.Prompt') }}</span>
<SvgIcon
class="cursor-icon"
@click="handleNavigateHelp"
name="CHelpFlip"
size="18"
color="#000"
/>
</div>
<promptInput :content="prompt" ref="promptInputRef" />
</div>
<div class="transferPose" v-show="showMotion">
@@ -379,7 +388,10 @@
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
<Prompt v-model:showModal="showPromptAssist" isDesignPage />
<template>
<Prompt v-if="scaleImageList[scaleImageIndex]?.resultType === 'ToProductImage'" v-model:showModal="showPromptAssist" />
<PromptEditProduct v-if="scaleImageList[scaleImageIndex]?.resultType === 'Relight'" v-model:showModal="showPromptAssist" />
</template>
<Product
v-model:showModal="showProductList"
:frameList="fullProductImages"
@@ -399,6 +411,7 @@ import {
createVNode,
reactive,
computed,
watch,
useTemplateRef
} from 'vue'
import { Https } from '@/tool/https'
@@ -410,13 +423,14 @@ import { useStore } from 'vuex'
import Prompt from '@/component/home/tools/toProduct/Prompt.vue'
import promptInput from '@/component/home/tools/poseTransfer/promptInput.vue'
import Product from '@/component/home/tools/poseTransfer/Product.vue'
import PromptEditProduct from '@/component/home/tools/toProduct/PromptEditProduct.vue'
import {
getFirstFrame,
getFirstAndLastFrame
} from '@/component/home/tools/poseTransfer/prompt'
export default defineComponent({
components: { Prompt, promptInput, Product },
components: { Prompt, promptInput, Product, PromptEditProduct },
props: {
productData: {
type: Object,
@@ -445,7 +459,7 @@ export default defineComponent({
let userDetail: any = computed(() => {
return store.state.UserHabit.userDetail
})
let { t } = useI18n()
let { t, locale } = useI18n()
const textareaRef = useTemplateRef<HTMLTextAreaElement>('textareaRef')
const videoType = ref(2)
const showMotion = computed(() => videoType.value === 1)
@@ -494,10 +508,12 @@ export default defineComponent({
})
const showDropdown = computed(() => {
if (isPoseTransfer) {
if (isPoseTransfer.value) {
return videoType.value === 1
} else {
return scaleImageList[scaleImageIndex]?.resultType != 'Relight'
return (
productimg.scaleImageList[productimg.scaleImageIndex]?.resultType !== 'Relight'
)
}
})
let speed = reactive({
@@ -546,12 +562,22 @@ export default defineComponent({
document.removeEventListener('click', openSpeed)
}
}
const resetSpeedState = () => {
if (!speed.speedState) return
speed.speedState = false
document.removeEventListener('click', openSpeed)
}
const setSpeed = (item: any) => {
speed.speedData = item
document.removeEventListener('click', openSpeed)
speed.speedState = false
}
let scaleImage: any = ref(false)
watch(scaleImage, value => {
if (!value) {
resetSpeedState()
}
})
let loadingShow = ref(false)
let isComparison = ref(false) // home/design组件中修改的,当前组件没有修改
const visible = ref<boolean>(false)
@@ -582,13 +608,13 @@ export default defineComponent({
})
const showPromptAssist = ref(false)
const handleClickAssistBtn = () => {
const { httpType } = store.state.Workspace.probjects
const isSingleDesign = httpType === 'SINGLE_DESIGN'
if (!isSingleDesign) {
const promptText = t('ProductImg.Series')
productimg.productimgSearchName = promptText
return
}
// const { httpType } = store.state.Workspace.probjects
// const isSingleDesign = httpType === 'SINGLE_DESIGN'
// if (!isSingleDesign) {
// const promptText = t('ProductImg.Series')
// productimg.productimgSearchName = promptText
// return
// }
showPromptAssist.value = true
}
@@ -1275,6 +1301,15 @@ export default defineComponent({
'PoseTransfer'
)
})
const inputPlaceholder = computed(() => {
if (
productimg.scaleImageList[productimg.scaleImageIndex]?.resultType === 'Relight'
) {
return t('ProductImg.relightInput')
} else {
return t('ProductImg.productInput')
}
})
const showCompare = computed(() => {
// isComparison.value
@@ -1284,12 +1319,19 @@ export default defineComponent({
return videoType.value === 3 ? false : true
}
})
const handleNavigateHelp = () => {
const url =
locale === 'CHINESE_SIMPLIFIED'
? 'https://aida-user-manual-chinese.super.site/2b08f755cedd80a985cffdf2af80c538'
: 'https://aida-user-manual.super.site/advanced-tool/animated-product-image/to-product-video-prompt-assist '
window.open(url,'_blank')
}
onBeforeUnmount(() => {
clearInterval(prductimgTime)
clearInterval(remPrductimgTime)
productimg.productimgIsProductimg = false
productimg.productimgRemProductimg = false
resetSpeedState()
})
return {
t,
@@ -1346,7 +1388,9 @@ export default defineComponent({
setNewVideoRef,
handlePlayNewVideo,
isNewVideoPlaying,
showDropdown
showDropdown,
inputPlaceholder,
handleNavigateHelp
}
},
data() {
@@ -1759,10 +1803,14 @@ export default defineComponent({
box-sizing: border-box;
}
.title {
font-weight: 500;
color: #000;
font-size: 1.7rem;
margin-bottom: 1.4rem;
display: flex;
align-items: center;
column-gap: 1rem;
.cursor-icon {
display: flex;
width: auto;
cursor: pointer;
}
}
}
.prompt-container {

View File

@@ -682,6 +682,7 @@ export default defineComponent({
store.commit("cancelDeleteDesignCollectionList",index);
}
const designMousedown = (e:any,design:any,str:string)=>{
collItemSize.isMove = false
if(str != 'disLike'){
if(design.resultType != 'Design' || designData.isUnfold)return
if(str != 'like' && showDesignMark.value) return
@@ -695,7 +696,6 @@ export default defineComponent({
startY = e.clientY,
left = item.el.offsetLeft,
top = item.el.offsetTop;
collItemSize.isMove = false
let moveFun = (e:any) => {
collItemSize.isMove = true
let X = e.clientX - startX + left;
@@ -1200,6 +1200,11 @@ export default defineComponent({
likeDesignCollectionList.value.forEach((likeItem:any,index:any)=>{
if(likeItem?.childList?.length > 0){
let index = likeItem.childList.findIndex((item:any)=>{return item.taskId == listItem})
likeItem.childList.forEach((item)=>{
if(item.sort > likeItem.childList[index].sort){
item.sort -= 1
}
})
likeItem.childList.splice(index,1)
}
})

View File

@@ -7,7 +7,7 @@
<!-- <div v-show="openType === 'history'" class="function">
<design :key="componentKey" ref="design"></design>
</div> -->
<router-view v-if="
<router-view v-show="
(openType && openType != 'history' && !routeQuery.id) ||
$route.path != '/home'"
@setTask="setTask"
@@ -23,7 +23,7 @@
<!-- <div v-else-if="routeQuery.id" class="function">
<design :key="componentKey" ref="design"></design>
</div> -->
<div v-else-if="!routeQuery.history" class="function">
<div v-if="!$route.params.id && !routeQuery.id" class="function">
<newPorject ref="newPorject" @newProject=newProject></newPorject>
</div>
<!-- <iframe src="https://kaput-relative-4bb.notion.site/ebd/22a8f755cedd809e98a2c8c6366ee701" width="100%" height="100%" frameborder="0" allowfullscreen /> -->
@@ -55,13 +55,16 @@ export default defineComponent({
const data = reactive({
openType:'',
componentKey:null,
isShowMark:false,
isShowMark:true,
routeQuery:{} as any,
selectObject:computed(()=>store.state.Workspace.probjects) as any,//选择的项目
chatData:null as any,
dataLoad:true as any,
cachedRoutes:computed(()=>store.state.Workspace.cachedRoutes),//
})
onMounted(()=>{
data.isShowMark = false
})
let settingGetHistory:any = inject('settingGetHistory')
const setIsShowMark = (boolean:boolean)=>{
data.isShowMark = boolean

View File

@@ -38,7 +38,7 @@
</div>
<div class="style marginBottom" v-if="show.style">
<div class="text">{{$t('Habit.Style')}}</div>
<div class="center">{{ selectObject?.styleName?selectObject?.styleName:'All' }}</div>
<div class="center">{{ selectObject?.styleName?selectObject?.styleName:$t('Header.All') }}</div>
<div class="gallery_btn" @click="setStyle">{{ $t('Habit.Select') }}</div>
</div>
<div class="style brand marginBottom">

View File

@@ -634,7 +634,10 @@ export default defineComponent({
let index = data.noLikeList.findIndex(
(obj: any) => obj.taskId === element.taskId
)
data.noLikeList[index] = element
data.noLikeList[index] = {
...element,
parentId: data.selectImg.parentId
}
list = ''
clearInterval(data.generateTime)
data.isGenerate = false
@@ -777,6 +780,7 @@ export default defineComponent({
})
}
const likeSetBtn = (id: any, str: string) => {
console.log(1111)
data.likeList.forEach((item: any, index: any) => {
if (item.id == id && id) {
if (str == 'zoom') {
@@ -813,7 +817,9 @@ export default defineComponent({
}
let likeFile = (item: any, str: any, index: any) => {
let url
console.log(item)
let value = {}
console.log(props.isDesignPage)
if (str == 'like') {
value = {
likeOrDislike: 'like',
@@ -832,6 +838,7 @@ export default defineComponent({
emit('unLike', item)
}
}
store.commit('set_loading', true)
Https.axiosPost(Https.httpUrls.poselikeOrDisike, {}, { params: value })
.then(rv => {
if (str == 'like') {
@@ -888,8 +895,10 @@ export default defineComponent({
}
store.commit('setPoseTransfer', addValue)
}
store.commit('set_loading', false)
})
.catch(res => {
store.commit('set_loading', false)
console.error('likeFile error:', res)
})
}
@@ -1669,7 +1678,7 @@ export default defineComponent({
.ant-upload-select-picture-card {
width: 100%;
height: 100%;
border: 1px solid #000;
border: 0.1rem solid #000;
background: #fff;
}
}

View File

@@ -65,7 +65,7 @@ defineExpose({
<style lang="less" scoped>
.promptInput {
--promptInputBorderRadius: 10px;
--promptInputBorder: 2px solid #dcdfe6;
--promptInputBorder: 1px solid #000;
--promptInputPadding: 1.5rem;
width: 100%;
@@ -86,7 +86,7 @@ defineExpose({
.sender-container {
position: relative;
border-radius: 10px;
border: 2px solid #dcdfe6;
border: 1px solid #000;
padding: 1.5rem;
font-size: 1.8rem;
.sender-wrapper {
@@ -100,7 +100,7 @@ defineExpose({
.textarea-container {
position: relative;
border-radius: 10px;
border: 2px solid #dcdfe6;
border: 1px solid #000;
padding: 1.5rem;
height: auto;
font-size: 1.8rem;

View File

@@ -93,7 +93,7 @@ import generatedSketch from '@/assets/images/product/generated_sketch.png'
import maleSingleGarmentSketch from '@/assets/images/product/male_single_garment_sketch.png'
import maleSingleGarmentResult from '@/assets/images/product/male_single_garment_result.png'
import maleSingleModelSketch from '@/assets/images/product/male_single_garment_model_sketch.png'
import maleSingleModelResult from '@/assets/images/product/male_single_garment_model_sketch.png'
import maleSingleModelResult from '@/assets/images/product/male_single_garment_model_result.png'
import femaleChildModelResult from '@/assets/images/product/single_female_child_model_result.png'
import maleSingleChildSketch from '@/assets/images/product/single_male_child_model_sketch.png'
import maleSingleChildResult from '@/assets/images/product/single_male_child_model_result.png'
@@ -121,7 +121,7 @@ const promptList = computed(() => {
return [t('ProductImg.UploadWithoutModel'), t('ProductImg.UploadWithModel')]
} else {
// 如果是从design来的
if (isSingleDesign) {
if (props.isDesignPage) {
// SINGLE_DESIGN: 两个提示词
// 根据年龄和性别选择对应的提示词
let firstPrompt: string // 不带模特的提示词
@@ -255,8 +255,8 @@ const exampleList = computed(() => {
}
} else {
const { ageGroup, httpType, sex } = store.state.Workspace.probjects
const isSingleDesign = httpType === 'SINGLE_DESIGN'
if (!isSingleDesign) return {}
// const isSingleDesign = httpType === 'SINGLE_DESIGN'
// if (!isSingleDesign) return {}
const isAdult = ageGroup === 'Adult'
const isFemale = sex === 'Female'
if (isAdult) {

View File

@@ -697,6 +697,7 @@ export default defineComponent({
emit('unLike', item)
}
}
store.commit('set_loading', true)
Https.axiosPost(url, data)
.then(rv => {
if (str == 'like') {
@@ -728,8 +729,11 @@ export default defineComponent({
store.commit('setRelightList', value)
}
}
store.commit('set_loading', false)
})
.catch(res => {
store.commit('set_loading', false)
})
.catch(res => {})
}
let remPrductimgTime: any = null
let prductimgTime: any = null
@@ -1101,13 +1105,13 @@ export default defineComponent({
const showPromptAssist = ref(false)
const handleClickAssistBtn = () => {
const { httpType } = store.state.Workspace.probjects
const isSingleDesign = httpType === 'SINGLE_DESIGN'
if (props.isDesignPage && !isSingleDesign) {
const promptText = t('ProductImg.Series')
productImgData.searchName[props.productimgMenu.value] = promptText
return
}
// const { httpType } = store.state.Workspace.probjects
// const isSingleDesign = httpType === 'SINGLE_DESIGN'
// if (props.isDesignPage && !isSingleDesign) {
// const promptText = t('ProductImg.Series')
// productImgData.searchName[props.productimgMenu.value] = promptText
// return
// }
showPromptAssist.value = true
}
@@ -1250,13 +1254,15 @@ export default defineComponent({
> .item {
margin-right: 1rem;
width: calc(100% / 2 - 0.5rem);
// width: calc(100% / 2 - 0.5rem);
// height: 25rem;
width: 12.7rem;
height: 17.8rem;
cursor: pointer;
overflow: hidden;
display: flex;
justify-content: center;
flex-shrink: 0;
height: 25rem;
position: relative;
// &.active{
// border: 2px solid;
@@ -1532,6 +1538,9 @@ export default defineComponent({
.ant-upload-select-picture-card {
width: 12.7rem;
height: 17.8rem;
border-width: 1px;
background: #fff;
border: 0.1rem solid #000;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -134,7 +134,8 @@ export default {
jsContent2: '我们只支持对印花进行超分',
jsContent3: '您的积分小于一次超分',
jsContent4: '您的积分余额不足',
jsContent5: '您选择的第{str}张图像在超分辨率增强后的分辨率超过2048。请选择较低的放大倍数。',
jsContent5:
'您选择的第{str}张图像在超分辨率增强后的分辨率超过2048。请选择较低的放大倍数。',
jsContent6: '请选择需要超分的图片',
jsContent7: '已成功保存至项目画布中~',
jsContent8: '是否继续编辑',
@@ -205,8 +206,10 @@ export default {
RobotAssist: {
inputContent1: '问我什么都行~',
jsContent1: '请输入生成内容~',
jsContent2: '欢迎来到AiDA。我是您友好的时尚设计助手。如果您有任何问题或需要帮助请随时问我。',
jsContent3: '看来您可能是新用户我很乐意为您介绍我们全新升级的AiDA系统。您现在要开始教程吗',
jsContent2:
'欢迎来到AiDA。我是您友好的时尚设计助手。如果您有任何问题或需要帮助请随时问我。',
jsContent3:
'看来您可能是新用户我很乐意为您介绍我们全新升级的AiDA系统。您现在要开始教程吗',
jsContent4: '您可以随时告诉我要开始教程。',
jsContent5: '在开始教程之前,我们需要刷新页面。您现在要开始教程吗?'
},
@@ -233,10 +236,12 @@ export default {
jsContent1: '您必须选择一种或多种颜色进行下一步。',
jsContent2: '您必须选择一种或多种颜色进行下一步。',
jsContent3: '导出文件失败。',
jsContent4: '您的订阅将在 {days} 天 {hours} 小时后到期。为确保服务不中断,请点击此处续订->',
jsContent4:
'您的订阅将在 {days} 天 {hours} 小时后到期。为确保服务不中断,请点击此处续订->',
jsContent8: '续订订阅。',
jsContent7: '友情提示',
jsContent5: '我们很高兴让您体验AiDA。请注意部分服务在试用期间可能会受到限制。如果您已经准备好全身心投入并享受完整的体验我们诚挚地邀请您订阅。只需访问',
jsContent5:
'我们很高兴让您体验AiDA。请注意部分服务在试用期间可能会受到限制。如果您已经准备好全身心投入并享受完整的体验我们诚挚地邀请您订阅。只需访问',
jsContent6: ' 就可以开始订阅。感谢您试用我们的服务!',
jsContent9: '您确定要清除当前系列并重新开始吗?',
jsContent10: "二次创作的作品不允许使用'设计',但是您可以使用'重新设计'",
@@ -310,18 +315,29 @@ export default {
ChangeBarInfo: '移除服装',
ChangeGarden: '在花园,清晨时分。',
ChangeGardenInfo: '添加配饰',
SingleGarment: '专业产品摄影:服装展示于隐形模特上,模特不可见。完整保留设计细节——所有图案、颜色、质地及细节特征。', // 单品样衣
SingleChildMaleWithoutModel: '将此图像转换为真实服装展示于白色工作室中:服装悬挂于隐形人体模型上。',
SingleChildMaleWithModel: '将这张图片转换为真实儿童模特,模特身着该服装,在白色摄影棚内以站立姿势面向镜头。',
SingleChildFemaleWithoutModel: '将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。',
SingleChildFemaleWithModel: '将此图像转化为真实儿童模特,穿着该服装,置于白色摄影棚内,面向镜头,保持站立姿势。',
SingleAdultMaleWithoutModel: '将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。',
SingleAdultMaleWithModel: '将此图像转化为真实模特,让模特身着该服装,在白色摄影棚内面向镜头保持站立姿势。',
SingleAdultFemaleWithoutModel: '将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。',
SingleAdultFemaleWithModel: '将此图像转化为真实模特,让模特身着该服装,在白色摄影棚内面向镜头保持站立姿势。',
SingleGarment:
'专业产品摄影:服装展示于隐形模特上,模特不可见。完整保留设计细节——所有图案、颜色、质地及细节特征。', // 单品样衣
SingleChildMaleWithoutModel:
'将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。',
SingleChildMaleWithModel:
'将这张图片转换为真实儿童模特,模特身着该服装,在白色摄影棚内以站立姿势面向镜头。',
SingleChildFemaleWithoutModel:
'将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。',
SingleChildFemaleWithModel:
'将此图像转化为真实儿童模特,穿着该服装,置于白色摄影棚内,面向镜头,保持站立姿势。',
SingleAdultMaleWithoutModel:
'将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。',
SingleAdultMaleWithModel:
'将此图像转化为真实模特,让模特身着该服装,在白色摄影棚内面向镜头保持站立姿势。',
SingleAdultFemaleWithoutModel:
'将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。',
SingleAdultFemaleWithModel:
'将此图像转化为真实模特,让模特身着该服装,在白色摄影棚内面向镜头保持站立姿势。',
Series: '在白色摄影棚内,面向镜头,站立姿势。',
UploadWithModel: '创建真实感十足的摄影棚照片,模特需身着该服装站立于白色摄影棚中。若原有模特存在则保留,否则生成合适模特。保持站立姿势,面向镜头。', // 上传线稿,带模特
UploadWithoutModel: '将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。' // 上传线稿,带模特
UploadWithModel:
'创建真实感十足的摄影棚照片,模特需身着该服装站立于白色摄影棚中。若原有模特存在则保留,否则生成合适模特。保持站立姿势,面向镜头。', // 上传线稿,带模特
UploadWithoutModel:
'将此图像转换为真实服装,展示于白色工作室中:服装悬挂于隐形人体模型上。' // 上传线稿,不带模特
},
poseTransfer: {
SelectDesign: '产品图',
@@ -341,7 +357,7 @@ export default {
Tips: '提示',
TipsStart: '你可以使用“',
TipsEnd: '编辑产品图”来生成首帧或尾帧图片',
PormptPlaceholder: '输入你想描述的场景...',
PormptPlaceholder: '输入你想描述的画面内容...',
firstAndLastFrameText1: '随着视频的进行,使用',
firstAndLastFramePlaceholder1: '相机运动',
firstAndLastFrameText2: '来跟随动作,在',
@@ -437,7 +453,8 @@ export default {
jsContent4: '图片必须小于5MB',
jsContent5: '图片已经上传是否继续上传',
jsContent6: '输入的内容超过允许输入的最大长度',
jsContent7: '请输入内容~'
jsContent7: '请输入内容~',
jsContent8: '请输入项目名字~'
},
ModelPlacement: {
Registration: '新增模特',
@@ -618,7 +635,8 @@ export default {
Merge: '合成',
maximumLength: '输入的内容超过允许输入的最大长度',
effectPoor: '当前生成的图像质量低于标准。请考虑调整您的提示词并再次尝试。',
everyTimeEffectPoor: '您有一张图片生成图片质量低于标准,请考虑调整您的提示词并再次尝试。',
everyTimeEffectPoor:
'您有一张图片生成图片质量低于标准,请考虑调整您的提示词并再次尝试。',
Model: '模型',
uploadTitle: '上传参考图',
uploadproduct: '上传产品图',
@@ -662,7 +680,8 @@ export default {
jsContent1: '因为您选择了多张图片,请点击布局后继续.',
jsContent2: '上传的文件不会保存,是否继续? ',
jsContent3: '您必须选择一种或多种颜色进行下一步。',
jsContent5: '我们检测到您的({str})上的PIN数量超过了八个这可能会导致一些已钉住的项目未被使用。您是否仍要继续',
jsContent5:
'我们检测到您的({str})上的PIN数量超过了八个这可能会导致一些已钉住的项目未被使用。您是否仍要继续',
jsContent6: '画布内容没有保存,请点击预保存后继续。',
jsContent7: '请至少选择一个模特'
},
@@ -755,7 +774,8 @@ export default {
available: '此功能对试用用户不可用。',
src: '此功能对试用用户不开放,请访问进行订阅。',
userName: '试用用户',
loginIsTest: '您是试用用户,试用期到 {date}。为了用户数据的安全,我们不会保存试用用户上传的任何个人数据,并会在每次注销后擦除个人数据。如果您需要订阅,请点击 ->',
loginIsTest:
'您是试用用户,试用期到 {date}。为了用户数据的安全,我们不会保存试用用户上传的任何个人数据,并会在每次注销后擦除个人数据。如果您需要订阅,请点击 ->',
image: '由于您是试用用户您只能上传10张图片。'
},
setLabel: {
@@ -958,13 +978,17 @@ export default {
subscriptionRenewal: '没有自动续订的订阅计划.'
},
guide: {
guide1: '在<strong>工作空间</strong>中,您可以个性化您的设计设置,包括选择适用于男装或女装的设计,以及选择用于创作的人体模型。',
guide1:
'在<strong>工作空间</strong>中,您可以个性化您的设计设置,包括选择适用于男装或女装的设计,以及选择用于创作的人体模型。',
guide2: '选择您要设计的服装性别。',
guide3: '在此更改人体模型。',
guide4: '您目前可以从我们的系统库中选择人体模型。稍后,您还可以在注册自己的人体模型后从用户库中进行选择。',
guide4:
'您目前可以从我们的系统库中选择人体模型。稍后,您还可以在注册自己的人体模型后从用户库中进行选择。',
guide5: '在这里开始您的创意之旅。 ',
guide6: '对于情绪板、印花或服装,我们提供三种不同的图片添加方法。第一种选择是<strong>上传</strong>,允许您直接从本地设备上传。',
guide7: '第二种方法是从您的<strong>收藏</strong>中选择。<br> 您可能会注意到您的库页面目前是空的;不必担心。您上传的所有图像都将自动添加到您的库中。将来,您无需每次上传,只需从您的库中选择即可。',
guide6:
'对于情绪板、印花或服装,我们提供三种不同的图片添加方法。第一种选择是<strong>上传</strong>,允许您直接从本地设备上传。',
guide7:
'第二种方法是从您的<strong>收藏</strong>中选择。<br> 您可能会注意到您的库页面目前是空的;不必担心。您上传的所有图像都将自动添加到您的库中。将来,您无需每次上传,只需从您的库中选择即可。',
guide8: '第三种方法是使用最新的图像生成技术<strong>生成</strong>图像。',
guide9: '输入捕捉您希望表达的情绪的关键词,然后单击<strong>生成</strong>按钮。',
guide10: '为您的心情板选择两个图像。',
@@ -1007,7 +1031,8 @@ export default {
guide47: '在此处保存印刷设计。',
guide48: '点击此处完成修改。',
guide49: '点击此完成出您刚刚设计的系列。',
guide51: '这个界面允许您将设计结果转换为产品图。您可以通过调整文字和相似度来获得理想的效果。点击此产品图进入下一步。',
guide51:
'这个界面允许您将设计结果转换为产品图。您可以通过调整文字和相似度来获得理想的效果。点击此产品图进入下一步。',
guide52: '点击此处生成产品图。',
guide53: '点击此按钮可对产品图应用更多工具。',
guide54: '我们可以改变这张图片的光照方向和背景。',
@@ -1015,7 +1040,8 @@ export default {
guide56: '如果您喜欢这个结果,可以点击小红心保存。',
guide57: '点击此处进入导出页面。',
guide58: '您可以将作品分享到作品广场或者导出到本地。',
guide50: "您的指南已经完成,现在您可以自由创作。要了解更多见解和细节,请查看我们主页上的演示视频:<a href='https://code-create.com.hk/aida/' style='pointer-events: auto;' target='_blank'>https://code-create.com.hk/aida/</a>。您可以随时告诉机器人您想重新开始教程。"
guide50:
"您的指南已经完成,现在您可以自由创作。要了解更多见解和细节,请查看我们主页上的演示视频:<a href='https://code-create.com.hk/aida/' style='pointer-events: auto;' target='_blank'>https://code-create.com.hk/aida/</a>。您可以随时告诉机器人您想重新开始教程。"
},
createSlogan: {
title: '创建标语',
@@ -1037,11 +1063,13 @@ export default {
Setting: '手动模式',
SeriesDesign: '整身设计',
series: '整身设计',
SeriesDesignInfo: '系列设计专注于多品类服装的协调设计,是打造统一时尚系列的理想之选。使用“设计资源”面板中的“情绪板”、“印刷板”、“配色板”、“草图板”和“人体模型”工具,收集和整理您的灵感,打造和谐的服装组合。在“草稿”和“系列”面板中,使用“产品图像”、“重新照明”和“转移姿势”等强大工具,完善您的作品。准备就绪后,将所有内容导出到“画布”以展示完整的系列设计。',
SeriesDesignInfo:
'系列设计专注于多品类服装的协调设计,是打造统一时尚系列的理想之选。使用“设计资源”面板中的“情绪板”、“印刷板”、“配色板”、“草图板”和“人体模型”工具,收集和整理您的灵感,打造和谐的服装组合。在“草稿”和“系列”面板中,使用“产品图像”、“重新照明”和“转移姿势”等强大工具,完善您的作品。准备就绪后,将所有内容导出到“画布”以展示完整的系列设计。',
SingleDesign: '单品设计',
single: '单品设计',
DeepThinking: '深度思考',
SingleDesignInfo: '单一设计专注于单一服装类别的独立设计,例如 T 恤、连衣裙或夹克,无需考虑与其他单品的搭配。使用“设计资源”面板中的“情绪板”、“打印板”、“配色板”和“草图板”来收集灵感,并专注于打造一件独一无二的作品。完成后,在“草稿”和“收藏”面板中使用“产品图像”、“重新照明”和“传输姿势”等工具优化您的设计,然后导出到“画布”以展示您的个人作品。',
SingleDesignInfo:
'单一设计专注于单一服装类别的独立设计,例如 T 恤、连衣裙或夹克,无需考虑与其他单品的搭配。使用“设计资源”面板中的“情绪板”、“打印板”、“配色板”和“草图板”来收集灵感,并专注于打造一件独一无二的作品。完成后,在“草稿”和“收藏”面板中使用“产品图像”、“重新照明”和“传输姿势”等工具优化您的设计,然后导出到“画布”以展示您的个人作品。',
selectDesignType: '请选择设计类型',
hintListSERIES1: '设计一套以夏日海滩为灵感的连衣裙。',
hintListSERIES2: '设计一套暗色系,哥特风格的上衣。',
@@ -1551,6 +1579,131 @@ export default {
Relight: '打光',
ChatRobot: '对话生成',
Yes: '是',
No: '否'
No: '否',
SubscribePlan: '订阅计划',
SwitchPlanSuccess: '切换订阅计划成功',
SwitchPlanFailed: '切换订阅计划失败',
NoPlanSelected: '请先选择订阅计划',
PlanNameRequired: '请输入计划名称',
PlanNotFound: '计划不存在',
RenamePlanSuccess: '重命名成功',
RenamePlanFailed: '重命名失败',
RenamePlan: '重命名订阅计划',
PlanName: '计划名称',
InputPlanName: '请输入计划名称',
Cancel: '取消',
SelectPlan: '选择计划',
AllPlan: '全部'
},
Login: {
Login: '登录',
SignUp: '注册',
ForgotPassword: '忘记密码',
Welcome: '欢迎来到',
AiDA: 'AiDA',
Slogan:
'AiDA是一个业界首创的平台致力于赋能时装设计师融汇灵感人机协同共创原创设计。',
LoginMethod: '使用以下方式登录:',
Individual: '个人账号',
Academic: '学术账号',
LogonToAiDA: '登录到AiDA 3.1',
Infomation: '请填写以下信息',
Device: '请使用iPad或电脑登录',
AgreePolicies: '请勾选条款、隐私政策和费用',
PasswordConditions: '您必须满足所有密码条件才能注册',
LoginWithGoogle: '使用谷歌账号登录',
LoginWithWechat: '使用微信登录',
},
LoginPersonal: {
Email: '邮箱',
Password: '密码',
EnterEmail: '请输入您的邮箱地址',
EnterPassword: '请输入您的密码',
EnterCode: '输入验证码',
Resend: '重发',
SentCodeToEmail: '我们已向您的邮箱发送验证码',
ForgotPassword: '忘记密码',
AgreeTo: '我同意',
Terms: '条款',
PrivacyPolicy: '隐私政策',
AndFees: '和费用',
SignIn: '登录',
CreateNewAccount: '创建新账号',
Or: '或',
RetrievePassword: '找回密码',
NextStep: '下一步',
VerificationCode: '验证码',
SentTo: '发送至',
Submit: '提交',
AtLeast8Chars: '至少8个字符',
MustContainSpecial: '必须包含特殊字符',
MixUpperLowerNumbers: '大小写字母和数字的组合',
EnterNewPassword: '请输入新密码',
NeedEmail: '请输入邮箱',
IncorrectEmail: '请输入正确的邮箱地址',
IncorrectEmailFormat: '请输入正确的邮箱格式',
CompleteVerificationCode: '请输入完整的验证码',
PleaseEnterYourAccountNumberOrPassword: '请输入您的账号或密码'
},
LoginSchool: {
School: '学校',
SelectSchool: '请选择学校',
Email: '邮箱',
Password: '密码',
EnterEmail: '请输入您的邮箱地址',
EnterPassword: '请输入您的密码',
EnterCode: '输入验证码',
Resend: '重发',
SentCodeToEmail: '我们已向您的邮箱发送验证码',
ForgotPassword: '忘记密码',
AgreeTo: '我同意',
Terms: '条款',
PrivacyPolicy: '隐私政策',
AndFees: '和费用',
SignIn: '登录',
RetrievePassword: '找回密码',
NextStep: '下一步',
VerificationCode: '验证码',
SentTo: '发送至',
Submit: '提交',
AtLeast8Chars: '至少8个字符',
MustContainSpecial: '必须包含特殊字符',
MixUpperLowerNumbers: '大小写字母和数字的组合',
EnterNewPassword: '请输入新密码',
NeedEmail: '请输入邮箱',
IncorrectEmail: '请输入正确的邮箱地址',
IncorrectEmailFormat: '请输入正确的邮箱格式',
CompleteVerificationCode: '请输入完整的验证码',
PleaseEnterYourAccountNumberOrPassword: '请输入您的账号或密码'
},
LoginEnterprise: {
Enterprise: '企业',
SelectEnterprise: '请选择企业',
Email: '邮箱',
Password: '密码',
EnterEmail: '请输入您的邮箱地址',
EnterPassword: '请输入您的密码',
EnterCode: '输入验证码',
Resend: '重发',
SentCodeToEmail: '我们已向您的邮箱发送验证码',
AgreeTo: '我同意',
Terms: '条款',
PrivacyPolicy: '隐私政策',
AndFees: '和费用',
SignIn: '登录',
RetrievePassword: '找回密码',
NextStep: '下一步',
VerificationCode: '验证码',
SentTo: '发送至',
Submit: '提交',
AtLeast8Chars: '至少8个字符',
MustContainSpecial: '必须包含特殊字符',
MixUpperLowerNumbers: '大小写字母和数字的组合',
EnterNewPassword: '请输入新密码',
NeedEmail: '请输入邮箱',
IncorrectEmail: '请输入正确的邮箱地址',
IncorrectEmailFormat: '请输入正确的邮箱格式',
CompleteVerificationCode: '请输入完整的验证码',
PleaseEnterYourAccountNumberOrPassword: '请输入您的账号或密码'
}
}

View File

@@ -107,7 +107,8 @@ export default {
FillBack: 'Fill & Border',
Layer: 'Layer',
More: 'Adjustments',
insufficient: 'Your points balance is insufficient, if you need to use this feature, please click the top left corner to recharge',
insufficient:
'Your points balance is insufficient, if you need to use this feature, please click the top left corner to recharge',
HDExport: 'UpScale',
Save: 'Save',
Share: 'Share',
@@ -130,11 +131,13 @@ export default {
Copy: 'Copy',
Paste: 'Paste',
UploadOpenimage: 'Upload/Open image',
jsContent1: "Have you saved your canvas content? If not, please click 'Save' before closing.",
jsContent1:
"Have you saved your canvas content? If not, please click 'Save' before closing.",
jsContent2: 'We only provide super-resolution capabilities for printboard images.',
jsContent3: 'Your points are less than one SR',
jsContent4: 'Your points balance is insufficient',
jsContent5: 'After super-resolution enhancement, the {str} th image you selected has a resolution exceeding 2048, Please choose a lower magnification level.',
jsContent5:
'After super-resolution enhancement, the {str} th image you selected has a resolution exceeding 2048, Please choose a lower magnification level.',
jsContent6: 'Please select the picture that requires upscale',
jsContent7: 'It has been successfully saved to the project canvas.',
jsContent8: 'Whether to continue editing',
@@ -199,16 +202,21 @@ export default {
Complete: 'Complete',
jsContent1: 'Whether to delete the workspace?',
jsContent2: 'Please enter a workbench name',
jsContent3: "It looks like you've changed the style. Would you like to replace the currently used mannequin with the system-recommended model for this style?",
jsContent3:
"It looks like you've changed the style. Would you like to replace the currently used mannequin with the system-recommended model for this style?",
currentProject: 'Current Project'
},
RobotAssist: {
inputContent1: 'write a message~',
jsContent1: 'Please enter content',
jsContent2: "Welcome to AiDA. I am your friendly fashion design assistant. If you have any questions or need assistance, please don't hesitate to ask",
jsContent3: "I see you might be new here, and I'd love to guide you through a tutorial to help you get acquainted with our new and improved AiDA system. Would you like to start the tutorial now?",
jsContent4: 'You can start the tutorial at any time by simply telling me that you want to.',
jsContent5: 'We need to refresh the page before starting the tutorial. Would you like to start the tutorial now?'
jsContent2:
"Welcome to AiDA. I am your friendly fashion design assistant. If you have any questions or need assistance, please don't hesitate to ask",
jsContent3:
"I see you might be new here, and I'd love to guide you through a tutorial to help you get acquainted with our new and improved AiDA system. Would you like to start the tutorial now?",
jsContent4:
'You can start the tutorial at any time by simply telling me that you want to.',
jsContent5:
'We need to refresh the page before starting the tutorial. Would you like to start the tutorial now?'
},
HomeView: {
GetStarted: 'Get Started',
@@ -228,24 +236,30 @@ export default {
colorboard: 'colorboard',
sketchboard: 'sketchboard',
mannequins: 'mannequins',
masnnequinHint: 'The mannequin you use is not matched with the current clothes, which will cause the generated model to not use the selected clothes',
masnnequinHint:
'The mannequin you use is not matched with the current clothes, which will cause the generated model to not use the selected clothes',
FinalizeCollection: 'complete series',
jsContent1: 'You must choose one or more colors for further process.',
jsContent2: 'You must choose one or more colors for further process.',
jsContent3: 'Failed to export the file',
jsContent4: 'Your subscription will expire in {days} days and {hours} hours. To ensure uninterrupted service, please click here to renew -> ',
jsContent4:
'Your subscription will expire in {days} days and {hours} hours. To ensure uninterrupted service, please click here to renew -> ',
jsContent8: 'Renew Subscription.',
jsContent7: 'Friendly Reminder',
jsContent5: "We're delighted to have you experience AiDA. Please be aware that some services may be limited during the trial period. If you're ready to fully dive in and enjoy the complete experience, we warmly invite you to subscribe. Just visit ",
jsContent5:
"We're delighted to have you experience AiDA. Please be aware that some services may be limited during the trial period. If you're ready to fully dive in and enjoy the complete experience, we warmly invite you to subscribe. Just visit ",
jsContent6: ' to get started. Thank you for trying our services!',
jsContent9: 'Are you sure to erase current collection and start over?',
jsContent10: "Re-created works are not allowed to use 'design', but you can use 'redesign'",
jsContent11: 'By unliking this, all connected posts will be deleted. Are you sure you want to continue?',
jsContent10:
"Re-created works are not allowed to use 'design', but you can use 'redesign'",
jsContent11:
'By unliking this, all connected posts will be deleted. Are you sure you want to continue?',
jsContent12: 'Are you sure about deleting the current brand DNA?'
},
ProductImg: {
productInput: 'Enter keyword(style,texture)',
relightInput: 'Using revised phrase(e.g. change...to...,replace...with...,add,remove)',
relightInput:
'Using revised phrase(e.g. change...to...,replace...with...,add,remove)',
Finalize: 'Finalize',
SelectCollection: 'Line Drawing',
SelectCollectionRelight: 'Product Image',
@@ -272,7 +286,8 @@ export default {
TopLight: 'Top Light',
BottomLight: 'Bottom Light',
Clear: 'Clear',
jsContent1: 'Your changes will be lost if you navigate away from this page. Are you sure you want to leave this page?',
jsContent1:
'Your changes will be lost if you navigate away from this page. Are you sure you want to leave this page?',
jsContent2: 'Please select at least one picture',
jsContent3: 'One of your images failed to generate. Please try again.',
Prompt: 'Prompt',
@@ -310,18 +325,29 @@ export default {
ChangeBarInfo: 'Remove Garment',
ChangeGarden: 'In the garden, in the morning.',
ChangeGardenInfo: 'Add Accessories',
SingleGarment: 'Professional product photo: garment on invisible mannequin, no model visible. Preserve exact design - all patterns, colors, textures, details.', // 单品样衣
SingleChildMaleWithoutModel: 'Transform this image into a real garment showing in the white studio: garment on invisible mannequin.',
SingleChildMaleWithModel: 'Transform this image into a real child model stand and wear this garment, in the white studio, facing camera, standing posture.',
SingleChildFemaleWithoutModel: 'Transform this image into a real garment showing in the white studio: garment on invisible mannequin.',
SingleChildFemaleWithModel: 'Transform this image into a real child model stand and wear this garment, in the white studio, facing camera, standing posture.',
SingleAdultMaleWithoutModel: 'Transform this image into a real garment showing in the white studio: garment on invisible mannequin.',
SingleAdultMaleWithModel: 'Transform this image into a real model stand and wear this garment, in the white studio, facing camera, standing posture.',
SingleAdultFemaleWithoutModel: 'Transform this image into a real garment showing in the white studio: garment on invisible mannequin.',
SingleAdultFemaleWithModel: 'Transform this image into a real model stand and wear this garment, in the white studio, facing camera, standing posture.',
SingleGarment:
'Professional product photo: garment on invisible mannequin, no model visible. Preserve exact design - all patterns, colors, textures, details.', // 单品样衣
SingleChildMaleWithoutModel:
'Transform this image into a real garment showing in the white studio: garment on invisible mannequin.',
SingleChildMaleWithModel:
'Transform this image into a real child model stand and wear this garment, in the white studio, facing camera, standing posture.',
SingleChildFemaleWithoutModel:
'Transform this image into a real garment showing in the white studio: garment on invisible mannequin.',
SingleChildFemaleWithModel:
'Transform this image into a real child model stand and wear this garment, in the white studio, facing camera, standing posture.',
SingleAdultMaleWithoutModel:
'Transform this image into a real garment showing in the white studio: garment on invisible mannequin.',
SingleAdultMaleWithModel:
'Transform this image into a real model stand and wear this garment, in the white studio, facing camera, standing posture.',
SingleAdultFemaleWithoutModel:
'Transform this image into a real garment showing in the white studio: garment on invisible mannequin.',
SingleAdultFemaleWithModel:
'Transform this image into a real model stand and wear this garment, in the white studio, facing camera, standing posture.',
Series: 'In the white studio, facing camera, standing posture.',
UploadWithModel: 'Create realistic studio photo with real people model standing and wearing this garment, in white studio, Keep original model if present, or generate appropriate model, Standing pose, facing camera.', // 上传线稿,带模特
UploadWithoutModel: 'Transform this image into a real garment showing in the white studio: garment on invisible mannequin' // 上传线稿,带模特
UploadWithModel:
'Create realistic studio photo with real people model standing and wearing this garment, in white studio, Keep original model if present, or generate appropriate model, Standing pose, facing camera.', // 上传线稿,带模特
UploadWithoutModel:
'Transform this image into a real garment showing in the white studio: garment on invisible mannequin' // 上传线稿,不带模特
},
poseTransfer: {
SelectDesign: 'Product image',
@@ -346,7 +372,8 @@ export default {
firstAndLastFramePlaceholder1: 'Camera Movement',
firstAndLastFrameText2: ' to follow the motion, under',
firstAndLastFramePlaceholder2: 'Light',
firstAndLastFrameText3: ' , maintaining full consistency of model identity, styling, and outfit across all frames.',
firstAndLastFrameText3:
' , maintaining full consistency of model identity, styling, and outfit across all frames.',
firstFrameText1: 'Set the ',
firstFramePlaceholder1: 'Scene',
firstFrameText2: ', where the model ',
@@ -411,8 +438,10 @@ export default {
jsContent10: 'Save as New or Overwrite Current Mannequin?',
jsContent11: 'Are you sure about deleting the current brand DNA?',
jsContent12: 'Please deselect first, then try deleting again.',
jsContent13: 'You must select at least one model of the current gender, and no more than four.',
jsContent14: 'You must select a model whose gender is the same as that of the current project.'
jsContent13:
'You must select at least one model of the current gender, and no more than four.',
jsContent14:
'You must select a model whose gender is the same as that of the current project.'
},
HistoryPage: {
History: 'History',
@@ -437,7 +466,8 @@ export default {
jsContent4: 'Image must smaller than 5MB!',
jsContent5: 'This picture has been uploaded whether to continue uploading',
jsContent6: 'The entered content exceeds the maximum length.',
jsContent7: 'Please enter content'
jsContent7: 'Please enter content',
jsContent8: 'Please enter the project name.'
},
ModelPlacement: {
Registration: 'Registration',
@@ -452,11 +482,13 @@ export default {
Point: 'Point',
addPoint: 'Add points',
RemovePoint: 'Remove points',
mannequinHint: 'Please change the pure white inside the mannequin for another color to enhance your experience',
mannequinHint:
'Please change the pure white inside the mannequin for another color to enhance your experience',
SHOULDER: 'SHOULDER',
WAISTBAND: 'WAISTBAND',
HAND: 'HAND',
jsContent1: "You haven't marked the image yet, and the model will not be uploaded. Are you sure you want to close it?",
jsContent1:
"You haven't marked the image yet, and the model will not be uploaded. Are you sure you want to close it?",
jsContent2: 'This picture has been uploaded whether to continue uploading'
},
ModelPlacementMobile: {
@@ -469,11 +501,13 @@ export default {
Library: 'Library',
Point: 'Point',
RemovePoint: 'Remove Point',
mannequinHint: 'Please change the pure white inside the mannequin for another color to enhance your experience',
mannequinHint:
'Please change the pure white inside the mannequin for another color to enhance your experience',
SHOULDER: 'SHOULDER',
WAISTBAND: 'WAISTBAND',
HAND: 'HAND',
jsContent1: "You haven't marked the image yet, and the model will not be uploaded. Are you sure you want to close it?",
jsContent1:
"You haven't marked the image yet, and the model will not be uploaded. Are you sure you want to close it?",
jsContent2: 'This picture has been uploaded whether to continue uploading'
},
Upload: {
@@ -522,8 +556,10 @@ export default {
GeneratePrint: 'Pattern',
maximumLength: 'The entered content exceeds the maximum length.',
PatternTitle: 'Generates repeatable designs that can be fully tiled across garments.',
LogoTitle: 'Creates standalone graphic designs that can be placed individually or tiled.',
SloganTitle: 'Produces artistic typography for text, suitable for various slogans or phrases.',
LogoTitle:
'Creates standalone graphic designs that can be placed individually or tiled.',
SloganTitle:
'Produces artistic typography for text, suitable for various slogans or phrases.',
jsContent1: 'You can only upload Image file!',
jsContent2: 'Image must smaller than 5MB!',
jsContent3: 'Maximum number of allowable file uploads has been exceeded',
@@ -617,8 +653,10 @@ export default {
currently: 'You are currently in the {generateLineUp} th position in the queue',
Merge: 'Merge',
maximumLength: 'The entered content exceeds the maximum length.',
effectPoor: 'The quality of the generated images currently falls below standard. Please consider adjusting your prompt and trying again.',
everyTimeEffectPoor: 'One generated image falls below quality thresholds. Modify your text prompt and regenerate.',
effectPoor:
'The quality of the generated images currently falls below standard. Please consider adjusting your prompt and trying again.',
everyTimeEffectPoor:
'One generated image falls below quality thresholds. Modify your text prompt and regenerate.',
Model: 'Model',
uploadTitle: 'Upload reference image',
uploadproduct: 'Upload product picture',
@@ -634,7 +672,8 @@ export default {
GoldSunflower: 'Golden Sunflower',
EmrldJungle: 'Emerald Jungle Canopy',
PinkSakura: 'Pink Sakura Blossom',
generateLoading: 'Please wait while we extract text from your images. This will just take a moment.',
generateLoading:
'Please wait while we extract text from your images. This will just take a moment.',
jsContent1: 'You can only upload Image file!',
jsContent2: 'Image must smaller than 5MB!',
jsContent3: 'Please enter content',
@@ -645,7 +684,8 @@ export default {
jsContent8: 'You have {num} remaining opportunity to generate {str}.',
jsContent9: 'You have exhausted your generation opportunities {str}.',
jsContent10: 'Please complete the slogan picture',
jsContent11: 'See the input content may overlap, overlap will affect the final effect oh',
jsContent11:
'See the input content may overlap, overlap will affect the final effect oh',
jsContent12: 'Complete at least one slogan'
},
collectionModal: {
@@ -659,11 +699,14 @@ export default {
PrinCollection: 'select printboard for your collection',
ColorCollection: 'select colors for your collection',
SketchCollection: 'select sketchboard for your collection',
jsContent1: "Since you have selected multiple images, please click 'Layout' to proceed.",
jsContent1:
"Since you have selected multiple images, please click 'Layout' to proceed.",
jsContent2: 'The uploaded files will not be saved, being sure to continue? ',
jsContent3: 'You must choose one or more colors for further process.',
jsContent5: "We've detected that the number of pins on your ({str}) exceeds eight, which may result in some pinned items not being used. Would you like to continue anyway?",
jsContent6: 'The content on the canvas has not been saved. Please click "Preview" to continue.',
jsContent5:
"We've detected that the number of pins on your ({str}) exceeds eight, which may result in some pinned items not being used. Would you like to continue anyway?",
jsContent6:
'The content on the canvas has not been saved. Please click "Preview" to continue.',
jsContent7: 'Please select at least one model.'
},
DesignDetail: {
@@ -755,7 +798,8 @@ export default {
available: 'This feature is not available to trial users',
src: 'This function is not open to trial users, if you need to subscribe, please visit ',
userName: 'Trial User',
loginIsTest: "You are a trial user, Probation period until{date}. For the security of users' data, we do not save any personal data uploaded by trial users, and will erase personal data after each logout. if you need to subscribe, please click ->",
loginIsTest:
"You are a trial user, Probation period until{date}. For the security of users' data, we do not save any personal data uploaded by trial users, and will erase personal data after each logout. if you need to subscribe, please click ->",
image: 'Because you are a trial user, you can only upload 10 images'
},
setLabel: {
@@ -782,7 +826,8 @@ export default {
UpdatePublish: 'Update Publish',
jsContent1: 'Are you sure to leave this page? Your changes are not saved. ',
jsContent2: 'Please enter the name of your work',
jsContent3: 'This will publish your work to the square for all users to see. Please confirm whether to publish?',
jsContent3:
'This will publish your work to the square for all users to see. Please confirm whether to publish?',
jsContent4: 'Release success! You can find it in my work'
},
newScaleImage: {
@@ -914,9 +959,10 @@ export default {
MOSTPOPULAR: 'MOST POPULAR',
Monthly: 'Monthly',
Yearly: 'Yearly',
promotionCode: 'Coupon',
promotionCode: 'Coupon Code',
use: 'Apply',
PromoCodeError: 'Please check if the promo code is correct or if the date has expired',
PromoCodeError:
'Please check if the promo code is correct or if the date has expired',
CreditCard: 'Credit Card',
Alipay: 'Alipay',
Payment: 'Payment method',
@@ -958,26 +1004,34 @@ export default {
subscriptionRenewal: 'There are no subscription plans with automatic renewal.'
},
guide: {
guide1: "You can personalize your design settings right here in the <strong>Workspace</strong>, including choosing to design for men's or women's wear, as well as selecting the mannequin to use for your creations.",
guide1:
"You can personalize your design settings right here in the <strong>Workspace</strong>, including choosing to design for men's or women's wear, as well as selecting the mannequin to use for your creations.",
guide2: "Select the apparel type you'd like to work on.",
guide3: 'Change the mannequin here.',
guide4: 'You can currently select a mannequin from our system library. Later, you can also choose from the user library after registering your own mannequin.',
guide4:
'You can currently select a mannequin from our system library. Later, you can also choose from the user library after registering your own mannequin.',
guide5: 'Begin your creative journey here. ',
guide6: 'For the Moodboard, Printboard, or Sketchboard, we provide three different sourcing methods to add images. The first option is <strong>Upload</strong>, allowing you to <stront>upload</stront> directly from your local device.',
guide7: "The second method is to select from your <strong>Library</strong>. <br> You might notice that your library page is currently empty; there's no need to worry. All the images you upload will be automatically added to your library. In the future, you won't have to upload each time—you can simply choose from your library instead.",
guide8: 'The third method is to <strong>Generate</strong> images using the latest Image Generation technology.',
guide9: 'Enter keywords that capture the mood you wish to express and then click the <strong>Low Quality</strong> button.',
guide6:
'For the Moodboard, Printboard, or Sketchboard, we provide three different sourcing methods to add images. The first option is <strong>Upload</strong>, allowing you to <stront>upload</stront> directly from your local device.',
guide7:
"The second method is to select from your <strong>Library</strong>. <br> You might notice that your library page is currently empty; there's no need to worry. All the images you upload will be automatically added to your library. In the future, you won't have to upload each time—you can simply choose from your library instead.",
guide8:
'The third method is to <strong>Generate</strong> images using the latest Image Generation technology.',
guide9:
'Enter keywords that capture the mood you wish to express and then click the <strong>Low Quality</strong> button.',
guide10: 'Select two images for your moodboard.',
guide11: 'Click here to layout your moodboard.',
guide12: 'Click here for next step.',
guide13: 'Click here to generate print images.',
// guide14:"We provide three input options for generating images: Image Only, Text Only, and Text-Image.",
// guide15:"Select this option and we will generate four print images using both the picture you upload and the text you enter.",
guide16: 'Choose a generation model here; different models will generate images in various styles.',
guide16:
'Choose a generation model here; different models will generate images in various styles.',
// guide17:"Choose a generation model here; different models will generate images in various styles.",
guide18: 'Upload the input picture here.',
// guide19:"Click on this image to select it.",
guide20: 'Enter keywords about the print you wish to create and then click the <strong>Generate</strong> button.',
guide20:
'Enter keywords about the print you wish to create and then click the <strong>Generate</strong> button.',
guide21: 'Select the generated prints you like best.',
guide22: 'Click here for next step.',
guide23: 'Click here to extract primary colors from image.',
@@ -987,7 +1041,8 @@ export default {
guide27: 'Click here for next step.',
guide28: 'Click here to generate clothing sketches.',
// guide29:"Using text only option for generation.",
guide30: 'Enter keywords about the sketch you wish to create and then click the <strong>Generate</strong> button.',
guide30:
'Enter keywords about the sketch you wish to create and then click the <strong>Generate</strong> button.',
guide31: 'Click here to choose a category for the generated sketch.',
guide32: 'Choose correct category for the sketch.',
guide33: 'Select the generated sketches you like best.',
@@ -995,7 +1050,8 @@ export default {
guide35: 'Click here to let AI generate design illustrations.',
guide36: 'Please wait a few seconds.',
guide37: 'Click the little red heart to save your favorite design.',
guide38: "Click '<strong>Redesign</strong>' to generate eight new outfits for your collection to choose from.",
guide38:
"Click '<strong>Redesign</strong>' to generate eight new outfits for your collection to choose from.",
guide39: 'Click here to let AI generate design illustrations.',
guide40: 'Click on any design image you are interested in to modify the details.',
guide41: 'Click on the clothes to modify its details.',
@@ -1007,7 +1063,8 @@ export default {
guide47: 'Save printed design here.',
guide48: 'Click here to finalize your modification.',
guide49: 'Click here to access the finalize page.',
guide51: 'This interface allows you to transform design results into product images. You can achieve your desired effect by adjusting the text and similarity. Click this product image to proceed to the next step.',
guide51:
'This interface allows you to transform design results into product images. You can achieve your desired effect by adjusting the text and similarity. Click this product image to proceed to the next step.',
guide52: 'Click here to generate the product image.',
guide53: 'Click this button to apply more tools to the product image. ',
guide54: 'We can adjust the lighting and background of this image. ',
@@ -1015,7 +1072,8 @@ export default {
guide56: 'If you like this result, click the little heart to save it.',
guide57: 'Click here to go to the export page. ',
guide58: 'You can share your work to the gallery or export to your local device.',
guide50: "Your guide is complete, and now the canvas is yours to create freely. For more insights and details, check out our demo video on the homepage at <a href='https://code-create.com.hk/aida/' style='pointer-events: auto;' target='_blank'>https://code-create.com.hk/aida/</a><br>You can restart the tutorial at any time by simply telling the robot that you want to."
guide50:
"Your guide is complete, and now the canvas is yours to create freely. For more insights and details, check out our demo video on the homepage at <a href='https://code-create.com.hk/aida/' style='pointer-events: auto;' target='_blank'>https://code-create.com.hk/aida/</a><br>You can restart the tutorial at any time by simply telling the robot that you want to."
},
createSlogan: {
title: 'Create Slogan',
@@ -1037,13 +1095,16 @@ export default {
Setting: 'Manual Mode',
SeriesDesign: 'Overall Illustration Design',
series: 'Series Design',
SeriesDesignInfo: 'Series Design focuses on the coordinated design of multi-category clothing, ideal for creating a unified fashion collection. Gather and arrange your inspiration using the Moodboard, Printboard, Colorboard, Sketchboard, and Mannequin tools in the Design Assets panel to build harmonious outfit combinations. Refine your creations in the Draft and Collection panels using powerful tools like To Product Image, Relight, and Transfer Pose. When youre ready, export everything to the Canvas to display your complete series design.',
SeriesDesignInfo:
'Series Design focuses on the coordinated design of multi-category clothing, ideal for creating a unified fashion collection. Gather and arrange your inspiration using the Moodboard, Printboard, Colorboard, Sketchboard, and Mannequin tools in the Design Assets panel to build harmonious outfit combinations. Refine your creations in the Draft and Collection panels using powerful tools like To Product Image, Relight, and Transfer Pose. When youre ready, export everything to the Canvas to display your complete series design.',
SingleDesign: 'Single item design',
single: 'Single Design',
DeepThinking: 'Deep Thinking',
SingleDesignInfo: 'Single Design focuses on creating an individual clothing item, such as a T-shirt, dress, or jacket, without coordinating it with other pieces. Use the Moodboard, Printboard, Colorboard, and Sketchboard sections in the Design Assets panel to gather inspiration and develop a unique design. Once finished, refine your work in the Draft and Collection panels using tools like To Product Image, Relight, and Transfer Pose, then export to the Canvas to showcase your standalone creation. ',
SingleDesignInfo:
'Single Design focuses on creating an individual clothing item, such as a T-shirt, dress, or jacket, without coordinating it with other pieces. Use the Moodboard, Printboard, Colorboard, and Sketchboard sections in the Design Assets panel to gather inspiration and develop a unique design. Once finished, refine your work in the Draft and Collection panels using tools like To Product Image, Relight, and Transfer Pose, then export to the Canvas to showcase your standalone creation. ',
selectDesignType: 'Please select the design type',
hintListSERIES1: 'Design a collection of futuristic clothes, deep purple color scheme.',
hintListSERIES1:
'Design a collection of futuristic clothes, deep purple color scheme.',
hintListSERIES2: 'Design a set of bright-colored, Bohemian-style dresses.',
hintListSERIES3: 'Design a set of hip-hop street style denim jackets for boys.',
hintListSIGNLE1: 'A silver-gray, steampunk-style windbreaker.',
@@ -1104,7 +1165,8 @@ export default {
Delete: 'Delete',
Finish: 'We have calculated your preferred style.',
LastCompletionTime: 'Last completion time',
textarea: 'Please enter your thoughts about this brand, and we will help you generate the name, logo, and slogan.'
textarea:
'Please enter your thoughts about this brand, and we will help you generate the name, logo, and slogan.'
},
chat: {
DeepThinking: 'Deep Thinking',
@@ -1256,11 +1318,13 @@ export default {
SpecialEffectsBrush: 'Special Effects Brush',
PencilSettings: 'Pencil Settings',
ParticleSeparationDegree: 'Particle separation degree',
ParticleSeparationDegreeDescription: 'Control the degree of separation of the crayon particles',
ParticleSeparationDegreeDescription:
'Control the degree of separation of the crayon particles',
TheAmountOfInk: 'The Amount Of Ink',
TheAmountOfInkDescription: 'Control the amount of pigment in the crayons',
randomness: 'Randomness',
randomnessDescription: 'Controlling the degree of randomness in the texture of the crayon',
randomnessDescription:
'Controlling the degree of randomness in the texture of the crayon',
TextureType: 'Texture Type',
TextureTypeDescription: 'Set the texture type of the crayons',
Default: 'Default',
@@ -1403,28 +1467,36 @@ export default {
back: 'Back',
confirm: 'Confirm',
RasterizedLayer: 'Rasterized Layer',
rasterizeImmediately: 'You need to rasterize first before performing the distortion operation. Do you want to rasterize immediately?',
rasterizeImmediately:
'You need to rasterize first before performing the distortion operation. Do you want to rasterize immediately?',
ConfirmRasterization: 'Confirm Rasterization',
beingRasterized: 'Currently, it is being rasterized.',
waitRasterizing: 'Rasterizing the layer. Please wait...',
successRasterizing: 'The layer has been successfully rasterized and can now undergo the distortion operation.',
successRasterizing:
'The layer has been successfully rasterized and can now undergo the distortion operation.',
gridingFailed: 'Griding Failed',
gridingFailedNoOperation: 'Griding failed. Unable to perform the liquefaction operation.',
gridingFailedNoOperation:
'Griding failed. Unable to perform the liquefaction operation.',
gridingError: 'Griding Error',
LayerError: 'Layer Error',
LayerDoesNotExist: 'The layer does not exist.',
backgroundEmpty: 'The background layer is empty.',
backgroundEmptyNoLiquidation: 'The background layer is empty, so the liquidation operation cannot be performed.',
backgroundEmptyNoLiquidation:
'The background layer is empty, so the liquidation operation cannot be performed.',
layerEmpty: 'The layer is empty.',
layerEmptyNoLiquidation: 'The layer is empty and cannot perform the liquefaction operation.',
layerEmptyNoLiquidation:
'The layer is empty and cannot perform the liquefaction operation.',
liqueficationManagerError: 'Liquefication Manager Error',
liqueficationManagerErrorInitialized: 'The liquefaction manager has not been initialized.',
liqueficationManagerErrorInitialized:
'The liquefaction manager has not been initialized.',
liquefactionEnvironment: 'Prepare for the liquefaction environment',
liquefactionEnvironmentLoading: 'The liquefaction environment is being prepared. Please wait a moment...',
liquefactionEnvironmentLoading:
'The liquefaction environment is being prepared. Please wait a moment...',
LiqueficationFailed: 'Liquefication tool failed to start.',
TextLayer: 'Text Layer',
DoubleClickText: 'Double-click to edit the text',
LiquidationError: 'No valid image selected or the layer does not fit the liquefaction operation.',
LiquidationError:
'No valid image selected or the layer does not fit the liquefaction operation.',
ErrorMessage: 'Error Message',
preset: 'Preset',
presetNamePrompt: 'Please enter the preset name:',
@@ -1551,6 +1623,131 @@ export default {
Relight: 'Relight',
ChatRobot: 'ChatRobot',
Yes: 'Yes',
No: 'No'
No: 'No',
SubscribePlan:'Subscribe Plan',
SwitchPlanSuccess: 'Switch subscription plan successfully',
SwitchPlanFailed: 'Failed to switch subscription plan',
NoPlanSelected: 'Please select a subscription plan first',
PlanNameRequired: 'Please enter plan name',
PlanNotFound: 'Plan not found',
RenamePlanSuccess: 'Rename successfully',
RenamePlanFailed: 'Failed to rename',
RenamePlan: 'Rename Subscription Plan',
PlanName: 'Plan Name',
InputPlanName: 'Please enter plan name',
Cancel: 'Cancel',
SelectPlan: 'Select Plan',
AllPlan:'All'
},
Login: {
Login: 'Login',
SignUp: 'Sign Up',
ForgotPassword: '忘记密码',
Welcome: 'Welcome to',
AiDA: 'AiDA',
Slogan:
'AiDA, a first-to-market technology that empowers fashion designers, based on their creative inspirations, to work with AI to create original designs.',
LoginMethod: 'Continue with one of these:',
Individual: 'Individual',
Academic: 'Academic',
LogonToAiDA: 'Log on to AiDA 3.1',
Infomation: 'Please fill your information below',
Device: 'If you need to design, please log in using an iPad or computer.',
AgreePolicies: 'Please agree to all terms, privacy policy, and fees.',
PasswordConditions: 'You must satisfy ALL password conditions to register.',
LoginWithGoogle: 'Sign in with Google',
LoginWithWechat: 'Sign in with Wechat',
},
LoginPersonal: {
Email: 'Email',
Password: 'Password',
EnterEmail: 'Enter your email address',
EnterPassword: 'Enter your password',
EnterCode: 'Enter Code',
Resend: 'Resend',
SentCodeToEmail: "We've sent an code to your email",
ForgotPassword: 'Forgot your password',
AgreeTo: 'I agree to the',
Terms: 'Terms',
PrivacyPolicy: 'Privacy Policy',
AndFees: 'and Fees.',
SignIn: 'Sign in',
CreateNewAccount: 'Create New Account',
Or: 'or',
RetrievePassword: 'Retrieve password',
NextStep: 'Next step',
VerificationCode: 'Verification Code',
SentTo: 'Sent to',
Submit: 'Submit',
AtLeast8Chars: 'At least 8 characters long',
MustContainSpecial: 'Must contain special characters',
MixUpperLowerNumbers: 'Mix of uppercase, lowercase and numbers',
EnterNewPassword: 'Enter a new password',
NeedEmail: 'Please enter your email address',
IncorrectEmail: 'The email format is incorrect',
IncorrectEmailFormat: 'The email format is incorrect',
CompleteVerificationCode: 'Please enter the complete verification code.',
PleaseEnterYourAccountNumberOrPassword: 'Please enter your account number or password'
},
LoginSchool: {
School: 'School',
SelectSchool: 'Select a school',
Email: 'Email',
Password: 'Password',
EnterEmail: 'Enter your email address',
EnterPassword: 'Enter your password',
EnterCode: 'Enter Code',
Resend: 'Resend',
SentCodeToEmail: "We've sent an code to your email",
ForgotPassword: 'Forgot your password',
AgreeTo: 'I agree to the',
Terms: 'Terms',
PrivacyPolicy: 'Privacy Policy',
AndFees: 'and Fees.',
SignIn: 'Sign in',
RetrievePassword: 'Retrieve password',
NextStep: 'Next step',
VerificationCode: 'Verification Code',
SentTo: 'Sent to',
Submit: 'Submit',
AtLeast8Chars: 'At least 8 characters long',
MustContainSpecial: 'Must contain special characters',
MixUpperLowerNumbers: 'Mix of uppercase, lowercase and numbers',
EnterNewPassword: 'Enter a new password',
NeedEmail: 'Please enter your email address',
IncorrectEmail: 'The email format is incorrect',
IncorrectEmailFormat: 'The email format is incorrect',
CompleteVerificationCode: 'Please enter the complete verification code.',
PleaseEnterYourAccountNumberOrPassword: 'Please enter your account number or password'
},
LoginEnterprise: {
Enterprise: 'Enterprise',
SelectEnterprise: 'Select an enterprise',
Email: 'Email',
Password: 'Password',
EnterEmail: 'Enter your email address',
EnterPassword: 'Enter your password',
EnterCode: 'Enter Code',
Resend: 'Resend',
SentCodeToEmail: "We've sent an code to your email",
AgreeTo: 'I agree to the',
Terms: 'Terms',
PrivacyPolicy: 'Privacy Policy',
AndFees: 'and Fees.',
SignIn: 'Sign in',
RetrievePassword: 'Retrieve password',
NextStep: 'Next step',
VerificationCode: 'Verification Code',
SentTo: 'Sent to',
Submit: 'Submit',
AtLeast8Chars: 'At least 8 characters long',
MustContainSpecial: 'Must contain special characters',
MixUpperLowerNumbers: 'Mix of uppercase, lowercase and numbers',
EnterNewPassword: 'Enter a new password',
NeedEmail: 'Please enter your email address',
IncorrectEmail: 'The email format is incorrect',
IncorrectEmailFormat: 'The email format is incorrect',
CompleteVerificationCode: 'Please enter the complete verification code.',
PleaseEnterYourAccountNumberOrPassword: 'Please enter your account number or password'
}
}

View File

@@ -290,6 +290,13 @@ const routes: Array<RouteRecordRaw> = [
component: () =>
import("@/component/Administrator/organization/organization.vue"),
},
{
path: "subscriptionPlan",
name: "subscriptionPlan",
meta: { enter: 3 },
component: () =>
import("@/component/Administrator/subscriptionPlan.vue"),
},
//企业版教育管理员页面
{
path: "allUserSE",
@@ -498,12 +505,17 @@ function isTimeRangePassed(timeRange) {
}
router.beforeEach((to: any, from, next) => {
store.commit("set_view_loading", true);
//系统维护时间
const time = '2025-11-21T23:00:00 - 2025-11-22T00:00:00';
const time = '2025-12-19T21:00:00 - 2025-12-19T22:00:00';
if (isTimeRangePassed(time) == 'in_progress') {
// 系统维护
const toName = to.name === 'upgrade';
if(upgradeList.indexOf(to.path) > -1){
if(to.query.status == 'admin'){
localStorage.setItem('isAdminVisit', 'true')
}
const isAdminVisit = localStorage.getItem('isAdminVisit') == 'true'
if(upgradeList.indexOf(to.path) > -1 || isAdminVisit){
next();
}else{
if (toName) {
@@ -513,6 +525,7 @@ router.beforeEach((to: any, from, next) => {
}
}
} else {
localStorage.setItem('isAdminVisit', 'false')
// 机房用户
let herfData = window.location.search.substring(1);
@@ -540,5 +553,7 @@ router.beforeEach((to: any, from, next) => {
// if(systemUser == 0){//游客用户只能进入这两个页面
});
router.afterEach((to, from) => {
store.commit("set_view_loading", false);
});
export default router;

View File

@@ -13,10 +13,22 @@ export interface RootState{
export default createStore<RootState>({
state: {
loading: false,
dataLoading: true,
view_loading: false,
},
getters: {
},
mutations: {
set_loading(state, v){
state.loading = v;
},
set_view_loading(state, v){
state.view_loading = v;
},
set_dataLoading(state, v){
state.dataLoading = v;
},
},
actions: {
},

View File

@@ -80,12 +80,14 @@ const userHabit : Module<UserHabit,RootState> = {
systemList:[],
expireTime:null,
language:'',
organizationId: null,
timeData:{
isExpiration:false,
text:''
},
subscriptionType:null,
subscriptionId:null,
subscriptionPlanId:null,
usernameModify:0,
occupation:'',//职业
country:'',//国家
@@ -195,12 +197,14 @@ const userHabit : Module<UserHabit,RootState> = {
systemList:[],
expireTime:null,
language:'',
organizationId: null,
timeData:{
isExpiration:false,
text:''
},
subscriptionType:null,
subscriptionId:null,
subscriptionPlanId:null,
//是否是affiliate用户
affiliate:false,
usernameModify:0,
@@ -230,6 +234,7 @@ const userHabit : Module<UserHabit,RootState> = {
state.userDetail.avatar = data.avatar//头像
state.userDetail.country = data.country//头像
state.userDetail.occupation = data.occupation//头像
state.userDetail.organizationId = data.organizationId //所属组织
state.userDetail.usernameModify = data.usernameModify//当月剩余修改次数
state.userDetail.isBeginner = data.isBeginner == 1 ? true : false;//是否完成新手指引
state.userDetail.title = data.title//当月剩余修改次数
@@ -315,6 +320,7 @@ const userHabit : Module<UserHabit,RootState> = {
state.userDetail.status = data.status//当前订阅类型
// state.userDetail.status = data.status || 'active'//当前订阅类型
state.userDetail.subscriptionId = data.subscriptionId//最新订阅id
state.userDetail.subscriptionPlanId = data.subscriptionPlanId//最新订阅计划id
},
setUpgradePlan(state,data){
state.upgradePlan.value = data

View File

@@ -177,6 +177,12 @@ const all = (t)=>{
route:'/administrator/organization',
key:'sub13',
isShow:true,
},{
name:'Subscription Plan',
icon:'usetime',
route:'/administrator/subscriptionPlan',
key:'sub14',
isShow:true,
}]
}
const schoolOrEnterprise = (t) =>{

View File

@@ -132,375 +132,382 @@ axios.interceptors.response.use((res) =>{
export const Https = {
httpUrls: {
interfaceUrl: '',
parseGoogleCredential:'/api/third/party/parseGoogleCredential',//谷歌登录注册
parseWeChatCode:'/api/third/party/parseWeChatCode',//微信登录
accountIsLogin:'/api/account/isLogin', //判断用户是否登录
accountLogin:`/api/account/login`, //账号密码登录接口
organizationNameSearch:`/api/account/organizationNameSearch`, //查询学校或者企业版名字
getUserLanguage:`/api/account/getUserLanguage`, //获取当前用户语言
changeUserLanguage:`/api/account/changeUserLanguage`, //切换用户当前语言
uploadAvatar:`/api/account/uploadAvatar`, //修改头像
editUserName:`/api/account/editUserName`, //修改用户名
updateUserInfo:`/api/account/updateUserInfo`, //修改国家职业
accountDetail:`/api/account/getAccountDetail`, //用户详细信息
parseGoogleCredential: '/api/third/party/parseGoogleCredential', //谷歌登录注册
parseWeChatCode: '/api/third/party/parseWeChatCode', //微信登录
accountIsLogin: '/api/account/isLogin', //判断用户是否登录
accountLogin: `/api/account/login`, //账号密码登录接口
organizationNameSearch: `/api/account/organizationNameSearch`, //查询学校或者企业版名字
getUserLanguage: `/api/account/getUserLanguage`, //获取当前用户语言
changeUserLanguage: `/api/account/changeUserLanguage`, //切换用户当前语言
uploadAvatar: `/api/account/uploadAvatar`, //修改头像
editUserName: `/api/account/editUserName`, //修改用户名
updateUserInfo: `/api/account/updateUserInfo`, //修改国家职业
accountDetail: `/api/account/getAccountDetail`, //用户详细信息
trialUserLogout:`/api/account/trialUserLogout`, //试用用户退出登录接口
completeGuidancet:`/api/account/completeGuidance`, //用户指引结束
trialUserLogout: `/api/account/trialUserLogout`, //试用用户退出登录接口
completeGuidancet: `/api/account/completeGuidance`, //用户指引结束
getExpiredTime:`/api/account/getExpiredTime`, //获取用户到期时间
getExpiredTime: `/api/account/getExpiredTime`, //获取用户到期时间
addNoLoginRequired:`/api/third/party/addNoLoginRequired`, //机房用户注册
deleteNoLoginRequired:`/api/third/party/deleteNoLoginRequired`, //机房用户注销
noLoginRequired:`api/account/noLoginRequired`, //机房用户登录
existNoLoginRequired:`/api/third/party/existNoLoginRequired`, //获取唯一标识是否存在
addNoLoginRequired: `/api/third/party/addNoLoginRequired`, //机房用户注册
deleteNoLoginRequired: `/api/third/party/deleteNoLoginRequired`, //机房用户注销
noLoginRequired: `api/account/noLoginRequired`, //机房用户登录
existNoLoginRequired: `/api/third/party/existNoLoginRequired`, //获取唯一标识是否存在
deleteNoLoginRequiredNew:`/api/third/party/deleteNoLoginRequiredNew`, //机房用户注销
addNoLoginRequiredNew:`api/third/party/addNoLoginRequiredNew`, //机房用户注册
updateNoLoginRequiredNew:`api/third/party/updateNoLoginRequiredNew`, //机房用户更新
deleteNoLoginRequiredNew: `/api/third/party/deleteNoLoginRequiredNew`, //机房用户注销
addNoLoginRequiredNew: `api/third/party/addNoLoginRequiredNew`, //机房用户注册
updateNoLoginRequiredNew: `api/third/party/updateNoLoginRequiredNew`, //机房用户更新
endpoint:`api/third/party/your-secured-endpoint`, //获取唯一标识是否存在
endpoint: `api/third/party/your-secured-endpoint`, //获取唯一标识是否存在
designWorksRegister: '/api/account/designWorksRegister', //注册
designWorksRegisterCode: '/api/account/designWorksRegisterCode', //注册
designWorksRegister:'/api/account/designWorksRegister', //注册
designWorksRegisterCode:'/api/account/designWorksRegisterCode', //注册
preLogin: '/api/account/preLogin', //预先登入
schoolLogin: '/api/account/schoolLogin', //学校管理员登录
enterpriseLogin: '/api/account/enterpriseLogin', //企业管理员登录
accountSendEmail: `/api/account/sendEmail`, //发送邮件
accountResetPwd: '/api/account/resetPwd', //忘记密码修改
accountLogout: '/api/account/logout', //登出
accountBindEmail: '/api/account/bindEmail', //绑定邮箱
bindGoogle: '/api/account/bindGoogle', //绑定谷歌
bindWeChat: '/api/account/bindWeChat', //绑定微信
unbindGoogle: `/api/account/unbindGoogle`, //取消绑定谷歌
unbindWeChat: '/api/account/unbindWeChat', //取消绑定微信
elementGeneratePrint: '/api/element/generatePrint', //生成印花
elementSavePrint: '/api/element/savePrint', //保存印花
getRgbByTcx: '/api/element/getRgbByTcx', // 通过hsv值获取潘通信息
getRgbByHsv: '/api/element/getRgbByHsv', //通过hsv值获取潘通信息
elementDelete: '/api/element/delete', //删除上传的图片
designCollection: `/api/design/designCollection`, //设计 Conllection
reDesignCollection: `/api/design/reDesignCollection`, //重新设计 Conllection
countDesignProcess: '/api/design/countDesignProcess', //统计design进度
getDesignResult: '/api/design/getDesignResult', //查询design结果
designSort: `/api/design/sort`, //design排序
collectionLikeUpdate: `/api/history/collectionLikeUpdate`, //赋值排序
preLogin:'/api/account/preLogin',//预先登入
schoolLogin:'/api/account/schoolLogin',//学校管理员登录
enterpriseLogin:'/api/account/enterpriseLogin',//企业管理员登录
accountSendEmail:`/api/account/sendEmail`, //发送邮件
accountResetPwd:'/api/account/resetPwd', //忘记密码修改
accountLogout:'/api/account/logout',//登出
accountBindEmail:'/api/account/bindEmail', //绑定邮箱
bindGoogle:'/api/account/bindGoogle', //绑定谷歌
bindWeChat:'/api/account/bindWeChat', //绑定微信
unbindGoogle:`/api/account/unbindGoogle`, //取消绑定谷歌
unbindWeChat:'/api/account/unbindWeChat', //取消绑定微信
elementGeneratePrint:'/api/element/generatePrint', //生成印花
elementSavePrint:'/api/element/savePrint',//保存印花
getRgbByTcx:'/api/element/getRgbByTcx', // 通过hsv值获取潘通信息
getRgbByHsv:'/api/element/getRgbByHsv', //通过hsv值获取潘通信息
elementDelete:'/api/element/delete', //删除上传的图片
designCollection:`/api/design/designCollection`, //设计 Conllection
reDesignCollection:`/api/design/reDesignCollection`,//重新设计 Conllection
countDesignProcess:'/api/design/countDesignProcess', //统计design进度
getDesignResult:'/api/design/getDesignResult', //查询design结果
designSort:`/api/design/sort`, //design排序
collectionLikeUpdate:`/api/history/collectionLikeUpdate`, //赋值排序
designProcess:`/api/design/designProcess`, //统计design进度
designGetModel:`/api/design/getModel`, //导出获取模特链接
designProcess: `/api/design/designProcess`, //统计design进度
designGetModel: `/api/design/getModel`, //导出获取模特链接
//充值相关
productList:`/api/product/list`, //获取商品列表
payAlipay:`/api/ali-pay/trade/page/pay`, //支付宝确认支付
payAlipayHK:`/api/alipay-hk/createOrder`, //香港支付宝确认支付
payStripe:`/api/stripe/createOrder`, //Stripe支付
payPaypal:`/api/paypal/trade`, //paypal确认支付
getCredits:`/api/credits/getCredits`, //查询用户积分
productList: `/api/product/list`, //获取商品列表
payAlipay: `/api/ali-pay/trade/page/pay`, //支付宝确认支付
payAlipayHK: `/api/alipay-hk/createOrder`, //香港支付宝确认支付
payStripe: `/api/stripe/createOrder`, //Stripe支付
payPaypal: `/api/paypal/trade`, //paypal确认支付
getCredits: `/api/credits/getCredits`, //查询用户积分
cancelSubscription:`/api/stripe/cancelSubscription`, //取消订阅
cancelSubscription: `/api/stripe/cancelSubscription`, //取消订阅
orderInfoList:`/api/order-info/list`, //查询订单列表
getCreditsDetail:`/api/credits/getCreditsDetail`, //查询积分列表
tradeRefundAlipay:`/api/ali-pay/trade/refund`, //支付宝退款
tradeRefundPaypal:`/api/paypal/trade/refund`, //paypal退款
orderInfoList: `/api/order-info/list`, //查询订单列表
getCreditsDetail: `/api/credits/getCreditsDetail`, //查询积分列表
tradeRefundAlipay: `/api/ali-pay/trade/refund`, //支付宝退款
tradeRefundPaypal: `/api/paypal/trade/refund`, //paypal退款
tradeQuery:`/api/ali-pay/trade/query/{orderNo}`, //查询订单状态
tradeQuery: `/api/ali-pay/trade/query/{orderNo}`, //查询订单状态
getRgbByHsvBatch:`/api/element/getRgbByHsvBatch`, //通过hsv值数组批量获取潘通信息
designLike:`/api/design/like`, //Design Like
getRgbByHsvBatch: `/api/element/getRgbByHsvBatch`, //通过hsv值数组批量获取潘通信息
designLike: `/api/design/like`, //Design Like
designDislike: `/api/design/dislike`, //Design Dislike
queryUserGroup:`/api/history/queryUserGroup`, //History用户分页分组列表
deleteUserGroup:`/api/history/deleteUserGroup`, //History删除用户分组
updateUserGroupName:`/api/history/updateUserGroupName`, //History修改用户分组名
projectSaveOrUpdate:`/api/project/saveOrUpdate`, //History修改用户分组名
historyChoose:`/api/history/choose`, //History choose
getDesignDetail:`/api/design/detail/getDetail`,//查询design详情
addSysSketchToLibrary:`/api/library/addSysSketchToLibrary`,//把系统衣服添加的library
designSingleWithGradient:`/api/design/detail/designSingleWithGradient`,//查询需要更新mask列表
getNextSysElement:'/api/design/detail/getNextSysElement',//切换系统的element
detailPrintDot:'/api/design/detail/printDot',//print打点预览
designSingle:`/api/design/detail/designSingle`,//单个design
queryLibraryPage:`/api/library/queryLibraryPage`,//Library分页列表
libraryUpload:`/api/library/upload`, // Library文件上传
setSketchLibrary:`/api/library/updateLibraryLevel2Type`, // 修改图片类型
updateElementLevel2Type:`/api/element/updateElementLevel2Type`, // 修改拼贴上传的衣服类型
queryUserGroup: `/api/history/queryUserGroup`, //History用户分页分组列表
deleteUserGroup: `/api/history/deleteUserGroup`, //History删除用户分组
updateUserGroupName: `/api/history/updateUserGroupName`, //History修改用户分组名
projectSaveOrUpdate: `/api/project/saveOrUpdate`, //History修改用户分组名
historyChoose: `/api/history/choose`, //History choose
getDesignDetail: `/api/design/detail/getDetail`, //查询design详情
addSysSketchToLibrary: `/api/library/addSysSketchToLibrary`, //把系统衣服添加的library
designSingleWithGradient: `/api/design/detail/designSingleWithGradient`, //查询需要更新mask列表
getNextSysElement: '/api/design/detail/getNextSysElement', //切换系统的element
detailPrintDot: '/api/design/detail/printDot', //print打点预览
designSingle: `/api/design/detail/designSingle`, //单个design
queryLibraryPage: `/api/library/queryLibraryPage`, //Library分页列表
libraryUpload: `/api/library/upload`, // Library文件上传
setSketchLibrary: `/api/library/updateLibraryLevel2Type`, // 修改图片类型
updateElementLevel2Type: `/api/element/updateElementLevel2Type`, // 修改拼贴上传的衣服类型
queryClassification:`/api/classification/queryClassification`,//标签类别查询
classificationSaveOrUpdate:`/api/classification/saveOrUpdate`,//标签类别新增修改
classificationDelete:`/api/classification/delete`,//标签类别新增修改
relationLibrary:`/api/classification/relationLibrary`,//标签类别新增修改
getRelClassificationIdList:`/api/classification/getRelClassificationIdList`,//标签类别新增修改
getRelPublicClassificationIdList:`/api/classification/getRelPublicClassificationIdList`,//多选获取公共标签
editRelPublicClassificationIdList:`/api/classification/editRelPublicClassificationIdList`,//多选修改公共标签
queryClassification: `/api/classification/queryClassification`, //标签类别查询
classificationSaveOrUpdate: `/api/classification/saveOrUpdate`, //标签类别新增修改
classificationDelete: `/api/classification/delete`, //标签类别新增修改
relationLibrary: `/api/classification/relationLibrary`, //标签类别新增修改
getRelClassificationIdList: `/api/classification/getRelClassificationIdList`, //标签类别新增修改
getRelPublicClassificationIdList: `/api/classification/getRelPublicClassificationIdList`, //多选获取公共标签
editRelPublicClassificationIdList: `/api/classification/editRelPublicClassificationIdList`, //多选修改公共标签
//模块化
llmStream:`/api/llm/streamNew`,//聊天
llmStream: `/api/llm/streamNew`, //聊天
// llmStream:`/api/llm/stream`,//聊天
chatCreateProject:`/api/llm/chatCreateProject`,//聊天创建项目
getChatHistory:`/api/llm/getChatHistory`,//获取聊天历史记录
llmUploadFile:`/api/llm/uploadFile`,//聊天上传文件
chatCreateProject: `/api/llm/chatCreateProject`, //聊天创建项目
getChatHistory: `/api/llm/getChatHistory`, //获取聊天历史记录
llmUploadFile: `/api/llm/uploadFile`, //聊天上传文件
saveOrUpdate:`/api/project/saveOrUpdate`,//模块化新增修改
getModuleContent:`/api/project/getModuleContent`,//获取模块内容
saveModuleContent:`/api/project/saveModuleContent`,//储存模块内容
historyProject:`/api/project/page`,//项目记录
projectDetail:`/api/project/delete`,//删除项目
saveOrUpdate: `/api/project/saveOrUpdate`, //模块化新增修改
getModuleContent: `/api/project/getModuleContent`, //获取模块内容
saveModuleContent: `/api/project/saveModuleContent`, //储存模块内容
historyProject: `/api/project/page`, //项目记录
projectDetail: `/api/project/delete`, //删除项目
//3d
threeDPage:`/api/project/threeDPage`,
downloadZip:`/api/project/downloadZip`,//下载zip
getThreeDSize:`/api/project/getThreeDSize`,//下载列表
getLayoutDetail:`/api/project/getLayoutDetail`,//获取3d详情
getThreeDGlb:`/api/project/getThreeDGlb`,
selectHistoryProject:`/api/project/choose`,//选择项目
getMannequinDetail:`/api/project/getMannequinDetail`,//模块化查看模特点位
modifyProportion:`/api/generate/modifyProportion`,//模特拉伸
addSysModelToLib:`/api/library/addSysModelToLib`,
poselikeOrDisike:`/api/generate/likeOrDislike`,//postTransform like
getAllPose:`/api/generate/getAllPose`,//获取动作
threeDPage: `/api/project/threeDPage`,
downloadZip: `/api/project/downloadZip`, //下载zip
getThreeDSize: `/api/project/getThreeDSize`, //下载列表
getLayoutDetail: `/api/project/getLayoutDetail`, //获取3d详情
getThreeDGlb: `/api/project/getThreeDGlb`,
selectHistoryProject: `/api/project/choose`, //选择项目
getMannequinDetail: `/api/project/getMannequinDetail`, //模块化查看模特点位
modifyProportion: `/api/generate/modifyProportion`, //模特拉伸
addSysModelToLib: `/api/library/addSysModelToLib`,
poselikeOrDisike: `/api/generate/likeOrDislike`, //postTransform like
getAllPose: `/api/generate/getAllPose`, //获取动作
//拼贴
genSketchRecon:`/api/generate/genSketchRecon`,
saveReconCanvas:`/api/generate/saveReconCanvas`,
genSketchRecon: `/api/generate/genSketchRecon`,
saveReconCanvas: `/api/generate/saveReconCanvas`,
//动作变换
poseTransform:`/api/generate/poseTransform`,
poseTransformResult:`/api/generate/poseTransformResult`,
poseTransform: `/api/generate/poseTransform`,
poseTransformResult: `/api/generate/poseTransformResult`,
batchUpdateLibraryName:'/api/library/batchUpdateLibraryName',//Library修改用户文件名
batchDeleteLibrary:'/api/library/batchDeleteLibrary',//删除library
queryLibraryTopAndBottomPage:'/api/library/queryLibraryTopAndBottomPage',//Library分页列表(查询top和bottom)
saveOrEditTemplatePoint:'/api/library/saveOrEditTemplatePoint',//保存或者编辑template打点
libraryModelsDot:'/api/library/modelsDot',//Models打点预览
chatStreamTest:`/api/python/chatStream`,//机器人助力
pictureLikeOrUnLike:`/api/python/pictureLikeOrUnLike`,//机器人生成图喜欢
getBloodBars:`/api/python/getBloodBars`,//机器人血条
batchUpdateLibraryName: '/api/library/batchUpdateLibraryName', //Library修改用户文件名
batchDeleteLibrary: '/api/library/batchDeleteLibrary', //删除library
queryLibraryTopAndBottomPage: '/api/library/queryLibraryTopAndBottomPage', //Library分页列表(查询top和bottom)
saveOrEditTemplatePoint: '/api/library/saveOrEditTemplatePoint', //保存或者编辑template打点
libraryModelsDot: '/api/library/modelsDot', //Models打点预览
chatStreamTest: `/api/python/chatStream`, //机器人助力
pictureLikeOrUnLike: `/api/python/pictureLikeOrUnLike`, //机器人生成图喜欢
getBloodBars: `/api/python/getBloodBars`, //机器人血条
//工作空间
workspaceDetail:`/api/workspace/detail`,//用户习惯详情
workspaceenumValues:`/api/workspace/enumValues`,//getSex
workspaceDetail: `/api/workspace/detail`, //用户习惯详情
workspaceenumValues: `/api/workspace/enumValues`, //getSex
workspaceRemove:`/api/workspace/remove`,//删除用户习惯详情
workspacesaveOrUpdate:`/api/workspace/saveOrUpdate`,//修改用户习惯详情
getMannequins:`/api/workspace/getMannequins`,//模特
getStyleList:`/api/workspace/styleList`,//获取所有风格列表
workspaceRemove: `/api/workspace/remove`, //删除用户习惯详情
workspacesaveOrUpdate: `/api/workspace/saveOrUpdate`, //修改用户习惯详情
getMannequins: `/api/workspace/getMannequins`, //模特
getStyleList: `/api/workspace/styleList`, //获取所有风格列表
workspaceList:`/api/workspace/list`,
sketchAndPrintGenerate:'/api/generate/sketchAndPrint',//sketchGenerate生成图片
workspaceList: `/api/workspace/list`,
sketchAndPrintGenerate: '/api/generate/sketchAndPrint', //sketchGenerate生成图片
generatePrepare:'/api/generate/prepare',//开始生成generate图片
generateStopWaiting:'/api/generate/stopWaiting',//取消生成
generateResult:'/api/generate/result',//获取生成结果
generateLike:'/api/generate/like',//喜欢ganerate图片
generateDislike:'/api/generate/dislike',//喜欢ganerate图片
imageToSketch:'/api/generate/imageToSketch',//成品图转为线稿
modifySketch:'/api/generate/modifySketch',//修改画布内容并且储存
generatePrepare: '/api/generate/prepare', //开始生成generate图片
generateStopWaiting: '/api/generate/stopWaiting', //取消生成
generateResult: '/api/generate/result', //获取生成结果
generateLike: '/api/generate/like', //喜欢ganerate图片
generateDislike: '/api/generate/dislike', //喜欢ganerate图片
imageToSketch: '/api/generate/imageToSketch', //成品图转为线稿
modifySketch: '/api/generate/modifySketch', //修改画布内容并且储存
elementUpload:`/api/element/upload`,//上传图片
imageSegmentation:`/api/element/imageSegmentation`,//分割衣服
convertRelightElement:`/api/history/convertRelightElement`,//toproduct复制到上传图片位置
elementUpload: `/api/element/upload`, //上传图片
imageSegmentation: `/api/element/imageSegmentation`, //分割衣服
convertRelightElement: `/api/history/convertRelightElement`, //toproduct复制到上传图片位置
// oldHis:`/oldHis/history/queryUserGroup`,//上传图片
sketchBoardsBoundingBox:`/api/design/sketchBoardsBoundingBox`,//裁剪sketch图片
sketchBoardsBoundingBox: `/api/design/sketchBoardsBoundingBox`, //裁剪sketch图片
trialOrderList:`/api/account/trialOrderList`,//获取审批列表
switchIsAutoApproval:`/api/account/switchIsAutoApproval`,//切换是否自动审批
getIsAutoApproval:`/api/account/getIsAutoApproval`,//获取是否自动审批
trialOrderApproval:`/api/account/trialOrderApproval`,//通过审批
trialOrderRefuse:`/api/account/trialOrderRefuse`,//拒绝审批
trialOrderList: `/api/account/trialOrderList`, //获取审批列表
switchIsAutoApproval: `/api/account/switchIsAutoApproval`, //切换是否自动审批
getIsAutoApproval: `/api/account/getIsAutoApproval`, //获取是否自动审批
trialOrderApproval: `/api/account/trialOrderApproval`, //通过审批
trialOrderRefuse: `/api/account/trialOrderRefuse`, //拒绝审批
//管理员接口
//查询所有试用用户
inquiryGetTrial:`/api/inquiry/getTrial`,//查询所有试用用户
getCities:`/api/inquiry/getCities`,//获取所有付款订单使用的国家
getUserInfo:`/api/inquiry/getUserInfo`,//查询所有用户
queryTransaction:`/api/inquiry/queryTransaction`,//查询交易记录
queryTransactionDownload:`/api/inquiry/queryTransaction/download`,//导出交易记录
createCoupon:`/api/stripe/createCoupon`,//创建优惠码
updatePromCodeInfo:`/api/stripe/updatePromCodeInfo`,//修改优惠码
getAllCoupons:`/api/stripe/getAllCoupons`,//查询优惠码列表
checkCoupon:`/api/stripe/checkCoupon`,//根据优惠码获取结算后的金额
deletePromCode:`/api/stripe/deletePromCode`,//删除优惠券
addOrganization:`/api/inquiry/addOrganization`,//添加企业版或者教育版
queryOrganization:`/api/inquiry/queryOrganization`,//查询企业版或者教育版
inquiryGetTrial: `/api/inquiry/getTrial`, //查询所有试用用户
getCities: `/api/inquiry/getCities`, //获取所有付款订单使用的国家
getUserInfo: `/api/inquiry/getUserInfo`, //查询所有用户
queryTransaction: `/api/inquiry/queryTransaction`, //查询交易记录
queryTransactionDownload: `/api/inquiry/queryTransaction/download`, //导出交易记录
createCoupon: `/api/stripe/createCoupon`, //创建优惠码
updatePromCodeInfo: `/api/stripe/updatePromCodeInfo`, //修改优惠码
getAllCoupons: `/api/stripe/getAllCoupons`, //查询优惠码列表
checkCoupon: `/api/stripe/checkCoupon`, //根据优惠码获取结算后的金额
deletePromCode: `/api/stripe/deletePromCode`, //删除优惠券
addOrganization: `/api/inquiry/addOrganization`, //添加企业版或者教育版
queryOrganization: `/api/inquiry/queryOrganization`, //查询企业版或者教育版
createSubscribePlan: '/api/subscription_plan/createPlan', // 创建订阅计划
deleteSubscribePlan: '/api/subscription_plan/deletePlan', // 删除订阅计划
updateSubscribePlan: '/api/subscription_plan/updatePlan', // 修改订阅计划
searchAllSubscribePlan: '/api/subscription_plan/searchByPage', // 分页查询所有订阅计划
searchSubscribeByOrg: '/api/subscription_plan/searchByOrganizationIdAndStatus', // 不分页查询
switchSubscribePlan: '/api/subscription_plan/switchSubscriptionPlan', // 切换管理员订阅计划
switchSubAccountSubscribePlan: '/api/subscription_plan/switchSubAccSubscriptionPlan', // 切换子账号订阅计划
//云生成
designCloud:`/api/design/designCloud`,//创建云生成
cloudPage:`/api/design/cloudPage`,//创建云生成
cloudTaskDelete:`/api/design/cloudTaskDelete`,//删除云生成
cloudTaskNameUpdate:`/api/design/cloudTaskNameUpdate`,//修改云生成名字
getDesignCloudResult:`/api/design/getDesignCloudResult`,//查询这条云生成记录的所有内容
designCloud: `/api/design/designCloud`, //创建云生成
cloudPage: `/api/design/cloudPage`, //创建云生成
cloudTaskDelete: `/api/design/cloudTaskDelete`, //删除云生成
cloudTaskNameUpdate: `/api/design/cloudTaskNameUpdate`, //修改云生成名字
getDesignCloudResult: `/api/design/getDesignCloudResult`, //查询这条云生成记录的所有内容
//企业版教育版管理员页面
subAccountList:`/api/account/subAccountList`,//查询子账号
addOrUpdateSubAccount:`/api/account/addOrUpdateSubAccount`,//添加子账号
deleteSubAccount:`/api/account/deleteSubAccount`,//删除子账号
subAccountImportExcelDownload:`/api/account/subAccountImportExcelDownload`,//批量添加模板下载模板
exportAccountsToExcel:`/api/account/exportAccountsToExcel`,//教育版导出用户数据
getNextSequence:`/api/project/getNextSequence`,//批量添加模板下载模板
subAccountImport:`/api/account/subAccountImport`,//模板导入
getGenerateFrequency:`/api/inquiry/getGenerateFrequency`,//积分使用详情
getAllGenerateFuncName:`/api/inquiry/getAllGenerateFuncName`,//获取所有generate类型
subAccountList: `/api/account/subAccountList`, //查询子账号
addOrUpdateSubAccount: `/api/account/addOrUpdateSubAccount`, //添加子账号
deleteSubAccount: `/api/account/deleteSubAccount`, //删除子账号
subAccountImportExcelDownload: `/api/account/subAccountImportExcelDownload`, //批量添加模板下载模板
exportAccountsToExcel: `/api/account/exportAccountsToExcel`, //教育版导出用户数据
getNextSequence: `/api/project/getNextSequence`, //批量添加模板下载模板
subAccountImport: `/api/account/subAccountImport`, //模板导入
getGenerateFrequency: `/api/inquiry/getGenerateFrequency`, //积分使用详情
getAllGenerateFuncName: `/api/inquiry/getAllGenerateFuncName`, //获取所有generate类型
//查询某个时间内design点击次数
getDesignStatistic:`/api/inquiry/getDesignStatistic`,//拒绝审批
getAllQuestionnaire:`/api/inquiry/getAllQuestionnaire`,//拒绝审批
getActiveUserFunc:`/api/inquiry/getActiveUserFunc`,//获取各模块功能
toProductImageElementDelete:`/api/history/toProductImageElementDelete`,//删除指定模块上传的内容
recentActiveUser:`/api/inquiry/recentActiveUser`,//获取近期活跃用户
recentActiveUserChart:`/api/inquiry/recentActiveUserChart`,//获取近期活跃用户图表数据
recentNewUser:`/api/inquiry/recentNewUser`,//获取近期新增用户
recentNewUserChart:`/api/inquiry/recentNewUserChart`,//获取新增用户图表
trialUserCountry:`/api/inquiry/trialUserCountry`,//试用用户国家-城市分布
conversionRate:`/api/inquiry/conversionRate`,//试用用户国家-城市分布
getAllUserId:`/api/inquiry/getAllUserId`,//获取所有用户id和Name
adminAddUser:`/api/inquiry/addUser`,//添加用户
modifyUser:`/api/inquiry/modifyUser`,//修改用户
publishSysMessage:`/api/message/publishSysMessage`,//发布系统任务
getDesignStatistic: `/api/inquiry/getDesignStatistic`, //拒绝审批
getAllQuestionnaire: `/api/inquiry/getAllQuestionnaire`, //拒绝审批
getActiveUserFunc: `/api/inquiry/getActiveUserFunc`, //获取各模块功能
toProductImageElementDelete: `/api/history/toProductImageElementDelete`, //删除指定模块上传的内容
recentActiveUser: `/api/inquiry/recentActiveUser`, //获取近期活跃用户
recentActiveUserChart: `/api/inquiry/recentActiveUserChart`, //获取近期活跃用户图表数据
recentNewUser: `/api/inquiry/recentNewUser`, //获取近期新增用户
recentNewUserChart: `/api/inquiry/recentNewUserChart`, //获取新增用户图表
trialUserCountry: `/api/inquiry/trialUserCountry`, //试用用户国家-城市分布
conversionRate: `/api/inquiry/conversionRate`, //试用用户国家-城市分布
getAllUserId: `/api/inquiry/getAllUserId`, //获取所有用户id和Name
adminAddUser: `/api/inquiry/addUser`, //添加用户
modifyUser: `/api/inquiry/modifyUser`, //修改用户
publishSysMessage: `/api/message/publishSysMessage`, //发布系统任务
//affiliate接口
viewsIncrease:`/api/affiliate/viewsIncrease`,//增加访问量
affiliateRegistration:`/api/affiliate/registration`,//affiliate注册
personalCenter:`/api/affiliate/personalCenter`,//affiliate个人中心
affiliateList:`/api/affiliate/list`,//affiliate审批列表
updateCommission:`/api/affiliate/updateCommission`,//编辑佣金比例
editAffiliate:`/api/affiliate/editAffiliate`,//编辑affiliate
getEachAffiliateGeneratedRevenue:`/api/affiliate/getEachAffiliateGeneratedRevenue`,//affiliate每个用户根据日期查询收益
affiliateApproval:`/api/affiliate/approval`,//affiliate同意 审批
getPersonalMonthlyIncome:`/api/affiliate/getPersonalMonthlyIncome`,//affiliate图表接口
getReferrals:`/api/affiliate/getReferrals`,//affiliate Referral列表
editReferral:`/api/affiliate/editReferral`,//affiliate编辑referral
batchDeleteReferral:`/api/affiliate/batchDeleteReferral`,//affiliate删除referral
viewsIncrease: `/api/affiliate/viewsIncrease`, //增加访问量
affiliateRegistration: `/api/affiliate/registration`, //affiliate注册
personalCenter: `/api/affiliate/personalCenter`, //affiliate个人中心
affiliateList: `/api/affiliate/list`, //affiliate审批列表
updateCommission: `/api/affiliate/updateCommission`, //编辑佣金比例
editAffiliate: `/api/affiliate/editAffiliate`, //编辑affiliate
getEachAffiliateGeneratedRevenue: `/api/affiliate/getEachAffiliateGeneratedRevenue`, //affiliate每个用户根据日期查询收益
affiliateApproval: `/api/affiliate/approval`, //affiliate同意 审批
getPersonalMonthlyIncome: `/api/affiliate/getPersonalMonthlyIncome`, //affiliate图表接口
getReferrals: `/api/affiliate/getReferrals`, //affiliate Referral列表
editReferral: `/api/affiliate/editReferral`, //affiliate编辑referral
batchDeleteReferral: `/api/affiliate/batchDeleteReferral`, //affiliate删除referral
// batchDeleteReferral:`/api/affiliate/batchDeleteReferral`,//affiliate删除referral
getTasksList:`/api/tasks/getList`,//获取w为执行完的所有任务
getTasksHistory:`/api/tasks/getAllTask`,//获取所有任务列表
prepareForSR:`/api/python/prepareForSR`,//超分
getTasksList: `/api/tasks/getList`, //获取w为执行完的所有任务
getTasksHistory: `/api/tasks/getAllTask`, //获取所有任务列表
prepareForSR: `/api/python/prepareForSR`, //超分
//作品广场
publish:`/api/portfolio/publish`,//发布作品到作品广场
getPorfolio:`/api/portfolio/page`,//查询作品广场
getPorfolioDetail:`/api/portfolio/detail`,//查询作品广场作品详情
setPorfolioChoose:`/api/portfolio/choose`,//二次创作
portfolioLike:`/api/portfolio/like`,//作品广场点赞
portfolioNoLike:`/api/portfolio/unlike`,//作品广场取消点赞
portfolioComment:`/api/portfolio/comment`,//作品广场评论
portfolioCommentPage:`/api/portfolio/commentPage`,//作品广场评论列表
commentDelete:`/api/portfolio/commentDelete`,//删除评论
porfolioDelete:`/api/portfolio/delete`,//删除作品
porfolioFollow:`/api/portfolio/follow`,//删除作品
porfolioFollow:`/api/portfolio/follow`,//关注
porfolioCancelFollow:`/api/portfolio/cancelFollow`,//取消关注
porfolioGetFolloweeList:`/api/portfolio/getFolloweeList`,//获取关注列表
porfolioGetFollowerList:`/api/portfolio/getFollowerList`,//获取粉丝列表
publish: `/api/portfolio/publish`, //发布作品到作品广场
getPorfolio: `/api/portfolio/page`, //查询作品广场
getPorfolioDetail: `/api/portfolio/detail`, //查询作品广场作品详情
setPorfolioChoose: `/api/portfolio/choose`, //二次创作
portfolioLike: `/api/portfolio/like`, //作品广场点赞
portfolioNoLike: `/api/portfolio/unlike`, //作品广场取消点赞
portfolioComment: `/api/portfolio/comment`, //作品广场评论
portfolioCommentPage: `/api/portfolio/commentPage`, //作品广场评论列表
commentDelete: `/api/portfolio/commentDelete`, //删除评论
porfolioDelete: `/api/portfolio/delete`, //删除作品
porfolioFollow: `/api/portfolio/follow`, //删除作品
porfolioFollow: `/api/portfolio/follow`, //关注
porfolioCancelFollow: `/api/portfolio/cancelFollow`, //取消关注
porfolioGetFolloweeList: `/api/portfolio/getFolloweeList`, //获取关注列表
porfolioGetFollowerList: `/api/portfolio/getFollowerList`, //获取粉丝列表
//product生成
toProduct:`/api/history/toProduct`,//开始生成
toProductImageResult:`/api/history/toProductImageResult`,//获取结果
toProductImageElementUpload:`/api/history/toProductImageElementUpload`,//上传
historyDeleteResult:`/api/history/deleteResult`,//relight toproduct删除
generateDeleteResult:`/api/generate/deleteResult`,//pose删除
toProduct: `/api/history/toProduct`, //开始生成
toProductImageResult: `/api/history/toProductImageResult`, //获取结果
toProductImageElementUpload: `/api/history/toProductImageElementUpload`, //上传
historyDeleteResult: `/api/history/deleteResult`, //relight toproduct删除
generateDeleteResult: `/api/generate/deleteResult`, //pose删除
productImageLike:`/api/history/productImageLike`,//like生成结果
productImageUnLike:`/api/history/productImageUnLike`,//取消like生成结果
productImageLikeList:`/api/history/productImageLikeList`,//like生成结果
productImageLike: `/api/history/productImageLike`, //like生成结果
productImageUnLike: `/api/history/productImageUnLike`, //取消like生成结果
productImageLikeList: `/api/history/productImageLikeList`, //like生成结果
//打光
relight:`/api/history/relight`,//开始生成
relightResult:`/api/history/relightResult`,//开始生成
relight: `/api/history/relight`, //开始生成
relightResult: `/api/history/relightResult`, //开始生成
//保存画布
canvasElementUpload:`/api/history/canvasElementUpload`,//画布上传临时图片
exportSave:`/api/history/exportSave`,//保存画布
exportSearch:`/api/history/exportSearch`,//保存画布
canvasElementUpload: `/api/history/canvasElementUpload`, //画布上传临时图片
exportSave: `/api/history/exportSave`, //保存画布
exportSearch: `/api/history/exportSearch`, //保存画布
//活动
activity:`/api/account/activity`,
activity: `/api/account/activity`,
//bradDNA
brandLogoUpload:`/api/history/brandLogoUpload`,//上传bradDNA
brandDNAGenerate:`/api/history/brandDNAGenerate`,//上传bradDNA
brandDNAUpload:`/api/history/brandDNAUpload`,//上传DNA图片
getInitializeProgress:`/api/history/getInitializeProgress`,//获取brand进度
brandDNADelete:`/api/history/brandDNADelete`,//删除brandDna
brandLogoUpload: `/api/history/brandLogoUpload`, //上传bradDNA
brandDNAGenerate: `/api/history/brandDNAGenerate`, //上传bradDNA
brandDNAUpload: `/api/history/brandDNAUpload`, //上传DNA图片
getInitializeProgress: `/api/history/getInitializeProgress`, //获取brand进度
brandDNADelete: `/api/history/brandDNADelete`, //删除brandDna
brandDNAPage:`/api/history/brandDNAPage`,//brand列表
brandDNASaveOrUpdate:`/api/history/brandDNASaveOrUpdate`,//提交个人信息
productImageInitialize:`/api/history/productImageInitialize`,//产品识别
brandDNAPage: `/api/history/brandDNAPage`, //brand列表
brandDNASaveOrUpdate: `/api/history/brandDNASaveOrUpdate`, //提交个人信息
productImageInitialize: `/api/history/productImageInitialize`, //产品识别
//调查问卷
questionnaire:`/api/account/questionnaire`,//保存画布
questionnaire: `/api/account/questionnaire`, //保存画布
//消息系统
getUnreadCount:`/api/message/getUnreadCount`,//获取未读消息
setReadStatus:`/api/message/setReadStatus`,//设置消息已读
getHistoryNotification:`/api/message/getHistoryNotification`,//获取历史消息
oneClickRead:`/api/message/oneClickRead`,//全部设为已读
personalHomepage:`/api/account/personalHomepage`,//获取个人主页信息
refreshMinioUrl:`/api/third/party/refreshMinioUrl`,//获取可以使用的minio地址
getUnreadCount: `/api/message/getUnreadCount`, //获取未读消息
setReadStatus: `/api/message/setReadStatus`, //设置消息已读
getHistoryNotification: `/api/message/getHistoryNotification`, //获取历史消息
oneClickRead: `/api/message/oneClickRead`, //全部设为已读
personalHomepage: `/api/account/personalHomepage`, //获取个人主页信息
refreshMinioUrl: `/api/third/party/refreshMinioUrl` //获取可以使用的minio地址
},
axiosGet(url,config) {
axiosGet(url, config) {
return new Promise((resolve, reject) => {
if(isLoginTime && url != '/api/portfolio/page') {
if (isLoginTime && url != '/api/portfolio/page') {
resolve('')
return
}
axios.get(url,config).then(response => {
axios
.get(url, config)
.then(response => {
resolve(response)
}).catch((error) => {
})
.catch(error => {
reject(error)
})
});
})
},
axiosPut(url, data) {
return new Promise((resolve, reject) => {
if(isLoginTime && url != '/api/portfolio/page') {
if (isLoginTime && url != '/api/portfolio/page') {
resolve('')
return
}
axios.put(url, data).then(response => {
axios
.put(url, data)
.then(response => {
resolve(response)
}).catch((error) => {
})
.catch(error => {
reject(error)
})
});
})
},
axiosPost(url, data,config) {
axiosPost(url, data, config) {
return new Promise((resolve, reject) => {
if(isLoginTime && url != '/api/portfolio/page') {
if (isLoginTime && url != '/api/portfolio/page') {
resolve('')
return
}
axios.post(url, data,config).then(response => {
axios
.post(url, data, config)
.then(response => {
resolve(response)
}).catch((error) => {
})
.catch(error => {
reject(error)
})
});
})
},
axiosDelete(url, newData) {
return new Promise((resolve, reject) => {
if(isLoginTime && url != '/api/portfolio/page') {
if (isLoginTime && url != '/api/portfolio/page') {
resolve('')
return
}
axios.delete(url,{data:newData}).then(response => {
axios
.delete(url, { data: newData })
.then(response => {
resolve(response)
}).catch((error) => {
})
.catch(error => {
reject(error)
})
});
},
})
}
}

View File

@@ -17,14 +17,14 @@
mode="inline"
@click="handleClick"
>
<div v-for="(menu) in rootSubmenuKeys" :key="menu.key" >
<a-menu-item :key="menu.key" :name="menu.name" :route="menu.route" v-if="!menu.children">
<div v-for="(menu) in rootSubmenuKeys" :key="`menu-${menu.key}`" >
<a-menu-item :key="`item-${menu.key}`" :name="menu.name" :route="menu.route" v-if="!menu.children">
<template #icon>
<span :class="['icon','iconfont', 'menu_icon', menu.icon]"></span>
</template>
<span class="menu_title" :title="menu.name">{{menu.name}}</span>
</a-menu-item>
<a-sub-menu :key="menu.key" v-else>
<a-sub-menu :key="`sub-${menu.key}`" v-else>
<template #icon>
<span :class="['icon','iconfont', 'menu_icon', menu.icon]"></span>
</template>
@@ -67,7 +67,7 @@
<script lang="ts">
import { LoadingOutlined } from "@ant-design/icons-vue";
import { message, Upload } from "ant-design-vue";
import { defineComponent, onMounted, h, ref, nextTick, computed,reactive, toRefs, onBeforeMount } from "vue";
import { defineComponent, onMounted, h, ref, nextTick, computed,reactive, toRefs, onBeforeMount, watch } from "vue";
import { MailOutlined, AppstoreOutlined, SettingOutlined } from '@ant-design/icons-vue';
import { Https } from "@/tool/https";
import { useStore } from "vuex";
@@ -102,11 +102,38 @@ export default defineComponent({
// 5,7
rootSubmenuKeys: [],
openKeys: [],
selectedKeys: ['sub1'],
selectedKeys: [],
nowPageName:'All User',//当前页面名称
});
let routers:any = ref([])
const syncMenuStatus = (path:string)=>{
if(!state.rootSubmenuKeys.length)return
let matched = false
state.rootSubmenuKeys.some((item:any)=>{
if(item.children){
const target = item.children.find((child:any)=>child.route === path)
if(target){
state.selectedKeys = [target.key]
state.openKeys = [`sub-${item.key}`]
state.nowPageName = target.name
matched = true
return true
}
}else if(item.route === path){
state.selectedKeys = [`item-${item.key}`]
state.openKeys = []
state.nowPageName = item.name
matched = true
return true
}
return false
})
if(!matched){
state.selectedKeys = []
}
}
const onOpenChange = (openKeys: string[]) => {
const latestOpenKey:any = openKeys.find(key => state.openKeys.indexOf(key) === -1);
@@ -150,24 +177,12 @@ export default defineComponent({
state.rootSubmenuKeys = adminRouter.all(t);
}
const route = router.currentRoute.value
if(state.rootSubmenuKeys.some((item:any) => item.route === route.path) || route.path == "/administrator"){
const isMenuRoute = state.rootSubmenuKeys.some((item:any) => item.route === route.path || item.children?.some((child:any)=>child.route === route.path))
// 如果是管理员首页或未匹配菜单,才重定向到首个菜单;否则保持当前路由,避免刷新回到 allUser
if (route.path === "/administrator" || !isMenuRoute) {
router.push(state.rootSubmenuKeys[0].route)
}else{
router.push('/administrator')
}
// state.rootSubmenuKeys.forEach((item:any) => {
// if(item.children){
// item.children.forEach((item:any) => {
// if(item.route == router.currentRoute.value.path){
// state.selectedKeys[0] = item.key
// }
// });
// }else{
// if(item.route == router.currentRoute.value.path){
// state.selectedKeys[0] = item.key
// }
// }
// });
syncMenuStatus(router.currentRoute.value.path)
//储存所有用户id和name
Https.axiosGet(Https.httpUrls.getAllUserId,).then((rv: any) => {
if (rv) {
@@ -192,8 +207,11 @@ export default defineComponent({
// router.push(state.rootSubmenuKeys[0].route)
})
watch(()=>router.currentRoute.value.path,(path)=>{
syncMenuStatus(path)
},{immediate:true})
onBeforeMount(()=>{
state.selectedKeys = ['sub1']
state.selectedKeys = []
})
return {
...toRefs(state),

View File

@@ -393,6 +393,27 @@
<span class="fi fi-rr-book-user"></span>
<span class="select_item_des">{{ $t('Header.Tutorial') }}</span>
</div>
<div class="select_item logo">
<a href="https://www.tiktok.com/@aida_codecreate" target="_blank" >
<img src="@/assets/images/socialMediaLogo/tikTokIcon.svg" alt="">
</a>
<a href="https://www.facebook.com/CodeCreateAI" target="_blank" >
<img src="@/assets/images/socialMediaLogo/faceBookIcon.svg" alt="">
</a>
<a href="https://www.youtube.com/@AiDA-3.1" target="_blank" >
<img src="@/assets/images/socialMediaLogo/socialIcons.svg" alt="">
</a>
<a href="https://www.linkedin.com/company/code-create-limited" target="_blank" >
<img src="@/assets/images/socialMediaLogo/linkedinIcon.svg" alt="">
</a>
<a href="https://xhslink.com/m/5Ony2FapizV" target="_blank" >
<img src="@/assets/images/socialMediaLogo/xiaoHongShuIcon.svg" alt="">
</a>
<a href="https://space.bilibili.com/3546717609789876?spm_id_from=333.788.upinfo.head.click" target="_blank" >
<img src="@/assets/images/socialMediaLogo/biliBliIcon.svg" alt="">
</a>
</div>
<div class="select_item_long"></div>
<div class="select_item" @click="logout()">
<span class="icon iconfont icon-tuichu"></span>
@@ -406,11 +427,12 @@
<div class="userSystem" v-show="pastDuePage">
{{ $t('Header.pastDue') }}
</div>
<div class="router" v-if="!getLangIsShowMark">
<div class="router" v-if="!dataLoading">
<home
ref="home"
@setNewProject="() => (leftShow = true)"
@setTask="setTask"
:key="userDetail.language"
></home>
</div>
</div>
@@ -421,10 +443,10 @@
<UpgradePlan ref="UpgradePlan"></UpgradePlan>
<TaskPage ref="TaskPage"></TaskPage>
<div class="mark_loading" v-show="getLangIsShowMark">
<div class="mark_loading" v-show="dataLoading">
<a-spin size="large" />
</div>
<!-- <RobotAssist v-if="!getLangIsShowMark"></RobotAssist> -->
<!-- <RobotAssist v-if="!loading"></RobotAssist> -->
<scaleVideo ref="scaleVideo"></scaleVideo>
<!-- 进行续订 -->
<renew ref="renew"></renew>
@@ -576,6 +598,10 @@ export default defineComponent({
() => route.query,
(query, oldQuery) => {
nextTick(async () => {
if ((route.params?.id || query?.history) && !(await getIdExistToHistory())) {
router.push('/home')
return
}
const key = Object.keys(query)?.[0]
if (key) {
if (query.id && !query.tools) {
@@ -635,7 +661,7 @@ export default defineComponent({
})
let activeCredits = ref(false)
let getLangIsShowMark = ref(true)
let dataLoading = computed(() => (store.state.dataLoading))
let messageNum = computed(() => {
return store.state.UserHabit.messageSystem.messageNum
})
@@ -1049,7 +1075,7 @@ export default defineComponent({
isMurmur,
credits,
activeCredits,
getLangIsShowMark,
dataLoading,
messageNum,
messageType,
...toRefs(stateList),
@@ -1107,11 +1133,11 @@ export default defineComponent({
this.store
.dispatch('getLangType')
.then(() => {
this.getLangIsShowMark = false
this.store.commit('set_dataLoading', false)
resolve()
})
.catch(() => {
this.getLangIsShowMark = false
this.store.commit('set_dataLoading', false)
reject()
})
})
@@ -1127,7 +1153,21 @@ export default defineComponent({
document.addEventListener('click', this.operateClick)
}
this.getCredits()
this.getLang('')
// 获取用户语言并检查是否需要与 localStorage 中的 loginLanguage 同步
this.getLang('').then(userLanguage => {
// 检查 localStorage 中的 loginLanguage
const loginLanguage = localStorage.getItem('loginLanguage')
if (loginLanguage && userLanguage && loginLanguage !== userLanguage) {
// 如果 loginLanguage 与用户当前语言不同,则更新用户语言
this.setLocale(loginLanguage)
}
}).catch(() => {
// 如果获取用户语言失败,也检查 localStorage
const loginLanguage = localStorage.getItem('loginLanguage')
if (loginLanguage && loginLanguage !== this.locale) {
this.setLocale(loginLanguage)
}
})
//语言适配
let tl1 = gsap.timeline({ paused: true })
@@ -1289,15 +1329,17 @@ export default defineComponent({
//获取当前语言
getLang(v) {
let data
Https.axiosPost(Https.httpUrls.getUserLanguage, data).then(rv => {
return Https.axiosPost(Https.httpUrls.getUserLanguage, data).then(rv => {
if (rv) {
this.locale = rv
setLang(rv)
return rv
}
return null
})
},
setLang(v) {
this.getLangIsShowMark = true
this.store.commit('set_dataLoading', true)
Https.axiosGet(Https.httpUrls.changeUserLanguage, { params: { language: v } })
.then(rv => {
if (rv) {
@@ -1314,15 +1356,19 @@ export default defineComponent({
window.location.reload()
// window.location.href = '/home';
}
this.getLangIsShowMark = false
this.store.commit('set_dataLoading', false)
}
})
.catch(() => {
this.getLangIsShowMark = false
this.store.commit('set_dataLoading', false)
})
},
setLocale(v) {
// 同步更新 localStorage 中的 loginLanguage
if (v) {
localStorage.setItem('loginLanguage', v)
}
this.setLang(v)
},
openTask(data) {
@@ -1993,6 +2039,24 @@ export default defineComponent({
font-size: 1.6rem;
margin-left: 1rem;
font-weight: 500;
}
}
.logo{
padding: 1rem 0.5rem;
gap: 1.8rem;
cursor: auto;
justify-content: center;
> a{
width: auto;
height: 2.4rem;
overflow: hidden;
display: flex;
> img{
height: 100%;
}
}
&:hover {
background: #fff;
}
}
.select_item_long {

View File

@@ -6,23 +6,34 @@
@click="turnToNewPage('/')"
src="@/assets/images/homePage/aidaIcon.png"
/>
<div class="gallery_btn login white" @click="setLogin">Login</div>
<div class="gallery_btn" @click="signUp">Sign up</div>
<div class="gallery_btn login white" @click="setLogin">{{ t('Login.Login') }}</div>
<div class="gallery_btn" @click="signUp">{{ t('Login.SignUp') }}</div>
<div class="language_btn">
<div @click="handleChangeLanguage">
<i class="fi fi-rr-globe"></i>
{{ isChinese ? 'CN' : 'EN' }}
</div>
</div>
</div>
<div class="content">
<img class="bg pc" src="@/assets/images/homePage/squareBg.png" alt="">
<img class="bg mobile" src="@/assets/images/homePage/squareBgMobile.png" alt="">
<div class="beForm">Developed by AiDLab<br />
Commercialized by Code-Create</div>
<img class="bg pc" src="@/assets/images/homePage/squareBg.png" alt="" />
<img class="bg mobile" src="@/assets/images/homePage/squareBgMobile.png" alt="" />
<div class="beForm">
Developed by AiDLab
<br />
Commercialized by Code-Create
</div>
<div class="title">
<img src="@/assets/images/homePage/recommendtitleMobile.png" alt="">
<img src="@/assets/images/homePage/recommendtitleMobile.png" alt="" />
<div class="text">
AI-based Interactive Design <br />Assistant for Fashion
AI-based Interactive Design
<br />
Assistant for Fashion
</div>
</div>
<div class="learnMore">
<img src="@/assets/images/homePage/learnMore.png" alt="">
<img src="@/assets/images/homePage/learnMore.png" alt="" />
<!-- <div class="title">AiDA</div>
<div class="info">
AI-based Interactive Design Assistant for Fashion
@@ -32,67 +43,89 @@
</div>
</div>
</template>
<script >
import { defineComponent, toRefs, reactive, ref , nextTick,computed, onMounted, onBeforeUnmount } from "vue";
import { isEmail } from "@/tool/util";
import { setCookie, getCookie, WriteCookie,clonAllCookie } from "@/tool/cookie";
import { Https } from "@/tool/https";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import { useStore } from "vuex";
import { setLang } from "@/tool/guide";
import { useI18n } from "vue-i18n";
import { useRouter } from 'vue-router';
import { gsap, TweenMax } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
<script>
import {
defineComponent,
toRefs,
reactive,
ref,
nextTick,
computed,
onMounted,
onBeforeUnmount
} from 'vue'
import { isEmail } from '@/tool/util'
import { setCookie, getCookie, WriteCookie, clonAllCookie } from '@/tool/cookie'
import { Https } from '@/tool/https'
import { Modal, message } from 'ant-design-vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { useStore } from 'vuex'
import { setLang } from '@/tool/guide'
import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router'
import { gsap, TweenMax } from 'gsap'
import { ScrollTrigger } from 'gsap/ScrollTrigger'
export default defineComponent({
components: {
},
setup(){
const store = useStore();
const router = useRouter();
components: {},
setup() {
const {t, locale} = useI18n()
const store = useStore()
const router = useRouter()
let registerModel = ref()
let data = reactive({
})
let userDetail = computed(()=>{
let data = reactive({})
const isChinese = ref(false)
const handleChangeLanguage = () => {
isChinese.value = !isChinese.value
const lang = isChinese.value ? 'CHINESE_SIMPLIFIED' : 'ENGLISH'
localStorage.setItem('loginLanguage', lang)
locale.value = lang
}
let userDetail = computed(() => {
return store.state.UserHabit.userDetail
})
let setLogin = ()=>{
router.push("/login");
let setLogin = () => {
router.push('/login')
}
let logout = ()=>{
let userInfo = store.state.UserHabit.userDetail;
let logout = () => {
let userInfo = store.state.UserHabit.userDetail
let data = {
userId: userInfo?.userId,
};
userId: userInfo?.userId
}
store.commit('createDetail')
store.commit('createProbject')
if(!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then((rv) => {
clonAllCookie();
});
if (!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then(rv => {
clonAllCookie()
})
}
let goHome = ()=>{
router.push('/home');
let goHome = () => {
router.push('/home')
}
let time
let updataIsMoblie = ()=>{
let updataIsMoblie = () => {
clearTimeout(time)
time = setTimeout(()=>{
},500)
time = setTimeout(() => {}, 500)
}
const signUp = ()=>{
router.push('/register');
const signUp = () => {
router.push('/register')
}
const goLearnMore = ()=>{
window.open('https://www.aida.com.hk/Square/works', '_blank');
const goLearnMore = () => {
window.open('https://www.aida.com.hk/Square/works', '_blank')
}
onMounted(() => {
window.addEventListener('resize', updataIsMoblie)
// 初始化语言设置
const savedLang = localStorage.getItem('loginLanguage')
if (savedLang) {
isChinese.value = savedLang === 'CHINESE_SIMPLIFIED'
locale.value = savedLang
}
onMounted(()=>{
window.addEventListener('resize',updataIsMoblie)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', updataIsMoblie);
});
window.removeEventListener('resize', updataIsMoblie)
})
return {
...toRefs(data),
userDetail,
@@ -102,11 +135,13 @@ export default defineComponent({
goHome,
signUp,
goLearnMore,
isChinese,
handleChangeLanguage,
t
}
},
data() {
return {
};
return {}
},
watch: {
// credits.value(newVal,oldVal){
@@ -151,14 +186,14 @@ export default defineComponent({
},
methods: {
turnToWindow(url) {
window.open(url);
},
},
});
window.open(url)
}
}
})
</script>
<style lang="less" scoped>
.homeRecommend_max{
.homeRecommend_max {
width: 100%;
height: 100%;
display: flex;
@@ -166,91 +201,115 @@ export default defineComponent({
@media (max-width: 768px) {
flex-direction: column;
}
> .header{
> .header {
padding: 3.2rem 4rem;
z-index: 2;
margin-left: auto;
display: flex;
column-gap: 2rem;
align-items: center;
position: absolute;
right: 0;
@media (max-width: 768px) {
position: relative;
justify-content: space-between;
justify-content: flex-end;
width: 100%;
padding: .7rem 1.4rem;
padding: 0.7rem 1.4rem;
margin-left: auto;
background-color: #fff;
}
> .homeRecommend_logo{
> .homeRecommend_logo {
display: none;
@media (max-width: 768px) {
display: block;
height: 2.5rem;
margin-right: auto;
}
}
> .gallery_btn{
margin-right: 2rem;
.language_btn {
color: #fff;
cursor: pointer;
font-size: 2.5rem;
>div {
display: flex;
>i{
display: flex;
align-items: center;
font-size: 2.5rem;
margin-right: .7rem;
}
}
@media (max-width: 768px) {
font-size: 1.5rem;
color: #000;
>div {
>i{
font-size: 1.5rem;
margin-right: .7rem;
}
}
}
}
> .gallery_btn {
// margin-right: 2rem;
border: none;
font-size: 1.7rem;
width: 13rem;
line-height: 6rem;
font-weight: 500;
border-radius: 4rem;
&:last-child{
&:last-child {
margin-right: 0;
}
&.login{
&.login {
@media (max-width: 768px) {
display: none;
}
}
@media (max-width: 768px) {
font-size: .72rem;
font-size: 0.72rem;
width: 5.2rem;
line-height: 2.4rem;
padding: 0;
}
}
}
> .content{
> .content {
flex: 1;
position: relative;
> .bg{
> .bg {
width: 100%;
height: 100%;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
transform: translate(-50%, -50%);
object-fit: cover;
display: none;
&.pc{
&.pc {
@media (min-width: 768px) {
display: block;
}
}
&.mobile{
&.mobile {
@media (max-width: 768px) {
display: block;
}
}
}
> .title{
> .title {
display: none;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
transform: translate(-50%, -50%);
text-align: center;
@media (max-width: 768px) {
margin-top: -2rem;
> img{
> img {
width: 17rem;
}
> .text{
> .text {
width: max-content;
text-align: center;
}
@@ -259,7 +318,7 @@ export default defineComponent({
display: block;
}
}
> .beForm{
> .beForm {
position: absolute;
font-size: 2.1rem;
bottom: 10rem;
@@ -269,19 +328,19 @@ export default defineComponent({
left: 50%;
color: #fff;
bottom: 1rem;
font-size: .8rem;
font-size: 0.8rem;
text-align: center;
transform: translateX(-50%);
}
}
> .learnMore{
> .learnMore {
position: absolute;
bottom: 29rem;
right: 10rem;
width: 53.4rem;
text-align: right;
z-index: 2;
> img{
> img {
height: 19.5rem;
margin-bottom: 2rem;
display: none;
@@ -298,7 +357,7 @@ export default defineComponent({
// font-weight: 400;
// margin-bottom: 2rem;
// }
> .btn{
> .btn {
line-height: 6rem;
width: 18rem;
font-size: 2rem;

View File

@@ -9,7 +9,7 @@
:placeholder="t('batchGeneration.Search')"
@search="searchHistoryList"
/>
<div class="history_table_content" ref="historyTable">
<div class="history_table_content" ref="historyTable" @click.stop>
<a-config-provider :locale="tableLocale">
<a-table
row-class-name="history_table_row"
@@ -28,6 +28,14 @@
}"
>
<template #bodyCell="{ column, text, record, index }">
<div class="update_name" v-if="column?.key === 'collectionName'">
<div v-if="updateName.selectIndex === index">
<input type="text" v-model="updateName.currentName">
</div>
<div v-show="updateName.selectIndex !== index">{{ record.name }}</div>
<i @click="setUpdateName(record.name,index)" v-show="updateName.selectIndex !== index" class="fi fi-rr-edit"></i>
<i @click="submitUpdateName" v-show="updateName.selectIndex === index" class="fi fi-sr-check-circle"></i>
</div>
<div class="operate_list" v-if="column?.Operations">
<div
class="operate_item"
@@ -167,7 +175,7 @@ export default defineComponent({
if (record.text == 1) {
str = useI18n().t('newScaleImage.Original')
} else {
str = `@${record.record.userLikeGroupVO.originalAccountName}/${record.record.userLikeGroupVO.originalPortfolioName}`
str = `@${record.record.originalAccountName}/${record.record.originalPortfolioName}`
}
// let time = formatTime(record.text / 1000, 'YYYY-MM-DD hh:mm:ss')
return str
@@ -213,6 +221,39 @@ export default defineComponent({
selectCode: selectCode,
designType: ''
}
const updateName = ref({
currentName:'',
selectIndex:-1,
})
const clearUpdateName = () => {
updateName.value.currentName = ''
updateName.value.selectIndex = -1
document.removeEventListener('click',clearUpdateName)
}
const setUpdateName = (name,index) => {
updateName.value.currentName = name
updateName.value.selectIndex = index
document.addEventListener('click',clearUpdateName)
}
const submitUpdateName = ()=>{
if(updateName.value.currentName === collectionList.value[updateName.value.selectIndex].name){
clearUpdateName()
return
}
if(updateName.value.selectIndex != -1){
if(!updateName.value.currentName)return message.info(t('HistoryPage.jsContent8'))
let data = {
id: collectionList.value[updateName.value.selectIndex].id, //library名字
name: updateName.value.currentName //history id
}
Https.axiosPost(Https.httpUrls.projectSaveOrUpdate, data)
.then(rv => {
collectionList.value[updateName.value.selectIndex].name = updateName.value.currentName
clearUpdateName()
})
.catch(res => {})
}
}
provide('type', type)
return {
store,
@@ -232,7 +273,10 @@ export default defineComponent({
tableLocale,
projectSetting,
tableSearchBar,
currentProjectPath
currentProjectPath,
updateName,
setUpdateName,
submitUpdateName,
}
},
data() {
@@ -608,6 +652,7 @@ export default defineComponent({
customTableRow(record: any) {
return {
onDblclick: () => {
if(this.updateName.selectIndex !== -1)return
this.retrieveHome(record)
}
}
@@ -726,6 +771,11 @@ export default defineComponent({
}
:deep(.ant-table-tbody > tr:hover) {
background: #ededed;
.update_name{
> .fi-rr-edit{
display: flex;
}
}
}
:deep(.ant-table-tbody > tr > td) {
border: none;
@@ -780,7 +830,26 @@ export default defineComponent({
color: #000;
}
}
.update_name{
display: flex;
align-items: center;
> div{
> input{
width: 12rem;
border-radius: .8rem;
padding-left: 1.5rem;
}
}
> i{
margin-left: 1.5rem;
cursor: pointer;
font-size: 2rem;
display: flex;
}
> .fi-rr-edit{
display: none;
}
}
.operate_list {
display: flex;
align-items: center;
@@ -788,7 +857,7 @@ export default defineComponent({
padding: 0 1rem;
.operate_item {
// font-size: 1.4rem;
font-size: 1.6rem;
font-family: Roboto;
font-weight: 400;
color: #007ee5;

View File

@@ -466,7 +466,7 @@
<div class="content_body_table scroll_style">
<div class="content_img_item" v-for="(img,index) in generateList[selectCode]" :key="img.id" :class="[img.status != 'Success'?'hideEvents':'']"
:draggable="!isGenerate[selectCode]" @dragstart="startDrag($event,index)" @dragover.prevent @drop="drop($event,index)">
<div :class="['content_img_item_block', selectImgList.indexOf(img.id) > -1 ? 'select_item_img' :'']">
<div :class="['content_img_item_block', selectImgList.indexOf(img.id) > -1 ? 'select_item_img' :'',(selectCode == 'Printboard' && img?.imgUrl)?'maskBg':'']">
<!-- <img v-show="img.status != 'Success'" :class="['content_img', ['Moodboard','Printboard'].indexOf(selectCode) > -1 ? 'board_content_img' :'']" src="@/assets/images/homePage/loading.gif" alt=""> -->
<img v-if="img?.imgUrl" :class="['content_img', ['Moodboard','Printboard'].indexOf(selectCode) > -1 ? 'board_content_img' :'']" v-lazy="img.imgUrl">
@@ -1706,6 +1706,14 @@ export default defineComponent({
if(this.selectGenerateList[0].base64){
base64 = this.selectGenerateList[0].imgUrl
}
}else{
if (!this.captionGeneration) {
if (this.selectGenerateList?.[0]?.imgUrl) {
} else {
message.info(this.t('Generate.jsContent5'))
return
}
}
}
let sloganText = ''
@@ -2329,6 +2337,9 @@ export default defineComponent({
flex-direction: column;
align-items: center;
position: relative;
.loading{
position: absolute;
}
&.myBrandItem{
width: calc(100% / 5 - 1rem);
margin: 1rem;
@@ -2383,6 +2394,10 @@ export default defineComponent({
position: relative;
cursor: pointer;
background: #fff;
&.maskBg{
background-image: url("data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23666' fill-opacity='0.4'%3E%3Crect x='20' width='20' height='20'/%3E%3Crect y='20' width='20' height='20'/%3E%3C/g%3E%3C/svg%3E");
background-size: 2rem 2rem; /* 调整图案密度 */
}
&.select_item_img{
// border-color: #000;
opacity: 0.5;

View File

@@ -15,21 +15,21 @@
<div class="Text" v-show="!loginType">
<img src="@/assets/images/homePage/aidaIcon.png" alt="">
<div class="title">
<p>Welcome to <span>AiDA</span></p>
<p>{{ t('Login.Welcome') }} <span>{{ t('Login.AiDA') }}</span></p>
</div>
<div class="info">
AiDA, a first-to-market technology that empowers fashion designers, based on their creative inspirations, to work with AI to create original designs.
{{ t('Login.Slogan') }}
</div>
</div>
<div class="loginBox" :class="{'active':loginType}">
<div class="selectType" v-show="!loginType">
<div class="text">Continue with one of these:</div>
<div class="text">{{ t('Login.LoginMethod') }}</div>
<div class="typeList">
<div class="gallery_btn" @click="setLoginType('personal')">
Individual
{{ t('Login.Individual') }}
</div>
<div class="gallery_btn" @click="setLoginType('school')">
Academic
{{ t('Login.Academic') }}
</div>
<!-- <div class="gallery_btn" @click="setLoginType('enterprise')">
Enterprise
@@ -40,18 +40,15 @@
<div class="title">
<i class="fi fi-br-angle-left" @click="loginBack"></i>
<!-- <i class="fi fi-rr-arrow-left" @click="()=>loginType = ''"></i> -->
<span>Log on to AiDA 3.1</span>
<span>{{ t('Login.LogonToAiDA') }}</span>
</div>
<div class="info" v-show="!loginType">Please fill your information below</div>
<personal ref="personal" v-if="loginType == 'personal'" v-model:isMask="isMask"></personal>
<div class="info" v-show="!loginType">{{ t('Login.Infomation') }}</div>
<personal ref="personal" v-if="loginType == 'personal'"></personal>
<school ref="school" v-if="loginType == 'school'"></school>
<enterprise ref="enterprise" v-if="loginType == 'enterprise'"></enterprise>
</div>
</div>
<div class="mark_loading" v-show="isMask">
<a-spin size="large" />
</div>
</div>
</div>
</template>
@@ -90,12 +87,19 @@ export default defineComponent({
props: {},
emits: [],
setup(props, { emit }) {
const {t,locale} = useI18n()
const store = useStore();
const router = useRouter()
const route = useRoute()
// 通过 provide 传递 i18n 给子组件
provide('i18n', {
t,
locale
})
const loginData = reactive({
loginType: "",
isMask: false,
});
const dataDom = reactive({
personal: null as any,
@@ -137,7 +141,7 @@ export default defineComponent({
store.commit("upUserDetail", userid);
if (window.innerWidth < 768) {
message.info(
"If you need to design, please log in using an iPad or computer."
t('Login.Device')
);
turnToHomePage("/Square");
} else {
@@ -174,6 +178,10 @@ export default defineComponent({
if (data?.state == "weiXin") {
wechatLogin(data);
}
const savedLang = localStorage.getItem('loginLanguage')
if (savedLang) {
locale.value = savedLang
}
})
return {
...toRefs(dataDom),
@@ -181,11 +189,10 @@ export default defineComponent({
setLoginType,
loginBack,
toBack,
t,
locale
};
},
provide() {
return {};
},
});
</script>
<style lang="less" scoped>

View File

@@ -13,7 +13,18 @@
@click="turnToNewPage('https://www.aidlab.hk/en/')"
src="@/assets/images/loginPage/aida_Logo_login.png"
/> -->
<div class="mobile_logo_group" v-if="isMoblie" @click="turnToNewPage('/')">
<img
class="homeRecommend_logo aid"
src="@/assets/images/loginPage/aida_logo.png"
/>
<img
class="homeRecommend_logo code"
src="@/assets/images/loginPage/aida_Logo_login.png"
/>
</div>
<img
v-else
class="homeRecommend_logo"
@click="turnToNewPage('/')"
src="@/assets/images/homePage/aidaIcon.png"
@@ -43,129 +54,155 @@
<div class="homeRecommend_right">
<!-- <div class="homeRecommend_right" v-if="userDetail.systemUser == -1"> -->
<div class="cutLangue">
<div @click="()=>isSelectSuccessively = !isSelectSuccessively">
<div @click="() => (isSelectSuccessively = !isSelectSuccessively)">
<i class="fi fi-rr-globe"></i>
<!-- <a-switch :checked="isSelectSuccessively" @click="()=>isSelectSuccessively = !isSelectSuccessively" checked-children="EN" un-checked-children="CN"/> -->
{{ isSelectSuccessively? 'CN':'EN'}}
{{ isSelectSuccessively ? 'CN' : 'EN' }}
</div>
</div>
<div class="gallery_btn" @click="setLogin">Login</div>
<div class="gallery_btn" @click="setLogin">
{{ isSelectSuccessively ? '登录' : 'Login' }}
</div>
</div>
</header>
<div class="content">
<signUp ref="signUp" :isSelectSuccessively="isSelectSuccessively"></signUp>
</div>
</div>
</template>
<script >
import { defineComponent, toRefs, reactive, ref , nextTick,computed, onMounted, onBeforeUnmount } from "vue";
import { setCookie, getCookie, WriteCookie,clonAllCookie } from "@/tool/cookie";
import { Https } from "@/tool/https";
import { useStore } from "vuex";
import { useRouter } from 'vue-router';
<script>
import {
defineComponent,
toRefs,
reactive,
ref,
nextTick,
computed,
onMounted,
onBeforeUnmount,
watch
} from 'vue'
import { setCookie, getCookie, WriteCookie, clonAllCookie } from '@/tool/cookie'
import { Https } from '@/tool/https'
import { useStore } from 'vuex'
import { useRouter } from 'vue-router'
import signUp from '@/component/mainPage/signUp/index.vue'
export default defineComponent({
components: {
signUp,
signUp
},
setup(){
const store = useStore();
const router = useRouter();
setup() {
const store = useStore()
const router = useRouter()
let data = reactive({
homeRecommendMax:null,
signUp:null,
isSelectSuccessively:false,
homeRecommendMax: null,
signUp: null,
isSelectSuccessively: false
})
let isMoblie = ref(false)
let userDetail = computed(()=>{
let userDetail = computed(() => {
return store.state.UserHabit.userDetail
})
let setLogin = ()=>{
router.push("/login");
let setLogin = () => {
router.push('/login')
}
let logout = ()=>{
let userInfo = store.state.UserHabit.userDetail;
let logout = () => {
let userInfo = store.state.UserHabit.userDetail
let data = {
userId: userInfo?.userId,
};
userId: userInfo?.userId
}
store.commit('createDetail')
store.commit('createProbject')
if(!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then((rv) => {
clonAllCookie();
});
if (!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then(rv => {
clonAllCookie()
})
}
let goHome = ()=>{
router.push('/home');
let goHome = () => {
router.push('/home')
}
let time
let updataIsMoblie = ()=>{
let updataIsMoblie = () => {
clearTimeout(time)
time = setTimeout(()=>{
if(window.innerWidth < 768){
time = setTimeout(() => {
if (window.innerWidth < 768) {
isMoblie.value = true
}else{
} else {
isMoblie.value = false
}
},500)
}, 500)
}
onMounted(()=>{
window.addEventListener('resize',updataIsMoblie)
watch(
() => data.isSelectSuccessively,
val => {
let str = ''
if (val) {
str = 'CHINESE_SIMPLIFIED'
} else {
str = 'ENGLISH'
}
localStorage.setItem('loginLanguage', str)
}
)
onMounted(() => {
updataIsMoblie()
const savedLang = localStorage.getItem('loginLanguage')
if (savedLang) {
data.isSelectSuccessively = savedLang === 'CHINESE_SIMPLIFIED'
}
window.addEventListener('resize', updataIsMoblie)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', updataIsMoblie);
});
window.removeEventListener('resize', updataIsMoblie)
})
return {
...toRefs(data),
userDetail,
setLogin,
logout,
goHome,
isMoblie,
isMoblie
}
},
data() {
return {
};
return {}
},
watch: {
// credits.value(newVal,oldVal){
// console.log(String(newVal).length);
// }
},
mounted() {
},
mounted() {},
methods: {
turnToNewPage(url) {
window.open(url);
window.open(url)
},
turnToWindow(url) {
window.open(url);
},
},
});
window.open(url)
}
}
})
</script>
<style lang="less" scoped>
.homeRecommend_max{
.homeRecommend_max {
position: relative;
display: flex;
height: 100%;
flex-direction: column;
&.openSignUp{
.homeRecommend_heade{
&.openSignUp {
.homeRecommend_heade {
position: relative;
background: #fff !important;
.login_footer_item_text{
.login_footer_item_text {
display: block;
}
}
.homeRecommend_content_adminTop{
.homeRecommend_content_adminTop {
display: none;
}
}
@@ -183,17 +220,17 @@ export default defineComponent({
position: absolute;
align-items: center;
z-index: 2;
border-bottom: 1px solid #DDD;
border-bottom: 1px solid #ddd;
@media (max-width: 768px) {
z-index: 1000;
padding: 1.4rem 2.1rem;
}
.homeRecommend_right{
.homeRecommend_right {
width: 33%;
display: flex;
justify-content: flex-end;
align-items: center;
.gallery_btn{
.gallery_btn {
// color: #000;
// background: #fff;
// border: 2px solid #000;
@@ -205,66 +242,60 @@ export default defineComponent({
padding: 0;
display: none;
}
&.gallery_btn:nth-child(1){
&.gallery_btn:nth-child(1) {
margin-right: 3rem;
@media (max-width: 768px) {
margin-right: 1.8rem;
}
}
}
> .cutLangue{
> .cutLangue {
display: flex;
align-items: center;
margin-right: 4rem;
@media (max-width: 768px) {
margin-right: 2.8rem;
}
> i{
> i {
font-size: 5rem;
}
> div{
> div {
cursor: pointer;
display: flex;
align-items: center;
@media (max-width: 768px) {
font-size: 1.5rem;
}
> i{
> i {
font-size: 3.5rem;
display: flex;
margin-right: 1rem;
@media (max-width: 768px) {
margin-right: .7rem;
margin-right: 0.7rem;
font-size: 2rem;
}
}
}
> button{
> button {
height: 4rem;
min-width: 8rem;
}
> .text{
> .text {
margin-right: 1rem;
}
}
}
.homeRecommend_logo {
// width: 14.4rem;
height: 8rem;
// height: 4rem;
margin-top: 0;
margin-right: 2rem;
@media (max-width: 768px) {
// height: 1.76rem;
height: 4.5rem;
margin-right: .9rem;
margin-right: 0.9rem;
}
// &:last-child{
// margin-right: 2rem;
// }
}
.login_footer_item_text{
.login_footer_item_text {
// margin-left: 5rem;
margin-right: 2rem;
font-size: 1.6rem;
@@ -285,7 +316,23 @@ export default defineComponent({
align-items: center;
position: relative;
height: 3.7rem;
&.marLeft2{
.mobile_logo_group {
display: flex;
align-items: center;
cursor: pointer;
column-gap: 0.9rem;
.homeRecommend_logo {
&.aid {
width: 8rem;
height: 1.75rem;
}
&.code {
width: 5rem;
height: 1.98rem;
}
}
}
&.marLeft2 {
margin-left: 2rem;
}
.username {
@@ -293,14 +340,14 @@ export default defineComponent({
color: #1a1a1a;
margin: 0 0.8rem;
font-weight: 900;
span{
margin: .7rem;
span {
margin: 0.7rem;
}
}
.icon-xiala {
font-size: 1.4rem;
cursor: pointer;
transition: .3s all;
transition: 0.3s all;
}
.icon_rotate {
-moz-transform: rotate(180deg);
@@ -310,6 +357,9 @@ export default defineComponent({
}
}
}
}
.content {
flex: 1;
overflow-y: auto;
}
</style>

View File

@@ -147,11 +147,11 @@ export default defineComponent({
}
});
//储存所有用户id和name
Https.axiosGet(Https.httpUrls.getAllUserId,).then((rv: any) => {
if (rv) {
store.commit('setAllUserList',rv);
}
})
// Https.axiosGet(Https.httpUrls.getAllUserId,).then((rv: any) => {
// if (rv) {
// store.commit('setAllUserList',rv);
// }
// })
let allCountry = country
sessionStorage.setItem('allCountry',JSON.stringify(allCountry));
// state.nowPageName = state.rootSubmenuKeys[0].name