253 lines
11 KiB
Markdown
253 lines
11 KiB
Markdown
# External Integrations
|
|
|
|
**Analysis Date:** 2026-04-21
|
|
|
|
## APIs & External Services
|
|
|
|
**Lottery Data Scraping:**
|
|
- URL: `https://history.macaumarksix.com/history/macaujc2/y/{year}` (e.g., `2026`)
|
|
- Purpose: Fetching Macau Mark Six lottery historical results
|
|
- Client: `guzzlehttp/guzzle` ^7.10
|
|
- Integration point: `D:\code\php\amlhc\application\index\controller\Index.php` method `get_history()` (lines 20-58)
|
|
- Data flow: Scraped JSON response contains `expect` (period number), `openTime`, `openCode` (comma-separated numbers) -> parsed and upserted into `fa_history` table
|
|
|
|
**FastAdmin Official API:**
|
|
- URL: `https://api.fastadmin.net` (`application/config.php` `fastadmin.api_url`)
|
|
- Purpose: Plugin marketplace, version checks, addon updates
|
|
|
|
**WeChat (EasyWeChat SDK):**
|
|
- Package: `overtrue/wechat` ^4.6
|
|
- Purpose: WeChat OAuth login, messaging
|
|
- Integration point: Addon-level, managed via addon configuration
|
|
|
|
## Data Storage
|
|
|
|
**Databases:**
|
|
- **MySQL** - Primary database
|
|
- Connection via env vars: `database.hostname`, `database.database`, `database.username`, `database.password`, `database.hostport` (`D:\code\php\amlhc\application\database.php`)
|
|
- Charset: `utf8mb4` (configurable via `database.charset`)
|
|
- Table prefix: `fa_` (configurable via `database.prefix`)
|
|
- PDO driver required (`ext-pdo`)
|
|
- Single server mode by default (`deploy: 0`), supports master-slave replication
|
|
- Key tables: `fa_admin`, `fa_auth_group`, `fa_auth_rule`, `fa_user`, `fa_attachment`, `fa_history`, `fa_num`, `fa_command`
|
|
|
|
**Caching:**
|
|
- **File-based cache** - Default cache driver (`application/config.php` `cache.type => File`, path: `CACHE_PATH`)
|
|
- **Redis** - Used for queue system (`D:\code\php\amlhc\application\extra\queue.php`)
|
|
- Host: `127.0.0.1`, Port: `6379`
|
|
- Password: empty by default
|
|
- Database: `0` (select)
|
|
- Persistent connection: disabled
|
|
- Expire: `0` (no expiration on tasks)
|
|
- **Token storage** - MySQL-backed (`application/config.php` `token.type => Mysql`)
|
|
- **Menu cache** - Uses ThinkPHP cache with key `"__menu__"` (`D:\code\php\amlhc\application\admin\library\Auth.php` line 461)
|
|
- Session supports Redis/memcache drivers but defaults to file-based
|
|
|
|
**File Storage:**
|
|
- **Local filesystem** - Default upload storage
|
|
- Upload URL: `ajax/upload` (`D:\code\php\amlhc\application\extra\upload.php`)
|
|
- Upload path pattern: `/uploads/{year}{mon}{day}/{filemd5}{.suffix}`
|
|
- Max upload size: 10MB
|
|
- Allowed types: `jpg,png,bmp,jpeg,gif,webp,zip,rar,wav,mp4,mp3,webm`
|
|
- CDN support available via `cdnurl` config (empty by default)
|
|
- Chunked upload support available (disabled by default, chunk size: 2MB)
|
|
- Upload handled by: `D:\code\php\amlhc\application\api\controller\Common.php` `upload()` method with `app\common\library\Upload` class
|
|
|
|
## Authentication & Identity
|
|
|
|
**Backend Admin Auth:**
|
|
- Class: `D:\code\php\amlhc\application\admin\library\Auth.php` (extends `fast\Auth`)
|
|
- Password hashing: `md5(md5(password) . salt)` (double MD5 with salt)
|
|
- Session-based: Stores admin data in `Session::get('admin')`
|
|
- Role-based access control (RBAC): Admin -> AuthGroup -> AuthRule hierarchy
|
|
- Features:
|
|
- Login retry limit: 10 attempts, 1-day cooldown (`fastadmin.login_failure_retry`)
|
|
- IP change detection enabled (`fastadmin.loginip_check: true`)
|
|
- Unique login option available (`fastadmin.login_unique: false` by default)
|
|
- Safe code validation: MD5-based checksum of username + partial password + token key
|
|
- Auto-login via `keeplogin` cookie with time-limited key
|
|
- Tables: `fa_admin`, `fa_auth_group`, `fa_auth_group_access`, `fa_auth_rule`
|
|
|
|
**Frontend User Auth:**
|
|
- Class: `D:\code\php\amlhc\application\common\library\Auth.php`
|
|
- Token-based: UUID tokens stored in MySQL token table
|
|
- Token default lifetime: 2,592,000 seconds (30 days)
|
|
- Password hashing: Same double MD5 + salt as admin
|
|
- Features:
|
|
- Login by username, email, or mobile
|
|
- User groups and rules (`fa_user_group`, `fa_user_rule`)
|
|
- Score and money log tracking (`fa_money_log`, `fa_score_log`)
|
|
- Hook events: `user_init_successed`, `user_register_successed`, `user_login_successed`, `user_logout_successed`, `user_changepwd_successed`, `user_delete_successed`
|
|
- Tables: `fa_user`, `fa_user_group`, `fa_user_rule`
|
|
|
|
**API Auth:**
|
|
- Token passed via `HTTP_TOKEN` header, `token` POST param, or Cookie
|
|
- Controller base: `D:\code\php\amlhc\application\common\controller\Api.php`
|
|
- HTTP 401 for unauthorized, 403 for forbidden
|
|
- CORS handling via `check_cors_request()`
|
|
|
|
**Captcha:**
|
|
- ThinkPHP captcha (`topthink/think-captcha` ^1.0.9) - Image-based, 4 characters, size 130x40
|
|
- Text captcha - For user registration (`fastadmin.user_register_captcha: text`)
|
|
- Login captcha: disabled by default (`fastadmin.login_captcha: false`)
|
|
- Generated via: `D:\code\php\amlhc\application\api\controller\Common.php` `captcha()` method (large format: 350x150)
|
|
|
|
## Queue System
|
|
|
|
**Think-Queue (Redis-backed):**
|
|
- Package: `topthink/think-queue` 1.1.6
|
|
- Connector: Redis (`D:\code\php\amlhc\application\extra\queue.php`)
|
|
- Default queue: `default`
|
|
- Config: `application/extra/queue.php`
|
|
- Redis host: `127.0.0.1:6379`
|
|
- No password by default
|
|
- Persistent connection: disabled
|
|
- Task expire: `0` (no expiration)
|
|
- CLI: `php think queue:work` / `php think queue:listen` for processing
|
|
|
|
## Addon/Plugin System
|
|
|
|
**FastAdmin Addons:**
|
|
- Package: `fastadminnet/fastadmin-addons` ~1.4.0
|
|
- Location: `addons/` directory
|
|
- Config: `D:\code\php\amlhc\application\extra\addons.php`
|
|
- Autoload: `false` (manual loading)
|
|
- Hooks: empty by default (configured per addon)
|
|
- Routes: empty by default (configured per addon)
|
|
- PSR-4 autoload: `addons\` -> `addons/` (`composer.json`)
|
|
- Addon lifecycle: `install()`, `uninstall()`, `enable()`, `disable()` methods
|
|
- Example addon: `D:\code\php\amlhc\addons\command\Command.php`
|
|
- Installs menu entries via `Menu::create()`
|
|
- Deletes menu on uninstall via `Menu::delete()`
|
|
- Enable/disable toggles menu visibility
|
|
- Pure mode: removes `application/`, `public/`, `assets/` from addon packages when enabled (`fastadmin.addon_pure_mode: true`)
|
|
- Unknown source addons: blocked by default (`fastadmin.unknownsources: false`)
|
|
- Backup global files on addon enable/disable: enabled (`fastadmin.backup_global_files: true`)
|
|
- CLI: `php think addon` for addon management
|
|
- Admin controller: `D:\code\php\amlhc\application\admin\controller\Addon.php`
|
|
|
|
## ThinkPHP Hooks & Behaviors
|
|
|
|
**Hook Integration Points:**
|
|
- `upload_config_init` - Called when upload config is initialized (`Backend.php`, `Frontend.php`, `Api.php`)
|
|
- `config_init` - Called after config assembly (`Backend.php`, `Frontend.php`)
|
|
- `admin_nologin` - Fired when admin access is denied due to no login (`Backend.php` line 145)
|
|
- `admin_nopermission` - Fired when admin access is denied due to no permission (`Backend.php` line 158)
|
|
- `admin_sidebar_begin` - Fired before sidebar rendering (`Auth.php` line 429)
|
|
- `user_init_successed` - Fired on successful frontend user init (`common/library/Auth.php` line 115)
|
|
- `user_register_successed` - Fired on user registration (`common/library/Auth.php` line 194)
|
|
- `user_login_successed` - Fired on user login (`common/library/Auth.php` line 334)
|
|
- `user_logout_successed` - Fired on user logout (`common/library/Auth.php` line 256)
|
|
- `user_changepwd_successed` - Fired on password change (`common/library/Auth.php` line 283)
|
|
- `user_delete_successed` - Fired on user deletion (`common/library/Auth.php` line 474)
|
|
|
|
**Tags/Behaviors:** Configured in `application/tags.php` with `addon_begin` behavior hook
|
|
|
|
## Email
|
|
|
|
**Mailer:**
|
|
- Package: `fastadminnet/fastadmin-mailer` ^2.0.0
|
|
- SMTP Configuration (`D:\code\php\amlhc\application\extra\site.php`):
|
|
- Type: `1` (SMTP)
|
|
- Host: `smtp.qq.com`
|
|
- Port: `465` (SSL)
|
|
- Verification type: `2` (SSL/TLS)
|
|
- Username/password: configured via admin panel (empty by default)
|
|
- Mail from address: configured via admin panel
|
|
- Used for: email verification, password reset, notifications
|
|
- Config groups: `basic`, `email`, `dictionary`, `user`, `example`
|
|
|
|
## Monitoring & Observability
|
|
|
|
**Error Tracking:**
|
|
- None configured
|
|
|
|
**Logs:**
|
|
- File-based logging (`application/config.php` `log.type => File`, path: `LOG_PATH` typically `runtime/log/`)
|
|
- Level: empty array (logs all levels by default)
|
|
- Auto-record admin logs enabled (`fastadmin.auto_record_log: true`)
|
|
|
|
**Debug/Trace:**
|
|
- App debug mode: configurable via `app.debug` env var (default: `false`)
|
|
- App trace: configurable via `app.trace` env var (default: `false`)
|
|
- SQL explain: disabled by default
|
|
|
|
## CI/CD & Deployment
|
|
|
|
**Hosting:**
|
|
- Self-hosted PHP deployment
|
|
- Web server entry: `D:\code\php\amlhc\public\index.php`
|
|
- Router compatibility: `D:\code\php\amlhc\public\router.php` for PHP built-in server
|
|
- Admin entry: formerly `public/admin.php` (deleted per git status)
|
|
- Install script: formerly `public/install.php` (deleted per git status)
|
|
|
|
**CI Pipeline:**
|
|
- Not detected
|
|
|
|
## Environment Configuration
|
|
|
|
**Required env vars** (via `think\Env` in config files):
|
|
```
|
|
[app]
|
|
debug = false
|
|
trace = false
|
|
|
|
[database]
|
|
hostname = 127.0.0.1
|
|
database = fastadmin
|
|
username = root
|
|
password = (configured)
|
|
hostport = (configured)
|
|
prefix = fa_
|
|
charset = utf8mb4
|
|
debug = false
|
|
```
|
|
|
|
**Secrets location:**
|
|
- `.env` file (present, not committed)
|
|
- Database credentials in env vars
|
|
- SMTP credentials in admin-configurable site settings (`application/extra/site.php`)
|
|
- WeChat app credentials managed via WeChat addon
|
|
- Token key: hardcoded in `application/config.php` `token.key`
|
|
|
|
## Webhooks & Callbacks
|
|
|
|
**Incoming:**
|
|
- Not detected in base configuration
|
|
- Addons may register their own webhook endpoints
|
|
|
|
**Outgoing:**
|
|
- FastAdmin API calls to `https://api.fastadmin.net` for addon marketplace
|
|
- Lottery data scraping to `https://history.macaumarksix.com` (Guzzle HTTP GET)
|
|
- Email sending via SMTP (qq.com)
|
|
|
|
## Internationalization
|
|
|
|
**Supported Languages:**
|
|
- `zh-cn` (Simplified Chinese) - Default
|
|
- `en` (English) (`application/config.php` `allow_lang_list`)
|
|
- Multi-language: disabled by default (`lang_switch_on: false`)
|
|
- Language files in `application/*/lang/zh-cn/`
|
|
- Language loading per controller in base classes (`loadlang()` method)
|
|
- Recent additions: `D:\code\php\amlhc\application\admin\lang\zh-cn\command.php`, `D:\code\php\amlhc\application\admin\lang\zh-cn\history.php`
|
|
|
|
## CORS
|
|
|
|
**Allowed Origins:**
|
|
- `localhost`, `127.0.0.1` (`application/config.php` `fastadmin.cors_request_domain`)
|
|
- Configurable via `fastadmin.cors_request_domain`
|
|
- API module sets CORS headers in `D:\code\php\amlhc\application\api\controller\Common.php` `_initialize()` (line 26-28): exposes `__token__` header for cross-origin token retrieval
|
|
|
|
## Upload Integration
|
|
|
|
**Upload Flow:**
|
|
1. Client uploads to `ajax/upload` (index module) or `api/common/upload` (API module)
|
|
2. `app\common\library\Upload` class handles validation and storage
|
|
3. Files stored in `public/uploads/{year}{mon}{day}/{filemd5}{.suffix}`
|
|
4. Attachment record created in `fa_attachment` table via `app\common\model\Attachment`
|
|
5. CDN URL returned if `cdnurl` is configured
|
|
|
|
---
|
|
|
|
*Integration audit: 2026-04-21*
|