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());
}
}