众神彩票源码解析:Flask彩票系统开奖与投注工程实践

简介:这是一套面向彩票系统开发者与运营人员的完整开发框架源码,基于2018年前后的主流技术栈构建,适合希望学习彩票业务系统架构、或对既有平台进行二次改造的中高级开发者参考。压缩包共收录7919个文件,整体约217.92MB,其中php文件1451个承担后端业务逻辑,html与js、css合计逾千个支撑前端交互与页面渲染,另有png、jpg、gif等图片资源三千余个及mp3、m4a音频素材近千个,并包含db数据库文件、config配置、sql脚本与functions函数库,覆盖从界面到数据层的完整链路。资源围绕Web框架、数据库设计、RESTful接口、安全防护、支付集成、数据统计与服务器部署等关键环节展开,可帮助读者理解投注、开奖、充值提现等模块的实现思路与目录组织方式。目前已有4573人学习下载,适合作为彩票系统开发的学习样本与结构参考。

1. 众神彩票源码:一套开箱即跑的完整项目,到底藏着哪些工程细节

第一次拿到“众神彩票源码”这个包的时候,我其实没抱太高期待——名字听起来像是个套壳小工具,结果解压一看,目录结构相当规整,前后端分离、数据库脚本、配置文件、部署说明一应俱全。它本质上是一套完整的彩票类 Web 应用源码,包含用户端、管理后台、开奖逻辑、订单系统和数据统计模块。适合两类人:一是想快速搭一套类似业务系统做二次开发的开发者,二是想拿一个真实项目练手、学习完整工程结构的新手。源码里没有花哨的微服务拆分,就是一套典型的单体架构,但该有的分层、该抽的公共模块都没省,拿来改比从零搭省事得多。下面我按“能干什么 → 怎么跑 → 怎么改”的顺序,把这份源码拆开讲一遍。

2. 技术栈与目录结构:先看清骨架再动手

2.1 后端选型与依赖关系

这套源码的后端用的是 Python 技术栈,Web 框架选的是 Flask,数据库层用 SQLAlchemy 做 ORM 映射,缓存和会话管理走 Redis,定时开奖任务用 APScheduler 挂在应用进程里跑。这个组合在中小型项目里非常常见,好处是依赖少、启动快、调试直观,坏处是并发能力有限,不过对于彩票类这种读多写少、开奖周期固定的场景,完全够用。

核心依赖清单大致如下:

# requirements.txt 关键依赖 Flask==2.3.2 # Web 框架 Flask-SQLAlchemy==3.0.5 # ORM 扩展 Flask-Login==0.6.2 # 用户会话管理 Redis==4.5.4 # 缓存与开奖锁 APScheduler==3.10.1 # 定时开奖任务 PyMySQL==1.0.3 # MySQL 驱动 gunicorn==20.1.0 # 生产环境 WSGI 服务器

这里有个细节值得注意:源码里把 APScheduler 直接挂在 Flask 应用上下文里启动,而不是单独跑一个调度进程。好处是部署简单,一个进程全包;坏处是如果开奖逻辑报错,可能把整个 Web 进程拖挂。我一般会在二次开发时把调度器拆出去,用独立的 worker 跑,后面改造章节会细说。

2.2 目录结构逐层拆解

解压后的目录长这样:

zhongshen-lottery/ ├── app/ │ ├── __init__.py # 应用工厂,注册蓝图和扩展 │ ├── models/ # 数据模型层 │ │ ├── user.py # 用户表、余额表 │ │ ├── lottery.py # 彩种、期号、开奖记录 │ │ └── order.py # 投注订单、流水 │ ├── views/ # 路由层 │ │ ├── auth.py # 登录注册 │ │ ├── lottery.py # 投注与开奖查询 │ │ └── admin.py # 管理后台接口 │ ├── services/ # 业务逻辑层 │ │ ├── draw.py # 开奖核心算法 │ │ └── bet.py # 投注校验与扣款 │ ├── static/ # 前端静态资源 │ └── templates/ # Jinja2 模板 ├── migrations/ # 数据库迁移脚本 ├── config.py # 多环境配置 ├── manage.py # 启动入口与 CLI 命令 └── requirements.txt

这个结构是典型的 Flask 应用工厂模式,app/__init__.py里用create_app()函数组装应用,各模块通过蓝图注册路由。services/层单独抽出来是个好习惯,开奖算法和投注逻辑没有塞在视图函数里,后面改规则的时候不用翻路由文件。

