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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14031 / 14031

生命值:5%

升級   100%

  • TA的每日心情
    慵懶
    20 小時前
  • 簽到天數: 5654 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    . K( _. k2 \. y( |0 ZAI 就是站長的最佳幫手。; i7 i% m: M1 w8 T! c+ ~6 J! m/ |

    " Q% ?) b2 ^- M6 C" B; A4 M
    ' k& `" }5 J0 P$ B+ |2 X( l這裡的「新架構」是指後端的架構會有大變化
    ) T  m2 D- |  O2 C* W但前端的 UI 介面玩家不會感受出來有何不同
    " e6 z. ?: L, w, a) R0 ~1 c' p' v5 D' C, D4 m; w6 p% o' a" w3 c
    ; P, S* C) H& L) M/ n* V1 _
    為什麼站長要改成新的獨家架構?
    ) v6 {; ~$ W; b! Y, H% ~就一樣由AI模型來解釋清楚吧。; @" i/ @1 P" k0 b% e
    ( d$ F) ~9 A/ H1 [' P+ N
    ; |7 _3 @3 ]5 S5 F: L1 @
    讓我分析一下使用純 PHP 和使用框架的優缺點:$ s& l0 {  m7 o+ Y# p7 l. K
    純 PHP 的優點:; X4 V3 ^" g! [, G3 ~+ [$ ]( p
    1.        性能較好 - 沒有框架的額外開銷
    & t2 f0 P: o2 \: Q9 _2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    - u5 t7 S, D0 a: K6 c0 e4 P3.        更靈活 - 可以完全按照自己的需求來設計架構) _$ n8 |8 k& m% ~8 z- V1 ~2 ~
    4.        代碼量小 - 不包含不需要的功能模組  D2 Y+ V; F5 D! F( r
    5.        適合小型項目" h: q5 K- O' o" u" D" V. ~% w
    純 PHP 的缺點:0 F% d1 m; X" e( A
    1.        需要自己處理很多底層細節1 u. F& d5 }& F6 D
    2.        代碼複用性差
    * e) F4 w. f1 o- N! b( G3.        缺乏統一的開發規範
    9 S! s8 J  Z/ K  P# n' T4.        安全性需要自行考慮和實現
    " R; d4 x. `: z5.        開發效率相對較低; Y( r3 R$ y- t- L% p) m
    6.        維護成本高/ o  o& J. F: a* Q$ j' o# V! [9 w
    使用框架的優點:* w- B8 H* R' a5 z7 ^2 P
    1.        開發效率高 - 有現成的元件和工具
    ' u0 J, a" q9 P( K; `. b1 L2.        有完善的安全機制0 v& @' X: w$ n% L
    3.        統一的編碼規範  i+ i: `' A0 a" m# }- X
    4.        易於維護2 ^- E6 `! E* r+ |, o0 u* ~
    5.        有活躍的社區支持
    ) b% @1 p* r; q( O0 h* P6.        適合團隊協作
    ' i  Q' i9 S9 S2 o5 y2 r7.        自帶很多常用功能(ORM、緩存等)
    ) b7 |9 e2 J' e+ k" U使用框架的缺點:
    & w. o6 n% x5 t! w: |. \1 F' x1.        性能有一定損耗
    4 o1 t7 e( o( _( n2.        學習成本較高
    * i3 b0 H' `9 }3.        可能包含很多用不到的功能
    7 G  J( `+ N$ i! w# W( F4.        不夠靈活,需要遵循框架的規範& R5 a$ h2 ^* n. l3 ?" t  \, [: r
    5.        對小項目可能顯得過重' H) F  D& n+ h( }* p
    建議:& L" M3 L, r8 g7 ?# x, j: d
    1.        小型項目或學習階段可以使用純 PHP
    9 @* D% k  L' j/ v2.        中大型專案建議使用框架" `) m5 G% i& t
    3.        選擇框架要根據專案需求和團隊情況
    1 {* b( r9 C, P9 _4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
      x( z' C: z# |您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    0 U; c$ ^/ f; G# |9 v" v% Y: [6 M' _

    5 {. k2 K, ~4 y: e
    4 o3 {% e9 L, v' b我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。! a! E& J8 [$ R. i' N2 [
    + X# D: K5 x6 p
    這個轉換主要做了以下改動:
    9 z7 K" A9 G  L" P# Z, J6 K8 R; `: C' X, @2 N+ m
    路由結構:
    - D! I! ]$ N7 Q9 @
    " Y$ U) [. a0 w1 N使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    & X2 I, g- N; \" `7 S5 m( c* a支援原有的 page/mode 參數結構0 ^" Y; E- R" m2 U# B
    通過路由規則自動匹配到對應的控制器方法" [. v. `6 |! G2 x

    / c+ ]. f; e, `' T0 c' I$ U$ b$ G( U- q5 x: o0 k0 S
    控制器結構:0 B1 ?2 v# P9 O5 c0 c5 u
    1 y- w& E% w. V8 ^* y6 k
    創建了主要的 LoginController 處理所有請求
    - {" u1 ^0 \3 q7 A5 S保留了原有的頁面類結構,但改為符合CI4的命名空間規範  j% a: |! O. s9 X
    錯誤處理改用CI4的視圖系統1 r( D, i3 \% s1 I# U0 Q

    1 o) ~6 d- {, A! n1 r. }% n. u  V8 ~& G2 Q  c! B: l4 }; I
    類的組織:3 b5 r3 g2 n$ P4 `  n
    3 u0 z1 ?3 ~: U+ ]# _$ n. y: Q
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下7 a- [6 V5 x# o3 V
    保持了原有的類繼承結構- p4 x) ]* |* P' a! {
    改用CI4的控制器基類和特性: I% a9 i- b1 B) b' g1 j
    : H+ B+ I* T2 |/ T$ j
    % a  e+ i( p, k6 e7 a, K5 c
    改進的安全性:8 g; ^% K- U4 r1 H( l/ \1 V& p

    4 M0 _# K% E0 V! m1 P使用CI4內置的安全特性1 K3 r9 o% I. h3 m4 z
    更嚴格的輸入過濾
    5 b3 T) j% \) E5 t( D更好的錯誤處理機制
    * S' X$ M0 c$ H# J" A+ {/ J
    % b0 Q: r/ P5 l/ O7 O% W& b7 c8 I' B3 s" K8 M9 l" j' g" M* o# T  J

    / ]" ?" R5 [8 m9 C要使用這個新結構,你需要:
    * G+ K8 Y) |, @
    ' Z( J+ c6 r, K9 ~8 l+ y7 H# \將這些檔放在對應的CI4目錄結構中' n9 j8 V2 ?* X! _: C5 W
    確保創建相應的視圖文件
    ! H7 i6 N& N2 T6 X配置語言服務+ t4 Q, I5 L/ H# a
    根據需要調整模組檢查邏輯
    ; K% J& Y! i) O4 v3 n( o( N9 o4 x% Q+ u
    需要注意的是,你可能還需要:! n1 r* \( B" U$ O0 i' }
    * |: e7 X6 W6 K) S0 Z2 V! P
    創建相應的視圖檔(在 app/Views/ 目錄下)
    - [5 ~7 s; {/ A+ E7 I. N1 `" C' @$ h配置適當的中介軟體來處理會話/ m; [9 P7 ?8 }/ D2 n
    實現具體的登錄邏輯! F. s, Y7 _. k
    # ~2 M: m( L+ X8 [# J
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?: h6 m7 R; o3 K4 K( l9 u) M

      `( P0 @, F" _" r
    1. <?php
      # k# {. y+ Z9 W. T4 K4 |* P
    2. // app/Config/Routes.php0 X2 Q9 o6 ]% f9 x* e9 G0 K' c' h# l
    3. namespace Config;
      * H# N$ ^4 x  K. P- f% q
    4. 0 L6 `* p  W3 w  M9 [, Y# |
    5. $routes = Services::routes();& {$ @+ p0 O" \% X: T4 A# `: n
    6. 2 S' U$ c8 y1 M2 B
    7. // 添加自訂路由規則
      * l# J$ p  e) F: h
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
        ^8 N* X( w: w% ^! D* n. e
    9.     $routes->get('/', 'LoginController::index');$ k( g2 l: O, _3 S( y% E! ~8 t. a
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      ; a4 f, Z- Z+ R
    11.     // 默認路由處理
      2 k& F4 o/ d. K, _  b  W2 Y
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      * \) T; x$ F& C5 \5 W- _' ]# w
    13. });3 \8 B6 p. X/ M$ E8 `5 s) q( M
    14. 2 }7 J3 o4 k+ u$ p9 F+ N; x
    15. // app/Controllers/Login/LoginController.php& k9 i: O. N% C# S! W9 B
    16. namespace App\Controllers\Login;
      ; i/ T# u& C1 {' t
    17. , V7 J9 X2 R% e0 c
    18. use CodeIgniter\Controller;
      0 ?% L1 q, k. C
    19. use App\Controllers\Login\AbstractLoginPage;
      ! D% ~# m# C  b

    20. ( P7 m1 _( J9 F0 K
    21. class LoginController extends Controller
      % [2 E; S8 }' v, p& y
    22. {1 J# S+ B* b7 ^: ]% O
    23.     protected $pageObj;
      7 E# U0 B9 ~: o! T+ ?# I
    24.     protected $LNG; // 語言物件
      4 ^9 N- z/ ?1 q' k
    25. 7 N: D9 [3 F6 Z1 }: J- ?( L1 G6 f
    26.     public function __construct()
      + Z+ L- _/ O5 [/ r
    27.     {
      : @! o7 b/ M! g1 W6 {8 o
    28.         // 載入語言檔和其他必要的依賴& ]6 D2 ~& P% T8 @
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務: X( t" X2 l1 f, d2 I, [
    30.     }
      % `( C6 T& }" h* |

    31. ' o; }3 p, O( u  G8 p9 `) @
    32.     public function index()1 G$ `7 |0 H* c" X7 D: w# G
    33.     {
      / W/ R' Y# D2 B% _" J( }  N  G! ~* N  ]
    34.         return $this->handle('index', 'show');
      , G5 ~! r; J1 ?; {" o* ?
    35.     }
      ! `3 _6 O" k. r+ b

    36. % Q1 L0 k. ~" e' b
    37.     public function handle($page = 'index', $mode = 'show')
      1 ]% l" w) P" t% @  ]7 T
    38.     {
      . C# M6 E2 ^! F+ a2 b
    39.         // 安全過濾頁面名稱) T5 R1 X# T9 k: T: T$ [& n7 {
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      , x* W, ?! B) P) e% h" u
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      , b  r$ L# y9 L7 {: d
    42.         
      3 {+ G: J5 x2 b  o, ~( D
    43.         // 檢查類檔是否存在
      , H5 x* ^+ I6 g# N- ]; D8 K0 i
    44.         if (!class_exists($pageClass)) {2 R4 y3 r5 _7 i2 }
    45.             return $this->showError($this->LNG['page_doesnt_exist']);* y  ?2 s& e% J) C5 _2 F
    46.         }
      $ t- Y8 M) }5 q" R) T) [+ N  X+ A( Y) X

    47. 9 N) ]2 u+ _/ g  a0 O" n# w
    48.         // 產生實體頁面類
      ) X2 B' T* X; m/ @; g
    49.         $this->pageObj = new $pageClass();
      - J  z+ M: u9 i1 U. x
    50.         8 j7 @& r4 ^0 f5 D
    51.         // 檢查模組要求
      4 C% W  s4 I5 n2 U- K; ^
    52.         $pageProps = get_class_vars($pageClass);
      - ^3 r6 c8 U) M+ P9 R( P( ^
    53.         if (isset($pageProps['requireModule']) &&
      + B' P; z3 n3 X) |# H7 t& W9 o) O6 y
    54.             $pageProps['requireModule'] !== 0 &&
      4 g) [( ]0 q2 ?, [4 P( a
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      0 e6 K4 E% g+ t& e
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      0 d, n/ l# C3 ~( Y7 Q! e
    57.         }+ E, G& ?/ Z& O
    58. ; U) |) }: e9 P& s' G
    59.         // 檢查方法是否可調用% t3 I- I6 i3 l
    60.         if (!is_callable([$this->pageObj, $mode])) {; z7 t7 m1 x( r  q( Q" M
    61.             if (!isset($pageProps['defaultController']) || & W3 p) V0 b6 g- V- }  |5 ]
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      ( L4 v4 H* D1 V
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);. \% b, K: c9 S$ W
    64.             }1 E2 I) C; r$ L3 W# @. c
    65.             $mode = $pageProps['defaultController'];9 k( P9 y* B# e; D
    66.         }& ]9 b; S, Y' T. Q  z: ~

    67. : o# ]2 T; u: n  F
    68.         // 調用相應的方法  {% Z& i* {9 L
    69.         return $this->pageObj->$mode();3 Q' _/ q" \  t* {  K2 ^. G
    70.     }  C" ]; ?+ V8 S/ h
    71. ' o* f  u- q3 E: l# O9 J
    72.     protected function showError($message)
        n$ c) g- `5 `% S. j& O, S" f
    73.     {
      , k  g" u* S( @4 `: l( s
    74.         return view('errors/custom_error', ['message' => $message]);6 O3 z- S) U, t+ J. v- v4 l
    75.     }
      6 C$ ^. X' I9 ^  J" y& F

    76. + N7 u6 C( t( K+ _9 Z& c
    77.     protected function isModuleAvailable($moduleId)
      ! ], A. [* `% g4 o
    78.     {+ w$ s, F) g3 p; c
    79.         // 實現模組可用性檢查邏輯
      + l: r' d1 b4 q4 o4 i
    80.         return true; // 根據實際需求修改
      % i  ]% o  c, d5 o/ X. ?$ m5 R
    81.     }! n; P5 L2 z, P2 n: C% }2 l
    82. }8 p7 y: o/ P  Z' r5 o, o
    83. ) K7 r: O$ K. j
    84. // app/Controllers/Login/AbstractLoginPage.php
      ! F. U* l) u9 O8 |
    85. namespace App\Controllers\Login;
      3 m8 |& z  A" y. c
    86. " v7 C1 D0 D/ @# \6 r3 ~1 \+ X: u
    87. use CodeIgniter\Controller;9 e* C# @) G+ E7 Z

    88. % X/ }# V( o* p/ d# r: s4 m
    89. abstract class AbstractLoginPage extends Controller
      7 j' A- M! h6 ~8 E% P
    90. {
      # {" H/ C' a) J8 F6 f
    91.     // 實現基礎登錄頁面功能
      : V: U! e" u  O$ r0 i7 N. R' k1 ]
    92. }7 o" J# A7 K, i' ^) ^

    93. 0 g- ~: s5 [+ N1 Y8 E
    94. // app/Controllers/Login/ShowErrorPage.php
      % N6 N  V4 n, F  i2 ?/ P" [
    95. namespace App\Controllers\Login;
      ( T+ s6 Z" i0 }6 ]

    96. * J% \7 n* B" A) P! i5 _
    97. class ShowErrorPage extends AbstractLoginPage
      ) {0 p. w4 ]! R0 W1 b1 v: q
    98. {
      : I1 a! G( L* P) \
    99.     public static function printError($message)* C* q1 U6 {, |+ E! I1 e- D
    100.     {; T. L9 x  ]. w
    101.         $controller = new LoginController();
      3 j/ l& l7 e1 G6 \5 H; u
    102.         return $controller->showError($message);
      " F+ a8 d( _, w: \0 K
    103.     }5 |8 z1 H7 Z  f
    104. }8 D0 T' Z3 P$ m
    105. . \# V6 p9 T% v. {$ x, L
    106. // app/Controllers/Login/ShowIndexPage.php) m1 X6 Y$ [( g0 y- \9 V
    107. namespace App\Controllers\Login;
      2 Q- O' p' k9 s+ |2 v7 Y
    108. + o/ A5 z# i' s% l- e1 s
    109. class ShowIndexPage extends AbstractLoginPage
      4 J' u5 m" X  j% V7 J% E
    110. {
      9 _; @( t- K  U
    111.     public function show()
      8 x0 M+ B4 o5 X
    112.     {. T4 n9 a! Y6 Q" f, S
    113.         // 實現登錄頁面顯示邏輯
      ( o% f# `" h! Y1 D: k8 s  {/ l# s9 g$ \
    114.         return view('login/index');
      4 Z2 a; y7 z( j  q; ]% g
    115.     }7 X/ U' C& w' I% @& r& J
    116. }: y: G( K5 H/ U3 o1 B6 O  s$ g# V
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-7-20 20:50 , Processed in 0.017087 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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