pull/628/head
Mr Chen 7 months ago
parent 94d45b1b07
commit 6d90935784
  1. 11
      web/admin/__init__.py
  2. 2
      web/admin/model/__init__.py
  3. 44
      web/admin/model/option.py
  4. 60
      web/admin/plugins/__init__.py
  5. 11
      web/admin/setup/user.py
  6. 2
      web/core/mw.py
  7. 4
      web/templates/default/layout.html
  8. 43
      web/utils/mwplugin.py

@ -76,7 +76,9 @@ with app.app_context():
# 初始化用户信息
with app.app_context():
setup.init_admin_user()
if setup_db_required:
setup.init_admin_user()
setup.init_option()
@ -89,7 +91,8 @@ for module in get_submodules():
@app.before_request
def requestCheck():
print("hh")
# print("hh")
pass
@app.after_request
def requestAfter(response):
@ -107,7 +110,9 @@ def page_unauthorized(error):
@app.context_processor
def inject_global_variables():
config = {
'version': setting.APP_VERSION
'version': setting.APP_VERSION,
'title' : '面板',
'ip' : '127.0.0.1'
}
return dict(config=config)

@ -157,7 +157,7 @@ class Tasks(db.Model):
id = db.Column(db.Integer(), primary_key=True,autoincrement=True, comment="ID")
name = db.Column(db.TEXT, unique=False, nullable=False, comment="任务名称")
type = db.Column(db.TEXT, unique=False, nullable=False, comment="域名")
execstr = db.Column(db.TEXT, unique=False, nullable=False, comment="返回内容")
execstr = db.Column(db.TEXT, unique=False, nullable=False, comment="执行命令")
start = db.Column(db.Integer(), unique=False, nullable=True, comment="开始执行时间")
end = db.Column(db.Integer(), unique=False, nullable=True, comment="结束执行时间")
status = db.Column(db.Integer(), unique=False, nullable=True, default=1, comment="状态")

@ -0,0 +1,44 @@
# coding:utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
import json
from admin.model import db, Option
import core.mw as mw
def getOption(name, type='common') -> str:
data = Option.query.filter_by(name=name, type=type).first()
if data is not None:
return data.value
return ''
def getOptionByJson(name, type='common') -> object:
data = Option.query.filter_by(name=name, type=type).first()
if data is not None:
return json.loads(data.value)
return []
def setOption(name, value, type='common') -> bool:
data = Option.query.filter_by(name=name, type=type).first()
if data is None:
add_option = Option(
name=name,
type=type,
value=value)
db.session.add(add_option)
db.session.commit()
db.session.close()
return True
db.session.query(Option).filter_by(name=name, type=type).update({"value":value})
db.session.commit()
db.session.close()
return True

@ -9,6 +9,7 @@
# ---------------------------------------------------------------------------------
import os
import json
from flask import Blueprint, render_template
from flask import request
@ -18,7 +19,7 @@ from admin.user_login_check import panel_login_required
import core.mw as mw
pg = MwPlugin.instance()
blueprint = Blueprint('plugins', __name__, url_prefix='/plugins', template_folder='../../templates/default')
@blueprint.route('/index', endpoint='index')
@ -37,7 +38,28 @@ def init():
'mysql': '5.7',
'phpmyadmin': '4.4.15',
}
return []
pn_dir = mw.getPluginDir()
pn_server_dir = mw.getServerDir()
pn_list = []
for pn in plugin_names:
info = {}
pn_json = pn_dir + '/' + pn + '/info.json'
pn_server = pn_server_dir + '/' + pn
if not os.path.exists(pn_server):
tmp = mw.readFile(pn_json)
tmp = json.loads(tmp)
info['title'] = tmp['title']
info['name'] = tmp['name']
info['versions'] = tmp['versions']
info['default_ver'] = plugin_names[pn]
pn_list.append(info)
else:
return mw.returnData(False, 'ok')
return mw.returnData(True, 'ok', pn_list)
# 首页软件展示
@blueprint.route('/index_list', endpoint='index_list', methods=['GET','POST'])
@ -60,9 +82,41 @@ def list():
if not mw.isNumber(page):
page = 0
# pg.getList(plugins_type, search, int(page))
pg = MwPlugin.instance()
return pg.getList(plugins_type, search, int(page))
# 插件设置是否在首页展示
@blueprint.route('/set_index', endpoint='set_index', methods=['POST'])
@panel_login_required
def set_index():
name = request.form.get('name', '')
status = request.form.get('status', '0')
version = request.form.get('version', '')
pg = MwPlugin.instance()
if status == '1':
return pg.addIndex(name, version)
return pg.removeIndex(name, version)
# 插件卸载
@blueprint.route('/uninstall', endpoint='uninstall', methods=['POST'])
@panel_login_required
def uninstall():
rundir = mw.getRunDir()
name = request.form.get('name', '')
version = request.form.get('version', '')
if name.strip() == '':
return mw.returnData(False, '缺少插件名称!', ())
if version.strip() == '':
return mw.returnData(False, '缺少版本信息!', ())
pg = MwPlugin.instance()
# pg.getList(plugins_type, search, int(page))
return []
# 文件读取
@blueprint.route('/file', endpoint='file', methods=['GET'])
@panel_login_required

