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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 247

魔法值:15281 / 15281

生命值:7%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    . f8 F, ]7 R; k6 ?' h+ f5 t* c  B; lAI 就是站長的最佳幫手。* K/ n5 B! a0 g! r8 T
    + ~3 l' q# h! G6 x# N* ]

    + f/ l3 H- T0 b5 c8 N6 _6 @- P這裡的「新架構」是指後端的架構會有大變化
    9 L0 m7 {7 Q/ _1 g但前端的 UI 介面玩家不會感受出來有何不同0 n( s) q% d4 k7 f8 L' R8 n  f
    & B9 R( j* r+ e, c
    : q. t9 Q$ X# y3 Q& ^
    為什麼站長要改成新的獨家架構?
    ; g( m, T* V3 W) M2 ^4 G就一樣由AI模型來解釋清楚吧。
    - V& [+ L' @$ r/ C5 k4 e/ Q* K( a% Q6 h8 `: a( f: _9 J
    & V' I" n4 U+ p( y: u5 i1 m6 }5 a
    讓我分析一下使用純 PHP 和使用框架的優缺點:) a3 p* S# c6 [1 h, S1 |, J# y
    純 PHP 的優點:  @+ I* u8 K! P0 h2 u* K1 E% |
    1.        性能較好 - 沒有框架的額外開銷
    6 }2 p$ O2 R1 g2.        學習曲線低 - 只需要掌握 PHP 基礎知識8 f3 q; |! f+ z- x7 i; F( q
    3.        更靈活 - 可以完全按照自己的需求來設計架構$ ^0 D# p: u5 t- a
    4.        代碼量小 - 不包含不需要的功能模組
    ; p1 r0 q1 J; n- b: x5.        適合小型項目4 X- U# n" Y* F. a$ S
    純 PHP 的缺點:' `9 Z& L6 H1 P6 X0 f7 I6 _
    1.        需要自己處理很多底層細節
    7 l3 e' f7 a8 f, g4 l! s. W2.        代碼複用性差
    7 X$ C0 D! _& ^, ^! v9 \, @9 {4 k3.        缺乏統一的開發規範* H/ E9 g# Z& N0 J' {. n, d* S
    4.        安全性需要自行考慮和實現7 D  T7 m! K# ~. B: K; }
    5.        開發效率相對較低
    2 ^/ s9 }" ^, q6.        維護成本高( z" r4 k4 g4 x1 K% _
    使用框架的優點:
    : r+ p) r) P  ]. A1.        開發效率高 - 有現成的元件和工具. W& L) G# T1 r+ p. c9 P# A
    2.        有完善的安全機制
    1 q# _3 P8 P" ?* ~0 Z" L3.        統一的編碼規範0 a0 v  `, ]; r" `) W( M' P
    4.        易於維護
    $ w" K% [, ?& d& K& \5.        有活躍的社區支持. s' l6 J! u# f6 g3 u
    6.        適合團隊協作! b7 r9 [+ a9 ?
    7.        自帶很多常用功能(ORM、緩存等)
    $ t' s6 W+ _9 ~4 T使用框架的缺點:) E$ i6 Y) v1 p7 k6 Z/ k
    1.        性能有一定損耗
    2 d. u9 O+ ?1 r# @2.        學習成本較高
    # \9 c3 b; M! Z: a3.        可能包含很多用不到的功能
    ! i, b; P; M$ _8 g2 H6 e1 ]4.        不夠靈活,需要遵循框架的規範; O1 i6 g0 e  M- X
    5.        對小項目可能顯得過重
    - v! `8 J+ h1 e* a0 ^# y$ w9 w建議:
    4 D1 K9 F; _0 d6 H% h' L1.        小型項目或學習階段可以使用純 PHP. q  ~/ R* R3 N/ C& D" V
    2.        中大型專案建議使用框架
    7 U9 e0 d3 i* ~, H2 W4 X+ |5 u% z7 Y3.        選擇框架要根據專案需求和團隊情況
    ) S4 q  L' R' _3 \; N; G8 e3 r4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    ; s9 ^; k4 a) S0 \3 t. `/ d9 x您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    6 h8 e' M$ W6 e+ J8 y2 O# w. M$ i" B

    ) g# C5 ^3 v+ v7 B8 J# R0 j8 x0 A) f1 I3 g$ j; P6 ?( Z7 L
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。- ]* i) a0 p" W* U
    & J" z6 x- h3 W, ?
    這個轉換主要做了以下改動:# \/ q" Q1 ?5 q2 k! a5 i7 ?. f

    / j$ A7 o0 C$ N. F路由結構:
    2 J- O3 f: ?5 x) G
    # c9 ~' ?3 y' [6 _2 O' `使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下. k% Y% x* z( j6 U
    支援原有的 page/mode 參數結構; X" d0 ?; ?- K3 h
    通過路由規則自動匹配到對應的控制器方法. u) P1 F& m$ c) i' n. u
    & ^* D3 z  k5 R0 @) @

    8 \, h& E- V' L0 I控制器結構:
    1 s. S% N( D( }( j2 s
    + v( o, {  a/ O% S創建了主要的 LoginController 處理所有請求
    ; C) L% y/ Q5 I) N+ N4 H/ m保留了原有的頁面類結構,但改為符合CI4的命名空間規範+ e4 G( A! m# ^$ N0 H# V& j
    錯誤處理改用CI4的視圖系統4 z9 n7 T# f# Z, d% D+ b* B' m
    9 U8 e5 b$ ~. x& R9 ?
    - [, v0 F/ U0 c9 z3 t$ ?6 W( q
    類的組織:2 a2 r0 {- t( e, z- N8 ?4 e/ }' \

    $ e  }0 T/ c+ `" @2 c7 K所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    - F' q# ^0 Y6 r. }% ]2 c保持了原有的類繼承結構# b$ ^. p1 R4 H* o! d
    改用CI4的控制器基類和特性
    + R8 N" B% F. x2 R3 m. j+ F3 p  n" m. L
    7 r, `9 }2 M" u! Y; H
    改進的安全性:
    $ l  C3 N4 x, E6 B2 @) D& i& @% ]) U9 N5 b7 X
    使用CI4內置的安全特性
    ! j, D* m7 M. L更嚴格的輸入過濾
    ! C/ ]( E: T3 V2 M# W. h1 \更好的錯誤處理機制) k3 V3 |, O- b% f& e" S, Z
    + Q( E: e  n  [" F& b& Q

    & e* C+ _, Q" u% i, k% }( p  G" Q- E6 ^: O* x! _$ \: h
    要使用這個新結構,你需要:
    ! y" n, ?7 a( h( w8 T- z, ^9 q- |/ \+ ], o. Y3 U  W
    將這些檔放在對應的CI4目錄結構中
    4 k3 V# ~$ K) {3 C' E確保創建相應的視圖文件' ]6 a9 ^* a2 K/ L# V4 l2 F' s! x
    配置語言服務; s/ V+ R9 ^. z
    根據需要調整模組檢查邏輯
    & e1 L4 Q+ o, H  @
      f' r+ `# i/ Z$ ]8 X; |  g需要注意的是,你可能還需要:
    5 n  `  K, ]! T. u9 n! Z; z
    ( V' G1 f. l- r# \創建相應的視圖檔(在 app/Views/ 目錄下)
    9 H/ T# m& l0 {: T) C$ C% w5 [配置適當的中介軟體來處理會話. ]- G  f* g: d6 F4 s
    實現具體的登錄邏輯1 U- h2 h! d% H# I! i
    + c5 @5 e8 P% [, c
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?, b1 u$ |1 ^$ X5 c
    3 P0 A0 y. X# c9 N+ Q( L' m' P
    1. <?php
      8 W; ^+ D# E8 I+ h# w  _
    2. // app/Config/Routes.php3 p3 I; p7 g6 G8 v. m1 Y( U
    3. namespace Config;
      3 n, a4 Z5 f6 k) {' o+ K/ Z
    4. ! |7 q; B5 l4 M& P8 q6 G
    5. $routes = Services::routes();6 O9 |  o1 x8 x; U1 t
    6. % ^6 g1 F" Y9 N' w; e
    7. // 添加自訂路由規則2 y5 S! F; s8 L, H
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {0 Q6 ^, w$ t# z: a$ q
    9.     $routes->get('/', 'LoginController::index');7 L1 z4 N. v2 k, W% ^9 G
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      ; b" m  r8 {( \) ^! Q: C& t7 ~
    11.     // 默認路由處理5 |  t1 @0 J" E# X
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');/ s) p, a% t2 [
    13. });2 d) p3 R+ K  Q4 t
    14. " I8 g) }# B% j0 n1 Z* ^- e' E6 X9 S
    15. // app/Controllers/Login/LoginController.php; }: V; E- D# o5 f: G) C5 c/ y" S: v
    16. namespace App\Controllers\Login;
      4 |7 i" r: k2 T1 Y& ~, ~0 T# m& W

    17. 2 p/ C# ]% R  i: U: Q
    18. use CodeIgniter\Controller;4 C7 R* M1 _2 U  w2 }0 T
    19. use App\Controllers\Login\AbstractLoginPage;
      % W& K+ |( z4 B
    20. ) G& b* V' V2 Q' ?% ^& _5 g6 N( F
    21. class LoginController extends Controller! o, N- [  r( F3 i
    22. {
        H# S) o' a. h/ K- n
    23.     protected $pageObj;
      5 ?. F0 c  m5 q' E% ]0 h9 c
    24.     protected $LNG; // 語言物件7 @! h, V5 H5 t. ]6 N& J0 P* I$ b

    25. 8 t! v& \! s2 a; m! \  x: U
    26.     public function __construct()
      : X% _7 }7 C, @  z
    27.     {
      , ^( g4 R7 z2 E; w2 [! h. g
    28.         // 載入語言檔和其他必要的依賴
      ! y; s. }% U* H; D: Z+ t$ z7 p5 O
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      + q' w7 f2 X  O; }
    30.     }" O: |# R% @$ p, f* ], ^: }8 t

    31. - m7 {% ^, v  M
    32.     public function index()8 w$ J- h. p# x# `# V% ^3 q' ^+ n3 K
    33.     {" t0 O  g4 B4 p0 y- E
    34.         return $this->handle('index', 'show');7 C. M* l% k6 z5 d% q
    35.     }
      9 d! X: X% H9 S$ [8 _) S; |, I

    36. ! K  [( @( W0 n' r  y( X: l
    37.     public function handle($page = 'index', $mode = 'show')9 Q( M5 {& d& o) C
    38.     {' B: ?8 R! E  L3 |
    39.         // 安全過濾頁面名稱
      6 X1 p2 b, H. Y
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      * y4 B  p- Z8 T% c7 i
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';: m7 D2 G. X$ z0 c
    42.         
      # x- l* s; s" a2 g+ L1 B
    43.         // 檢查類檔是否存在9 _. J4 `0 Z% m6 U+ r
    44.         if (!class_exists($pageClass)) {
      6 m+ M: s" V, E/ s6 U& a
    45.             return $this->showError($this->LNG['page_doesnt_exist']);1 _: O9 C' P. J/ W- s
    46.         }
      2 B6 g' a* r: v. _- w

    47. % ~$ s' g5 @: ^
    48.         // 產生實體頁面類; _/ I4 b# q; t9 s6 ~
    49.         $this->pageObj = new $pageClass();
      ' q$ h0 I' |3 D! Z; F
    50.         
      , Q) Q- }" b1 M2 T* ~
    51.         // 檢查模組要求
      8 K1 k7 C$ q0 E9 q1 o
    52.         $pageProps = get_class_vars($pageClass);' l; r- j/ p: L- I' F/ Q; T( |6 ]; w
    53.         if (isset($pageProps['requireModule']) &&
      6 b- A+ a  l! ~! ?
    54.             $pageProps['requireModule'] !== 0 &&
      ) @) |' a4 I8 t! L$ P/ Q
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      # W3 q! W0 G9 }$ ^  H$ j* E
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      ' L4 W; g, f' Q1 t; M
    57.         }
      - Z2 s7 l0 J6 Y9 N! z- b0 Q+ |
    58. * j( J2 }# B5 q% r
    59.         // 檢查方法是否可調用
      + H0 h! x* m! b" |
    60.         if (!is_callable([$this->pageObj, $mode])) {
      ' U! T$ ]# v' g3 B- W4 r
    61.             if (!isset($pageProps['defaultController']) || 6 m4 [& a* h* m; b
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {* `+ F1 @8 b* K7 h; z
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      - o0 }& x* e2 N; I( W& l
    64.             }* g. w6 B8 {1 k* B
    65.             $mode = $pageProps['defaultController'];, V( F' [+ {- U
    66.         }
      4 W/ V: `3 x/ i0 @, f! H5 [
    67. & O+ l2 R& p# A  Z( N6 x8 b' ^
    68.         // 調用相應的方法
      ; q+ t3 \" _9 e7 M5 b
    69.         return $this->pageObj->$mode();
      # X, d, U9 b$ A  v# ~1 p
    70.     }
      ' t$ H5 P; f) V, \" N$ z
    71. ! M% ^, C  X& G3 n: b
    72.     protected function showError($message)5 \2 ?  J: T' M" f3 B1 A  z3 ^' ]$ T
    73.     {" p1 ~6 ^1 \1 z! v3 K% }0 x
    74.         return view('errors/custom_error', ['message' => $message]);
      + }9 ~, f7 q8 v, }: {# K5 W
    75.     }
      2 e4 o5 p5 d4 R+ @( u" U

    76. 9 u  @6 ^) t/ I! I
    77.     protected function isModuleAvailable($moduleId)
      + D! u7 a+ i$ y* p# K- H! N
    78.     {
      0 m% G& Z+ f; ~5 j$ v
    79.         // 實現模組可用性檢查邏輯0 O& D% s- D; |* j; A! t
    80.         return true; // 根據實際需求修改
      ( m$ s4 b2 p1 F6 P; F8 S
    81.     }
      ) b5 ]; W, U: J6 H. O# X
    82. }
      3 x7 J* G2 I  }2 i8 _
    83. 6 ]9 }4 Q5 p1 _, M/ P2 H7 X  s
    84. // app/Controllers/Login/AbstractLoginPage.php
      1 d* _. u1 }1 Z" |7 |6 ^0 Z
    85. namespace App\Controllers\Login;
      * R1 R! K& ^2 f: f+ `3 O

    86. : s3 A" s0 Y, x  @  \* v" t
    87. use CodeIgniter\Controller;
      8 S8 s0 S/ G' j% b

    88. - j% L9 b. j1 G5 R4 T
    89. abstract class AbstractLoginPage extends Controller3 e* b, H1 g$ e9 d1 P
    90. {, ]* K3 \0 h( U9 F
    91.     // 實現基礎登錄頁面功能
      ) y  K4 `: `* Y( k' _+ v* \
    92. }
        a' x2 F; A9 b( w4 v( ?$ s
    93. 9 k8 R- d, a7 F# H  j! O1 G( h/ K
    94. // app/Controllers/Login/ShowErrorPage.php; \! e$ q, t+ ^4 g
    95. namespace App\Controllers\Login;
      1 L- K) _# r7 M

    96. " T* T" }; v) \* o. Z
    97. class ShowErrorPage extends AbstractLoginPage
      $ |- E+ ~3 o( w' A
    98. {
      $ P6 `* Z: q9 O
    99.     public static function printError($message)9 }1 `5 \& N4 T1 i' K
    100.     {6 g9 m% L# i5 V. N
    101.         $controller = new LoginController();
      1 ~9 e4 b0 H: E% U2 P( J  ^8 l4 ?
    102.         return $controller->showError($message);
      4 \5 ?) X9 m( X
    103.     }. b. V% s/ n8 B" c0 m. K7 E
    104. }% X$ B% q- b) y/ Q' `( l
    105. 7 e5 o) A: H6 v: ~: b' v# d
    106. // app/Controllers/Login/ShowIndexPage.php* O: U5 ~3 x! M+ Y# V
    107. namespace App\Controllers\Login;; _) M) C( C9 z3 a# a
    108. 2 T5 P, E6 X6 m( X! q9 P
    109. class ShowIndexPage extends AbstractLoginPage4 S" Q. H/ P0 _
    110. {, A6 l2 C# X  O# l8 D6 M
    111.     public function show()0 l* A' K6 I0 w8 F7 H3 P) [
    112.     {
      ; `- I9 m6 @: E6 z3 q
    113.         // 實現登錄頁面顯示邏輯2 y2 l1 u# r; @
    114.         return view('login/index');
      ! e3 S) F& z# m$ G( m
    115.     }
      . ^- V% K3 e% H$ K* c1 W
    116. }& P8 o  L8 y/ _
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-11-4 14:20 , Processed in 0.011776 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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