news 2026/9/5 14:01:07

Python Flask毕业设计实战:在线笔记系统开发全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python Flask毕业设计实战:在线笔记系统开发全流程解析

简介:这是一套面向计算机相关专业本科生的毕业设计级在线笔记系统实现方案,基于Python+Flask后端框架与基础前端技术构建,适用于软件工程、人工智能、电子信息等方向的学生完成毕设、课程设计或项目实践。资源包共46个文件,包含5个核心Python模块(如app.py、models.py)、14个HTML模板页、3个JS交互脚本、1个CSS样式文件及6张界面截图,辅以bat/exe启动脚本和cfg配置文件,整体压缩包仅610KB,结构清晰、部署轻量。已有154人下载学习,代码经实测可正常运行,配套详细使用文档涵盖环境搭建、功能说明与操作流程。读者可直接部署体验完整笔记增删改查、用户登录与数据持久化功能,亦可基于Flask路由与SQLAlchemy模型快速扩展标签管理、富文本编辑或Vue前端对接,是理解Web全栈开发流程的优质入门范例。

1. 项目缘起与核心价值

又到了一年一度的毕业季,后台和私信里收到不少计算机相关专业同学的咨询,核心问题都绕不开一个:毕业设计到底该怎么搞?尤其是那些要求“系统设计与实现”的课题,既要理论又要实践,还要有完整的文档和可运行的源码,想想就头大。最近一个学弟把他刚完成的“在线笔记系统”项目发给我看,用的是Python+Flask这套经典组合。我仔细review了一遍,发现这确实是一个非常适合作为毕业设计的选题,它麻雀虽小,五脏俱全,几乎涵盖了Web开发从后端到前端的核心知识点,而且业务逻辑清晰,不至于让初学者陷入复杂的业务泥潭。

这个基于Flask的在线笔记系统,本质上是一个轻量级的个人知识管理工具。用户可以进行注册登录,创建、编辑、删除自己的笔记,并可能包含简单的分类或标签功能。你别看它功能简单,但正是这种“简单”,让它成为了一个绝佳的学习和练手项目。它避开了电商、社交等系统复杂的并发、事务和分布式问题,让你可以专注于理解Web应用最基本的工作流程:请求如何进来,数据如何流转,视图如何响应,页面如何渲染。对于大多数本科阶段的同学来说,能把这样一个系统的前后端逻辑理清楚,把代码写得规范,把文档写得完整,毕业设计拿个高分甚至优秀,是完全有希望的。

我之所以推荐这个项目,是因为它踩在了一个非常巧妙的平衡点上。技术栈上,Python+Flask入门门槛相对较低,社区资源丰富,遇到问题容易找到解决方案;业务复杂度上,它避免了过度设计,核心的CRUD(增删改查)操作是任何系统的基石;扩展性上,它又留足了余地,比如你可以很容易地为它增加Markdown编辑器、全文搜索、笔记分享等功能,让项目显得更有深度。接下来,我就结合这个典型项目,拆解一下从零开始实现一个在线笔记系统,你需要关注哪些核心环节,以及如何避开那些新手最容易踩的坑。

2. 技术选型背后的逻辑:为什么是Python+Flask?

很多同学拿到题目,第一步就卡在技术选型上。市面上框架这么多,Django、Spring Boot、Express.js,为什么偏偏选Flask?这里面的门道,我得给你掰扯清楚。

首先,从毕业设计的评价维度来看,老师通常关注几点:技术应用的合理性、代码结构的清晰度、功能的完整性以及文档的规范性。Python语言本身以语法简洁、可读性强著称,这能让你把更多精力放在业务逻辑而非语言特性上,写出来的代码也更容易让评审老师看懂。Flask作为一个“微框架”,它的设计哲学是“轻量”和“灵活”。它不像Django那样“大而全”,自带ORM、Admin后台等一堆组件。Flask只提供了最核心的路由、请求上下文和模板渲染引擎,其他功能如数据库操作、表单验证、用户认证,都需要你通过扩展(Extension)或自己实现来按需添加。