2.3 数据库表设计要点

核心表就三张:user、lottery_period、bet_order。用户表存基本信息和余额,期号表存每期的开奖状态和开奖号码,订单表存每笔投注的期号、号码、金额和结算状态。三张表通过期号 ID 和用户 ID 关联,没有复杂的多对多,查询压力主要落在订单表的期号索引上。

-- 期号表关键字段 CREATE TABLE lottery_period ( id INT PRIMARY KEY AUTO_INCREMENT, period_no VARCHAR(20) UNIQUE NOT NULL, -- 期号,如 20240101-001 draw_time DATETIME NOT NULL, -- 开奖时间 draw_numbers VARCHAR(50) DEFAULT NULL, -- 开奖号码,逗号分隔 status TINYINT DEFAULT 0 -- 0待开奖 1已开奖 2已结算 );

status字段是整套系统的状态机核心,投注时校验期号状态必须为 0,开奖后置为 1,结算完置为 2。任何一步卡住,都能通过这个字段定位问题。

3. 本地跑起来:从零到能访问的完整步骤

3.1 环境准备与依赖安装

先把 Python 版本对齐,源码要求 3.8 以上,我实测 3.10 和 3.11 都能跑。数据库用 MySQL 5.7 或 8.0 都行,Redis 随便一个 5.0 以上版本即可。建议用虚拟环境隔离依赖,避免和系统包打架。

# 创建虚拟环境并激活 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate # 安装依赖 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

这里有个血泪经验:源码里PyMySQL的版本如果和你本地 MySQL 驱动冲突,可能会报cryptography相关的错。遇到的话直接pip install cryptography补上就行,不是大问题。

3.2 数据库初始化与配置修改

config.py里分了DevelopmentConfig、ProductionConfig和TestingConfig三个类,本地跑改DevelopmentConfig就行。重点改这几个参数:

# config.py 开发环境配置 class DevelopmentConfig(Config): DEBUG = True SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:password@127.0.0.1:3306/lottery_db' REDIS_URL = 'redis://127.0.0.1:6379/0' SECRET_KEY = 'dev-key-change-me' # 生产环境必须换 DRAW_INTERVAL = 300 # 开奖间隔秒数,测试时可改短

改完配置后,用manage.py里的 CLI 命令建表:

# 初始化数据库表结构 python manage.py db init python manage.py db migrate -m "init tables" python manage.py db upgrade # 插入初始彩种和管理员账号 python manage.py seed

seed命令会往数据库里塞一条默认彩种和 admin 账号,密码是源码里写死的初始值,第一次登录后记得改。

3.3 启动服务与验证访问

开发模式下直接python manage.py runserver就能起来,默认监听 5000 端口。生产环境用 gunicorn:

# 开发模式启动 python manage.py runserver --host 0.0.0.0 --port 5000 # 生产模式启动(4个worker) gunicorn -w 4 -b 0.0.0.0:5000 "app:create_app()"

启动后浏览器访问http://127.0.0.1:5000,能看到用户端首页;访问/admin进管理后台。如果页面样式丢失,检查static/目录是否被正确挂载,Flask 默认会处理,但如果你改了蓝图前缀,静态文件路径也要跟着调。

提示:开奖定时任务在应用启动时自动挂载,测试时把DRAW_INTERVAL改成 30 秒,方便观察整个开奖到结算的流程。

4. 核心模块拆解:开奖、投注、结算的代码链路

4.1 开奖算法与定时任务实现

开奖逻辑在app/services/draw.py里,核心函数execute_draw()做了三件事:生成开奖号码、更新期号状态、触发结算。源码里用的是一种伪随机算法,基于期号和时间戳做哈希后取模,保证同一期号多次执行结果一致。

# app/services/draw.py 开奖核心逻辑 import hashlib from datetime import datetime from app.models.lottery import LotteryPeriod from app.extensions import db, redis_client def execute_draw(period_no): """执行单期开奖,幂等设计:同一期号重复调用返回相同结果""" lock_key = f"draw_lock:{period_no}" # 用 Redis 分布式锁防止并发重复开奖 if not redis_client.set(lock_key, "1", nx=True, ex=10): return None # 已有进程在开奖,直接返回 try: period = LotteryPeriod.query.filter_by(period_no=period_no).first() if not period or period.status != 0: return None # 期号不存在或已开奖 # 基于期号+密钥生成确定性随机数 seed = f"{period_no}-{period.draw_time.timestamp()}" hash_val = hashlib.sha256(seed.encode()).hexdigest() numbers = [] for i in range(5): # 生成5个号码 num = int(hash_val[i*8:(i+1)*8], 16) % 10 numbers.append(str(num)) period.draw_numbers = ",".join(numbers) period.status = 1 db.session.commit() # 触发订单结算 settle_orders(period_no, numbers) return numbers finally: redis_client.delete(lock_key)

