82 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
22 changed files with 1764 additions and 974 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

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

@@ -168,6 +168,7 @@ li {
} }
.ant-modal-mask { .ant-modal-mask {
background-color: #666666; background-color: #666666;
opacity: 0.5;
} }
.select_block { .select_block {
height: 4rem; height: 4rem;

View File

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

View File

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

View File

@@ -38,7 +38,7 @@
</div> </div>
<div class="style marginBottom" v-if="show.style"> <div class="style marginBottom" v-if="show.style">
<div class="text">{{$t('Habit.Style')}}</div> <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 class="gallery_btn" @click="setStyle">{{ $t('Habit.Select') }}</div>
</div> </div>
<div class="style brand marginBottom"> <div class="style brand marginBottom">

View File

@@ -2,50 +2,94 @@
<div class="signUp"> <div class="signUp">
<div class="selectSignUp" v-show="!isSelectSignUp"> <div class="selectSignUp" v-show="!isSelectSignUp">
<div class="titleTitle">{{ productList.Advantages }}</div> <div class="titleTitle">{{ productList.Advantages }}</div>
<div class="selectMonthlyYearly" :class="[monthlyOrYearly == 'monthly' ? 'left' : 'right']"> <div
class="selectMonthlyYearly"
:class="[monthlyOrYearly == 'monthly' ? 'left' : 'right']"
>
<div class="bg"></div> <div class="bg"></div>
<div class="leftText" @click="setMonthlyOrYearly('monthly')">{{ productList.Monthly }}</div> <div class="leftText" @click="setMonthlyOrYearly('monthly')">
<div class="rightText" @click="setMonthlyOrYearly('yearl')">{{ productList.Yearly }}</div> {{ productList.Monthly }}
</div>
<div class="rightText" @click="setMonthlyOrYearly('yearl')">
{{ productList.Yearly }}
</div>
</div> </div>
<div class="gallery_list product_list"> <div class="gallery_list product_list">
<div class="gallery_item" v-for="item in productList[monthlyOrYearly]" :key="item"> <div
class="gallery_item"
v-for="item in productList[monthlyOrYearly]"
:key="item"
:class="[
{ recommended: item.recommended },
{ monthly: monthlyOrYearly === 'monthly' },
{ yearly: monthlyOrYearly === 'yearl' },
{ academic: item.type === 'academic' }
]"
>
<div class="product_signUp_box"> <div class="product_signUp_box">
<img class="img" :src="item?.img" alt=""> <img class="img" :src="item?.img" alt="" />
<div class="title">{{ item?.title }}</div> <div class="title">{{ item?.title }}</div>
<div class="info" :class="{academic:item.type == 'academic'}">{{ item?.info }}</div> <div class="info" :class="{ academic: item.type == 'academic' }">
{{ item?.info }}
</div>
<div class="price " v-if="item.type != 'academic'"> <div class="price " v-if="item.type != 'academic'">
<div>{{ item?.price }}</div> <div>{{ item?.price }}</div>
<span :class="{yearl:monthlyOrYearly == 'yearl'}">{{ item?.detail }}</span> <span
:class="[
{ yearl: monthlyOrYearly == 'yearl' },
{ personal: item.type === 'personal' }
]"
style="white-space: nowrap;"
>
{{ item?.detail }}
</span>
</div> </div>
<div class="price academic" v-if="item.type == 'academic'"> <div class="price academic" v-if="item.type == 'academic'">
<div>{{ item?.custom }}</div> <div>{{ item?.custom }}</div>
<span style="font-size: 1.4rem;">{{ item?.customInfo }}</span> <span style="font-size: 1.4rem">{{ item?.customInfo }}</span>
</div> </div>
<ul class="product_detail" :class="{'academic':(item.type == 'academic' && !isSelectSuccessively)}"> <ul
class="product_detail"
:class="[
{ academic: item.type == 'academic' && !isSelectSuccessively },
{ chinese: isSelectSuccessively }
]"
>
<li v-for="detailItem in item?.detailList">{{ detailItem }}</li> <li v-for="detailItem in item?.detailList">{{ detailItem }}</li>
</ul> </ul>
<div class="gallery_btn gallery_btn_radius" v-if="item?.btn != 'Contact us' && item?.btn != '联系我们'" @click="createAccount">{{ item?.btn }}</div> <div
<div class="gallery_btn gallery_btn_radius" v-else @click="handleContactUs">{{ item?.btn }}</div> class="gallery_btn gallery_btn_radius submit"
v-if="item?.btn != 'Contact us' && item?.btn != '联系我们'"
@click="createAccount"
>
{{ item?.btn }}
</div>
<div
class="gallery_btn gallery_btn_radius submit"
v-else
@click="handleContactUs"
>
{{ item?.btn }}
</div>
</div> </div>
<div class="highlight" v-if="item?.highlight">{{ item?.highlight }}</div> <div class="highlight" v-if="item?.highlight">{{ item?.highlight }}</div>
</div> </div>
</div> </div>
</div> </div>
<registerModel ref="registerModel"></registerModel> <registerModel ref="registerModel"></registerModel>
</div> </div>
</template> </template>
<script> <script>
import { defineComponent, ref, reactive, watch, onMounted, nextTick, toRefs } from "vue"; import { defineComponent, ref, reactive, watch, onMounted, nextTick, toRefs } from 'vue'
import registerModel from './registerModel.vue' import registerModel from './registerModel.vue'
import { message } from "ant-design-vue"; import { message } from 'ant-design-vue'
import CChargeIcon from '@/assets/icons/CCharge.svg' import CChargeIcon from '@/assets/icons/CCharge.svg'
export default defineComponent({ export default defineComponent({
components: { components: {
registerModel, registerModel
}, },
name: "login", name: 'login',
props: ['isSelectSuccessively'], props: ['isSelectSuccessively'],
// emits: ['close'], // emits: ['close'],
setup(props, { emit }) { setup(props, { emit }) {
@@ -62,122 +106,143 @@ import { message } from "ant-design-vue";
Yearly: '年度', Yearly: '年度',
monthly: [ monthly: [
{ {
title: "试用版", title: '免费版',
img: CChargeIcon, img: CChargeIcon,
type: 'personal', type: 'personal',
info: "您的AI时尚设计助手", info: '您的AI时尚设计助手',
price: '100积分', price: 'HK$0',
detail: "", detail: '5天·50积分',
highlight: "", highlight: '',
discounts: '9折优惠', discounts: '9折优惠',
detailList: [ detailList: [
'轻松充值积分', '轻松充值积分',
'可在公共化画廊分享设计并与设计师互动', '可在公共化画廊分享设计并与设计师互动',
'支持月付/年付选项', '支持月付/年付选项',
'适合个人创作者、独立设计师以及所有时尚爱好者', '适合个人创作者、独立设计师以及所有时尚爱好者',
'客户支持', '客户支持'
], ],
btn: '立即开始', btn: '立即开始'
}, },
{ {
title: "个人版", title: '个人版',
img: '/image/homeIntroduct/personal.png', img: '/image/homeIntroduct/personal.png',
type: 'personal', type: 'personal',
info: "您的AI时尚设计助手", info: '您的AI时尚设计助手',
price: 'HK$100', price: 'HK$100',
detail: "每月·500积分", detail: '每月·500积分',
highlight: "", highlight: '',
discounts: '9折优惠', discounts: '9折优惠',
detailList: [ detailList: [
'轻松充值积分', '轻松充值积分',
'可在公共化画廊分享设计并与设计师互动', '可在公共化画廊分享设计并与设计师互动',
'支持月付/年付选项', '支持月付/年付选项',
'适合个人创作者、独立设计师以及所有时尚爱好者', '适合个人创作者、独立设计师以及所有时尚爱好者',
'客户支持', '客户支持'
], ],
btn: '立即开始', btn: '订阅'
}, },
{ {
title: "个人专业版", title: '个人专业版',
img: '/image/homeIntroduct/personal.png', img: '/image/homeIntroduct/personal.png',
type: 'personal', type: 'personal',
info: "您的AI时尚设计助手", info: '您的AI时尚设计助手',
price: 'HK$500', price: 'HK$500',
detail: "每月·3500积分", detail: '每月·3500积分',
highlight: "推荐", highlight: '推荐',
recommended: true,
discounts: '9折优惠', discounts: '9折优惠',
detailList: [ detailList: [
'轻松充值积分', '轻松充值积分',
'可在公共画廊中分享设计并与设计师互动', '可在公共画廊中分享设计并与设计师互动',
'支持月付/年付选项', '支持月付/年付选项',
'适合个人创作者、独立设计师以及所有时尚爱好者', '适合个人创作者、独立设计师以及所有时尚爱好者',
'客户支持', '客户支持'
], ],
btn: '立即开始', btn: '订阅'
},{ },
title: "教育版", {
title: '教育版',
img: '/image/homeIntroduct/academic.png', img: '/image/homeIntroduct/academic.png',
type: 'academic', type: 'academic',
info: "高校多用户管理系统", info: '高校多用户管理系统',
price: '', price: '',
detail: "", detail: '',
custom: '定制方案', custom: '定制方案',
customInfo: '可提供专属教育优惠,详情请联系我们', customInfo: '可提供专属教育优惠,详情请联系我们',
highlight: "", highlight: '',
discounts: '', discounts: '',
detailList: [ detailList: [
'灵活的自定义程序以满足学校需求', '灵活的自定义程序以满足学校需求',
"项目期间每月信用额度自动续期", '项目期间每月信用额度自动续期',
'可在用户之间灵活共享和分配账户信用额度', '可在用户之间灵活共享和分配账户信用额度',
'AI辅助设计教学功能', 'AI辅助设计教学功能',
"从设计灵感、草图创作到完整时装系列的尖端教学工具", '从设计灵感、草图创作到完整时装系列的尖端教学工具',
"基本3D设计功能", '基本3D设计功能',
"客户与技术支援", '客户与技术支援'
], ],
btn: '联系我们', btn: '联系我们'
}, }
], ],
yearl: [ yearl: [
{ {
title: "个人版", title: '免费版',
img: CChargeIcon,
type: 'personal',
info: '您的AI时尚设计助手',
price: 'HK$0',
detail: '5天·50积分',
highlight: '',
discounts: '9折优惠',
detailList: [
'轻松充值积分',
'可在公共化画廊分享设计并与设计师互动',
'支持月付/年付选项',
'适合个人创作者、独立设计师以及所有时尚爱好者',
'客户支持'
],
btn: '立即开始'
},
{
title: '个人版',
img: '/image/homeIntroduct/personal.png', img: '/image/homeIntroduct/personal.png',
type: 'personal', type: 'personal',
info: "您的AI时尚设计助手", info: '您的AI时尚设计助手',
price: 'HK$5,000', price: 'HK$5,000',
detail: "每年·50000积分", detail: '每年·50000积分',
highlight: "免费试用5天", highlight: '',
discounts: '9折优惠', discounts: '9折优惠',
detailList: [ detailList: [
'灵活的自定义程序以满足学校需求', '灵活的自定义程序以满足学校需求',
'可在用户之间灵活共享和分配账户信用额度', '可在用户之间灵活共享和分配账户信用额度',
'AI辅助设计教学功能', 'AI辅助设计教学功能',
'支持草图创意和设计灵感教学', '支持草图创意和设计灵感教学',
'基础3D设计功能', '基础3D设计功能'
], ],
btn: '立即开始', btn: '订阅'
},{ },
title: "教育版", {
title: '教育版',
img: '/image/homeIntroduct/academic.png', img: '/image/homeIntroduct/academic.png',
type: 'academic', type: 'academic',
info: "高校多用户管理系统", info: '高校多用户管理系统',
price: '', price: '',
detail: "", detail: '',
custom: '定制方案', custom: '定制方案',
customInfo: '可提供专属教育优惠,详情请联系我们', customInfo: '可提供专属教育优惠,详情请联系我们',
highlight: "", highlight: '',
discounts: '', discounts: '',
detailList: [ detailList: [
'灵活的自定义程序以满足学校需求', '灵活的自定义程序以满足学校需求',
"项目期间每月信用额度自动续期", '项目期间每月信用额度自动续期',
'可在用户之间灵活共享和分配账户信用额度', '可在用户之间灵活共享和分配账户信用额度',
'AI辅助设计教学功能', 'AI辅助设计教学功能',
"从设计灵感、草图创作到完整时装系列的尖端教学工具", '从设计灵感、草图创作到完整时装系列的尖端教学工具',
"基本3D设计功能", '基本3D设计功能',
"客户与技术支援", '客户与技术支援'
],
btn: '联系我们',
},
], ],
btn: '联系我们'
}
]
}, },
productListEn: { productListEn: {
Advantages: 'Our Pricing Plan', Advantages: 'Our Pricing Plan',
@@ -185,68 +250,70 @@ import { message } from "ant-design-vue";
Yearly: 'Yearly', Yearly: 'Yearly',
monthly: [ monthly: [
{ {
title:"Personal", title: 'Free',
img: CChargeIcon, img: CChargeIcon,
type: 'personal', type: 'personal',
info:"Your AI Fashion Design Assistant", info: 'Your AI Fashion Design Assistant',
price:'100 credits', price: 'HK$0',
detail:"", detail: '5 days · 50 credits',
highlight:"", highlight: '',
discounts: '10% off', discounts: '10% off',
detailList: [ detailList: [
'Easy to Top up Credits', 'Easy to Top up Credits',
'Option to Share Design and Interact with Designers in Public Gallery', 'Option to Share Design and Interact with Designers in Public Gallery',
'Support Monthly/Annual Payment Options', 'Support Monthly/Annual Payment Options',
'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers', 'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers',
'Customer and Technical Support', 'Customer and Technical Support'
], ],
btn:'Get Started', btn: 'Get Started'
}, },
{ {
title:"Personal", title: 'Personal',
img: '/image/homeIntroduct/personal.png', img: '/image/homeIntroduct/personal.png',
type: 'personal', type: 'personal',
info:"Your AI Fashion Design Assistant", info: 'Your AI Fashion Design Assistant',
price: 'HK$100', price: 'HK$100',
detail:"per month · 500 credits", detail: 'per month · 500 credits',
highlight:"", highlight: '',
discounts: '10% off', discounts: '10% off',
detailList: [ detailList: [
'Easy to Top up Credits', 'Easy to Top up Credits',
'Option to Share Design and Interact with Designers in Public Gallery', 'Option to Share Design and Interact with Designers in Public Gallery',
'Support Monthly/Annual Payment Options', 'Support Monthly/Annual Payment Options',
'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers', 'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers',
'Customer and Technical Support', 'Customer and Technical Support'
], ],
btn:'Get Started', btn: 'Subscribe'
}, },
{ {
title:"Personal", title: 'Personal',
img: '/image/homeIntroduct/personal.png', img: '/image/homeIntroduct/personal.png',
type: 'personal', type: 'personal',
info:"Your AI Fashion Design Assistant", info: 'Your AI Fashion Design Assistant',
price: 'HK$500', price: 'HK$500',
detail:"per month · 3500 credits", detail: 'per month · 3500 credits',
highlight:"Recommended", highlight: 'Recommended',
recommended: true,
discounts: '10% off', discounts: '10% off',
detailList: [ detailList: [
'Easy to Top up Credits', 'Easy to Top up Credits',
'Option to Share Design and Interact with Designers in Public Gallery', 'Option to Share Design and Interact with Designers in Public Gallery',
'Support Monthly/Annual Payment Options', 'Support Monthly/Annual Payment Options',
'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers', 'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers',
'Customer and Technical Support', 'Customer and Technical Support'
], ],
btn:'Get Started', btn: 'Subscribe'
},{ },
title:"Academic", {
title: 'Academic',
img: '/image/homeIntroduct/academic.png', img: '/image/homeIntroduct/academic.png',
type: 'academic', type: 'academic',
info:"Multi User Management System for Universities", info: 'Multi User Management System for Universities',
price: '', price: '',
detail:"", detail: '',
custom: 'Customize', custom: 'Customize',
customInfo: 'Special Academic rate aviable, please contact us for details.', customInfo: 'Special Academic rate aviable, please contact us for details.',
highlight:"", highlight: '',
discounts: '', discounts: '',
detailList: [ detailList: [
'Flexible Customize Program to Support School Needs', 'Flexible Customize Program to Support School Needs',
@@ -255,39 +322,58 @@ import { message } from "ant-design-vue";
'Al Assisted Design Teaching Function', 'Al Assisted Design Teaching Function',
'Cutting-edge Teaching Tool from Design Inspiration, Sketch Creation to Complete Fashion Collection', 'Cutting-edge Teaching Tool from Design Inspiration, Sketch Creation to Complete Fashion Collection',
'Basic 3D Design Functions', 'Basic 3D Design Functions',
'Customer and Technical Support', 'Customer and Technical Support'
], ],
btn:'Contact us', btn: 'Contact us'
}, }
], ],
yearl: [ yearl: [
{ {
title:"Personal", title: 'Free',
img:'/image/homeIntroduct/personal.png', img: CChargeIcon,
type:'personal', type: 'free',
info:"Your AI Fashion Design Assistant", info: 'Your AI Fashion Design Assistant',
price:'HK$5,000', price: 'HK$0',
detail:"per month · 50000 credits", detail: '5 days · 50 credits',
highlight:"Free 5-Days Trial", highlight: '',
discounts: '10% off', discounts: '10% off',
detailList: [ detailList: [
'Easy to Top up Credits', 'Easy to Top up Credits',
'Option to Share Design and Interact with Designers in Public Gallery', 'Option to Share Design and Interact with Designers in Public Gallery',
'Support Monthly/Annual Payment Options', 'Support Monthly/Annual Payment Options',
'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers', 'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers',
'Customer and Technical Support', 'Customer and Technical Support'
], ],
btn:'Get Started', btn: 'Get Started'
},{ },
title:"Academic", {
title: 'Personal',
img: '/image/homeIntroduct/personal.png',
type: 'personal',
info: 'Your AI Fashion Design Assistant',
price: 'HK$5,000',
detail: 'per month · 50000 credits',
highlight: '',
discounts: '10% off',
detailList: [
'Easy to Top up Credits',
'Option to Share Design and Interact with Designers in Public Gallery',
'Support Monthly/Annual Payment Options',
'Suitable for Individual Creator, Independent Designers and Fun for all Fashion Lovers',
'Customer and Technical Support'
],
btn: 'Subscribe'
},
{
title: 'Academic',
img: '/image/homeIntroduct/academic.png', img: '/image/homeIntroduct/academic.png',
type: 'academic', type: 'academic',
info:"Multi User Management System for Universities", info: 'Multi User Management System for Universities',
price: '', price: '',
detail:"", detail: '',
custom: 'Customize', custom: 'Customize',
customInfo: 'Special Academic rate aviable, please contact us for details.', customInfo: 'Special Academic rate aviable, please contact us for details.',
highlight:"", highlight: '',
discounts: '', discounts: '',
detailList: [ detailList: [
'Flexible Customize Program to Support School Needs', 'Flexible Customize Program to Support School Needs',
@@ -296,23 +382,26 @@ import { message } from "ant-design-vue";
'Al Assisted Design Teaching Function', 'Al Assisted Design Teaching Function',
'Cutting-edge Teaching Tool from Design Inspiration, Sketch Creation to Complete Fashion Collection', 'Cutting-edge Teaching Tool from Design Inspiration, Sketch Creation to Complete Fashion Collection',
'Basic 3D Design Functions', 'Basic 3D Design Functions',
'Customer and Technical Support', 'Customer and Technical Support'
],
btn:'Contact us',
},
], ],
btn: 'Contact us'
}
]
} }
}) })
watch(()=>props.isSelectSuccessively,(newVal)=>{ watch(
() => props.isSelectSuccessively,
newVal => {
if (newVal) { if (newVal) {
data.productList = data.productListCn data.productList = data.productListCn
} else { } else {
data.productList = data.productListEn data.productList = data.productListEn
} }
},{immediate: true}) },
const close = ()=>{ { immediate: true }
} )
const setMonthlyOrYearly = (val)=>{ const close = () => {}
const setMonthlyOrYearly = val => {
data.monthlyOrYearly = val data.monthlyOrYearly = val
} }
const createAccount = () => { const createAccount = () => {
@@ -369,7 +458,7 @@ import { message } from "ant-design-vue";
}, 2000) }, 2000)
} }
const copyToClipboard = (text) => { const copyToClipboard = text => {
if (navigator.clipboard && window.isSecureContext) { if (navigator.clipboard && window.isSecureContext) {
// 使用现代 Clipboard API // 使用现代 Clipboard API
navigator.clipboard.writeText(text).catch(() => { navigator.clipboard.writeText(text).catch(() => {
@@ -382,7 +471,7 @@ import { message } from "ant-design-vue";
} }
} }
const fallbackCopyToClipboard = (text) => { const fallbackCopyToClipboard = text => {
const textArea = document.createElement('textarea') const textArea = document.createElement('textarea')
textArea.value = text textArea.value = text
textArea.style.position = 'fixed' textArea.style.position = 'fixed'
@@ -399,18 +488,16 @@ import { message } from "ant-design-vue";
document.body.removeChild(textArea) document.body.removeChild(textArea)
} }
onMounted(()=>{ onMounted(() => {})
})
return { return {
...toRefs(dom), ...toRefs(dom),
...toRefs(data), ...toRefs(data),
close, close,
setMonthlyOrYearly, setMonthlyOrYearly,
createAccount, createAccount,
handleContactUs, handleContactUs
}
} }
},
}) })
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
@@ -429,7 +516,8 @@ import { message } from "ant-design-vue";
font-size: 1.6rem; font-size: 1.6rem;
margin-bottom: 3rem; margin-bottom: 3rem;
} }
.back,.introduce>span{ .back,
.introduce > span {
cursor: pointer; cursor: pointer;
} }
.titleTitle { .titleTitle {
@@ -443,19 +531,19 @@ import { message } from "ant-design-vue";
} }
} }
.selectMonthlyYearly { .selectMonthlyYearly {
border: .7px solid #e7ebff; border: 0.7px solid #e7ebff;
background: #FBFBFB; background: #fbfbfb;
border-radius: 1rem; border-radius: 1rem;
width: 18.5rem; width: 18.5rem;
box-shadow: 0px 0.72px 3.62px 0px #566EE81A inset; box-shadow: 0px 0.72px 3.62px 0px #566ee81a inset;
margin: 0 auto; margin: 0 auto;
display: flex; display: flex;
position: relative; position: relative;
--selectPadding: .58rem; --selectPadding: 0.58rem;
padding: var(--selectPadding); padding: var(--selectPadding);
@media (max-width: 767px) { @media (max-width: 767px) {
--selectPadding: .36rem; --selectPadding: 0.36rem;
border-radius: .58rem; border-radius: 0.58rem;
width: 10.8rem; width: 10.8rem;
} }
&.left { &.left {
@@ -475,15 +563,16 @@ import { message } from "ant-design-vue";
} }
} }
> .bg { > .bg {
border: .7px solid #E7EBFF; border: 0.7px solid #e7ebff;
box-shadow: 0px 4.35px 26.08px 0px #B5C2FB1A; box-shadow: 0px 4.35px 26.08px 0px #b5c2fb1a;
background: #ffffff; background: #ffffff;
width: calc(50% - var(--selectPadding) * 2); width: calc(50% - var(--selectPadding) * 2);
height: calc(100% - var(--selectPadding) * 2); height: calc(100% - var(--selectPadding) * 2);
position: absolute; position: absolute;
transition: all .3s; transition: all 0.3s;
} }
> .leftText,> .rightText{ > .leftText,
> .rightText {
cursor: pointer; cursor: pointer;
font-weight: 400; font-weight: 400;
font-size: 1.7rem; font-size: 1.7rem;
@@ -510,33 +599,42 @@ import { message } from "ant-design-vue";
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
} }
}
.gallery_list_box{
} }
.gallery_list { .gallery_list {
display: flex; display: flex;
// justify-content: center; // justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
margin-top: 4.3rem; margin-top: 6rem;
@media (max-width: 767px) { @media (max-width: 767px) {
margin-top: 2.4rem; margin-top: 2.4rem;
} }
.gallery_item { .gallery_item {
width: 44.1rem; width: 36.2rem;
height: 56.9rem; height: 46.8rem;
padding: 2.09rem; padding: 2.38rem;
border-radius: 1.8rem; border-radius: 1.55rem;
border: .72px solid #E7EBFF; border: 0.2rem solid #e7ebff;
margin-right: 8rem; margin-right: 8rem;
position: relative; position: relative;
box-shadow: 0px 15.5px 23.84px 0px #bccaff21;
&.recommended {
border-radius: 1.8rem;
border: 2px solid transparent;
background: linear-gradient(#fff, #fff) padding-box,
linear-gradient(88.13deg, #fbd2ff 0.91%, #e6d3ff 52.5%, #b694ff 101.09%)
border-box;
background-origin: border-box;
background-clip: padding-box, border-box;
}
@media (max-width: 767px) { @media (max-width: 767px) {
width: 100%; width: 100%;
height: auto; height: auto;
border-radius: 1.3rem; border-radius: 1.3rem;
margin: 0; margin: 0;
margin-bottom: 2.8rem; margin-bottom: 2.8rem;
padding: 2rem;
padding-bottom: 1.3rem; padding-bottom: 1.3rem;
} }
.product_signUp_box { .product_signUp_box {
@@ -549,7 +647,7 @@ import { message } from "ant-design-vue";
margin-bottom: 0rem; margin-bottom: 0rem;
} }
.img { .img {
margin-bottom: 1.4rem; margin-bottom: 1.2rem;
width: 4rem; width: 4rem;
height: 4rem; height: 4rem;
@media (max-width: 767px) { @media (max-width: 767px) {
@@ -559,35 +657,35 @@ import { message } from "ant-design-vue";
} }
} }
.title { .title {
font-size: 3.1rem; font-size: 2.6rem;
margin-bottom: 1rem; margin-bottom: 0.8rem;
text-align: left; text-align: left;
font-weight: 500; font-weight: 500;
@media (max-width: 767px) { @media (max-width: 767px) {
font-size: 2.3rem; font-size: 2.3rem;
margin-bottom: .73rem; margin-bottom: 0.73rem;
} }
} }
.info { .info {
font-weight: 400; font-weight: 400;
font-size: 1.4rem; font-size: 1.4rem;
color: #797878; color: #797878;
margin-bottom: 1.7rem;
font-family: 'pingfang_regular'; font-family: 'pingfang_regular';
&.academic { &.academic {
margin-bottom: .4rem; margin-bottom: 0.4rem;
} }
@media (max-width: 767px) { @media (max-width: 767px) {
font-size: 1.25rem; font-size: 1.25rem;
margin-bottom: 1.25rem; // margin-bottom: 1.25rem;
} }
} }
.price { .price {
// margin-bottom: 5.2rem; // margin-bottom: 5.2rem;
border-bottom: .72px solid #E7EBFF; border-bottom: 0.72px solid #e7ebff;
width: 100%; width: 100%;
display: flex; display: flex;
align-items: flex-end; column-gap: 0.7rem;
align-items: center;
@media (max-width: 767px) { @media (max-width: 767px) {
margin-bottom: 2.3rem; margin-bottom: 2.3rem;
} }
@@ -595,13 +693,13 @@ import { message } from "ant-design-vue";
align-items: flex-start; align-items: flex-start;
flex-direction: column; flex-direction: column;
> div { > div {
margin-bottom: .9rem; margin-bottom: 0.9rem;
font-size: 4.3rem; font-size: 3.6rem;
line-height: 1; line-height: 1;
letter-spacing: -.072rem;
@media (max-width: 767px) { @media (max-width: 767px) {
font-size: 3.1rem; font-size: 3.1rem;
margin-bottom: .5rem; margin-bottom: 0.5rem;
} }
} }
> span { > span {
@@ -610,47 +708,60 @@ import { message } from "ant-design-vue";
} }
> div { > div {
font-weight: 500; font-weight: 500;
font-size: 4.3rem; font-size: 3.6rem;
color: #1B223C; letter-spacing: -0.06rem;
color: #1b223c;
margin: 0.3rem 0;
@media (max-width: 767px) { @media (max-width: 767px) {
font-size: 3.14rem; font-size: 3rem;
} }
} }
> span { > span {
font-weight: 500; font-weight: 500;
font-size: 1.7rem; font-size: 1.3rem;
color: #797878; color: #797878;
margin-bottom: 1.5rem; // margin-bottom: 1.5rem;
margin-left: 1rem; // margin-left: 1rem;
&.yearl { &.yearl {
font-size: 1.3rem; font-size: 1.3rem;
} }
@media (max-width: 767px) { @media (max-width: 767px) {
font-size: 1.2rem; font-size: 1.2rem;
margin-left: .7rem; margin-top: 1rem;
margin-bottom: 1rem; // margin-left: 0.7rem;
// margin-bottom: 1rem;
} }
} }
} }
.info,.detail,.gallery_btn{ .detail,
.gallery_btn {
font-size: 1.6rem; font-size: 1.6rem;
} }
.highlight { .highlight {
font-size: 1.3rem; font-size: 1.4rem;
position: absolute; position: absolute;
width: 12.41rem;
line-height: 3.4rem;
text-align: center;
top: 0; top: 0;
right: 0; right: 0;
background: linear-gradient(88.13deg, #FBD2FF 0.91%, #E6D3FF 52.5%, #B694FF 101.09%); background: linear-gradient(
88.13deg,
#fbd2ff 0.91%,
#e6d3ff 52.5%,
#b694ff 101.09%
);
// border-radius: .5rem 1.5rem 0px 1.5rem; // border-radius: .5rem 1.5rem 0px 1.5rem;
border-top-right-radius: 1.5rem; border-top-right-radius: 1.5rem;
border-bottom-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem;
padding: .75rem .5rem;
@media (max-width: 767px) { @media (max-width: 767px) {
padding: .55rem .36rem;
// border-radius: .46rem .36rem 0px .9rem; // border-radius: .46rem .36rem 0px .9rem;
border-top-right-radius: 1.1rem; border-top-right-radius: 1.1rem;
border-bottom-left-radius: 0.4rem; border-bottom-left-radius: 0.4rem;
font-size: 1rem; font-size: 1rem;
line-height: 2.5rem;
font-weight: 500;
width: 9rem;
} }
} }
.product_detail { .product_detail {
@@ -661,20 +772,17 @@ import { message } from "ant-design-vue";
justify-content: flex-end; justify-content: flex-end;
overflow-y: auto; overflow-y: auto;
&.academic { &.academic {
justify-content: flex-start justify-content: flex-start;
} }
li { li {
list-style: disc; list-style: disc;
margin-bottom: .3rem; // margin-bottom: 0.3rem;
font-size: 1.6rem; font-size: 1.3rem;
font-weight: 500; font-weight: 500;
@media (max-width: 767px) {
font-size: 1.15rem;
}
}
li:last-child{
margin-bottom: 0;
} }
// li:last-child {
// margin-bottom: 0;
// }
} }
.gallery_btn { .gallery_btn {
line-height: 4.6rem; line-height: 4.6rem;
@@ -683,14 +791,102 @@ import { message } from "ant-design-vue";
margin-top: auto; margin-top: auto;
font-size: 1.7rem; font-size: 1.7rem;
font-weight: 500; font-weight: 500;
background-color: #1b223c;
&:hover {
background-color: #fff;
}
@media (max-width: 767px) { @media (max-width: 767px) {
margin-top: 2.5rem; margin-top: 2.5rem;
font-size: 1.25rem; font-size: 1.25rem;
line-height: 3.4rem; line-height: 3.4rem;
border-radius: .62rem; border-radius: 0.62rem;
} }
} }
} }
.yearly {
width: 44.1rem;
height: 56.9rem;
padding: 2.89rem 2.89rem 3.31rem;
box-sizing: border-box;
.product_signUp_box {
.title {
font-size: 3.1rem;
margin-bottom: 1rem;
}
.info {
font-size: 1.7rem;
}
.price {
> div {
font-size: 4.34rem;
letter-spacing: -1px;
}
span {
font-size: 1.4rem;
}
}
.product_detail {
padding-top: 3.1rem;
justify-content: space-evenly;
li {
font-size: 1.6rem;
}
}
}
@media (max-width: 767px) {
width: 31.9rem;
height: 41.1rem;
padding: 2.09rem 2.09rem 2.11rem;
&.academic {
height: 52rem;
}
.product_signUp_box {
.img {
width: 3.4rem;
height: 3.4rem;
}
.title {
font-size: 2.3rem;
margin-bottom: 0;
letter-spacing: 0.05rem;
}
.info {
font-size: 1.2rem;
}
.price {
margin-bottom: 0;
div {
font-size: 3.1rem;
}
span {
font-size: 1.26rem;
&.personal {
font-size: 0.95rem;
}
}
}
.product_detail {
padding-top: 2rem;
justify-content: flex-end;
margin-bottom: 0;
&.chinese{
justify-content: space-evenly;
}
li {
font-size: 1.15rem;
}
}
.submit {
margin-top: 2rem;
}
}
}
}
.submit {
@media (max-width: 767px) {
margin-top: 2rem;
}
}
} }
} }
</style> </style>

