源碼部署實(shí)戰(zhàn):Laravel三端網(wǎng)校上線與避坑指南)
簡介一套覆蓋PC網(wǎng)校、H5與微信小程序/APP的完整知識付費(fèi)系統(tǒng)源碼包基于PHP開發(fā)適合需要私有化部署在線培訓(xùn)平臺的機(jī)構(gòu)或個人開發(fā)者。資源共657個文件壓縮包僅1.09MB主體為613個PHP業(yè)務(wù)文件另含環(huán)境配置示例、Git忽略規(guī)則、前端靜態(tài)資源及說明文檔結(jié)構(gòu)清晰便于快速定位與二次開發(fā)。功能上覆蓋錄播、直播、圖文、考試練習(xí)等教務(wù)場景同時內(nèi)置課程秒殺、團(tuán)購、分銷裂變等營銷組件后臺支持課程管理、數(shù)據(jù)明細(xì)與店鋪裝修。系統(tǒng)要求Linux環(huán)境如CentOS/Ubuntu最低2核CPU、4GB內(nèi)存、3M帶寬適合已有服務(wù)器運(yùn)維基礎(chǔ)的開發(fā)者部署使用。資源已有1320人學(xué)習(xí)下載可直接搭建商用學(xué)習(xí)平臺也可作為二次開發(fā)的基礎(chǔ)框架大幅降低在線教育系統(tǒng)從零開發(fā)成本。1. 知識付費(fèi)v4.5.4源碼一套代碼把PC網(wǎng)校、H5、小程序全部接住做在線培訓(xùn)最怕的不是沒有課程而是課程出來了學(xué)員還得先下載App才能看。拿到這套知識付費(fèi)v4.5.4源碼的時候我第一反應(yīng)是看它是不是真的把PC、H5、小程序三端都包進(jìn)去了而不是只做個后臺管理界面裝樣子。這套源碼的亮點(diǎn)在于一個后臺統(tǒng)一管內(nèi)容前端三端各走各的展示層部署到自己的服務(wù)器上就是私有化網(wǎng)校不需要按年續(xù)費(fèi)租別人的平臺。它適合哪幾類人做職業(yè)技能培訓(xùn)的機(jī)構(gòu)、有錄播/直播課程的獨(dú)立老師、還有想用分銷和秒殺來做冷啟動的內(nèi)容團(tuán)隊(duì)。2. 源碼結(jié)構(gòu)拆解從artisan命令到三端資源的對應(yīng)關(guān)系2.1 從.env.example文件反推技術(shù)棧與運(yùn)行前提拿到源碼壓縮包后打開根目錄掃一眼就能看出端倪。目錄里帶artisan、.env.example、.gitattributes這類文件的PHP項(xiàng)目基本都是Laravel框架搭建的這套知識付費(fèi)系統(tǒng)也是如此。.env.example是環(huán)境配置模板把它復(fù)制成.env再填自己的數(shù)據(jù)庫、Redis信息這是Laravel項(xiàng)目的標(biāo)準(zhǔn)初始化動作。# 先看根目錄有沒有 artisan、composer.json、.env.example ls -la /data/www/knowledge_pay_v4 # 如果 .env 不存在先從模板復(fù)制一份 cp .env.example .env # 查看 PHP 版本要求 php -v composer --version邏輯說明artisan是Laravel的命令行入口后面所有數(shù)據(jù)遷移、隊(duì)列、定時任務(wù)都靠它執(zhí)行.env.example不是用來直接運(yùn)行的它只是告訴你這套源碼需要哪些環(huán)境變量。我一般會先執(zhí)行php -v和composer --version確認(rèn)基礎(chǔ)環(huán)境再打開composer.json看require段對PHP版本的要求。參數(shù)說明這套系統(tǒng)基于PHP的Laravel框架配套前端資源是構(gòu)建好的靜態(tài)文件運(yùn)行前提是PHP 7.4以上、MySQL 5.7以上、Redis用于緩存和隊(duì)列存儲用本地目錄或云存儲都行。2.2 PC端、H5端、小程序端在代碼里的組織方式這類多端源碼通常不是按語言分目錄而是按“入口”分目錄。PC端網(wǎng)校一般走Laravel的Blade模板或獨(dú)立的Vue項(xiàng)目H5端是另一套移動端適配頁面微信小程序則單獨(dú)維護(hù)一套小程序工程文件。三端共用后臺的課程數(shù)據(jù)和訂單數(shù)據(jù)API層負(fù)責(zé)輸出統(tǒng)一格式的數(shù)據(jù)。端典型目錄/文件數(shù)據(jù)來源PC網(wǎng)校/resources/views下或獨(dú)立前端工程后臺API/數(shù)據(jù)庫直讀H5端獨(dú)立H5工程目錄編譯后部署到nginx通過API讀取課程、下單微信小程序小程序工程目錄含app.js、pages/通過API讀取需配合法域名后臺管理/admin或根路由管理后臺直接操作數(shù)據(jù)庫邏輯說明三端不是三套系統(tǒng)是同一個后臺把課程、訂單、學(xué)員數(shù)據(jù)統(tǒng)一管理PC端和H5端渲染層不同小程序端因?yàn)槠脚_限制走的是HTTPS請求合法域名的API。參數(shù)說明部署時PC端需要解析一個主域名指向nginxH5可以部署在同一個站點(diǎn)下的/h5路徑小程序端的request域名必須是HTTPS且在對應(yīng)平臺后臺完成白名單配置。2.3 初始化配置數(shù)據(jù)庫連接、站點(diǎn)地址、緩存驅(qū)動把.env打開后重點(diǎn)改這幾項(xiàng)數(shù)據(jù)庫名、數(shù)據(jù)庫賬號密碼、APP_URL站點(diǎn)地址。APP_URL這項(xiàng)決定了你生成分享鏈接、支付回調(diào)時用哪個域名如果填錯了秒殺分享出去學(xué)員打不開是小事支付回調(diào)對不上才是大坑。# 進(jìn)入項(xiàng)目目錄安裝依賴再初始化 cd /data/www/knowledge_pay_v4 composer install --no-dev # 生成應(yīng)用密鑰并執(zhí)行數(shù)據(jù)遷移 php artisan key:generate php artisan migrate --seed邏輯說明composer install按composer.json拉取Laravel依賴包--no-dev是生產(chǎn)環(huán)境不裝調(diào)試工具鏈key:generate會寫入.env的APP_KEY這是Laravel加密會話和密碼的基礎(chǔ)migrate建表--seed寫入初始的配置數(shù)據(jù)和演示數(shù)據(jù)。參數(shù)說明如果migrate執(zhí)行報(bào)錯九成是.env里的DB_HOST、DB_PORT、DB_DATABASE沒配對或者M(jìn)ySQL賬號權(quán)限不足。3. 服務(wù)器部署與LNMP環(huán)境配置2核4G跑三端的實(shí)操心法3.1 服務(wù)器選型與系統(tǒng)初始化摘要里寫得很清楚2核CPU、4GB內(nèi)存、3M帶寬起步系統(tǒng)用CentOS或Ubuntu這類Linux發(fā)行版不推薦Windows。這不是偏見PHPLaravel的部署生態(tài)就是圍繞Linux Nginx PHP-FPM MySQL這套組合設(shè)計(jì)的Windows上IIS配PHP偽靜態(tài)規(guī)則會多出一堆兼容性麻煩沒必要拿生產(chǎn)環(huán)境練手。# CentOS 7 / Ubuntu 20.04 通用更新系統(tǒng)并裝基礎(chǔ)工具 sudo apt update sudo apt upgrade -y # Ubuntu # 或 yum update -y # CentOS # 安裝 Nginx、PHP 7.4/8.0 與擴(kuò)展、MySQL/MariaDB、Redis sudo apt install -y nginx php php-fpm php-mysql php-redis php-gd php-zip redis-server mysql-server邏輯說明PHP的php-mysql負(fù)責(zé)連數(shù)據(jù)庫php-redis配合會話和緩存php-gd處理圖片縮略php-zip是后臺打包課程資料用的。參數(shù)說明帶寬只有3M時不要把視頻原文件丟在服務(wù)器上用云存儲加CDN是標(biāo)準(zhǔn)做法3M帶寬只夠網(wǎng)頁和API請求扛不住視頻并發(fā)。3.2 配置nginx站點(diǎn)與偽靜態(tài)規(guī)則Laravel的入口文件在public/目錄nginx必須把站點(diǎn)根目錄指向public否則訪問時會把框架源碼暴露出來這是一條硬規(guī)則。偽靜態(tài)配置主要為了讓所有請求都經(jīng)過index.php去路由。server { listen 80; server_name your-domain.com; root /data/www/knowledge_pay_v4/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } }邏輯說明try_files檢查請求的文件是否存在不存在就交給index.php處理這樣Laravel的路由才能接管URL.php請求轉(zhuǎn)發(fā)給PHP-FPM處理。參數(shù)說明fastcgi_pass的socket路徑要和本機(jī)PHP版本一致php7.4-fpm.sock對應(yīng)PHP 7.4Ubuntu默認(rèn)路徑是/run/php/下按版本區(qū)分。3.3 目錄權(quán)限與PHP-FPM調(diào)優(yōu)部署后訪問出現(xiàn)空白頁或505錯誤大部分情況是storage/和bootstrap/cache/沒有寫權(quán)限。Laravel要把日志、緩存、session寫進(jìn)這些目錄屬主不對就是白屏。sudo chown -R www-data:www-data /data/www/knowledge_pay_v4 sudo chmod -R 755 /data/www/knowledge_pay_v4/storage sudo chmod -R 755 /data/www/knowledge_pay_v4/bootstrap/cache邏輯說明www-data是Debian系nginx和php-fpm的運(yùn)行用戶權(quán)限統(tǒng)一收斂到這個用戶避免Nginx能讀而PHP-FPM寫不進(jìn)去這種兩極分化。參數(shù)說明生產(chǎn)環(huán)境不用777755就夠目錄屬主換成www-data后重啟PHP-FPM生效。PHP-FPM參數(shù)修改區(qū)在/etc/php/7.4/fpm/pool.d/www.conf核心調(diào)三個數(shù)值pm.max_children、pm.start_servers、pm.max_spare_servers。2核4G的機(jī)器我一般設(shè)置max_children20start_servers5max_spare_servers10內(nèi)存不夠時優(yōu)先降并發(fā)數(shù)而不是加進(jìn)程。4. 教務(wù)與營銷功能配置錄播直播考試與分銷裂變的啟用細(xì)節(jié)4.1 錄播、直播、圖文三種內(nèi)容模型怎么掛課程后臺創(chuàng)建課程時主要內(nèi)容類型三種錄播、直播、圖文。錄播課程適合錄好的視頻關(guān)聯(lián)到的視頻資源可以放到云存儲后臺填視頻URL直播課程分預(yù)約直播和立即直播后臺拿到直播推流地址后配合前端播放器使用三端共用同一個課程ID和直播地址圖文內(nèi)容適合資料類教學(xué)直接在后臺上傳富文本或PDF。這三類內(nèi)容對應(yīng)不同的訂單處理邏輯錄播和圖文購買后立即解鎖直播需要訂閱開播提醒直播結(jié)束后生成回放回放權(quán)限需要另外配。常見做法是課程里掛“資料包”選項(xiàng)把課件下載地址作為附加商品分銷傭金不計(jì)算在附加商品里只算課程主體價格避免傭金比例被附件拉偏。4.2 考試練習(xí)模塊與學(xué)員端的聯(lián)動考試練習(xí)不是獨(dú)立的功能它掛在課程內(nèi)部作為“學(xué)習(xí)任務(wù)”存在。后臺添加考試后可以設(shè)置及格分?jǐn)?shù)、答題次數(shù)、是否計(jì)入結(jié)業(yè)條件。學(xué)員端三端的表現(xiàn)是PC端用答題卡模式H5和小程序用單題滑動模式提交答案后系統(tǒng)自動判分主觀題需要后臺人工批改。// 分銷關(guān)系綁定邏輯示意判斷用戶是否已有上級 if ($user-parent_id 0 $inviter $inviter ! $user-id) { $user-parent_id $inviter-id; $user-save(); // 記錄綁定來源掃碼、分享鏈接、海報(bào) UserRelation::create([ user_id $user-id, parent_id $inviter-id, source $sourceType, // 1小程序 2H5 3PC ]); }邏輯說明這段代碼解決的是“學(xué)員從誰的分享鏈接點(diǎn)進(jìn)來傭金算在誰頭上”的問題。$user-parent_id為空表示還沒綁定上級僅在首次訪問時綁定之后不覆蓋。source字段記錄綁定來源方便后臺看哪個端帶來的分銷轉(zhuǎn)化最多。參數(shù)說明$inviter從分享鏈接的uid參數(shù)取如果不同入口的分享參數(shù)名不一樣要在前端統(tǒng)一改成同一個。4.3 秒殺、團(tuán)購與分銷的組合營銷邊界秒殺是限時降價團(tuán)購是人數(shù)不夠不發(fā)貨分銷是無限級推廣返傭。三者本質(zhì)都建立在同一個訂單模型上所以配置順序有講究先建課程再設(shè)置價格策略最后綁定分銷比例。秒殺配置時注意開始時間和結(jié)束時間時間一到訂單恢復(fù)原價但如果學(xué)員在秒殺期間加購物車、結(jié)束才付款系統(tǒng)按支付時價格結(jié)算。團(tuán)購是按人數(shù)分檔例如3人團(tuán)9折、10人團(tuán)7折若開團(tuán)人數(shù)不足到期自動退款。分銷比例有兩種結(jié)算方式訂單支付成功后按實(shí)際支付金額結(jié)算或者扣除退款后再結(jié)算。我一般建議用后者不然全額退款的單子會把分銷傭金算錯。后臺配置項(xiàng)一般包含分銷層級一級/二級/三級、傭金比例可設(shè)固定百分比或金額、提現(xiàn)方式余額/微信轉(zhuǎn)賬/支付寶。上線前先用測試賬號走一遍A分享鏈接給BB購買后A的傭金在“分銷明細(xì)”里能看到金額無誤再開放給真實(shí)學(xué)員。5. 部署避坑與常見問題排查三端上線前必看的五條記錄5.1 小程序端不顯示課程封面圖現(xiàn)象小程序首頁能顯示課程標(biāo)題但封面圖全部空白PC端和H5端正常。原因微信小程序?qū)D片域名有白名單限制后臺配置的圖片地址是HTTP或者域名沒有加到小程序后臺的downloadFile合法域名里。解決到小程序管理后臺上傳圖片和下載圖片的合法域名確認(rèn)后臺的圖片URL用的是HTTPS域名不是IP地址。配置完域名后需要重新編譯小程序模板消息和客服消息也依賴這個域名配置。5.2 支付回調(diào)不通后臺訂單一直是待付款現(xiàn)象前端能拉起支付學(xué)員明明付了錢后臺訂單狀態(tài)不更新分銷傭金也不生成。原因支付回調(diào)地址配置成了localhost或127.0.0.1或者公網(wǎng)IP被防火墻擋了。支付平臺回調(diào)是服務(wù)端到服務(wù)端的請求不經(jīng)過前端頁面填localhost等于讓支付平臺請求你自己的本機(jī)。解決支付設(shè)置里的異步回調(diào)地址改成外網(wǎng)可訪問的https://你的域名/api/notify然后在服務(wù)器防火墻放行對應(yīng)端口。改完后用測試訂單實(shí)際付一筆確認(rèn)回調(diào)日志里有返回記錄。5.3 分銷傭金不結(jié)算下級學(xué)員買了課上級傭金為0現(xiàn)象學(xué)員A分享鏈接給BB下單支付后系統(tǒng)沒有生成A的傭金記錄。原因A在分享之前自己還沒有注冊成為分銷員或者B不是通過A的分享鏈接進(jìn)入的而是直接用公眾號菜單進(jìn)入系統(tǒng)沒有捕獲上下級關(guān)系。解決先在后臺把A設(shè)置為分銷員再讓B走一遍分享鏈接注冊下單。如果B已經(jīng)通過其他入口注冊過就不會再綁定A這是正常邏輯不是BUG。做活動引流前先確認(rèn)分享鏈接的uid參數(shù)沒有被跳轉(zhuǎn)過程丟掉。5.4 直播播放失敗前端一直轉(zhuǎn)圈黑屏現(xiàn)象直播開播后PC端能看小程序端黑屏或者只有聲音沒有畫面。原因直播播放器選的協(xié)議和當(dāng)前推流格式不兼容。常見組合是推流用RTMP播放用HLS小程序端對RTMP支持不好需要HTTP-FLV或HLS。解決后臺直播配置里把播放地址改成平臺支持的格式H5端和PC端用HLS兜底小程序端走FLV如果用的是云直播服務(wù)直接在后臺生成對應(yīng)的三種播放地址填入。別把不同協(xié)議的地址混填混填的結(jié)果就是某一端永遠(yuǎn)拉流失敗。5.5 后臺圖片上傳報(bào)500錯誤或顯示“目錄不可寫”現(xiàn)象后臺商品主圖、課程封面上傳失敗直接彈出500。原因public目錄下的upload目錄不存在或者權(quán)限不足也可能是PHP上傳文件大小的upload_max_filesize設(shè)置太小。解決項(xiàng)目根目錄執(zhí)行mkdir -p public/upload再把屬主改成www-data同時把php.ini里的upload_max_filesize和post_max_size調(diào)到20M以上。改完重啟PHP-FPM生效。別只調(diào)一個參數(shù)上傳涉及客戶端和服務(wù)端兩側(cè)的配置缺一個就會出現(xiàn)“前臺秒傳、后臺報(bào)錯”的怪象。6. 進(jìn)階技巧用artisan定時任務(wù)把秒殺上下架、分銷傭金結(jié)算自動化三端上線后最煩人的不是開發(fā)新功能而是機(jī)械操作秒殺商品到點(diǎn)要上架、到點(diǎn)要下架分銷傭金要按日結(jié)算過期沒支付的訂單要標(biāo)記取消。這些都可以交給Laravel的定時任務(wù)。先看項(xiàng)目里有沒有app/Console/Kernel.php在schedule方法里注冊任務(wù)然后讓服務(wù)器每分鐘觸發(fā)一次artisan schedule:run。沒有這個文件的就把命令寫在腳本里跑效果一樣。# 編輯 crontab crontab -e # 加入這一行每分鐘執(zhí)行一次 Laravel 調(diào)度器 * * * * * cd /data/www/knowledge_pay_v4 php artisan schedule:run /data/logs/knowledge_cron.log 21邏輯說明Laravel的調(diào)度器不是自己睡覺到點(diǎn)醒來它依賴系統(tǒng)crontab每分鐘調(diào)用一次schedule:run然后在內(nèi)部分發(fā)到需要執(zhí)行的任務(wù)。即使某個任務(wù)配置成每天特定時間執(zhí)行也是由這個每分鐘觸發(fā)的入口來判斷“現(xiàn)在到?jīng)]到點(diǎn)”。參數(shù)說明/data/logs/knowledge_cron.log要確保目錄存在且可寫否則定時任務(wù)執(zhí)行失敗時你連日志都找不到。哪些任務(wù)適合注冊進(jìn)調(diào)度器秒殺商品自動上下架、分銷傭金按日結(jié)算、直播結(jié)束自動生成回放、學(xué)員過期課程權(quán)限回收。以傭金結(jié)算為例后臺填好分銷比例后結(jié)算任務(wù)里指定“昨日已收貨訂單”參與結(jié)算未收貨的不結(jié)算這樣能避免退款導(dǎo)致的傭金追回麻煩。// Kernel.php 里的調(diào)度任務(wù)示例 $schedule-command(distribution:settle) -dailyAt(02:00) -onOneServer(); $schedule-command(seckill:update-status) -everyMinute() -withoutOverlapping();邏輯說明dailyAt(02:00)指定凌晨兩點(diǎn)執(zhí)行傭金結(jié)算避開訂單高峰期onOneServer保證多服務(wù)器部署時只跑一次everyMinute用于秒殺狀態(tài)更新withoutOverlapping防止任務(wù)還沒跑完又被拉起。參數(shù)說明seckill:update-status需要后臺實(shí)現(xiàn)對應(yīng)的命令類如果源碼里沒有這個命令可以在Console目錄里自己寫一個邏輯就是查當(dāng)前時間落在秒殺時間段的課程把上下架字段更新掉。從那以后我每次部署完一套新的知識付費(fèi)源碼第一件事就是先配定時任務(wù)再配支付回調(diào)最后才做頁面裝飾。前兩件事決定系統(tǒng)能不能自己動起來第三件事只是好不好看。把三端啟動、數(shù)據(jù)庫遷移、分銷關(guān)系綁定、定時任務(wù)、支付回調(diào)這五步在測試環(huán)境強(qiáng)制走一遍再上生產(chǎn)是我個人的固定流程這五步的順序不能亂亂了后面必有一環(huán)翻車。希望這套拆解對你的部署上線能派上用場。本文還有配套的精品資源點(diǎn)擊獲取