package net.loyin.controller;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.loyin.StaticCfg;
import net.loyin.jFinal.anatation.PowerBind;
import net.loyin.jFinal.anatation.RouteBind;
import net.loyin.jFinal.plugin.sqlXml.SqlManager;
import net.loyin.memcache.MemcacheTool;
import net.loyin.util.safe.MD5;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
/**
* 后台管理
*
* @author 刘声凤 2012-9-4 下午4:51:36
*/
@RouteBind(path = "/")
public class WebadminController extends BaseController {
public void index() {
this.setAttr("StaticCfg", new StaticCfg());
// Record m=this.getSessionAttr("manager");
Record m=getCurrentUser();
if(m==null){
this.setAttr("StaticCfg", new StaticCfg());
}else{
List<Record> menus=fetchMenu();
if(menus!=null&&menus.isEmpty()==false){
this.setAttr("menus",menus);
this.setAttr("pid", menus.get(0).getLong("id"));
this.setAttr("menuChild",menus);
this.setAttr("user",m);
this.render("main.html");
}
}
}
public void commmenu(){}
public void getmenu(){
this.setAttr("pid", getParaToLong(0));
this.setAttr("menuChild", fetchMenu());
}
@PowerBind
public void loginDialog(){
this.setAttr("StaticCfg", new StaticCfg());
this.render("loginDialog.html");
}
@SuppressWarnings("unchecked")
private List<Record> fetchMenu(){
String sid=getSession().getId();
Record m=getCurrentUser();
List<Record> menus=(List<Record>)MemcacheTool.mcc.get("menu"+sid);
if(menus==null||menus.isEmpty())
menus=Db.find(SqlManager.sql("webadmin.getpower"),m.get("id"));
if(menus!=null&&menus.isEmpty()==false){
//将菜单放置memcache
MemcacheTool.mcc.set("menu"+sid,menus,new Date(new Date().getTime()+86400000));
List<String> powersafecodelist=new ArrayList<String>();
for(Record menu:menus){
int menuType=Integer.valueOf(menu.get("type").toString());
if(menuType==2){
String safecode=menu.getStr("safecode");
if(safecode!=null&&!"".equals(safecode.trim())){
powersafecodelist.add(safecode);
}
}
}
//将按钮放置memcache
MemcacheTool.mcc.set("powersafecodelist"+sid,powersafecodelist,new Date(new Date().getTime()+86400000));
}
return menus;
}
@SuppressWarnings("unchecked")
@PowerBind
public void login(){
String username=this.getPara("username");
String pwd=this.getPara("pwd");
String code=this.getPara("code");
String check= this.getSessionAttr("check");
this.removeSessionAttr("check");
boolean validCode="1".equals((String)StaticCfg.get("validCode").get("value"))?true:false;
if(username==null||"".equals(username.trim())||pwd==null||"".equals(pwd)||(code==null||"".equals(code))&&validCode){
this.toDwzJson(300, "信息填写不全!");
}else
if((check==null||"".equals(check))&&validCode){
this.toDwzJson(300, "验证码超时!");
}else if(validCode&&(check!=null&&code!=null&&!check.equals(code.toLowerCase()))){
this.toDwzJson(300, "验证码错误!");
}else{
pwd=MD5.getMD5ofStr(pwd);
Record m=Db.findFirst(SqlManager.sql("webadmin.login"), new Object[]{username,pwd});
if(m!=null&&m.getLong("id")!=0){
// this.setSessionAttr("manager", m);
String nowsid=this.getSession().getId();
/**唯一登录,即同一用户只可在一处登录*/
/**第一步 获取所有的session集合
* 第二步 比较对应sessionid存储的Record记录
* 第三步 对应的session进行超时操作,删除sessionid对应的缓存*/
boolean single="1".equals(StaticCfg.get("single").get("value"))?true:false;
if(single){
Set<String>sessionSet=(Set<String>)MemcacheTool.mcc.get("clientSet");
if(sessionSet!=null&&sessionSet.isEmpty()==false){
Iterator<String> it= sessionSet.iterator();
while(it.hasNext()){
String sid=it.next();
Record r=(Record) MemcacheTool.mcc.get(sid);
if(r!=null)
if(!sid.equals(nowsid)&&r.get("userno").equals(m.get("userno"))){
MemcacheTool.mcc.delete(sid);
MemcacheTool.mcc.delete("menu"+sid);
MemcacheTool.mcc.delete("btn"+sid);
}
}
}
}
/**唯一登录结束*/
MemcacheTool.mcc.set(nowsid, m,new Date(new Date().getTime()+86400000));
fetchMenu();
this.toDwzJson(200, "登录成功");
}else{
this.toDwzJson(300, "用户名或密码错误");
}
}
}
@PowerBind
public void logout(){
// this.removeSessionAttr("manager");
String sessionid=this.getSession().getId();
MemcacheTool.mcc.delete(sessionid);
MemcacheTool.mcc.delete("menu"+sessionid);
MemcacheTool.mcc.delete("powersafecodelist"+sessionid);
this.redirect("/");
}
public void fun(){}
private static final String chars = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz";
private static final int WIDTH = 150;
private static final int HEIGHT = 50;
@PowerBind
public void jpg() {
HttpServletResponse response = this.getResponse();
HttpSession session = this.getSession();
response.setContentType("image/jpeg");
// 防止浏览器缓冲
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
char[] rands = getCode(4);
drawBackground(g);
drawRands(g, rands);
g.dispose();
try {
ServletOutputStream out = response.getOutputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", bos);
byte[] buf = bos.toByteArray();
response.setContentLength(buf.length);
out.write(buf);
bos.close();
out.close();
session.setAttribute("check", new String(rands).toLowerCase());
} catch (Exception e) {}
renderNull();
}
/**
* 产生随机数
* @return
*/
private char[] getCode(int length) {
char[] rands = new char[length];
for (int i = 0; i < length; i++) {
int rand = (int) (Math.random() * chars.length());
rands[i] = chars.charAt(rand);
}
return rands;
}
/**
* 绘制背景
*
* @param g
*/
private void drawBackground(Graphics g) {
g.setColor(new Color(255,255,255));
g.fillRect(0, 0, WIDTH, HEIGHT);
Random random = new Random();
int len = 0;
while (len <= 5) {
len = random.nextInt(15);
}
for (int i = 0; i < len; i++) {
int x = (int) (random.nextInt(WIDTH));
int y = (int) (random.nextInt(HEIGHT));
int red = (int) (255 - random.nextInt(200));
int green = (int) (255 - random.nextInt(200));
int blue = (int) (255 - random.nextInt(200));
g.setColor(new Color(red, green, blue));
// g.drawLine(x, y, random.nextInt(WIDTH)-x,
// random.nextInt(HEIGHT)-y);
g.drawOval(x, y, 2, 2);
}
}
/**
* 绘制验证码
* @param g
* @param rands
*/
private void drawRands(Graphics g, char[] rands) {
Random random = new Random();
g.setFont(new Font("黑体", Font.ITALIC | Font.BOLD, 45));
for (int i = 0; i < rands.length; i++) {
int red = (int) (random.nextInt(255));
int green = (int) (random.nextInt(255));
int blue = (int) (random.nextInt(255));
g.setColor(new Color(red, green, blue));
g.drawString("" + rands[i], i * 40, 40);
}
}
}