ThinkPHP新闻发布系统开发实战:从路由到后台管理全流程
简介ThinkPHP新闻发布系统是一份面向PHP初学者和Web开发入门者的完整前后台项目源码覆盖前台文章展示、后台分类与文章管理并集成百度UEditor富文本编辑器旨在通过一个真实项目帮助理解MVC分层、ActiveRecord数据库操作、路由美化、模板引擎渲染等核心开发流程。压缩包共1117个文件、约6.43MB其中414个PHP文件对应控制器、模型与配置逻辑503个GIF、37个PNG、13个JPG等构成界面演示素材31个JS和21个CSS负责前端交互与样式23个HTML为模板页面另有3个SQL用于初始化数据库整体目录结构清晰便于按模块对照学习。已有4729人学习下载口碑验证了其易学易用的特点。通过研读这份源码可掌握新闻系统的数据表设计、文章增删改查、分页搜索、UEditor图片上传等关键功能并学会安全过滤与简单缓存优化等进阶处理对入门ThinkPHP开发极具参考价值。1. ThinkPHP新闻发布系统新手第一个能跑通的全栈项目很多刚学PHP的朋友卡在同一个地方跟着教程敲了一堆语法真到自己动手做一个带后台的网站时却不知道从哪下手。新闻发布系统是典型的入门全栈项目——前台展示文章列表和详情后台做登录、增删改查数据存在MySQL里。用ThinkPHP来做这个系统最大的好处是框架已经把路由、数据库操作、模板渲染这些重复劳动封装好了你只需要按约定写控制器、模型和视图剩下的交给框架。适合的人群是学过PHP基础语法、想通过一个完整项目理解MVC流程的开发者以及需要快速交付一个小型内容管理网站的接单者。这个项目不需要你懂高深的设计模式跟着目录结构走一个周末能跑通前后台跑通之后你对ThinkPHP的请求生命周期、ORM和Session机制会有直观的理解。2. 路由与控制器先把 URL 到页面的映射理顺2.1 URL 访问模式ThinkPHP 默认的路由规则ThinkPHP 默认支持pathinfo模式访问也就是http://你的域名/index.php/控制器/方法这种形式。比如访问首页新闻列表URL 就是/index.php/news/index对应app\controller\News控制器的index方法。对于新闻发布系统这种 URL 不需要太花哨的项目我强烈建议开始阶段不要开强制路由就用默认规则减少心智负担。如果用的是 ThinkPHP 6 及以上版本入口文件在public/index.php服务器需要把 DocumentRoot 指向public目录。本地用php think run启动开发服务器时访问地址是http://127.0.0.1:8000后面直接跟news/index就行不需要写index.php。这一步很多新手会卡住明明代码对着教程敲的为什么访问 404多半是伪静态没配置或者入口文件路径不对。2.2 创建控制器与方法的完整代码下面这段代码是新闻模块控制器的骨架覆盖了列表、详情两个前台方法?php declare(strict_types1); namespace app\controller; use think\facade\View; use app\model\News; class News { // 新闻列表页读取分页数据并渲染模板 public function index() { $list News::where(status, 1) -order(create_time, desc) -paginate(10); View::assign(list, $list); return View::fetch(news/index); } // 新闻详情页根据 URL 传入的 id 查询单条数据 public function detail(int $id) { $info News::find($id); if (!$info || $info-status ! 1) { abort(404, 文章不存在); } View::assign(info, $info); return View::fetch(news/detail); } }这段代码里有两个关键点。News::where(status, 1)用的是模型静态方法ThinkPHP 的模型查询构造器会自动拼接SELECT * FROM news WHERE status 1不需要手写 SQL。paginate(10)是分页方法每页显示 10 条它会自动读取当前页码参数。abort(404, 文章不存在)用于处理访问已删除文章的场景直接抛出异常并返回 404 页面。参数说明detail(int $id)这里的int类型声明很重要。ThinkPHP 会自动把 URL 里的参数值绑定到方法参数上如果你传了非数字的 id框架会直接抛出类型错误避免把非法参数带进 SQL 查询。这是 ThinkPHP 6 推荐的写法能有效过滤一部分恶意请求。2.3 模板渲染路径的坑View::fetch(news/index)对应的模板文件是app/view/news/index.html。新手最常见的错误是模板路径写错导致页面空白或直接报模板不存在的异常。ThinkPHP 的模板目录从view目录开始算起控制器名对应一个子目录方法名对应文件名。如果你把控制器命名为News模板就应该放在view/news/下面。我见过某开发者把模板写成了view/News/index.htmlLinux 下区分大小写直接找不到。Windows 本地开发可能没事一旦部署到线上就翻车。所以从第一天起就统一用小写目录名控制器用大驼峰命名模板目录全部小写。2.4 伪静态配置让 URL 更清爽但别急着做去掉 URL 里的index.php属于伪静态的活Nginx 配置如下location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s$1 last; } }Apache 则需要在public目录放一个.htaccess文件IfModule mod_rewrite.c Options FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] /IfModule建议在后台权限、上传功能都打通之后再配伪静态。前期保持index.php在 URL 里没有任何问题因为路由规则不变伪静态只是让 URL 好看一点。先解决功能再优化 URL这是做这个项目最稳的顺序。3. 数据库设计与模型news 表这样建才不返工3.1 字段设计新闻系统最少需要哪些字段设计表的时候脑子里要同时想两个问题前台展示需要什么数据后台管理需要什么数据。太少了后面加字段麻烦太多了新手维护不动。我一般给出下面这组最小字段字段名类型说明默认值idint unsigned主键自增无titlevarchar(200)新闻标题无contenttext正文内容无category_idint unsigned分类ID0cover_imagevarchar(255)封面图路径空字符串authorvarchar(50)作者名空字符串statustinyint1显示 0隐藏1create_timeint发布时间0update_timeint更新时间0CREATE TABLE news ( id int unsigned NOT NULL AUTO_INCREMENT, title varchar(200) NOT NULL DEFAULT , content text, category_id int unsigned NOT NULL DEFAULT 0, cover_image varchar(255) NOT NULL DEFAULT , author varchar(50) NOT NULL DEFAULT , status tinyint NOT NULL DEFAULT 1, create_time int NOT NULL DEFAULT 0, update_time int NOT NULL DEFAULT 0, PRIMARY KEY (id), KEY idx_category_status (category_id, status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;字段类型说明create_time和update_time用int存储时间戳配合 ThinkPHP 的自动时间戳功能写入比datetime更省空间排序也快。content用text因为新闻正文可能几千字varchar不够用。status是软删除之外的另一种控制手段——不删数据只改状态列表页只查status1的记录这样误操作还能从后台改回来。索引设计上category_id和status建了联合索引。这个系统里最常见的查询条件是「某个分类下的显示文章」联合索引能直接命中。如果你以后要加搜索功能再单独加FULLTEXT索引现在不需要。3.2 模型定义开启自动时间戳与软删除模型类是业务逻辑的核心地带。新闻模型代码如下?php declare(strict_types1); namespace app\model; use think\Model; class News extends Model { // 指定表名默认会找 news 表 protected $table news; // 开启自动时间戳配合 int 类型的 create_time 字段 protected $autoWriteTimestamp int; // 开启软删除delete 方法变成 update 操作 protected $deleteTime delete_time; // 定义与分类模型的关联 public function category() { return $this-belongsTo(Category::class, category_id); } }autoWriteTimestamp int这一行解决了时间戳自动写入的问题新增和更新时你不必手动维护create_time和update_time。如果你没有给deleteTime字段对应的列千万不要声明软删除否则查询会报字段不存在。有个常见的误解认为模型里定义了关联就必须每次查询都带着关联数据。实际上 ThinkPHP 只有在调用with方法时才会预载入关联或者访问$news-category时才触发查询。所以不影响列表页性能这个可以放心。3.3 数据验证后台新增编辑的必填把关后台接收表单数据时如果没有验证直接写库是很危险的。ThinkPHP 提供了验证器机制但新手往往觉得配置麻烦我提供一个简化版写法直接在控制器里用验证器组件?php declare(strict_types1); namespace app\controller; use think\facade\Validate; class AdminNews extends BaseAdmin { public function save() { $data request()-post(); $validate Validate::rule([ title require|max:200, content require, category_id integer|egt:1, ])-message([ title.require 标题不能为空, title.max 标题不能超过200字, content.require 正文不能为空, category_id.egt 请选择分类, ]); if (!$validate-check($data)) { return json([code 0, msg $validate-getError()]); } // 通过验证后才执行写入 $news News::create($data); return json([code 1, msg 发布成功, id $news-id]); } }这里的关键参数require表示必填max:200限制长度egt:1要求分类ID大于等于1。验证失败时getError()拿到的是第一条错误信息配合 JS 弹出提示或者页面内联提示都很方便。注意创建成功后News::create返回的是模型实例可以直接读取自增 id。Validate::rule是门面写法不需要额外创建验证器类适合字段不多的小项目。如果表单字段超过10个我建议还是拆成独立的验证器类文件便于复用。但新闻系统这种规模门面写法完全够用别过度设计。4. 前台页面与分页用户看到的页面怎么组装4.1 分页组件的输出与样式定制ThinkPHP 的分页在控制器里用paginate(10)之后模板层面怎么展示是关键。后端代码不变模板里这样渲染!-- app/view/news/index.html -- ul {foreach $list as $item} li a href/news/detail/id/{$item.id} h3{$item.title}/h3 /a p{$item.create_time|dateY-m-d,###}/p /li {/foreach} /ul div classpagination {$list|raw} /div{$list|raw}输出的是分页对象渲染出来的完整 HTML包含上一页、下一页和页码链接。ThinkPHP 6 里分页 HTML 默认带think样式类如果你用了 Bootstrap 5可以在模型查询后调用paginate(10)-each改数据但分页 HTML 的 class 则需要通过配置调整。一般常见做法是重写分页类或者直接给pagination外层加 CSS 覆盖。初期没必要折腾直接用默认样式等整个系统跑通了再美化。分页参数方面paginate(10, [simple true])可以切到简洁模式只保留上一页/下一页适合移动端页面。4.2 详情页上一篇/下一篇与阅读量自增详情页除了展示正文通常还需要上一篇下一篇导航和点击量统计。下面是我常用的实现public function detail(int $id) { $info News::find($id); if (!$info || $info-status ! 1) { abort(404, 文章不存在); } // 点击量自增避免并发场景下的读取-修改-写入覆盖 $info-setInc(views, 1); // 上一篇小于当前id且状态正常的文章 $prev News::where(id, , $id) -where(status, 1) -order(id, desc) -find(); // 下一篇大于当前id且状态正常的文章 $next News::where(id, , $id) -where(status, 1) -order(id, asc) -find(); View::assign([ info $info, prev $prev, next $next, ]); return View::fetch(news/detail); }setInc(views, 1)是 ThinkPHP 提供的原子自增方法它直接执行UPDATE news SET views views 1 WHERE id ?避免多个用户同时访问时互相覆盖。上一篇和下一篇的查询利用了主键索引性能没问题。这里有个边界情况如果当前文章是最后一篇$next可能为null模板里要空值判断。有的新手直接写{$next.title}空值会报错。正确的模板写法是{if $next} a href/news/detail/id/{$next.id}下一篇{$next.title}/a {else} span没有更多文章了/span {/if}4.3 分类筛选URL 参数与查询条件的结合分类筛选需要 URL 里带上分类ID。前台列表页的控制器方法需要接收参数public function index() { $categoryId request()-param(category_id, 0); $query News::where(status, 1); if ($categoryId 0) { $query-where(category_id, $categoryId); } $list $query-order(create_time, desc)-paginate(10); // 分页链接要附带分类参数否则翻页会丢失筛选条件 View::assign(list, $list-appends([category_id $categoryId])); return View::fetch(news/index); }$list-appends([category_id $categoryId])这行非常关键忘了它点击第 2 页时分类参数就丢了页面会显示全部分类的内容。这是新闻系统分页最常被忽略的细节。request()-param(category_id, 0)可以同时接收 GET 和 POST 参数第二个参数是默认值用户没传时自动用 0。分类表不复杂字段就是id、name、sort_order三个。前台只查开启状态的分类后台管理时可以自由增删改。新闻表的category_id建议建普通索引配合status的联合索引已经在 3.1 节设计了。5. 后台管理与权限登录状态、文件上传的常见坑排查5.1 后台登录与 Session 鉴权的最小实现后台和前台必须分开控制器目录通常做法是建app\controller\admin命名空间下的控制器。后台所有页面都需要判断登录状态没有登录就跳转到登录页。我一般不引入 RBAC 权限表新闻系统这种规模用 Session 判断即可?php declare(strict_types1); namespace app\controller\admin; use think\facade\Session; class BaseAdmin { public function __construct() { if (!Session::has(admin_user)) { // 统一跳转到登录页 return redirect(/admin/login/index)-send(); } } }所有后台控制器继承BaseAdmin构造函数里统一做鉴权。这里有个非常隐蔽的坑redirect(...)-send()在构造函数里使用必须加上-send()才能真正输出跳转响应否则构造函数返回后控制器方法会继续执行可能出现「没登录也能操作数据」的漏洞。登录控制器里要做两件事校验用户名密码、写入 Session。密码存储不落库是明文这里给出建议的 hash 校验public function login() { $username request()-post(username); $password request()-post(password); // 从管理员表查询用户 $admin AdminUser::where(username, $username)-find(); // password_hash 是 PHP 内置函数校验用 password_verify if (!$admin || !password_verify($password, $admin-password)) { return json([code 0, msg 用户名或密码错误]); } Session::set(admin_user, $admin-id); return json([code 1, msg 登录成功]); }password_verify是 PHP 7 起内置的密码校验函数配合password_hash生成密码。不需要自己写加盐逻辑算法和盐都由 PHP 内部管理。如果你接手的老项目用的是md5存的密码建议在新版本里逐步迁移但不要期望一步到位。5.2 图片上传文件存储路径与前端回显后台编辑新闻时要上传封面图这是新闻系统的标准功能。ThinkPHP 6 里用think\facade\Filesystem操作上传public function upload() { $file request()-file(image); if (!$file) { return json([code 0, msg 未接收到文件]); } // 校验文件类型和大小避免用户传脚本文件 $validate Validate::rule([ image fileExt:jpg,png,gif,webp|fileSize:2097152, ]); if (!$validate-check([image $file])) { return json([code 0, msg $validate-getError()]); } // 移动到 public/storage 下的 uploads 目录 $path \think\facade\Filesystem::disk(public)-putFile(news, $file); return json([code 1, url /storage/ . $path]); }fileExt:jpg,png,gif,webp限制了扩展名fileSize:2097152表示最大 2MB。这两个参数必须设置否则用户上传一个.php文件如果存储目录可执行整个站点就可能被拿下。Filesystem::disk(public)对应config/filesystem.php里的public配置项它的根目录在public/storage最终返回的 URL 才能直接从浏览器访问。前端表单里用$.post或FormData提交到/admin/news/upload成功回传的url填到隐藏的cover_image输入框同时更新预览图的src。5.3 后台功能最常见的 5 个坑坑1Session 失效后台每操作一次就跳登录现象登录成功后进入后台首页正常但点任何一个操作马上被弹回登录页。给前端小白的排查路径是先检查浏览器控制台 Cookie —— 如果请求带上了PHPSESSID且服务器返回正常那就是 Session 目录不可写。Linux 下/var/lib/php/session目录权限不对PHP 无法写入 Session 文件。解决检查session.save_path配置指向的目录确认chmod -R 777或改所属用户为 web 服务用户。坑2文件上传成功但页面访问 404现象后台提示上传成功前端回显封面图时图片加载不出来。原因一般是Filesystem::disk(public)没有把文件写到public目录下而是写到了运行目录。解决检查config/filesystem.php确认public磁盘的root配置是app()-getPublicPath() . storage而不是项目根目录。看 URL 里的路径和实际文件路径是否对得上。坑3后台修改文章后列表页没变化现象编辑完标题前台看到的还是旧标题。通常不是代码问题而是模板缓存或浏览器缓存。ThinkPHP 的模板引擎默认开启缓存在调试模式下自动过期。解决先在config/trace.php打开调试模式再检查runtime目录可写。临时处理可以手动删除runtime/temp下的编译文件根治是部署时保持调试模式关闭修改模板后自己php think clear清缓存。坑4分页链接点击后变成 404现象列表页第 1 页正常点第 2 页 URL 变成/news/index?page2如果开了强制路由又没定义对应规则就会 404。解决检查config/route.php里是否开启了url_route_must因为news/index这种默认路由不会被强制路由模式识别。要么关掉强制路由要么在route/app.php里显式注册Route::get(news/index, news/index)。坑5背景色或图片在/admin下全部丢失现象登录后台后页面完全没有样式。原因是模板里的静态资源用了相对路径或者__STATIC__常量没有定义。解决后台模板统一用__STATIC__替换__PUBLIC__然后在模板顶部手动定义{assign namestatic_root value/static/admin/ /} link relstylesheet href{$static_root}css/style.css保证 URL 以/开头禁止用./或../相对路径。6. 后台列表页的搜索与批量操作提升管理效率的3个实用技巧6.1 关键词搜索用 whereLike 组合查询后台新闻列表往往需要按标题搜索有对应代码需求。控制器里这样拼接条件public function index() { $keyword request()-param(keyword, ); $query News::with([category]); if ($keyword ! ) { // like 查询注意手动拼接百分号避免注入 $query-where(title, like, % . $keyword . %); } $list $query-order(id, desc) -paginate(15) -appends([keyword $keyword]); View::assign([ list $list, keyword $keyword, ]); return View::fetch(admin/news/index); }搜索参数同样要追加到分页appends里和分类筛选逻辑一致。ThinkPHP 的where第三参数传like表达式框架会做参数绑定不会直接拼 SQL。这里有个容易忘的动作模板里的搜索框 value 要输出{$keyword}这样翻页后关键词还在输入框里用户体验不至于断裂。6.2 批量删除用 id 数组与事务保证一致性后台勾选多条记录删除是常规操作。实现时需要注意whereIn和事务配合public function batchDelete() { $ids request()-post(ids, []); if (!$ids || !is_array($ids)) { return json([code 0, msg 参数错误]); } // 开启事务失败回滚 Db::startTrans(); try { News::destroy($ids); Db::commit(); return json([code 1, msg 删除成功]); } catch (\Throwable $e) { Db::rollback(); return json([code 0, msg 删除失败 . $e-getMessage()]); } }News::destroy($ids)支持传入 ID 数组如果开启了软删除它执行的实际上是把delete_time设为当前时间戳的更新操作。事务的意义在于如果删除过程中某一步出错比如关联数据删除失败所有操作都回滚不会出现库里残留半删状态。对新闻系统来说单表删除可能觉得事务多余但新闻分类和新闻表同时删的时候就能看到价值。6.3 我的排查习惯先看日志再猜原因调试 ThinkPHP 项目时我最常挂在嘴边的教训是别猜去runtime/log下看当天日志。后台操作报错大部分情况日志里已经写清楚了文件名、错误行号和堆栈信息。配置开启调试模式也很简单.env文件里写APP_DEBUG true即可。另一个实战技巧是用dump()函数打断点。控制器里某一步数据不对直接在嫌疑行前后dump($变量)ThinkPHP 会把变量渲染成带样式的调试输出比var_dump友好得多而且页面会直接停住方便一层层看数据。看到null就回溯查查询条件看到数组就确认结构后再继续。搜索引擎里翻到的解决方案十有八九是版本差异导致。看日志时先确认 ThinkPHP 版本再对应查文档。这算是踩坑换来的习惯一直用到现在。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Servlet核心机制与生命周期详解:从HTTP请求到Java方法的完整链路