View File

@@ -453,7 +453,8 @@ export default {
jsContent4: '图片必须小于5MB', jsContent4: '图片必须小于5MB',
jsContent5: '图片已经上传是否继续上传', jsContent5: '图片已经上传是否继续上传',
jsContent6: '输入的内容超过允许输入的最大长度', jsContent6: '输入的内容超过允许输入的最大长度',
jsContent7: '请输入内容~' jsContent7: '请输入内容~',
jsContent8: '请输入项目名字~'
}, },
ModelPlacement: { ModelPlacement: {
Registration: '新增模特', Registration: '新增模特',

View File

@@ -466,7 +466,8 @@ export default {
jsContent4: 'Image must smaller than 5MB!', jsContent4: 'Image must smaller than 5MB!',
jsContent5: 'This picture has been uploaded whether to continue uploading', jsContent5: 'This picture has been uploaded whether to continue uploading',
jsContent6: 'The entered content exceeds the maximum length.', jsContent6: 'The entered content exceeds the maximum length.',
jsContent7: 'Please enter content' jsContent7: 'Please enter content',
jsContent8: 'Please enter the project name.'
}, },
ModelPlacement: { ModelPlacement: {
Registration: 'Registration', Registration: 'Registration',

View File

@@ -393,6 +393,27 @@
<span class="fi fi-rr-book-user"></span> <span class="fi fi-rr-book-user"></span>
<span class="select_item_des">{{ $t('Header.Tutorial') }}</span> <span class="select_item_des">{{ $t('Header.Tutorial') }}</span>
</div> </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_long"></div>
<div class="select_item" @click="logout()"> <div class="select_item" @click="logout()">
<span class="icon iconfont icon-tuichu"></span> <span class="icon iconfont icon-tuichu"></span>
@@ -2013,6 +2034,25 @@ export default defineComponent({
font-size: 1.6rem; font-size: 1.6rem;
margin-left: 1rem; margin-left: 1rem;
font-weight: 500; 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 { .select_item_long {

View File

@@ -6,14 +6,14 @@
@click="turnToNewPage('/')" @click="turnToNewPage('/')"
src="@/assets/images/homePage/aidaIcon.png" 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 class="language_btn">
<div @click="handleChangeLanguage"> <div @click="handleChangeLanguage">
<i class="fi fi-rr-globe"></i> <i class="fi fi-rr-globe"></i>
{{ isChinese ? 'CN' : 'EN' }} {{ isChinese ? 'CN' : 'EN' }}
</div> </div>
</div> </div>
<div class="gallery_btn login white" @click="setLogin">{{ t('Login.Login') }}</div>
<div class="gallery_btn" @click="signUp">{{ t('Login.SignUp') }}</div>
</div> </div>
<div class="content"> <div class="content">
@@ -229,8 +229,25 @@ export default defineComponent({
.language_btn { .language_btn {
color: #fff; color: #fff;
cursor: pointer; cursor: pointer;
font-size: 2.5rem;
>div {
display: flex;
>i{
display: flex;
align-items: center;
font-size: 2.5rem;
margin-right: .7rem;
}
}
@media (max-width: 768px) { @media (max-width: 768px) {
font-size: 1.5rem;
color: #000; color: #000;
>div {
>i{
font-size: 1.5rem;
margin-right: .7rem;
}
}
} }
} }
> .gallery_btn { > .gallery_btn {

View File

@@ -9,7 +9,7 @@
:placeholder="t('batchGeneration.Search')" :placeholder="t('batchGeneration.Search')"
@search="searchHistoryList" @search="searchHistoryList"
/> />
<div class="history_table_content" ref="historyTable"> <div class="history_table_content" ref="historyTable" @click.stop>
<a-config-provider :locale="tableLocale"> <a-config-provider :locale="tableLocale">
<a-table <a-table
row-class-name="history_table_row" row-class-name="history_table_row"
@@ -28,6 +28,14 @@
}" }"
> >
<template #bodyCell="{ column, text, record, index }"> <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_list" v-if="column?.Operations">
<div <div
class="operate_item" class="operate_item"
@@ -213,6 +221,39 @@ export default defineComponent({
selectCode: selectCode, selectCode: selectCode,
designType: '' 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) provide('type', type)
return { return {
store, store,
@@ -232,7 +273,10 @@ export default defineComponent({
tableLocale, tableLocale,
projectSetting, projectSetting,
tableSearchBar, tableSearchBar,
currentProjectPath currentProjectPath,
updateName,
setUpdateName,
submitUpdateName,
} }
}, },
data() { data() {
@@ -608,6 +652,7 @@ export default defineComponent({
customTableRow(record: any) { customTableRow(record: any) {
return { return {
onDblclick: () => { onDblclick: () => {
if(this.updateName.selectIndex !== -1)return
this.retrieveHome(record) this.retrieveHome(record)
} }
} }
@@ -726,6 +771,11 @@ export default defineComponent({
} }
:deep(.ant-table-tbody > tr:hover) { :deep(.ant-table-tbody > tr:hover) {
background: #ededed; background: #ededed;
.update_name{
> .fi-rr-edit{
display: flex;
}
}
} }
:deep(.ant-table-tbody > tr > td) { :deep(.ant-table-tbody > tr > td) {
border: none; border: none;
@@ -780,7 +830,26 @@ export default defineComponent({
color: #000; 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 { .operate_list {
display: flex; display: flex;
align-items: center; align-items: center;

View File

@@ -13,7 +13,18 @@
@click="turnToNewPage('https://www.aidlab.hk/en/')" @click="turnToNewPage('https://www.aidlab.hk/en/')"
src="@/assets/images/loginPage/aida_Logo_login.png" src="@/assets/images/loginPage/aida_Logo_login.png"
/> --> /> -->
<div class="mobile_logo_group" v-if="isMoblie" @click="turnToNewPage('/')">
<img <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" class="homeRecommend_logo"
@click="turnToNewPage('/')" @click="turnToNewPage('/')"
src="@/assets/images/homePage/aidaIcon.png" src="@/assets/images/homePage/aidaIcon.png"
@@ -43,61 +54,72 @@
<div class="homeRecommend_right"> <div class="homeRecommend_right">
<!-- <div class="homeRecommend_right" v-if="userDetail.systemUser == -1"> --> <!-- <div class="homeRecommend_right" v-if="userDetail.systemUser == -1"> -->
<div class="cutLangue"> <div class="cutLangue">
<div @click="()=>isSelectSuccessively = !isSelectSuccessively"> <div @click="() => (isSelectSuccessively = !isSelectSuccessively)">
<i class="fi fi-rr-globe"></i> <i class="fi fi-rr-globe"></i>
<!-- <a-switch :checked="isSelectSuccessively" @click="()=>isSelectSuccessively = !isSelectSuccessively" checked-children="EN" un-checked-children="CN"/> --> <!-- <a-switch :checked="isSelectSuccessively" @click="()=>isSelectSuccessively = !isSelectSuccessively" checked-children="EN" un-checked-children="CN"/> -->
{{ isSelectSuccessively ? 'CN' : 'EN' }} {{ isSelectSuccessively ? 'CN' : 'EN' }}
</div> </div>
</div> </div>
<div class="gallery_btn" @click="setLogin">{{ isSelectSuccessively?'登录':'Login' }}</div> <div class="gallery_btn" @click="setLogin">
{{ isSelectSuccessively ? '登录' : 'Login' }}
</div>
</div> </div>
</header> </header>
<div class="content"> <div class="content">
<signUp ref="signUp" :isSelectSuccessively="isSelectSuccessively"></signUp> <signUp ref="signUp" :isSelectSuccessively="isSelectSuccessively"></signUp>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { defineComponent, toRefs, reactive, ref , nextTick,computed, onMounted, onBeforeUnmount } from "vue"; import {
import { setCookie, getCookie, WriteCookie,clonAllCookie } from "@/tool/cookie"; defineComponent,
import { Https } from "@/tool/https"; toRefs,
import { useStore } from "vuex"; reactive,
import { useRouter } from 'vue-router'; 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' import signUp from '@/component/mainPage/signUp/index.vue'
export default defineComponent({ export default defineComponent({
components: { components: {
signUp, signUp
}, },
setup() { setup() {
const store = useStore(); const store = useStore()
const router = useRouter(); const router = useRouter()
let data = reactive({ let data = reactive({
homeRecommendMax: null, homeRecommendMax: null,
signUp: null, signUp: null,
isSelectSuccessively:false, isSelectSuccessively: false
}) })
let isMoblie = ref(false) let isMoblie = ref(false)
let userDetail = computed(() => { let userDetail = computed(() => {
return store.state.UserHabit.userDetail return store.state.UserHabit.userDetail
}) })
let setLogin = () => { let setLogin = () => {
router.push("/login"); router.push('/login')
} }
let logout = () => { let logout = () => {
let userInfo = store.state.UserHabit.userDetail; let userInfo = store.state.UserHabit.userDetail
let data = { let data = {
userId: userInfo?.userId, userId: userInfo?.userId
}; }
store.commit('createDetail') store.commit('createDetail')
store.commit('createProbject') store.commit('createProbject')
if (!data.userId) return if (!data.userId) return
Https.axiosPost(Https.httpUrls.accountLogout, data).then((rv) => { Https.axiosPost(Https.httpUrls.accountLogout, data).then(rv => {
clonAllCookie(); clonAllCookie()
}); })
} }
let goHome = () => { let goHome = () => {
router.push('/home'); router.push('/home')
} }
let time let time
let updataIsMoblie = () => { let updataIsMoblie = () => {
@@ -109,45 +131,59 @@ export default defineComponent({
isMoblie.value = false isMoblie.value = false
} }
}, 500) }, 500)
} }
watch(
() => data.isSelectSuccessively,
val => {
let str = ''
if (val) {
str = 'CHINESE_SIMPLIFIED'
} else {
str = 'ENGLISH'
}
localStorage.setItem('loginLanguage', str)
}
)
onMounted(() => { onMounted(() => {
updataIsMoblie()
const savedLang = localStorage.getItem('loginLanguage')
if (savedLang) {
data.isSelectSuccessively = savedLang === 'CHINESE_SIMPLIFIED'
}
window.addEventListener('resize', updataIsMoblie) window.addEventListener('resize', updataIsMoblie)
}) })
onBeforeUnmount(() => { onBeforeUnmount(() => {
window.removeEventListener('resize', updataIsMoblie); window.removeEventListener('resize', updataIsMoblie)
})
});
return { return {
...toRefs(data), ...toRefs(data),
userDetail, userDetail,
setLogin, setLogin,
logout, logout,
goHome, goHome,
isMoblie, isMoblie
} }
}, },
data() { data() {
return { return {}
};
}, },
watch: { watch: {
// credits.value(newVal,oldVal){ // credits.value(newVal,oldVal){
// console.log(String(newVal).length); // console.log(String(newVal).length);
// } // }
}, },
mounted() { mounted() {},
},
methods: { methods: {
turnToNewPage(url) { turnToNewPage(url) {
window.open(url); window.open(url)
}, },
turnToWindow(url) { turnToWindow(url) {
window.open(url); window.open(url)
}, }
}, }
}); })
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
@@ -157,7 +193,6 @@ export default defineComponent({
height: 100%; height: 100%;
flex-direction: column; flex-direction: column;
&.openSignUp { &.openSignUp {
.homeRecommend_heade { .homeRecommend_heade {
position: relative; position: relative;
@@ -185,7 +220,7 @@ export default defineComponent({
position: absolute; position: absolute;
align-items: center; align-items: center;
z-index: 2; z-index: 2;
border-bottom: 1px solid #DDD; border-bottom: 1px solid #ddd;
@media (max-width: 768px) { @media (max-width: 768px) {
z-index: 1000; z-index: 1000;
padding: 1.4rem 2.1rem; padding: 1.4rem 2.1rem;
@@ -236,7 +271,7 @@ export default defineComponent({
display: flex; display: flex;
margin-right: 1rem; margin-right: 1rem;
@media (max-width: 768px) { @media (max-width: 768px) {
margin-right: .7rem; margin-right: 0.7rem;
font-size: 2rem; font-size: 2rem;
} }
} }
@@ -251,20 +286,14 @@ export default defineComponent({
} }
} }
.homeRecommend_logo { .homeRecommend_logo {
// width: 14.4rem;
height: 8rem; height: 8rem;
// height: 4rem;
margin-top: 0; margin-top: 0;
margin-right: 2rem; margin-right: 2rem;
@media (max-width: 768px) { @media (max-width: 768px) {
// height: 1.76rem; // height: 1.76rem;
height: 4.5rem; height: 4.5rem;
margin-right: .9rem; margin-right: 0.9rem;
} }
// &:last-child{
// margin-right: 2rem;
// }
} }
.login_footer_item_text { .login_footer_item_text {
// margin-left: 5rem; // margin-left: 5rem;
@@ -287,6 +316,22 @@ export default defineComponent({
align-items: center; align-items: center;
position: relative; position: relative;
height: 3.7rem; 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 { &.marLeft2 {
margin-left: 2rem; margin-left: 2rem;
} }
@@ -296,13 +341,13 @@ export default defineComponent({
margin: 0 0.8rem; margin: 0 0.8rem;
font-weight: 900; font-weight: 900;
span { span {
margin: .7rem; margin: 0.7rem;
} }
} }
.icon-xiala { .icon-xiala {
font-size: 1.4rem; font-size: 1.4rem;
cursor: pointer; cursor: pointer;
transition: .3s all; transition: 0.3s all;
} }
.icon_rotate { .icon_rotate {
-moz-transform: rotate(180deg); -moz-transform: rotate(180deg);
@@ -312,7 +357,6 @@ export default defineComponent({
} }
} }
} }
} }
.content { .content {
flex: 1; flex: 1;