-
好像了解一些监控产品 比较喜欢看监控这一类
-
这个问题困扰我好久了
-
一、概述1.1 案例介绍本案例使用华为云码道(CodeArts)代码智能体,从零开始完成一个花店管理系统(花语轩)的全流程开发与云端部署。涵盖需求分析、方案设计、前后端编码、调试验证、ECS部署上线全流程,体验AI辅助编程的高效开发模式。网站url:http://124.71.227.253,仓库地址:https://gitcode.com/2301_80246598/Flower-shop-web.git1.2 适用对象高校学生个人开发者1.3 案例时间本案例总时长预计90分钟。1.4 案例流程说明:在华为云控制台购买ECS弹性云服务器,配置VPC与安全组;使用华为云码道CodeArts代码智能体,通过自然语言对话完成需求规格设计、方案设计和编码任务规划;在CodeArts辅助下完成前后端代码编写、调试和功能验证;将项目构建产物上传至ECS,配置MySQL、Nginx等服务,完成线上部署。1.5 资源总览本案例预计花费164.38元。体验完成后请及时释放资源,避免产生多余的费用。资源名称规格单价(元)华为云码道(CodeArts)代码智能体专业版105.77弹性云服务器 ECS1 vCPU | 1GiB | Huawei Cloud EulerOS 2.030.60云硬盘 EVS高IO | 40GiB28.00虚拟私有云 VPC按需0.01二、环境和资源准备2.1 购买ECS弹性云服务器登录华为云控制台,点击菜单 服务列表 > 计算 > 弹性云服务器,点击"购买弹性云服务器"。选择如下配置:- 计费模式:包年/包月- 区域:可选就近区域- 规格:通用计算型 | 1 vCPU | 1GiB- 镜像:Huawei Cloud EulerOS 2.0 标准版 64位- 系统盘:高IO | 40GiB- 网络:默认VPC和安全组设置登录凭证:root用户,密码自定义。点击"立即购买",等待ECS创建完成。注意:由于1GiB内存较小,后续部署时需为MySQL配置低内存模式并添加2GB Swap交换分区。2.2 开通华为云码道CodeArts登录华为云码道,开通CodeArts服务。在CodeArts中创建项目,进入代码智能体(CodeArts IDE)开发环境。2.3 本地开发环境要求在CodeArts IDE中开发时,需确保本地已安装以下工具:JDK 17+Maven 3.8+Node.js 18+MySQL 8.0+说明:CodeArts代码智能体可在对话中直接执行命令,无需手动切换终端。三、码道研发花店管理系统3.1 需求规格设计在CodeArts代码智能体中,通过自然语言描述项目需求,智能体自动生成需求规格文档(spec.md)。向CodeArts输入需求描述:开发一个花店管理系统(花语轩),课程项目,实现鲜花的分类管理、上架下架管理、会员管理(普通会员/黄金会员/白金会员/普通顾客)、购物车、模拟付款、畅销统计等完整业务闭环。CodeArts自动生成需求规格文档,包含:用户注册即成为普通会员,累计消费金额到达门槛自动升级(≥500元→黄金会员9折,≥2000元→白金会员8折),等级不降级付款做"模拟付款"即可完整业务流程:用户登录→浏览鲜花→加入购物车→修改数量/勾选结算→生成订单→计算折扣→确认付款→扣减库存(乐观锁)→记录销量→清空已购购物车项→更新累计消费→检测会员升级前端需展示鲜花图片技术栈:后端 Spring Boot 3.x + MyBatis-Plus + MySQL 8.0 + JWT,前端 Vue 3 + Element Plus + Pinia3.2 方案设计与任务规划3.2.1 设计文档生成CodeArts根据需求规格自动生成实现方案设计文档(design.md),包括:系统架构:前后端分离,后端Spring Boot提供RESTful API,前端Vue 3 SPA数据库设计:6张核心表(t_member、t_category、t_flower、t_cart_item、t_order、t_order_item)API设计:6组Controller(Member、Category、Flower、Cart、Order、Admin)会员等级与折扣策略3.2.2 编码任务规划CodeArts根据设计文档自动生成编码任务清单(tasks.md),将开发工作分解为可执行的任务项。3.3 后端开发3.3.1 项目结构CodeArts自动生成后端项目结构:flower-shop-server/ ├── pom.xml ├── src/main/java/com/flowershop/ │ ├── FlowerShopApplication.java │ ├── common/ # UnifiedResponse, ErrorCode, BusinessException │ ├── config/ # JwtUtil, CorsConfig, MyBatisPlusConfig, WebMvcConfig │ ├── filter/ # JwtAuthFilter │ ├── entity/ # Member, Category, Flower, CartItem, Order, OrderItem │ ├── entity/enums/ # MemberLevel, MemberRole, FlowerStatus, OrderStatus │ ├── dto/ # 11个请求DTO │ ├── vo/ # 14个响应VO │ ├── mapper/ # 6个Mapper接口 │ ├── service/impl/ # 6个Service实现 │ └── controller/ # 6个Controller └── src/main/resources/ ├── application.yml ├── schema.sql └── data.sql 3.3.2 关键代码说明1) 会员等级自动升级(MemberServiceImpl.java)会员等级根据累计消费自动升级,升级后不降级:public void checkAndUpgradeLevel(Long memberId) { Member member = getById(memberId); BigDecimal totalSpent = member.getTotalSpent(); MemberLevel oldLevel = member.getLevel(); MemberLevel newLevel = oldLevel; if (totalSpent.compareTo(new BigDecimal("2000")) >= 0) { newLevel = MemberLevel.PLATINUM; } else if (totalSpent.compareTo(new BigDecimal("500")) >= 0) { newLevel = MemberLevel.GOLD; } if (newLevel != oldLevel) { member.setLevel(newLevel); updateById(member); } } 2) 乐观锁扣减库存(FlowerMapper.java)使用MyBatis-Plus的乐观锁机制防止超卖:@Update("UPDATE t_flower SET stock = stock - #{quantity}, sales = sales + #{quantity} WHERE id = #{id} AND stock >= #{quantity}") int deductStock(@Param("id") Long id, @Param("quantity") Integer quantity); 3) JWT认证过滤器(JwtAuthFilter.java)公开路径放行,其余请求需携带JWT Token:private static final String[] PUBLIC_PATHS = { "/api/v1/member/login", "/api/v1/member/register", "/api/v1/flowers", "/api/v1/categories", "/images/**", "/error" }; 3.3.3 数据库初始化schema.sql定义6张核心表,data.sql初始化1个管理员、6个分类、16款鲜花:3.3.4 编译与启动在CodeArts终端中执行:.\start-backend.bat3.4 前端开发3.4.1 项目结构CodeArts自动生成前端项目结构:flower-shop-web/ ├── vite.config.js ├── package.json ├── src/ │ ├── main.js │ ├── App.vue │ ├── router/index.js │ ├── stores/ # user.js, cart.js (Pinia) │ ├── utils/request.js # Axios封装 │ ├── api/ # 6个API模块 │ └── views/ # 8个用户页面 + 4个管理页面 └── dist/ # 生产构建产物 3.4.2 关键配置说明1) Vite代理配置(vite.config.js)开发环境下,前端通过Vite代理访问后端API和图片资源:server: { port: 5173, proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true }, '/images': { target: 'http://localhost:8080', changeOrigin: true } } } 2) 路由守卫(router/index.js)根据用户角色控制页面访问权限,管理员可访问管理后台页面。3.4.3 安装依赖与启动.\start-fronted.bat 3.5 功能验证与Bug修复在CodeArts辅助下,通过浏览器自动化测试完整业务流程,发现并修复了以下Bug:3.5.1 图片显示问题问题:外部图片URL存在防盗链,前端无法显示鲜花图片。解决:起初CodeArts创建SVG占位图放在后端static/images/目录下,数据库中image_url改为本地路径如/images/rose1.svg。后续提供了可用的外部图片URL后,替换回外部链接。3.5.2 Vite代理未覆盖images路径问题:vite.config.js只代理了/api,但图片路径/images/**也需要代理到后端8080端口。解决:在vite.config.js中添加/images代理规则。3.5.3 创建订单时total_amount为null问题:OrderServiceImpl.createOrder()先执行insert再计算金额,导致total_amount字段为null(数据库不允许为空)。解决:调整为先计算所有金额,再一次性插入订单。3.5.4 管理员菜单不显示问题:MemberVO缺少role字段,前端无法判断用户是否为管理员。解决:在MemberVO中添加role字段,并在toMemberVO()方法中设置vo.setRole(member.getRole().name())。3.5.5 完整流程验证在CodeArts辅助下验证了完整的用户和管理员流程:用户流程:注册→登录→浏览鲜花→加入购物车→结算→生成订单→确认付款→状态变为"已支付"→购物车清空→销量更新管理员流程:admin登录→商品管理(含编辑/下架)→分类管理(含增删改)→会员管理(显示等级/消费)→畅销统计(排名/时间筛选)四、ECS部署项目4.1 构建生产版本4.1.1 构建前端在CodeArts终端中执行:cd flower-shop-web npm run build 构建产物输出到dist/目录。4.1.2 后端JAR包后端已通过mvn package -DskipTests构建,产物为flower-shop-server/target/flower-shop-server-1.0.0.jar。4.2 上传文件到ECS使用Python paramiko库通过SSH将构建产物上传到ECS服务器的/opt/flower-shop/目录:flower-shop-server.jar — 后端JAR包dist/ — 前端构建产物目录schema.sql — 数据库建表脚本data.sql — 数据库初始数据脚本4.3 安装服务器环境通过SSH连接ECS,安装运行所需软件:4.3.1 安装JDK 17ECS默认yum源无JDK 17,通过华为云镜像下载安装:curl -fsSL 'https://repo.huaweicloud.com/openjdk/17.0.2/openjdk-17.0.2_linux-x64_bin.tar.gz' -o /tmp/jdk17.tar.gz tar -xzf /tmp/jdk17.tar.gz -C /usr/local/ ln -sf /usr/local/jdk-17.0.2 /usr/local/jdk17 /usr/local/jdk17/bin/java -version 4.3.2 安装MySQL 8与Nginxyum install -y mysql-server nginx 4.3.3 配置MySQL低内存模式由于ECS仅1GiB内存,需为MySQL配置低内存模式并添加Swap:dd if=/dev/zero of=/swapfile bs=1M count=2048 chmod 600 /swapfile mkswap /swapfile swapon /swapfile cat > /etc/my.cnf.d/low-memory.cnf << 'EOF' [mysqld] performance_schema=OFF innodb_buffer_pool_size=128M innodb_log_buffer_size=8M max_connections=30 EOF 4.4 配置MySQL数据库4.4.1 重置root密码MySQL 8首次安装后root密码为随机值,需通过skip-grant-tables模式重置:systemctl stop mysqld systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking" systemctl start mysqld mysql -uroot -e "FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '246537Znc'; FLUSH PRIVILEGES;" systemctl stop mysqld systemctl unset-environment MYSQLD_OPTS systemctl start mysqld 4.4.2 创建数据库并导入数据mysql -uroot -p246537Znc -e "CREATE DATABASE IF NOT EXISTS flower_shop DEFAULT CHARACTER SET utf8mb4;" mysql -uroot -p246537Znc flower_shop < /opt/flower-shop/schema.sql mysql -uroot -p246537Znc flower_shop < /opt/flower-shop/data.sql 4.5 启动后端服务4.5.1 直接启动nohup /usr/local/jdk17/bin/java -Xmx256m -jar /opt/flower-shop/flower-shop-server.jar > /opt/flower-shop/backend.log 2>&1 & 4.5.2 配置systemd开机自启创建服务文件/etc/systemd/system/flower-shop.service:[Unit] Description=Flower Shop Backend After=network.target mysqld.service [Service] Type=simple ExecStart=/usr/local/jdk17/bin/java -Xmx256m -jar /opt/flower-shop/flower-shop-server.jar Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target 启用服务:systemctl daemon-reload systemctl enable flower-shop 4.6 配置Nginx反向代理创建Nginx配置文件/etc/nginx/conf.d/flower-shop.conf:server { listen 80; server_name _; root /opt/flower-shop/dist; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 启动Nginx:rm -f /etc/nginx/conf.d/default.conf nginx -t && systemctl restart nginx && systemctl enable nginx 4.7 防火墙放通80端口firewall-cmd --permanent --add-service=http firewall-cmd --reload iptables -I INPUT -p tcp --dport 80 -j ACCEPT 4.8 验证部署结果在浏览器中访问 [http://<ECS公网IP>](http://124.71.227.253),确认网站正常运行:五、网站功能说明5.1 管理员功能说明管理员账号:admin密码:admin1235.1.1 鲜花的分类管理可进行新增、删除、编辑分类名的操作,如新增洋桔梗类鲜花,删除某类鲜花,修改某类鲜花名称。5.1.2 鲜花上架下架管理下架某类鲜花后首页该花束不可见,可重新上架5.1.3 会员管理5.1.4 统计畅销鲜花5.2 用户功能说明5.2.1 会员等级消费升级用户注册即成为普通会员,累计消费金额到达门槛自动升级(≥500元一黄金会员9折,≥2000元白金会员8折),等级不降级。白金会员后续消费享受8折优惠。5.2.2 基本购物功能至此,码道驱动,打造花店管理系统案例结束!
-
一、概述1.1 案例介绍求职准备通常包含简历整理、岗位理解、技能差距分析、项目经历补充和面试训练等多个环节。传统方式需要用户在招聘网站、开源平台、笔记工具和面试题库之间反复切换,流程分散、反馈慢,也难以形成持续改进闭环。本案例围绕这一痛点,基于华为云码道代码智能体的规范开发模式,构建一个"面试模拟助手"应用。系统支持账号注册登录、简历上传与解析、岗位匹配分析、技能差距识别、GitHub 项目搜索与推荐、项目实践路径生成、模拟面试、面试报告和用户级 API Key 配置等功能。项目采用前后端分离架构:前端:Vue3、TypeScript、Element Plus、Pinia、Vite。后端:FastAPI、Uvicorn、SQLAlchemy、SQLite,支持后续切换 PostgreSQL。AI 能力:DeepSeek API,用于简历分析、项目推荐、技能指导和模拟面试。外部接口:GitHub API,用于开源项目搜索。文件解析:pdfplumber 解析 PDF,python-docx 解析 Word。部署方式:支持 Windows 桌面应用打包和华为云 ECS 云服务部署。整个过程先使用码道完成规范化开发,再通过 AI Shell 完成云资源规划、Terraform 编排、ECS 初始化、应用部署和访问验证,展示从自然语言需求到公网可访问应用的完整交付流程。案例技术选型:华为云码道(CodeArts)代码智能体:集代码大模型、AI IDE、Code Agent 为一体的智能编码产品。本案例使用其中的规范开发模式,从需求分析、技术设计、任务拆解到代码实现、测试验证,形成较完整的开发闭环。开发者空间 AI Shell:华为云提供的智能 AI 命令行工具。本案例通过自然语言对话完成项目结构分析、ECS 资源规划、Terraform 配置生成、云资源创建、远程部署和访问验证。Terraform:用于声明式创建华为云资源,包括 VPC、子网、安全组、ECS、EIP 和 EIP 绑定,降低手动配置云资源的复杂度。通过码道规范开发模式与 AI Shell 对话式部署的结合,本案例完成了"AI 求职辅助应用"的开发、部署和验证,让学生或个人开发者能够以较低门槛体验完整云上交付过程。仓库链接:interview_assistant:基于 FastAPI 与 Vue3 的面试模拟助手桌面应用 - AtomGit本项目部署链接:http://49.4.115.167/1.2 适用对象个人开发者:希望学习 Vue + FastAPI + AI API 的完整应用开发与云部署流程。高校学生:希望完成一个可展示、可部署、可写入课程作品或简历的 AI 项目。求职产品开发者:希望快速搭建简历分析、项目推荐和模拟面试类应用原型。云开发初学者:希望通过 AI Shell 理解 ECS、EIP、VPC、安全组和 Terraform 的基本用法。1.3 案例时间本案例总时长预计 90 到 120 分钟:环境准备与码道项目导入:10 分钟。规范开发模式分析、设计与任务拆解:20 分钟。代码开发与本地验证:30 分钟。AI Shell 分析部署资源并生成 Terraform:15 分钟。执行 Terraform 创建 ECS 并部署应用:20 到 30 分钟。公网访问验证与资源清理:10 分钟。如果已经具备项目源码、华为云账号和开发者空间环境,部署阶段可以压缩到 30 分钟左右。1.4 案例流程说明:用户首先在本地 PC 中打开华为云码道代码智能体,通过规范开发模式完成"面试模拟助手(Interview Assistant)"项目的需求分析、技术设计、任务拆解和代码生成。项目代码开发完成后,将源码提交到 GitCode 仓库中,作为后续云端部署的代码来源。随后,用户进入开发者空间 AI Shell,通过自然语言指令调用 AI Cli 工具,从 GitCode 拉取项目源码,并在云端环境中完成资源规划、Terraform 配置生成、ECS 创建、应用依赖安装、前后端构建、Nginx 反向代理和 systemd 服务配置。部署完成后,用户即可通过公网访问云端运行的 Interview_assistant 应用。1.5 资源总览本案例预计花费约 0 到 20 元,具体取决于 ECS 按需运行时长和带宽计费情况。资源名称规格费用说明华为云码道(CodeArts)代码智能体体验版免费开发者空间 AI Shell标准环境免费ECS 弹性云服务器s6.medium.2,1 vCPU / 2GB按需计费EIP 弹性公网 IP5 Mbps按流量或带宽计费VPC / 子网 / 安全组基础网络资源通常不单独计费EVS 系统盘Ubuntu 22.04,40GB SSD随 ECS 计费二、系统架构设计2.1 整体架构项目采用前后端分离架构,后端使用 FastAPI 提供 RESTful API,前端使用 Vue3 构建单页面应用。支持两种部署方式:桌面应用模式:通过 PyInstaller 和 pywebview 打包为 Windows 桌面应用,适合个人用户本地使用。云服务模式:部署到华为云 ECS,通过 Nginx 反向代理,支持多用户公网访问。数据存储使用 SQLite,用户配置和 API Key 按用户隔离存储。AI 能力通过 DeepSeek API 接入,GitHub 项目搜索通过 GitHub API 接入。2.2 项目结构说明项目核心结构如下:D:\Huawei |-- backend | |-- main.py # FastAPI 应用入口 | |-- config.py # 配置、数据目录、API Key、CORS | |-- database.py # SQLAlchemy 数据库连接和迁移 | |-- interview_assistant.spec # 后端 PyInstaller 打包配置 | |-- requirements.txt # 后端依赖 | |-- adapters | | |-- deepseek.py # DeepSeek API 适配器 | | |-- github_api.py # GitHub API 适配器 | |-- routers | | |-- auth.py # 注册登录 | | |-- resume.py # 简历上传和分析 | | |-- project.py # 项目搜索和推荐 | | |-- interview.py # 模拟面试 | | |-- system.py # API Key 管理 | |-- services | | |-- file_parser.py # PDF / Word 解析 |-- frontend | |-- package.json # 前端依赖 | |-- src | |-- router # Vue Router | |-- stores # Pinia 状态管理 | |-- utils/request.ts # Axios 请求封装 | |-- views # 登录、简历、项目、面试、设置页面 |-- launcher | |-- launcher.py # Windows 桌面启动器 | |-- requirements.txt # launcher 依赖 |-- installer | |-- setup.iss # Inno Setup 安装脚本 |-- deploy | |-- nginx.conf # Nginx 反向代理配置 | |-- interview-assistant.service # systemd 服务配置 | |-- init.sh # ECS 初始化部署脚本 |-- terraform | |-- providers.tf # HuaweiCloud Provider | |-- variables.tf # 变量定义 | |-- main.tf # VPC、子网、安全组、ECS、EIP | |-- outputs.tf # EIP、SSH 命令等输出 |-- tests | |-- test_windows_packaging.py # Windows 打包行为测试 | |-- test_account_api_isolation.py # 多账号 API Key 隔离测试 |-- build.py # 本地一键构建脚本 |-- config.ini.template # 默认配置模板 |-- README.md # 项目说明2.3 后端核心逻辑2.3.1 应用入口后端入口文件为 backend/main.py。它完成以下工作:创建 FastAPI 应用。注册 CORS 中间件。注册 auth、resume、project、interview、user、system 等路由。初始化数据目录、日志目录、上传目录和配置目录。调用 migrate_db() 创建或迁移 SQLite 表结构。在生产部署中监听 0.0.0.0,由 Nginx 反向代理访问。部署前,码道根据 AI Shell 的上云要求完成了关键调整:修改项文件说明后端监听地址backend/main.py从 127.0.0.1 调整为 0.0.0.0,适配 ECS 服务监听动态 API 地址backend/config.py避免硬编码 localhost,支持根据请求动态推断SECRET_KEYbackend/config.py改为环境变量优先,支持生产随机密钥CORS 配置backend/config.py支持环境变量 EXTRA_CORS_ORIGINS生产环境配置backend/.env.production新建生产配置模板Nginx 配置deploy/nginx.conf反向代理 80 到 FastAPI 8000systemd 服务deploy/interview-assistant.service进程守护和开机自启2.3.2 用户级 API Key 隔离API Key 相关逻辑位于 backend/config.py 和 backend/routers/system.py。系统按当前登录用户 ID 生成独立配置路径:def _get_user_api_key_file(user_id: int) -> str: user_dir = os.path.join(USER_CONFIG_DIR, f'user_{user_id}') os.makedirs(user_dir, exist_ok=True) return os.path.join(user_dir, 'api_keys.ini') 读取、写入和状态检查函数都支持 user_id 参数:def read_api_key(key_name: str, user_id: int = 0) -> str | None: ... def write_api_key(key_name: str, key_value: str, user_id: int = 0) -> None: ... def get_all_api_keys_status(user_id: int = 0) -> dict: ... 系统设置接口通过 get_current_user 获取当前用户,并将 user.id 传入 API Key 操作:@router.put("/api-keys") def update_api_key(req: ApiKeyUpdateRequest, user: User = Depends(get_current_user)): ... write_api_key(key_name, key_value, user_id=user.id) DeepSeek 和 GitHub 适配器也接收 user_id,确保 AI 调用使用当前账号自己的密钥:adapter = DeepSeekAdapter(user_id=user.id) adapter = GitHubAdapter(user_id=user.id) 2.4 前端核心逻辑前端位于 frontend 目录,使用 Vue3 + TypeScript + Element Plus。主要页面包括:页面文件功能登录src/views/auth/LoginView.vue用户登录并保存 token注册src/views/auth/RegisterView.vue创建新账号仪表盘src/views/dashboard/DashboardView.vue展示简历、项目和面试概况简历优化src/views/resume/ResumeView.vue上传简历、分析岗位匹配项目推荐src/views/project/ProjectView.vue搜索项目、刷新推荐、生成实践路径模拟面试src/views/interview/InterviewView.vue创建面试会话并答题面试报告src/views/interview/InterviewReportView.vue查看评分与改进建议设置src/views/settings/SettingsView.vue配置 DeepSeek、GitHub 和 TTS请求封装位于 frontend/src/utils/request.ts,会自动读取本地 token,并在接口返回 401 时尝试刷新登录态。三、使用华为云码道(CodeArts)代码智能体辅助完成代码开发及调试3.1 代码智能体在项目开发中的应用华为云码道(CodeArts)代码智能体在本项目中发挥了关键作用,辅助完成了以下开发任务:需求分析与规格定义:根据自然语言需求生成详细的需求规格文档,明确功能边界和技术要求。技术设计与架构规划:基于需求规格生成完整的技术设计方案,包括前后端技术选型、数据库设计、API 设计等。任务拆解与排期:将复杂项目拆解为可执行的开发任务,形成清晰的开发路线图。代码生成与补全:智能体根据需求描述自动生成后端 API 路由、前端组件、数据库模型等代码片段,显著减少手动编码工作量。代码审查与优化:智能体对现有代码进行审查,识别潜在的性能问题、安全漏洞和代码风格不一致,并提供优化建议。调试支持:智能体协助定位运行时错误,分析日志输出,提供修复建议,加速问题排查。测试用例生成:智能体根据功能描述自动生成单元测试和集成测试用例,提高测试覆盖率。文档生成:智能体根据代码注释和结构自动生成 API 文档、部署说明和用户手册。架构设计建议:智能体提供前后端分离架构、数据库设计、API 设计等方面的最佳实践建议。3.2 规范开发模式流程3.2.1 输入需求并启动规范开发在码道代码智能体中切换到规范开发模式后,可以输入类似提示词:我希望开发一个面向求职准备场景的面试模拟助手系统。 系统需要支持以下功能: - 用户注册登录 - 简历上传与解析 - 岗位匹配分析 - 技能差距识别 - 开源项目推荐 - 项目实践路径生成 - 模拟面试 - 面试报告 - 用户个人 API Key 配置。 前端使用 Vue3 + TypeScript + Element Plus,后端使用 FastAPI + SQLAlchemy,AI 能力接入 DeepSeek API。 请按规范开发模式帮我完成需求分析、技术设计、任务拆解、代码实现和测试验证。码道会按照规范开发流程推进,先分析业务目标和功能边界,再生成技术设计与任务列表,最后进入代码实现与测试阶段。3.2.2 项目核心能力模块功能说明用户认证注册、登录、刷新 token、JWT 鉴权简历解析上传 PDF / Word 简历,解析文本并保存岗位分析输入目标岗位 JD,生成匹配分数、差距和建议项目推荐结合简历和岗位目标,通过 DeepSeek 与 GitHub API 推荐项目实践路径为推荐项目生成阶段化实践路线模拟面试根据简历和岗位生成面试题,支持答题、追问和报告用户设置保存 DeepSeek API Key、GitHub Token、TTS 服务地址部署适配支持 Nginx 反向代理、systemd 守护、生产环境变量3.3 具体应用场景3.3.1 后端开发辅助FastAPI 路由生成:智能体根据需求描述自动生成完整的 CRUD 路由,包括请求验证、数据库操作和响应格式化。SQLAlchemy 模型设计:智能体协助设计数据库表结构,生成符合业务需求的 ORM 模型。错误处理与日志:智能体建议统一的错误处理中间件和日志记录策略。API Key 加密存储:智能体提供安全的 API Key 存储方案,包括加密算法选择和密钥管理策略。3.3.2 前端开发辅助Vue3 组件生成:智能体根据设计稿或功能描述生成 Vue 单文件组件,包括模板、脚本和样式。TypeScript 类型定义:智能体根据后端 API 响应自动生成 TypeScript 接口定义,确保类型安全。状态管理设计:智能体建议 Pinia store 结构,优化状态管理和组件通信。路由守卫实现:智能体生成认证和授权路由守卫,保护需要登录的页面。3.3.3 桌面应用打包辅助PyInstaller 配置优化:智能体提供 PyInstaller spec 文件的最佳配置,解决隐藏控制台、资源打包等问题。pywebview 集成:智能体协助实现桌面窗口启动器,管理后端进程和前端页面加载。Inno Setup 脚本编写:智能体生成完整的安装脚本,包含文件复制、快捷创建和卸载清理。3.3.4 测试与调试辅助单元测试生成:智能体根据业务逻辑自动生成 pytest 测试用例,覆盖正常和异常场景。API 测试脚本:智能体生成 Postman 风格的 API 测试脚本,方便接口验证。性能调优建议:智能体分析代码性能瓶颈,提供数据库查询优化、缓存策略等建议。安全审计:智能体检查代码中的安全漏洞,如 SQL 注入、XSS、CSRF 等,并提供修复方案。3.4 开发效率提升通过华为云码道(CodeArts)代码智能体的辅助,本项目开发效率提升显著:开发时间缩短约 40%:智能体自动生成基础代码,减少重复劳动。代码质量提升:智能体的代码审查和建议帮助保持代码风格一致,减少潜在 bug。文档完整性提高:智能体自动生成的文档覆盖全面,减少手动编写工作量。问题解决速度加快:调试支持功能帮助快速定位和修复问题。四、解决方案4.1 整体解决方案本项目提供了一套完整的面试模拟助手解决方案,包括:用户管理:注册、登录、JWT 认证、Token 刷新。简历管理:PDF/Word 简历上传、解析、存储、编辑。岗位匹配分析:基于 AI 的简历与岗位描述匹配度分析、技能差距识别。开源项目推荐:根据技能差距推荐 GitHub 开源项目,生成实践路径。模拟面试:AI 生成面试题、实时评估答案、生成面试报告。多部署模式:支持 Windows 桌面应用打包和华为云 ECS 云服务部署。多用户隔离:每个用户的 API Key、简历数据、面试记录完全隔离。4.2 技术栈选择组件技术选型理由后端框架FastAPI高性能、异步支持、自动 API 文档生成数据库SQLite轻量、无需单独部署、适合桌面应用和简单云部署ORMSQLAlchemyPython 生态成熟、支持异步操作前端框架Vue3 + TypeScript响应式、类型安全、生态丰富UI 组件库Element Plus企业级组件、与 Vue3 完美集成状态管理PiniaVue3 官方推荐、TypeScript 友好构建工具Vite快速构建、热重载、开发体验好桌面启动器pywebview轻量、跨平台、可嵌入浏览器打包工具PyInstaller将 Python 代码打包为独立 exe安装包生成Inno SetupWindows 安装包制作、免费开源云部署华为云 ECS弹性计算、按需付费、稳定可靠基础设施即代码Terraform声明式云资源配置、可重复部署反向代理Nginx高性能、稳定、配置简单进程管理systemdLinux 标准服务管理、开机自启4.3 部署方案开发环境:前后端分离运行,便于调试。桌面应用:打包为 Windows 桌面应用,用户一键安装使用。云服务环境:部署到华为云 ECS,通过 Nginx 反向代理,支持多用户公网访问。数据存储:用户数据存储在本地 %APPDATA% 目录(桌面应用)或 /opt/interview_assistant/data(云部署),确保数据持久化。配置管理:API Key 等敏感配置按用户加密存储,支持多用户隔离。五、核心技术难点与解决思路5.1 多用户 API Key 隔离难点:多个用户使用同一台电脑或同一云服务时,需要确保每个用户的 API Key 相互隔离,避免密钥泄露和混用。解决方案:按用户 ID 创建独立配置目录:%APPDATA%\面试模拟助手\config\user_<用户ID>\(桌面应用)或 /opt/interview_assistant/data/config/user_<用户ID>/(云部署)每个用户的 API Key 加密存储在自己的配置文件中所有 API 调用都传入当前用户 ID,确保使用正确的密钥系统设置接口只操作当前用户的配置实现代码:def _get_user_api_key_file(user_id: int) -> str: user_dir = os.path.join(USER_CONFIG_DIR, f'user_{user_id}') os.makedirs(user_dir, exist_ok=True) return os.path.join(user_dir, 'api_keys.ini') 5.2 桌面应用无控制台窗口难点:打包后的 Python 后端 exe 会显示黑色控制台窗口,影响用户体验。解决方案:在 PyInstaller spec 中设置 console=False桌面启动器使用 subprocess.CREATE_NO_WINDOW 标志启动后端进程后端使用 uvicorn.run(..., log_config=None) 避免日志输出到控制台实现代码:# PyInstaller spec console=False # 启动器代码 startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = subprocess.SW_HIDE process = subprocess.Popen( [exe_path, '--port', str(port)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo, creationflags=subprocess.CREATE_NO_WINDOW ) 5.3 前端静态资源嵌入后端难点:桌面应用需要将前端构建产物嵌入后端 exe,避免依赖外部文件;云部署需要将前端资源部署到合适位置。解决方案:前端使用 Vite 构建,输出到 frontend/dist桌面应用:PyInstaller 将 frontend/dist 目录打包到 _internal/web,后端启动时检查是否在打包环境中,如果是则从 _internal/web 加载静态文件云部署:前端构建产物复制到 /opt/interview_assistant/frontend/dist,Nginx 配置静态文件服务使用 StaticFiles 挂载静态资源目录实现代码:if getattr(sys, 'frozen', False): # 打包环境 web_dir = os.path.join(sys._MEIPASS, 'web') else: # 开发环境 web_dir = os.path.join(os.path.dirname(__file__), '..', 'frontend', 'dist') app.mount("/", StaticFiles(directory=web_dir, html=True), name="web") 5.4 简历文件解析难点:支持 PDF 和 Word 格式简历,提取结构化文本信息。解决方案:PDF 使用 pdfplumber 提取文本Word 使用 python-docx 提取文本统一文本清洗流程:去除多余空格、换行符、特殊字符提取关键信息:姓名、联系方式、教育经历、工作经历、技能等实现代码:def parse_pdf(file_path: str) -> str: import pdfplumber text = "" with pdfplumber.open(file_path) as pdf: for page in pdf.pages: text += page.extract_text() + "\n" return clean_text(text) def parse_docx(file_path: str) -> str: from docx import Document doc = Document(file_path) text = "\n".join([paragraph.text for paragraph in doc.paragraphs]) return clean_text(text) 5.5 AI 接口调用与错误处理难点:AI 服务可能超时、限流或返回错误,需要优雅降级和重试机制。解决方案:实现适配器模式,统一 AI 服务接口添加超时设置和重试逻辑记录详细日志便于排查提供友好的用户错误提示实现代码:class DeepSeekAdapter: def __init__(self, user_id: int = 0): self.api_key = read_api_key("deepseek", user_id) self.timeout = 30 self.max_retries = 3 def chat(self, messages: List[Dict], temperature: float = 0.7) -> str: for attempt in range(self.max_retries): try: response = requests.post( "https://api.deepseek.com/v1/chat/completions", headers={"Authorization": f"Bearer {self.api_key}"}, json={"model": "deepseek-chat", "messages": messages}, timeout=self.timeout ) response.raise_for_status() return response.json()["choices"][0]["message"]["content"] except Exception as e: if attempt == self.max_retries - 1: raise time.sleep(2 ** attempt) # 指数退避 5.6 桌面应用单实例锁难点:防止用户多次点击启动多个应用实例,导致端口冲突和资源浪费。解决方案:使用 Windows 命名互斥体(Mutex)实现单实例锁启动时检查是否已有实例运行如果已有实例,激活现有窗口并退出实现代码:import win32event import win32api import winerror mutex_name = "Global\\面试模拟助手_Launcher" mutex = win32event.CreateMutex(None, False, mutex_name) if win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS: # 已有实例运行 sys.exit(0) 5.7 云部署适配与配置管理难点:将本地开发的应用适配到云环境,处理环境变量、文件路径、服务监听等问题。解决方案:使用环境变量配置生产环境参数,避免硬编码动态检测运行环境,调整配置路径和监听地址提供 Nginx 配置模板和 systemd 服务文件创建部署脚本自动完成环境初始化实现代码:# 生产环境配置 if os.getenv("ENVIRONMENT") == "production": SERVER_HOST = "0.0.0.0" # 监听所有网络接口 DATA_DIR = "/opt/interview_assistant/data" LOG_DIR = "/var/log/interview_assistant" else: SERVER_HOST = "127.0.0.1" # 本地开发 DATA_DIR = os.path.join(os.path.expanduser("~"), ".interview_assistant", "data") LOG_DIR = os.path.join(os.path.expanduser("~"), ".interview_assistant", "logs") 六、环境和资源准备6.1 准备码道开发环境参考华为云码道(CodeArts)代码智能体安装部署说明,完成 Windows 版码道安装并登录账号。打开项目后,进入代码智能体对话区域,选择"规范开发模式"。本案例使用规范开发模式完成以下工作:根据自然语言需求生成需求规格。根据需求规格生成技术设计。根据技术设计拆解开发任务。自动修改前后端代码。生成并运行测试。输出开发总结和交付说明。6.2 准备 AI 服务配置应用支持以下配置项:配置项是否必需说明DEEPSEEK_API_KEY必需用于 AI 简历分析、岗位匹配、项目推荐、技能指导和模拟面试GITHUB_TOKEN可选提高 GitHub API 搜索额度TTS_SERVICE_URL可选预留语音播报服务地址SECRET_KEY必需用于 JWT 和服务端加密,生产环境应使用强随机值项目在本地开发时支持用户在设置页保存个人 API Key;部署到 ECS 后,还需要在 backend/.env.production 中配置生产环境变量。6.3 准备项目源码本案例项目根目录为:D:\Huawei核心目录如下:D:\Huawei |-- backend # FastAPI 后端服务 |-- frontend # Vue3 前端工程 |-- launcher # Windows 桌面启动器 |-- installer # Windows 安装脚本 |-- deploy # 云部署配置 |-- terraform # Terraform 云资源配置 |-- tests # 测试用例 |-- build.py # 本地一键构建脚本 |-- README.md # 项目说明其中部署到 ECS 时主要使用 backend、frontend 和 deploy 相关文件。七、码道规范开发面试模拟助手7.1 本地验证后端本地启动:cd D:\Huawei\backend python -m pip install -r requirements.txt python -m uvicorn main:app --host 127.0.0.1 --port 8000 --reload 前端本地启动:cd D:\Huawei\frontend npm install npm run dev测试命令:cd D:\Huawei python -m unittest discover -s tests当前项目测试覆盖账号 API Key 隔离、Windows 打包配置等关键逻辑。7.2 使用核心功能7.2.1 注册和登录打开应用。进入注册页,填写邮箱、密码和昵称。注册成功后登录。登录后前端会保存 accessToken 和 refreshToken。7.2.2 配置 API Key进入"设置"页面,配置:DeepSeek API Key:用于 AI 能力。GitHub Token:用于 GitHub 项目搜索,可选。TTS 服务 URL:用于语音播报扩展,可选。保存后,后端会将配置写入当前登录用户目录:%APPDATA%\面试模拟助手\config\user_<用户ID>\api_keys.ini7.2.3 上传简历并分析岗位匹配进入"简历优化"页面。上传 PDF、DOC 或 DOCX 简历。系统解析简历文本并保存到本地数据库。输入目标岗位 JD。点击分析,系统调用 DeepSeek 生成匹配分数、技能差距和优化建议。后端对应接口:接口方法说明/api/v1/resume/uploadPOST上传并解析简历/api/v1/resume/analyzePOST根据简历和 JD 生成匹配分析/api/v1/resume/listGET获取当前用户简历列表/api/v1/resume/market-analysisPOST分析目标岗位市场要求/api/v1/resume/skill-guidancePOST生成技能补充指导7.2.4 生成项目推荐和实践路径系统会结合用户目标岗位、简历内容、岗位匹配差距和市场技能要求生成项目推荐。后端对应接口:接口方法说明/api/v1/project/searchGET使用 GitHub API 搜索开源项目/api/v1/project/refresh-recommendationsPOST使用 DeepSeek 刷新项目推荐/api/v1/project/{project_id}/guideGET生成项目复现指南/api/v1/project/{project_id}/practice-pathGET生成五阶段实践路径/api/v1/project/{project_id}/stage-progress/{stage_index}PUT更新实践阶段完成状态7.2.5 进行模拟面试进入"模拟面试"页面。选择面试类型和难度。系统根据简历和 JD 生成面试题。用户逐题作答。系统评估答案,可生成追问。完成后生成整体面试报告。后端对应接口:接口方法说明/api/v1/interview/sessionsPOST创建面试会话/api/v1/interview/sessions/{session_id}/answersPOST提交答案/api/v1/interview/sessions/{session_id}/completePOST完成面试并生成报告/api/v1/interview/sessions/{session_id}/reportGET查看面试报告/api/v1/interview/sessions/compareGET对比两次面试表现八、开发者空间 AI Shell 部署到华为云 ECS8.1 分析 ECS 部署资源完成代码开发后,打开开发者空间 AI Shell,输入提示词:帮我分析项目,我想将系统部署到ECS上,具体需要哪些资源,请帮我罗列一下AI Shell 会读取项目结构,识别该项目是前后端分离的面试模拟助手系统,并分析部署所需资源。AI Shell 推荐的最小化部署资源如下:ECS 弹性云服务器:s6.medium.2(1 vCPU / 2GB),Ubuntu 22.04,40GB SSDEIP 弹性公网 IP:5 Mbps 带宽,按流量或带宽计费VPC 虚拟私有云:默认配置,包含一个子网安全组:开放 80(HTTP)、443(HTTPS)、22(SSH)端口外部服务依赖:DeepSeek API、GitHub API部署架构:用户通过浏览器访问 EIP 公网 IPNginx 反向代理到 FastAPI 后端(端口 8000)FastAPI 服务处理业务逻辑,连接 SQLite 数据库前端静态资源由 Nginx 直接服务systemd 守护后端进程,确保服务高可用8.2 生成 Terraform 配置并调整代码继续在 AI Shell 中输入:帮我生成最经济的Terraform配置,并且帮我调整一下需要修改的部署要点AI Shell 先给出部署前需要修改的关键点:后端监听地址从 127.0.0.1 改为 0.0.0.0动态 API 地址配置,避免硬编码 localhostSECRET_KEY 改为环境变量优先CORS 配置支持环境变量 EXTRA_CORS_ORIGINS创建生产环境配置文件 backend/.env.production提供 Nginx 配置模板 deploy/nginx.conf提供 systemd 服务配置 deploy/interview-assistant.service随后 AI Shell 查询可用区、生成随机密码,并创建 Terraform 配置文件:terraform/providers.tf:HuaweiCloud Provider 配置terraform/variables.tf:变量定义terraform/main.tf:VPC、子网、安全组、ECS、EIP 资源配置terraform/outputs.tf:EIP、SSH 命令等输出8.3 执行 Terraform 创建云资源确认资源方案后,在 AI Shell 中输入:请使用以上配置,执行terraform applyAI Shell 执行:cd /root/interview_assistant/terraform terraform apply -auto-approveTerraform 创建了 10 个资源,包括 VPC、子网、安全组、安全组规则、ECS、EIP 和 EIP 绑定。部署完成后,ECS 状态为 ACTIVE。8.4 连接 ECS 并部署应用ECS 创建完成后,继续输入:帮我连接到ECS并部署应用AI Shell 通过 SSH / SFTP 将项目上传到 ECS,并执行部署脚本。部署脚本主要完成:安装系统依赖。安装 Node.js 18。创建 Python 虚拟环境。安装后端依赖。构建前端 dist。配置 Nginx。配置 systemd 服务。启动 interview-assistant 服务。验证前端、API 文档和健康检查接口。部署过程中修复的问题:问题处理方式pip install 冲突清理残留的超时进程后重新安装deploy/ 目录缺失配置文件补提交到 git,并通过 SFTP 上传DATA_DIR 权限错误从 /var/www/面试模拟助手 改为 /opt/interview_assistant/data最终部署结果:ECS: 49.4.115.167(s6.medium.2,Ubuntu 22.04)应用路径: /opt/interview_assistantPython 虚拟环境: /opt/interview_assistant/backend/venvNode.js: v18.20.8前端构建: /frontend/dist数据目录: /opt/interview_assistant/data配置文件: backend/.env.production待办事项:在 .env.production 中补充真实 DEEPSEEK_API_KEY,否则 AI 面试和分析功能无法正常调用。可选配置域名、SSL 证书和 GitHub Token。生产环境建议使用 SSH 密钥登录,替代密码登录。九、打包为 Windows 桌面应用9.1 构建前端静态资源cd D:\Huawei\frontend npm run build构建成功后会生成:D:\Huawei\frontend\dist后端 PyInstaller 打包时会把该目录复制到 _internal\web,由 FastAPI 挂载为静态页面。9.2 打包后端服务进入后端目录:cd D:\Huawei\backend python -m pip install -r requirements.txt python -m PyInstaller interview_assistant.spec --noconfirm --clean --distpath D:\Huawei\dist_backend构建产物:D:\Huawei\dist_backend\interview_assistant\interview_assistant.exe D:\Huawei\dist_backend\interview_assistant\_internal\web\index.htmlinterview_assistant.spec 中配置了 console=False,后端 exe 在 launcher 调用时不会弹出黑色命令窗口。9.3 打包桌面 launcherlauncher 位于 launcher/launcher.py,主要职责如下:读取安装目录下的 config.ini。查找可用端口,默认从 8000 到 8010。启动后端 interview_assistant.exe。等待 /health 接口可用。使用 pywebview 打开桌面小窗口,而不是跳转浏览器。在 Windows 下使用单实例锁,避免多次点击创建多个 launcher.exe。关闭窗口时终止后端进程。打包命令:cd D:\Huawei\launcher python -m pip install pyinstaller pystray Pillow pywebview python -m PyInstaller --onefile --windowed --name launcher --noconfirm --clean --distpath D:\Huawei\dist_launcher --workpath D:\Huawei\launcher\build --specpath D:\Huawei\launcher\build launcher.py构建产物:D:\Huawei\dist_launcher\launcher.exe9.4 生成安装包安装脚本位于:D:\Huawei\installer\setup.iss安装包会包含:后端目录 dist_backend\interview_assistant桌面启动器 dist_launcher\launcher.exe配置文件 installer\config.ini桌面快捷方式和开始菜单快捷方式生成安装包:Copy-Item -Path 'D:\Huawei\config.ini.template' -Destination 'D:\Huawei\installer\config.ini' -Force & 'C:\Users\User\AppData\Local\Programs\Inno Setup 7\ISCC.exe' 'D:\Huawei\installer\setup.iss' 输出文件:D:\Huawei\output\面试模拟助手_Setup_v1.0.0.exe9.5 使用一键构建脚本项目根目录提供 build.py,可一键执行前端构建、后端打包、launcher 打包和安装包生成:cd D:\Huawei python build.py可选参数:python build.py --skip-frontend python build.py --skip-backend python build.py --skip-launcher python build.py --skip-installer python build.py --clean 十、访问验证和效果确认10.1 验证前端页面ECS部署完成后,在浏览器访问AI shell给出的链接页面正常显示登录界面,表示前端静态资源已正确部署,Nginx 配置生效。10.2 验证 API 文档访问:http://xx.x.xxx.xxx/docs返回 FastAPI 自动生成的交互式 API 文档,表示 FastAPI 服务正常运行,并且 Nginx 已正确代理 API 文档。10.3 验证健康检查接口访问:http://xx.x.xxx.xxx/health或在服务器中执行:curl http://xxx.x.x.x:xxxx/health服务正常时返回健康状态信息。10.4 验证 systemd 服务在 ECS 上执行:systemctl status interview-assistant如果状态为 active (running),说明后端服务已经由 systemd 守护。后续服务器重启后,也可以自动拉起应用。十一、释放资源11.1 清理云资源ECS、EIP 和 EVS 均可能产生按需费用。体验完成后,如果不再使用,请在 AI Shell 中输入:帮我清理所创建的华为云资源或进入 Terraform 目录执行:cd /root/interview_assistant/terraform terraform destroy执行前请确认已经备份需要保留的数据,例如 SQLite 数据库、上传的简历文件和 .env.production 配置。11.2 清理本地构建产物如果只清理本地 Windows 构建产物,可在项目根目录执行:cd D:\Huawei python build.py --clean 该命令会清理:frontend/distbackend/distbackend/builddist_backenddist_launcheroutput11.3 卸载桌面应用如果通过安装包安装,可在 Windows"应用和功能"中卸载"面试模拟助手",或使用开始菜单中的卸载入口。卸载时安装脚本会尝试清理安装目录下的后端文件:{app}\backend用户数据默认保存在 %APPDATA%,用于保留登录账号、简历、项目、面试记录和 API Key 配置。需要彻底清理时,可手动删除:%APPDATA%\面试模拟助手删除该目录会清空本地数据库、上传文件、日志和所有用户 API Key 配置,请提前确认是否需要备份。十二、扩展资料说明12.1 技术文档华为云码道(CodeArts)代码智能体:https://codearts.huaweicloud.com/华为云 ECS 文档:https://support.huaweicloud.com/ecs/华为云 VPC 文档:https://support.huaweicloud.com/vpc/FastAPI 官方文档:https://fastapi.tiangolo.com/SQLAlchemy 官方文档:https://docs.sqlalchemy.org/
-
基于华为云码道与 ModelArts MaaS 的原创智能论文阅读学习助手PaperLens案例类型:AI 应用开发 / 智能阅读 / 开发者工具实践适用对象:高校学生、科研入门者、需要精读英文论文的个人用户在线体验:http://101.245.81.114代码仓库:falconousZhang/PaperLens_final参考体例:华为云开发者空间实战案例1. 案例介绍1.1 项目背景在阅读英文科研论文时,初学者经常遇到以下问题:PDF 排版复杂,正文、公式、图表与双栏文本之间缺乏清晰的阅读引导;论文中包含大量专业术语和长句,逐句翻译耗时,简单机翻又难以解释原理;阅读过程中产生的高亮、笔记和问题分散在不同工具中,难以形成连续的学习记录;通用大模型不了解当前论文上下文,容易给出脱离原文、缺少依据的回答;传统审稿工具更偏向评价论文质量,并不完全适合个人“读懂论文、掌握方法”的目标。PaperLens 因此被设计为一款 AI 驱动的个人论文阅读学习助手。系统以原始 PDF 为阅读主体,在不破坏论文版式的前提下,将总结、翻译、选中文字解释、论文问答、高亮、笔记、批判性阅读和学习报告导出整合到同一个工作台中。1.2 建设目标项目的核心目标不是替代用户阅读,而是降低进入论文内容的门槛,并让 AI 的每一次回答都尽量与论文原文建立联系。具体目标包括:保留原始 PDF 排版,提供逐页阅读体验;支持页面总结、全文翻译和选中文字解释;建立论文级多轮问答,让模型结合全文和历史对话回答;支持原文高亮与笔记,并按论文、页码进行管理;提供用户注册登录、数据隔离和管理员治理能力;将学习解释、笔记、批判性阅读等内容汇总导出为 Markdown、PDF 或 DOCX;使用低成本华为云资源完成可访问、可演示的部署。1.3 案例成果PaperLens 已形成从论文上传到学习资料沉淀的完整闭环:注册/登录 ↓ 上传 PDF → 文本与版式解析 → 进入逐页阅读工作台 ↓ ↓ 论文库管理 总结 / 翻译 / 选中文字解释 ↓ ↓ 阅读进度 多轮论文问答 ↓ ↓ 高亮与笔记 ← 原文定位与交互 → 批判性阅读 └───────────────┬───────────────┘ ↓ 学习报告导出图 1 PaperLens 论文库:集中展示论文解析状态、阅读进度、高亮与笔记数量,并支持继续阅读和论文管理。项目已部署在华为云 ECS,使用华为云 ModelArts Studio(MaaS)提供真实大模型推理能力,并通过 Docker Compose 运行前端、后端和 PostgreSQL。2. 整体解决方案2.1 方案概述PaperLens 采用前后端分离架构。浏览器负责 PDF 页面展示、文本选择和学习交互;后端负责用户权限、论文解析、任务状态、模型调用、数据持久化和报告生成。大模型能力通过统一的 LLMClient 抽象接入,当前实际部署使用华为云 ModelArts Studio(MaaS)的对话模型服务。系统遵循三个设计原则:原文优先:左侧始终展示原始 PDF 页面,AI 结果作为辅助信息显示在右侧;来源可追溯:解析时记录页码、字符区间和文本块位置,学习内容可以重新定位到原文;任务可恢复:耗时操作以任务状态保存,页面刷新后可以恢复轮询,不依赖一次 HTTP 连接持续到模型返回。2.2 技术选型层次技术或服务作用前端Vue 3、TypeScript、Vite、Pinia、Vue Router、Axios阅读工作台、状态管理、路由保护和 API 调用后端Python、FastAPI、Pydantic、SQLAlchemyREST API、业务服务、参数校验和数据访问数据库PostgreSQL 16、Alembic用户、论文、页面、问答、解释、笔记、任务和审计数据PDF 处理PyMuPDF、pdfplumber页面渲染、正文提取、文本块定位和表格识别大模型华为云 ModelArts Studio(MaaS)、GLM-5.2总结、翻译、选中文字解释、论文问答和批判性阅读报告ReportLab、python-docxMarkdown、PDF、DOCX 学习报告生成部署华为云 ECS、VPC、安全组、弹性公网 IP、Docker Compose、Nginx单机容器化部署与公网访问研发辅助华为云码道(CodeArts)代码智能体需求理解、跨文件编码、测试设计、问题定位和部署调试2.3 开发环境与云资源准备本案例将“开发工具”和“运行资源”明确分开。码道、Rules 与 Skills 只在研发阶段使用,不会随应用一起部署;真正运行 PaperLens 时只需要前端、后端、数据库、文件卷和 MaaS 服务。类别本案例配置说明本地开发Windows、Git、Docker Desktop、Node.js、Python编码、容器联调和定向验收智能研发华为云码道(CodeArts)代码智能体、项目级 Rules、开发 Skills需求设计、编码、测试资产与问题定位大模型服务ModelArts Studio(MaaS)兼容对话接口由统一 LLMClient 调用,密钥仅通过环境变量注入云服务器华为云 ECS,Ubuntu 22.04,2 vCPU、4 GiB、40 GiB小规模实习项目的单机部署网络VPC、子网、安全组、弹性公网 IP,5 Mbit/s公网只开放 Web 入口和受限 SSH容器运行Docker Engine、Docker Compose运行 Nginx、FastAPI 和 PostgreSQL为控制成本,当前实际部署没有单独购买 RDS、OBS、ELB 或 Kubernetes。数据库与文件使用 ECS 上的 Docker 持久卷;项目保留向 RDS 和 OBS 演进的接口与部署资料,但案例不会把“已经设计”描述成“已经购买并运行”。3. 系统架构设计3.1 逻辑架构3.2 分层设计表现层前端采用 Vue 3 + TypeScript。核心页面包括登录注册、论文库、上传页面、论文阅读工作台、批判性阅读结果、报告导出和管理员控制台。论文阅读工作台采用左右分栏布局:左侧按页显示原始 PDF 图像,并叠加可选择的透明文本层;右侧在“学习解释、论文问答、学习记录”之间切换;用户选择原文后,可以直接创建黄色高亮、绿色笔记或发起通俗解释;点击历史解释时,系统自动跳转到对应页并高亮来源文本。接口层FastAPI 对外提供统一的 /api/v1 接口,按领域拆分为认证、论文、任务、学习解释、问答、论文库、学习记录、导出和管理员接口。Pydantic 负责输入输出边界,统一异常处理避免将数据库语句、文件路径或上游响应泄露给前端。业务层业务逻辑集中在 Service 层:pdf_parser:正文、章节、文本块、表格和 Evidence 解析;learning_service:页面总结、翻译与选中文字解释;qa_service、qa_retriever:论文级多轮问答和证据检索;highlight_service、note_service:高亮、笔记与原文锚点;review_service:批判性阅读;export_service、report_converter:学习报告组织与格式转换;admin_service:用户治理、内容元数据查询和审计。数据层PostgreSQL 保存结构化业务数据,Docker Volume 保存 PDF、页面图像和导出报告。数据库迁移由 Alembic 管理,容器启动时先执行迁移,再启动后端服务。3.3 核心数据流论文上传与解析用户上传 PDF,后端校验扩展名、文件头、大小和文件哈希;文件写入受控存储目录,创建论文记录和解析任务;PyMuPDF 提取页面正文、页面尺寸和文本块坐标;pdfplumber 尝试提取表格,表格失败不影响正文解析;系统生成页面、章节、文本分块和 Evidence 数据;论文状态更新为 PARSED,前端进入阅读工作台。学习解释用户选择总结、翻译,或在 PDF 文本层中选择一段原文;后端根据页码、字符区间和论文归属校验来源;系统构造带有明确边界的 Prompt,并调用 MaaS;模型输出经过结构校验和清洗后持久化;前端轮询任务状态,并将结果与对应页和选区关联。论文问答首次提问时,后端读取论文全文,在长度预算内构造论文上下文;后续提问同时附加最近的历史问答。检索模块优先识别问题中的页码、表号、图号等显式引用,再结合文本相关性选择候选证据。问答记录保存在会话中,用户可以切换、滚动查看或删除历史会话。3.4 华为云部署架构本案例定位为小规模实习项目,因此优先选择低成本、易维护的单机方案,而不是引入复杂的微服务集群。部署中只将 Nginx 的 80 端口发布到公网,后端 8000 和数据库 5432 仅在 Docker 私有网络中访问。数据库和文件目录使用持久卷,容器设置健康检查与 restart: unless-stopped。当前演示环境使用 HTTP;正式生产环境应增加域名、HTTPS 证书并启用 Secure Cookie。3.5 工程目录设计项目采用按前端、后端、部署和设计资料分区的单仓库结构。核心目录如下:PaperLens/ ├── backend/ │ ├── paperlens/ │ │ ├── api/ # FastAPI 路由与认证边界 │ │ ├── core/ # 配置、安全、错误和可观测性 │ │ ├── models/ # SQLAlchemy 业务模型 │ │ ├── schemas/ # Pydantic 请求与响应契约 │ │ └── services/ # 解析、解释、问答、记录和导出服务 │ ├── alembic/ # 数据库迁移链 │ └── tests/ # 后端测试资产 ├── frontend/ │ ├── src/api/ # API 客户端 │ ├── src/components/ # 阅读工作台组件 │ ├── src/stores/ # Pinia 状态 │ └── src/views/ # 登录、论文库、阅读、管理等页面 ├── deploy/huawei/ # 单 ECS 与生产化部署配置 ├── ProjectDocs/ # 需求、架构、页面、测试和 SDD 设计资料 ├── docker-compose.yml # 本地开发编排 └── README.md这种结构使码道能够先从设计资料理解约束,再定位到对应领域的路由、Schema、Service、模型和前端页面,减少把业务逻辑堆进单个文件的情况。3.6 核心数据模型PaperLens 的数据模型围绕“用户—论文—页面内容—学习行为”展开:数据域核心实体设计要点认证users、auth_sessions、password_reset_tokens角色、状态、刷新令牌轮换和密码重置论文papers、paper_pages、paper_sections、paper_chunks论文归属、解析状态、逐页正文和章节结构原文定位evidences、paper_tables页码、引用文本、字符区间、边界框和表格结构学习解释learning_explanations、learning_citations模式、范围、任务状态、来源引用和失败恢复论文问答paper_qa_conversations、paper_qa_turns、paper_qa_citations多轮顺序、幂等请求、上下文哈希和证据绑定学习记录paper_library_entries、paper_highlights、paper_notes阅读进度、黄色高亮、绿色笔记和原文锚点扩展分析analysis_tasks、review_results、metric_records、experiment_results批判性阅读、指标与实验理解导出与治理export_reports、admin_audit_logs报告状态、文件信息和管理员不可变审计任务型实体统一使用 PENDING → RUNNING → SUCCEEDED/FAILED 状态机。模型调用前结束数据库事务,模型返回后再用新事务写入结果,避免在外部网络等待期间长期持有连接或行锁。4. 使用华为云码道(CodeArts)代码智能体辅助开发与调试4.1 使用方式PaperLens 的功能跨度较大,涉及前端交互、后端 API、数据库迁移、PDF 处理、大模型调用和云端部署。项目使用华为云码道(CodeArts)代码智能体辅助理解代码库、拆解需求、生成跨文件代码、补充测试以及定位运行故障。项目没有采用“一次性生成整个系统”的方式,而是将开发过程拆成可验证的小阶段:明确用户目标 ↓ 形成单轮任务提示词和边界 ↓ 码道理解代码库并完成跨文件实现 ↓ 集中进行定向测试、构建或实际操作验收 ↓ 根据日志和页面现象定位问题 ↓ 码道完成同轮修正 ↓ 进入下一功能阶段4.2 Rules 与 Skills 工程化约束为了让智能体在长期迭代中保持一致,项目为码道配置了项目级规则和技能工作流,主要覆盖:需求细化与架构设计;页面原型和交互约束;前后端测试设计;功能详细设计与任务拆解;Sprint 进度管理;Bug 修复记录。每次给码道的任务都会说明目标、允许修改的范围、禁止事项、接口契约、数据一致性要求和验收方式。相比只描述“实现某功能”,这种结构化提示词能够降低跨文件修改遗漏、重复造轮子和无关重构的概率。4.3 提示词管理与迭代方法PaperLens 没有把码道提示词当作一次性聊天内容,而是为每个开发阶段保留任务编号、目标、约束、验收标准和后续状态。项目共形成 P1~P8.4 的 32 轮阶段提示词归档,使需求变化、实现边界和技术决策能够回溯。一条可执行的码道提示词通常包含以下结构:# 码道下一阶段提示词:<阶段编号与名称> ## 任务目标 - 本轮只解决什么问题 - 完成后用户能获得什么能力 - 与既有功能的关系 ## 开始前边界与真实基线 - 必读的设计文档和真实代码 - 当前迁移、接口、容器和功能状态 - 必须保护的用户数据与现有修改 - 禁止读取的密钥、令牌和环境信息 ## 设计与实现要求 - 数据模型、状态机和迁移规则 - API 请求/响应与错误语义 - Service、前端交互和安全边界 - 并发、幂等、事务和失败恢复 ## 测试资产与验收 - 只编写少量关键测试资产 - 码道不运行测试、构建、迁移或 Docker 命令 - 集中验收阶段执行定向测试、关键烟测和前端构建 ## 完成定义 - 允许修改的文件 - 必须同步的设计与 Sprint 文档 - 实际完成项、未完成项和风险必须如实报告提示词也随项目实践逐步演进:早期更强调从零搭建和运行验证;中期增加数据模型、API 契约、并发和安全约束;后期为了提高效率,码道只负责编写或更新少量测试资产,不在实现轮次运行耗时测试,测试执行统一放到集中验收阶段。4.4 代表性码道提示词节选以下内容选自项目实际提示词归档。为适合作为案例展示,省略了较长的文件清单、历史统计值和重复性约束,但保留了当轮的目标、关键边界与完成定义。提示词一:建立可运行工程骨架使用场景:项目初期先统一技术选型和数据契约,避免前后端、数据库和设计文档各自演进。你现在负责继续开发 D:\shixi\PaperLens 项目。 本轮目标不是一次性完成整个系统,而是完成“规格修正 + 可运行工程骨架”, 为后续端到端 MVP 开发建立稳定基础。 一、必须采用的 MVP 决策 1. 前端使用 Vue 3 + TypeScript + Vite + Pinia + Vue Router。 2. 后端使用 FastAPI + SQLAlchemy + Alembic。 3. 本地和部署均使用 PostgreSQL,不使用 SQLite。 4. Evidence 必须记录 page_number、quoted_text、bbox、char_start、 char_end、section_id 和 chunk_id,保证前端后续能够定位原文。 5. 上传统一使用 multipart 流式上传,最大 50 MB。 6. 后台任务进度统一使用 HTTP 轮询,暂不引入 WebSocket。 7. MVP 只支持可提取文本的 PDF,OCR 放入后续版本。 8. LLM 必须通过统一 LLMClient 调用,默认提供 MockLLMClient。 二、本轮交付 - 创建 backend、frontend、docker-compose.yml、.env.example 和 README。 - 后端实现健康检查、配置、数据库连接、ORM、首个迁移和统一错误结构。 - 前端实现基础路由、Pinia、首页、健康检查及后端不可用提示。 - Compose 只包含 PostgreSQL、backend 和 frontend。 三、边界 - 不写入真实密钥,不初始化或提交 Git。 - 不引入 Celery、Redis、Nginx、FAISS 或真实云服务。 - 不生成大量空接口或只有 pass 的占位代码。 - 本轮到“工程骨架可以启动、模型和契约自洽”为止, 不继续实现 PDF 解析和真实 LLM 功能。落地结果:码道完成了 FastAPI、Vue、PostgreSQL 与 Docker Compose 的基础工程,并建立了后续一直沿用的 Evidence 定位字段和 LLMClient 抽象。提示词二:接入华为云 ModelArts MaaS使用场景:在 Mock 模型链路已经可用后,增加真实华为云模型适配器,同时保证本地开发不依赖云端密钥。# P3.3 华为云 MaaS 真实生成式模型适配器 ## 任务目标 在不改变现有审阅 API、数据库模型和前端的前提下, 把 LLMClient 从“只有 Mock 实现”扩展为可配置的 HuaweiMaaSLLMClient。 默认本地和测试仍使用 MockLLMClient。 ## 实现边界 1. 复用现有 httpx,不新增第三方模型 SDK、requests 或重试库。 2. 华为 MaaS 适配器使用标准 chat/completions 请求结构。 3. endpoint、model、API Key、连接超时和读取超时全部来自 Settings。 4. API Key 使用安全类型保存,不得出现在日志、异常、响应或 repr 中。 5. 不修改公开 API、ORM、Alembic、Docker 和前端。 6. 云接口测试必须使用 MockTransport,禁止真实联网和产生费用。 ## 响应与失败处理 - 校验 HTTP 状态、响应 JSON、choices、message 和 content。 - 兼容模型返回单个完整 Markdown JSON 围栏。 - 拒绝前后杂文、多对象、字段缺失和未知字段。 - 上游失败统一转换为安全业务错误,不把响应正文或密钥返回给客户端。 ## 完成定义 - Mock 与 Huawei MaaS 通过同一 LLMClient 工厂切换。 - 没有云端配置时项目仍可离线运行。 - 配置示例只使用占位符,不读取、打印或提交真实密钥。落地结果:真实模型与 Mock 模型共用同一业务接口,学习解释、问答和批判性阅读无需感知底层供应商;部署时只需通过环境变量选择 MaaS 适配器。提示词三:把产品主线校正为论文阅读学习使用场景:项目中期确认“帮助个人用户读懂论文”才是核心目标,因此需要在保留已有分析能力的同时重构主要交互。# P7.1 论文阅读学习工作台与证据化学习解释 ## 任务目标 把 PaperLens 的产品主线从“辅助审稿”校正为“帮助个人用户阅读论文并学习”。 在已完成的 PDF 解析、章节/页面、Evidence、认证隔离和 Huawei MaaS LLMClient 基础上,实现受保护的论文阅读工作台,以及针对当前页面或 选中文字的总结、翻译和通俗解释闭环。 已有结构化审阅、指标提取、实验分析和报告能力继续保留,分别作为 “批判性阅读”“实验理解”和“学习成果导出”的高级能力,不删除或重做。 ## 来源与安全边界 1. 客户端只提交 mode、scope 和页码/选区标识,不提交论文正文或 prompt。 2. 后端根据当前用户和 paper_id 重新读取来源,禁止跨用户、跨论文引用。 3. 论文标题和正文均视为不可信输入,并放在明确标签中;其中出现的 “忽略之前指令”等文字不得覆盖 system 指令。 4. SUMMARY 概括当前范围;TRANSLATE 忠实翻译并保留标题、段落和编号; 选中文字解释要说明概念、原理和例子。 5. 结果必须保存页码、来源哈希和任务状态,失败只记录安全公开文案。 ## 前端交互 - 阅读页采用左右分栏,左侧保留原始 PDF 版式并支持文本选择。 - 右侧显示学习解释历史;点击记录跳转到来源页。 - 选中文字解释与原文位置关联,不能把解释结果挤在 PDF 正文下方。 - 页面切换或组件卸载时停止旧轮询,避免旧结果覆盖新页面。落地结果:PaperLens 从“生成审阅结论”转向“原文阅读 + 页面解释 + 学习沉淀”,形成当前最具辨识度的双栏阅读工作台。提示词四:实现论文级多轮问答使用场景:解决“论文里明明存在,模型却因为只收到当前页片段而回答没有”的问题。# P7.2 当前论文多轮问答与证据化会话 ## 任务目标 实现只围绕当前用户、当前论文的多轮问答。用户可以新建会话、连续提问、 查看历史;有依据的回答绑定服务端选取的论文来源,证据不足时明确降级, 不能用模型常识伪装成论文结论。 ## 上下文构造 1. 以当前 question 为 query,仅在当前论文的 Evidence 中做确定性相关性排序。 2. 后续提问附加同会话最近的成功问答,超限时按完整轮次从最旧开始移除。 3. 候选 Evidence 按相关度、页码、创建时间和 ID 稳定排序,并限制 top_k。 4. 当前问题、历史回答和论文正文全部视为不可信内容,不能提升为 system role。 5. Embedding 与 LLM 调用期间不得持有数据库事务或行锁。 ## 幂等与结果契约 - 请求包含 client_request_id;重复请求返回原轮次,不重复调用模型。 - 同一会话只允许一个 PENDING/RUNNING 轮次。 - 成功回答保存 answer、grounded 和来源引用;证据不足时 grounded=false。 - 模型只返回一个严格 JSON 对象,拒绝额外解释、未知字段和跨论文引用。 ## 前端交互 - 右侧使用类似即时通信软件的消息时间线。 - 会话历史和消息区域可独立滚动,输入区固定在底部。 - 支持新建、切换和删除会话,轮询在终态立即停止。落地结果:系统形成论文级会话、轮次、上下文预算和幂等机制。真实论文验证中发现仅依赖少量 Evidence 会漏掉跨页图表后,后续迭代又将策略调整为“首次提问按预算提供全文基础上下文,后续附加历史,并优先识别页码、表号和图号”,体现了设计根据实际效果继续修正的过程。提示词五:准备华为云部署与安全收口使用场景:开发轮次结束后,为 ECS 部署、备份恢复和后续云资源演进准备可复用资产。# P8.4 华为云部署、备份恢复与综合安全验收 ## 任务目标 在既有论文阅读学习、登录注册、管理员、任务恢复和限流能力基础上, 补齐华为云部署配置、备份恢复说明和安全清单,使项目达到 “代码与部署资料完整,等待真实云环境验收”的状态。 ## 真实性要求 1. 不实际购买、创建、修改或删除华为云资源。 2. 不把“部署资产已完成”写成“真实云上已经部署”。 3. 示例只能使用占位符,禁止读取或写入 API Key、AK/SK、JWT Secret、 数据库密码、真实 IP、域名和证书私钥。 4. 码道只编写代码、少量测试资产、部署配置和文档, 不运行测试、构建、迁移、Docker、HTTP 或真实云服务命令。 ## 部署资产 - 提供 deploy/huawei 下的环境示例、Compose、Nginx、部署和回滚说明。 - 后端和数据库不直接暴露公网;只由 Nginx 代理同源 /api/。 - 容器使用非 root、只读文件系统、tmpfs、no-new-privileges、 healthcheck、资源上限和 restart policy。 - Secret 通过受限环境文件或 secret 文件注入,entrypoint 不打印内容。 - 给出 VPC、安全组、ECS、MaaS、健康检查和小额验证的人工配置顺序。 ## 完成定义 区分“代码与部署资产已实现”“离线验收尚未执行” 和“真实华为云资源尚未创建/验证”三种状态,不夸大完成度。落地结果:项目形成单 ECS 演示编排和面向生产化演进的配置资料;真实部署时又根据小规模需求选择 PostgreSQL 与文件卷同机运行,避免为了案例展示购买不必要资源。4.5 码道参与的主要开发阶段阶段码道辅助内容形成的结果工程骨架分析前后端技术栈,生成 FastAPI、Vue、PostgreSQL、Docker 基础结构可运行的前后端与数据库环境PDF 解析实现上传校验、页面解析、章节识别、文本块坐标和 Evidence 生成从 PDF 到可阅读、可定位数据的链路大模型接入抽象 LLMClient,实现 Mock 与 Huawei MaaS 适配器本地离线开发与云端真实模型可切换阅读工作台跨文件实现 PDF 页面、透明文本层、左右分栏和选区工具条保留原版式的交互式阅读体验学习解释设计总结、翻译、选中文字解释的 Prompt、状态机和历史记录面向学习场景的 AI 辅助阅读能力论文问答设计会话、轮次、全文上下文、历史预算和检索策略支持论文内连续提问用户与管理实现 JWT、刷新令牌、用户隔离、管理员角色和审计完整登录注册与管理闭环报告导出组织解释、高亮、笔记和批判性阅读内容Markdown、PDF、DOCX 学习报告云端部署分析 Docker、Nginx、卷权限和 MaaS 日志在小规格华为云 ECS 上稳定运行4.6 码道辅助调试实例实例一:测试数据误写开发库早期测试虽然创建了测试数据库,但应用在模块导入时已经初始化了指向开发库的数据库连接,导致部分测试仍可能写入开发库。码道根据数据库记录变化和初始化顺序分析问题,协助调整为延迟配置数据库 Engine,并增加测试库名称守卫、迁移失败即终止和测试残留检查。解决后,测试环境明确使用 paperlens_test,避免自动化测试污染真实论文数据。实例二:真实 MaaS 输出格式不稳定Mock 模型始终返回标准 JSON,但真实模型可能返回 Markdown 代码围栏、额外解释或字段缺失。码道协助增加严格的响应解析、围栏兼容、字段校验和安全失败状态;学习解释还使用独立的较长读取超时,避免长页翻译被普通问答的超时配置提前终止。实例三:Docker 容器在 ECS 上反复重启部署时 Nginx 采用只读文件系统,但默认尝试在 /var/cache/nginx 创建临时目录,导致容器因权限不足反复重启。码道根据容器日志定位到临时目录问题,将相关目录调整到 /tmp,并通过受限 tmpfs 提供可写空间。后端文件卷也曾因宿主卷所有权不匹配导致上传失败,随后增加一次性的 storage-init 服务,在后端启动前修正目录所有者和权限。实例四:公网 HTTP 下论文问答误报网络失败浏览器在普通 HTTP 环境下不能保证提供 crypto.randomUUID()。前端在创建会话后生成幂等请求 ID 时抛出本地异常,因此服务器只看到会话被创建和删除,没有收到真正的问题请求。码道根据前后端访问日志定位到请求链中断位置,增加基于 getRandomValues 的 UUID v4 回退逻辑,并区分本地运行异常和真实网络异常。这些问题说明,代码智能体的价值不仅是生成代码,还包括结合代码库、日志、运行环境和数据状态完成工程化定位。5. 功能解决方案设计5.1 原版式 PDF 阅读系统不将 PDF 正文简单转换成连续纯文本,而是为每一页生成页面图像,同时输出带坐标的文本层。页面图像保证视觉排版与原论文一致,透明文本层负责文字选择、字符偏移计算和高亮交互。这种设计兼顾了两个目标:用户看到的是原论文版式、图片、公式和表格;系统仍能知道用户选中了哪段文字,并把操作绑定到页码和字符区间。图 2 论文阅读工作台:左侧按页保留原始 PDF 版式,右侧统一承载学习解释、论文问答和学习记录。5.2 页面级学习解释“总结”和“翻译”按页生成并保留历史:总结要求覆盖当前页的各级标题;如果一个段落延续到下一页,可读取有限的下一页上下文补全含义;翻译要求保留标题层级和正文段落,不将公式、编号和专有名词随意改写;选中文字解释只处理用户选择的原文,重点说明概念、原理和例子。所有解释按页排序。点击历史记录可跳转到来源页;选中文字解释打开时,对应原文保持蓝色高亮。图 3 页面完整翻译:在保留标题、作者信息和正文层次的基础上,对当前页内容进行中文翻译。图 4 选中文字解释:左侧原文保持蓝色定位高亮,右侧从概念、原理和示例角度给出通俗说明。5.3 论文级多轮问答论文问答采用类似即时通信软件的对话界面。系统保存完整会话历史,输入区固定在底部,消息区域可独立滚动。为了减少“论文里明明有,模型却回答没有”的情况,后端不只发送当前页摘要,而是在首次提问时组装论文全文上下文;后续轮次再附加历史问答,并对超长内容执行可预测的长度预算。对页码、图号、表号等问题,检索器给予显式引用更高优先级。图 5 论文级多轮问答:用户可以围绕指定页码、表格或方法连续追问,系统保留会话历史并结合论文内容回答。5.4 高亮和笔记用户可以直接在 PDF 上选择文字:高亮以黄色保存;笔记以绿色标记,并保存笔记正文;选中文字解释使用蓝色定位;学习记录只展示当前页的高亮和笔记。记录同时保存原文、页码、字符起止位置和来源哈希。当论文内容或解析结果发生变化时,系统可以识别来源不一致,避免错误定位。图 6 高亮与笔记:黄色标记用于原文高亮,绿色标记关联学习笔记,右侧仅展示当前页的学习记录。5.5 用户、权限与管理员系统系统支持注册、登录、刷新令牌、退出、修改密码、忘记密码和个人资料。密码使用 Argon2 哈希;访问令牌采用 JWT,刷新令牌使用 HttpOnly Cookie,并具有轮换和重放检测机制。所有论文、解释、问答和学习记录均按 user_id 隔离。管理员可以查看系统概况、管理用户状态和角色、只读查看跨用户内容元数据,关键操作写入不可变审计记录。5.6 学习报告导出报告不再限定为“审阅报告”。即使论文没有执行批判性阅读,只要存在学习解释、高亮或笔记,也可以生成学习报告。报告按页组织内容,并可选择是否加入批判性阅读、指标或实验信息,最终导出为 Markdown、PDF 或 DOCX。图 7 学习报告导出:支持 PDF、DOCX 和 Markdown,固定汇总学习解释、高亮摘录和学习笔记,并可按需加入扩展分析。6. 核心技术难点与解决思路6.1 PDF 视觉版式与文本交互难以兼得难点:直接展示 PDF 可以保留版式,但难以稳定获取选中文字的字符位置;只展示解析文本又会破坏双栏、图表和公式布局。解决思路:采用“页面图像 + SVG 透明文本层 + 解析文本索引”的三层结构。图像负责视觉,文本层负责浏览器选择,后端标准化文本负责字符区间与学习记录。6.2 解析结果存在不确定性难点:不同 PDF 的字体、编码、文本顺序和表格结构差异很大,单个表格解析异常可能导致整个事务失败。解决思路:对正文、章节、表格和 Evidence 分阶段处理;表格写入使用嵌套事务或降级策略,使局部失败不影响论文正文;对扫描版 PDF 明确返回不支持 OCR,而不是生成不可用结果。6.3 大模型回答必须与论文上下文绑定难点:如果只传当前页或少量 Evidence,模型可能无法理解跨页图表;如果直接无限制传全文,又会超过上下文或增加费用。解决思路:采用“全文基础上下文 + 当前页优先 + 显式页码/图表引用检索 + 历史轮次预算”的组合策略。系统保存上下文哈希和请求幂等键,避免同一问题被重复提交。6.4 模型输出和网络调用不稳定难点:真实模型可能返回围栏文本、非标准字段或较长推理内容;长页翻译比普通问答耗时更长。解决思路:统一 LLMClient 接口,设置连接与读取超时边界;不同任务可以覆盖单次读取超时;模型结果经过严格 Pydantic 校验,失败时写入安全的任务状态,不将上游响应和密钥返回给用户。6.5 异步任务与页面状态一致性难点:解析、解释、问答和导出都不是瞬时操作。快速切换论文或页面时,旧请求可能晚于新请求返回并覆盖界面。解决思路:后端采用持久化任务状态和原子认领,前端采用受控轮询、代次标识和组件卸载清理。刷新页面后重新查询活动任务,终态立即停止轮询。6.6 小规格 ECS 上的资源与可靠性难点:2 vCPU、4 GiB 内存同时运行镜像构建、数据库、后端和前端时容易出现内存压力;公网拉取 Docker Hub 镜像也可能超时。解决思路:配置交换分区和容器资源上限;使用多阶段构建缩小运行镜像;通过华为云 SWR 镜像加速拉取基础镜像;只运行单后端实例和小连接池,避免为实习项目引入 Redis、Celery、Kubernetes 等额外组件。7. 安全与可靠性设计真实 API Key、数据库密码和 JWT Secret 通过环境文件注入,不进入代码仓库;上传文件校验后缀、PDF magic、大小和存储路径,防止路径穿越;数据查询统一校验资源所有者,管理员接口使用独立权限保护;日志只记录请求 ID、阶段和安全错误分类,不记录论文全文、令牌或 MaaS 响应正文;后端与数据库不直接暴露公网端口;容器启用 no-new-privileges,前端使用只读文件系统;提供 live/ready 健康检查、启动恢复和容器自动重启;自动化测试使用独立测试数据库,并在测试前后检查数据残留。8. 项目实施过程8.1 分阶段建设项目采用逐阶段增量开发,每一阶段都对应独立提示词、设计更新和可验收结果。阶段主要任务阶段出口P1FastAPI、Vue、PostgreSQL、Docker 工程骨架首页与健康检查可运行,迁移链建立P2PDF 上传、解析、章节、页面、文本块、表格和 Evidence论文可从文件转换为结构化、可定位内容P3MockLLM、Embedding、Huawei MaaS、结构化结果前端真实模型与离线模型可以切换P4指标抽取、实验数据统计和模型运行配置模型理解与确定性计算分离P5实验文件导入、校验、比较和可视化论文实验结果可结构化分析P6Markdown、PDF、DOCX 报告分析结果可以形成文件交付P7阅读工作台、学习解释、多轮问答、高亮和笔记产品主线转为个人论文阅读学习P8登录注册、管理员、审计、恢复、限流、部署与安全形成完整用户系统并具备云端运行条件其中 P7 是产品方向最重要的一次调整。项目没有删除已经实现的审阅、指标和实验功能,而是把它们移动为“批判性阅读”和“实验理解”等高级入口,主路径改为上传论文后直接进入逐页阅读工作台。8.2 设计文档与任务追踪码道在编码前先同步以下设计层:需求细化:确认用户目标、功能范围、非目标和冲突决策;架构设计:明确前后端边界、外部 MaaS、任务与存储关系;数据模型:定义实体、外键、状态机、索引和迁移安全;API 设计:固定请求字段、响应结构、权限和错误语义;页面设计:固定路由、页面状态和交互行为;测试设计:只保留正常路径、关键失败和必要恢复场景;SDD 与 Sprint:把需求映射到具体设计、文件和任务状态。这种做法解决了长周期智能体开发中常见的“上一轮约束在下一轮丢失”问题。提示词不再重复粘贴整个项目,而是引用稳定设计资料,再补充本轮真实基线和差异要求。8.3 集中验收策略为了避免码道在每个实现轮次反复执行耗时的全量测试,项目后期采用“实现与验收分离”策略:码道负责更新必要测试资产,但提示词明确禁止运行测试、构建、迁移往返、Docker 重建和 HTTP 烟测;实现轮次完成后,先检查实际改动范围和接口契约;后端默认只运行受影响模块的定向测试;前端变更运行相关 Vitest 和一次生产构建;只保留一条关键业务烟测,例如“上传 PDF → 解析 → 进入阅读页”;认证、迁移链、共享基础设施或最终发布才执行更完整的回归。单个新功能通常只设计 1 个正常用例、1 个重要失败用例,以及在确有并发或恢复风险时增加 1 个对应场景。该策略更符合个人实习项目的成本与风险水平。8.4 华为云 ECS 部署过程部署采用单机 Compose,核心步骤如下:创建 VPC、子网、安全组、弹性公网 IP 和 Ubuntu 22.04 ECS;安全组开放 80,并将 22 端口来源限制为当前管理 IP;安装 Docker Engine 与 Compose,配置华为云 SWR 镜像加速;将代码发布包上传到 /opt/paperlens,检查校验和后解压;创建权限为 600 的部署环境文件,交互式写入数据库密码、JWT Secret 和 MaaS Key;使用 docker-compose.single.yml 构建并启动服务;检查容器状态、前端健康检查和后端 readiness;在浏览器完成注册、上传论文、学习解释和论文问答验证。示例命令中的配置均使用占位符,不包含真实凭据:cd /opt/paperlens chmod 600 deploy/huawei/.env.single docker compose \ --env-file deploy/huawei/.env.single \ -f deploy/huawei/docker-compose.single.yml \ up -d --build docker compose \ --env-file deploy/huawei/.env.single \ -f deploy/huawei/docker-compose.single.yml \ ps -a curl -fsS http://127.0.0.1/healthz curl -fsS http://127.0.0.1/api/v1/health/ready服务以 detached 模式运行,因此关闭本地 PowerShell 或 SSH 会话不会停止容器。ECS 重启后,Docker 服务与 Compose 的重启策略负责恢复应用。8.5 部署期问题闭环现象定位依据修正Docker Hub 拉取超时docker pull 访问官方 Registry 超时配置华为云 SWR 镜像加速并重启 DockerNginx 容器持续重启日志显示只读目录无法创建临时文件临时目录迁移到 /tmp,通过受限 tmpfs 提供写入PDF 上传失败后端日志显示持久卷目录权限不足启动前由一次性初始化服务修正卷所有权管理员升级 SQL 失败psql 变量替换与引号组合错误改用明确参数边界并先只读查询用户 ID论文问答前端报网络失败后端只有会话请求,没有问题请求为非安全 HTTP 环境增加 UUID v4 回退实现长页翻译偶发失败MaaS 请求耗时超过通用读取超时为学习解释配置独立、有限的读取超时部署验收以真实页面操作为准,不仅依赖容器显示 healthy。只有注册登录、论文上传解析、MaaS 学习解释、论文问答和管理员入口均完成小额验证,才认为案例具备可演示性。9. 应用效果与价值PaperLens 将“看 PDF、查术语、做笔记、问模型、整理报告”从多个割裂工具合并为一个连续流程。对个人学习场景而言,它带来的价值主要体现在:降低英文论文和专业概念的理解门槛;保持 AI 结果与当前论文、页码和原文选区的联系;让多轮问答、解释历史、高亮和笔记可以长期保存;通过华为云 MaaS 获得真实模型能力,同时保留 Mock 模型便于离线开发;通过码道代码智能体提升跨前后端开发和故障定位效率;使用单台小规格 ECS 即可完成课程设计、实习成果或个人演示部署。10. 局限与后续规划当前版本面向小规模个人使用,仍有以下边界:暂不支持扫描版论文 OCR;语义检索尚未使用持久化向量数据库;后台任务仍采用进程内执行器,不适合多实例横向扩展;单机 PostgreSQL 和本地文件卷需要定期备份;后续可根据实际用户量逐步引入 OBS、RDS、HTTPS、任务队列、pgvector 和多模态论文理解,但不在小规模案例阶段提前增加系统复杂度。11. 总结PaperLens 展示了如何将华为云码道(CodeArts)代码智能体、ModelArts Studio(MaaS)与常见 Web 技术结合,构建一套可实际部署的智能论文阅读学习应用。在研发侧,码道帮助项目完成需求拆解、跨文件编码、测试设计和部署故障定位;在运行侧,MaaS 提供总结、翻译、解释和问答能力;在基础设施侧,华为云 ECS 提供轻量、可控的容器运行环境。最终方案既满足个人学习项目的成本边界,也保留了向云数据库、对象存储和更可靠任务架构演进的空间。12. 参考资料华为云开发者空间实战案例参考页面华为云码道(CodeArts)代码智能体产品功能华为云码道(CodeArts)内置智能体用户指南ModelArts Studio(MaaS)API 调用规范华为云弹性云服务器 ECS 产品介绍
-
食堂菜品评价管理系统:基于 CodeArts Agent 的构建与华为云部署一、概述1.1 案例介绍校园食堂评价存在三个痛点:缺少上下文、结构与后续处理。本系统以日期、餐次、窗口和菜品确定的菜单项为评价对象,支持多维评分、过敏原筛选、审核与改进任务。开发时使用 CodeArts Agent 按规格拆分任务,并通过 Context7、Playwright MCP 核对资料与定位问题。最终构建成功,26 条关键流程测试通过,系统已部署至华为云 ECS 与 RDS for MySQL,公网验证首页、接口和图片加载正常。1.2 适用对象与案例流程本案例适合高校学生、全栈 Web 初学者,以及希望了解 CodeArts Agent 与 Skill/MCP 协作流程的开发者。整体流程可分为五步:读取项目规格与工程上下文。由 CodeArts Agent 生成并拆分可执行任务。按业务模块完成前后端与数据库实现。使用 Playwright 发现并修复真实数据与接口问题。部署到华为云 ECS/RDS,并验证公网访问。1.3 资源总览资源本案例中的实际用途CodeArts Agent根据规格辅助任务拆分、代码实现和问题定位Skill规范文档、架构图和检索任务的步骤与验收方式Context7 / Playwright MCP资料核对、页面检查和控制台错误定位ECS、EIP、VPC/安全组、RDS for MySQL公网运行、私网数据库连接和部署验证二、环境和资源准备2.1 本地工程与运行条件项目基于 TypeScript pnpm Monorepo 构建,本地复现需要 Node.js 22、pnpm 9 与 Docker(用于启动 MySQL)。README 中已给出最小运行命令:docker compose up -d pnpm install cp .env.example .env pnpm --filter api prisma:migrate pnpm --filter api prisma:seed pnpm dev:api pnpm dev:web.env.example 可作为环境变量模板,真实 .env 包含数据库密码与 JWT 密钥,不应提交或展示。2.2 CodeArts Agent、Skill 与 MCP 配置由于系统包含多角色权限、匿名边界、状态流转和统计规则,直接按页面逐个生成容易前后端字段不一致。开发时采用 CodeArts Agent 的 Spec-Driven 模式:先把业务边界、角色权限和验收标准写入规格,再让 Agent 读取项目目录并拆分为可执行任务。Skill 用于约束文档、架构图和规格检索任务的输入、步骤和验收方式。例如,架构图任务要求保留可编辑的 Draw.io 源文件;文档任务要求保留关键截图和边界说明。这些约束使同类任务得到相对稳定的产出,但不能替代业务判断。项目还启用了 Context7 与 Playwright MCP。Context7 用于查询 React Router、Vite 等依赖的版本资料,核对当前实现是否匹配;Playwright MCP 用于检查页面语义、执行交互、读取控制台错误,并验证真实页面状态。三、对话 CodeArts Agent:构建食堂菜品评价管理系统3.1 读取规格并建立工程骨架进入实现前,先向 CodeArts Agent 提供业务目标、技术基线和产品与开发规格。Agent 读取项目目录与已有文档后,按需求、方案、任务三个阶段推进:需求阶段整理认证、菜品、菜单、评价、审核、改进、分析和审计要求;方案阶段分析模块职责、接口、数据模型与异常处理;任务阶段将方案拆分为前端页面、后端模块、共享契约和数据库模型的具体改动。每个阶段都需要人工检查文件变更和实际运行结果,而不是由 Agent 自动完成全部工作。工程骨架建立后,Monorepo 包含 apps/web(顾客端与管理端)、apps/api(NestJS 后端)、packages/contracts(共享 DTO 与校验规则)和 e2e(关键流程测试)。3.2 按业务模块实现核心功能核心功能按“业务约束 -> 用户操作 -> 后端保障”的顺序实现,避免按前端组件或代码目录流水账展开。每日菜单与评价入口。 顾客端按日期、餐次和窗口查询菜单。无论从菜单页、二维码深层链接还是刷新后的评价页进入,页面都通过 menuItemId 恢复菜品和窗口信息,不依赖前一页面的内存状态。后端校验菜单项是否存在、是否处于可评价状态、是否超过截止时间,以及同一用户是否已提交过评价。过敏原筛选与个人偏好。 菜品库支持关键字、分类、窗口、价格、最低评分和排序条件,筛选状态写入 URL 查询参数。登录用户启用“避开我的过敏原”后,safeForMe 同时进入 Query Key 和接口参数,后端根据个人偏好排除匹配菜品,避免只在前端隐藏数据。const { data: result } = useQuery({ queryKey: ['dishes', q, categoryId, windowId, page, safeForMe], queryFn: () => api.getWithMeta<DishListItem[]>('/dishes', { q: q || undefined, categoryId: categoryId || undefined, windowId: windowId || undefined, safeForMe: safeForMe || undefined, page, pageSize: 12, }), }); 多维评价、审核、通知与改进任务。 评价包含总体评分,以及口味、分量、性价比和卫生观感四项可选评分;用户还可以选择结构化标签、填写正文并决定是否匿名。匿名只影响公开展示,数据库仍保留评价者关联,以便限制重复评价和处理违规记录。低分评价可以创建改进任务,记录负责人、处理措施、目标日期、状态和验证区间;完成任务时要求填写结果说明和验证区间,样本不足时不直接宣称改进有效。const [items, total] = await Promise.all([ this.prisma.improvementTask.findMany({ where, include: { dish: { select: { id: true, name: true } }, owner: { select: { id: true, displayName: true } }, reviews: true, }, orderBy: { createdAt: 'desc' }, }), this.prisma.improvementTask.count({ where }), ]); 改进任务列表明确返回页面需要的菜品和负责人信息,避免前端再按演示数据补字段;同时只选择必要字段,避免将内部用户数据带入响应。数据看板、用户管理与审计。 管理端提供菜品、菜单、评价、改进任务、数据看板、用户管理与审计查询。管理员不能修改自己的角色或禁用自己的账号;前端将按钮置灰只能改善体验,真正的权限判断由后端 API 返回 403,自动化测试直接验证该边界。移动端高频入口。 顾客端在 375 像素宽度下使用底部导航,保留菜单、菜品库、我的评价和偏好等高频入口,避免桌面端导航在移动端占用过多空间。3.3 开发阶段成果小结层次实际成果前端顾客端、管理端、响应式导航与真实数据展示后端认证、菜单、菜品、评价、改进、分析、审计模块数据库Prisma 迁移、菜单项与评价相关约束、演示种子数据契约共享 DTO、枚举和校验规则四、测试、问题修复与华为云部署4.1 从页面可打开到真实数据可用早期页面检查出现过“页面可打开,但菜单数据为空”的情况。最初自动化用例只断言页面标题可见,因此即使列表没有数据,测试仍会通过。Playwright MCP 进一步发现控制台存在认证和资源错误。根因定位分为两层:一是分页接口存在 { data, meta } 与 { items, total } 两种真实契约,需要按端点分别处理;二是测试断言只检查标题,没有验证真实记录是否出现在页面中。修复时,分别处理响应结构,并将断言提升为真实菜单、菜品、改进任务和用户记录可见。另一个隐蔽问题是 Prisma Decimal 在 JSON 中表现为字符串。顾客端 Math.round 会发生隐式数值转换,表面上可以工作;管理端调用 toFixed 时却触发运行时异常。最终在页面适配层显式使用 Number() 转换,并兼容嵌套分类字段。改进任务列表也补齐了菜品和负责人关系,避免前端硬编码演示数据。4.2 自动化测试结果最终执行以下命令:pnpm build pnpm exec playwright test e2e/api.spec.ts e2e/admin.spec.ts e2e/customer.spec.ts --reporter=linepnpm build 成功,关键流程测试结果为 26 passed。覆盖范围包括健康检查、登录、菜品与菜单查询、个人偏好、评价审核、改进任务、数据看板、用户管理、管理员自身保护、顾客端菜单与移动导航等流程。测试运行依赖本地 MySQL、已执行的 Prisma 迁移和种子数据;完整云端 Playwright 回归不在本次范围。4.3 华为云部署与公网验证部署架构如图 7 所示:浏览器请求先到达 EIP 1.94.198.53,进入 ECS 上的 Nginx;Nginx 直接提供 React 静态页面和 /uploads/ 图片目录,并将 /api/ 请求反向代理至本机 127.0.0.1:3000 的 NestJS API;API 由 PM2 管理,并通过 VPC 私网访问 RDS for MySQL。实际部署中处理了两个具体问题。一是原生模块 bcrypt 在 ECS 安装时预编译二进制下载失败,替换为纯 JavaScript 实现的 bcryptjs 后种子脚本可正常执行。二是 RDS 密码中的 $ 需要在 DATABASE_URL 中编码为 %24,否则 Prisma 报 P1013 连接 URL 格式错误。修正后成功应用 2 条迁移,并初始化 20 个菜品、372 条菜单记录和 100 条评价记录。演示图片也同步到 ECS 的运行时上传目录,Nginx 通过 /uploads/ 静态映射提供。已通过公网验证的内容包括:首页 http://1.94.198.53/健康检查 /api/v1/health菜品接口 /api/v1/dishes?pageSize=1指定日期和餐次的 menu-items 查询菜品图片静态资源加载五、案例总结与资源说明本案例展示了如何借助 CodeArts Agent 的 Spec-Driven 模式,将食堂菜品评价管理系统的业务规格拆分为可执行任务,并在实现、调试与部署阶段持续协作。Agent 的价值在于加速任务分解、代码生成和问题定位,而业务边界、代码变更和测试结果仍需人工确认。
-
怎么搭建啊 求助 来个资深老玩家
-
Pod 无法正常启动
-
今天在测试mysql主从复制的时候 导入数据过多
-
昨天我使用还好好的,今天找不到了
-
前言OpenHarmony 轻量系统的固件构建通常会卡在三个地方:构建机架构、预编译工具链、源码和依赖下载。尤其是像 xiaohong (atomgit 开源的软硬件一体项目) 这类面向 WS63 芯片的项目,工具链、Python 依赖、repo 同步、clang 路径等细节只要有一处没对齐,就很容易在编译中途报错。这次我们尝试把 xiaohong 固件构建流程放到华为云上完成:通过 AI Shell 创建云端 ECS、准备构建环境、下载源码、配置工具链并完成固件编译。整体体验下来,AI Shell 比较适合这类“步骤多、依赖多、容易踩坑但流程可沉淀”的云端自动化任务。案例介绍xiaohong 是基于 OpenHarmony 的迷你系统,专为 WS63 芯片设计。本案例介绍如何使用华为云 AI Shell 从零开始编译 xiaohong 固件,包括环境准备、源码下载、工具链配置、编译过程以及常见问题解决方案。最终产物为:ws63-liteos-app_all.fwpkg:完整固件ws63-liteos-app_load_only.fwpkg:仅加载固件为什么适合用 AI Shell这个任务并不是单条命令能解决的问题,而是一个典型的云端构建流水线:需要创建合适规格和架构的 ECS。需要安装大量系统依赖和 Python 依赖。需要同步较大的 OpenHarmony 相关源码和预编译工具。需要处理工具链路径、软链接和环境变量。编译完成后还要下载固件并清理云资源。如果每次都手工操作,容易遗漏步骤。使用 AI Shell 的价值在于:可以用自然语言描述目标,再把重复流程沉淀为 skill 或脚本,后续复用时只需要发起任务即可。核心要点架构选择:必须使用 x86_64 架构的 ECS,预编译工具链不兼容 aarch64。源码下载:使用 repo 工具,并在 repo init 时添加 --git-lfs。工具链配置:需要配置 RISC-V 编译器 PATH,并创建 clang 软链接。Python 依赖:需要安装 kconfiglib、pycparser、markupsafe 等模块。构建命令:使用 ./build.sh --product-name xiaohong --gn-args is_debug=false。资源清理:构建完成后及时保存固件并释放 ECS,避免资源持续计费。适用对象企业个人开发者高校学生案例时间本案例总时长预计60分钟。资源总览创建华为云资源需要收费,请按需充值。本案例中编译环境所创建的云资源预计花费10元。资源名称规格单价(元)AI Shell体验版免费华为云资源按需10整体流程流程可以理解为:用户在开发者空间向 AI Shell 下达编译 xiaohong 固件任务。AI Shell 调用 xiaohong build skill 或自动化脚本。AI Shell 创建 x86_64 ECS 并准备构建环境。ECS 完成源码同步、工具链配置、固件编译。用户下载固件产物,并按需销毁 ECS。案例步骤0. 进入 AIShell参考教程探索智能 Shell 交互新范式 详解 AI Shell 完整用法或者产品文档AI Shell,云上开发运维效率升级 进入到 AI Shell 界面进入到 AIShell 我们应该能看如下界面,和我们常用的 OpenCode、AtomCode 等产品类似,可以输入:1. 使用 xiaohong-build-skill此处,我们不再介绍 AIShell 的详细功能和能力,留给大家自行探索。首先我们输入/确认一下所有功能是否都已经开启(默认是开启了所有的功能),如下图:虽然我们一句话就能实现 xiaohong 编译环境搭建、编译运行,但是为了了解背后的细节,我们先让 AIShell 帮我熟悉熟悉:帮我看看这是什么: https://atomgit.com/huqi/xiaohong-build-skill,如何使用?此处我们理解权限安全规则,这里按需选择 Allow once 或者 Allow always,我选择的是 Allow always,可以左右键切换选择并回车确认:接着我们就让 AIShell 执行这个 skill,如果遇到:帮我实际运行这个 skill 来编译 xiaohong 固件从右侧任务列表我们可以看到类似的:检查前置条件检查华为云凭证创建 ESC 实例构建配置环境下载源码编译固件下载固件到本地清理资源如果我们的华为云账号有幸绑定了短信,在 ECS 创建完我们也能收到短信,当然也能去控制台查看,类似:接下来只需静静等待 Task 被一一执行完。理想情况下,我们会看到 AI Shell 会继续自动执行下去,比如进入到 ECS 中安装依赖:比如下载源码:最终能看到编译完成:2. 下载固件下载固件的方式有很多种,比如让 AIShell 上传到 OBS ,当然我们也可以去 ESC 实例里手动下载:3. 后续后续可以让 AIShell 指导我们烧录固件:题外话:让 AIShell 帮我修改源码,重新编译固件写入我专属的引导语释放资源最后记得让 AIShell 释放资源:帮我释放这次创建的所有资源Q&A⚠️ The maximum number of model requests in a single turn is exceeded原因是触发了 MaaS 的限流,只需回复 “继续” 就行如果我开发的不是 xiaohong 而是其他平台如 小智 等,那怎么办?在我们看来,底层逻辑都是相通的,我们的目的是搭建编译环境–编译–获取产物,理论上只需要把相关的指导文档发给 AIShell 就行,类似的: 我想搭建环境编译 https://github.com/78/xiaozhi-esp32 ,应该怎么做?本文正在参与:【案例共创】【第12期】基于华为云AI Shell完成云资源管理、云服务运维和应用部署
-
docker官方镜像仓下载很慢,华为云自有加速仓镜像不全,经常失败,可参考如下配置:修改docker配置 vim /etc/docker/daemon.json{ "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me", "https://$YOUR_ID.mirror.swr.myhuaweicloud.com" ], "max-concurrent-downloads": 10, "max-download-attempts": 5 } 其中 https://$YOUR_ID.mirror.swr.myhuaweicloud.com 镜像加速地址从控制台–容器镜像服务–镜像资源–镜像中心,右上角“镜像加速器”获取。修改后重启服务sudo systemctl daemon-reload sudo systemctl restart docker修改DNS,否则无法使用外部镜像加速源,vim /etc/resolv.conf 增加两行nameserver 8.8.8.8 nameserver 114.114.114.114 测试可用ping通 ping docker.1ms.run
-
请问大家有没有租赁npu的平台推荐,华为云官网上我看租不到npu算力资源了,都售空了
-
第一周学习总结:华为云与计算云服务华为云交付模式与生态传统 IT 困境与云的价值参与过电商大促(比如 618)备战的小伙伴可能深有体会,为了在流量洪峰期间维护支付核心链路的稳定运行,我们通常需要提前几个月就进行“扩容应用节点、预热缓存集群(如 Redis)、紧急配置非核心业务的降级开关”。假如在传统 IT 架构中,面对这种数倍于平时的突发流量,我们面临着极其尴尬的困境:为了保障几天的峰值交易不挂,难道必须提前采购大批昂贵的物理机进行纵向扩展(Scale-up),等大促一过,就让它们闲置吃灰吗?云计算的出现,从根本上重塑了这种算力供需关系。它通过软件定义将物理硬件抽象为资源池,实现了按需自助、弹性伸缩与可计量服务。算力真正变成了如同水电一般的底层基础设施,让业务开发能将精力全部聚焦于深度的业务领域建模(DDD)与应用层的高可用架构建设,而无需再为底层硬件采购周期和高昂的闲置成本买单。华为云交付模式与生态结合业务的合规与安全诉求(特别是在金融交易与密态数据处理场景下),我了解到华为云提供了灵活多维的交付矩阵:公有云(Public Cloud):面向公众提供标准化的海量弹性算力,具备极致的敏捷性。私有云(Private Cloud):部署于企业本地或防火墙内,从物理层面保障核心支付链路和高优加密数据的绝对安全隔离。混合云(Hybrid Cloud):当前大厂数字化演进的主流形态,既能将稳态核心业务留在本地,又能将敏态业务弹性扩展至公有云,实现业务架构的最佳平衡。依托这种全栈交付能力,华为云不仅提供 IaaS 层的算力底座,更构建了极其庞大的软硬件生态系统,支撑着上层微服务、AI 及大数据的繁荣。典型的计算云服务典型的计算云服务包括:ECS(弹性云服务器)、BMS(裸金属服务器)、IMS(镜像服务)、AS(弹性伸缩服务)以及 CCE(云容器引擎),本文主要关注ECS、BMS与IMS。1. ECS (弹性云服务器):定义与底层逻辑: 大家平时跑 Spring Boot 微服务、部署 Nginx 网关或 Web 节点的机器,绝大多数就是 ECS。从底层视角来看,它是基于 KVM 或各大云厂商自研的虚拟化架构,在强大的物理服务器集群上抽象出来的逻辑计算单元。它通过虚拟化层将 CPU、内存、云盘和虚拟网卡(ENI)进行软隔离与池化分配,让我们在应用层感知不到底层物理硬件的存在。核心优势:极致的敏捷与弹性:真正的按需取用。相比传统 IDC 机房漫长的服务器采购、上架和网络配置周期,ECS 可以通过底层控制面 API 在分钟级内拉起成百上千台机器,完美匹配电商大促的突发算力需求。高可用与容灾底座:在部署电商交易等高可用微服务时,我们可以利用 ECS 的“反亲和性(Anti-affinity)”部署组策略。这能强制把我们同一个业务集群下的不同 Java 服务节点,智能调度到底层不同的物理宿主机甚至不同的可用区(AZ)上,天然免疫单一物理机宕机带来的服务雪崩。架构局限与痛点: 软件定义的虚拟化层(Hypervisor)必然存在微小的性能损耗。比如在处理高并发大流量时,网络数据包从底层物理网卡转发到虚拟机内部,会产生额外的 CPU 上下文切换和虚拟化中断开销。因此,在要求极其严苛的极低延迟(微秒级)的场景下,纯软虚拟化的 ECS 可能会遇到瓶颈,这就需要我们在架构上考虑更前沿的软硬协同卸载技术或转向 BMS。产品架构与常见应用场景2. BMS (裸金属服务器):定义与底层逻辑: 如果说 ECS 是为了追求极致的弹性,那么 BMS 就是为了追求极致的性能。BMS 本质上是一台专属的物理服务器,它没有 Hypervisor 虚拟化层。通过 SDN 和专属硬件(如智能网卡)的配合,BMS 实现了“网络虚拟化卸载”,让物理机直接接入云网络。简单说,它让物理机拥有了云的“灵魂”(弹性网络、VPC互通),同时保留了物理机的“肉体”(原生硬件性能)。核心优势:零损耗的原生性能: 在 BMS 上运行应用,CPU 指令集直接执行,没有虚拟化带来的“中间商赚差价”。对于 Oracle RAC 这类对 CPU 指令周期极其敏感的数据库集群,或者 AI 深度学习训练这种需要 GPU 直通(PCIe Pass-through)的场景,BMS 是唯一的云化选择。物理隔离的安全合规: 在金融核心交易或政企涉密场景中,多租户共享物理硬件可能存在侧信道攻击风险。BMS 提供单租户独占物理资源的特性,满足了最高等级的数据合规要求。架构局限与痛点: 虽然 BMS 解决了性能问题,但它依然保留了物理机的“重量级”特征。相比 ECS 秒级的启动速度,BMS 的发放涉及底层硬件的自动化重装和网络配置,通常需要 10-30 分钟,且成本远高于 ECS。产品架构与常见应用场景BMS 的架构核心在于“软硬结合”,通过 BMC(基板管理控制器)实现远程运维,通过高性能智能网卡实现 25G/100G 网络直通。常见场景包括:高性能计算(HPC,如气象预测)、核心数据库(如 HANA)、以及 AI 训练集群。3. IMS (镜像服务):定义与底层逻辑: 如果把 ECS/BMS 比作电脑硬件,那么 IMS 就是“系统安装盘”或“Ghost 镜像”。它是云服务器运行环境的模板,包含了操作系统、预装的软件栈以及配置文件。从底层逻辑看,IMS 是云环境标准化交付的基石,它将复杂的系统部署过程封装成一个文件对象。核心优势:标准化与批量复制: 在微服务架构中,我们需要快速拉起几十台配置完全一致的 Spring Cloud 节点。通过制作包含 JDK、中间件和安全补丁的“私有镜像”,我们可以确保每一台新扩容的机器环境都是 100% 一致的,彻底杜绝“在我电脑上能跑,在服务器上跑不起来”的环境差异问题。环境迁移与备份: IMS 支持将本地物理机的系统盘制作成镜像上传云端(P2V),或者在云端不同账号间共享镜像。这对于系统迁移和灾难恢复至关重要。架构局限与痛点: 镜像文件如果未经优化,体积往往很大(几十 GB),导致分发和启动变慢。此外,如果基础镜像(如旧版 Linux)长期不更新,会遗留严重的安全漏洞。产品架构与常见应用场景: IMS 分为公共镜像(云厂商官方提供,纯净安全)、私有镜像(用户自定义)、共享镜像(跨账号分发)和市场镜像(第三方 ISV 提供,如预装宝塔面板)。在 DevOps 流程中,IMS 常与 CI/CD 流水线结合,实现“镜像即代码”,每次应用发布都生成一个新的 immutable(不可变)镜像版本。总结本周的学习,让我从宏观的云计算价值演进,深入到微观的计算服务底层原理,构建起了一套完整的云基础设施知识图谱。我认识到,ECS、BMS 与 IMS 并非孤立的产品,而是共同协调支撑,理解这三者的边界与协同,是构建高可用、高性能云底座的前提。
-
作为纯小白,第一次接触云服务器,大概率会陷入两大困惑:一是面对CPU、内存、带宽、存储这些五花八门的参数,完全看不懂含义;二是不知道自己搭博客、练手、部署小程序的需求,该对应哪种配置,怕买贵了浪费,又怕买差了用不了。其实云服务器配置选择没有那么复杂,核心逻辑就一个:匹配自身需求+不盲目追求高配。不用被专业术语吓住,也不用跟风买“顶配”,今天就从「需求定位→核心参数拆解→多维度对比→场景化选型→避坑指南」五个维度,用最通俗的语言,帮小白精准选出适合自己的云服务器配置,全程无任何品牌信息,客观实用,看完直接上手不踩坑。第一步:先定需求,避免瞎买(小白最易忽略的关键)选配置的前提,不是看参数多厉害,而是先明确自己用云服务器做什么、预算多少。不同用途对应的配置需求天差地别,先想清楚这2个问题,能帮你缩小80%的选择范围,避免花冤枉钱。1. 明确使用场景(最核心):不同场景对云服务器的性能、带宽要求完全不同,小白可直接对号入座:- 个人用途(练手、学习、搭建个人博客/静态网站):核心需求是稳定,能正常运行基础程序、承载少量访问量(日均几百人),无需太高性能;- 中小企业用途(搭建企业官网、小型API服务、内部管理系统):性能中等即可,重点要求稳定性和安全性,能承载日均几千人访问,支持基础业务部署;- 高并发用途(电商网站、小程序、短视频平台、直播相关):需要强劲性能和充足带宽,支持高并发访问(日均几万人以上),且要求具备可扩展性(后续能灵活扩容);- 测试/临时用途(项目测试、临时部署、短期使用):配置无需太高,性价比优先,支持短期续费或按需付费,用完可灵活释放。2. 明确预算范围:云服务器价格跨度很大,从每月几十元到几千元不等,预算直接决定配置上限。小白建议遵循“够用就好”原则,无需追求高配,参考预算如下:- 个人用途:每月50-200元,完全够用;- 中小企业用途:每月200-800元,可满足基础业务需求;- 高并发用途:每月800元以上,具体根据并发量调整;- 测试/临时用途:按需付费(按小时/按天),日均几元到几十元即可。第二步:核心参数拆解,小白也能看懂的5个关键指标选云服务器,本质就是选“参数”。以下5个核心参数,直接决定云服务器的性能和使用体验,用最通俗的语言拆解,不堆砌专业术语,看完不迷路。1. CPU(核心/线程):云服务器的“大脑”CPU相当于云服务器的“大脑”,核心数越多、线程数越多,处理任务的速度就越快,能同时承载的访问量和运行的程序就越多。小白不用记复杂参数,按场景对号入座即可,无需盲目追求“多核”:- 个人用途(练手、个人博客):1核2线程或2核2线程,完全够用,性价比最高;- 中小企业用途(企业官网、小型API):2核4线程或4核4线程,稳定性更强,能应对少量并发;- 高并发用途(电商、小程序):4核8线程及以上,根据并发量递增,比如日均10万访问量,建议选择8核16线程;- 测试用途:1核2线程即可,满足临时测试需求。补充:CPU分“计算密集型”和“I/O密集型”,小白不用深究,记住:搭建网站、练手选通用型即可;如果是做视频渲染、AI训练,选多核高主频的计算密集型;如果是部署数据库,选高主频的I/O密集型。2. 内存(RAM):云服务器的“临时工作台”内存相当于云服务器的“临时工作台”,程序运行时会占用内存,内存越大,能同时运行的程序就越多,响应速度也越快,避免出现卡顿、卡死的情况。内存和CPU是“黄金搭档”,建议搭配选择,小白参考如下:使用场景CPU搭配推荐内存个人用途(练手、博客)1核2线程 / 2核2线程2GB / 4GB中小企业用途(官网、小型API)2核4线程 / 4核4线程4GB / 8GB高并发用途(电商、小程序)4核8线程及以上16GB及以上测试用途1核2线程2GB关键提醒:如果部署的程序比较占用内存(比如数据库、大型小程序),建议适当加大内存,比加大CPU更有用。比如部署MySQL数据库,2核4线程搭配8GB内存,比4核4线程搭配4GB内存,运行更流畅。3. 带宽:云服务器的“网络通道”带宽相当于云服务器和互联网之间的“网络通道”,带宽越大,数据传输速度越快,能同时承载的访问人数就越多,避免出现网页加载缓慢、视频卡顿的情况。这是小白最容易忽略、也最容易买错的参数,重点参考如下:先分清带宽类型:分“固定带宽”和“弹性带宽”(按需付费),按需选择更省钱:- 固定带宽:每月带宽固定,价格稳定,适合访问量稳定的场景(如个人博客、企业官网);- 弹性带宽:按实际使用量收费,适合访问量波动大的场景(如电商促销、临时活动),避免闲置浪费。再选带宽大小,按场景匹配:- 个人用途(博客、练手):1M-3M,足够支撑日均几百人访问,网页加载速度流畅;- 中小企业用途(官网、小型API):3M-10M,能承载日均几千人访问,避免高峰期卡顿;- 高并发用途(电商、小程序):10M及以上,根据访问量递增,建议选择弹性带宽,降低成本;- 测试用途:1M即可,能正常运行测试程序。避坑提醒:带宽不是越大越好,10M带宽的价格比3M高很多,若访问量不大,纯属浪费;反之,带宽太小,会导致网页加载慢,影响使用体验。可以通过“日均访问量×平均页面大小”估算带宽需求,比如日均1万访问量,平均页面2MB,基础带宽需求约0.7Mbps,预留3倍峰值容量即可。4. 存储:云服务器的“硬盘”存储相当于云服务器的“硬盘”,用来存放程序、数据、文件等,分“云盘”和“本地盘”,小白优先选“云盘”(稳定性更强、支持数据备份、不易丢失)。云盘又分“普通云盘”和“高性能云盘”,个人和中小企业用途,普通云盘完全够用;高并发、大数据场景,可选择高性能云盘,提升数据读写速度。存储大小参考(根据存放内容多少选择):- 个人用途(练手、静态博客):40GB-100GB,足够存放程序和少量数据;- 中小企业用途(官网、小型API、数据库):100GB-300GB,需存放更多程序、数据和日志;- 高并发用途(电商、小程序):300GB及以上,根据数据量递增,建议搭配“云盘+数据备份”,保障数据安全;- 测试用途:40GB即可,满足临时存储需求。补充:如果需要存储大量视频、备份文件等冷数据,可选择性价比更高的HDD存储;如果是数据库、日志等热数据,优先选SSD存储,其随机读写速度是HDD的50-100倍。5. 操作系统(OS):云服务器的“操作界面”操作系统相当于云服务器的“操作界面”,决定了你后续如何操作云服务器,小白无需纠结,根据自己的操作习惯选择即可,核心分2类,无优劣之分:- Linux系统:无图形界面,靠命令行操作,占用资源少、稳定性强、安全性高,适合有一定技术基础,或用来搭建网站、部署程序的用户(大部分小白选这个也能快速上手,网上教程极多);- Windows系统:有图形界面,操作和我们平时用的电脑一样,简单易上手,适合完全零基础、不会用命令行,或需要部署Windows专属程序的用户(占用资源稍多,价格略高)。提醒:操作系统可以后续更换,不用一开始就纠结,选自己顺手的即可。第三步:多维度对比,不同配置组合适合哪些人群?为了让小白更直观地选择,整理了4种常见的配置组合,结合场景、预算、性能做详细对比,直接对号入座即可,无需自己搭配:配置组合适合场景预算范围(月)核心优势不足1核2线程+2GB内存+1M带宽+40GB云盘(Linux)个人练手、静态博客、测试50-100元性价比极高,操作简单,满足基础需求,适合纯小白入门性能有限,无法承载高访问量,不适合部署复杂程序2核4线程+4GB内存+3M带宽+100GB云盘(Linux/Windows)个人博客、小型企业官网、小型API服务100-200元性能均衡,稳定性强,支持少量并发,兼顾实用性和性价比高并发场景下会卡顿,无法部署大型数据库4核8线程+8GB内存+10M带宽+200GB云盘(Linux)中小企业官网、电商小程序、中型API服务200-800元性能强劲,支持日均几千人访问,可部署数据库,扩展性好价格偏高,个人用途性价比低8核16线程+16GB内存+20M带宽+500GB云盘(Linux)高并发电商、短视频平台、直播相关、大型数据库800元以上性能拉满,支持高并发访问,数据读写速度快,安全稳定价格昂贵,普通用户无需选择,资源易闲置第四步:小白避坑指南,这6个误区千万别踩很多小白选配置,看似选对了场景,却还是踩坑,核心是陷入了这些误区,尤其注意这6点,能帮你避开90%的坑:1. 误区一:盲目追求多核高配——个人搭博客,1核2线程和4核8线程的体验差距不大,但价格能差2-3倍,纯属浪费,够用就好;2. 误区二:忽视带宽选择——只看CPU和内存,忽略带宽,导致网页加载慢、访问卡顿,尤其是搭建网站,带宽比多核CPU更影响用户体验;3. 误区三:不重视存储类型——小白优先选云盘,不要选本地盘,本地盘在服务器宕机、迁移时,数据会丢失,且不支持备份;4. 误区四:忽略扩展性——选配置时,预留20%的性能余量,比如个人博客当前用2核4GB内存,可选择4核4GB内存,后续想升级程序、增加访问量,无需重新购买;5. 误区五:选错操作系统——完全不会命令行,就选Windows系统,不要硬选Linux,否则会陷入“不会操作”的困境;会一点命令行,优先选Linux,更稳定、更省资源;6. 误区六:忽视数据安全——无论什么场景,都建议开启自动备份和快照功能,避免数据丢失,尤其是部署数据库、存储重要文件的场景,备份必不可少。总结:小白选配置,记住3句话就够了1. 先定场景,再选参数:不要上来就看配置,先明确自己用服务器做什么,场景决定核心参数(比如搭博客侧重性价比,做电商侧重带宽和CPU);2. 不追高配,够用就好:小白90%的需求,用“2核4线程+4GB内存+3M带宽”就能满足,无需跟风买高配,省下来的钱可用于后续升级;3. 兼顾性价比和扩展性:选配置时,预留少量性能余量,方便后续升级,同时优先选“固定带宽+云盘”的组合,性价比更高、更稳定。其实云服务器配置选择,没有想象中那么复杂,小白不用被专业术语吓住,只要遵循“匹配需求、避开误区”的原则,就能精准选出适合自己的配置,不花冤枉钱,也能满足自身使用需求。如果后续需求升级,比如从个人博客升级为小型电商,也可以通过扩容CPU、内存、带宽的方式,无需重新购买服务器,灵活又省心。
上滑加载中
推荐直播
-
用码道,让你的AI作品三步上朋友圈2026/08/04 周二 19:00-20:00
林华鼎-华为云AI开发者运营负责人
从入门 · 到做AI应用 · 到企业级开发。不教编程,只教用AI · 零代码、有产出、能带走、可炫耀 · 每课人人动手实操
回顾中 -
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
基于华为云码道,构建你的定制化AI搭子2026/08/14 周五 09:00-11:30
明亮-华为云开发者发展与支持部部长
本期直播将向您全面介绍华为云码道产品,并基于码道手把手教你部署自己的定制化AI陪伴搭子。
回顾中
热门标签