Servlet核心机制与生命周期详解:从HTTP请求到Java方法的完整链路

Servlet这东西,说起来有点“老”,但如果你想搞明白Java Web到底是怎么跑起来的,它还真躲不开。我带团队和面试新人的时候发现一个现象:不少人上来就学Spring Boot,写接口已经非常熟练,但你把问题往回问一层…

2026/10/13 22:59:15 阅读更多 →
Java NIO Channel深度解析:从BIO痛点、Buffer机制到非阻塞实战

Java NIO Channel深度解析:从BIO痛点、Buffer机制到非阻塞实战

1. 从BIO的痛点到Channel的设计动机很多同学学NIO的时候,一上来就啃Selector、ByteBuffer、Channel这三大件,结果学完一圈还是不知道Channel到底解决了什么问题。我刚开始接触NIO那会儿也是这样,API背得滚瓜烂熟,真到写网络服务的…

2026/10/13 22:59:15 阅读更多 →
ACM竞赛中STL sort的cmp函数设计原理与避坑指南

ACM竞赛中STL sort的cmp函数设计原理与避坑指南

1. 为什么排序不是“写个for循环就完事”的事?刚接触ACM竞赛的新人,十有八九都经历过这个阶段:看到一道题说“把数组从小到大排好”,立刻撸起袖子写个冒泡——三重嵌套,i、j、k变量齐飞,跑样例能过&#xf…

