同步更新

This commit is contained in:
邹景立 2023-11-25 21:35:04 +08:00
parent ad28cd3629
commit 99e76768b9
14 changed files with 178 additions and 626 deletions

View File

@ -31,7 +31,7 @@ class Service extends Plugin
* 定义插件名称 * 定义插件名称
* @var string * @var string
*/ */
protected $appName = '系统后台管理'; protected $appName = '系统管理';
/** /**
* 定义安装包名 * 定义安装包名

View File

@ -56,7 +56,7 @@ class Config extends Controller
{ {
$this->title = '系统参数配置'; $this->title = '系统参数配置';
$this->files = Storage::types(); $this->files = Storage::types();
$this->plugins = Plugin::get('', true); $this->plugins = Plugin::get(null, true);
$this->issuper = AdminService::isSuper(); $this->issuper = AdminService::isSuper();
$this->systemid = ModuleService::getRunVar('uni'); $this->systemid = ModuleService::getRunVar('uni');
$this->framework = ModuleService::getLibrarys('topthink/framework'); $this->framework = ModuleService::getLibrarys('topthink/framework');

View File

@ -188,13 +188,7 @@ define(['md5', 'notify'], function (SparkMD5, Notify, allowMime) {
}); });
} else if (parseInt(ret.code) === 200) { } else if (parseInt(ret.code) === 200) {
(file.xurl = ret.data.url), that.progress('100.00', file); (file.xurl = ret.data.url), that.progress('100.00', file);
that.done({ that.done({code: 1, url: file.xurl, info: file.xstats, data: {code:200,url: file.xurl}}, file.index, file, done, '{:lang("文件秒传成功!")}');
code: 1,
info: '{:lang("文件秒传成功!")}',
data: {
url: file.xurl,
}
}, file.index, file, done, '{:lang("文件秒传成功!")}');
} else { } else {
that.event('upload.error', {file: file}, file, ret.info || ret.error.message || '{:lang("文件上传出错!")}'); that.event('upload.error', {file: file}, file, ret.info || ret.error.message || '{:lang("文件上传出错!")}');
} }

View File

@ -3,7 +3,7 @@
<div class="layui-card-body padding-left-40"> <div class="layui-card-body padding-left-40">
<div class="layui-form-item label-required-prev"> <div class="layui-form-item label-required-prev">
<div class="help-label"><b>数据类型</b>DataType</div> <div class="help-label"><b>数据类型</b>Data Type</div>
{if isset($vo.type)} {if isset($vo.type)}
<label><input readonly value="{$vo.type|default=''}" class="layui-input think-bg-gray"></label> <label><input readonly value="{$vo.type|default=''}" class="layui-input think-bg-gray"></label>
{else} {else}
@ -35,9 +35,9 @@
</div> </div>
<label class="layui-form-item relative block"> <label class="layui-form-item relative block">
<span class="help-label"><b>数据编码</b>DataCode</span> <span class="help-label"><b>数据编码</b>Data Code</span>
{if isset($vo.code)} {if isset($vo.code)}
<input readonly maxlength="100" class="layui-input think-bg-gray" name="code" value='{$vo.code|default=""}' required required-error="数据编码不能为空" placeholder="请输入数据编码"> <input readonly maxlength="100" class="layui-input think-bg-gray" name="code" value='{$vo.code|default=""}' required placeholder="请输入数据编码">
{else} {else}
<input maxlength="100" class="layui-input" name="code" value='{$vo.code|default=""}' required vali-name="数据编码" placeholder="请输入数据编码"> <input maxlength="100" class="layui-input" name="code" value='{$vo.code|default=""}' required vali-name="数据编码" placeholder="请输入数据编码">
{/if} {/if}
@ -45,13 +45,13 @@
</label> </label>
<label class="layui-form-item relative block"> <label class="layui-form-item relative block">
<span class="help-label"><b>数据名称</b>DataName</span> <span class="help-label"><b>数据名称</b>Data Name</span>
<input maxlength="500" class="layui-input" name="name" value='{$vo.name|default=""}' required vali-name="数据名称" placeholder="请输入数据名称"> <input maxlength="500" class="layui-input" name="name" value='{$vo.name|default=""}' required vali-name="数据名称" placeholder="请输入数据名称">
<span class="help-block">请输入当前数据名称,请尽量保持名称的唯一性,数据名称尽量不要出现重复 ~</span> <span class="help-block">请输入当前数据名称,请尽量保持名称的唯一性,数据名称尽量不要出现重复 ~</span>
</label> </label>
<label class="layui-form-item relative block"> <label class="layui-form-item relative block">
<span class="help-label"><b>数据内容</b>DataContent</span> <span class="help-label"><b>数据内容</b>Data Content</span>
<textarea name="content" class="layui-textarea" placeholder="请输入数据内容">{$vo.content|default=''}</textarea> <textarea name="content" class="layui-textarea" placeholder="请输入数据内容">{$vo.content|default=''}</textarea>
</label> </label>

View File

@ -54,7 +54,7 @@
</script> </script>
<script type="text/html" id="toolbar"> <script type="text/html" id="toolbar">
<!--{if auth("remove")}--> <!--{if auth("edit")}-->
<a class="layui-btn layui-btn-sm" data-modal="{:url('edit')}?id={{d.id}}" data-title="编辑文件信息">{:lang("编 辑")}</a> <a class="layui-btn layui-btn-sm" data-modal="{:url('edit')}?id={{d.id}}" data-title="编辑文件信息">{:lang("编 辑")}</a>
<!--{/if}--> <!--{/if}-->
<!--{if auth("remove")}--> <!--{if auth("remove")}-->

View File

@ -24,10 +24,11 @@
{/block} {/block}
{block name="content"} {block name="content"}
<div class="think-box-notify"> <div class="think-box-notify" type="info">
<!--{if isset($super) and $super}--> <!--{if isset($super) and $super}-->
<b>{:lang('服务状态')}</b><b class="margin-right-5" data-queue-message><span class="color-desc">{:lang('检查中')}</span></b> <b>{:lang('服务状态')}</b><b class="margin-right-5" data-queue-message><span class="color-desc">{:lang('检查中')}</span></b>
<b data-tips-text="{:lang('点击可复制【服务启动指令】')}" class="layui-icon pointer margin-right-20" data-copy="{$command|default=''}">&#xe60e;</b> <b data-tips-text="{:lang('点击可复制【服务启动指令】')}" class="layui-icon pointer margin-right-20" data-copy="{$command|default=''}">&#xe633;</b>
<script>$('[data-queue-message]').load('{:sysuri("admin/api.queue/status")}');</script> <script>$('[data-queue-message]').load('{:sysuri("admin/api.queue/status")}');</script>
<!--{/if}--> <!--{/if}-->
@ -39,6 +40,7 @@
])} ])}
</div> </div>
<div class="think-box-shadow"> <div class="think-box-shadow">
{include file='queue/index_search'} {include file='queue/index_search'}
<table id="QueueTable" data-line="2" data-url="{:request()->url()}" data-target-search="form.form-search"></table> <table id="QueueTable" data-line="2" data-url="{:request()->url()}" data-target-search="form.form-search"></table>

View File

@ -390,11 +390,17 @@ $(function () {
}; };
/*! 通过 URI 查询最佳菜单 NODE */ /*! 通过 URI 查询最佳菜单 NODE */
this.queryNode = function (uri, node) { this.queryNode = function (uri, node) {
if (!/^m-/.test(node = node || location.href.replace(/.*spm=([\d\-m]+).*/ig, '$1'))) { // 如果该节点存在直接返回 Node 值
let $menu = $('[data-menu-node][data-open*="' + uri.replace(/\.html$/ig, '') + '"]'); if (/^m-/.test(node = node || location.href.replace(/.*spm=([\d\-m]+).*/ig, '$1'))) {
return $menu.size() ? $menu.get(0).dataset.menuNode : ''; if ($('[data-menu-node="' + node + '"]').size()) return node;
} }
return node; let path = uri.replace(/\.html$/ig, '');
// 尝试通过 URI 查询节点值
let $menu = $('[data-menu-node][data-open*="' + path + '"]');
if ($menu.size()) return $menu.get(0).dataset.menuNode;
// 尝试通过 URL 查询节点值
$menu = $('[data-menu-node][data-open~="#' + path + '"]');
return $menu.size() ? $menu.get(0).dataset.menuNode : (/^m-/.test(node || '') ? node : '');
}; };
/*! 完整 URL 转 URI 地址 */ /*! 完整 URL 转 URI 地址 */
this.parseUri = function (uri, elem, vars, temp, attrs) { this.parseUri = function (uri, elem, vars, temp, attrs) {
@ -425,6 +431,7 @@ $(function () {
layer.close(evt.idx); layer.close(evt.idx);
}); });
}); });
/*! 监听窗口大小及HASH切换 */ /*! 监听窗口大小及HASH切换 */
return $(window).on('resize', function () { return $(window).on('resize', function () {
(layui.data('AdminMenuType')['mini'] || $body.width() < 1000) ? layout.addClass(mclass) : layout.removeClass(mclass); (layui.data('AdminMenuType')['mini'] || $body.width() < 1000) ? layout.addClass(mclass) : layout.removeClass(mclass);
@ -647,6 +654,7 @@ $(function () {
// 默认动态设置页数, 动态设置最大高度 // 默认动态设置页数, 动态设置最大高度
if (option.page === true) option.page = {curr: layui.sessionData('pages')[option.id] || 1}; if (option.page === true) option.page = {curr: layui.sessionData('pages')[option.id] || 1};
if (option.width === 'full') option.width = $table.parent().width();
if (option.height === 'full') if ($table.parents('.iframe-pagination').size()) { if (option.height === 'full') if ($table.parents('.iframe-pagination').size()) {
$table.parents('.iframe-pagination').addClass('not-footer'); $table.parents('.iframe-pagination').addClass('not-footer');
option.height = $(window).height() - $table.removeClass('layui-hide').offset().top - 20; option.height = $(window).height() - $table.removeClass('layui-hide').offset().top - 20;
@ -664,9 +672,8 @@ $(function () {
option.done = function (res, curr, count) { option.done = function (res, curr, count) {
layui.sessionData('pages', {key: table.id, value: this.page.curr || 1}); layui.sessionData('pages', {key: table.id, value: this.page.curr || 1});
typeof option.success === 'function' && option.success.call(this, res, curr, count); typeof option.success === 'function' && option.success.call(this, res, curr, count);
$.form.reInit($table.next()).find('[data-load][data-time!="false"],[data-action][data-time!="false"],[data-queue],[data-iframe]').not('[data-table-id]').attr('data-table-id', table.id); $.form.reInit($table.next()).find('[data-open],[data-load][data-time!="false"],[data-action][data-time!="false"],[data-queue],[data-iframe]').not('[data-table-id]').attr('data-table-id', table.id);
(option.loading = this.loading = true) && $table.data('next', this).next().find(cls.join(',')).animate({opacity: 1}); (option.loading = this.loading = true) && $table.data('next', this).next().find(cls.join(',')).animate({opacity: 1});
}, option.parseData = function (res) { }, option.parseData = function (res) {
if (typeof params.filter === 'function') { if (typeof params.filter === 'function') {
res.data = params.filter(res.data, res); res.data = params.filter(res.data, res);
@ -900,7 +907,12 @@ $(function () {
/*! 注册 data-open 事件行为 */ /*! 注册 data-open 事件行为 */
$.base.onEvent('click', '[data-open]', function () { $.base.onEvent('click', '[data-open]', function () {
// 仅记录当前表格分页
let page = 0, tbid = this.dataset.tableId || null;
if (tbid) page = layui.sessionData('pages')[tbid] || 0;
layui.sessionData('pages', null); layui.sessionData('pages', null);
if (page > 0) layui.sessionData('pages', {key: tbid, value: page})
// 根据链接类型跳转页面
if (this.dataset.open.match(/^https?:/)) { if (this.dataset.open.match(/^https?:/)) {
$.form.goto(this.dataset.open); $.form.goto(this.dataset.open);
} else { } else {
@ -920,6 +932,7 @@ $(function () {
/*! 注册 data-modal 事件行为 */ /*! 注册 data-modal 事件行为 */
$.base.onEvent('click', '[data-modal]', function () { $.base.onEvent('click', '[data-modal]', function () {
$.base.applyRuleValue(this, {open_type: 'modal'}, function (data, elem, dset) { $.base.applyRuleValue(this, {open_type: 'modal'}, function (data, elem, dset) {
let area = dset.area || [dset.width || '800px', dset.height || '580px'];
let defer = $.form.modal(dset.modal, data, dset.title || this.innerText || '编辑', undefined, undefined, undefined, dset.area || dset.width || '800px', dset.offset || 'auto', dset.full !== undefined); let defer = $.form.modal(dset.modal, data, dset.title || this.innerText || '编辑', undefined, undefined, undefined, dset.area || dset.width || '800px', dset.offset || 'auto', dset.full !== undefined);
defer.progress((type) => type === 'modal.close' && dset.closeRefresh && $.layTable.reload(dset.closeRefresh)); defer.progress((type) => type === 'modal.close' && dset.closeRefresh && $.layTable.reload(dset.closeRefresh));
}); });

View File

@ -13,6 +13,7 @@ CKEDITOR.editorConfig = function (config) {
config.removePlugins = 'easyimage,cloudservices,exportpdf'; config.removePlugins = 'easyimage,cloudservices,exportpdf';
config.removeButtons = 'Underline,Subscript,Superscript'; config.removeButtons = 'Underline,Subscript,Superscript';
config.removeDialogTabs = 'image:advanced;link:advanced'; config.removeDialogTabs = 'image:advanced;link:advanced';
config.baseFloatZIndex = 19891019;
// 内容过滤 // 内容过滤
config.disallowedContent = 'script; *[on*]'; config.disallowedContent = 'script; *[on*]';
config.allowedContent = {$1: {elements: CKEDITOR.dtd, attributes: true, styles: true, classes: true}}; config.allowedContent = {$1: {elements: CKEDITOR.dtd, attributes: true, styles: true, classes: true}};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -23,6 +23,30 @@
// .flex-center // .flex-center
// .flex-between // .flex-between
@nums: 0, 5, 10, 15, 20, 25, 30;
each({
m: margin;
p: padding;
}, .(@tv,@tt) {
.ta-@{tt} {
each(@nums, .(@n) {
&-@{n} {
@{tv}: @n * 1px !important;
}
each({
t: -top;
l: -left;
r: -right;
b: -bottom;
}, .(@d,@k) {
&@{k}-@{n} {
@{tv}@{d}: @n * 1px !important;
}
});
})
}
})
.flex { .flex {
#flex(); #flex();
@ -689,44 +713,18 @@ table[data-line='3'] + div tbody .layui-table-cell {
} }
} }
@think-elips: {
display: -webkit-box;
overflow: hidden;
line-height: 1.4em;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
}
.think-elips { .think-elips {
&-1 { each(range(5), {
@think-elips(); &-@{value} {
line-clamp: 1; display: -webkit-box;
-webkit-line-clamp: 1; overflow: hidden;
} line-height: 1.4em;
text-overflow: ellipsis;
&-2 { -webkit-box-orient: vertical;
@think-elips(); line-clamp: @value;
line-clamp: 2; -webkit-line-clamp: @value;
-webkit-line-clamp: 2; }
} })
&-3 {
@think-elips();
line-clamp: 3;
-webkit-line-clamp: 3;
}
&-4 {
@think-elips();
line-clamp: 4;
-webkit-line-clamp: 4;
}
&-5 {
@think-elips();
line-clamp: 5;
-webkit-line-clamp: 5;
}
} }
.think-box-shadow { .think-box-shadow {
@ -1424,92 +1422,57 @@ label.think-checkbox {
} }
} }
.full- { .full {
&width { width: 100% !important;
height: 100% !important;
&-width {
width: 100% !important width: 100% !important
} }
&height { &-height {
height: 100% !important height: 100% !important
} }
} }
.color- { @sizes: 10, 12, 14;
&red {
color: #e44 !important
}
&blue { @colors: {
color: #29f !important red: #e44;
} blue: #29f;
desc: #999;
&desc { text: #333;
color: #999 !important green: #090;
}
&text {
color: #333 !important
}
&green {
color: #090 !important
}
} }
.sub-span- { .sub-span {
&red span { each(@colors, {
color: #e44 &-@{key} span {
} color: @value;
}
&blue span { })
color: #29f
}
&desc span {
color: #999
}
&text span {
color: #333
}
&green span {
color: #090
}
} }
.sub-strong- { .color {
&s10 b { each(@colors, {
font-size: 10px; &-@{key} {
} color: @value !important;
}
})
}
&s12 b {
font-size: 12px;
}
&s14 b { .sub-strong {
font-size: 14px; each(@colors, {
} &-@{key} b {
color: @value;
&red b { }
color: #ec494e })
} each(@sizes, {
&-s@{value} b {
&blue b { font-size: @value *1px;
color: #2494f2 }
} })
&desc b {
color: #999
}
&text b {
color: #333
}
&green b {
color: #090
}
} }
.think-bg- { .think-bg- {
@ -1575,90 +1538,44 @@ label.think-checkbox {
} }
} }
.font- { .font {
&code { &-code {
font-family: 'Courier New', 'Lucida Console', 'Consolas', 'Helvetica Neue', 'Helvetica', 'PingFang SC', 'Tahoma', 'Arial', sans-serif font-family: 'Courier New', 'Lucida Console', 'Consolas', 'Helvetica Neue', 'Helvetica', 'PingFang SC', 'Tahoma', 'Arial', sans-serif
} }
&s10 { each({
font-size: 10px !important s10: 10px;
} s11: 11px;
s12: 12px;
s13: 13px;
s14: 14px;
s15: 15px;
s16: 16px;
s18: 18px;
s20: 20px;
s30: 30px;
s40: 40px;
}, {
&-@{key} {
font-size: @value !important
}
})
&s11 { each({
font-size: 11px !important w1: 100;
} w2: 200;
w3: 300;
&s12 { w4: 400;
font-size: 12px !important w5: 500;
} w6: 600;
w7: 700;
&s13 { w8: 800;
font-size: 13px !important w9: 900;
} }, {
&-@{key} {
&s14 { font-weight: @value !important
font-size: 14px !important }
} })
&s15 {
font-size: 15px !important
}
&s16 {
font-size: 16px !important
}
&s18 {
font-size: 18px !important
}
&s20 {
font-size: 20px !important
}
&s30 {
font-size: 30px !important
}
&s40 {
font-size: 40px !important
}
&w1 {
font-weight: 100 !important;
}
&w2 {
font-weight: 200 !important;
}
&w3 {
font-weight: 300 !important;
}
&w4 {
font-weight: 400 !important;
}
&w5 {
font-weight: 500 !important;
}
&w6 {
font-weight: 600 !important;
}
&w7 {
font-weight: 700 !important;
}
&w8 {
font-weight: 800 !important;
}
&w9 {
font-weight: 900 !important;
}
} }
.border { .border {
@ -1717,413 +1634,35 @@ label.think-checkbox {
} }
} }
.margin { @nums: 0, 5, 10, 15, 20, 25, 30, 40;
&-0 { each({
margin: 0 !important --margin: margin;
--padding: padding;
}, .(@v) {
.@{v} {
each(@nums, {
&-@{value} {
@{v}: @value*1px !important;
}
&-row-@{value} {
@{v}-left: @value*1px !important;
@{v}-right: @value*1px !important;
}
&-top-@{value} {
@{v}-top: @value*1px !important;
}
&-left-@{value} {
@{v}-left: @value*1px !important;
}
&-right-@{value} {
@{v}-right: @value*1px !important;
}
&-bottom-@{value} {
@{v}-bottom: @value*1px !important;
}
})
} }
})
&-5 {
margin: 5px !important
}
&-10 {
margin: 10px !important
}
&-15 {
margin: 15px !important
}
&-20 {
margin: 20px !important
}
&-25 {
margin: 25px !important
}
&-30 {
margin: 30px !important
}
&-40 {
margin: 40px !important
}
&-row {
&-0 {
margin-left: 0 !important;
margin-right: 0 !important;
}
&-5 {
margin-left: 5px !important;
margin-right: 5px !important;
}
&-10 {
margin-left: 10px !important;
margin-right: 10px !important;
}
&-15 {
margin-left: 15px !important;
margin-right: 15px !important;
}
&-20 {
margin-left: 20px !important;
margin-right: 20px !important;
}
&-25 {
margin-left: 25px !important;
margin-right: 25px !important;
}
&-30 {
margin-left: 30px !important;
margin-right: 30px !important;
}
&-40 {
margin-left: 40px !important;
margin-right: 40px !important;
}
}
&-top {
&-0 {
margin-top: 0 !important
}
&-5 {
margin-top: 5px !important
}
&-10 {
margin-top: 10px !important
}
&-15 {
margin-top: 15px !important
}
&-20 {
margin-top: 20px !important
}
&-25 {
margin-top: 25px !important
}
&-30 {
margin-top: 30px !important
}
&-40 {
margin-top: 40px !important;
}
}
&-left {
&-0 {
margin-left: 0 !important
}
&-5 {
margin-left: 5px !important
}
&-10 {
margin-left: 10px !important
}
&-15 {
margin-left: 15px !important
}
&-20 {
margin-left: 20px !important
}
&-25 {
margin-left: 25px !important
}
&-30 {
margin-left: 30px !important
}
&-40 {
margin-left: 40px !important
}
}
&-right {
&-0 {
margin-right: 0 !important
}
&-5 {
margin-right: 5px !important
}
&-10 {
margin-right: 10px !important
}
&-15 {
margin-right: 15px !important
}
&-20 {
margin-right: 20px !important
}
&-25 {
margin-right: 25px !important
}
&-30 {
margin-right: 30px !important
}
&-40 {
margin-right: 40px !important
}
}
&-bottom {
&-0 {
margin-bottom: 0 !important
}
&-5 {
margin-bottom: 5px !important
}
&-10 {
margin-bottom: 10px !important
}
&-15 {
margin-bottom: 15px !important
}
&-20 {
margin-bottom: 20px !important
}
&-25 {
margin-bottom: 25px !important
}
&-30 {
margin-bottom: 30px !important
}
&-40 {
margin-bottom: 40px !important
}
}
}
.padding {
&-0 {
padding: 0 !important
}
&-5 {
padding: 5px !important
}
&-10 {
padding: 10px !important
}
&-15 {
padding: 15px !important
}
&-20 {
padding: 20px !important
}
&-25 {
padding: 25px !important
}
&-30 {
padding: 30px !important
}
&-40 {
padding: 40px !important
}
&-row {
&-0 {
padding-left: 0 !important;
padding-right: 0 !important;
}
&-5 {
padding-left: 5px !important;
padding-right: 5px !important;
}
&-10 {
padding-left: 10px !important;
padding-right: 10px !important;
}
&-15 {
padding-left: 15px !important;
padding-right: 15px !important;
}
&-20 {
padding-left: 20px !important;
padding-right: 20px !important;
}
&-25 {
padding-left: 25px !important;
padding-right: 25px !important;
}
&-30 {
padding-left: 30px !important;
padding-right: 30px !important;
}
&-40 {
padding-left: 40px !important;
padding-right: 40px !important;
}
}
&-top {
&-0 {
padding-top: 0 !important
}
&-5 {
padding-top: 5px !important
}
&-10 {
padding-top: 10px !important
}
&-15 {
padding-top: 15px !important
}
&-20 {
padding-top: 20px !important
}
&-30 {
padding-top: 30px !important
}
&-40 {
padding-top: 40px !important
}
}
&-left {
&-0 {
padding-left: 0 !important
}
&-5 {
padding-left: 5px !important
}
&-10 {
padding-left: 10px !important
}
&-15 {
padding-left: 15px !important
}
&-20 {
padding-left: 20px !important
}
&-30 {
padding-left: 30px !important
}
&-40 {
padding-left: 40px !important
}
}
&-right {
&-0 {
padding-right: 0 !important
}
&-5 {
padding-right: 5px !important
}
&-10 {
padding-right: 10px !important
}
&-15 {
padding-right: 15px !important
}
&-20 {
padding-right: 20px !important
}
&-30 {
padding-right: 30px !important
}
&-40 {
padding-right: 40px !important
}
}
&-bottom {
&-0 {
padding-bottom: 0 !important
}
&-5 {
padding-bottom: 5px !important
}
&-10 {
padding-bottom: 10px !important
}
&-15 {
padding-bottom: 15px !important
}
&-20 {
padding-bottom: 20px !important
}
&-30 {
padding-bottom: 30px !important
}
&-40 {
padding-bottom: 40px !important
}
}
}
@keyframes loading { @keyframes loading {
17% { 17% {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -10,7 +10,9 @@
**ThinkAdmin** 是一款遵循 **MIT** 协议免费开源的快速开发框架,基于最新版本 **ThinkPHP6** 的极简后台管理系统 ( 已兼容 **ThinkPHP8** ),在使用 **ThinkAdmin** 前请认真阅读[《免责声明》](https://doc.thinkadmin.top/disclaimer)并同意该声明。 **ThinkAdmin** 是一款遵循 **MIT** 协议免费开源的快速开发框架,基于最新版本 **ThinkPHP6** 的极简后台管理系统 ( 已兼容 **ThinkPHP8** ),在使用 **ThinkAdmin** 前请认真阅读[《免责声明》](https://doc.thinkadmin.top/disclaimer)并同意该声明。
当前 **ThinkAdmin** 的最新版本为[ **v6.1** ](https://gitee.com/zoujingli/ThinkAdmin/tree/v6.1),从这个版本开始正式进入插件时代,提供类似 **PaaS** 的组件升级更新服务,也可以本地化定制开发,基础组件及扩展插件统一使用 **Composer** 管理。**ThinkAdmin** 与传统 **ThinkPHP** 多应用模式无差别,用户可以自行开发自己的模块,此次升级可完美兼容 **ThinkAdmin v6.0** 应用,原 **ThinkAdmin v6.0** 只需安装 **ThinkPlugsAdmin** 组件即可升级到 **v6.1** 的插件模式。想要了解更多 **ThinkAdmin** 插件生态请阅读 [《ThinkAdmin 插件生态》](https://gitee.com/zoujingli/ThinkAdmin/blob/v6.1/plugin.md) 当前 **ThinkAdmin** 的最新版本为[ **v6.1** ](https://gitee.com/zoujingli/ThinkAdmin/tree/v6.1),从这个版本开始正式进入插件时代,提供类似 **PaaS** 的组件升级更新服务,也可以本地化定制开发,基础组件及扩展插件统一使用 **Composer** 管理。**ThinkAdmin** 与传统 **ThinkPHP** 多应用模式无差别,用户可以自行开发自己的模块,此次升级可完美兼容 **ThinkAdmin v6.0** 应用,原 **ThinkAdmin v6.0** 只需安装 **ThinkPlugsAdmin** 组件即可升级到 **v6.1** 的插件模式。
[//]: # (想要了解更多 **ThinkAdmin** 插件生态请阅读 [《ThinkAdmin 插件生态》]&#40;https://doc.thinkadmin.top/guide/plugin.html&#41;)
**[查看 ThinkAdmin v6.1 详细介绍请切换至 v6.1 分支](https://gitee.com/zoujingli/ThinkAdmin/tree/v6.1)** **[查看 ThinkAdmin v6.1 详细介绍请切换至 v6.1 分支](https://gitee.com/zoujingli/ThinkAdmin/tree/v6.1)**
@ -20,7 +22,7 @@
使用 **ThinkAdmin** 需要掌握 **ThinkPHP**、**jQuery**、**LayUI**、**RequireJs** 等开发技能,后台 **UI** 界面基于最新版本的 **LayUI** 前端框架以及 **RequireJs** 组件加载方式,默认加载了所有 **LayUI** 的组件,框架中可以直接使用组件(独立页面需要注意 **js** 加载顺序哦),使用 **RequireJs** 加载插件,互联网上资源非常多,可自行下载进行二次扩展。目前后台大部分页面为单页程序,页面加载速度非常快速,也因此后台不再支持选项卡模式。 使用 **ThinkAdmin** 需要掌握 **ThinkPHP**、**jQuery**、**LayUI**、**RequireJs** 等开发技能,后台 **UI** 界面基于最新版本的 **LayUI** 前端框架以及 **RequireJs** 组件加载方式,默认加载了所有 **LayUI** 的组件,框架中可以直接使用组件(独立页面需要注意 **js** 加载顺序哦),使用 **RequireJs** 加载插件,互联网上资源非常多,可自行下载进行二次扩展。目前后台大部分页面为单页程序,页面加载速度非常快速,也因此后台不再支持选项卡模式。
我们致力于快速开发的底层框架,让项目开发变得更容易。框架提供完善的基础组件以及对应的 **API** 支持,基于此框架可以快速开发各种 **WEB** 应用。任何一个系统都不能完全满足所有的业务场景,**ThinkAdmin** 免费提供基础底层的功能,这里包括系统权限管理,系统存储配置,微信授权管理,以及其他常用功能集成等…… 因此 **ThinkAdmin** 也被大家定性为外包二开基线系统。**v6.1** 开始我们提供会员尊享组件和定制业务插件服务。目前已经有许多公司及个人在使用 **ThinkAdmin**,通过数据聚合统计已有 **5** 万多在线运行的项目。 我们致力于快速开发的底层框架,让项目开发变得更容易。框架提供完善的基础组件以及对应的 **API** 支持,基于此框架可以快速开发各种 **WEB** 应用。任何一个系统都不能完全满足所有的业务场景,**ThinkAdmin** 免费提供基础底层的功能,这里包括系统权限管理,系统存储配置,微信授权管理,以及其他常用功能集成等…… 因此 **ThinkAdmin** 也被大家定性为外包二开基线系统。目前已经有许多公司及个人在使用 **ThinkAdmin**,通过数据聚合统计已有 **5** 万多在线运行的项目。
#### 注意事项 #### 注意事项
@ -59,8 +61,9 @@ php think run --host 127.0.0.1
**2. 通过源码安装:** 默认安装 admin、wechat 两个模块 **2. 通过源码安装:** 默认安装 admin、wechat 两个模块
如果需要安装演示系统的旧版本 **data** 模块代码,请跳转到 [//]: # (如果需要安装演示系统的旧版本 **data** 模块代码,请跳转到)
https://gitee.com/zoujingli/think-plugs-data
[//]: # (https://gitee.com/zoujingli/think-plugs-data)
```shell ```shell
### 下载项目( 需要在英文目录下面执行 ### 下载项目( 需要在英文目录下面执行