@ -11,7 +11,7 @@
from flask import request
from admin.model import db, Users
import admin.model.option as option
import core.mw as mw
# 初始化用户信息
@ -36,4 +36,13 @@ def init_admin_user():
db.session.add(add_user)
db.session.commit()
db.session.close()
return True
def init_option():
option.setOption('title', '后羿面板')
option.setOption('recycle_bin', 'open')
option.setOption('template', 'default')
# 首页展示初始化
option.setOption('display_index', '[]')
return True

@ -89,7 +89,7 @@ def getPanelTmp():
def getServerDir():
return getRunDir() + '/server'
return getFatherDir() + '/server'
def getLogsDir():
return getRunDir() + '/wwwlogs'

@ -5,7 +5,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit">
<title>{{data['title']}}</title>
<title>{{config['title']}}</title>
<link rel="shortcut icon" href="/static/favicon.ico" type="image/x-icon" />
<link href="/static/bootstrap-3.3.5/css/bootstrap.min.css?v={{config.version}}" rel="stylesheet">
<link href="/static/css/site.css?v={{config.version}}" rel="stylesheet">
@ -37,7 +37,7 @@
<div class="sidebar-scroll">
<div class="sidebar-auto">
<div id="task" class="task cw" onclick="messageBox();"></div>
<h3 class="mypcip"><span class="f14 cw">{{data['ip']}}</span></h3>
<h3 class="mypcip"><span class="f14 cw">{{config['ip']}}</span></h3>
<ul class="menu">
<li id="memuA"><a class="menu_home" href="/">首页</a></li>
<li id="memuAsite"><a class="menu_web" href="/site/index">网站</a></li>

@ -11,12 +11,12 @@
import os
import threading
import json
import core.mw as mw
import threading
import multiprocessing
import core.mw as mw
import admin.model.option as option
class pa_thread(threading.Thread):
def __init__(self, func, args, name=''):
@ -105,10 +105,7 @@ class MwPlugin(object):
self.__index_data = json.loads(mw.readFile(self.__index))
def getIndexList(self):
if not os.path.exists(self.__index):
mw.writeFile(self.__index, '[]')
indexList = json.loads(mw.readFile(self.__index))
indexList = option.getOptionByJson('display_index')
plist = []
for i in indexList:
tmp = i.split('-')
@ -144,6 +141,36 @@ class MwPlugin(object):
plist = self.checkStatusMThreads(plist)
return plist
def addIndex(self, name, version):
vname = name + '-' + version
indexList = option.getOptionByJson('display_index')
if vname in indexList:
return mw.returnData(False, '请不要重复添加!')
if len(indexList) > 12:
return mw.returnData(False, '首页最多只能显示12个软件!')
indexList.append(vname)
option.setOption('display_index', json.dumps(indexList))
return mw.returnData(True, '添加成功!')
def removeIndex(self, name, version):
vname = name + '-' + version
indexList = option.getOptionByJson('display_index')
if not vname in indexList:
return mw.returnData(True, '删除成功!!')
indexList.remove(vname)
print(indexList)
option.setOption('display_index', json.dumps(indexList))
return mw.returnData(True, '删除成功!')
def install(self):
pass
# 卸载插件
def uninstall(self):
pass
# 插件搜索匹配
def searchKey(self, info,
keyword: str | None = None,
@ -167,7 +194,7 @@ class MwPlugin(object):
return ''
def checkIndexList(self, name, version):
indexList = self.__index_data
indexList = option.getOptionByJson('display_index')
for i in indexList:
t = i.split('-')
if t[0] == name:

Loading…
Cancel
Save