2026/10/13 22:58:14 阅读更多 →

最新新闻

微信小程序奶茶店毕设从0到1全流程指南

微信小程序奶茶店毕设从0到1全流程指南

十个计算机毕设选题里,大概有五个是“基于微信的奶茶店小程序”。这个题目乍一看很重复,但它能常年被列入选题清单是有原因的:业务模型清晰,用户能一眼看懂价值;涉及点单、支付、购物车、后台管理、数据统计这些经典模…

2026/10/13 23:59:41 阅读更多 →
微生物群落结构差异分析:从统计显著到生物学可解释

微生物群落结构差异分析:从统计显著到生物学可解释

1. 这不是“画个热图就完事”的统计游戏很多人第一次接触“微生物群落结构差异分析”&#xff0c;脑子里浮现的是一张带颜色的热图、几个堆叠柱状图&#xff0c;外加一句“两组间存在显著差异&#xff08;p<0.05&#xff09;”。我见过太多项目——某高校实验室的土壤样本测…

2026/10/13 23:59:41 阅读更多 →
智慧用能研究院Java一面:高频考点与模拟面试实战拆解

智慧用能研究院Java一面:高频考点与模拟面试实战拆解

一个模拟出来的“研究院一面”&#xff0c;为什么值得认真拆&#xff1f;很多同学一听说“模拟面试”就觉得是走过场——找个学长学姐或者培训机构老师&#xff0c;照着简历问一圈&#xff0c;然后给个“不错”“基础还行”的评价&#xff0c;就结束了。但我可以负责任地讲&…

