From 09176d78f9389e52d8dae9de72f5e6a122029682 Mon Sep 17 00:00:00 2001 From: apexliu Date: Mon, 13 Mar 2017 23:39:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=86=E6=97=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E3=80=81=E6=9C=89=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E7=AD=89=E6=83=85=E5=86=B5=E4=B8=8B=E6=99=AE=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=99=BB=E5=BD=95=E4=B8=8E=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=97=B6=E8=BF=9B=E5=85=A5=E7=BB=B4=E6=8A=A4?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E7=9A=84=E6=B5=81=E7=A8=8B=EF=BC=8C=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E6=AD=A5=E5=8F=AF=E4=BB=A5=E5=BC=80=E5=A7=8B=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E5=AE=89=E8=A3=85=E5=92=8C=E5=8D=87=E7=BA=A7=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E6=93=8D=E4=BD=9C=E7=95=8C=E9=9D=A2=E4=BA=86?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/windows/server/script/script/main.py | 10 +-- server/www/teleport/app/eom_app/app/core.py | 16 +++-- server/www/teleport/app/eom_app/app/db.py | 23 +++++-- .../app/eom_app/controller/__init__.py | 4 +- .../teleport/app/eom_app/controller/auth.py | 25 +++++-- .../teleport/app/eom_app/controller/base.py | 33 ++++++--- .../app/eom_app/controller/maintenance.py | 20 +++++- .../www/teleport/app/eom_app/module/user.py | 1 - .../www/teleport/static/js/ui/auth/login.js | 2 +- .../teleport/view/maintenance/install.mako | 69 +++++++++++++++++++ .../teleport/view/maintenance/upgrade.mako | 69 +++++++++++++++++++ 11 files changed, 234 insertions(+), 38 deletions(-) create mode 100644 server/www/teleport/view/maintenance/install.mako create mode 100644 server/www/teleport/view/maintenance/upgrade.mako diff --git a/dist/windows/server/script/script/main.py b/dist/windows/server/script/script/main.py index 811411c..bb16d2a 100644 --- a/dist/windows/server/script/script/main.py +++ b/dist/windows/server/script/script/main.py @@ -373,11 +373,11 @@ class InstallerWin(InstallerBase): utils.copy_ex(os.path.join(env.src_path, 'www'), os.path.join(self._install_path, 'www')) # 创建一个标志文件,这样访问后台时会进入维护模式 - try: - with open(os.path.join(self._install_path, 'www', 'teleport', 'maintenance-mode'), 'w') as f: - f.write('!!! DO NOT TOUCH !!!') - except: - pass + # try: + # with open(os.path.join(self._install_path, 'www', 'teleport', 'maintenance-mode'), 'w') as f: + # f.write('!!! DO NOT TOUCH !!!') + # except: + # pass if not os.path.exists(self._config_path): utils.copy_ex(os.path.join(env.src_path, 'tmp', 'etc'), self._config_path) diff --git a/server/www/teleport/app/eom_app/app/core.py b/server/www/teleport/app/eom_app/app/core.py index dca9b4b..e1e29f4 100644 --- a/server/www/teleport/app/eom_app/app/core.py +++ b/server/www/teleport/app/eom_app/app/core.py @@ -18,7 +18,7 @@ import eom_common.eomcore.utils as utils from eom_common.eomcore.logger import log from .const import * from .configs import app_cfg -from .db import db +from .db import get_db from .session import web_session cfg = app_cfg() @@ -39,10 +39,10 @@ class WebServerCore: cfg.cfg_path = os.path.abspath(options['cfg_path']) # cfg.app_mode = APP_MODE_NORMAL - if os.path.exists(os.path.join(cfg.cfg_path, 'maintenance-mode')): - cfg.app_mode = APP_MODE_MAINTENANCE - else: - cfg.app_mode = APP_MODE_NORMAL + # if os.path.exists(os.path.join(cfg.cfg_path, 'maintenance-mode')): + # cfg.app_mode = APP_MODE_MAINTENANCE + # else: + # cfg.app_mode = APP_MODE_NORMAL _cfg_file = os.path.join(cfg.cfg_path, 'web.ini') if not cfg.load_web(_cfg_file): @@ -72,7 +72,11 @@ class WebServerCore: # db_path = os.path.join(cfg.data_path, 'ts_db.db') get_sqlite_pool().init(cfg.data_path) - db.init_sqlite(os.path.join(cfg.data_path, 'ts_db.db')) + get_db().init_sqlite(os.path.join(cfg.data_path, 'ts_db.db')) + if get_db().need_create or get_db().need_upgrade: + cfg.app_mode = APP_MODE_MAINTENANCE + else: + cfg.app_mode = APP_MODE_NORMAL return True diff --git a/server/www/teleport/app/eom_app/app/db.py b/server/www/teleport/app/eom_app/app/db.py index 0e1a4f3..5a94081 100644 --- a/server/www/teleport/app/eom_app/app/db.py +++ b/server/www/teleport/app/eom_app/app/db.py @@ -3,18 +3,24 @@ import os import threading import sqlite3 +import builtins from .configs import app_cfg from eom_common.eomcore.logger import log cfg = app_cfg() +__all__ = ['get_db'] -__all__ = ['db'] +# 注意,每次调整数据库结构,必须增加版本号,并且在升级接口中编写对应的升级操作 +TELEPORT_DATABASE_VERSION = 2 class TPDatabase: def __init__(self): + if '__teleport_db__' in builtins.__dict__: + raise RuntimeError('TPDatabase object exists, you can not create more than one instance.') + self.need_create = False # 数据尚未存在,需要创建 self.need_upgrade = False # 数据库已存在但版本较低,需要升级 self._conn_pool = None @@ -27,18 +33,21 @@ class TPDatabase: self._conn_pool = TPSqlitePool(db_file) if not os.path.exists(db_file): + log.w('database need create.\n') self.need_create = True return # 看看数据库中是否存在用户表(如果不存在,可能是一个空数据库文件),则可能是一个新安装的系统 ret = self._conn_pool.query('SELECT COUNT(*) FROM sqlite_master where type="table" and name="ts_account";') if ret[0][0] == 0: + log.w('database need create.\n') self.need_create = True return # 尝试从配置表中读取当前数据库版本号(如果不存在,说明是比较旧的版本了,则置为0) ret = self._conn_pool.query('SELECT value FROM ts_config where name="db_ver";') if 0 == len(ret): + log.w('database need upgrade.\n') self.need_upgrade = True @@ -89,12 +98,16 @@ class TPSqlitePool(TPDatabasePool): cursor.execute(sql) db_ret = cursor.fetchall() return db_ret - except: - log.e('') + except sqlite3.OperationalError: return list() finally: cursor.close() -db = TPDatabase() -del TPDatabase +def get_db(): + """ + :rtype : TPDatabase + """ + if '__teleport_db__' not in builtins.__dict__: + builtins.__dict__['__teleport_db__'] = TPDatabase() + return builtins.__dict__['__teleport_db__'] diff --git a/server/www/teleport/app/eom_app/controller/__init__.py b/server/www/teleport/app/eom_app/controller/__init__.py index 677b3fe..be9b822 100644 --- a/server/www/teleport/app/eom_app/controller/__init__.py +++ b/server/www/teleport/app/eom_app/controller/__init__.py @@ -23,8 +23,8 @@ __all__ = ['controllers'] controllers = [ (r'/', index.IndexHandler), - # (r'/install/', maintenance.InstallHandler), - # (r'/install', maintenance.InstallHandler), + (r'/maintenance/install', maintenance.InstallHandler), + (r'/maintenance/upgrade', maintenance.UpgradeHandler), (r'/maintenance/', maintenance.IndexHandler), (r'/maintenance', maintenance.IndexHandler), diff --git a/server/www/teleport/app/eom_app/controller/auth.py b/server/www/teleport/app/eom_app/controller/auth.py index 4001368..5c63398 100644 --- a/server/www/teleport/app/eom_app/controller/auth.py +++ b/server/www/teleport/app/eom_app/controller/auth.py @@ -2,22 +2,32 @@ import json +from eom_app.app.const import * +from eom_app.app.configs import app_cfg from eom_app.module import user from eom_common.eomcore.logger import * from .base import TPBaseHandler, TPBaseUserAuthHandler, TPBaseJsonHandler, TPBaseUserAuthJsonHandler from eom_app.app.util import gen_captcha +cfg = app_cfg() + class LoginHandler(TPBaseHandler): def get(self): _user = self.get_current_user() + _ref = self.get_argument('ref', '/') + + if _user['is_login']: + self.redirect(_ref) + return + if _user['id'] == 0: user_name = '' else: user_name = _user['name'] param = { - 'ref': self.get_argument('ref', '/'), + 'ref': _ref, 'user_name': user_name } self.render('auth/login.mako', page_param=json.dumps(param)) @@ -27,7 +37,7 @@ class VerifyUser(TPBaseJsonHandler): def post(self): code = self.get_session('captcha') if code is None: - self.write_json(-1, 'can not get captcha') + self.write_json(-1, '验证码已失效') return self.del_session('captcha') @@ -39,17 +49,20 @@ class VerifyUser(TPBaseJsonHandler): username = args['username'] userpwd = args['userpwd'] else: - self.write_json(-1, 'invalid param') + self.write_json(-1, '系统内部错误') return if code.lower() != captcha.lower(): - self.write_json(-1, 'invalid captcha') + self.write_json(-1, '验证码错误') return try: user_id, account_type, nickname = user.verify_user(username, userpwd) if user_id == 0: - self.write_json(-1, 'no such user or password.') + if cfg.app_mode == APP_MODE_MAINTENANCE: + self.write_json(-2, '系统维护中,请稍候再试') + else: + self.write_json(-1, '用户名/密码错误') return _user = self.get_session('user') @@ -75,7 +88,7 @@ class VerifyUser(TPBaseJsonHandler): except: log.e('can not set session.') - self.write_json(-1, 'session error.') + self.write_json(-1, '无法记录用户登录状态') class LogoutHandler(TPBaseUserAuthHandler): diff --git a/server/www/teleport/app/eom_app/controller/base.py b/server/www/teleport/app/eom_app/controller/base.py index 9139e89..354c07b 100644 --- a/server/www/teleport/app/eom_app/controller/base.py +++ b/server/www/teleport/app/eom_app/controller/base.py @@ -10,9 +10,10 @@ import mako.template import tornado.web from tornado.escape import json_encode +from eom_app.app.const import * from eom_app.app.session import web_session, SESSION_EXPIRE from eom_app.app.configs import app_cfg -from eom_app.app.const import * +from eom_app.app.db import get_db cfg = app_cfg() @@ -24,6 +25,7 @@ class TPBaseHandler(tornado.web.RequestHandler): MODE_HTTP = 0 MODE_JSON = 1 + # MODE_JSONP = 2 def __init__(self, application, request, **kwargs): @@ -165,6 +167,7 @@ class TPBaseUserAuthHandler(TPBaseHandler): return reference = self.request.uri + print(reference) user = self.get_current_user() if not user['is_login']: @@ -174,10 +177,19 @@ class TPBaseUserAuthHandler(TPBaseHandler): else: self.redirect('/auth/login') else: - if cfg.app_mode == APP_MODE_MAINTENANCE and user['type'] != 100: - self.render('maintenance/index.mako') - else: - pass + # if cfg.app_mode == APP_MODE_MAINTENANCE and user['type'] != 100: + # self.render('maintenance/index.mako') + # else: + # pass + if cfg.app_mode == APP_MODE_MAINTENANCE: + if user['type'] != 100: + self.render('maintenance/index.mako') + else: + if not reference.startswith('/maintenance/'): + if get_db().need_create: + self.redirect('/maintenance/install') + elif get_db().need_upgrade: + self.redirect('/maintenance/upgrade') class TPBaseAdminAuthHandler(TPBaseHandler): @@ -193,17 +205,18 @@ class TPBaseAdminAuthHandler(TPBaseHandler): user = self.get_current_user() if not user['is_login'] or user['type'] != 100: - if reference != '/auth/login': # 防止循环重定向 + if reference != '/auth/login': # 防止循环重定向 x = quote(reference) self.redirect('/auth/login?ref={}'.format(x)) else: self.redirect('/auth/login') else: if cfg.app_mode == APP_MODE_MAINTENANCE: - # TODO: 如果是维护模式,且尚未建立数据库,则引导用户进入安装界面,否则检查数据库版本,可能引导用户进入升级界面。 - self.render('maintenance/index.mako') - else: - pass + if not reference.startswith('/maintenance/'): + if get_db().need_create: + self.redirect('/maintenance/install') + elif get_db().need_upgrade: + self.redirect('/maintenance/upgrade') class TPBaseUserAuthJsonHandler(TPBaseJsonHandler): diff --git a/server/www/teleport/app/eom_app/controller/maintenance.py b/server/www/teleport/app/eom_app/controller/maintenance.py index 41aed8a..8a13b8d 100644 --- a/server/www/teleport/app/eom_app/controller/maintenance.py +++ b/server/www/teleport/app/eom_app/controller/maintenance.py @@ -1,9 +1,25 @@ # -*- coding: utf-8 -*- -from .base import TPBaseHandler +from .base import TPBaseUserAuthHandler, TPBaseAdminAuthHandler +from eom_app.app.db import get_db -class IndexHandler(TPBaseHandler): +class IndexHandler(TPBaseUserAuthHandler): def get(self): self.render('maintenance/index.mako') + +class InstallHandler(TPBaseAdminAuthHandler): + def get(self): + if get_db().need_upgrade: + return self.redirect('/maintenance/upgrade') + + self.render('maintenance/install.mako') + + +class UpgradeHandler(TPBaseAdminAuthHandler): + def get(self): + if get_db().need_create: + return self.redirect('/maintenance/install') + + self.render('maintenance/upgrade.mako') diff --git a/server/www/teleport/app/eom_app/module/user.py b/server/www/teleport/app/eom_app/module/user.py index 76a2756..d08a22b 100644 --- a/server/www/teleport/app/eom_app/module/user.py +++ b/server/www/teleport/app/eom_app/module/user.py @@ -22,7 +22,6 @@ def verify_user(name, password): if cfg.app_mode == APP_MODE_MAINTENANCE: if name == 'admin' and password == 'admin': return 1, 100, 'admin' - else: return 0, 0, '' if len(db_ret) != 1: diff --git a/server/www/teleport/static/js/ui/auth/login.js b/server/www/teleport/static/js/ui/auth/login.js index b2fb966..e720f81 100644 --- a/server/www/teleport/static/js/ui/auth/login.js +++ b/server/www/teleport/static/js/ui/auth/login.js @@ -152,7 +152,7 @@ ywl.create_app = function () { } else { hide_op_box(); - show_op_box('error', '无法登录TELEPORT!'); + show_op_box('error', '无法登录TELEPORT:'+ret.message); console.log(ret); } diff --git a/server/www/teleport/view/maintenance/install.mako b/server/www/teleport/view/maintenance/install.mako new file mode 100644 index 0000000..ce65b6e --- /dev/null +++ b/server/www/teleport/view/maintenance/install.mako @@ -0,0 +1,69 @@ +<%! + page_title_ = '安装配置' + ## page_menu_ = ['user'] + ## page_id_ = 'user' +%> +<%inherit file="../page_maintenance_base.mako"/> + +<%block name="breadcrumb"> + + + +<%block name="embed_css"> + + + +## Begin Main Body. + +
+ +
+
+ +
+ +
+ +
+
+

系统维护中...

+
+

系统管理员正在紧张地维护系统,请稍后刷新页面重试!

+
+ +
+
+ +
diff --git a/server/www/teleport/view/maintenance/upgrade.mako b/server/www/teleport/view/maintenance/upgrade.mako new file mode 100644 index 0000000..f040a44 --- /dev/null +++ b/server/www/teleport/view/maintenance/upgrade.mako @@ -0,0 +1,69 @@ +<%! + page_title_ = '系统升级' + ## page_menu_ = ['user'] + ## page_id_ = 'user' +%> +<%inherit file="../page_maintenance_base.mako"/> + +<%block name="breadcrumb"> + + + +<%block name="embed_css"> + + + +## Begin Main Body. + +
+ +
+
+ +
+ +
+ +
+
+

系统维护中...

+
+

系统管理员正在紧张地维护系统,请稍后刷新页面重试!

+
+ +
+
+ +