这段代码有几个设计点值得说:第一,用 Redis 的set nx做分布式锁,防止多个 worker 同时开奖;第二,开奖号码基于期号和时间戳哈希生成,保证幂等性,重复执行不会产生不同结果;第三,开奖和结算在同一个事务链路里,但结算失败不会回滚开奖状态,这是有意为之——开奖结果一旦确定就不该变,结算可以重试。

定时任务在app/__init__.py里挂载:

# app/__init__.py 定时任务注册 from apscheduler.schedulers.background import BackgroundScheduler def create_app(config_name): app = Flask(__name__) app.config.from_object(config[config_name]) # ... 其他初始化 if not app.config.get('TESTING'): scheduler = BackgroundScheduler() scheduler.add_job( func=auto_draw_job, trigger='interval', seconds=app.config['DRAW_INTERVAL'], id='auto_draw' ) scheduler.start() return app

auto_draw_job会扫描所有到期待开奖的期号,逐个调用execute_draw。这里有个坑:如果应用用 gunicorn 多 worker 启动,每个 worker 都会启动一个调度器,导致重复开奖。虽然 Redis 锁能挡住,但日志里会看到大量锁竞争记录。常见做法是加一个环境变量控制,只让其中一个 worker 启动调度器,或者干脆把调度器拆成独立进程。

4.2 投注校验与余额扣减流程

投注逻辑在app/services/bet.py,核心是place_bet()函数。它要校验期号状态、号码格式、用户余额,然后在一个数据库事务里完成扣款和订单创建。

# app/services/bet.py 投注核心逻辑 from app.models.user import User from app.models.order import BetOrder from app.models.lottery import LotteryPeriod from app.extensions import db def place_bet(user_id, period_no, numbers, amount): """投注入口:校验 -> 扣款 -> 建单,全程事务""" period = LotteryPeriod.query.filter_by(period_no=period_no).first() if not period or period.status != 0: raise ValueError("该期号已停止投注") if amount <= 0 or amount > 10000: raise ValueError("投注金额超出范围") # 号码格式校验:5个0-9的数字 num_list = numbers.split(",") if len(num_list) != 5 or not all(n.isdigit() and 0 <= int(n) <= 9 for n in num_list): raise ValueError("号码格式错误") user = User.query.filter_by(id=user_id).with_for_update().first() if user.balance < amount: raise ValueError("余额不足") try: user.balance -= amount order = BetOrder( user_id=user_id, period_no=period_no, numbers=numbers, amount=amount, status=0 # 待结算 ) db.session.add(order) db.session.commit() return order.id except Exception: db.session.rollback() raise

关键点在with_for_update(),这是数据库行锁,防止同一用户并发投注时余额扣成负数。没有这个锁,两个请求同时读到相同余额,扣款就会出错。源码里这个细节处理得不错,但锁的粒度是用户级别,高并发下可能成为瓶颈,后面改造章节会讲怎么优化。

4.3 结算逻辑与状态流转

结算在settle_orders()函数里,根据开奖号码和订单号码比对,决定是否中奖以及派奖金额。源码里只实现了简单的“猜中全部5个号码即中奖”规则,赔率写死在配置里。

# app/services/draw.py 结算逻辑 def settle_orders(period_no, draw_numbers): """结算该期所有订单,更新订单状态和用户余额""" orders = BetOrder.query.filter_by(period_no=period_no, status=0).all() draw_set = set(draw_numbers) for order in orders: bet_set = set(order.numbers.split(",")) if bet_set == draw_set: # 中奖:按赔率派奖 prize = order.amount * 100 # 赔率100倍 user = User.query.get(order.user_id) user.balance += prize order.status = 1 order.prize = prize else: order.status = 2 # 未中奖 db.session.add(order) # 更新期号状态为已结算 period = LotteryPeriod.query.filter_by(period_no=period_no).first() period.status = 2 db.session.commit()

