尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于Flask与Vue3的二手书籍交易系统设计与实现
做在线书籍商城这个项目很多人第一反应是先找现成的开源模板抄一抄改一改就上线。但我从一开始就决定用 Flask Vue3 从零写一套二手书籍交易系统不是因为它有多高级而是想真正把“商品发布、搜索、下单、库存扣减”这一整条链路跑通。项目做完之后我发现这套组合比想象中顺手Flask 负责接口逻辑Vue3 负责交互和状态前后端分离的开发方式也让团队协作变得清晰。如果你也在考虑做类似的电商类练习项目或者公司内部要搭一个轻量级的二手交易平台这篇文章可以给你一个完整可落地的参考。这套系统的核心场景很直接用户可以注册登录发布自己要卖的旧书也可以浏览、搜索别人上架的书籍加入购物车后下单卖家在后台管理订单和库存。为什么选二手书做切入点因为书籍的 SKU 相对简单没有太多规格组合商品信息字段固定适合用来跑通完整的电商流程又比单纯做“图书管理”多了交易闭环的复杂性。整个开发过程我踩了不少坑尤其是订单并发、图片上传、前后端联调这些环节。下面我会把项目从设计到编码到部署的全过程拆开讲把关键代码和“为什么这么做”一起写出来希望对你有实际帮助。1. 项目定位与整体设计思路1.1 为什么是 Flask Vue3 这套组合先说后端。Flask 在 Python 生态里属于“微框架”但它并不真的“微”而是把决策权交给你。我在这个项目里需要实现 RESTful API、用户认证、数据库操作、文件上传这些 Flask 靠扩展都能解决。相比 Django 那种“全家桶”Flask 更灵活适合我们这种希望掌控每个环节、也愿意自己拼装的场景。项目里我用了 Flask 2.x Flask-SQLAlchemy Flask-JWT-Extended这套组合写接口非常顺手。前端选择 Vue3 的原因一是组合式 API 写业务逻辑比 Vue2 的选项式 API 更干净二是生态成熟配合 Vite 开发体验很好。我需要频繁操作购物车、用户信息这种跨组件数据Pinia 作为 Vue3 官方推荐的状态管理库比 Vuex 更简洁。页面结构上我用 Vue Router 做路由Element Plus 提供现成的表格、表单、弹窗组件开发效率能明显提升。前后端分离最大的好处是职责清晰后端只输出 JSON 数据前端只管页面渲染和交互。这样以后想换小程序端或者 App 端后端接口可以直接复用。坏处是跨域、鉴权、联调这些事要多花些心思后面我会讲我怎么处理。1.2 系统功能模块拆解我把系统拆成了两个端用户端和管理端本质上是一套代码只是角色权限不同。用户端包含这些模块注册登录手机号或用户名 密码登录后签发 JWT。商品浏览首页展示最新上架书籍分类筛选关键词搜索分页加载。商品详情展示封面图、书名、作者、出版信息、价格、成色描述、卖家信息。购物车添加、删除、修改数量勾选结算。订单管理创建订单、查看订单列表、订单详情、取消订单。个人中心修改个人信息、查看我发布的商品、我买到的和我卖出的。管理端需要额外处理用户管理、商品审核可选二手平台可以不需要、订单状态流转、基础数据统计。我在做的时候没有把管理端拆成单独项目而是通过路由守卫和角色字段控制页面访问省掉了一套前端工程的维护成本。整个系统不算大但麻雀虽小五脏俱全。从数据表设计来看核心表有用户表、图书商品表、分类表、购物车表、订单表、订单项表。这六张表基本就能支撑整个交易流程。1.3 数据库设计与表关系先看用户表。我用的字段是 id、username、password_hash、avatar、phone、create_time。密码绝对不存明文用 Werkzeug 自带的 generate_password_hash 生成哈希值。图书商品表是核心业务表字段比较细id、title、author、publisher、isbncategory_id外键关联分类表price定价、sell_price售价condition_desc成色描述比如 9 成新images存封面图 URL多图用 JSON 字符串或逗号分隔stock库存数量seller_id外键关联用户表status上架/下架/已售view_count、create_time、update_time为什么要把 price 和 sell_price 分开二手书经常要体现“原价多少、现价多少”这样对买家更有吸引力而且后面做促销也不至于改表结构。购物车表字段是 id、user_id、book_id、quantity、selected、create_time。这里我特意加了一个 selected 字段用来支持“勾选部分商品结算”不然前端还得维护一个临时状态刷新就丢了。订单表和订单项表是典型的一对多关系。订单表存订单编号、用户 id、总金额、状态、收货信息二手书交易建议默认走线下自提或站内联系但我还是留了地址字段、创建时间。订单项表存每个订单里的商品快照book_id、title、图片、单价、数量、小计。为什么存快照而不是实时关联商品表因为商品信息可能被卖家修改或删除订单历史必须保持当时的样子。订单状态我用整数表示0 待付款、1 待发货、2 已发货、3 已完成、4 已取消。二手书平台通常不强制走物流所以我把“确认收货”做成了手动点击方便双方线下交付后快速闭环。建表时要注意MySQL 的字符集一定要用 utf8mb4不然用户昵称里带个特殊符号或生僻字就容易乱码。这个坑我在开发初期踩过后面会细说。2. 后端核心实现Flask 接口与业务逻辑2.1 项目结构与配置我习惯按功能模块组织 Flask 项目而不是把所有路由堆在 app.py 里。这个项目的结构是这样的backend/ ├── app.py # 应用入口 ├── config.py # 配置项 ├── models/ │ ├── __init__.py │ ├── user.py │ ├── book.py │ ├── cart.py │ └── order.py ├── resources/ │ ├── __init__.py │ ├── auth.py # 登录注册 │ ├── book.py # 商品接口 │ ├── cart.py # 购物车接口 │ └── order.py # 订单接口 ├── utils/ │ └── auth_decorator.py # 登录鉴权装饰器 ├── uploads/ # 图片存储目录 └── requirements.txtFlask-RESTful 这个扩展我用了但也有人觉得它太啰嗦。我的体会是小项目直接用蓝图 普通函数可能更直观因为业务简单时不需要额外的资源解析层。为了少依赖一个库我后来干脆用蓝图写接口路径清晰代码也更容易读懂。配置方面config.py 里设置了数据库连接串、JWT 密钥、上传目录、单文件大小限制。密钥这种敏感信息我建议放在环境变量里不要写死在代码库。本地开发时可以用 .env 文件配合 python-dotenv 读取。数据库连接串示例SQLALCHEMY_DATABASE_URI mysqlpymysql://root:passwordlocalhost:3306/book_market?charsetutf8mb4 SQLALCHEMY_TRACK_MODIFICATIONS False JWT_SECRET_KEY dont-use-this-in-production UPLOAD_FOLDER uploads MAX_CONTENT_LENGTH 5 * 1024 * 1024初始化应用的时候要记得把 db 和 jwt 都挂在 app 上然后注册蓝图。我封装了一个 create_app 工厂函数方便后面写单元测试。2.2 用户认证与 JWT 方案用户注册的重点是密码哈希和参数校验。我用 requests 前端传过来的用户名、密码、确认密码先判断用户名是否被占用再用 generate_password_hash 存密码。这里需要注意确认密码的校验必须在后端做一遍不能只依赖前端。因为接口是可以被直接调用的绕过前端就等于绕过校验。登录接口的逻辑很简单根据用户名或手机号找到用户用 check_password_hash 验证密码。验证通过后签发 JWT。签发的 token 里我把用户 id 和角色放进去这样在后续接口中就能通过 token 拿到当前用户身份。bp.route(/login, methods[POST]) def login(): data request.get_json() user User.query.filter((User.username data.get(username)) | (User.phone data.get(username))).first() if not user or not check_password_hash(user.password_hash, data.get(password)): return jsonify(code40001, msg用户名或密码错误) access_token create_access_token(identitystr(user.id), additional_claims{role: user.role}) return jsonify(code0, data{token: access_token, username: user.username})每次请求需要登录的接口时我用 Flask-JWT-Extended 的 jwt_required() 装饰器然后通过 get_jwt_identity() 拿到用户 id。这样比在每个函数里手动解析 token 要统一得多。前端拿到 token 后存到 localStorage并在每次请求的 Authorization 头里带上 Bearer token。这里有个细节token 过期后要有一个统一的处理我在前端封装了 axios 拦截器当请求返回 401 时就清空本地登录状态跳回登录页。2.3 图书商品的上架、搜索与分页商品上架接口需要处理图片上传和表单提交。我用的方案是前端先把图片传给一个上传接口拿到图片 URL 后再和其他字段一起提交商品信息。为什么不直接把图片文件一起提交因为图片通常比较大混在 JSON 里会让请求体变得臃肿而且上传进度也难做。分开之后图片上传可以用 FormData商品信息用 JSON逻辑清晰。图片上传接口我限制了只能传 jpg、png、webp 格式大小不超过 2MB。保存时用 uuid 重命名文件避免中文文件名和哈希碰撞filename str(uuid.uuid4()) os.path.splitext(file.filename)[1] file.save(os.path.join(app.config[UPLOAD_FOLDER], filename))返回给前端的 URL 是/uploads/图片名后面用 Nginx 代理静态文件。商品搜索是这类系统的核心。我实现了三个维度的检索关键字、分类 id、排序方式。关键字匹配 title 和 author 两个字段用模糊查询。排序支持最新、价格升序、价格降序、销量优先。分页用 Flask-SQLAlchemy 的 paginate 方法返回 total、pages、items 等字段前端翻页直接使用。query Book.query.filter(Book.status 1) if keyword: query query.filter(db.or_(Book.title.like(f%{keyword}%), Book.author.like(f%{keyword}%))) if category_id: query query.filter(Book.category_id category_id) if sort price_asc: query query.order_by(Book.sell_price.asc()) elif sort price_desc: query query.order_by(Book.sell_price.desc()) else: query query.order_by(Book.create_time.desc()) page query.paginate(pagepage, per_page12, error_outFalse)这里有个性能注意点如果商品量很大like 查询加上前导 % 会导致索引失效全表扫描。但在二手书这种中小数据量场景下问题不大真正上线后如果数据量大再考虑 MySQL 全文索引或者 Elasticsearch。不要一上来就上重型搜索组件方向比工具更重要。2.4 购物车与订单流程购物车的接口设计和增删改查区别不大但有一个关键点添加购物车时如果同一用户已经添加过同一本书应该把数量叠加而不是新增一条记录。这样购物车列表里不会出现重复商品。订单接口是整个系统里逻辑最复杂的。创建订单的步骤是接收请求体里的商品列表格式为[{book_id: 1, quantity: 1}]。查询所有商品的有效状态判断库存是否足够。计算总金额这里必须用后端计算的价格不能用前端算好的金额。否则用户把价格改小你就按错误的价格收款了。生成订单号比如年月日时分秒 随机数同时创建订单主表和订单项表。扣减库存。事务处理是关键以上几步必须在一个事务里完成。我用 db.session 的上下文来自动管理with db.session.begin_nested(): orders Order(...) db.session.add(orders) for item in items: book Book.query.filter_by(iditem[book_id]).with_for_update().first() if not book or book.stock item[quantity]: raise ValueError(库存不足) book.stock - item[quantity] db.session.add(OrderItem(...)) db.session.commit()为什么要用with_for_update()这是行级锁防止两个用户同时购买同一本书时都读到了相同的库存数最后超卖。如果不加锁在高并发场景下很容易出现库存变负数的问题。二手书项目并发量可能不大但这个习惯值得养成。扣减库存后前端跳转到支付页面。因为我没有对接真实支付就做了一个模拟支付接口前端传入订单号后端把订单状态从待付款改成待发货。以后要接微信支付或支付宝只需要替换这一个接口的实现。3. 前端核心实现Vue3 组件化开发与联调3.1 前端工程化搭建前端我用的 Vite Vue3 Vue Router Pinia Element Plus整体是一个标准的中后台商城混合型应用。Vite 开发服务器启动快热更新几乎是秒级这种体验在写页面时非常加分。我的前端目录结构frontend/ ├── index.html ├── vite.config.js ├── src/ │ ├── main.js │ ├── App.vue │ ├── api/ # 封装axios请求 │ ├── assets/ │ ├── components/ # 公共组件 │ ├── router/ # 路由配置 │ ├── stores/ # Pinia状态管理 │ ├── views/ # 页面组件 │ └── utils/ # 工具函数Vite 里配置别名指向src这样在组件里 import 就不需要写一长串相对路径。Element Plus 我采用了全量引入因为项目组件数量不算太多全量引入开发省心。如果更在意包体积可以换成按需引入加 unplugin-vue-components。3.2 页面路由与状态管理路由分成公开路由和需要登录的路由。公开的有首页、商品列表、商品详情、登录注册。需要登录的有购物车、结算、我的订单、个人中心。我在 router 的 beforeEach 守卫里做登录判断router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.meta.requiresAuth !token) { next({ path: /login, query: { redirect: to.fullPath } }) } else { next() } })Pinia 状态管理里我建了三个 storeuserStore 存储用户信息和登录状态cartStore 存储购物车数量和物品列表orderStore 存储当前结算的订单数据。其中 cartStore 是核心因为它要在多个页面间共享。一个小小的坑localStorage 存的 token 在页面刷新后还在但 userStore 的数据会丢失。所以我在 App.vue 初始化时调用一次获取用户信息的接口根据 token 重新拉取当前用户这样刷新后登录状态不会断。3.3 关键页面实现首页、商品详情、购物车、结算首页主要展示分类导航和商品瀑布流。我用了 Element Plus 的 Carousel 组件做轮播图下面按分类展示推荐商品。商品列表项是独立的 BookCard 组件包含封面、书名、价格、成色描述。点击卡片跳到详情页。商品详情页除了展示基础信息外还有“加入购物车”和“立即购买”两个按钮。立即购买其实就是先把商品加入购物车然后直接跳转结算页。这里有个交互细节加入购物车后导航栏右上角的购物车角标要实时更新所以购物车数量我放在 cartStore 里。购物车页是数据最密集的页面。我用了表格展示商品每一行有复选框、商品信息、单价、数量步进器和小计。数量修改后要调用后端更新购物车接口并且重新计算底部合计。这里我用 computed 来派生合计金额响应式数据一改UI 自动更新。结算页需要展示本次勾选的商品清单、总金额、填写收货人信息。这里注意商品清单应该从订单确认接口获取而不是直接从购物车 store 里读。因为后端在创建订单时才会再次校验库存和价格前端展示的数据只能作为参考。我确认订单时调用了/api/order/preview后端把购物车勾选商品重新查询并返回最新的库存和价格。3.4 前后端联调中的跨域与会话处理前后端分离后跨域是绕不开的问题。我的前端跑在 5173 端口后端跑在 5000 端口。直接用 axios 请求后端浏览器会拦截。解决方案有两种前端配代理或者后端开 CORS。开发阶段我用 Vite 的 proxy 配置把/api开头的请求代理到后端这样浏览器根本不知道跨域。// vite.config.js server: { proxy: { /api: { target: http://127.0.0.1:5000, changeOrigin: true } } }请求发送时把/api作为一个基准路径后端用 blueprints 统一加了/api前缀。比如注册接口的完整路径是/api/auth/register。开发环境中代理模式要注意一个问题如果后端返回的图片地址是/uploads/xxx.jpg而前端跑在 5173浏览器会去请求5173/uploads这显然会 404。解决方法是把图片路径也通过代理转发/uploads: { target: http://127.0.0.1:5000, changeOrigin: true }生产环境我用了 Nginx 统一处理后面部署部分会讲到。关于会话我用 JWT 做无状态认证服务端不保存 session所以不需要处理 cookie 和 session 同步。但要注意 token 的存储位置。我用的是 localStorage简单直接但容易受到 XSS 攻击。更安全的选择是放到 httpOnly cookie 里不过那样要做 CSRF 防护前端处理也复杂一些。小项目用 localStorage 注意输入过滤也能接受。4. 部署上线与性能优化4.1 生产环境构建前端构建是很容易的一步但坑也不少。先在本地执行npm run build生成 dist 目录。这里有个关键点Vite 构建时的 API 基础路径不能是/api体力直连因为生产环境前端静态文件由 Nginx 托管请求 API 也走 Nginx 转发。所以我在项目里定义了一个环境变量VITE_API_BASE开发时为空走代理生产构建时设为/api这样请求就会打到同一个域名下的/api。如果不做这一步生产环境的请求会写成http://frontend-domain/api/...而后端域名不同又出现跨域。统一走 Nginx 后就简单了。构建后把 dist 里的文件复制到服务器的/var/www/book_market目录后端代码用 git 部署到/opt/book_market/backend。4.2 Nginx 反向代理与静态资源托管Nginx 配置是整个部署的核心。我要做三件事托管前端静态文件。把/api开头的请求反向代理到 Flask 服务。把/uploads图片目录指到服务器上的上传目录。下面是我实际使用的配置片段server { listen 80; server_name your-domain.com; root /var/www/book_market; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /uploads/ { alias /opt/book_market/backend/uploads/; } }try_files这行非常重要因为 Vue Router 是 history 模式当用户直接访问/book/123这种前端路由时服务器上并没有对应的物理文件必须返回 index.html由前端路由接管。本地开发时我在 Vite 里注册的是/api前缀所以 Nginx 里location /api/会匹配上。proxy_pass的写法要注意末尾有没有/容易导致路径带不带 api 前缀的差异。我为了避免理解混乱后端接口本身就没有api前缀因为我用了蓝图后注册前缀是在初始化时加上的。举个例子我把蓝图注册为app.register_blueprint(auth_bp, url_prefix/api/auth)这样后端请求路径就是/api/auth/loginNginx 转发到 Flask 后也是同样的路径不需要 rewrite。4.3 数据库备份与常用优化数据库用的 MySQL虽然项目不大但备份不能省。我写了一个简单的定时任务脚本每天凌晨把数据库 dump 出来然后压缩保留最近 7 天#!/bin/bash backup_dir/data/backup datetime$(date %Y%m%d%H%M) mysqldump -u root -p password book_market | gzip $backup_dir/book_market_$datetime.sql.gz find $backup_dir -name *.sql.gz -mtime 7 -delete然后加到 crontab 里每天 2 点执行。另一个优化点是图片处理。用户上传的封面图如果不压缩一张照片可能有 3-4MB页面加载会很慢。我建议在服务器上装 ImageMagick或者用 Python 的 Pillow 在上传时生成缩略图from PIL import Image img Image.open(file) img.thumbnail((400, 400)) img.save(os.path.join(app.config[UPLOAD_FOLDER], filename), quality85)列表页显示缩略图详情页显示原图这样既省带宽加载速度也快。我实际测过一张 400x400 的压缩图普遍在 100KB 以内整体体验明显提升。启动后端服务的时候我用的是 Gunicorn并用多个 worker 来应对并发gunicorn -w 3 -b 127.0.0.1:5000 --timeout 60 app:app3 个 worker 对于这个小系统足够。如果你预期并发很大可以加 worker 数量但要小心数据库连接数也要相应调整否则 MySQL 会报 too many connections。这里我建议数据库连接池开启复用SQLAlchemy 默认会处理不需要额外配置。5. 常见问题排查与避坑指南5.1 跨域、JWT 失效与库存并发跨域报错是前后端联调时最容易遇到的问题。如果你没有用 Vite 代理而是直接请求后端浏览器控制台会出现CORS policy的报错。我的建议是开发环境一定用代理生产环境用 Nginx 转发这样你几乎不需要在后端处理 CORS。如果确实需要单独给某个域名开 CORS可以用 flask-corsfrom flask_cors import CORS CORS(app, origins[http://localhost:5173], supports_credentialsTrue)JWT 失效的表现是某个接口突然返回 401但其他接口正常。这时候先看 token 是不是过期了。我把 token 过期时间设为 7 天理论上够用。如果用户长时间不操作前端需要在拦截器里捕获 401然后跳转到登录页。这里有个注意点跳转时不要把当前页面的路径丢在本地应该用window.location.href配合encodeURIComponent保存来源等重新登录后回到原页面。库存并发问题前面提到用行锁解决。但行锁有一个例外添加购物车时数量超过了库存我选择在前端就限制最大数量为库存值。但这只是体验层面的优化真正下单时后端还是必须重新校验。记住一条原则前端限制是体验优化后端校验才是业务保障。5.2 开发中总结的实用经验我记录几个不太容易一次就想到的细节你可以直接抄。第一个是订单号生成。有人用time.time()加随机数但并发时可能重复。我用的方案是取当前日期时间到毫秒再拼接 4 位随机数最后加上用户 id 后三位。这样即使用户并发下单也很难撞号。import time import random def generate_order_no(user_id): ts time.strftime(%Y%m%d%H%M%S, time.localtime()) suffix f{user_id:03d}[-3:] return fBK{ts}{random.randint(1000, 9999)}{suffix}第二个是图片上传的校验。只做前端校验远远不够因为伪造请求时可以随意改 content-type。我在后端除了检查扩展名还要用file.content_type做校验并实际读取文件头来确认格式。最简单的方法是用 Pillow 打开图片如果打开失败就不是合法图片。第三个是前端路由懒加载。如果你把所有页面组件都写在一个 bundle 里首屏体积会很大。我把路由改成动态 import 后首屏加载快了至少一半const BookDetail () import(../views/BookDetail.vue)Element Plus 按需引入也要做我用 unplugin-auto-import 和 unplugin-vue-components只打包用到的组件。这两步合起来能明显改善页面加载速度。第四个是测试数据。我写了一个假的图书数据生成脚本用 Faker 库生成 500 条书籍数据包括随机书名、作者、价格、库存和图片地址。这样开发前端列表页时不用手工一条条录入。脚本跑完样式和分页逻辑直接可以验证。如果你打算自己从零搭一套二手书商城我建议你按这个顺序来先建数据库表再写后端的登录注册和商品接口然后开发前端首页和详情页最后才做购物车和订单。不要把订单放最前面因为订单依赖前面所有模块调试起来会很痛苦。我个人在这次项目里最大的收获是做业务系统技术选型只是起点真正决定项目成败的是数据设计和异常处理。Flask Vue3 的组合非常适合中小型 Web 项目它给了你足够的自由度同时又有庞大的社区资料支撑。哪怕你刚开始接触后端跟着这个思路把项目跑通你对前端的路由、状态管理后端的 ORM、JWT、事务这些概念都会有比看文档深刻得多的理解。最后再分享一个小技巧上线后记得定期看后端日志重点关注/api/order接口的响应时间。如果订单接口变慢十有八九是数据库索引没建好。我给book.status、book.category_id、order.user_id都加了普通索引简单查询的响应都稳定在几十毫秒。这类优化不用等出问题再做开发阶段就把索引规划好能省不少事。
RELATED

相关推荐

梯度下降不是公式,是可调试的工程活算法

梯度下降不是公式,是可调试的工程活算法

1. 这不是教科书里的梯度下降,是我在三个真实项目里反复调参踩出来的“活算法”你打开任何一本机器学习入门书,第一页讲监督学习,第二页准保出现“梯度下降”四个字——配一张碗状函数图,画几条歪歪扭扭的箭头,再写一句…

📅 2026/10/15 7:23:01
AnyPS5 主机扩展工具:局域网串流与输入映射实操指南

AnyPS5 主机扩展工具:局域网串流与输入映射实操指南

1. 项目缘起与核心定位拆解1.1 这个标题到底在说什么第一次看到"AnyPS5"这个命名,我的直觉是这是一个围绕PlayStation 5生态做扩展的工具型项目。命名结构里"Any"是前缀,通常意味着"任意、通用、跨平台"的能力延伸&#x…

📅 2026/10/15 7:18:01
GEO报告分数怎么读?三步拆解指标定位优化优先级

GEO报告分数怎么读?三步拆解指标定位优化优先级

上周有个朋友发来一张GEO报告截图,问我:“总分58,这到底算好还是差?下一步改什么?”这种问题我见过太多次了。拿到GEO报告有了分数,大多数人的第一反应是高兴,第二反应是懵——分数不是满分也不…

📅 2026/10/15 7:18:01
MORE NEWS

更多资讯

📰

Autodock Vina批量对接自动化流水线构建指南

简介:本资源是一份面向计算化学、药物设计领域初学者与科研人员的Autodock Vina批量分子对接实战指南,聚焦Ubuntu 18.04环境下从零部署到集群化运行的完整流程,解决单机算力不足、手动重复对接效率低等实际问题。资源以1个PDF文件&#xff08…

📰

华为云码道从0到1实战:我用它把课设后端一周的活压到了两天

事情是这样的。这学期软件工程课设,我们组抽到做一个宿舍记账的 Web 应用,周期两周,我负责后端。说实话一开始我挺怵的,FastAPI 我只写过 demo,真要从零搭一个带用户、账单、统计的完整后端,心里没底。 正…

📰

t3code 编码规范实战:从设计到 CI 落地的完整指南

1. 从“t3code”这个标题说起:它到底是什么第一次看到“t3code”这个词,很多人会一头雾水。它不像“Vue”“React”那样一眼能看出是前端框架,也不像“Docker”“K8s”那样自带运维属性。我最初接触到它,是在一个做低代码平台的朋…

📰

DeepSeek与AIGC应用:大模型推理原理、选型与落地避坑指南

简介:DeepSeek与AIGC应用是北京大学多个部门联合发布的DeepSeek系列研讨讲义,面向对人工智能和自然语言处理感兴趣的研究者、行业从业者及管理者,适合希望了解大模型技术本质并推动业务智能化升级的读者。内容以DeepSeek-R1推理模型为主线&am…

📰

GitHub Copilot 安装教程:VSCode、JetBrains、Visual Studio 三端配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Java后端AI工程化实践:LLM集成与向量数据库应用

1. 项目概述作为一名在Java后端领域摸爬滚打多年的老码农,我最近半年一直在探索如何将AI能力工程化地集成到传统Java技术栈中。这个过程中踩过的坑、总结的经验,今天用万字长文完整分享给大家。不同于那些只讲理论的AI教程,本文聚焦于生产环境…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