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