2026/10/13 23:59:41 阅读更多 →
AnyPS5:基于语义桥接的PS5游戏跨平台运行技术解析

AnyPS5:基于语义桥接的PS5游戏跨平台运行技术解析

1. 项目概述&#xff1a;一个被误读的命名现象&#xff0c;背后是跨平台兼容性设计的现实困境“AnyPS5”这个词最近在多个技术社区和硬件讨论区频繁出现&#xff0c;但几乎没人能说清它到底指什么。它既不是索尼官方发布的型号&#xff0c;也不是某款已上市设备的代号&#xff…

2026/10/13 23:59:41 阅读更多 →
Manjaro GNOME配置包冲突:manjaro-gnome-settings与-18.0互斥解析

Manjaro GNOME配置包冲突:manjaro-gnome-settings与-18.0互斥解析

1. 问题本质&#xff1a;这不是系统坏了&#xff0c;是包管理器在“认真履职”刚看到这个报错——manjaro-gnome-settings 与 manjaro-gnome-settings-18.0 有冲突——很多刚从Ubuntu或Windows转来的用户第一反应是“系统崩了”“是不是升级把GNOME搞挂了”。其实恰恰相反&…

2026/10/13 23:59:41 阅读更多 →
MyBatis插件机制深度剖析:从动态代理到SQL改写与加解密实战

MyBatis插件机制深度剖析:从动态代理到SQL改写与加解密实战

1. 插件机制的本质&#xff1a;不是魔法&#xff0c;是接口的排列组合我最早接触Mybatis插件的时候&#xff0c;把文档翻来覆去看了好几遍&#xff0c;脑子里一直是糊的。原因很简单&#xff1a;网上大部分教程上来就丢一个拦截器的代码&#xff0c;然后告诉你“这样就能自动分…

2026/10/13 23:58:40 阅读更多 →

日新闻

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →