mirror of
https://github.com/kuaifan/dootask.git
synced 2026-03-17 11:13:26 +00:00
license setting
This commit is contained in:
parent
809c6769f6
commit
4260549f72
@ -513,6 +513,41 @@ class SystemController extends AbstractController
|
|||||||
return Base::retSuccess('success', $setting);
|
return Base::retSuccess('success', $setting);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {post} api/system/license 08. License
|
||||||
|
*
|
||||||
|
* @apiDescription 获取License信息、保存License(限管理员)
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName license
|
||||||
|
*
|
||||||
|
* @apiParam {String} type
|
||||||
|
* - get: 获取
|
||||||
|
* - save: 保存
|
||||||
|
* @apiParam {String} license License 原文
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function license()
|
||||||
|
{
|
||||||
|
User::auth('admin');
|
||||||
|
//
|
||||||
|
$type = trim(Request::input('type'));
|
||||||
|
if ($type == 'save') {
|
||||||
|
$license = Base::getPostValue('license');
|
||||||
|
Doo::licenseSave($license);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return Base::retSuccess('success', [
|
||||||
|
'license' => Doo::licenseContent(),
|
||||||
|
'info' => Doo::license(),
|
||||||
|
'macs' => Doo::macs(),
|
||||||
|
'user_count' => User::whereBot(0)->whereNull('disable_at')->count(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @api {get} api/system/get/info 10. 获取终端详细信息
|
* @api {get} api/system/get/info 10. 获取终端详细信息
|
||||||
*
|
*
|
||||||
|
|||||||
@ -24,6 +24,9 @@ class VerifyCsrfToken extends Middleware
|
|||||||
// 保存创建项目列表模板
|
// 保存创建项目列表模板
|
||||||
'api/system/column/template/',
|
'api/system/column/template/',
|
||||||
|
|
||||||
|
// License 设置
|
||||||
|
'api/system/license/',
|
||||||
|
|
||||||
// 添加任务
|
// 添加任务
|
||||||
'api/project/task/add/',
|
'api/project/task/add/',
|
||||||
|
|
||||||
|
|||||||
@ -43,6 +43,7 @@ class Doo
|
|||||||
char* tokenDecode(char* val);
|
char* tokenDecode(char* val);
|
||||||
char* translate(char* val, char* val);
|
char* translate(char* val, char* val);
|
||||||
char* md5s(char* text, char* password);
|
char* md5s(char* text, char* password);
|
||||||
|
char* macs();
|
||||||
EOF, "/usr/lib/doo/doo.so");
|
EOF, "/usr/lib/doo/doo.so");
|
||||||
$token = $token ?: Base::headerOrInput('token');
|
$token = $token ?: Base::headerOrInput('token');
|
||||||
$language = $language ?: Base::headerOrInput('language');
|
$language = $language ?: Base::headerOrInput('language');
|
||||||
@ -55,7 +56,8 @@ class Doo
|
|||||||
* @param $language
|
* @param $language
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function doo($token = null, $language = null) {
|
public static function doo($token = null, $language = null)
|
||||||
|
{
|
||||||
if (self::$doo == null) {
|
if (self::$doo == null) {
|
||||||
self::load($token, $language);
|
self::load($token, $language);
|
||||||
}
|
}
|
||||||
@ -86,6 +88,14 @@ class Doo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$macs = explode(",", $array['mac']);
|
||||||
|
$array['mac'] = [];
|
||||||
|
foreach ($macs as $mac) {
|
||||||
|
if (Base::isMac($mac)) {
|
||||||
|
$array['mac'][] = $mac;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$emails = explode(",", $array['email']);
|
$emails = explode(",", $array['email']);
|
||||||
$array['email'] = [];
|
$array['email'] = [];
|
||||||
foreach ($emails as $email) {
|
foreach ($emails as $email) {
|
||||||
@ -97,6 +107,28 @@ class Doo
|
|||||||
return $array;
|
return $array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取License原文
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function licenseContent(): string
|
||||||
|
{
|
||||||
|
$paths = [
|
||||||
|
config_path("LICENSE"),
|
||||||
|
config_path("license"),
|
||||||
|
app_path("LICENSE"),
|
||||||
|
app_path("license"),
|
||||||
|
];
|
||||||
|
$content = "";
|
||||||
|
foreach ($paths as $path) {
|
||||||
|
if (file_exists($path)) {
|
||||||
|
$content = file_get_contents($path);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析License
|
* 解析License
|
||||||
* @param $license
|
* @param $license
|
||||||
@ -237,4 +269,20 @@ class Doo
|
|||||||
{
|
{
|
||||||
return self::string(self::doo()->md5s($text, $password));
|
return self::string(self::doo()->md5s($text, $password));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取php容器mac地址组
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function macs(): array
|
||||||
|
{
|
||||||
|
$macs = explode(",", self::string(self::doo()->macs()));
|
||||||
|
$array = [];
|
||||||
|
foreach ($macs as $mac) {
|
||||||
|
if (Base::isMac($mac)) {
|
||||||
|
$array[] = $mac;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ version: '3'
|
|||||||
services:
|
services:
|
||||||
php:
|
php:
|
||||||
container_name: "dootask-php-${APP_ID}"
|
container_name: "dootask-php-${APP_ID}"
|
||||||
image: "kuaifan/php:swoole-8.0.rc4"
|
image: "kuaifan/php:swoole-8.0.rc5"
|
||||||
shm_size: "1024m"
|
shm_size: "1024m"
|
||||||
volumes:
|
volumes:
|
||||||
- ./docker/crontab/crontab.conf:/etc/supervisor/conf.d/crontab.conf
|
- ./docker/crontab/crontab.conf:/etc/supervisor/conf.d/crontab.conf
|
||||||
|
|||||||
@ -539,7 +539,7 @@ export default {
|
|||||||
array.push(...[
|
array.push(...[
|
||||||
{path: 'personal', name: '个人设置', divided: true},
|
{path: 'personal', name: '个人设置', divided: true},
|
||||||
{path: 'system', name: '系统设置'},
|
{path: 'system', name: '系统设置'},
|
||||||
{path: 'clearCache', name: '清除缓存'},
|
{path: 'license', name: 'License Key'},
|
||||||
|
|
||||||
{path: 'version', name: '更新版本', divided: true, visible: !!this.clientNewVersion},
|
{path: 'version', name: '更新版本', divided: true, visible: !!this.clientNewVersion},
|
||||||
|
|
||||||
@ -551,7 +551,6 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
array.push(...[
|
array.push(...[
|
||||||
{path: 'personal', name: '个人设置', divided: true},
|
{path: 'personal', name: '个人设置', divided: true},
|
||||||
{path: 'clearCache', name: '清除缓存'},
|
|
||||||
|
|
||||||
{path: 'version', name: '更新版本', divided: true, visible: !!this.clientNewVersion},
|
{path: 'version', name: '更新版本', divided: true, visible: !!this.clientNewVersion},
|
||||||
|
|
||||||
@ -562,11 +561,13 @@ export default {
|
|||||||
if (needStartHome) {
|
if (needStartHome) {
|
||||||
array.push(...[
|
array.push(...[
|
||||||
{path: 'goHome', name: '打开首页', divided: true},
|
{path: 'goHome', name: '打开首页', divided: true},
|
||||||
|
{path: 'clearCache', name: '清除缓存'},
|
||||||
{path: 'logout', name: '退出登录', style: {color: '#f40'}}
|
{path: 'logout', name: '退出登录', style: {color: '#f40'}}
|
||||||
])
|
])
|
||||||
} else {
|
} else {
|
||||||
array.push(...[
|
array.push(...[
|
||||||
{path: 'logout', name: '退出登录', style: {color: '#f40'}, divided: true}
|
{path: 'clearCache', name: '清除缓存', divided: true},
|
||||||
|
{path: 'logout', name: '退出登录', style: {color: '#f40'}}
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
return array
|
return array
|
||||||
|
|||||||
@ -4,12 +4,12 @@
|
|||||||
<Row class="setting-color color-label-box">
|
<Row class="setting-color color-label-box">
|
||||||
<Col span="12">{{$L('名称')}}</Col>
|
<Col span="12">{{$L('名称')}}</Col>
|
||||||
<Col span="4">
|
<Col span="4">
|
||||||
<ETooltip :disabled="windowSmall || $isEEUiApp" :content="$L('数值越小级别越高')" max-width="auto" placement="top" transfer>
|
<ETooltip :content="$L('数值越小级别越高')" max-width="auto" placement="top" transfer>
|
||||||
<div><Icon class="information" type="ios-information-circle-outline" /> {{$L('级别')}}</div>
|
<div><Icon class="information" type="ios-information-circle-outline" /> {{$L('级别')}}</div>
|
||||||
</ETooltip>
|
</ETooltip>
|
||||||
</Col>
|
</Col>
|
||||||
<Col span="4">
|
<Col span="4">
|
||||||
<ETooltip :disabled="windowSmall || $isEEUiApp" :content="$L('任务完成时间')" max-width="auto" placement="top" transfer>
|
<ETooltip :content="$L('任务完成时间')" max-width="auto" placement="top" transfer>
|
||||||
<div><Icon class="information" type="ios-information-circle-outline" /> {{$L('天数')}}</div>
|
<div><Icon class="information" type="ios-information-circle-outline" /> {{$L('天数')}}</div>
|
||||||
</ETooltip>
|
</ETooltip>
|
||||||
</Col>
|
</Col>
|
||||||
|
|||||||
@ -99,15 +99,13 @@ export default {
|
|||||||
if (this.userIsAdmin) {
|
if (this.userIsAdmin) {
|
||||||
menu.push(...[
|
menu.push(...[
|
||||||
{path: 'system', name: '系统设置', divided: true},
|
{path: 'system', name: '系统设置', divided: true},
|
||||||
{path: 'clearCache', name: '清除缓存'},
|
{path: 'license', name: 'License Key'},
|
||||||
{path: 'logout', name: '退出登录'},
|
|
||||||
])
|
|
||||||
} else {
|
|
||||||
menu.push(...[
|
|
||||||
{path: 'clearCache', name: '清除缓存', divided: true},
|
|
||||||
{path: 'logout', name: '退出登录'},
|
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
menu.push(...[
|
||||||
|
{path: 'clearCache', name: '清除缓存', divided: true},
|
||||||
|
{path: 'logout', name: '退出登录'},
|
||||||
|
])
|
||||||
return menu;
|
return menu;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
156
resources/assets/js/pages/manage/setting/license.vue
Normal file
156
resources/assets/js/pages/manage/setting/license.vue
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
<template>
|
||||||
|
<div class="setting-item submit">
|
||||||
|
<Form ref="formData" :model="formData" :labelPosition="formLabelPosition" :labelWidth="formLabelWidth" @submit.native.prevent>
|
||||||
|
<FormItem label="License" prop="license">
|
||||||
|
<Input v-model="formData.license" type="textarea" :autosize="{minRows: 3,maxRows: 14}" :placeholder="$L('请输入License...')" />
|
||||||
|
</FormItem>
|
||||||
|
<FormItem :label="$L('详细信息')">
|
||||||
|
<div class="license-box">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<em>SN:</em>
|
||||||
|
<span>{{formData.info.sn}}</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<em>IP:</em>
|
||||||
|
<span>{{infoJoin(formData.info.ip)}}</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<em>{{$L('域名')}}:</em>
|
||||||
|
<span>{{infoJoin(formData.info.domain)}}</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<em>MAC:</em>
|
||||||
|
<span>{{infoJoin(formData.info.mac)}}</span>
|
||||||
|
<ETooltip max-width="auto" placement="right">
|
||||||
|
<div slot="content">{{$L('当前环境')}}: {{infoJoin(formData.macs, '-')}}</div>
|
||||||
|
<Icon class="information" type="ios-information-circle-outline" />
|
||||||
|
</ETooltip>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<em>{{$L('使用人数')}}:</em>
|
||||||
|
<span>{{formData.info.people || $L('无限制')}} ({{$L('已使用')}}: {{formData.user_count}})</span>
|
||||||
|
<ETooltip max-width="auto" placement="right">
|
||||||
|
<div slot="content">{{$L('限制注册人数')}}</div>
|
||||||
|
<Icon class="information" type="ios-information-circle-outline" />
|
||||||
|
</ETooltip>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<em>{{$L('创建时间')}}:</em>
|
||||||
|
<span>{{formData.info.created_at}}</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<em>{{$L('到期时间')}}:</em>
|
||||||
|
<span>{{formData.info.expired_at || $L('永久')}}</span>
|
||||||
|
<ETooltip v-if="formData.info.expired_at" max-width="auto" placement="right">
|
||||||
|
<div slot="content">{{$L('到期后限制注册帐号')}}</div>
|
||||||
|
<Icon class="information" type="ios-information-circle-outline" />
|
||||||
|
</ETooltip>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
<div class="setting-footer">
|
||||||
|
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{$L('提交')}}</Button>
|
||||||
|
<Button :loading="loadIng > 0" @click="resetForm" style="margin-left: 8px">{{$L('重置')}}</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.license-box {
|
||||||
|
padding-top: 6px;
|
||||||
|
> ul {
|
||||||
|
> li {
|
||||||
|
list-style: none;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 22px;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
display: flex;
|
||||||
|
> em {
|
||||||
|
flex-shrink: 0;
|
||||||
|
font-style: normal;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
> span {
|
||||||
|
padding-left: 6px;
|
||||||
|
}
|
||||||
|
.information {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loadIng: 0,
|
||||||
|
|
||||||
|
formData: {
|
||||||
|
license: '',
|
||||||
|
info: {},
|
||||||
|
macs: [],
|
||||||
|
user_count: 0
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.systemSetting();
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['userInfo', 'formLabelPosition', 'formLabelWidth']),
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
submitForm() {
|
||||||
|
this.$refs.formData.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.systemSetting(true);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
resetForm() {
|
||||||
|
this.formData = $A.cloneJSON(this.formData_bak);
|
||||||
|
},
|
||||||
|
|
||||||
|
systemSetting(save) {
|
||||||
|
this.loadIng++;
|
||||||
|
this.$store.dispatch("call", {
|
||||||
|
url: 'system/license?type=' + (save ? 'save' : 'get'),
|
||||||
|
method: 'post',
|
||||||
|
data: this.formData,
|
||||||
|
}).then(({data}) => {
|
||||||
|
if (save) {
|
||||||
|
$A.messageSuccess('修改成功');
|
||||||
|
}
|
||||||
|
this.formData = data;
|
||||||
|
this.formData_bak = $A.cloneJSON(this.formData);
|
||||||
|
}).catch(({msg}) => {
|
||||||
|
if (save) {
|
||||||
|
$A.modalError(msg);
|
||||||
|
}
|
||||||
|
}).finally(_ => {
|
||||||
|
this.loadIng--;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
infoJoin(val, def = null) {
|
||||||
|
if ($A.isArray(val)) {
|
||||||
|
val = val.join(",")
|
||||||
|
}
|
||||||
|
if (val) {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
return def === null ? this.$L("无限制") : def
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
5
resources/assets/js/routes.js
vendored
5
resources/assets/js/routes.js
vendored
@ -59,6 +59,11 @@ export default [
|
|||||||
path: 'keyboard',
|
path: 'keyboard',
|
||||||
component: () => import('./pages/manage/setting/keyboard.vue'),
|
component: () => import('./pages/manage/setting/keyboard.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'manage-setting-license',
|
||||||
|
path: 'license',
|
||||||
|
component: () => import('./pages/manage/setting/license.vue'),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'manage-setting-password',
|
name: 'manage-setting-password',
|
||||||
path: 'password',
|
path: 'password',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user