档案管理系统按使用时间设置收费标准全流程实操指南
本指南针对需要给档案管理系统新增「按使用时间计费」收费标准的开发者,零门槛,所有代码可直接复制使用,所有步骤均可一步到位落地。
一、前期准备
1.1 基础环境准备
如果你已经有可二次开发的档案管理系统,可以直接跳过本步骤;若还没有,直接克隆开源可商用的档案管理系统到本地,执行以下命令:
``` git clone https://gitee.com/dromara/jiuye-archives.git ```本地运行环境直接下载phpStudy集成包,地址:https://www.xp.cn/download.html,按照引导完成安装即可,无需额外修改配置。
1.2 数据库准备
创建数据库名为archives,字符集选择utf8mb4_general_ci,导入系统自带的初始化SQL后,再新增我们按时间收费需要的表。
二、新增收费标准数据表
我们需要一张表存储不同档位按时间计费的收费标准,直接复制以下SQL到数据库执行,即可完成建表:
```sql CREATE TABLE `archive_time_charge` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `plan_name` varchar(64) NOT NULL COMMENT '套餐名称', `time_unit` varchar(10) NOT NULL COMMENT '时间单位:day/天,month/月,year/年', `unit_price` decimal(10,2) NOT NULL COMMENT '单位时长价格', `is_default` tinyint(1) DEFAULT 0 COMMENT '是否默认:0否1是', `status` tinyint(1) DEFAULT 1 COMMENT '状态:0禁用1启用', `create_time` int(11) NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='按使用时间收费标准表'; ```建表完成后,可插入一条测试数据,方便后续测试:
```sql INSERT INTO `archive_time_charge` (`id`, `plan_name`, `time_unit`, `unit_price`, `is_default`, `status`, `create_time`) VALUES (1, '月度基础版', 'month', '99.00', 1, 1, UNIX_TIMESTAMP()); ```三、后端核心逻辑开发
3.1 新增收费标准的增删改查接口
在系统的收费模块新增控制器方法,代码可直接复制,适配主流ThinkPHP框架,其他框架只需要修改数据库调用语法即可:
```php // 获取所有启用的收费标准列表 public function getChargeList() { $list = Db::name('archive_time_charge')->where('status',1)->select(); return json(['code'=>200,'data'=>$list,'msg'=>'获取成功']); } // 新增/编辑收费标准 public function saveCharge(Request $request) { $data = $request->only(['plan_name','time_unit','unit_price','is_default','status','id']); if(empty($data['id'])){ $data['create_time'] = time(); Db::name('archive_time_charge')->insert($data); }else{ Db::name('archive_time_charge')->where('id',$data['id'])->update($data); } return json(['code'=>200,'msg'=>'保存成功']); } ```3.2 到期时间计算核心逻辑

用户购买对应时长后,需要根据开通时间计算到期时间,核心代码如下,两种计算方式可按需选择,默认使用第一种自然周期计算,符合绝大多数场景需求:
```php // 参数说明:$startTime 开通时间(Unix时间戳),$duration 购买时长,$unit 时间单位 function calculateExpireTime($startTime, $duration, $unit) { // 方式1:按自然周期计算(买1个月就是到下个月对应日期,适合按自然月/年计费) $expireTime = strtotime("+{$duration} {$unit}", $startTime); // 方式2:按固定时长计算(1个月=30天,适合按固定天数计费,需要时解开注释即可) // $secondMap = ['day'=>86400, 'month'=>2592000, 'year'=>31536000]; // $expireTime = $startTime + $duration $secondMap[$unit]; return $expireTime; } ```3.3 访问权限校验逻辑
按使用时间收费的核心是到期自动拦截访问,我们在系统全局中间件中加入以下校验逻辑,所有访问都会自动校验:
```php // 全局中间件中加入以下代码 public function handle($request, \Closure $next) { $user = session('user_info'); // 仅校验非管理员的普通用户 if($user && !$user['is_admin']){ $expireTime = $user['expire_time']; // 如果到期时间小于当前时间,拦截访问 if($expireTime < time()){ return response('您的使用权限已到期,请续费后继续访问', 403); } } return $next($request); } ```你只需要将`$user['expire_time']`替换为你系统中存储用户到期时间的字段即可,适配非常简单。
四、后台管理页面配置
在管理员后台新增「收费标准管理」菜单,页面主体直接复制以下HTML代码即可使用:
```html| 套餐名称 | 时间单位 | 单位价格(元) | 状态 | 操作 |
|---|
引入页面后调用上面写好的`getChargeList`接口渲染列表即可,操作逻辑和普通后台列表完全一致,无需额外复杂配置。
五、测试验证流程
- 步骤1:登录管理员后台,进入收费标准管理页面,新增「按天收费」档位,设置单位价格1元,启用状态,确认保存成功。
- 步骤2:创建普通测试用户,购买10天使用权限,调用计算到期时间接口,查看用户信息中的到期时间,确认和预期结果一致。
- 步骤3:修改本地系统时间为到期日后一天,登录普通用户账号,尝试访问档案,确认被自动拦截,提示到期。
- 步骤4:给测试用户续费30天,查看到期时间更新正确,重新登录可以正常访问档案。
常见需求调整
如果需要给不同容量的档案存储设置不同的按时间收费标准,只需要在archive_time_charge表中新增一个storage_size字段,存储该套餐对应的最大容量,然后在权限校验逻辑中新增已用存储判断即可,无需改动原有核心逻辑。
如果需要支持免费试用,只需要新增一个默认试用套餐,设置7天时长,0元价格,新用户注册自动开通即可,所有逻辑复用现有按时间收费逻辑,无需额外开发。
如果需要按账户人数叠加收费,只需要用「单人人次单位价格 × 人数 × 时长」计算总价格,原有时间计算和权限逻辑完全复用,仅需修改价格计算的乘法因子即可。