95 Commits

Author SHA1 Message Date
wxd
967996429b 更新 .gitea/workflows/prod_build_schedule.yaml 2026-03-23 10:45:31 +08:00
wxd
f88129f8a9 更新 .gitea/workflows/prod_build_schedule.yaml 2026-03-13 14:02:26 +08:00
wxd
02ccd546bc 更新 .gitea/workflows/prod_build_schedule.yaml 2026-03-06 18:45:13 +08:00
wxd
4006e7f1c1 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m6s
2026-03-05 10:59:08 +08:00
wxd
352f2b7bae 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m22s
2026-03-02 09:52:19 +08:00
wxd
1839bae545 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m25s
2026-02-24 11:38:54 +08:00
wxd
93cb27238b 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 1m54s
2026-02-06 14:18:58 +08:00
wxd
a0de3ce96d 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 1m51s
2026-02-06 10:37:16 +08:00
wxd
989c8468f0 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 2m9s
2026-02-05 16:44:03 +08:00
wxd
f8a864d740 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 1m55s
2026-02-04 15:59:53 +08:00
wxd
afde6d2024 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 2m49s
2026-02-03 09:40:44 +08:00
fe4b39ac97 更新 .gitea/workflows/research_build_manual.yaml 2026-02-02 10:34:19 +08:00
c25e5042dd 上传文件至「.gitea/workflows」 2026-02-02 10:33:11 +08:00
wxd
27849503b3 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 1m56s
2026-01-29 16:56:04 +08:00
wxd
5fdf071510 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 1m48s
2026-01-29 16:32:36 +08:00
wxd
ff3e62506c 更新 .gitea/workflows/prod_build_schedule.yaml 2026-01-29 16:32:27 +08:00
wxd
24accf803d 更新 .gitea/workflows/prod_build_schedule.yaml 2026-01-29 09:55:57 +08:00
wxd
b5dcc80759 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 1m55s
2026-01-28 16:36:56 +08:00
wxd
a294116696 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m8s
2026-01-28 10:06:12 +08:00
wxd
d45f0b0ecd 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 2m1s
2026-01-27 14:18:56 +08:00
wxd
2a522e06a0 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m46s
2026-01-27 10:16:57 +08:00
wxd
af3bff6d80 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 5m20s
2026-01-26 16:45:17 +08:00
wxd
d9d57066fc 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m59s
2026-01-24 11:56:59 +08:00
wxd
e34986d09d 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 2m5s
2026-01-23 22:32:58 +08:00
wxd
57adf91646 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 2m5s
2026-01-23 21:44:02 +08:00
wxd
016c1de922 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m53s
2026-01-23 15:46:05 +08:00
wxd
a167d3f2ba 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m55s
2026-01-21 16:59:55 +08:00
wxd
fb7bf53680 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m47s
2026-01-20 16:49:28 +08:00
wxd
cb453297be 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m55s
2026-01-15 10:52:10 +08:00
wxd
a2f4f946ac 更新 .gitea/workflows/prod_build_schedule.yaml 2026-01-14 17:10:29 +08:00
67d5bb6874 2025.12.19 生产部署
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m35s
2025-12-19 17:47:22 +08:00
db20117500 2025.12.17 生产部署
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 3m32s
2025-12-17 14:03:27 +08:00
f3e4408dc0 更新 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
AiDA WEB-Node.js 生产分支构建部署 / build (18.18.0) (push) Successful in 2m14s
2025-12-16 21:50:38 +08:00
c2d13187f0 2025.12.16 生产部署 2025-12-16 17:24:46 +08:00
7155dedc8d 更新 .gitea/workflows/prod_build_schedule.yaml 2025-12-16 17:23:32 +08:00
de8a6b9dc7 上传文件至「.gitea/workflows」 2025-12-01 17:13:08 +08:00
9c562143da 更新 .gitea/workflows/prod_build_manual.yaml 2025-11-29 00:07:07 +08:00
21fb901580 更新 .gitea/workflows/prod_build_schedule.yaml 2025-11-29 00:06:19 +08:00
29eb464772 更新 .gitea/workflows/prod_build_schedule.yaml
Some checks failed
AiDA WEB-Node.js StableVersion 分支构建部署 / build (18.18.0) (push) Failing after 2m34s
2025-11-28 17:36:57 +08:00
6f5d696c2d 更新 .gitea/workflows/prod_build_schedule.yaml 2025-11-28 17:35:50 +08:00
14a3e467f8 更新 .gitea/workflows/develop_build_commit.yaml 2025-11-28 16:07:40 +08:00
889982f63e Merge branch 'dev_vite' into main 2025-11-28 14:08:06 +08:00
83e66ebb54 添加 .gitea/workflows/prod_build_schedule.yaml 2025-11-28 14:06:26 +08:00
e5f1199c45 添加 .gitea/workflows/prod_build_manual.yaml 2025-11-28 14:06:06 +08:00
a2b9b8423c 添加 .gitea/workflows/develop_build.yaml 2025-11-28 14:05:43 +08:00
b6311a5f6b 添加 .gitea/workflows/develop_build_manual.yaml 2025-11-28 14:05:14 +08:00
7b322ed2b3 删除 .gitea/workflows/develop_build_manual.yaml 2025-11-28 14:04:32 +08:00
9352dff278 删除 .gitea/workflows/dev_vite_build.yaml 2025-11-28 14:04:28 +08:00
0ab41c4ce5 删除 .gitea/workflows/prod_build_manual.yaml 2025-11-28 14:04:22 +08:00
a75df548be 删除 .gitea/workflows/develop_build_manual.yaml 2025-11-28 14:04:19 +08:00
b72cb2c3a2 更新 .gitea/workflows/develop_build_manual.yaml
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署 / build (18.18.0) (push) Has been skipped
2025-11-28 11:43:20 +08:00
245863ad82 更新 .gitea/workflows/develop_build_manual.yaml 2025-11-28 11:42:33 +08:00
af15cd0325 更新 .gitea/workflows/develop_build_manual.yaml 2025-11-28 11:41:59 +08:00
a2a85f1dd0 更新 .gitea/workflows/develop_build_manual.yaml 2025-11-28 11:30:22 +08:00
5d7a3517ee 更新 .gitea/workflows/develop_build_manual.yaml
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署 / build (18.18.0) (push) Has been skipped
2025-11-28 11:30:11 +08:00
c48eb66113 添加 .gitea/workflows/prod_build_manual.yaml 2025-11-28 11:27:34 +08:00
c34397d567 更新 .gitea/workflows/develop_build_manual.yaml
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署 / build (18.18.0) (push) Has been skipped
2025-11-28 11:12:52 +08:00
be4176e4b5 更新 .gitea/workflows/develop_build_manual.yaml 2025-11-28 11:12:22 +08:00
5711fe934e 添加 .gitea/workflows/develop_build_manual.yaml
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署 / build (18.18.0) (push) Has been skipped
2025-11-28 11:11:18 +08:00
b9663ed382 添加 .gitea/workflows/develop_build_manual.yaml 2025-11-28 11:10:14 +08:00
X1627315083
e2fe4f52a4 fix
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署 / build (18.18.0) (push) Has been skipped
2025-11-28 10:54:07 +08:00
X1627315083
5a647fc92a Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署 / build (18.18.0) (push) Has been skipped
2025-11-28 10:50:41 +08:00
X1627315083
a3bf4edeeb 调整订阅页面手机端样式 2025-11-28 10:50:39 +08:00
32327a9244 [run build]
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署 / build (18.18.0) (push) Successful in 1m48s
2025-11-28 10:48:19 +08:00
d586115580 更新 .gitea/workflows/dev_vite_build.yaml
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署123 / build (18.18.0) (push) Has been skipped
2025-11-28 10:37:15 +08:00
011ae1bf52 添加 .gitea/workflows/dev_vite_build.yaml
All checks were successful
AiDA WEB-Node.js Develop 分支构建部署123 / build (18.18.0) (push) Has been skipped
2025-11-28 10:35:20 +08:00
dfb7156fab style: 移动端样式 2025-11-27 13:38:30 +08:00
038cd24cc2 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2025-11-27 11:36:57 +08:00
cc365990e8 style: 文案间距 2025-11-27 11:36:50 +08:00
X1627315083
308bae1d29 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2025-11-27 11:23:36 +08:00
X1627315083
985d602680 悬浮头像新增社媒icon,调整弹窗透明度 2025-11-27 11:23:33 +08:00
d431e0585b style: 价格标签间距 2025-11-27 11:20:52 +08:00
d5e0f98a6d bugfix: 年度订阅按钮 2025-11-27 11:18:26 +08:00
8ba5dd4ffc feat: 注册页语言切换 2025-11-27 10:47:28 +08:00
19d89402dd Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2025-11-27 10:13:59 +08:00
73967c88ca style: 分辨率适配 2025-11-27 10:13:54 +08:00
X1627315083
9e0d1fdc9c history页面新增修改项目名字 2025-11-27 10:10:28 +08:00
b7360d7e71 style: 移动端注册页面顶部logo 2025-11-26 17:08:53 +08:00
0657037748 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2025-11-26 17:00:14 +08:00
f6533e6027 style: 注册页面套餐item样式 2025-11-26 17:00:09 +08:00
X1627315083
7d2463d7c7 修复detail选择颜色bug 2025-11-26 16:59:33 +08:00
X1627315083
41abb2b6ff 调整首页切换语言位置 2025-11-26 16:32:56 +08:00
X1627315083
c71b1cace1 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2025-11-26 16:19:02 +08:00
X1627315083
f79e864faf 取消affiliate页面调用获取所有用户接口 2025-11-26 16:18:59 +08:00
5857a1da8d style: 订阅弹窗样式 2025-11-26 15:54:47 +08:00
3157a7efdf style: 注册页面手机端适配 2025-11-26 14:37:53 +08:00
08c200ef83 feat: 统一注册页面"联系我们"样式,并在打开邮箱失败时复制邮件地址 2025-11-26 13:43:37 +08:00
1ac74cb471 style: 高级工具上传图标样式统一 2025-11-26 13:36:43 +08:00
e88e83fed1 bugfix: editdesignType弹窗编辑产品图的prompt assist弹窗 2025-11-25 17:31:16 +08:00
4df9aaece5 bugfix: design弹窗转产品图/编辑产品图的placeholder 2025-11-25 15:07:27 +08:00
zhangyh
1c264cfbd8 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2025-11-25 14:40:33 +08:00
zhangyh
a81f65a5a7 feat: 二创防止重复点击 2025-11-25 14:05:46 +08:00
X1627315083
0372c0f69d 删除活动页面前两个内容 2025-11-25 13:27:08 +08:00
zhangyh
0ef8b3060c feat: 进入主页同步登录页语言 2025-11-25 13:26:52 +08:00
zhangyh
f906230d65 feat: i18n 2025-11-25 09:59:20 +08:00
38 changed files with 2786 additions and 1715 deletions

