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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14547 / 14547

生命值:6%

升級   100%

  • TA的每日心情
    奮斗
    昨天 00:27
  • 簽到天數: 5839 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    6 b$ c$ C* T* i9 \- o+ A) hAI 就是站長的最佳幫手。3 b4 d. }' A3 h  }$ }" A

    ' w, W- f- H6 q% B; P/ w. ~& W* Y: L, l" c6 ]7 F+ M
    這裡的「新架構」是指後端的架構會有大變化, D, _; c. o, z
    但前端的 UI 介面玩家不會感受出來有何不同% o4 e6 \2 s3 ^/ |, a. K
    4 p' L+ Y9 o% w+ p

    / w# N/ A1 V, o. K* A為什麼站長要改成新的獨家架構?
    : h3 K  p. F" ~0 n就一樣由AI模型來解釋清楚吧。9 [  y0 Z% K; w# x

    ) r3 R* f" z  |' E  j
    / J& Z1 E! E: [6 v讓我分析一下使用純 PHP 和使用框架的優缺點:( ~) R- L! m3 }9 L6 r4 W
    純 PHP 的優點:
    * s( S' F7 f% K1.        性能較好 - 沒有框架的額外開銷, K$ z* Z# x$ h# @; R' c, b- l. I
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    9 j9 P$ B: c, X% ^6 {* n: W3.        更靈活 - 可以完全按照自己的需求來設計架構9 R7 }/ t8 d6 I) d6 p
    4.        代碼量小 - 不包含不需要的功能模組
    ( q  C; x: y/ O+ Y( [  c. z5.        適合小型項目: ^1 H$ ]. E. m1 i% b2 Q
    純 PHP 的缺點:
    0 H6 ], I! k) ?8 Z$ }; w9 F1.        需要自己處理很多底層細節9 \& o3 y; m! C' }/ X+ M
    2.        代碼複用性差
    / R6 ]3 m) k" F3.        缺乏統一的開發規範! k0 R1 [# T+ J- M2 ^7 o
    4.        安全性需要自行考慮和實現" M9 {) U: q/ H: E, M  ~/ t
    5.        開發效率相對較低" a- d( Y0 }, k6 @
    6.        維護成本高
    ) G0 S5 R/ o% ?( `* W9 H4 R使用框架的優點:
    0 s" \8 j% i" {3 Y  j1.        開發效率高 - 有現成的元件和工具& ~5 G/ S; r2 {" h0 O3 j; F
    2.        有完善的安全機制
    : G4 Q/ \6 T& m5 }0 n) ^6 }( Q3.        統一的編碼規範* j2 R" G. G! O) C! p
    4.        易於維護1 p. g* E! R" z5 u8 u
    5.        有活躍的社區支持$ o) n6 u# c, y( [* `5 P) ^- f( H
    6.        適合團隊協作: x+ k( y* L) E* X7 F; z! {
    7.        自帶很多常用功能(ORM、緩存等)7 ?$ N. y6 [: x+ ?9 v
    使用框架的缺點:7 d: s8 B* k4 @& Y: t; _" s4 X1 C/ j
    1.        性能有一定損耗
    9 L1 |" z! Y3 w, w- ]2 j2.        學習成本較高/ ]+ |  y/ M* P/ W" c! U
    3.        可能包含很多用不到的功能* T+ b& {0 [4 \$ d
    4.        不夠靈活,需要遵循框架的規範" R; V! f3 y9 O
    5.        對小項目可能顯得過重: c6 u  z; z  x, v1 D/ K9 c3 p
    建議:
    , r% P( t1 e$ x$ g( p. K( Y1.        小型項目或學習階段可以使用純 PHP
    5 L: ^6 G6 s7 I4 M2.        中大型專案建議使用框架
    + h* o; {3 K/ r' Q" ~3.        選擇框架要根據專案需求和團隊情況
    # o1 T9 }6 U' e8 F5 U( V) Y4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇) M7 [- I! w/ y2 e& ]
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    4 f0 i( y  v4 }0 v9 a: [8 E! ^, w4 t, p9 ]# W% J$ k  }
    ) ?) c5 s: p+ R2 E4 t4 B2 S5 f5 r

    ! ]' r) K, I, C3 @" J我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    * _  ^" k# x0 {% \* K$ s7 r9 W2 u% l' T! ]8 I% m2 m6 C
    這個轉換主要做了以下改動:1 `$ p7 @2 w/ T% N, U) C; I1 i
      A3 |! ~! Y0 H. j3 J. U! X
    路由結構:
    * H$ g5 e: K* h# a  m2 g9 E
    3 N: P& R3 l  Y# x使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    1 @' b$ |+ Z+ k/ D( u支援原有的 page/mode 參數結構
    2 e! l- ?( l; M# k; i' X7 d6 S通過路由規則自動匹配到對應的控制器方法; @( w& A4 }1 n" J4 Z
    & r1 G2 L3 t& C1 J* b+ T

    - b' r) i/ N1 f* v# n控制器結構:
    0 x. L2 j$ Q2 Q% q: D
    - |+ C5 n1 A+ C5 E創建了主要的 LoginController 處理所有請求
      Q. v4 I$ y: J" Q, c( T: n保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    9 c9 n& F9 U1 ^8 X錯誤處理改用CI4的視圖系統, V8 J- |: g4 b9 h: M2 @

    - `% o5 c0 U$ i# B+ ?
    ; K* a8 o' E8 K! r: @8 z! d1 {; n7 n# M類的組織:
    2 ~" \5 S0 c4 g
    , c' E6 v1 a3 X% c0 u6 |所有登錄相關的類都放在 App\Controllers\Login 命名空間下4 O8 h  H# P/ M% ^$ s) Q
    保持了原有的類繼承結構' x( p2 j' `( H2 b! U) G- a% c, @
    改用CI4的控制器基類和特性
    * ^* ^7 s" \5 V; Y
    % U' t' W0 |+ j3 r
    / ~) r) c0 ?" i* Y' [6 f& V2 ^7 V改進的安全性:
    6 f  F9 ~& g; o# b, V) k/ g2 w# l! v7 f9 G$ c
    使用CI4內置的安全特性
    : X7 _7 ]& v1 G更嚴格的輸入過濾
    0 B' p( Z' }, q/ K; j更好的錯誤處理機制6 m) C' H" I, C6 o, t
    , t; p& ]* z1 g" T1 o

    5 \6 @, R- W3 a$ @
    ' M) E" y. m! }8 |3 E- k1 M8 g, z要使用這個新結構,你需要:
    9 o  t$ f' N; g6 J8 t3 d9 X: K7 B- c3 j8 L) q8 i5 W$ M
    將這些檔放在對應的CI4目錄結構中3 @+ d( M) f# p, o) w4 P
    確保創建相應的視圖文件
    7 e# `0 \5 `9 @. j$ h配置語言服務
    $ q2 N1 z9 \' n$ E9 D根據需要調整模組檢查邏輯
    6 x, x3 H9 n0 P- l5 n2 ~
    2 d8 e9 b+ Y- Z' r需要注意的是,你可能還需要:* Y! `1 l* N1 Y) L( V( R8 @

    3 `* X( X6 f: v創建相應的視圖檔(在 app/Views/ 目錄下)7 K! M7 Z  G  w! H
    配置適當的中介軟體來處理會話
    3 M) c- q6 }7 r% V實現具體的登錄邏輯8 {8 |3 h6 ~2 K
    - ?) B6 }, E" L3 F$ n
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    5 A4 q/ t7 p7 E1 i! |5 p8 F1 }, o
    / M" S0 E' t  {6 e/ ?& u
    1. <?php
      & i0 a* a5 o7 q. [
    2. // app/Config/Routes.php5 s0 Q9 S& V; J8 Y8 g- ^/ n, ]. P# B
    3. namespace Config;
      9 ?& c5 W+ t+ j: M! L
    4. % c. V! B# H5 t0 A8 z& n
    5. $routes = Services::routes();/ V  u: f, J6 b' W( C. W

    6. 6 E9 ~/ m; D7 H
    7. // 添加自訂路由規則
      - M' G) \+ p! k( K- P
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      % }& |; y6 J/ @: C' {
    9.     $routes->get('/', 'LoginController::index');1 e9 t5 `" ~' i9 q* r: e* x3 w
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');+ W, Y- S! `, S' \: s2 u1 j5 S6 I
    11.     // 默認路由處理4 e, g* g* g1 q8 x# n' \
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');; s1 J' n- f4 B( T+ I% w5 f' z8 z& }
    13. });9 e* Y( X( X7 I1 T. A1 U+ p
    14. - ?- F: w- a, Z8 N4 `: k; M
    15. // app/Controllers/Login/LoginController.php
      , [; `* h% H4 B' Q9 g! L# H
    16. namespace App\Controllers\Login;8 y2 D/ e! O. B- h; K3 f

    17. ) l. J$ T9 W! H: X- A
    18. use CodeIgniter\Controller;% f/ D+ I  x) c
    19. use App\Controllers\Login\AbstractLoginPage;4 r8 L7 ~& Q' ^4 S5 c! q
    20. & J) |; O0 p) s6 j: F% L9 x, R
    21. class LoginController extends Controller( o& U& h) Y2 w) q: _  M" r
    22. {
      ' N& r- x# W! i5 l
    23.     protected $pageObj;$ v7 s$ U5 X# y' Y% ^6 q# W* z6 U/ h
    24.     protected $LNG; // 語言物件; ~2 Y$ z, v% m3 @. k( R) y% o
    25. ; J; H; M6 h# @$ T  c
    26.     public function __construct()
      " a$ b9 T2 K4 e6 N3 x3 i# d
    27.     {
      ; p" Y  H( _, P6 }  T
    28.         // 載入語言檔和其他必要的依賴; e, l; O2 x" E: d
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務) W) l# l) G" q" w/ w. {9 S
    30.     }
      + m; m) L5 ]7 P- B/ S8 Y
    31. 4 x5 J9 n8 k$ a
    32.     public function index()
      2 X3 d% L/ e9 Y8 `% W* N5 q
    33.     {- ]& ?' Z6 y% `7 I" J2 N$ k
    34.         return $this->handle('index', 'show');6 m2 e. |' G3 k4 }2 t  N7 K/ I
    35.     }9 _% H2 K; C1 C: w% C

    36. / ~5 A( E, z4 _6 X# P! \3 R
    37.     public function handle($page = 'index', $mode = 'show')
      ; t$ {2 o& z8 K* D4 ^7 W# ~
    38.     {
      7 `* B* k1 h) z7 c# u( n
    39.         // 安全過濾頁面名稱) d3 P- o# m# j, e  ^
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);( r. o9 c! t" S7 G6 ?+ |" O
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';5 A+ F7 x  |0 x8 L- `# ~9 \
    42.         
        ]3 F- o' h& w8 h% F# E( X& r0 k
    43.         // 檢查類檔是否存在
      + f6 m. O$ r+ B5 T
    44.         if (!class_exists($pageClass)) {) G  z4 d4 E7 D- @* \/ x2 a! {
    45.             return $this->showError($this->LNG['page_doesnt_exist']);  n- i) q% k7 m7 O
    46.         }
      " M7 O1 E: G6 F2 g2 d( Y

    47. + W+ O3 T8 o7 U
    48.         // 產生實體頁面類
      3 l( j* R$ K5 e- e) |0 n' O
    49.         $this->pageObj = new $pageClass();
      4 O# A3 q% h! P" G6 `4 D
    50.         : L2 V6 D  C. f, G! f
    51.         // 檢查模組要求; K+ I" s' d9 v$ H" H  F$ s' h" d1 s0 K7 i
    52.         $pageProps = get_class_vars($pageClass);- r3 @, X1 E: |% Z2 B$ N$ e
    53.         if (isset($pageProps['requireModule']) && 8 F1 s3 N- S6 Z
    54.             $pageProps['requireModule'] !== 0 && 6 A1 _, G+ y. r7 T0 n
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      ' d. t4 Y+ o$ X* c
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      , X% H0 l2 P' z. u( ?$ ]
    57.         }
      + v; K  ~0 {/ u5 J
    58. 4 u: A/ p+ t9 N& u) @. Z
    59.         // 檢查方法是否可調用. }& W% `# B  q; ]2 @
    60.         if (!is_callable([$this->pageObj, $mode])) {* Y% I# t/ n8 Q& ^* y
    61.             if (!isset($pageProps['defaultController']) || 5 h  h. ^  j) M# k: i3 h
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      7 A7 u: y2 }- P
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);: I" O) B/ M' G- i0 m1 k
    64.             }' w) F# c1 ~, G  {
    65.             $mode = $pageProps['defaultController'];
      3 r4 s9 }0 G$ V+ v" ~+ ], n
    66.         }  A! m3 g5 F; ?: `$ r

    67. 3 ?) [9 A& O, h
    68.         // 調用相應的方法- G1 R3 _1 Q2 {+ B* q
    69.         return $this->pageObj->$mode();
      2 s0 s/ A! V7 t$ a' T
    70.     }8 d0 e8 q& P6 B, ]( B& q
    71. - |7 s9 B% _) \/ [7 \0 c( D5 r6 o' M
    72.     protected function showError($message)
      . I& R9 u( P% P9 L" P# i
    73.     {
      1 p% j* }, h3 O( R2 D7 l
    74.         return view('errors/custom_error', ['message' => $message]);% w! I. X. N6 H0 g& }
    75.     }- e2 v6 f, D9 k- V8 v: [5 H6 m
    76. 2 R% \: q( J" A# X
    77.     protected function isModuleAvailable($moduleId)% h- Q: @4 \$ F, a+ y+ G
    78.     {
      ' L8 O$ T/ O0 ?9 o* H. X7 M
    79.         // 實現模組可用性檢查邏輯
      * E/ ]4 |5 }) d, d3 s
    80.         return true; // 根據實際需求修改, u) P) G. f; l; D5 T; s7 {
    81.     }6 o! f0 _2 N1 R/ f- n' g$ q, T4 N
    82. }( h/ k3 p- Q1 Z+ l) W; M" w1 O
    83. # C+ }9 L+ Z1 e3 t# [+ f- D
    84. // app/Controllers/Login/AbstractLoginPage.php! O4 n) {1 i" Z
    85. namespace App\Controllers\Login;
      - }0 r5 G* b* q% R
    86. ( P2 U. e7 _- N3 |" V" L& F5 n) J& _
    87. use CodeIgniter\Controller;4 ~& \# _# {2 Z; |

    88. 7 x0 F) W% j# L- b1 D/ ^
    89. abstract class AbstractLoginPage extends Controller
      ( k% o' l/ O1 n+ J) U9 f
    90. {
      , l  {8 b) E' T6 |/ w. ^$ f/ u
    91.     // 實現基礎登錄頁面功能- ^0 i' W, t6 |1 ^# P
    92. }
      , }2 q0 C! a9 W- w5 n

    93.   H& O7 f; `4 d& L. o. z
    94. // app/Controllers/Login/ShowErrorPage.php1 C9 j1 [7 Y/ d. |. @  b
    95. namespace App\Controllers\Login;: z& Z8 \) o/ Y" S4 f

    96. 2 O- V" ^2 ?6 J, k; M; ?
    97. class ShowErrorPage extends AbstractLoginPage
      : {* h1 P" E, d6 r
    98. {
      & _5 q' u/ v6 K( p2 B3 G: N
    99.     public static function printError($message). K4 k1 q) g0 k8 l* i: @
    100.     {9 J' G; l  M& I# H1 W+ {
    101.         $controller = new LoginController();
      % w/ u# F- M. q: k) d
    102.         return $controller->showError($message);) P- n. J2 z8 P/ p/ b/ ]( Z
    103.     }; z! k# ]6 I: y+ B1 ?
    104. }
      % g% P* S/ t! ~( o$ _

    105. , Y7 z) o3 J! g4 Z9 C. n
    106. // app/Controllers/Login/ShowIndexPage.php3 n+ ~5 w. I$ W, j- x7 }
    107. namespace App\Controllers\Login;1 B, X( a( R7 g- ?* k4 N' U

    108. ( ?' y5 S5 }( f
    109. class ShowIndexPage extends AbstractLoginPage" K* N: Y  ~4 P
    110. {
      / e3 _6 z: q. M# u% m5 q% P
    111.     public function show()4 K' d8 r* y) K0 e# a" k5 X, r1 F# S
    112.     {8 {* k: y! @6 c4 X' S/ f! v& L
    113.         // 實現登錄頁面顯示邏輯
      9 C5 i& ^7 o8 B8 `5 m( }' U
    114.         return view('login/index');/ J9 \1 W" h' n" G4 G
    115.     }
      ) q. V8 L& [- M% ?6 w* s+ }
    116. }
      1 q# z9 F. P, f
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-1-30 20:59 , Processed in 0.020337 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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