package controllers.backend.admin; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.imageio.ImageIO; import notifiers.MailsController; import org.apache.commons.io.FileUtils; import org.bson.types.ObjectId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import play.Play; import play.data.validation.Required; import play.libs.Codec; import play.libs.Images; import play.modules.morphia.Model.MorphiaQuery; import play.mvc.Before; import vo.AdminVO; import vo.AppConfigVO; import cn.bran.japid.util.StringUtils; import com.mongodb.gridfs.GridFSInputFile; import com.withiter.common.Constants; import com.withiter.models.account.CooperationRequest; import com.withiter.models.activity.Activity; import com.withiter.models.admin.MerchantAccount; import com.withiter.models.appconfig.AppConfig; import com.withiter.models.merchant.Merchant; import com.withiter.models.merchant.TopMerchant; import com.withiter.models.opinion.Opinion; import com.withiter.utils.ExceptionUtil; import controllers.BaseController; import controllers.UploadController; public class AdminController extends BaseController { private static Logger logger = LoggerFactory.getLogger(AdminController.class); /** * Interception any caller on this controller, will first invoke this method */ @Before(unless={"index","login"}) static void checkAuthentification() { if (!session.contains(Constants.ADMIN_SESSION_USERNAME)) { logger.debug("no session is found in Constants.ADMIN_SESSION_USERNAME"); renderJapidWith("japidviews.backend.admin.AdminController.index"); } } public static void index(){ renderJapid(); } /** * 管理员登陆 * @param email 登陆的email * @param password 登陆的密码 */ public static void login(@Required String email, @Required String password){ validation.required(email).message("请输入Email"); validation.required(password).message("请输入Password"); if(validation.hasErrors()){ renderHtml(validation.errors().get(0)); } validation.equals(email, "admin@quhao.la").message("请输入正确的Email"); validation.equals(password, "quhaola@123").message("请输入正确的Password"); if(validation.hasErrors()){ renderHtml(validation.errors().get(0)); } session.put(Constants.ADMIN_SESSION_USERNAME, email); home(); } /** * 管理员首页 */ public static void home(){ renderJapid(); } /** * 生成商家账号 * @param email * @param password */ public static void genAccount(String email, String password){ validation.required(email).message("请输入Email"); validation.required(password).message("请输入Password"); validation.email(email).message("请输入正确格式的Email"); validation.minSize(password, 6).message("密码长度为6-20"); validation.maxSize(password, 20).message("密码长度为6-20"); AdminVO avo = new AdminVO(); if(validation.hasErrors()){ avo.error = validation.errors().get(0).toString(); avo.result = validation.errors().get(0).toString(); renderJSON(avo); } // check email exist or not MerchantAccount a = MerchantAccount.findByEmail(email); if(a != null){ avo.error = "Email已经存在了,请换个其他的Email"; avo.result = "Email已经存在了,请换个其他的Email"; renderJSON(avo); } a = new MerchantAccount(); a.email = email; a.password = Codec.hexSHA1(password); a.save(); String hexedUid = Codec.hexSHA1(a.id()); String url = Play.configuration.getProperty("application.domain") + "/active?hid=" + hexedUid + "&oid=" + a.id(); // 如果邮件发送不成功,后台admin的账号管理可以看到激活连接,直接拷贝发送给商家即可 a.activeLink = url; a.save(); MailsController.sendTo(a.email, url); avo.error = ""; avo.result = "生成成功<br/>email:" + a.email + "<br/>password:" + password; renderJSON(avo); } /** * 显示生成账号情况 */ public static void accounts(int page){ if(page == 0){ page = 1; } int totalSize = MerchantAccount.totalSize(); int countPerPage = 10; int totalPage = totalSize / countPerPage; if(totalSize % countPerPage != 0){ totalPage++; } List<MerchantAccount> list = MerchantAccount.findNext(page, countPerPage); if(list == null || list.isEmpty()){ list = new ArrayList<MerchantAccount>(); renderJapid(list, page, totalPage); }else{ renderJapid(list, page, totalPage); } } /** * 跳转到置顶商家页面 */ public static void topmerchant(){ MorphiaQuery q = TopMerchant.q(); q.filter("enable", true); List<TopMerchant> tops = q.asList(); logger.debug("the size of top merchant is : " + tops.size()); renderJapid(tops); } /** * 跳转到活动页面 */ public static void activity(){ MorphiaQuery q = Activity.q(); q.filter("enable", true); List<Activity> as = q.asList(); logger.debug("The size of activity is : " + as.size()); renderJapid(as); } /** * 添加活动 */ public static void addActivity(@Required String mid, @Required String start, @Required String end, @Required String image){ if(validation.hasErrors()){ renderJSON(validation.errors()); } Merchant m = Merchant.findByMid(mid); if(m == null){ renderJSON("没有找到对应的商家ID"); } if(!m.enable){ renderJSON("此商家还没有开通取号啦服务不能发布活动"); } Activity a = new Activity(); a.mid = mid; a.cityCode = m.cityCode; a.enable = true; try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); a.start = sdf.parse(start); a.end = sdf.parse(end); } catch (ParseException e1) { e1.printStackTrace(); logger.error(ExceptionUtil.getTrace(e1)); } a.save(); GridFSInputFile file = uploadForActivity(image, a.id()); if (file != null) { try { String imageStorePath = Play.configuration.getProperty("imageActivity.store.path"); a.image = URLEncoder.encode(imageStorePath + file.getFilename(), "UTF-8"); a.save(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); logger.error(ExceptionUtil.getTrace(e)); } } activity(); } /** * 取消置顶 * @param mid 商家id */ public static void disableTop(String mid){ TopMerchant t = TopMerchant.findById(new ObjectId(mid)); t.enable = false; t.save(); topmerchant(); } /** * 生成置顶商家 * @param mid 商家id * @param starttime 置顶开始时间 * @param endtime 置顶结束时间 */ public static void enableTop(){ String mid = params.get("mid"); String starttime = params.get("starttime"); String endtime = params.get("endtime"); if(StringUtils.isEmpty(mid) || StringUtils.isEmpty(starttime) || StringUtils.isEmpty(endtime)){ renderJSON("商家ID/开始时间/结束时间 不能为空"); } String image = params.get("image"); Merchant m = Merchant.findByMid(mid); if(m == null){ renderJSON("没有找到对应的商家ID"); } if(!m.enable){ renderJSON("此商家还没有开通取号啦服务不能置顶,m.enable=false"); } TopMerchant t = TopMerchant.build(m); try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); t.start = sdf.parse(starttime); t.end = sdf.parse(endtime); Date now = new Date(); if(t.start.after(now)){ t.enable = false; } else { t.enable = true; } } catch (ParseException e) { e.printStackTrace(); logger.error(ExceptionUtil.getTrace(e)); } t.save(); if(!StringUtils.isEmpty(image)){ GridFSInputFile file = uploadFirst(image, t.id()); if (file != null) { try { String imageStorePath = Play.configuration.getProperty("image.store.path"); t.merchantImage = URLEncoder.encode(imageStorePath + file.getFilename(), "UTF-8"); t.save(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); logger.error(ExceptionUtil.getTrace(e)); } } } topmerchant(); } /** * 上传Top merchant图片 * @param param * @param mid * @return */ private static GridFSInputFile uploadFirst(String param, String tmid) { GridFSInputFile gfsFile = null; File[] files = params.get(param, File[].class); for (File file : files) { try { File desFile = Play.getFile("public/upload/" + file.getName()); Images.resize(file, desFile, 320, 120); gfsFile = UploadController.saveBinary(desFile, tmid); desFile.delete(); break; } catch (IOException e) { e.printStackTrace(); } } if (gfsFile == null) { return null; } else { return gfsFile; } } /** * 上传活动图片 * @param param * @param mid * @return */ private static GridFSInputFile uploadForActivity(String param, String activityId) { GridFSInputFile gfsFile = null; File[] files = params.get(param, File[].class); for (File file : files) { try { File desFile = Play.getFile("public/upload/" + file.getName()); FileUtils.copyFile(file, desFile); // Images.resize(file, desFile, 320, 120); gfsFile = UploadController.saveBinaryForActivity(desFile, activityId); desFile.delete(); break; } catch (IOException e) { e.printStackTrace(); } } if (gfsFile == null) { return null; } else { return gfsFile; } } /** * 跳转到合作申请页面 * @param page 第page页 */ public static void cooperate(int page){ if(page <= 0){ page = 1; } List<CooperationRequest> list = CooperationRequest.nextNoHandle(page); logger.debug("CooperationRequest's size is: " + list.size()); renderJapid(list); } /** * 标记合作申请为“已处理” */ public static void requesthandle(){ String rid = params.get("rid"); boolean flag = CooperationRequest.markHandled(rid); if(flag){ renderJSON(true); }else{ renderJSON(false); } } public static void feedback(int page){ if(page <=0){ page = 1; } int totalSize = Opinion.totalSize(); int countPerPage = 10; int totalPage = totalSize / countPerPage; if(totalSize % countPerPage != 0){ totalPage++; } List<Opinion> list = Opinion.nextNoHandle(page, countPerPage); renderJapid(list, page, totalPage); } /** * admin退出 */ public static void logout(){ session.current().remove(Constants.ADMIN_SESSION_USERNAME); session.current().remove(Constants.ADMIN_COOKIE_USERNAME); index(); } /** * App 配置管理页面 */ public static void app(){ List<AppConfig> configs = AppConfig.allConfig(); AppConfig android = null; AppConfig ios = null; List<AppConfigVO> acvos = new ArrayList<AppConfigVO>(); if(configs == null || configs.isEmpty()){ android = new AppConfig(); android.type = "Android"; android.version = "1.0"; android.erweimalink = ""; android.save(); ios = new AppConfig(); ios.type = "iOS"; ios.version = "1.0"; ios.erweimalink = ""; ios.save(); acvos.add(AppConfigVO.bulid(android)); acvos.add(AppConfigVO.bulid(ios)); } else { for(AppConfig vo : configs){ acvos.add(AppConfigVO.bulid(vo)); } } renderJapid(acvos); } /** * 更新App版本信息 */ public static void updateversion(){ String id = params.get("id"); String version = params.get("version"); String erweimalink = params.get("erweimalink"); AppConfig.update(id, version, erweimalink); app(); } /** * 处理反馈 * @param oid */ public static void feedbackHandle(@Required String oid){ if(validation.hasErrors()){ renderJSON(validation.errors().get(0)); } Opinion.handle(oid); AdminController.feedback(1); } }