View File

@@ -0,0 +1,90 @@
name: git commit 控制 AiDA WEB-Node.js 开发分支构建部署
on:
workflow_dispatch:
push:
branches:
- dev_vite
jobs:
build:
runs-on: ubuntu-latest
if: "contains(github.event.head_commit.message, '[run build]')"
strategy:
matrix:
node-version: [ 18.18.0 ]
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/DevelopVersion/develop-aida-web-front
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: dev_vite
- name: 2.设置 Node.js 环境
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm run build:dev
- run: ls -l
- name: 3.同步文件到远程服务器
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
source: "./dist/*"
target: ${{ env.REMOTE_DEPLOY_PATH }}
ssh_options: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
strip_components: 0
- name: 4. 远程重载 Nginx 配置
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
# 核心:执行 Nginx 重载命令
script: |
echo "尝试重载 Nginx 服务..."
# 💡 注意:执行此命令需要服务器用户具有 sudo 权限,并且配置了 NOPASSWD。
# 否则工作流可能会因为权限不足而失败。
sudo systemctl reload nginx
echo "Nginx 重载命令已发送。"
- name: 5.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -0,0 +1,85 @@
name: 手动触发 AiDA WEB-Node.js 开发分支构建部署
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 18.18.0 ]
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/DevelopVersion/develop-aida-web-front
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: dev_vite
- name: 2.设置 Node.js 环境
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm run build:dev
- run: ls -l
- name: 3.同步文件到远程服务器
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
source: "./dist/*"
target: ${{ env.REMOTE_DEPLOY_PATH }}
ssh_options: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
strip_components: 0
- name: 4. 远程重载 Nginx 配置
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
# 核心:执行 Nginx 重载命令
script: |
echo "尝试重载 Nginx 服务..."
# 💡 注意:执行此命令需要服务器用户具有 sudo 权限,并且配置了 NOPASSWD。
# 否则工作流可能会因为权限不足而失败。
sudo systemctl reload nginx
echo "Nginx 重载命令已发送。"
- name: 5.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -0,0 +1,78 @@
name: AiDA WEB-Node.js 生产分支构建部署
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 18.18.0 ]
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: StableVersion
- name: 2.设置 Node.js 环境
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.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -0,0 +1,81 @@
name: AiDA WEB-Node.js 生产分支构建部署
on:
schedule:
# cron为UTC时区构建时间=部署时间-8小时 {*分 (-8)时 *日 *月 *周} ---
# 示例: 1月1日22点22分触发构建 cron写作 - '22 14 1 1 *'
- cron: '00 14 23 3 *'
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 18.18.0 ]
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: StableVersion
- name: 2.设置 Node.js 环境
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.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA WEB-Node.js 生产分支构建部署
分支: StableVersion
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -0,0 +1,85 @@
name: 手动触发 AiDA WEB-Node.js 开发分支构建部署
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 18.18.0 ]
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/Research/research-aida-web-front
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: research
- name: 2.设置 Node.js 环境
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm run build:dev
- run: ls -l
- name: 3.同步文件到远程服务器
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
source: "./dist/*"
target: ${{ env.REMOTE_DEPLOY_PATH }}
ssh_options: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
strip_components: 0
- name: 4. 远程重载 Nginx 配置
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
# 核心:执行 Nginx 重载命令
script: |
echo "尝试重载 Nginx 服务..."
# 💡 注意:执行此命令需要服务器用户具有 sudo 权限,并且配置了 NOPASSWD。
# 否则工作流可能会因为权限不足而失败。
sudo systemctl reload nginx
echo "Nginx 重载命令已发送。"
- name: 5.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 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,15 +8,7 @@
"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;