注意:这种“微”特性,恰恰是毕业设计的加分项。它迫使你必须去理解每一个组件(比如SQLAlchemy、WTFforms、Flask-Login)是如何集成进来的,它们之间是如何协作的。这个过程能充分体现你的“设计”能力,而不仅仅是“调用”API的能力。你可以在文档里详细阐述你为什么选择Flask-SQLAlchemy而不是直接用sqlite3库,为什么用Flask-Login管理会话而不是自己手写Cookie,这比直接用Django一键生成所有东西,更能展示你的技术思考。

其次,从实现成本和学习曲线上看,Flask对新手极其友好。它的“Hello World”只需要7行代码,这种即时反馈能快速建立你的信心。整个项目的依赖清晰,一个requirements.txt文件就能列明所有第三方库,环境搭建和部署都相对简单。这对于需要在有限时间内(通常是一个学期)完成设计、编码、测试、文档撰写的你来说,至关重要。你不需要在框架本身的复杂配置上花费太多时间。

最后,从项目的可展示性来看,一个Flask项目具有清晰的结构。典型的Flask项目目录如下所示,这种结构一目了然,非常利于你在答辩时向老师展示你的代码组织能力:

/your_note_app ├── app.py # 应用主入口,或使用工厂模式创建app ├── requirements.txt # 项目依赖清单 ├── config.py # 配置文件(数据库URI,密钥等) ├── /app # 核心应用包 │ ├── __init__.py # 工厂函数,初始化Flask app和扩展 │ ├── models.py # 数据模型定义(User, Note) │ ├── forms.py # 表单类定义(LoginForm, NoteForm) │ ├── routes.py # 或 views.py, 存放所有路由和视图函数 │ ├── /templates # Jinja2模板文件 │ │ ├── base.html # 基础模板 │ │ ├── index.html │ │ ├── login.html │ │ └── note_edit.html │ └── /static # 静态资源(CSS, JS, images) └── /migrations # 数据库迁移文件夹(如果用了Flask-Migrate)

你可以对比一下,如果选用Spring Boot,光是理解IoC、AOP、Maven依赖和复杂的目录结构,可能就要耗去不少前期时间。Flask的这种简约和直接,让你能更快地进入“实现功能”的正循环。

3. 系统核心模块设计与实现拆解

一个在线笔记系统,无论多简单,其核心都围绕着“用户”和“笔记”这两个实体展开。下面,我们就深入这两个实体的生命周期,看看代码到底该怎么写。

3.1 数据模型设计:一切的基础

数据模型是系统的基石,设计得好,后续开发顺风顺水;设计得不好,到处是坑。我们至少需要两个模型:UserNote

app/models.py里,我们使用Flask-SQLAlchemy来定义它们。这里有一个关键点:关系型数据库的表关系设计。一个用户拥有多篇笔记,这是一对多关系。在SQLAlchemy中,我们使用db.relationshipdb.ForeignKey来建立这种联系。

from datetime import datetime from app import db, login_manager from flask_login import UserMixin from werkzeug.security import generate_password_hash, check_password_hash class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, nullable=False, index=True) email = db.Column(db.String(120), unique=True, nullable=False, index=True) password_hash = db.Column(db.String(128), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) # 建立反向关系:通过一个User对象,可以用`.notes`属性获取其所有笔记 notes = db.relationship('Note', backref='author', lazy='dynamic', cascade='all, delete-orphan') def set_password(self, password): # 切记:密码绝对不能明文存储! self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) class Note(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) # 使用Text类型存储长内容 created_at = db.Column(db.DateTime, default=datetime.utcnow, index=True) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 外键,指向User表的id字段 user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

