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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:13647 / 13647

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    6 ~) E, v+ Q: r' _/ C+ eAI 就是站長的最佳幫手。
    & |" ~0 L6 x# N) N7 s
    ( R# N- ?  j: \$ U
    / Q, D# q& {" B! [# B這裡的「新架構」是指後端的架構會有大變化
    6 k. @; ?' g  ]/ G8 S& o! v& G但前端的 UI 介面玩家不會感受出來有何不同
    - Y8 ]3 F1 P# I& D, `. N2 ]3 O: B/ J1 z# A6 _& B; v' |

    ' J- P7 A% B% P* t" I6 \! t$ t為什麼站長要改成新的獨家架構?
    ; r2 r, J& p" `: G* Y就一樣由AI模型來解釋清楚吧。
    ) r' o) b" b9 ~! D* ?: `* \5 `+ }$ j- r( U' E: A  b2 ?; e1 i! {! c
    ; a# Z5 W$ _% M  s. U
    讓我分析一下使用純 PHP 和使用框架的優缺點:( `* K5 p5 S2 {% `$ y  b9 J
    純 PHP 的優點:
    # x6 X: ^/ G2 H& ]1 U( Z1.        性能較好 - 沒有框架的額外開銷6 d* H' S% Q4 q7 K" B" H) U  Z. p! z
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識; V% p2 a* u9 ^2 |- p* S9 m
    3.        更靈活 - 可以完全按照自己的需求來設計架構6 N2 U8 y$ e2 Z: R7 Q  o
    4.        代碼量小 - 不包含不需要的功能模組
    0 M; _3 L. g* ?# p5.        適合小型項目
    1 f) L) ^- m3 g+ X純 PHP 的缺點:
    , g7 k( M2 A8 ^2 j* f  T1.        需要自己處理很多底層細節. W+ G/ `/ c5 P6 i) [
    2.        代碼複用性差
    0 \" b' D, ]/ e& t7 }3.        缺乏統一的開發規範5 p$ L; C, p9 M( I+ X
    4.        安全性需要自行考慮和實現4 V; a8 r8 i4 ?2 \  W3 R& s# [; _& h
    5.        開發效率相對較低
    1 L) i6 k/ b# T/ K" g* o6.        維護成本高* l! t8 Q/ _9 d% M+ i; n3 m
    使用框架的優點:
    . R/ A* u5 D. e9 Y  I5 |" M3 t. \- f1.        開發效率高 - 有現成的元件和工具1 p; J' E3 K; `" O, v' r" B4 i
    2.        有完善的安全機制3 G7 q5 }$ m# C
    3.        統一的編碼規範' t! l9 Z8 z3 D9 B
    4.        易於維護
    9 K# z! v0 l) J+ g8 k7 H; o5.        有活躍的社區支持
    0 |" ]* e. }) S) v- L* T8 s0 q6.        適合團隊協作) |% I- d/ O* P9 H
    7.        自帶很多常用功能(ORM、緩存等)8 z  J8 G" t& v  y7 I
    使用框架的缺點:
    1 F) P2 l8 G: M1 g$ ]3 x1.        性能有一定損耗; m( x7 Y5 ?1 ?/ t7 {
    2.        學習成本較高
    - b( H- f3 N2 ~3.        可能包含很多用不到的功能" j$ d5 E# k5 w8 |3 N
    4.        不夠靈活,需要遵循框架的規範
    ( v  k: Z7 g; q7 O5.        對小項目可能顯得過重
    % D) G7 U" s% A. R1 U  c& r建議:( \. g1 o* `2 {/ e1 x) h
    1.        小型項目或學習階段可以使用純 PHP
    - O3 h1 I! t$ h. }) T2.        中大型專案建議使用框架
    $ h2 i* P0 E4 Q! P/ ]3.        選擇框架要根據專案需求和團隊情況
    ; I) Y) D/ o- G+ G, ^8 F' R8 z4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇0 u, i- r; C' V; g0 T
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。( ^: S# `7 N5 t" X
    , S% w. Y  S4 _) L% t8 f

    0 U5 K! Y7 P3 I7 }8 u2 i8 d3 F' G% ^8 u' E! z5 {
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    3 ?6 d  m0 D* K- t. R# V( z; _3 v# k% c' |* e5 v5 `" z
    這個轉換主要做了以下改動:$ x9 H- n8 j4 x: `& U9 c( c/ I
    5 h5 J9 F7 f8 L% v  c
    路由結構:4 S7 D* A/ v2 I8 N& ^

    & J' J" ]9 ~- u7 s6 @+ V. d. E使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下5 \+ N# _' O$ [6 ]2 x6 @
    支援原有的 page/mode 參數結構! y: z& f; ]' V2 X
    通過路由規則自動匹配到對應的控制器方法: B* l! k; k8 M& Z
    9 M; S/ i1 F2 t
    & @2 f: X! v8 k0 n
    控制器結構:
    2 D( L2 ]! |) a/ ?  a
    & ^# m% H$ I& M' c創建了主要的 LoginController 處理所有請求
    1 d1 ]; c8 V6 w% Y$ F& D& o0 L保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    $ y3 x' P" M0 Q% V7 W8 E- Y錯誤處理改用CI4的視圖系統( t8 r1 p& Y  q1 y  B: g6 {

    " |4 |% L$ y& L. H2 Z1 E
    6 r. F3 a( g/ X) m類的組織:
    / Q9 p+ C& n2 V! b( E; K. C* B4 H) Z# f! x# H
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下& k! ^6 S. h% R0 g: ^4 f
    保持了原有的類繼承結構# J7 O1 V* [! i- v
    改用CI4的控制器基類和特性) z. d* }% ?  a, q7 t7 [2 F7 p6 M

    ' Y* U0 g  V& p# z) Q3 i. N6 o7 {  N4 b" L
    改進的安全性:
    1 P8 m1 b! @% F" Q, M& [% m9 i4 Z8 }: O* ?! d' W  T
    使用CI4內置的安全特性- J3 d% T* `/ s3 S  z7 L
    更嚴格的輸入過濾
    ( t1 N- V% P0 A7 d! U更好的錯誤處理機制; V, P% Q' A9 G: M

      F3 H4 z; X# W8 B; y7 ~+ ~% o/ w
    ' Y' t/ h' c% {, ?* R2 i5 `2 ~8 q! e
    / d  `: |; w6 ]+ ^) X, t要使用這個新結構,你需要:
    7 j: a- V9 j% i+ V/ l( z% r  a+ r4 u0 h$ L( }
    將這些檔放在對應的CI4目錄結構中
    " E+ L6 e4 _, Z確保創建相應的視圖文件
    & {- B, \& k6 I( B! S7 {$ ]4 s6 W配置語言服務
    : F0 A/ s# t+ g* L" ~根據需要調整模組檢查邏輯
    0 N. ^- e6 {1 V/ G4 `9 K9 n: S/ H1 \
    需要注意的是,你可能還需要:( C' L/ S1 m- V# P+ y4 G

    4 I. @* L3 K$ g% ?: y4 h創建相應的視圖檔(在 app/Views/ 目錄下)2 s; O2 v3 n5 Z6 b% u& e
    配置適當的中介軟體來處理會話" S: ^5 U4 l& [
    實現具體的登錄邏輯
    2 s  [/ T7 C9 q* V/ R% m) U$ F  @" d0 t' q: v2 o5 r1 I$ H  s4 s
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    0 J  O, O9 t4 i! S
    + W3 l/ ^  A6 z2 k, P
    1. <?php  c" Y) N7 ]1 i0 E4 u
    2. // app/Config/Routes.php, y! Y" P2 v0 D  k2 j/ `
    3. namespace Config;. X4 b2 T/ Z) h0 Z+ c9 M

    4. ( V: S0 x! h! \2 N' {
    5. $routes = Services::routes();
      0 l1 D2 V4 B, |. n: ^

    6. + {7 r- h5 G4 B0 ~; I+ c* v$ P
    7. // 添加自訂路由規則
      0 q7 ~- H( w3 i8 C  y' F- {
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {9 C. L6 p4 e3 [2 C- r: A$ {" q
    9.     $routes->get('/', 'LoginController::index');% x. y8 t* ]) i# W2 x
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      1 C6 j: {4 U* i9 O6 @
    11.     // 默認路由處理
      0 d, q# m" T0 ~
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');% P2 x( R7 B6 W1 A
    13. });3 V1 D! L% s% D, x; G

    14. 9 u  c& i  I: d1 A2 x% u% V5 }: ?
    15. // app/Controllers/Login/LoginController.php
      ! _$ F- r. ]7 C# n
    16. namespace App\Controllers\Login;
      % `* c9 B: b: x* M0 p3 q+ i

    17. & \# n8 y4 W, x5 P
    18. use CodeIgniter\Controller;, C! V* Y- {7 D/ L1 e7 Z! ?
    19. use App\Controllers\Login\AbstractLoginPage;
      ! l! ?6 ?% ^) a: W9 {
    20. 5 A; c" R# E& K& F& Y$ F7 D* {2 H
    21. class LoginController extends Controller+ i2 C/ ^* G. _* J& j6 g+ g
    22. {
      7 s" T5 J, S! Q5 w' o9 \
    23.     protected $pageObj;- I+ A+ c' y2 I& i
    24.     protected $LNG; // 語言物件1 {2 h3 Y+ S! c9 \

    25. ' o6 H/ ~" s& }
    26.     public function __construct()
      8 ?" s0 K; I  c: k) ]0 J  V  p( O" p
    27.     {3 N8 M' b1 ?6 |( W5 e
    28.         // 載入語言檔和其他必要的依賴
      8 x+ R) F" \, `: W: s. j
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務1 ]' G! M2 b! K& A# Y, i
    30.     }
      - R/ \( X2 o) j. O( x: b

    31. . ?/ V' B+ g0 f: [: X3 v) m- X
    32.     public function index()& N2 e7 K: }; Z# r$ l. [% F
    33.     {
      ! E( M3 j3 q0 n, s; V) E6 n5 N
    34.         return $this->handle('index', 'show');
      * W7 d9 O' A  a* W* Q
    35.     }
      0 ~7 D1 r4 a; |8 X1 i1 c! G  K
    36. 8 p& _& ]8 l8 P: e4 }
    37.     public function handle($page = 'index', $mode = 'show')  E. g$ r0 c- b2 X
    38.     {. ]" n/ v, X/ \- @" ?
    39.         // 安全過濾頁面名稱
      * G$ B. z2 o; g( f" P8 y) V1 q
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      / }7 Z, B  {  y. W9 U
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';3 O7 m1 @0 O" H
    42.         0 v: X) H( O+ M+ F8 I8 Y) c* W
    43.         // 檢查類檔是否存在
      ) [% a# X. M1 `" O- k# k
    44.         if (!class_exists($pageClass)) {* J8 u  Y/ q- F! d' E
    45.             return $this->showError($this->LNG['page_doesnt_exist']);3 M& \7 o3 k. {
    46.         }
      / h. O; E" S/ T$ G

    47. ) D% h9 F! t3 ~: s  ]
    48.         // 產生實體頁面類0 O+ s" E% U2 Z
    49.         $this->pageObj = new $pageClass();0 z& `" n# I: O& [/ C
    50.         . z$ y1 ?5 f4 S9 d$ K' m: @4 T4 H
    51.         // 檢查模組要求
      ! Q9 A, K' l, P5 o, X& H9 N  T2 Y
    52.         $pageProps = get_class_vars($pageClass);
      5 n8 L2 C0 T& E
    53.         if (isset($pageProps['requireModule']) &&
      0 H7 G/ ]/ U/ g. F, c
    54.             $pageProps['requireModule'] !== 0 &&
      3 r6 D; {0 J& U  K  t8 |
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      - c& m; @$ a) D7 C* j, x/ }% a$ [! F
    56.             return $this->showError($this->LNG['sys_module_inactive']);  e; o6 o+ _% [1 w; {2 Y9 h
    57.         }
      1 y' N9 y  A/ N
    58. ( s, Z! T! V2 T$ j1 }; v
    59.         // 檢查方法是否可調用) \" Q0 J* C, U: O* a+ L& B
    60.         if (!is_callable([$this->pageObj, $mode])) {
      ; M1 R: k9 U& N# s6 N
    61.             if (!isset($pageProps['defaultController']) || ; }7 k" [& h' @( k" i
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      % G  V* _5 V# V
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);* a: G; s# N9 s3 ?9 R' f2 ?
    64.             }
      7 V% ]1 K! F! a5 s1 K& \
    65.             $mode = $pageProps['defaultController'];' o. v* _- J8 e$ t% H* @
    66.         }8 y9 u: \" G# {# K
    67. - a& L5 P. K2 _- a5 i
    68.         // 調用相應的方法
      4 ?) g: ^- F0 [4 F; h
    69.         return $this->pageObj->$mode();! D2 n$ C3 G* W- {6 T: D
    70.     }
      ! G5 x$ z) m8 ^3 b/ I5 w9 W

    71. 2 n0 ?4 j: w% T7 T5 a7 K( b' c* I
    72.     protected function showError($message)6 e! r" p1 B7 `- U( R; ^# O, W
    73.     {
      3 J0 x& B/ q" d# |
    74.         return view('errors/custom_error', ['message' => $message]);; @# A0 e0 a( [" l) P( p
    75.     }: Q# Q& g8 `2 l/ [8 K

    76. / ]$ Z: _1 r3 z. I: o5 y6 _
    77.     protected function isModuleAvailable($moduleId)
      1 m) {% j5 h: N9 o( o& h; h
    78.     {
      8 ]" b2 l; x6 E- m
    79.         // 實現模組可用性檢查邏輯
        N' J% ]) ]/ a8 Y  k% A" H
    80.         return true; // 根據實際需求修改
      1 H' M& \9 K- l4 C1 ~3 D& M( x
    81.     }9 ~8 A  ?/ O8 m
    82. }, t. ?. p5 O5 {
    83. 0 P/ o0 r; b1 l9 B
    84. // app/Controllers/Login/AbstractLoginPage.php
        m: h9 z0 H" O1 K% D/ v* y
    85. namespace App\Controllers\Login;
      ! ~/ G, y9 [. w5 f5 H
    86. 2 h6 W5 P5 n6 i0 [* I
    87. use CodeIgniter\Controller;( w% h; ~. x! ]% j
    88. 2 Z) e% t9 B* ^7 f8 T2 A4 I
    89. abstract class AbstractLoginPage extends Controller$ X# h+ o: F. T0 b4 |
    90. {$ p, u+ k+ ?; o' ~! O* Y+ ?% c( `8 `
    91.     // 實現基礎登錄頁面功能( Q+ ^# j$ R& b5 o  Y, `8 ]
    92. }
      ) \) [* z% p# j# p& x- _

    93. 3 ?) a- h" e* P
    94. // app/Controllers/Login/ShowErrorPage.php
      8 k/ \) [+ u) b+ ^& y8 T
    95. namespace App\Controllers\Login;# B7 D/ R1 g+ w* Y7 b8 C; V

    96. % N) f+ c5 L1 [7 b
    97. class ShowErrorPage extends AbstractLoginPage
      ( M! Y9 a, H: s; |3 W4 S6 q
    98. {  [1 B! \' M3 p7 c% s/ I5 R& X
    99.     public static function printError($message)
      ) A* h/ ]' N3 O
    100.     {
      8 N. R( s8 G9 |* Y$ j# b
    101.         $controller = new LoginController();  o, ?, w% T# r+ u* p) ~1 b7 w
    102.         return $controller->showError($message);
      / n6 X, L- c  h
    103.     }
      4 S6 o( l/ E3 K  b
    104. }
      % U! \& o# s( H+ J
    105. 6 Z7 I0 R3 w* u( k9 X; a, x- i
    106. // app/Controllers/Login/ShowIndexPage.php
      ; I9 x- V7 N( ]( o
    107. namespace App\Controllers\Login;
      9 E1 c, l  N/ C9 i* s
    108. : r! b  R! ?- I( l  i4 ]
    109. class ShowIndexPage extends AbstractLoginPage' I! E2 `1 Y5 ]5 m6 `# U6 \
    110. {
      8 C3 t& z% R- D# r6 }3 H: Y
    111.     public function show(). r2 y& }" [* L  d
    112.     {: ~% M  l0 c$ a, Q
    113.         // 實現登錄頁面顯示邏輯
      9 L7 M$ Q" b! N% x! w/ ~* Y; g
    114.         return view('login/index');
      ; {7 T& H' \! ^% ^& J! ?) C
    115.     }, Q5 s" |- P; g* X  ?" O
    116. }
      ! o6 P5 Z- Z7 W" `5 s
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-2-24 09:55 , Processed in 0.017865 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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