快速上手
在 Hostinger 或自有 VPS 上,10 分钟内完成 AssetHub 安装。
用户与角色
5 个预配置角色,采用 Spatie 权限系统,可按用户精细调整。
产品功能
资产、工作流、维护、折旧、审计日志等。
自定义
无限自定义字段,可更改品牌、语言和主题。
Hostinger 配置
在最便宜的 Single 共享主机套餐上分步部署。
安全与二维码
HTTPS、HMAC 签名 Webhook、审计日志和摄像头二维码扫描。
报表与导出
8 个内置报表,支持 Excel + PDF 导出和日期筛选。
邮件提醒
保修、维护、文档过期和逾期 checkout 提醒。
常见问题
我可以在最便宜的 Hostinger Single 套餐上运行 AssetHub 吗?
可以 — AssetHub 与 Hostinger Single (~$2.99/月) 完全兼容。Single 包含 PHP 8.3、MySQL、原生 Cron Jobs 和免费 SSL — AssetHub 所需的一切。无需 SSH、Composer 或命令行。请参阅 Hostinger 配置 一节获取分步指南。
我需要技术能力才能安装吗?
不需要。基于 Web 的安装器处理一切:需求检查、数据库设置、迁移和管理员账户创建。只需上传文件,在浏览器访问 /install,按向导操作即可。
定时邮件(保修/维护提醒)如何工作?
AssetHub 使用 Laravel 的调度器。你只需配置一个每分钟运行的 cron job,Laravel 会内部分发每项任务到正确的时间(每日 08:00、每月等)。Hostinger 上,请在 hPanel → 高级 → Cron Jobs 配置。如果主机没有 cron,请使用应用内的 Cron URL 配合免费的 cron-job.org 服务。
支持哪些折旧方法?
三种方法:直线法(年度均等折旧)、双倍余额递减法(加速折旧,常用于税务)和工作量法(基于使用,适用于制造设备)。资产价值在每月 1 日自动刷新。
二维码扫描器能在手机上工作吗?
可以 — 通过 html5-qrcode 使用浏览器摄像头,适用于任何现代手机/平板/桌面浏览器。唯一要求是 HTTPS。Hostinger 通过 Let's Encrypt 提供免费 SSL,所以开箱即用。
我可以不写代码添加自己的字段吗?
可以。管理员 → 自定义字段允许你添加无限属性(文本、数字、日期、下拉、文本域、文件、复选框),将它们限定到特定类别,标记为必填,并通过拖拽重新排序 — 全部在 UI 中完成。
AssetHub 支持多少种语言?
开箱即用的 10 种语言:英语、越南语、西班牙语、法语、德语、中文、日语、葡萄牙语(BR)、俄语和阿拉伯语(含完整 RTL 支持)。翻译可在管理员 → Translations 编辑。
概述
AssetHub 是一套基于 Laravel 11、Vue 3 和 Tailwind CSS 构建的完整 IT 资产管理系统。它帮助组织跟踪设备生命周期、管理分配、安排维护、计算折旧并生成详细报表。
二维码跟踪
为每项资产自动生成二维码。使用任何浏览器摄像头扫描。
折旧
3 种方法:直线法、余额递减法、工作量法。
自定义字段
无限自定义属性 — 文本、日期、下拉、文件、复选框。
Webhook
15 种事件类型,支持 HMAC 签名和自动重试。
审计日志
每项变更都被记录,提供完整 diff 查看器。
报表
8 种报表,带图表,支持 Excel 和 PDF 导出。
服务器要求
- PHP 8.2 或更高
- MySQL 5.7+ 或 MariaDB 10.3+
- Composer 2.x
- Node.js 18+ 和 npm 9+
- Web 服务器:Apache 或 Nginx
必需的 PHP 扩展
- OpenSSL, PDO, PDO_MySQL, Mbstring, Tokenizer, XML, Ctype, JSON, GD, Fileinfo
磁盘空间
最低约 200 MB。请为资产照片和文档附件预留额外空间。
安装
方式 A — Web 安装器(推荐)
- 将项目文件上传到 Web 服务器。
- 将域名 document root 指向
public/。 - 设置权限:
storage/和bootstrap/cache/必须可写(chmod 775)。 - 将
.env.example复制为.env,然后运行php artisan key:generate。 - 在浏览器打开
https://yourdomain.com/install。 - 按向导操作 — Requirements → Database → Migrate → Admin Account → Done。
方式 B — CLI 安装
# 1. 安装依赖
composer install --no-dev --optimize-autoloader
npm install
npm run build
# 2. 配置环境
cp .env.example .env
php artisan key:generate
# 3. 编辑 .env 设置数据库凭据
# DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD
# 4. 创建数据库表并播种初始数据
php artisan migrate --seed
# 5. 为上传创建 storage 符号链接
php artisan storage:link
# 6. 为生产缓存配置
php artisan config:cache
php artisan route:cache
php artisan view:cache
# 7. 标记为已安装
echo "Installed" > storage/installed.lock
Wizard Step 2 — Database Configuration
When the wizard reaches Step 2, you must enter the MySQL connection details for the database you created in your hosting panel. The database must already exist (it can be empty — the next wizard step will create the tables).
| Field | Default / Example | Notes |
|---|---|---|
| Host | 127.0.0.1 | Works on 99% of shared hosts (Hostinger, cPanel, Plesk). Keep this default unless your hosting provides a custom MySQL hostname (managed DB services like AWS RDS, DigitalOcean Managed Database). |
| Port | 3306 | Standard MySQL port. Only change if your provider uses a non-standard port (rare). |
| Database name | uXXXXXX_assethub | The full name shown in your hosting panel. Most shared hosts prefix it with your user ID (e.g. Hostinger: u287094729_assethub). |
| Username | uXXXXXX_assethub | MySQL user with permissions on the database above. Do not use root — shared hosts don't allow it. |
| Password | (your DB password) | The password you set or copied when creating the MySQL user. Most hosts show it once on creation — use "View / Reset" if you didn't save it. |
Where to find these credentials by hosting panel
- Hostinger: hPanel → Databases → Management → click your database. The page shows name, username, and a "Show password" button.
- cPanel: cPanel → MySQL Databases. The database list shows names; users are listed below. Use "Change Password" if needed.
- Plesk: Plesk → Databases → click the database name. The detail page shows credentials and offers a password reset.
- DirectAdmin: DirectAdmin → MySQL Management → click the database. Credentials and password reset are on the database detail page.
- External / managed DB: AWS RDS, DigitalOcean Managed Database, etc. Use the custom hostname, port (often
3306but verify), DB name, user, and password from your cloud console. Make sure the server's IP is whitelisted in the DB firewall.
Common errors and how to fix them
| Error message | Cause and fix |
|---|---|
SQLSTATE[HY000] [1045] Access denied | Wrong username or password, or the user doesn't have access to this database. Double-check spelling (including the user prefix on shared hosts). Reset the password in the hosting panel if unsure. |
SQLSTATE[HY000] [1049] Unknown database | The database name is wrong, or you haven't created the database yet in your hosting panel. Create it first, then re-enter the exact name (including any prefix). |
SQLSTATE[HY000] [2002] Connection refused | The MySQL server can't be reached. Verify Host and Port. On shared hosts try localhost instead of 127.0.0.1 or vice versa. For managed DBs, make sure your server IP is whitelisted. |
SQLSTATE[42S02] Base table not found: sessions | Happens when SESSION_DRIVER=database or CACHE_STORE=database is set in .env before the tables exist. Edit .env and change both to file, save, then reload the wizard. You can switch back to database after install if you prefer. |
could not find driver | PHP pdo_mysql extension is missing or disabled. Enable it in your hosting panel (PHP Configuration → Extensions). On Hostinger: hPanel → Advanced → PHP Configuration → PHP Extensions tab. |
127.0.0.1 and 3306) — leave them as-is on shared hosting. You only need to type Database name, Username, and Password. Click Test & Save → to verify the connection and move to Step 3.
本地环境(本地开发)
快速指南:在部署到生产环境之前,在你的电脑上运行 AssetHub 进行测试或开发。选择与你的操作系统匹配的环境。
选项 1 — Laravel Herd(推荐,macOS 与 Windows)
Laravel Herd 是 Laravel 团队的官方本地环境 — 免费、原生、无 Docker。捆绑 PHP 8.2/8.3/8.4、Nginx,以及(Herd Pro 中)MySQL/Redis。
- 从 herd.laravel.com 下载并安装 Laravel Herd。
- 将 AssetHub 项目文件夹放入
~/Herd/(macOS)或%USERPROFILE%\Herd\(Windows)。Herd 自动创建.test域名 — 例如http://assethub.test。 - 打开 Herd → Sites 并确认 PHP 版本为 8.2 或 8.3。右键站点 → Secure 启用 HTTPS(QR 扫描器需要)。
- 创建一个 MySQL 数据库。在 Herd Pro 中使用 Services → MySQL → Open in TablePlus。否则安装 MySQL Community 或使用 SQLite(
DB_CONNECTION=sqlite、touch database/database.sqlite)。 - 将
.env.example复制为.env,填入 DB 凭据,然后在项目根目录运行php artisan key:generate。 - 在浏览器中打开
http://assethub.test/install并按照安装向导操作。
选项 2 — XAMPP(Windows、macOS、Linux)
XAMPP 捆绑 Apache、MySQL/MariaDB 和 PHP。免费且跨平台。务必选择 PHP 8.2 或更高的版本。
- 从 apachefriends.org 下载 XAMPP 8.2+ 并安装。
- 将 AssetHub 项目复制到
C:\xampp\htdocs\AssetHub\(Windows)或/Applications/XAMPP/htdocs/AssetHub/(macOS)。 - 打开 XAMPP Control Panel 并启动 Apache 和 MySQL。如果端口被占用,使用 Config → service.conf 将 Apache 切换到 8080。
- 前往
http://localhost/phpmyadmin→ 新建 → 创建名为assethub的数据库,采用 utf8mb4 排序规则。 - 在项目文件夹中:将
.env.example复制为.env,设置DB_DATABASE=assethub、DB_USERNAME=root、DB_PASSWORD留空(XAMPP 默认)。运行php artisan key:generate。 - 访问
http://localhost/AssetHub/public/install运行安装向导。
/public/ 的简洁 URL:在 C:\xampp\apache\conf\extra\httpd-vhosts.conf 中创建虚拟主机,让 DocumentRoot 指向项目的 public/ 文件夹,然后将 127.0.0.1 assethub.local 添加到 hosts 文件。
选项 3 — Laragon(Windows)
Laragon 是为 Laravel 设计的便携式 Windows 栈 — 自动 vhost、简洁 URL、MySQL/MariaDB 和内置 HeidiSQL。
- 从 laragon.org 下载 Laragon Full 并安装。
- 在 Laragon:菜单 → PHP → Version — 切换到 PHP 8.2 或 8.3。
- 将 AssetHub 项目复制到
C:\laragon\www\AssetHub\。 - 点击 Start All。Laragon 自动创建 vhost:
http://assethub.test(指向public/文件夹)。 - 打开 HeidiSQL(内置)→ 创建数据库
assethub。默认凭据:用户root,密码为空。 - 用 DB 凭据编辑
.env,运行php artisan key:generate,然后访问http://assethub.test/install。
选项 4 — 内置 PHP 服务器(无需 Web 服务器)
最简单的选项:Laravel 自带 artisan serve,可启动开发用 PHP 服务器。不需要 Apache 或 Nginx。最适合快速测试。
# 安装依赖并配置
cd /path/to/AssetHub
composer install
cp .env.example .env
php artisan key:generate
# 运行 migration 并播种初始数据
php artisan migrate --seed
# 启动开发服务器
php artisan serve
# 然后访问: http://127.0.0.1:8000/install
本地环境常见陷阱
QR 扫描器无法在 http:// 上打开摄像头
浏览器摄像头 API 需要 HTTPS,但有一个例外:http://localhost 和 http://127.0.0.1 被视为安全上下文。如果你通过 LAN IP 访问 AssetHub(例如 http://192.168.1.10),摄像头会被拒绝。开发时使用 localhost,或通过 Herd / mkcert 启用 HTTPS。
storage 上的 Permission denied(macOS / Linux)
如果应用尝试写日志或缓存时出现写入错误,修复权限:chmod -R 775 storage bootstrap/cache。Windows 上通常不需要。
端口已被占用
如果端口 8000 被其他应用占用,使用不同端口:
php artisan serve --port=8001
本地测试邮件
在大多数 localhost 设置中,真实 SMTP 不可用。两个安全选项:(1) 在 .env 中设置 MAIL_MAILER=log — 邮件被转储到 storage/logs/laravel.log 而不是发送;或 (2) 使用 Mailtrap / MailHog 将外发邮件捕获到假收件箱。
MAIL_MAILER=log
# 所有邮件都写入 storage/logs/laravel.log
前端资源(Vite / Tailwind)
AssetHub 的 Vue/Tailwind 前端在包中已预构建。如果你编辑 Vue 组件或 Tailwind 配置,需要 Node.js 18+:
npm install
npm run dev # 开发期间的热重载
npm run build # 生产构建(部署前运行)
部署到 Hostinger Single(共享主机)
对于没有 VPS 或技术经验的用户,这是推荐路径。AssetHub 与最便宜的 Hostinger Single Web Hosting 套餐(~$2.99/月)完全兼容。无需 SSH、Composer 或命令行 — Single 自带原生 cron jobs、PHP 8.3 和免费 SSL。
步骤 1 — 准备主机
- 登录 Hostinger hPanel。
- 前往你的域名的 Hosting → 管理。
- 通过 高级 → PHP 配置 将 PHP 版本设置为 8.2 或 8.3。
- 确保启用以下 PHP 扩展(通常默认已启用):
- OpenSSL, PDO, PDO_MySQL, Mbstring, GD, Tokenizer, XML, Ctype, JSON, Fileinfo
步骤 2 — 创建 MySQL 数据库
- 在 hPanel,前往 数据库 → MySQL Databases。
- 点击 创建新数据库。
- 记下这 3 个值:
数据库名— 例如u123_AssetHub用户名— 例如u123_admin密码— 自动生成,请妥善保管
步骤 3 — 上传文件
- 在 hPanel 前往 文件 → File Manager。
- 导航到
public_html/(这是你域名的根目录)。 - 删除该文件夹中任何默认的
index.html或default.php。 - 点击 上传文件,上传整个包中的
source.zip。
或者你也可以通过 FTP 直接上传/source/文件夹内容。 - 如果上传的是 ZIP,右键 → 解压。解压后,所有文件应位于
public_html/的根目录。 - 确认
public_html/包含:app/、public/、vendor/、.htaccess、index.php(在public/中)、.env等。
.htaccess 存在于 public_html/ 根目录,其中包含 URL 重写规则。如果 File Manager 隐藏了隐藏文件,请点击 设置 → 显示隐藏文件。
步骤 4 — 运行安装器
- 打开浏览器访问
https://yourdomain.com/install。 - 你会看到 AssetHub Installer。
- 步骤 1:Requirements — 所有检查应通过(绿色)。若有失败,请联系 Hostinger 支持以启用缺失的 PHP 扩展。
- 步骤 2:Database — 输入上面步骤 2 中的凭据:
- 主机:
localhost - 端口:
3306 - 数据库:
u123_AssetHub - 用户名:
u123_admin - 密码:(Hostinger 生成的那个)
- 主机:
- 步骤 3:Migrate — 点击 "Run Migrations & Seed"。约 10 秒。不要刷新。
- 步骤 4:Admin — 创建管理员账户。使用强密码。
- 完成! — 你会看到 Cron URL(请保存!)和登录按钮。
步骤 5 — 通过 Hostinger Cron 配置自动邮件提醒
AssetHub 使用 Laravel 的调度器处理后台任务:保修提醒、维护提醒、文档过期、折旧刷新和逾期 checkout。在 hPanel 设置一个 cron job,Laravel 会决定何时运行哪项任务。
- 在 hPanel 前往 高级 → Cron Jobs。
- 点击 创建 Cron job。
- 选择类型:Custom(不是 "PHP" — 我们需要传参数)。
- 命令栏输入(将
uXXXXXX替换为你的 Hostinger 账号用户名):
提示:打开 File Manager,定位/usr/bin/php /home/uXXXXXX/public_html/artisan schedule:runartisan文件(项目根目录),右键 → 属性以复制完整路径。 - 将计划设为 每分钟 — 全部五个字段(分、时、日、月、周几)设为
*。 - 点击 保存。
就这样 — AssetHub 现在会自动发送逾期 checkout 提醒、维护提醒、文档过期提醒、保修提醒,并自动刷新资产折旧值。Laravel 会内部按正确频率(每日 08:00、每月等)调度每项任务。
public_html/public/?没问题 — 你的 Laravel 代码仍然在 public_html/ 根目录,所以 cron 路径保持 /home/uXXXX/public_html/artisan(不要加 /public/)。
- 以 admin 身份登录 → 设置 → 系统选项卡 → 复制 Cron URL。
- 在 cron-job.org 免费注册。
- 创建一个 cronjob,粘贴 URL,设置为 每 15 分钟,保存。
步骤 6 — 配置邮件(SMTP)
Hostinger 在每个套餐中提供邮箱账户。要用于 AssetHub 通知:
- 在 hPanel 前往 邮件 → 邮箱账户 并创建一个(例如
noreply@yourdomain.com)。 - 通过 File Manager 编辑
public_html/中的.env文件:MAIL_MAILER=smtp MAIL_HOST=smtp.hostinger.com MAIL_PORT=587 MAIL_USERNAME=noreply@yourdomain.com MAIL_PASSWORD=your_email_password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=noreply@yourdomain.com MAIL_FROM_NAME="Your Company Name" - 保存文件。
- 登录 AssetHub → 设置 → 邮件选项卡 → 发送测试邮件。如果收到,即完成。
Hostinger Single 常见问题
上传后 "500 Internal Server Error"
- 确认
.htaccess存在于public_html/根目录,并包含重写规则。 - 确认 hPanel 中的 PHP 版本为 8.2 或 8.3。
- 通过 File Manager 检查
storage/logs/laravel.log查看真正的错误。
上传时 "Permission denied"
Hostinger 通常会设置正确权限,如果没有:
- 在 File Manager 右键
storage/→ 权限 → 递归设为755。 - 对
bootstrap/cache/做同样操作。
二维码扫描器无法打开摄像头
浏览器摄像头 API 需要 HTTPS。Hostinger 通过 Let's Encrypt 提供免费 SSL — 在 hPanel SSL → 管理 中启用。
定时邮件未发送
- 在 hPanel → Cron Jobs → 查看 cron 条目的 Last run 列。如果为空,cron 没在执行 — 检查 artisan 路径是否正确。
- 手动测试命令:在 hPanel 中打开 Terminal(若可用)并运行 cron 命令。如果报错,错误信息会指出问题(PHP 版本错误、路径错误等)。
- 确认 SMTP 配置正确(设置 → 邮件 → 发送测试)。
- 检查
storage/logs/laravel.log中是否有调度器错误。
性能慢
Hostinger Single 是共享 CPU/RAM。如果团队超过 20 人,考虑:
- 升级到 Premium(~$3.99/月)— 更快的服务器、更多资源、多个数据库。
- 或 Business(~$5.99/月)— 专用资源、每日备份、staging 环境。
配置
.env 文件
| 键 | 描述 | 示例 |
|---|---|---|
APP_NAME | 在标题栏显示的应用名称 | AssetHub |
APP_URL | 你安装的公共 URL | https://assets.example.com |
APP_DEBUG | 生产环境设为 false | false |
DB_* | 数据库连接详情 | mysql, 127.0.0.1, 3306, ... |
MAIL_MAILER | 邮件驱动 | smtp, log, mailgun |
MAIL_HOST | SMTP 服务器主机名 | smtp.gmail.com |
MAIL_PORT | SMTP 端口 | 587 |
MAIL_USERNAME | SMTP 用户名 | your@email.com |
MAIL_PASSWORD | SMTP 密码或 app token | ********** |
MAIL_FROM_ADDRESS | 默认 From 地址 | noreply@example.com |
应用内设置
大部分非敏感选项可从 管理员 → 设置 配置:
- 常规:公司名/邮箱/电话,asset tag 前缀
- 邮件:发送测试邮件以验证 SMTP
- 通知:保修提醒阈值,维护提醒窗口
- 本地化:时区、日期格式、货币
多语言支持
AssetHub 开箱即用支持 10 种语言,包括 RTL 阿拉伯语。用户通过右上角的国旗下拉菜单切换语言。
内置语言
| 代码 | 语言 | 方向 |
|---|---|---|
en | English (default) | LTR |
vi | Tiếng Việt | LTR |
es | Español | LTR |
fr | Français | LTR |
de | Deutsch | LTR |
zh | 简体中文 | LTR |
ja | 日本語 | LTR |
pt-BR | Português (Brasil) | LTR |
ru | Русский | LTR |
ar | العربية | RTL |
如何切换语言
- 点击右上角的国旗图标打开下拉菜单。
- 从列表中选择您的语言。
- 页面重新加载;所有 UI 标签、日期和货币格式都会切换。
- 您的选择同时保存在用户账户和 Cookie(1 年有效期)中。
/locale/{code},仅在 PHP 服务器运行时有效。请始终通过您的真实域名(生产环境)或 http://localhost:8000(开发环境配合 php artisan serve)访问。而像本文档这样的文档文件是完全独立的,可以直接打开。
添加自定义语言(管理员)
管理员 → 设置 → 翻译:
- 点击 "添加 Locale" — 提供代码(例如泰语
th)、显示名称、本地名称、国旗、方向以及要复制翻译的基础语言。 - 在翻译编辑器中内联编辑翻译,或通过 CSV 导入/导出。
- 数据库中的翻译会自动覆盖文件中的翻译。
每个用户的默认语言
每个用户都有 locale 列。得益于 Laravel 的 HasLocalePreference 契约,邮件通知会自动以收件人偏好语言发送。
功能列表
资产管理
- 自动生成 asset tag
- 每项资产多张图片
- 二维码生成
- 状态与状况跟踪
- 批量导入/导出
- 克隆资产
工作流
- 分配/归还/转移
- 基于审批的请求
- Check-in / Check-out 预约
- 冲突检测
维护
- 计划预防性/纠正性维护
- 日历视图
- 自动计划下一次
- 成本跟踪
- 邮件提醒
文档
- 附加发票、手册
- 内嵌预览
- 过期提醒
- 多种文档类型
折旧
- 3 种计算方法
- 自动更新价值
- 进度图表
- 年度汇总
报表
- 8 种报表
- Excel + PDF 导出
- 图表与仪表盘
- 日期筛选
用户与角色
AssetHub 自带 5 个预配置角色:
| 角色 | 能力 |
|---|---|
| Admin | 完整系统访问 — 用户、部门、设置、审计日志、Webhook、翻译 |
| IT 经理 | 管理资产、类别、维护、请求;批准转移;查看报表与折旧 |
| 会计 | 管理资产与折旧、运行库存盘点、批准转移、完整报表访问(财务侧重) |
| 主管 | 批准部门请求、管理 checkout、参与库存盘点、查看报表 |
| 员工 | 查看已分配资产、创建请求、管理自己的 checkout |
权限以 Spatie 角色形式存储 — 管理员可通过数据库按权限精细调整。
资产管理
创建资产
- 导航到 资产 → 新资产。
- 填写名称、类别、品牌、型号、序列号。
- 添加购买日期和价格(折旧必填)。
- 上传图片(支持多文件,每文件最大 5 MB)。
- 保存 — asset tag 和二维码会自动生成。
Asset Tag 格式
默认:{PREFIX}-{YEAR}-{NNNN},例如 AS-2026-0001。可通过 设置 → 常规 → Asset Tag 前缀 配置。
批量导入
- 在资产页面点击 导入。
- 下载 Excel 模板。
- 填入你的数据 — 必填列:
name、category_name。 - 上传文件。
二维码
每项资产创建时自动获得二维码。二维码编码资产 URL,扫描后直接进入资产详情页。
打印标签
- 单个标签:点击任意资产行的打印机图标。
- PDF 格式:A4,每行 2 个标签,包含 asset tag、名称、品牌、序列号。
扫描
在资产页面点击 扫描二维码。允许摄像头权限。扫描器使用 html5-qrcode,在任何现代浏览器上工作。注意:摄像头访问需要 HTTPS 或 localhost。
工作流
资产分配
- 打开资产详情页。
- 点击 分配(资产可用时显示)。
- 选择用户、可选归还日期、备注。
- 提交 — 交易创建,邮件通知发送。
资产请求
员工可以提交他们需要的资产请求。请求有 4 种状态:pending → approved → fulfilled,或 rejected。审批邮件自动发送。
Check-in / Check-out
针对共享资产(相机、投影仪、车辆)。预约有日期范围;系统阻止 checkout 重叠。日历视图一目了然显示所有预约。
折旧
AssetHub 使用以下三种方法之一计算资产折旧:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| 直线法 | (Cost - Salvage) / Useful Life | 最常用;年度均等折旧 |
| 余额递减法 | 2 / Useful Life × Book Value | 加速;税务用途 |
| 工作量法 | 基于使用 | 制造设备 |
默认值继承自资产的类别。进度条目按月生成。资产的 current_value 在每月 1 日自动更新。
自定义字段
管理员 → 自定义字段让你为资产添加无限自定义属性:
- 类型:文本、数字、日期、选择(下拉)、文本域、文件、复选框
- 范围:适用于所有类别或指定类别
- 重新排序:拖动把手
- 必填字段在保存资产时验证
报表
8 个内置报表,可从报表菜单访问:
- 资产汇总 — 按状态、状况、类别、部门统计
- 折旧 — 各类别价值损失,折旧最多的资产
- 交易 — 一段时间内的分配、归还、转移活动
- 维护成本 — 按月、类别、类型的支出
- 保修过期 — 30/60/180 天内需关注的资产
- 部门资产 — 各部门的资产分布与预算利用率
- 资产来源 — 在采购、项目、捐赠、转移等来源的分布
- 库存盘点汇总 — 周期性盘点中的差异
所有报表通过页头按钮支持 Excel 和 PDF 导出。
Webhook
AssetHub 可在关键事件发生时通知外部服务。
可用事件
asset.created,asset.updated,asset.deletedasset.assigned,asset.returned,asset.transferredrequest.created,request.approved,request.rejected,request.fulfilledmaintenance.scheduled,maintenance.started,maintenance.completedcheckout.created,checkout.returned
Payload 格式
{
"event": "asset.assigned",
"timestamp": "2026-05-05T08:00:00+00:00",
"data": {
"asset_id": 1,
"asset_tag": "AS-2026-0001",
"asset_name": "HP EliteDesk 800",
"to_user_id": 4,
"transaction_id": 12
}
}
签名验证
如配置了 secret,请求会包含头部 X-AssetHub-Signature,内容为 payload body 的 HMAC-SHA256。在你侧验证:
$expected = hash_hmac('sha256', $rawBody, $secret);
if (hash_equals($expected, $request->header('X-AssetHub-Signature'))) {
// 有效
}
重试策略
失败投递会以 200 ms 延迟重试 3 次。连续失败 10 次后,webhook 会被自动禁用。
计划任务
AssetHub 使用 Laravel 调度器执行后台 job。你只需一条 cron 条目 — Laravel 会内部在正确时间调度每个 job。
Hostinger / 共享主机(hPanel Cron Jobs UI)
参见 Hostinger 配置 → 步骤 5 一节的截图式说明。简言之:高级 → Cron Jobs → Custom,命令:
/usr/bin/php /home/uXXXXXX/public_html/artisan schedule:run
计划:每分钟(五个字段都用 *)。
VPS / 专用服务器(crontab)
以 Web 用户(通常是 www-data)运行 crontab -e,加入:
* * * * * cd /path/to/AssetHub && php artisan schedule:run >> /dev/null 2>&1
备选:外部 URL pinger
如果你的主机完全没有 cron,使用应用内的 Cron URL(设置 → 系统选项卡)配合 cron-job.org(免费,每 15 分钟)。
自动运行的 job
| 时间 | 命令 | 用途 |
|---|---|---|
| 每日 08:00 | send-overdue-checkout-alerts | 逾期 checkout 的邮件提醒 |
| 每日 08:30 | send-maintenance-reminders | 即将到来的维护提醒 |
| 每日 09:00 | send-document-expiry-alerts | 30/14/7/1 天内到期的文档 |
| 每日 09:30 | send-warranty-alerts | 保修 + 保险到期提醒 |
| 每日 10:00 | assethub:send-depreciation-end-alerts | 资产达到使用寿命终点时的提醒 |
| 每日 10:30 | send-inventory-audit-reminders | 活跃库存盘点的提醒 |
| 每月 1 日 02:00 | update-asset-values | 从折旧刷新资产 current_value |
故障排查
storage 上 "Permission denied"
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
二维码扫描器无法打开摄像头
浏览器摄像头 API 需要 HTTPS。安装 SSL 证书,或使用 localhost 测试。
邮件未到达
查看 storage/logs/laravel.log 中的错误。使用 设置 → 邮件 → 发送测试邮件 验证 SMTP 凭据。确保你的 SMTP 服务器允许发送 IP。
重置安装
删除 storage/installed.lock 并再次访问 /install。如果重新运行 migration,现有数据将被擦除。
性能 — 资产列表慢
运行 php artisan optimize 缓存 config、route、view。确保 MySQL 在 assets.asset_tag、assets.serial_number、assets.status 上有索引(migration 已自动创建)。
更新日志
v1.0.0 — 初始发布(2026-05)
- 资产 CRUD,二维码自动生成
- 5 个用户角色(Admin、IT 经理、会计、主管、员工),细粒度权限
- 资产来源跟踪(集中采购、分散采购、投资项目、捐赠、内部转移)
- 分配、归还工作流,邮件通知
- 转移审批工作流(pending → approved/rejected),含权限门控
- 资产请求审批流
- Check-in/check-out 带日历视图
- 维护计划带自动续期
- 文档附件带过期提醒
- 3 种计算方法的折旧 + 寿命终点提醒
- 库存盘点模块 — 周期性盘点带差异跟踪
- 自定义字段,7 种输入类型,拖拽排序
- 8 种报表带图表,Excel 和 PDF 导出(含资产来源、库存盘点汇总)
- 通过 Spatie Activitylog 实现审计日志,带 diff 查看器
- Webhook,HMAC 签名,自动重试
- 多语言 UI:10 种语言(en、vi、es、fr、de、zh、ja、pt-BR、ru、ar 含 RTL)
- 设置 UI:公司、邮件、通知、本地化、翻译
- Web 安装向导
- Emerald-Teal 品牌色板的深色模式
致谢
使用的开源库
- Laravel 11 — MIT
- Vue 3 — MIT
- Inertia.js — MIT
- Tailwind CSS — MIT
- Spatie Permission, Media Library, Activitylog — MIT
- Phosphor Icons — MIT (duotone weight)
- ApexCharts — MIT
- html5-qrcode — Apache 2.0
- Simple QrCode — MIT
- Laravel Excel — MIT
- Laravel DomPDF — MIT