状态流转是:期号0→1→2,订单0→1(中奖)或0→2(未中奖)。任何一步失败,都能通过状态字段找到卡住的记录。我一般会在结算函数里加日志,记录每笔订单的处理结果,方便对账。

5. 避坑与常见问题:跑起来之后容易翻车的地方

5.1 开奖任务重复执行

现象:日志里同一期号出现多次开奖记录,或者 Redis 锁竞争频繁。原因:gunicorn 多 worker 模式下,每个 worker 都启动了 APScheduler,导致多个调度器同时触发。解决:在create_app里加环境变量判断,只让主 worker 启动调度器;或者把调度器拆成独立进程,用flask apscheduler run单独跑。

5.2 数据库连接超时

现象:运行一段时间后报Lost connection to MySQL server。原因:SQLAlchemy 连接池默认回收时间较长,MySQL 服务端wait_timeout到了会主动断开。解决:在配置里加SQLALCHEMY_ENGINE_OPTIONS = {'pool_recycle': 3600, 'pool_pre_ping': True},让连接池定期回收并检测连接可用性。

5.3 静态文件 404

现象:页面能打开但 CSS/JS 加载失败。原因:蓝图注册时url_prefix改了,但模板里静态文件路径没跟着改。解决:统一用url_for('static', filename='...')生成路径,不要硬编码/static/。

5.4 投注金额精度丢失

现象:用户余额出现0.30000000000000004这种浮点数。原因:数据库字段用了FLOAT而不是DECIMAL。解决:把金额字段改成DECIMAL(10,2),Python 侧用Decimal类型处理,避免浮点误差。

5.5 开奖号码可预测

现象:有人能提前知道开奖号码。原因:源码里的伪随机算法基于期号和时间戳,如果时间戳精度不够或种子泄露,理论上可被推算。解决:生产环境接入外部随机源,或者用更安全的哈希种子,不要把种子写死在代码里。

6. 二次开发改造:从能跑到好用的几个关键动作

这套源码跑通不难,但真要拿去用,有几个地方我建议优先改。第一个是把开奖调度器拆出去,用独立的进程跑,Web 进程只负责响应请求。这样开奖逻辑出问题不会影响用户访问,也避免了多 worker 重复调度。具体做法是新建一个worker.py,里面只初始化 APScheduler 和数据库连接,用python worker.py单独启动。

第二个是给投注接口加限流。源码里没有做频率控制,同一用户短时间大量投注会把数据库打满。我一般用 Redis 做计数器,每个用户每秒最多 5 次投注请求,超出直接返回 429。代码不复杂,在place_bet前面加一层装饰器就行。

第三个是结算逻辑的幂等性加固。虽然开奖做了幂等,但结算函数如果被重复调用,会重复派奖。建议在settle_orders里先检查期号状态,如果已经是 2 就直接返回,并且给订单表加唯一索引(period_no, user_id, numbers),从数据库层面挡住重复结算。

第四个是日志和监控。源码里日志只输出到控制台,生产环境根本不够用。我会把日志按天切分写到文件,关键操作(开奖、结算、大额投注)单独打一条结构化日志,方便后面用 ELK 或类似方案做分析。

最后一个建议是前端资源本地化。源码里引了一些 CDN 的 JS 库,内网部署时会加载失败。把依赖下载到static/vendor/目录,模板里改成相对路径引用,部署就完全不依赖外网了。

从那以后我每次拿到类似项目,都强制先跑一遍完整开奖结算流程,确认状态流转没问题再动代码。希望帮到你。

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

相关新闻

DeepSeek关键技术拆解:MoE、MLA、FP8与百万Token工程实践

DeepSeek关键技术拆解:MoE、MLA、FP8与百万Token工程实践

1. 都知道它强&#xff0c;但强在哪儿&#xff0c;属于典型的外行看热闹&#xff0c;内行看门道做模型训练和推理这么久&#xff0c;我拿到一份技术报告&#xff0c;第一反应通常是&#xff1a;这模型效果又刷榜了。但 DeepSeek 这次给人的感觉完全不同&#xff0c;光从标题就能…

2026/10/19 17:37:42 阅读更多 →
SwarmUI 深度解析:基于 .NET 的 AI 图像生成调度与部署实践

SwarmUI 深度解析:基于 .NET 的 AI 图像生成调度与部署实践

1. 为什么我会关注 SwarmUI 这个 .NET 技术栈的 AI 图像生成界面第一次看到 SwarmUI 这个项目时&#xff0c;我的注意力其实不在"AI 图像生成"上&#xff0c;而是在".NET 开发"这四个字上。原因很简单&#xff1a;过去两年我接触过的 AI 图像生成前端&…

2026/10/19 17:37:42 阅读更多 →
Open-Code-Review实战:用CLI与LLM Agent自动化代码审查

Open-Code-Review实战:用CLI与LLM Agent自动化代码审查

1. 为什么我要自己搭一套 open-code-review 流程团队里代码合并前的 review 环节&#xff0c;长期靠人肉盯。项目一多、提交一频繁&#xff0c;review 就变成走过场&#xff1a;要么拖到第二天才看&#xff0c;要么只扫一眼 diff 就点通过。我试过用现成的托管平台自带检查&…

2026/10/20 20:05:39 阅读更多 →

最新新闻

AI模型推理基础与推理引擎优化:从训练到部署的性能实践指南

AI模型推理基础与推理引擎优化:从训练到部署的性能实践指南

1. 为什么模型训练好了还不能直接用&#xff1a;训练与推理的错位先说一个我几乎每次带新人都会遇见的场景&#xff1a;模型在训练环境里跑得好好的&#xff0c;准确率指标也达标了&#xff0c;结果把训练框架里那一套文件原封不动搬到生产服务器上&#xff0c;一测推理延迟&am…

2026/10/20 20:44:31 阅读更多 →
ESP8266无线图传上位机:稳定接收+AT指令控制+Flash参数固化

ESP8266无线图传上位机:稳定接收+AT指令控制+Flash参数固化

简介&#xff1a;本资源是面向嵌入式开发与物联网初学者的无线图像传输上位机软件工程包&#xff0c;聚焦ESP8266 WiFi透传与STM32OV7670图传系统配套的PC端接收与显示功能。项目以C#实现TCP协议图像数据解析、帧同步处理与实时渲染&#xff0c;解决无线图传中常见的丢包、乱序…

2026/10/20 20:44:31 阅读更多 →
键盘相邻性:从asdxzxz看人肉随机数的安全陷阱与检测方法

键盘相邻性:从asdxzxz看人肉随机数的安全陷阱与检测方法

我最近调一个内部联调环境&#xff0c;需要给本地网关配一个临时访问密钥。不想翻密钥管理系统&#xff0c;也不想用一个太正经的值——毕竟只是沙箱联调&#xff0c;丢了就丢了对吧。于是我随手在键盘上敲了一串字符当占位符&#xff1a;asdxzxz敲完自己还觉得挺满意&#xff…

2026/10/20 20:44:31 阅读更多 →
多源气动数据重构:增强MFNN原理与实现

多源气动数据重构:增强MFNN原理与实现

做气动设计的朋友应该都有过类似的经历&#xff1a;高保真CFD算一个工况&#xff0c;网格稍微细一点、收敛残差卡得严格一点&#xff0c;一跑就是几个小时甚至半天&#xff1b;风洞试验更是排队、花钱、还受模型加工精度影响。可当你需要用这些数据去训练代理模型做翼型优化、做…

2026/10/20 20:44:31 阅读更多 →
C#图像相似度Demo设计:pHash与边缘结构双路验证

C#图像相似度Demo设计:pHash与边缘结构双路验证

简介&#xff1a;本资源是一个基于C#实现的图像相似度比较轻量级Demo&#xff0c;面向图像处理初学者、计算机视觉入门开发者及.NET平台实践者&#xff0c;解决日常开发中快速评估两图视觉相似性的实际需求。项目采用灰度直方图交叉核对法计算相似度&#xff0c;原理清晰、代码…

2026/10/20 20:44:31 阅读更多 →
YOLO26目标检测训练到RK3588部署:ONNX与RKNN适配实践

YOLO26目标检测训练到RK3588部署:ONNX与RKNN适配实践

YOLO26 目标检测的训练到瑞芯微平台适配&#xff0c;这条链路我最近刚完整跑通一遍。先说结论&#xff1a;真正卡人的地方不在训练本身&#xff0c;而在从 PyTorch 模型走向 RKNN 运行时的那几步——ONNX 导出、算子兼容、INT8 量化&#xff0c;每一个都埋着不少雷。我是在给一…

2026/10/20 20:43:28 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/20 9:50:45 阅读更多 →