Zhiqim Console(管理控制台)是知启蒙框架中最简洁的管理控制台组件,没有数据库,只保留一个账号,非常适用于后端程序嵌入WEB控制台模式,包括首页、登录、主界面、左侧菜单和欢迎页功能,依赖该组件实现基本的账号验证,通过覆盖原则增加自有功能。

森中灵 最后提交于1月前 替换lib
ZmrBootstrap.java7KB
/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。[遇见知启蒙,邂逅框架梦,本文采用木兰宽松许可证第2版]
 * 
 * https://zhiqim.org/project/zhiqim_components/zhiqim_console.htm
 *
 * Zhiqim Console is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
package org.zhiqim.manager;

import java.lang.management.ManagementFactory;
import java.util.Collection;
import java.util.List;
import java.util.TreeMap;

import org.zhiqim.httpd.HttpRequest;
import org.zhiqim.httpd.context.ZmlBootstrap;
import org.zhiqim.kernel.annotation.AnAlias;
import org.zhiqim.kernel.config.ItemType;
import org.zhiqim.kernel.util.Bytes;
import org.zhiqim.kernel.util.Randoms;
import org.zhiqim.kernel.util.Resources;
import org.zhiqim.kernel.util.Streams;
import org.zhiqim.kernel.util.Strings;
import org.zhiqim.manager.dao.ZmrParamDao;
import org.zhiqim.manager.dbo.ZmrAvatar;
import org.zhiqim.manager.dbo.ZmrOperator;

/**
 * 初始化引导类
 *
 * @version v1.0.0 @author zouzhigang 2015-5-28 新建与整理
 */
@AnAlias("ZmrBootstrap")
public class ZmrBootstrap extends ZmlBootstrap implements ZmrConstants
{
    private static ZmrPassworder passworder = new ZmrPassworder();
    private static TreeMap<Long, ZmrAvatar> aMap = new TreeMap<>();
    private static String pidName;//管理台进程名(MAC下获取比较慢,所以在启动时加载)
    
    /*******************************************************************************/
    //初始化
    /*******************************************************************************/
    
    @Override
    public void log(HttpRequest request, String message, Throwable e)
    {
        if (message != null && Strings.contains(message, "[sessionUser]"))
            return;//sessionUser类的调用不打日志
        
        super.log(request, message, e);
    }
    
    @Override
    protected void initBefore() throws Exception
    {
        context.setAttribute(ZmrBootstrap.class, this);
        pidName = ManagementFactory.getRuntimeMXBean().getName();
    }
    
    @Override
    protected void initAfter() throws Exception
    {
        initOperator();
        initParam();
        initAvatar();
    }
    
    /** 初始化操作员 */
    private void initOperator() throws Exception
    {
        String passSalt = Randoms.lettersDigitsSecure(64);
        String password = passworder.encode(Z_NAME, ZMR_PASSWORD, passSalt);
        
        ZmrParamDao.addGroupIfNotExists(ZMR_NAME, 0, ItemType.PROTECTED, "管理台");
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_OPERATOR_CODE,            Z_NAME,     1,  ItemType.PRIVATE,    "管理员账号");
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_OPERATOR_PASS,            password,   2,  ItemType.PRIVATE,    "管理员密码");
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_OPERATOR_PASS_SALT,       passSalt,   3,  ItemType.PRIVATE,    "管理员密码盐值");
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_OPERATOR_AVATAR,          ""+_ID_13_, 4,  ItemType.PRIVATE,    "管理员头像编号");
    }
    
    /** 初始化参数 */
    private void initParam() throws Exception
    {
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_HAS_MANAGE_LOGIN,        "false",     1,  ItemType.PROTECTED,   "是否使用管理页登录退出功能");
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_HAS_VERIFICATION_CODE,   "false",     2,  ItemType.PROTECTED,   "是否需要验证码");
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_HAS_REMEMBER_CODE,       "true",      3,  ItemType.PROTECTED,    "是否显示记住账号");
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_HAS_REMEMBER_PASS,       "false",     4,  ItemType.PROTECTED,    "是否显示记住密码");
        ZmrParamDao.addParamIfNotExists(ZMR_NAME, ZMR_MAIN_URL,          "",          5,  ItemType.PUBLIC,       "指定登录之后的主页地址,为空取标准主页地址");
    }
    
    /** 初始化头像 */
    private void initAvatar() throws Exception
    {
        long avatarId = _ID_13_, avatarTime = System.currentTimeMillis();
        List<String> avatarNameList = Resources.getResourceNameList(ZmrBootstrap.class, AVATAR_PREFIX);
        for (String avatarName : avatarNameList)
        {
            byte[] data = Streams.getBytesClassPath(ZmrBootstrap.class, AVATAR_PREFIX + avatarName);
            
            data = Bytes.resizePNG(data, 100, 100);
            
            ZmrAvatar avatar = new ZmrAvatar();
            avatar.setAvatarId(avatarId);
            avatar.setAvatarTime(avatarTime);
            avatar.setAvatarData(data);
            
            aMap.put(avatarId++, avatar);
        }
    }
    
    /*******************************************************************************/
    //获取静态初始化数据
    /*******************************************************************************/
    
    public static ZmrPassworder getPassworder()
    {
        return passworder;
    }
    
    public static String getPidName()
    {
        return pidName;
    }
    
    public static ZmrAvatar getAvatar(long avatarId)
    {
        return aMap.get(avatarId);
    }
    
    public static Collection<ZmrAvatar> getAvatarList()
    {
        return aMap.values();
    }
    
    /*******************************************************************************/
    //操作员数据
    /*******************************************************************************/
    
    public static ZmrOperator getOperator()
    {
        String operatorCode = ZmrParamDao.getString(ZMR_NAME, ZMR_OPERATOR_CODE);
        String operatorPass = ZmrParamDao.getString(ZMR_NAME, ZMR_OPERATOR_PASS);
        String operatorPassSalt = ZmrParamDao.getString(ZMR_NAME, ZMR_OPERATOR_PASS_SALT);
        long operatorAvatar = ZmrParamDao.getLong(ZMR_NAME, ZMR_OPERATOR_AVATAR);
        
        ZmrOperator operator = new ZmrOperator();
        operator.setOperatorCode(operatorCode);
        operator.setOperatorPass(operatorPass);
        operator.setOperatorPassSalt(operatorPassSalt);
        operator.setOperatorAvatar(operatorAvatar);
        
        return operator;
    }
    
    public static void saveOperator(ZmrOperator operator) throws Exception
    {
        ZmrParamDao.doUpdate(ZMR_NAME, ZMR_OPERATOR_CODE, operator.getOperatorCode());
        ZmrParamDao.doUpdate(ZMR_NAME, ZMR_OPERATOR_PASS, operator.getOperatorPass());
        ZmrParamDao.doUpdate(ZMR_NAME, ZMR_OPERATOR_PASS_SALT, operator.getOperatorPassSalt());
        ZmrParamDao.doUpdate(ZMR_NAME, ZMR_OPERATOR_AVATAR, operator.getOperatorAvatar());
    }
}