# 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*