View File

@@ -173,6 +173,7 @@ input:focus{
}
.ant-modal-mask{
background-color: #666666;
opacity: .5;
}
.select_block{
height: 4rem;

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

@@ -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

@@ -30,7 +30,7 @@
:outputSize="option.size"
:outputType="option.outputType"
:auto-crop="option.autoCrop"
:fixedBox="!isRound"
:fixedBox="isRound"
:movable="true"
:fixed="isRound"
:auto-crop-width="option.autoCropWidth"
@@ -333,6 +333,7 @@ export default defineComponent({
.cut_picture_review_block{
width: 100%;
height: calc(100% - 6.8rem*1.2);
min-height: calc(100% - 6.8rem*1.2);
margin: 0 auto;
.next_step_button{
margin-top: 2rem;

View File

@@ -679,10 +679,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 +706,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;
}
}
@@ -767,24 +768,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 {
@@ -821,6 +812,8 @@
margin: 2rem 0;
margin-bottom: .5rem;
margin-top: 1rem;
background: #1B223C;
color: #fff;
}
> .payMethod_payAffirm_clause {
text-align: center;

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 = {
@@ -565,7 +564,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) {
@@ -601,7 +600,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 +629,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

@@ -276,7 +276,6 @@ import { Modal,message } from "ant-design-vue";
import { useI18n } from 'vue-i18n';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import fullScreenImg from '@/component/HomePage/fullScreenImg.vue'
import { debounce } from 'lodash-es'
export default defineComponent({
components:{fullScreenImg},
@@ -438,25 +437,35 @@ export default defineComponent({
})
}
let setChoose = debounce(async()=>{
if(userDetail.value.systemList.indexOf(1) == -1){
return message.info(t('newScaleImage.jsContent1'))
}
let flag = true
let setChoose = async()=>{
if(!flag) return
flag = false
try {
if(userDetail.value.systemList.indexOf(1) == -1){
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'))
}
if(imgData.scaleImageData.openSource == 0){
return message.info(t('newScaleImage.jsContent2'))
}
let id = await getWorks(imgData.scaleImageData.id)
router.push(`/home/history/${id}`)
// router.push({name:'home',params: {id:imgData.scaleImageData.id,type:'Works'}})
store.commit('setChooseIsDesign',false)
},300)
const targetDate = new Date('2025-09-01T00:00:00');
// 解析输入日期字符串
const inputDate = new Date(imgData.scaleImageData.createDate);
if(inputDate < targetDate){
message.info(t('newScaleImage.jsContent2'))
return
}
if(imgData.scaleImageData.openSource == 0){
message.info(t('newScaleImage.jsContent2'))
return
}
let id = await getWorks(imgData.scaleImageData.id)
await router.push(`/home/history/${id}`)
store.commit('setChooseIsDesign',false)
} finally {
// 函数执行完成后恢复为 true确保无论成功还是失败都能再次点击
flag = true
}
}
let setCommentReply = (value:any,str:any)=>{
imgData.commentReply.leve1Id = value.id

View File

@@ -711,10 +711,9 @@ export default defineComponent({
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
float: left;
object-fit: contain;
user-select:none;
-webkit-user-drag: none;
// float: left;
// user-select:none;
// -webkit-user-drag: none;
}
}
.wh1{

View File

@@ -145,7 +145,7 @@
</div>
<!-- 取消请求 -->
<scaleImage ref="scaleImage"></scaleImage>
<Cropper ref="Cropper" @handleCropperSuccess="handleCropperSuccess" @closeCropper="deletUploadFile()" :cropperFileData="cropperFileData" :isUpload="isUpload"></Cropper>
<Cropper ref="Cropper" @handleCropperSuccess="handleCropperSuccess" @closeCropper="deletUploadFile()" :cropperFileData="cropperFileData" :isRound="false" :isUpload="isUpload"></Cropper>
</div>
</template>
<script lang="ts">

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

@@ -1250,13 +1250,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 +1534,8 @@ export default defineComponent({
.ant-upload-select-picture-card {
width: 12.7rem;
height: 17.8rem;
border-width: 1px;
background: #fff;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -453,7 +453,8 @@ export default {
jsContent4: '图片必须小于5MB',
jsContent5: '图片已经上传是否继续上传',
jsContent6: '输入的内容超过允许输入的最大长度',
jsContent7: '请输入内容~'
jsContent7: '请输入内容~',
jsContent8: '请输入项目名字~'
},
ModelPlacement: {
Registration: '新增模特',
@@ -1530,5 +1531,114 @@ export default {
ChatRobot: '对话生成',
Yes: '是',
No: '否'
},
Login: {
Login: '登录',
SignUp: '注册',
ForgotPassword: '忘记密码',
Welcome: '欢迎来到',
AiDA: 'AiDA',
Slogan:
'AiDA是一个业界首创的平台致力于赋能时装设计师融汇灵感人机协同共创原创设计。',
LoginMethod: '使用以下方式登录:',
Individual: '个人账号',
Academic: '学术账号',
LogoOnToAiDA: '登录到AiDA 3.1',
Infomation: '请填写以下信息',
Device: '请使用iPad或电脑登录',
AgreePolicies: '请勾选条款、隐私政策和费用',
PasswordConditions: '您必须满足所有密码条件才能注册'
},
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',
@@ -283,7 +298,7 @@ export default {
CopyFiled: 'Failed to copy',
noPrompt: 'Please enter prompt',
OriginalImage: 'Original Image',
EditGarmen: 'You can edit the Model',
EditGarmen: 'You can edit the Model',
EditGarmen2: 'You can edit the Scene',
Background: 'White Background',
BackgroundColor: 'Background with Pure Color',
@@ -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.',
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' // 上传线稿,不带模特
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' // 上传线稿,不带模特
},
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: {
@@ -916,7 +961,8 @@ export default {
Yearly: 'Yearly',
promotionCode: 'Coupon',
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',
@@ -1250,11 +1312,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',
@@ -1389,28 +1453,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:',
@@ -1503,5 +1575,114 @@ export default {
ChatRobot: 'ChatRobot',
Yes: 'Yes',
No: 'No'
},
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.'
},
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

@@ -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" target="_blank" >
<img src="@/assets/images/socialMediaLogo/tikTokIcon.png" alt="">
</a>
<a href="https://www.instagram.com" target="_blank" >
<img src="@/assets/images/socialMediaLogo/instagramIcon.png" alt="">
</a>
<a href="https://www.youtube.com" target="_blank" >
<img src="@/assets/images/socialMediaLogo/youTubeIcon.png" alt="">
</a>
<a href="https://www.xiaohongshu.com" target="_blank" >
<img src="@/assets/images/socialMediaLogo/xiaoHongShuIcon.png" alt="">
</a>
<a href="https://www.zhihu.com" target="_blank" >
<img src="@/assets/images/socialMediaLogo/zhiHuIcon.png" alt="">
</a>
<a href="https://www.bilibili.com/" target="_blank" >
<img src="@/assets/images/socialMediaLogo/biliBliIcon.png" alt="">
</a>
</div>
<div class="select_item_long"></div>
<div class="select_item" @click="logout()">
<span class="icon iconfont icon-tuichu"></span>
@@ -561,7 +582,7 @@ export default defineComponent({
const getIdExistToHistory = async () => {
return await new Promise((resolve, reject) => {
let value = {
id: Number(route.query?.id || route.query?.history)
id: Number(route.params?.id || route.query?.history)
}
Https.axiosPost(Https.httpUrls.historyProject, value)
.then(rv => {
@@ -582,9 +603,9 @@ export default defineComponent({
}
const key = Object.keys(query)?.[0]
if (key) {
if (query.id && !query.tools) {
if (route.params?.id && !query.tools) {
homeMainData.openType = 'history'
homeMainData.openTypeChild = query.id
homeMainData.openTypeChild = route.params?.id
} else {
homeMainData.openType = Object.keys(query)[0]
homeMainData.openTypeChild = query[Object.keys(query)[0]]
@@ -593,10 +614,6 @@ export default defineComponent({
homeMainData.openTypeChild = ''
homeMainData.openType = ''
}
if ((query?.id || query?.history) && !(await getIdExistToHistory())) {
router.push('/home')
return
}
} else {
homeMainData.openType = ''
homeMainData.openTypeChild = ''
@@ -916,12 +933,12 @@ export default defineComponent({
rv.content.forEach((item, index) => {
let str = categorizeDate(item.updateTime) + 'list'
homeMainData.navTypeList.history[str].push(item)
if (item.id == (route.query?.id || route.query?.history)) {
if (item.id == (route.params?.id || route.query?.history)) {
existToHistoryIndex = rv.page * rv.size + index + 1 - rv.size
}
})
homeMainData.historyData.isNull = false
if ((route.query?.id || route.query?.history) && isFound < 1) setScrollTop()
if ((route.params?.id || route.query?.history) && isFound < 1) setScrollTop()
} else {
homeMainData.historyData.isNoData = true
}
@@ -1131,7 +1148,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 })
@@ -1293,11 +1324,13 @@ 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) {
@@ -1327,6 +1360,10 @@ export default defineComponent({
},
setLocale(v) {
// 同步更新 localStorage 中的 loginLanguage
if (v) {
localStorage.setItem('loginLanguage', v)
}
this.setLang(v)
},
openTask(data) {
@@ -1999,6 +2036,25 @@ export default defineComponent({
font-weight: 500;
}
}
.logo{
padding: 1rem 0.5rem;
gap: 1rem;
cursor: auto;
> a{
width: 2.5rem;
height: 2.5rem;
border-radius: .5rem;
overflow: hidden;
display: flex;
> img{
width: 100%;
height: 100%;
}
}
&:hover {
background: #fff;
}
}
.select_item_long {
border-bottom: 1px solid #eceaea;
margin: 2rem 0;

View File

@@ -1,384 +1,443 @@
<template>
<div class="homeRecommend_max">
<div class="header">
<img
class="homeRecommend_logo"
@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>
<div class="homeRecommend_max">
<div class="header">
<img
class="homeRecommend_logo"
@click="turnToNewPage('/')"
src="@/assets/images/homePage/aidaIcon.png"
/>
<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>
<div class="title">
<img src="@/assets/images/homePage/recommendtitleMobile.png" alt="">
<div class="text">
AI-based Interactive Design <br />Assistant for Fashion
</div>
</div>
<div class="learnMore">
<img src="@/assets/images/homePage/learnMore.png" alt="">
<!-- <div class="title">AiDA</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>
<div class="title">
<img src="@/assets/images/homePage/recommendtitleMobile.png" alt="" />
<div class="text">
AI-based Interactive Design
<br />
Assistant for Fashion
</div>
</div>
<div class="learnMore">
<img src="@/assets/images/homePage/learnMore.png" alt="" />
<!-- <div class="title">AiDA</div>
<div class="info">
AI-based Interactive Design Assistant for Fashion
</div> -->
<!-- <div class="btn gallery_btn" @click="goLearnMore">Learn More</div> -->
</div>
</div>
<!-- <div class="btn gallery_btn" @click="goLearnMore">Learn More</div> -->
</div>
</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();
let registerModel = ref()
let data = reactive({
})
let userDetail = computed(()=>{
return store.state.UserHabit.userDetail
})
let setLogin = ()=>{
router.push("/login");
}
let logout = ()=>{
let userInfo = store.state.UserHabit.userDetail;
let data = {
userId: userInfo?.userId,
};
store.commit('createDetail')
store.commit('createProbject')
if(!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then((rv) => {
clonAllCookie();
});
}
let goHome = ()=>{
router.push('/home');
}
let time
let updataIsMoblie = ()=>{
clearTimeout(time)
time = setTimeout(()=>{
},500)
}
const signUp = ()=>{
router.push('/register');
}
const goLearnMore = ()=>{
window.open('https://www.aida.com.hk/Square/works', '_blank');
}
onMounted(()=>{
window.addEventListener('resize',updataIsMoblie)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', updataIsMoblie);
});
return {
...toRefs(data),
userDetail,
setLogin,
registerModel,
logout,
goHome,
signUp,
goLearnMore,
}
},
data() {
return {
};
},
watch: {
// credits.value(newVal,oldVal){
// console.log(String(newVal).length);
// }
},
mounted() {
// nextTick().then(()=>{
// let dom = document.querySelector('.homeRecommend_content_body')
// let codeTween = document.querySelectorAll('.homeRecommend_content_body_recommend .content_body_img')
// let codeTweenText = document.querySelectorAll('.homeRecommend_content_body_recommend .content_body_text')
// for (let index = 0; index < codeTween.length; index++) {
// gsap.from(codeTween[index],.5, {scale:.6 },);
// gsap.registerPlugin(ScrollTrigger);
// let tl1 = gsap.timeline();
// tl1.to(codeTween[index],1, {y:'-30px',opacity:0},)
// ScrollTrigger.create({
// trigger: codeTween[index], // 触发器元素
// start: "top 0%", // 滚动触发器的起始滚动位置
// end: '200% 20%', // 滚动触发器的结束滚动位置
// // markers: true, // 开启标注功能
// scrub: true,
// animation:tl1,
// scroller:dom,//设置指定元素为滚动依据
// scrub:2,
// });
// }
// gsap.registerPlugin(ScrollTrigger);
// let tl1 = gsap.timeline();
// tl1.from(codeTweenText,1, {'margin-top':'30px',opacity:1},)
// ScrollTrigger.create({
// trigger: codeTweenText, // 触发器元素
// start: "top 0%", // 滚动触发器的起始滚动位置
// end: '200% 20%', // 滚动触发器的结束滚动位置
// // markers: true, // 开启标注功能
// scrub: true,
// animation:tl1,
// scroller:dom,//设置指定元素为滚动依据
// scrub:2,
// });
// })
},
methods: {
turnToWindow(url) {
window.open(url);
},
},
});
components: {},
setup() {
const {t, locale} = useI18n()
const store = useStore()
const router = useRouter()
let registerModel = ref()
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 logout = () => {
let userInfo = store.state.UserHabit.userDetail
let data = {
userId: userInfo?.userId
}
store.commit('createDetail')
store.commit('createProbject')
if (!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then(rv => {
clonAllCookie()
})
}
let goHome = () => {
router.push('/home')
}
let time
let updataIsMoblie = () => {
clearTimeout(time)
time = setTimeout(() => {}, 500)
}
const signUp = () => {
router.push('/register')
}
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
}
})
onBeforeUnmount(() => {
window.removeEventListener('resize', updataIsMoblie)
})
return {
...toRefs(data),
userDetail,
setLogin,
registerModel,
logout,
goHome,
signUp,
goLearnMore,
isChinese,
handleChangeLanguage,
t
}
},
data() {
return {}
},
watch: {
// credits.value(newVal,oldVal){
// console.log(String(newVal).length);
// }
},
mounted() {
// nextTick().then(()=>{
// let dom = document.querySelector('.homeRecommend_content_body')
// let codeTween = document.querySelectorAll('.homeRecommend_content_body_recommend .content_body_img')
// let codeTweenText = document.querySelectorAll('.homeRecommend_content_body_recommend .content_body_text')
// for (let index = 0; index < codeTween.length; index++) {
// gsap.from(codeTween[index],.5, {scale:.6 },);
// gsap.registerPlugin(ScrollTrigger);
// let tl1 = gsap.timeline();
// tl1.to(codeTween[index],1, {y:'-30px',opacity:0},)
// ScrollTrigger.create({
// trigger: codeTween[index], // 触发器元素
// start: "top 0%", // 滚动触发器的起始滚动位置
// end: '200% 20%', // 滚动触发器的结束滚动位置
// // markers: true, // 开启标注功能
// scrub: true,
// animation:tl1,
// scroller:dom,//设置指定元素为滚动依据
// scrub:2,
// });
// }
// gsap.registerPlugin(ScrollTrigger);
// let tl1 = gsap.timeline();
// tl1.from(codeTweenText,1, {'margin-top':'30px',opacity:1},)
// ScrollTrigger.create({
// trigger: codeTweenText, // 触发器元素
// start: "top 0%", // 滚动触发器的起始滚动位置
// end: '200% 20%', // 滚动触发器的结束滚动位置
// // markers: true, // 开启标注功能
// scrub: true,
// animation:tl1,
// scroller:dom,//设置指定元素为滚动依据
// scrub:2,
// });
// })
},
methods: {
turnToWindow(url) {
window.open(url)
}
}
})
</script>
<style lang="less" scoped>
.homeRecommend_max{
width: 100%;
height: 100%;
display: flex;
position: relative;
@media (max-width: 768px) {
flex-direction: column;
}
> .header{
padding: 3.2rem 4rem;
z-index: 2;
margin-left: auto;
.homeRecommend_max {
width: 100%;
height: 100%;
display: flex;
position: relative;
@media (max-width: 768px) {
flex-direction: column;
}
> .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: flex-end;
width: 100%;
padding: 0.7rem 1.4rem;
margin-left: auto;
background-color: #fff;
}
> .homeRecommend_logo {
display: none;
@media (max-width: 768px) {
display: block;
height: 2.5rem;
margin-right: auto;
}
}
.language_btn {
color: #fff;
cursor: pointer;
font-size: 2.5rem;
>div {
display: flex;
align-items: center;
position: absolute;
right: 0;
@media (max-width: 768px) {
position: relative;
justify-content: space-between;
width: 100%;
padding: .7rem 1.4rem;
margin-left: auto;
background-color: #fff;
>i{
display: flex;
align-items: center;
font-size: 2.5rem;
margin-right: .7rem;
}
> .homeRecommend_logo{
display: none;
@media (max-width: 768px) {
display: block;
height: 2.5rem;
}
@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{
margin-right: 0;
}
&.login{
@media (max-width: 768px) {
display: none;
}
}
@media (max-width: 768px) {
font-size: .72rem;
width: 5.2rem;
line-height: 2.4rem;
padding: 0;
}
}
}
> .content{
flex: 1;
position: relative;
> .bg{
width: 100%;
height: 100%;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
object-fit: cover;
display: none;
&.pc{
@media (min-width: 768px) {
display: block;
}
}
&.mobile{
@media (max-width: 768px) {
display: block;
}
}
}
> .title{
display: none;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
text-align: center;
@media (max-width: 768px) {
margin-top: -2rem;
> img{
width: 17rem;
}
> .text{
width: max-content;
text-align: center;
}
font-size: 1.8rem;
color: #fff;
display: block;
}
}
> .beForm{
position: absolute;
font-size: 2.1rem;
bottom: 10rem;
left: 10rem;
@media (max-width: 768px) {
display: block;
left: 50%;
color: #fff;
bottom: 1rem;
font-size: .8rem;
text-align: center;
transform: translateX(-50%);
}
}
> .learnMore{
position: absolute;
bottom: 29rem;
right: 10rem;
width: 53.4rem;
text-align: right;
z-index: 2;
> img{
height: 19.5rem;
margin-bottom: 2rem;
display: none;
}
// > .title{
// margin-bottom: .8rem;
// font-size: 11.8rem;
// font-weight: 500;
// }
// > .info{
// font-family: 'pingfang_regular';
// font-size: 2.8rem;
// font-weight: 400;
// margin-bottom: 2rem;
// }
> .btn{
line-height: 6rem;
width: 18rem;
font-size: 2rem;
font-weight: 500;
}
}
// > .left,> .right{
// height: 100%;
// display: flex;
// display: none;
// }
// > .left{
// width: 45%;
// align-items: center;
// justify-content: center;
// position: relative;
// > .logoBox{
// height: 4rem;
// position: absolute;
// left: 2rem;
// top: 2rem;
// img{
// height: 100%;
// margin-left: 2rem;
// }
// .codeCreatelogo{
// cursor: pointer;
// }
// }
// > .text{
// width: 68rem;
// > .title{
// font-size: 6.4rem;
// font-weight: 900;
// line-height: 1.2;
// margin-bottom: 3.2rem;
// p{
// margin-bottom: 0;
// }
// }
// > .info{
// font-size: 2.4rem;
// margin-bottom: 1.6rem;
// line-height: 1.2;
// > span{
// color: #0070c9;
// cursor: pointer;
// &:hover{
// text-decoration: underline;
// }
// }
// }
// > .continue{
// font-size: 2.4rem;
// > i{
// margin-left: 1rem;
// }
// }
// }
// }
// > .right{
// position: relative;
// width: 55%;
// background: #d7d6d5;
// display: flex;
// align-items: center;
// justify-content: flex-end;
// > img{
// object-fit: cover;
// }
// > .model{
// height: 100%;
// position: absolute;
// left: 0;
// }
// > .text{
// height: 45rem;
// text-align: right;
// }
// }
}
}
}
> .gallery_btn {
// margin-right: 2rem;
border: none;
font-size: 1.7rem;
width: 13rem;
line-height: 6rem;
font-weight: 500;
border-radius: 4rem;
&:last-child {
margin-right: 0;
}
&.login {
@media (max-width: 768px) {
display: none;
}
}
@media (max-width: 768px) {
font-size: 0.72rem;
width: 5.2rem;
line-height: 2.4rem;
padding: 0;
}
}
}
> .content {
flex: 1;
position: relative;
> .bg {
width: 100%;
height: 100%;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
object-fit: cover;
display: none;
&.pc {
@media (min-width: 768px) {
display: block;
}
}
&.mobile {
@media (max-width: 768px) {
display: block;
}
}
}
> .title {
display: none;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
text-align: center;
@media (max-width: 768px) {
margin-top: -2rem;
> img {
width: 17rem;
}
> .text {
width: max-content;
text-align: center;
}
font-size: 1.8rem;
color: #fff;
display: block;
}
}
> .beForm {
position: absolute;
font-size: 2.1rem;
bottom: 10rem;
left: 10rem;
@media (max-width: 768px) {
display: block;
left: 50%;
color: #fff;
bottom: 1rem;
font-size: 0.8rem;
text-align: center;
transform: translateX(-50%);
}
}
> .learnMore {
position: absolute;
bottom: 29rem;
right: 10rem;
width: 53.4rem;
text-align: right;
z-index: 2;
> img {
height: 19.5rem;
margin-bottom: 2rem;
display: none;
}
// > .title{
// margin-bottom: .8rem;
// font-size: 11.8rem;
// font-weight: 500;
// }
// > .info{
// font-family: 'pingfang_regular';
// font-size: 2.8rem;
// font-weight: 400;
// margin-bottom: 2rem;
// }
> .btn {
line-height: 6rem;
width: 18rem;
font-size: 2rem;
font-weight: 500;
}
}
// > .left,> .right{
// height: 100%;
// display: flex;
// display: none;
// }
// > .left{
// width: 45%;
// align-items: center;
// justify-content: center;
// position: relative;
// > .logoBox{
// height: 4rem;
// position: absolute;
// left: 2rem;
// top: 2rem;
// img{
// height: 100%;
// margin-left: 2rem;
// }
// .codeCreatelogo{
// cursor: pointer;
// }
// }
// > .text{
// width: 68rem;
// > .title{
// font-size: 6.4rem;
// font-weight: 900;
// line-height: 1.2;
// margin-bottom: 3.2rem;
// p{
// margin-bottom: 0;
// }
// }
// > .info{
// font-size: 2.4rem;
// margin-bottom: 1.6rem;
// line-height: 1.2;
// > span{
// color: #0070c9;
// cursor: pointer;
// &:hover{
// text-decoration: underline;
// }
// }
// }
// > .continue{
// font-size: 2.4rem;
// > i{
// margin-left: 1rem;
// }
// }
// }
// }
// > .right{
// position: relative;
// width: 55%;
// background: #d7d6d5;
// display: flex;
// align-items: center;
// justify-content: flex-end;
// > img{
// object-fit: cover;
// }
// > .model{
// height: 100%;
// position: absolute;
// left: 0;
// }
// > .text{
// height: 45rem;
// text-align: right;
// }
// }
}
}
</style>

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"
@@ -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.6rem;
// font-size: 1.4rem;
font-family: Roboto;
font-weight: 400;
color: #007ee5;

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,9 +40,9 @@
<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>
<div class="info" v-show="!loginType">{{ t('Login.Infomation') }}</div>
<personal ref="personal" v-if="loginType == 'personal'" v-model:isMask="isMask"></personal>
<school ref="school" v-if="loginType == 'school'"></school>
<enterprise ref="enterprise" v-if="loginType == 'enterprise'"></enterprise>
@@ -90,9 +90,17 @@ 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,
@@ -137,7 +145,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 +182,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 +193,10 @@ export default defineComponent({
setLoginType,
loginBack,
toBack,
t,
locale
};
},
provide() {
return {};
},
});
</script>
<style lang="less" scoped>

View File

@@ -1,24 +1,35 @@
<template>
<div class="homeRecommend_max openSignUp">
<header class="homeRecommend_heade">
<div class="homeRecommend_right_content">
<div class="homeRecommend_user_content">
<!-- <img
<div class="homeRecommend_max openSignUp">
<header class="homeRecommend_heade">
<div class="homeRecommend_right_content">
<div class="homeRecommend_user_content">
<!-- <img
class="homeRecommend_logo"
@click="turnToNewPage('https://www.aidlab.hk/en/')"
src="@/assets/images/loginPage/aida_logo.png"
/> -->
<!-- <img
<!-- <img
class="homeRecommend_logo"
@click="turnToNewPage('https://www.aidlab.hk/en/')"
src="@/assets/images/loginPage/aida_Logo_login.png"
/> -->
<img
class="homeRecommend_logo"
@click="turnToNewPage('/')"
src="@/assets/images/homePage/aidaIcon.png"
/>
<!-- <div
<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"
/>
<!-- <div
class="login_footer_item_text"
@click="turnToWindow(
'https://code-create.com.hk/aida-terms-and-conditions/'
@@ -34,282 +45,321 @@
>
Privacy Policy
</div> -->
</div>
</div>
<!-- <div class="homeRecommend_right">
</div>
</div>
<!-- <div class="homeRecommend_right">
<div class="gallery_btn" v-if="userDetail.systemList.indexOf(1) > -1 && !isMoblie" @click="goHome">Home</div>
<div class="gallery_btn white" v-if="userDetail.systemUser != -1" @click="logout">log off</div>
</div> -->
<div class="homeRecommend_right">
<!-- <div class="homeRecommend_right" v-if="userDetail.systemUser == -1"> -->
<div class="cutLangue">
<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'}}
</div>
</div>
<div class="gallery_btn" @click="setLogin">Login</div>
</div>
</header>
<signUp ref="signUp" :isSelectSuccessively="isSelectSuccessively"></signUp>
<div class="homeRecommend_right">
<!-- <div class="homeRecommend_right" v-if="userDetail.systemUser == -1"> -->
<div class="cutLangue">
<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' }}
</div>
</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,
components: {
signUp
},
setup() {
const store = useStore()
const router = useRouter()
let data = reactive({
homeRecommendMax: null,
signUp: null,
isSelectSuccessively: false
})
let isMoblie = ref(false)
let userDetail = computed(() => {
return store.state.UserHabit.userDetail
})
let setLogin = () => {
router.push('/login')
}
let logout = () => {
let userInfo = store.state.UserHabit.userDetail
let data = {
userId: userInfo?.userId
}
store.commit('createDetail')
store.commit('createProbject')
if (!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then(rv => {
clonAllCookie()
})
}
let goHome = () => {
router.push('/home')
}
let time
let updataIsMoblie = () => {
clearTimeout(time)
time = setTimeout(() => {
if (window.innerWidth < 768) {
isMoblie.value = true
} else {
isMoblie.value = false
}
}, 500)
}
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)
})
return {
...toRefs(data),
userDetail,
setLogin,
logout,
goHome,
isMoblie
}
},
data() {
return {}
},
watch: {
// credits.value(newVal,oldVal){
// console.log(String(newVal).length);
// }
},
mounted() {},
methods: {
turnToNewPage(url) {
window.open(url)
},
setup(){
const store = useStore();
const router = useRouter();
let data = reactive({
homeRecommendMax:null,
signUp:null,
isSelectSuccessively:false,
})
let isMoblie = ref(false)
let userDetail = computed(()=>{
return store.state.UserHabit.userDetail
})
let setLogin = ()=>{
router.push("/login");
}
let logout = ()=>{
let userInfo = store.state.UserHabit.userDetail;
let data = {
userId: userInfo?.userId,
};
store.commit('createDetail')
store.commit('createProbject')
if(!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then((rv) => {
clonAllCookie();
});
}
let goHome = ()=>{
router.push('/home');
}
let time
let updataIsMoblie = ()=>{
clearTimeout(time)
time = setTimeout(()=>{
if(window.innerWidth < 768){
isMoblie.value = true
}else{
isMoblie.value = false
}
},500)
}
onMounted(()=>{
window.addEventListener('resize',updataIsMoblie)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', updataIsMoblie);
});
return {
...toRefs(data),
userDetail,
setLogin,
logout,
goHome,
isMoblie,
}
},
data() {
return {
};
},
watch: {
// credits.value(newVal,oldVal){
// console.log(String(newVal).length);
// }
},
mounted() {
},
methods: {
turnToNewPage(url) {
window.open(url);
},
turnToWindow(url) {
window.open(url);
},
},
});
turnToWindow(url) {
window.open(url)
}
}
})
</script>
<style lang="less" scoped>
.homeRecommend_max{
position: relative;
display: flex;
height: 100%;
flex-direction: column;
&.openSignUp{
.homeRecommend_heade{
position: relative;
background: #fff !important;
.login_footer_item_text{
display: block;
}
}
.homeRecommend_content_adminTop{
display: none;
}
}
.homeRecommend_max {
position: relative;
display: flex;
height: 100%;
flex-direction: column;
&.openSignUp {
.homeRecommend_heade {
position: relative;
background: #fff !important;
.login_footer_item_text {
display: block;
}
}
.homeRecommend_content_adminTop {
display: none;
}
}
}
.homeRecommend_heade {
display: flex;
justify-content: space-between;
// padding: 0 30px;
padding: 2rem 4rem;
width: 100%;
// height: 7rem;
flex-shrink: 0;
// background: rgba(255, 255, 255, 0.2);
// border-bottom: 0.1rem solid rgba(3, 3, 3, 0.1);
position: absolute;
align-items: center;
z-index: 2;
border-bottom: 1px solid #ddd;
@media (max-width: 768px) {
z-index: 1000;
padding: 1.4rem 2.1rem;
}
.homeRecommend_right {
width: 33%;
display: flex;
justify-content: space-between;
// padding: 0 30px;
padding: 2rem 4rem;
width: 100%;
// height: 7rem;
flex-shrink: 0;
// background: rgba(255, 255, 255, 0.2);
// border-bottom: 0.1rem solid rgba(3, 3, 3, 0.1);
position: absolute;
justify-content: flex-end;
align-items: center;
z-index: 2;
border-bottom: 1px solid #DDD;
@media (max-width: 768px) {
z-index: 1000;
padding: 1.4rem 2.1rem;
}
.homeRecommend_right{
width: 33%;
display: flex;
justify-content: flex-end;
align-items: center;
.gallery_btn{
// color: #000;
// background: #fff;
// border: 2px solid #000;
// margin-left: 2rem;
width: 13rem;
text-align: center;
@media (max-width: 768px) {
width: 5.2rem;
padding: 0;
display: none;
}
&.gallery_btn:nth-child(1){
margin-right: 3rem;
@media (max-width: 768px) {
margin-right: 1.8rem;
}
}
}
> .cutLangue{
display: flex;
align-items: center;
margin-right: 4rem;
@media (max-width: 768px) {
margin-right: 2.8rem;
}
> i{
font-size: 5rem;
}
> div{
cursor: pointer;
display: flex;
align-items: center;
@media (max-width: 768px) {
font-size: 1.5rem;
}
> i{
font-size: 3.5rem;
display: flex;
margin-right: 1rem;
@media (max-width: 768px) {
margin-right: .7rem;
font-size: 2rem;
}
}
}
> button{
height: 4rem;
min-width: 8rem;
}
> .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;
}
// &:last-child{
// margin-right: 2rem;
// }
}
.login_footer_item_text{
// margin-left: 5rem;
margin-right: 2rem;
font-size: 1.6rem;
text-decoration: underline;
display: none;
cursor: pointer;
}
.homeRecommend_right_content {
top: 0;
left: 0;
display: flex;
width: 40%;
height: 100%;
align-items: center;
overflow: hidden;
.homeRecommend_user_content {
display: flex;
align-items: center;
position: relative;
height: 3.7rem;
&.marLeft2{
margin-left: 2rem;
}
.username {
font-size: 1.8rem;
color: #1a1a1a;
margin: 0 0.8rem;
font-weight: 900;
span{
margin: .7rem;
}
}
.icon-xiala {
font-size: 1.4rem;
cursor: pointer;
transition: .3s all;
}
.icon_rotate {
-moz-transform: rotate(180deg);
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
animation-direction: 0.5s;
}
.gallery_btn {
// color: #000;
// background: #fff;
// border: 2px solid #000;
// margin-left: 2rem;
width: 13rem;
text-align: center;
@media (max-width: 768px) {
width: 5.2rem;
padding: 0;
display: none;
}
&.gallery_btn:nth-child(1) {
margin-right: 3rem;
@media (max-width: 768px) {
margin-right: 1.8rem;
}
}
}
> .cutLangue {
display: flex;
align-items: center;
margin-right: 4rem;
@media (max-width: 768px) {
margin-right: 2.8rem;
}
> i {
font-size: 5rem;
}
> div {
cursor: pointer;
display: flex;
align-items: center;
@media (max-width: 768px) {
font-size: 1.5rem;
}
> i {
font-size: 3.5rem;
display: flex;
margin-right: 1rem;
@media (max-width: 768px) {
margin-right: 0.7rem;
font-size: 2rem;
}
}
}
> button {
height: 4rem;
min-width: 8rem;
}
> .text {
margin-right: 1rem;
}
}
}
.homeRecommend_logo {
height: 8rem;
margin-top: 0;
margin-right: 2rem;
@media (max-width: 768px) {
// height: 1.76rem;
height: 4.5rem;
margin-right: 0.9rem;
}
}
.login_footer_item_text {
// margin-left: 5rem;
margin-right: 2rem;
font-size: 1.6rem;
text-decoration: underline;
display: none;
cursor: pointer;
}
.homeRecommend_right_content {
top: 0;
left: 0;
display: flex;
width: 40%;
height: 100%;
align-items: center;
overflow: hidden;
.homeRecommend_user_content {
display: flex;
align-items: center;
position: relative;
height: 3.7rem;
.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 {
font-size: 1.8rem;
color: #1a1a1a;
margin: 0 0.8rem;
font-weight: 900;
span {
margin: 0.7rem;
}
}
.icon-xiala {
font-size: 1.4rem;
cursor: pointer;
transition: 0.3s all;
}
.icon_rotate {
-moz-transform: rotate(180deg);
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
animation-direction: 0.5s;
}
}
}
}
.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