找回密碼
 立即註冊
搜尋
熱門搜尋: 活動 交友 discuz
點閱: 608|回覆: 0

[閒聊] AI 改版新架構記錄

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14391 / 14391

生命值:5%

升級   100%

  • TA的每日心情
    奮斗
    7 小時前
  • 簽到天數: 5788 天

    [LV.Master]伴壇終老

    發表於 2024-11-17 20:43:13 | 顯示全部樓層 |閱讀模式

    馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。

    您需要 登入 才可以下載或檢視,沒有帳號?立即註冊

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    3 ]) s( b4 E: R9 p# i  L5 [$ M* eAI 就是站長的最佳幫手。
    ' c" q2 q. u7 @$ A9 S+ p: H2 S% k5 t: _' z- U0 T+ E

    & V% M& C$ S3 ]+ e) q/ d" q這裡的「新架構」是指後端的架構會有大變化( D- L. q" ]7 _: T! J
    但前端的 UI 介面玩家不會感受出來有何不同; p$ l9 r& u! [  Q5 ]

    ) B( j2 a+ h8 w6 d; H3 i, S5 b/ X  o) f3 e5 I9 g
    為什麼站長要改成新的獨家架構?
    & k. _) }) Y4 P0 T就一樣由AI模型來解釋清楚吧。
    ; A0 h7 _* s- ~( n" a, A! u
    6 B; `" W! W/ ^. o
    ' [0 l# Q! i8 j# q4 ]" l4 I% {讓我分析一下使用純 PHP 和使用框架的優缺點:
    , m5 u& `1 V: q; X% ^% t+ f純 PHP 的優點:/ J/ u) s$ K1 A; H2 L. }
    1.        性能較好 - 沒有框架的額外開銷) Y- Q3 F6 L/ V
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    5 T2 n& n0 z; B) t3.        更靈活 - 可以完全按照自己的需求來設計架構
    / @4 G: i. i0 U, l0 P/ e4.        代碼量小 - 不包含不需要的功能模組& c5 V% U. W+ T  t* c0 e) E- R
    5.        適合小型項目$ {2 K0 a' j" Z0 [  [
    純 PHP 的缺點:8 e) o+ r+ \4 w$ x% F
    1.        需要自己處理很多底層細節
    7 O& Z/ c% W2 r2.        代碼複用性差+ p- Q8 ^, y( F7 F) r
    3.        缺乏統一的開發規範- Q2 L0 b% G2 g* `* m
    4.        安全性需要自行考慮和實現
    % i. B% r/ Q* e' Z  _. }5.        開發效率相對較低
    " l' |2 `, M- d- @8 l( H1 q6.        維護成本高3 S6 K8 {0 u9 O) l0 K" T; Q# v
    使用框架的優點:0 @% D4 p9 u3 }- n& Z: r% b, J7 N
    1.        開發效率高 - 有現成的元件和工具$ s3 g) u" g8 C2 X" K( T: M
    2.        有完善的安全機制
    ) L  ]5 K2 Y3 U" I/ Z8 R4 c4 Z3.        統一的編碼規範
    . Z' Z8 l  }# @7 d! S4.        易於維護
    6 A; l+ c/ n. M: q# Y5.        有活躍的社區支持
    % Y' c2 Q4 N5 t, d# ?6.        適合團隊協作
    ( ^1 z( z1 J6 e2 d  K. u7.        自帶很多常用功能(ORM、緩存等)
    6 `0 K% M# X% v# b$ V& r使用框架的缺點:
    : r0 G" P8 B7 s' W. i1.        性能有一定損耗
    / q! {& ~( U/ w2 E; j2.        學習成本較高  i5 `1 c4 j5 ~1 |3 o8 q
    3.        可能包含很多用不到的功能2 h0 S5 r' r: i5 \) \: U/ w! |( n. e
    4.        不夠靈活,需要遵循框架的規範
    ( M0 ~/ X& u; M: f3 P5.        對小項目可能顯得過重
    + G5 |: U( l: N5 }: W建議:: V9 e8 P' S7 c- [2 H* q5 X  Z
    1.        小型項目或學習階段可以使用純 PHP
    + {! b5 d3 P; Q2 L9 w" v4 a- T2.        中大型專案建議使用框架7 i( G4 r0 w1 m3 n0 w( f; W8 n# U
    3.        選擇框架要根據專案需求和團隊情況
    % U; a. j' P+ y- V4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇1 v4 V% C# Y; ~  F
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    6 f+ W$ U' {  h
    : S7 y* u% y% R" d8 V' r/ ^
    $ v; n$ V: y% C9 G$ P: H& ?- ?' p6 T* h! L4 R5 O9 w; o0 X% |% G) }
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。, b: q0 ]; y9 e+ f) N- o7 O% L- U
    2 p' h: |  S6 Y0 Q& F0 t7 Q
    這個轉換主要做了以下改動:
    $ ~+ h2 C# F, v0 N4 I0 }1 }
    5 K& n4 `. A* [9 g! z3 M路由結構:
    / }* @. i: A6 z! }; E& L0 N8 f1 O2 q7 F4 _' V5 R+ J
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    6 q- D6 c; u! p& i: o/ i; D& o支援原有的 page/mode 參數結構1 z: @, O# u( i% M- Y, G0 d
    通過路由規則自動匹配到對應的控制器方法
    , @2 Y% b( \1 q, f# f0 B0 l& e  }6 z* \% b/ o+ f' C! u5 W2 ]* m

    / j# A- c& X9 ]/ _5 N( d控制器結構:( j) Z; k- A& B; z6 P  T
    4 k7 X  R7 m2 _+ }
    創建了主要的 LoginController 處理所有請求8 k3 r" b% Z' m1 l% |( d' U, C
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範6 I, c& K! G- E& H
    錯誤處理改用CI4的視圖系統
    . U  f8 p4 R/ P0 Y( ?6 h
    5 U$ R" Q1 f' `  |
    & f6 l4 N/ O3 X* Y5 E類的組織:
    , K. y2 p, S# N2 y8 Y, l
    $ Z! ^" D! }! f8 s# o' t所有登錄相關的類都放在 App\Controllers\Login 命名空間下2 ]4 V8 Y* j/ K; R
    保持了原有的類繼承結構$ f' @8 \$ W9 M4 I6 ^) F
    改用CI4的控制器基類和特性) ?& u5 ~9 u4 n3 g  `1 a
    ' ^6 Y- J+ m+ j

    9 D1 Y1 A& F( [8 J/ T7 l  h" w改進的安全性:0 p) W8 }: [, f( A% C+ N) @5 C
    2 ^( `) A: X) K7 ~
    使用CI4內置的安全特性9 H1 b  Y: N& P* }- l1 U% b) J
    更嚴格的輸入過濾
      _! M9 c! B9 i8 x/ O更好的錯誤處理機制
    + |# c, a. r) v+ W( f% F9 r, \- N9 e0 B

    % q6 s0 J. \+ N' k/ l2 k2 t
    7 |; _, s) Y$ {( {, v要使用這個新結構,你需要:
    * S, C& t$ y5 Y
    $ i( w7 a; r# G4 q% W3 Q1 }+ d  I將這些檔放在對應的CI4目錄結構中& I' @1 }5 Z3 d9 k$ r7 R0 t
    確保創建相應的視圖文件, Z" A( \) c) b* V- }. l
    配置語言服務
    ' K, B7 V+ v0 \) R根據需要調整模組檢查邏輯; z) B# z* J  U) `3 P8 r: A

    6 D- \8 @$ q8 N) u9 V/ `/ P: V1 q. W需要注意的是,你可能還需要:+ L9 {7 ^; x' s) j

    . W5 m4 t2 R3 K3 c! d( x8 h創建相應的視圖檔(在 app/Views/ 目錄下)
    4 `# o2 ]; P( S" t* a0 |6 i3 {配置適當的中介軟體來處理會話9 t+ j0 M% R) r( y9 P& A- J0 d
    實現具體的登錄邏輯
    , S& N5 S. g5 z9 e& v. W5 f0 V, b8 Z# ^; u) _/ R, T2 T
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    " A- [9 S* f( h+ {9 I0 k0 y1 l% ]: Q  k& Y+ F% C. B
    1. <?php  J7 E$ |& `# J5 V+ |, y5 k2 x
    2. // app/Config/Routes.php
      ( o( R. s% `* B1 A
    3. namespace Config;3 [3 N/ [2 H' F
    4. * ?, r& A9 c: a6 _+ }& F6 O2 U  M
    5. $routes = Services::routes();
      : x5 [+ G$ q$ e+ ?

    6. % w( k- w) \6 D  n% h' g
    7. // 添加自訂路由規則/ E  p) a$ X- g  S' I
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      3 G' E7 g/ W0 w2 ]8 H- c( v9 t
    9.     $routes->get('/', 'LoginController::index');
      * o' k+ Q9 {: V: N0 j
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');. A7 h9 H) ?" I! A' s1 J
    11.     // 默認路由處理
      + f  `! V8 l( {( h6 M2 \9 Z  A
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');% }: E6 Y* W( W0 {( q: i- w- G+ W+ q
    13. });5 m- ~; b& j4 O5 U9 Q
    14. 0 o0 `: x! q, i9 l# d
    15. // app/Controllers/Login/LoginController.php
      ; f; H- Z) ?5 m: t3 g1 t, K( z6 x
    16. namespace App\Controllers\Login;0 t( x- k1 x" E. U; Z

    17. ( x. ~8 n2 v7 ^" \, b7 B
    18. use CodeIgniter\Controller;
      % ^  Z4 _. I- a2 X% t" m
    19. use App\Controllers\Login\AbstractLoginPage;
      2 |! V. d" ~! ?1 G6 ~* h1 |/ c

    20. ! r8 Y2 W$ T- A! w) I6 ^8 p
    21. class LoginController extends Controller
      ' y7 X& L9 s5 O/ n) T- ?
    22. {% k' y! q9 t2 l9 N4 a; Q8 {
    23.     protected $pageObj;
        h7 F. D% V4 ^( @+ ~; P3 A1 T8 k
    24.     protected $LNG; // 語言物件
      , _- |9 I+ M/ q% m8 m! d

    25. - l. V9 L& n' E% f) s7 [  r
    26.     public function __construct()
      ) Y( m7 k- i& r* f, g7 t
    27.     {/ l$ l2 R3 s! k9 @/ {! C7 l7 i) @
    28.         // 載入語言檔和其他必要的依賴
        R. V' N- |  A& v% L  p4 g* N
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      4 N* ]% E+ ]" m- `2 Q
    30.     }, M  h) b! {1 D: S

    31. 9 a( s4 u0 m/ V" @5 a
    32.     public function index()4 ~' x  j6 k! p9 z8 T% S
    33.     {4 T8 {# _, y3 Y; m; Y
    34.         return $this->handle('index', 'show');
      % A- l7 T1 m: ]) d4 }% Z
    35.     }
      6 p1 t4 Q4 A. I, H. i% m
    36. 9 t# @2 O7 ~1 {- E$ N
    37.     public function handle($page = 'index', $mode = 'show')
      3 j  R, L; S" T
    38.     {3 K0 v) q" X9 Q0 t7 `, w
    39.         // 安全過濾頁面名稱
      0 ]$ F! w" R% U4 ~6 l0 P
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);3 x: I1 j# S4 P& y3 N4 |( E
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';3 P+ A9 X4 p3 ^
    42.         
      - G+ i5 o% d6 x8 q- |: }7 D+ r
    43.         // 檢查類檔是否存在4 e# a: ?+ }# T- l+ h! J
    44.         if (!class_exists($pageClass)) {5 B+ `) Q7 n& G: S' y- A( Y
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      6 [. C% C! F4 @* c
    46.         }
      * C' c4 [) H9 `! b

    47. ( p, e$ G, m6 ?; u
    48.         // 產生實體頁面類
      * [2 {) i! G7 b1 @
    49.         $this->pageObj = new $pageClass();+ l6 ~, T" K# g$ ]( \! j5 W
    50.         
      3 K3 n( o! D7 z5 Q2 \
    51.         // 檢查模組要求+ ^/ t5 y6 j3 L; x5 m# a! m
    52.         $pageProps = get_class_vars($pageClass);) ?5 d  H3 l2 f% T6 O$ z
    53.         if (isset($pageProps['requireModule']) &&
        {8 ~8 @: e( p; @
    54.             $pageProps['requireModule'] !== 0 && ( N7 c7 }; A9 _6 C
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {% Y% D7 B. Q" V5 N: Q# n# J
    56.             return $this->showError($this->LNG['sys_module_inactive']);4 F  h# W/ C3 R  q6 {
    57.         }
      / T& K; t  h& C6 N# [3 K$ R& K

    58. ' I/ b7 A4 |( u( W  e! h6 V
    59.         // 檢查方法是否可調用
      0 d! u! [/ w1 S3 M* g0 P
    60.         if (!is_callable([$this->pageObj, $mode])) {
      % f0 `* `  Y% j" |! o0 O, O
    61.             if (!isset($pageProps['defaultController']) || 0 Z" n' U( E9 k. {/ {
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {8 O7 U7 z5 ^; a9 G) Y
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      2 ?' m6 Y- f( _' @, S, j8 Y
    64.             }
      3 }: z. h5 N6 B! a/ V* J$ ?7 o) R
    65.             $mode = $pageProps['defaultController'];
      0 p3 D& M% \( K0 c% G
    66.         }
      % Z. m( A3 X' x0 @% k
    67.   d) w+ |, `( I. v1 }% P
    68.         // 調用相應的方法; U2 \' @5 T# j6 x
    69.         return $this->pageObj->$mode();
      0 Z; o+ |5 a3 s0 D* n% B% Q% J
    70.     }& n1 r4 d- f3 L' a# m, j7 q2 A; Q

    71. ( x! q7 b" ~+ \/ M3 Z
    72.     protected function showError($message)& D* Z0 q) g: S
    73.     {. T; |- T2 n, u
    74.         return view('errors/custom_error', ['message' => $message]);! c8 M5 ^* x0 y3 A8 m9 h& v) j
    75.     }! D% ~& X# T/ K- X% r
    76. * C5 M. }: H$ m
    77.     protected function isModuleAvailable($moduleId)
      9 d, X# `3 ]! s: O
    78.     {
      / g& Z4 _1 }9 n4 S& d
    79.         // 實現模組可用性檢查邏輯
      % W" E* t: ?9 C1 r
    80.         return true; // 根據實際需求修改" X0 t( U. l) c5 E, l
    81.     }, o; S. D2 r9 C0 z6 [3 U
    82. }; L7 Q' X+ l8 _/ z0 d  X  W1 |9 B

    83. ! l: L1 J  [& @5 H- O$ A& q8 U
    84. // app/Controllers/Login/AbstractLoginPage.php* f/ D, S4 ?. r! G
    85. namespace App\Controllers\Login;& B) F8 @% F3 v% d

    86. 7 j- r% V1 Z/ P- E
    87. use CodeIgniter\Controller;+ r; F' P1 J; }" K

    88. : J; d8 K2 v  Z7 n
    89. abstract class AbstractLoginPage extends Controller
      7 _' t$ y5 z: V$ n+ p
    90. {0 a4 K2 O4 |+ E
    91.     // 實現基礎登錄頁面功能
      6 f8 X4 g3 q5 m! W
    92. }. x0 ^: }  T& u9 f3 i# l
    93.   k) z1 A9 d( J) U5 c
    94. // app/Controllers/Login/ShowErrorPage.php- E+ e; h$ M7 f' m/ \
    95. namespace App\Controllers\Login;
      9 R% ~5 `" Y$ @

    96. 6 x& Z/ X  L: y6 s7 P! j4 Z
    97. class ShowErrorPage extends AbstractLoginPage
      9 R3 s6 `/ h2 `$ J% X8 ^
    98. {4 a" o6 b) t  }$ |3 z
    99.     public static function printError($message)2 `+ X' T# n  o, Y
    100.     {) b" `$ ?: n" D' o  h
    101.         $controller = new LoginController();
      5 C" ~3 Q3 V; [) e! P' [
    102.         return $controller->showError($message);
      4 p9 ~6 H& j3 d- V& W9 I
    103.     }) F  b4 w7 k# q; O, ~; }
    104. }
      $ N2 n' S# E5 Z0 k' B
    105. ! I5 a9 W7 g, u" W+ V
    106. // app/Controllers/Login/ShowIndexPage.php1 r4 C5 l( o( j1 o0 h$ L
    107. namespace App\Controllers\Login;# D7 |; L: k/ W) I
    108. & V6 B; \# J- d7 T6 {! W2 e; j5 H
    109. class ShowIndexPage extends AbstractLoginPage! D: d4 c0 T# v6 Y4 ]$ G4 F
    110. {
      + b' y5 J1 m+ J. Z2 c1 g
    111.     public function show()
      / r2 H' Z+ z7 y3 f+ X
    112.     {
      - }! ?! }/ l, j" ~
    113.         // 實現登錄頁面顯示邏輯, g. Y; q- a. [4 p# ?
    114.         return view('login/index');+ r; Q3 n3 o1 @4 d( _
    115.     }
      ) n- r. A7 ?) ^  ]
    116. }
      5 B8 C. t% n9 i9 h0 u9 N, c
    複製程式碼

    文章的最近訪客

    您需要登入後才可以回覆文章 登入 | 立即註冊

    本版積分規則

    QQ|Archiver|手機版|禁閉室|MyXNova (原 myxnova.com)

    GMT+8, 2025-12-5 08:06 , Processed in 0.016508 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

    快速回覆 返回頂端 返回列表