这里有几个设计细节和容易踩的坑:

  1. 密码存储password_hash字段存储的是密码的哈希值,而非明文。我们通过generate_password_hashcheck_password_hash这两个Werkzeug库提供的安全函数来处理。这是Web安全的基本要求,在你的毕业设计文档中必须强调这一点。
  2. 时间戳created_atupdated_at是很好的实践。updated_at使用onupdate参数,会在记录更新时自动设置为当前时间,便于追踪笔记的最后修改时间。
  3. 关系与级联User.notes关系中的lazy='dynamic'意味着user.notes返回的是一个查询对象(Query),而不是直接加载所有笔记列表,这在你需要分页或过滤时会非常高效。cascade='all, delete-orphan'确保了当删除一个用户时,他所有的笔记也会被自动删除(根据业务需求,你也可以设置为不删除,而是将笔记设为匿名)。
  4. 索引:对usernameemailcreated_at等经常用于查询或排序的字段添加索引(index=True),能显著提升数据库查询性能,尤其是在数据量增长后。这虽然是小细节,但能体现你对性能的考量。

3.2 用户认证与会话管理:守卫系统的大门

没有用户认证,笔记系统就变成了公共记事本。实现登录、注册、登出以及保护特定路由(如创建笔记页)是必须的。我们使用Flask-Login这个扩展,它能优雅地处理会话。

首先,在app/__init__.py中初始化LoginManager

from flask_login import LoginManager login_manager = LoginManager() login_manager.login_view = 'auth.login' # 指定未登录用户访问保护页面时重定向的登录页面 login_manager.login_message = '请先登录以访问此页面。' login_manager.init_app(app) # 这个回调函数用于从会话中重新加载用户对象 @login_manager.user_loader def load_user(user_id): from app.models import User return User.query.get(int(user_id))

接着,在app/routes.py(或拆分为auth.py)中实现视图函数:

from flask import render_template, redirect, url_for, flash, request from flask_login import login_user, logout_user, current_user, login_required from app import db from app.models import User from app.forms import LoginForm, RegistrationForm # 注册路由 @bp.route('/register', methods=['GET', 'POST']) def register(): if current_user.is_authenticated: # 如果已登录,直接跳转到首页 return redirect(url_for('main.index')) form = RegistrationForm() if form.validate_on_submit(): user = User(username=form.username.data, email=form.email.data) user.set_password(form.password.data) # 调用模型中的方法加密密码 db.session.add(user) db.session.commit() flash('恭喜,注册成功!请登录。', 'success') return redirect(url_for('auth.login')) return render_template('register.html', form=form) # 登录路由 @bp.route('/login', methods=['GET', 'POST']) def login(): if current_user.is_authenticated: return redirect(url_for('main.index')) form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.username.data).first() # 验证用户存在且密码正确 if user is None or not user.check_password(form.password.data): flash('用户名或密码无效', 'danger') return redirect(url_for('auth.login')) login_user(user, remember=form.remember_me.data) # 处理“下次访问”逻辑:如果用户之前想访问某个受保护页面,登录后跳转回去 next_page = request.args.get('next') if not next_page or url_parse(next_page).netloc != '': next_page = url_for('main.index') return redirect(next_page) return render_template('login.html', form=form) # 登出路由 @bp.route('/logout') @login_required # 只有登录用户才能登出 def logout(): logout_user() return redirect(url_for('main.index'))

提示:@login_required装饰器是你的好朋友。任何需要登录才能访问的视图,比如“新建笔记”、“我的笔记列表”,直接在函数上方加上它即可。Flask-Login会自动拦截未登录的请求,并跳转到login_manager.login_view指定的页面。

这里的关键在于理解Flask-Login的工作流:用户登录时,login_user()函数会在用户的浏览器中设置一个安全的会话Cookie,其中包含加密后的用户ID。此后,该用户发出的每个请求,@login_required装饰器和current_user代理对象都会通过@login_manager.user_loader装饰的回调函数,用这个ID从数据库重新加载完整的用户对象。这样,你在视图函数里就能直接用current_user来获取当前登录用户的所有信息。

3.3 笔记的CRUD与路由设计

这是业务逻辑的核心。我们需要创建、读取、更新、删除笔记,并且确保用户只能操作自己的笔记。

app/routes.py中,我们为笔记功能创建蓝图(Blueprint),并定义相关路由:

from flask import render_template, redirect, url_for, flash, request, abort from flask_login import current_user, login_required from app import db from app.models import Note from app.forms import NoteForm # 笔记列表页 @bp.route('/') @bp.route('/index') @login_required def index(): # 只查询当前用户的笔记,并按更新时间倒序排列 page = request.args.get('page', 1, type=int) notes = current_user.notes.order_by(Note.updated_at.desc()).paginate( page=page, per_page=10, error_out=False ) return render_template('index.html', notes=notes) # 创建新笔记 @bp.route('/note/new', methods=['GET', 'POST']) @login_required def new_note(): form = NoteForm() if form.validate_on_submit(): note = Note(title=form.title.data, content=form.content.data, author=current_user) db.session.add(note) db.session.commit() flash('笔记已创建!', 'success') return redirect(url_for('main.index')) return render_template('note_edit.html', title='新建笔记', form=form) # 查看/编辑单篇笔记 @bp.route('/note/<int:note_id>', methods=['GET', 'POST']) @login_required def note(note_id): note = Note.query.get_or_404(note_id) # 权限校验:确保当前用户是笔记的作者 if note.author != current_user: abort(403) # 返回403禁止访问错误 form = NoteForm() if form.validate_on_submit(): # POST请求,处理更新 note.title = form.title.data note.content = form.content.data db.session.commit() flash('笔记已更新!', 'success') return redirect(url_for('main.note', note_id=note.id)) elif request.method == 'GET': # GET请求,用现有数据填充表单 form.title.data = note.title form.content.data = note.content return render_template('note_edit.html', title='编辑笔记', form=form, note=note) # 删除笔记 @bp.route('/note/<int:note_id>/delete', methods=['POST']) # 通常删除用POST或DELETE方法 @login_required def delete_note(note_id): note = Note.query.get_or_404(note_id) if note.author != current_user: abort(403) db.session.delete(note) db.session.commit() flash('笔记已删除。', 'info') return redirect(url_for('main.index'))

实现要点与避坑指南:

  1. 权限校验是生命线:在note()delete_note()视图函数中,if note.author != current_user:这行代码至关重要。它防止了用户通过手动修改URL中的note_id来查看或删除他人笔记。这是Web安全中“垂直越权”的典型防护手段,必须在你的设计和文档中着重说明。
  2. 使用get_or_404Note.query.get_or_404(note_id)是一个好习惯。如果找不到对应ID的笔记,它会自动抛出一个404错误,并由Flask的错误处理器返回一个404页面,比你自己写if not note:然后abort(404)更简洁。
  3. 分页查询:在index()视图里,我们使用了SQLAlchemy的paginate()方法。当用户笔记数量很多时,一次性加载所有数据到内存并渲染到页面,会导致页面加载极慢甚至崩溃。分页是必须考虑的优化点。paginate对象包含了当前页的数据、总页数等信息,方便在模板中生成分页导航。
  4. 表单的GET/POST处理:在note()视图里,我们区分了GETPOST请求。GET请求用于展示表单(用笔记数据预填充),POST请求用于处理表单提交(更新数据)。这种模式是Flask处理编辑类视图的标准做法。
  5. 删除操作使用POST:删除是一个危险操作,不应该用简单的<a>链接(GET请求)来实现,因为浏览器预取或网络爬虫可能会误触发。应该用一个表单,提交方式为POST,或者使用JavaScript发起DELETE请求。这样更符合HTTP语义,也更安全。

3.4 前端模板与用户交互

后端逻辑通了,前端就是把它呈现出来。Flask使用Jinja2模板引擎。一个好的基础模板(base.html)能节省大量重复工作。

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{% block title %}我的笔记系统{% endblock %}</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container"> <a class="navbar-brand" href="{{ url_for('main.index') }}">笔记系统</a> <div class="navbar-nav ms-auto"> {% if current_user.is_authenticated %} <span class="navbar-text me-3">你好,{{ current_user.username }}!</span> <a class="nav-link" href="{{ url_for('main.new_note') }}">新建笔记</a> <a class="nav-link" href="{{ url_for('auth.logout') }}">退出</a> {% else %} <a class="nav-link" href="{{ url_for('auth.login') }}">登录</a> <a class="nav-link" href="{{ url_for('auth.register') }}">注册</a> {% endif %} </div> </div> </nav> <main class="container mt-4"> <!-- Flash消息展示 --> {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category, message in messages %} <div class="alert alert-{{ category }} alert-dismissible fade show" role="alert"> {{ message }} <button type="button" class="btn-close">{% extends "base.html" %} {% block title %}{{ title }}{% endblock %} {% block content %} <h2>{{ title }}</h2> <form method="POST" action=""> {{ form.hidden_tag() }} <!-- 生成CSRF令牌 --> <div class="mb-3"> {{ form.title.label(class="form-label") }} {{ form.title(class="form-control") }} {% for error in form.title.errors %} <div class="text-danger">{{ error }}</div> {% endfor %} </div> <div class="mb-3"> {{ form.content.label(class="form-label") }} {{ form.content(class="form-control", rows=15) }} {% for error in form.content.errors %} <div class="text-danger">{{ error }}</div> {% endfor %} </div> <button type="submit" class="btn btn-primary">保存</button> {% if note %} <button type="button" class="btn btn-danger">import os from dotenv import load_dotenv load_dotenv() # 从 .env 文件加载环境变量 class Config: SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess-a-hard-key-here' SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///app.db' SQLALCHEMY_TRACK_MODIFICATIONS = False # 关闭警告信息

在项目根目录创建.env文件(并记得将其加入.gitignore):

SECRET_KEY=your-super-secret-key-123456 DATABASE_URL=sqlite:///app.db

3. 应用工厂模式 (app/__init__.py):这是Flask推荐的组织大型应用的方式,它让创建应用实例变得更灵活,便于测试和配置。

from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager from config import Config db = SQLAlchemy() login_manager = LoginManager() def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) db.init_app(app) login_manager.init_app(app) # 注册蓝图 from app.routes import main_bp, auth_bp app.register_blueprint(main_bp) app.register_blueprint(auth_bp, url_prefix='/auth') return app

4. 启动脚本 (run.py):在项目根目录创建一个简单的启动脚本:

from app import create_app, db from app.models import User, Note app = create_app() @app.shell_context_processor def make_shell_context(): return {'db': db, 'User': User, 'Note': Note} if __name__ == '__main__': app.run(debug=True)

现在,评审老师拿到你的项目后,只需要三步:

# 1. 创建虚拟环境(可选但推荐) python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # 2. 安装依赖 pip install -r requirements.txt # 3. 初始化数据库并运行 flask shell >>> db.create_all() # 创建数据表 >>> exit() python run.py

浏览器打开http://127.0.0.1:5000,一个完整的笔记系统就展现在眼前了。这种极简的部署体验,会给你加分不少。

4.2 毕业设计文档的核心章节撰写指南

文档和代码一样重要。它展示了你的设计思路、理论依据和总结能力。一份优秀的毕业设计文档(或论文)应该包含以下核心章节,并注意以下要点:

第一章 绪论

  • 别写空话套话:避免“随着互联网技术的发展...”这种万能开头。直接从“个人知识管理的需求日益增长”或“轻量级Web应用开发是计算机专业学生的重要实践”切入,引出开发一个在线笔记系统的必要性和你的项目目标。
  • 明确项目内容:清晰说明本项目是一个基于B/S架构,采用Python Flask框架实现的,具备用户管理、笔记增删改查等核心功能的Web应用系统。

第二章 相关技术介绍

  • 不要罗列教科书:不要大段抄写Python、HTTP协议的定义。重点介绍你为什么选以及怎么用这些技术。
  • 对比分析:可以简要对比Flask和Django,说明Flask“微框架”的灵活性更适合本项目,体现你的选型思考。
  • 画出系统架构图:一张清晰的“系统技术架构图”(可以用PPT或Draw.io画)非常直观。展示浏览器、Web服务器(Flask)、数据库、静态资源之间的关系,以及MVC(MTV)模式在你的项目里是如何体现的。

第三章 系统分析与设计

  • 功能模块图:用图表列出核心模块,如用户管理模块、笔记管理模块。
  • 数据库设计:这是重点。给出UserNote表的详细E-R图,并附上字段说明(字段名、类型、约束、说明)。详细解释你设计password_hashcreated_at、外键和索引的考量。
  • 核心业务流程:用文字或流程图描述“用户注册-登录-创建笔记-编辑笔记-删除笔记”这一核心流程的数据流转。

第四章 系统实现

  • 这是文档的精华部分,要与代码对应
    • 环境搭建:写明Python版本、如何安装依赖(pip install -r requirements.txt)。
    • 关键代码展示与讲解:不要贴全部代码!选择最核心的3-5个代码片段进行讲解。例如:
      • 用户模型中的密码哈希方法(强调安全性)。
      • @login_required装饰器和权限校验代码(强调安全性)。
      • 笔记分页查询的实现(强调性能优化)。
      • 表单处理中的CSRF保护(强调安全性)。
    • 界面展示:贴上系统主要页面的截图(登录页、笔记列表页、编辑页),并加以简要说明。

第五章 系统测试

  • 不要只写“系统运行稳定”。设计简单的测试用例。
    • 功能测试:制作一个表格,列出测试项(如“用户注册”、“登录失败”、“创建笔记”、“尝试删除他人笔记”)、测试步骤、预期结果、实际结果。
    • 界面测试:在不同浏览器(Chrome, Firefox)或屏幕尺寸下查看界面是否正常。
    • 安全性测试:说明你如何防范了SQL注入(SQLAlchemy使用参数化查询,天然防护)、XSS(Jinja2自动转义)、CSRF(Flask-WTF令牌)、越权访问(代码中的author校验)。

第六章 总结与展望

  • 总结:回顾整个开发过程,总结在Flask框架使用、数据库设计、Web安全、项目部署等方面学到的经验和遇到的挑战及解决方案。
  • 展望:提出几个可行的、有深度的未来扩展方向,而不是泛泛而谈“增加更多功能”。例如:
    • “集成Markdown编辑器,提升笔记编辑体验。”
    • “引入Elasticsearch实现笔记内容的全文检索。”
    • “增加笔记分类、标签系统以及基于标签的智能推荐。”
    • “开发RESTful API,为未来开发移动端App做准备。”
    • “使用Docker容器化部署,实现一键部署。”

把以上这些点都做到位,你的这个“基于Python+Flask的在线笔记系统”毕业设计,就不仅仅是一个能跑通的程序,而是一个体现了扎实工程能力、严谨安全思维和良好文档习惯的“优秀项目”了。从技术选型的理由,到每一行关键代码背后的思考,再到最终部署和文档的细节,环环相扣,向评审老师展示了一个合格开发者应有的素养。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 14:00:57

C语言实现LZW无损压缩算法:从原理到工程实践

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

作者头像 李华
网站建设 2026/9/5 14:00:36

基于范式模板的创意图片合成工具:从原理到实践

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

作者头像 李华
网站建设 2026/9/5 13:57:22

零成本搭建数字人直播间:AI视频制作完整指南

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

作者头像 李华
网站建设 2026/9/5 13:55:15

多智能体强化学习在量化交易中的架构设计与实战应用

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

作者头像 李华
网站建设 2026/9/5 13:53:49

AI多模态内容创作实战:从创意到视频的完整工作流解析

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

作者头像 李华
网站建设 2026/9/5 13:52:32

CGA游戏辅助框架:SQLiteCipher加密数据库与本地状态机实践

简介&#xff1a;本资源是面向魔力宝贝玩家与C/Lua脚本开发者的开源游戏辅助工具MLAssist完整设计源码&#xff0c;基于CGA&#xff08;Cross Game Assistant&#xff09;框架深度定制&#xff0c;解决自动化任务执行、角色状态监控、迷宫地图同步及多脚本扩展等实际需求。压缩…

作者头像 李华