mirror of
https://github.com/v2board/v2board.git
synced 2025-03-13 14:14:42 +08:00
测试:增加设备数限制功能
This commit is contained in:
parent
dffe39b6d9
commit
ac38036f8e
@ -45,6 +45,7 @@ class PlanController extends Controller
|
|||||||
User::where('plan_id', $plan->id)->update([
|
User::where('plan_id', $plan->id)->update([
|
||||||
'group_id' => $params['group_id'],
|
'group_id' => $params['group_id'],
|
||||||
'transfer_enable' => $params['transfer_enable'] * 1073741824,
|
'transfer_enable' => $params['transfer_enable'] * 1073741824,
|
||||||
|
'device_limit' => $params['device_limit'],
|
||||||
'speed_limit' => $params['speed_limit']
|
'speed_limit' => $params['speed_limit']
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -157,16 +157,17 @@ class UserController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = "邮箱,余额,推广佣金,总流量,剩余流量,套餐到期时间,订阅计划,订阅地址\r\n";
|
$data = "邮箱,余额,推广佣金,总流量,设备数限制,剩余流量,套餐到期时间,订阅计划,订阅地址\r\n";
|
||||||
foreach($res as $user) {
|
foreach($res as $user) {
|
||||||
$expireDate = $user['expired_at'] === NULL ? '长期有效' : date('Y-m-d H:i:s', $user['expired_at']);
|
$expireDate = $user['expired_at'] === NULL ? '长期有效' : date('Y-m-d H:i:s', $user['expired_at']);
|
||||||
$balance = $user['balance'] / 100;
|
$balance = $user['balance'] / 100;
|
||||||
$commissionBalance = $user['commission_balance'] / 100;
|
$commissionBalance = $user['commission_balance'] / 100;
|
||||||
$transferEnable = $user['transfer_enable'] ? $user['transfer_enable'] / 1073741824 : 0;
|
$transferEnable = $user['transfer_enable'] ? $user['transfer_enable'] / 1073741824 : 0;
|
||||||
|
$deviceLimit = $user['devce_limit'] ? $user['devce_limit'] : NULL;
|
||||||
$notUseFlow = (($user['transfer_enable'] - ($user['u'] + $user['d'])) / 1073741824) ?? 0;
|
$notUseFlow = (($user['transfer_enable'] - ($user['u'] + $user['d'])) / 1073741824) ?? 0;
|
||||||
$planName = $user['plan_name'] ?? '无订阅';
|
$planName = $user['plan_name'] ?? '无订阅';
|
||||||
$subscribeUrl = Helper::getSubscribeUrl('/api/v1/client/subscribe?token=' . $user['token']);
|
$subscribeUrl = Helper::getSubscribeUrl('/api/v1/client/subscribe?token=' . $user['token']);
|
||||||
$data .= "{$user['email']},{$balance},{$commissionBalance},{$transferEnable},{$notUseFlow},{$expireDate},{$planName},{$subscribeUrl}\r\n";
|
$data .= "{$user['email']},{$balance},{$commissionBalance},{$transferEnable}, {$deviceLimit}, {$notUseFlow},{$expireDate},{$planName},{$subscribeUrl}\r\n";
|
||||||
}
|
}
|
||||||
echo "\xEF\xBB\xBF" . $data;
|
echo "\xEF\xBB\xBF" . $data;
|
||||||
}
|
}
|
||||||
@ -185,6 +186,7 @@ class UserController extends Controller
|
|||||||
'plan_id' => isset($plan->id) ? $plan->id : NULL,
|
'plan_id' => isset($plan->id) ? $plan->id : NULL,
|
||||||
'group_id' => isset($plan->group_id) ? $plan->group_id : NULL,
|
'group_id' => isset($plan->group_id) ? $plan->group_id : NULL,
|
||||||
'transfer_enable' => isset($plan->transfer_enable) ? $plan->transfer_enable * 1073741824 : 0,
|
'transfer_enable' => isset($plan->transfer_enable) ? $plan->transfer_enable * 1073741824 : 0,
|
||||||
|
'device_limit' => isset($plan->device_limit) ? $plan->device_limit : NULL,
|
||||||
'expired_at' => $request->input('expired_at') ?? NULL,
|
'expired_at' => $request->input('expired_at') ?? NULL,
|
||||||
'uuid' => Helper::guid(true),
|
'uuid' => Helper::guid(true),
|
||||||
'token' => Helper::guid()
|
'token' => Helper::guid()
|
||||||
@ -220,6 +222,7 @@ class UserController extends Controller
|
|||||||
'plan_id' => isset($plan->id) ? $plan->id : NULL,
|
'plan_id' => isset($plan->id) ? $plan->id : NULL,
|
||||||
'group_id' => isset($plan->group_id) ? $plan->group_id : NULL,
|
'group_id' => isset($plan->group_id) ? $plan->group_id : NULL,
|
||||||
'transfer_enable' => isset($plan->transfer_enable) ? $plan->transfer_enable * 1073741824 : 0,
|
'transfer_enable' => isset($plan->transfer_enable) ? $plan->transfer_enable * 1073741824 : 0,
|
||||||
|
'device_limit' => isset($plan->device_limit) ? $plan->device_limit : NULL,
|
||||||
'expired_at' => $request->input('expired_at') ?? NULL,
|
'expired_at' => $request->input('expired_at') ?? NULL,
|
||||||
'uuid' => Helper::guid(true),
|
'uuid' => Helper::guid(true),
|
||||||
'token' => Helper::guid(),
|
'token' => Helper::guid(),
|
||||||
|
@ -153,6 +153,7 @@ class AuthController extends Controller
|
|||||||
$plan = Plan::find(config('v2board.try_out_plan_id'));
|
$plan = Plan::find(config('v2board.try_out_plan_id'));
|
||||||
if ($plan) {
|
if ($plan) {
|
||||||
$user->transfer_enable = $plan->transfer_enable * 1073741824;
|
$user->transfer_enable = $plan->transfer_enable * 1073741824;
|
||||||
|
$user->device_limit = $plan->device_limit;
|
||||||
$user->plan_id = $plan->id;
|
$user->plan_id = $plan->id;
|
||||||
$user->group_id = $plan->group_id;
|
$user->group_id = $plan->group_id;
|
||||||
$user->expired_at = time() + (config('v2board.try_out_hour', 1) * 3600);
|
$user->expired_at = time() + (config('v2board.try_out_hour', 1) * 3600);
|
||||||
|
@ -43,6 +43,20 @@ class UniProxyController extends Controller
|
|||||||
$users = $this->serverService->getAvailableUsers($this->nodeInfo->group_id);
|
$users = $this->serverService->getAvailableUsers($this->nodeInfo->group_id);
|
||||||
$users = $users->toArray();
|
$users = $users->toArray();
|
||||||
|
|
||||||
|
$users = array_map(function ($user) {
|
||||||
|
$count =0;
|
||||||
|
$ips_array = Cache::get('ALIVE_IP_USER_'. $user['id']);
|
||||||
|
if ($ips_array) {
|
||||||
|
foreach ($ips_array as $nodeid => $ip_array) {
|
||||||
|
foreach ($ip_array['aliveips'] as $ip) {
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$user['alive_ip'] = $count;
|
||||||
|
return $user;
|
||||||
|
}, $users);
|
||||||
|
|
||||||
$response['users'] = $users;
|
$response['users'] = $users;
|
||||||
|
|
||||||
$eTag = sha1(json_encode($response));
|
$eTag = sha1(json_encode($response));
|
||||||
@ -68,6 +82,41 @@ class UniProxyController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 后端提交在线数据
|
||||||
|
public function alive(Request $request)
|
||||||
|
{
|
||||||
|
$data = file_get_contents('php://input');
|
||||||
|
$data = json_decode($data, true);
|
||||||
|
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
|
||||||
|
// JSON decoding error
|
||||||
|
return response([
|
||||||
|
'error' => 'Invalid online data'
|
||||||
|
], 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($data as $k => $v) {
|
||||||
|
$updateAt = time();
|
||||||
|
$oldips_array = Cache::get('ALIVE_IP_USER_'. $k) ?? [];
|
||||||
|
|
||||||
|
// 更新节点数据
|
||||||
|
$oldips_array[$this->nodeId] = ['aliveips' => $v, 'lastupdateAt' => $updateAt];
|
||||||
|
//删除过期节点在线数据
|
||||||
|
$expired_array = [];
|
||||||
|
foreach($oldips_array as $nodeid => $oldips) {
|
||||||
|
if ($updateAt - $oldips['lastupdateAt'] > 300){
|
||||||
|
$expired_array[$nodeid] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 清理过期数据并存回缓存
|
||||||
|
$new_array = array_diff_key($oldips_array, $expired_array);
|
||||||
|
Cache::put('ALIVE_IP_USER_'. $k, $new_array, 120);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response([
|
||||||
|
'data' => true
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
// 后端获取配置
|
// 后端获取配置
|
||||||
public function config(Request $request)
|
public function config(Request $request)
|
||||||
{
|
{
|
||||||
|
@ -87,6 +87,7 @@ class UserController extends Controller
|
|||||||
->select([
|
->select([
|
||||||
'email',
|
'email',
|
||||||
'transfer_enable',
|
'transfer_enable',
|
||||||
|
'device_limit',
|
||||||
'last_login_at',
|
'last_login_at',
|
||||||
'created_at',
|
'created_at',
|
||||||
'banned',
|
'banned',
|
||||||
@ -138,6 +139,7 @@ class UserController extends Controller
|
|||||||
'u',
|
'u',
|
||||||
'd',
|
'd',
|
||||||
'transfer_enable',
|
'transfer_enable',
|
||||||
|
'device_limit',
|
||||||
'email',
|
'email',
|
||||||
'uuid'
|
'uuid'
|
||||||
])
|
])
|
||||||
|
@ -18,6 +18,7 @@ class PlanSave extends FormRequest
|
|||||||
'content' => '',
|
'content' => '',
|
||||||
'group_id' => 'required',
|
'group_id' => 'required',
|
||||||
'transfer_enable' => 'required',
|
'transfer_enable' => 'required',
|
||||||
|
'device_limit' => 'nullable|integer',
|
||||||
'month_price' => 'nullable|integer',
|
'month_price' => 'nullable|integer',
|
||||||
'quarter_price' => 'nullable|integer',
|
'quarter_price' => 'nullable|integer',
|
||||||
'half_year_price' => 'nullable|integer',
|
'half_year_price' => 'nullable|integer',
|
||||||
@ -40,6 +41,7 @@ class PlanSave extends FormRequest
|
|||||||
'type.in' => '套餐类型格式有误',
|
'type.in' => '套餐类型格式有误',
|
||||||
'group_id.required' => '权限组不能为空',
|
'group_id.required' => '权限组不能为空',
|
||||||
'transfer_enable.required' => '流量不能为空',
|
'transfer_enable.required' => '流量不能为空',
|
||||||
|
'device_limit.integer' => '设备数限制格式有误',
|
||||||
'month_price.integer' => '月付金额格式有误',
|
'month_price.integer' => '月付金额格式有误',
|
||||||
'quarter_price.integer' => '季付金额格式有误',
|
'quarter_price.integer' => '季付金额格式有误',
|
||||||
'half_year_price.integer' => '半年付金额格式有误',
|
'half_year_price.integer' => '半年付金额格式有误',
|
||||||
|
@ -14,7 +14,7 @@ class UserFetch extends FormRequest
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'filter.*.key' => 'required|in:id,email,transfer_enable,d,expired_at,uuid,token,invite_by_email,invite_user_id,plan_id,banned,remarks,is_admin',
|
'filter.*.key' => 'required|in:id,email,transfer_enable,device_limit,d,expired_at,uuid,token,invite_by_email,invite_user_id,plan_id,banned,remarks,is_admin',
|
||||||
'filter.*.condition' => 'required|in:>,<,=,>=,<=,模糊,!=',
|
'filter.*.condition' => 'required|in:>,<,=,>=,<=,模糊,!=',
|
||||||
'filter.*.value' => 'required'
|
'filter.*.value' => 'required'
|
||||||
];
|
];
|
||||||
|
@ -17,6 +17,7 @@ class UserUpdate extends FormRequest
|
|||||||
'email' => 'required|email:strict',
|
'email' => 'required|email:strict',
|
||||||
'password' => 'nullable|min:8',
|
'password' => 'nullable|min:8',
|
||||||
'transfer_enable' => 'numeric',
|
'transfer_enable' => 'numeric',
|
||||||
|
'device_limit' => 'nullable|integer',
|
||||||
'expired_at' => 'nullable|integer',
|
'expired_at' => 'nullable|integer',
|
||||||
'banned' => 'required|in:0,1',
|
'banned' => 'required|in:0,1',
|
||||||
'plan_id' => 'nullable|integer',
|
'plan_id' => 'nullable|integer',
|
||||||
@ -40,6 +41,7 @@ class UserUpdate extends FormRequest
|
|||||||
'email.required' => '邮箱不能为空',
|
'email.required' => '邮箱不能为空',
|
||||||
'email.email' => '邮箱格式不正确',
|
'email.email' => '邮箱格式不正确',
|
||||||
'transfer_enable.numeric' => '流量格式不正确',
|
'transfer_enable.numeric' => '流量格式不正确',
|
||||||
|
'device_limit.integer' => '设备数限制格式不正确',
|
||||||
'expired_at.integer' => '到期时间格式不正确',
|
'expired_at.integer' => '到期时间格式不正确',
|
||||||
'banned.required' => '是否封禁不能为空',
|
'banned.required' => '是否封禁不能为空',
|
||||||
'banned.in' => '是否封禁格式不正确',
|
'banned.in' => '是否封禁格式不正确',
|
||||||
|
@ -17,6 +17,7 @@ class UserUpdate extends FormRequest
|
|||||||
'email' => 'required|email:strict',
|
'email' => 'required|email:strict',
|
||||||
'password' => 'nullable',
|
'password' => 'nullable',
|
||||||
'transfer_enable' => 'numeric',
|
'transfer_enable' => 'numeric',
|
||||||
|
'device_limit' => 'nullable|integer',
|
||||||
'expired_at' => 'nullable|integer',
|
'expired_at' => 'nullable|integer',
|
||||||
'banned' => 'required|in:0,1',
|
'banned' => 'required|in:0,1',
|
||||||
'plan_id' => 'nullable|integer',
|
'plan_id' => 'nullable|integer',
|
||||||
@ -35,6 +36,7 @@ class UserUpdate extends FormRequest
|
|||||||
'email.required' => '邮箱不能为空',
|
'email.required' => '邮箱不能为空',
|
||||||
'email.email' => '邮箱格式不正确',
|
'email.email' => '邮箱格式不正确',
|
||||||
'transfer_enable.numeric' => '流量格式不正确',
|
'transfer_enable.numeric' => '流量格式不正确',
|
||||||
|
'device_limit.integer' => '设备数限制格式不正确',
|
||||||
'expired_at.integer' => '到期时间格式不正确',
|
'expired_at.integer' => '到期时间格式不正确',
|
||||||
'banned.required' => '是否封禁不能为空',
|
'banned.required' => '是否封禁不能为空',
|
||||||
'banned.in' => '是否封禁格式不正确',
|
'banned.in' => '是否封禁格式不正确',
|
||||||
|
@ -269,6 +269,7 @@ class OrderService
|
|||||||
$this->user->expired_at = time();
|
$this->user->expired_at = time();
|
||||||
}
|
}
|
||||||
$this->user->transfer_enable = $plan->transfer_enable * 1073741824;
|
$this->user->transfer_enable = $plan->transfer_enable * 1073741824;
|
||||||
|
$this->user->device_limit = $plan->device_limit;
|
||||||
// 从一次性转换到循环
|
// 从一次性转换到循环
|
||||||
if ($this->user->expired_at === NULL) $this->buyByResetTraffic();
|
if ($this->user->expired_at === NULL) $this->buyByResetTraffic();
|
||||||
// 新购
|
// 新购
|
||||||
@ -282,6 +283,7 @@ class OrderService
|
|||||||
{
|
{
|
||||||
$this->buyByResetTraffic();
|
$this->buyByResetTraffic();
|
||||||
$this->user->transfer_enable = $plan->transfer_enable * 1073741824;
|
$this->user->transfer_enable = $plan->transfer_enable * 1073741824;
|
||||||
|
$this->user->device_limit = $plan->device_limit;
|
||||||
$this->user->plan_id = $plan->id;
|
$this->user->plan_id = $plan->id;
|
||||||
$this->user->group_id = $plan->group_id;
|
$this->user->group_id = $plan->group_id;
|
||||||
$this->user->expired_at = NULL;
|
$this->user->expired_at = NULL;
|
||||||
|
@ -167,7 +167,8 @@ class ServerService
|
|||||||
->select([
|
->select([
|
||||||
'id',
|
'id',
|
||||||
'uuid',
|
'uuid',
|
||||||
'speed_limit'
|
'speed_limit',
|
||||||
|
'device_limit'
|
||||||
])
|
])
|
||||||
->get();
|
->get();
|
||||||
}
|
}
|
||||||
|
@ -180,6 +180,7 @@ CREATE TABLE `v2_plan` (
|
|||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`group_id` int(11) NOT NULL,
|
`group_id` int(11) NOT NULL,
|
||||||
`transfer_enable` int(11) NOT NULL,
|
`transfer_enable` int(11) NOT NULL,
|
||||||
|
`device_limit` int(11) DEFAULT NULL,
|
||||||
`name` varchar(255) NOT NULL,
|
`name` varchar(255) NOT NULL,
|
||||||
`speed_limit` int(11) DEFAULT NULL,
|
`speed_limit` int(11) DEFAULT NULL,
|
||||||
`show` tinyint(1) NOT NULL DEFAULT '0',
|
`show` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
@ -451,6 +452,7 @@ CREATE TABLE `v2_user` (
|
|||||||
`u` bigint(20) NOT NULL DEFAULT '0',
|
`u` bigint(20) NOT NULL DEFAULT '0',
|
||||||
`d` bigint(20) NOT NULL DEFAULT '0',
|
`d` bigint(20) NOT NULL DEFAULT '0',
|
||||||
`transfer_enable` bigint(20) NOT NULL DEFAULT '0',
|
`transfer_enable` bigint(20) NOT NULL DEFAULT '0',
|
||||||
|
`device_limit` int(11) DEFAULT NULL,
|
||||||
`banned` tinyint(1) NOT NULL DEFAULT '0',
|
`banned` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
`is_admin` tinyint(1) NOT NULL DEFAULT '0',
|
`is_admin` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
`last_login_at` int(11) DEFAULT NULL,
|
`last_login_at` int(11) DEFAULT NULL,
|
||||||
|
@ -723,3 +723,8 @@ ALTER TABLE `v2_server_hysteria`
|
|||||||
UPDATE v2_server_vless
|
UPDATE v2_server_vless
|
||||||
SET tls_settings = REPLACE(tls_settings, 'shortId', 'short_id');
|
SET tls_settings = REPLACE(tls_settings, 'shortId', 'short_id');
|
||||||
|
|
||||||
|
ALTER TABLE `v2_plan`
|
||||||
|
ADD `device_limit` int(11) NULL AFTER `transfer_enable`;
|
||||||
|
|
||||||
|
ALTER TABLE `v2_user`
|
||||||
|
ADD `device_limit` int(11) NULL AFTER `transfer_enable`;
|
||||||
|
37
public/assets/admin/umi.js
vendored
37
public/assets/admin/umi.js
vendored
@ -22201,6 +22201,14 @@
|
|||||||
className: "form-group"
|
className: "form-group"
|
||||||
}, p.a.createElement("label", {
|
}, p.a.createElement("label", {
|
||||||
for: "example-text-input-alt"
|
for: "example-text-input-alt"
|
||||||
|
}, "\u8bbe\u5907\u6570\u9650\u5236"), p.a.createElement(u["a"], {
|
||||||
|
placeholder: "\u7559\u7a7a\u5219\u4e0d\u9650\u5236",
|
||||||
|
defaultValue: t.device_limit,
|
||||||
|
onChange: e=>this.formChange("device_limit", e.target.value)
|
||||||
|
})), p.a.createElement("div", {
|
||||||
|
className: "form-group"
|
||||||
|
}, p.a.createElement("label", {
|
||||||
|
for: "example-text-input-alt"
|
||||||
}, "\u5230\u671f\u65f6\u95f4"), p.a.createElement("div", null, p.a.createElement(c["a"], {
|
}, "\u5230\u671f\u65f6\u95f4"), p.a.createElement("div", null, p.a.createElement(c["a"], {
|
||||||
placeholder: "\u957f\u671f\u6709\u6548",
|
placeholder: "\u957f\u671f\u6709\u6548",
|
||||||
defaultValue: null !== t.expired_at && v()(1e3 * t.expired_at),
|
defaultValue: null !== t.expired_at && v()(1e3 * t.expired_at),
|
||||||
@ -70664,6 +70672,14 @@
|
|||||||
render: (e,t)=>{
|
render: (e,t)=>{
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
title: "\u8bbe\u5907\u6570\u9650\u5236",
|
||||||
|
dataIndex: "device_limit",
|
||||||
|
key: "device_limit",
|
||||||
|
sorter: !0,
|
||||||
|
render: (e,t)=>{
|
||||||
|
return null !== e ? e : "-"
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
title: "\u5230\u671f\u65f6\u95f4",
|
title: "\u5230\u671f\u65f6\u95f4",
|
||||||
dataIndex: "expired_at",
|
dataIndex: "expired_at",
|
||||||
@ -80496,6 +80512,20 @@
|
|||||||
className: "form-group"
|
className: "form-group"
|
||||||
}, m.a.createElement("label", {
|
}, m.a.createElement("label", {
|
||||||
for: "example-text-input-alt"
|
for: "example-text-input-alt"
|
||||||
|
}, "\u8bbe\u5907\u6570\u9650\u5236"), m.a.createElement(C["a"], {
|
||||||
|
placeholder: "\u7559\u7a7a\u5219\u4e0d\u9650\u5236",
|
||||||
|
value: this.state.record.device_limit,
|
||||||
|
onChange: e=>{
|
||||||
|
this.setState({
|
||||||
|
record: d()({}, this.state.record, {
|
||||||
|
device_limit: e.target.value
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})), m.a.createElement("div", {
|
||||||
|
className: "form-group"
|
||||||
|
}, m.a.createElement("label", {
|
||||||
|
for: "example-text-input-alt"
|
||||||
}, "\u6743\u9650\u7ec4 ", m.a.createElement(O["a"], null, m.a.createElement("a", {
|
}, "\u6743\u9650\u7ec4 ", m.a.createElement(O["a"], null, m.a.createElement("a", {
|
||||||
href: "javascript:(0);"
|
href: "javascript:(0);"
|
||||||
}, "\u6dfb\u52a0\u6743\u9650\u7ec4"))), m.a.createElement(_["a"], {
|
}, "\u6dfb\u52a0\u6743\u9650\u7ec4"))), m.a.createElement(_["a"], {
|
||||||
@ -80737,6 +80767,13 @@
|
|||||||
render: e=>{
|
render: e=>{
|
||||||
return m.a.createElement(m.a.Fragment, null, e, " GB")
|
return m.a.createElement(m.a.Fragment, null, e, " GB")
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
title: "\u8bbe\u5907\u6570\u9650\u5236",
|
||||||
|
dataIndex: "device_limit",
|
||||||
|
key: "device_limit",
|
||||||
|
render: e=>{
|
||||||
|
return null !== e ? e : "-"
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
title: "\u6708\u4ed8",
|
title: "\u6708\u4ed8",
|
||||||
dataIndex: "month_price",
|
dataIndex: "month_price",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user