From 50a3d8558138eca671b913d6e071d2d7ad53b8ea Mon Sep 17 00:00:00 2001 From: rekoe Date: Tue, 29 Mar 2016 18:07:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81-=20?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E9=87=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/rekoe/domain/ProjectConfig.java | 13 ++++ .../rekoe/module/admin/AdminProjectAct.java | 2 +- .../rekoe/module/admin/AdminSvnUserAct.java | 65 +++++++++++++++++++ .../java/com/rekoe/service/EmailService.java | 22 ++++++- .../com/rekoe/service/EmailServiceImpl.java | 55 ++++++++++++++-- .../rekoe/service/ProjectConfigService.java | 4 ++ .../com/rekoe/service/ProjectService.java | 42 ++++++++++++ .../com/rekoe/service/SvnUserService.java | 10 +++ .../java/com/rekoe/utils/CommonUtils.java | 23 +++++++ .../template/admin/common/rest_pwd.ftl | 6 ++ .../WEB-INF/template/admin/email/rest_pwd.ftl | 60 +++++++++++++++++ .../WEB-INF/template/admin/project/config.ftl | 2 + .../template/admin/project_group/list.ftl | 2 +- .../WEB-INF/template/admin/svn_user/list.ftl | 28 ++++++++ 14 files changed, 324 insertions(+), 10 deletions(-) create mode 100644 src/main/webapp/WEB-INF/template/admin/common/rest_pwd.ftl create mode 100644 src/main/webapp/WEB-INF/template/admin/email/rest_pwd.ftl diff --git a/src/main/java/com/rekoe/domain/ProjectConfig.java b/src/main/java/com/rekoe/domain/ProjectConfig.java index 8ccc302..9235f63 100644 --- a/src/main/java/com/rekoe/domain/ProjectConfig.java +++ b/src/main/java/com/rekoe/domain/ProjectConfig.java @@ -42,6 +42,11 @@ public class ProjectConfig implements Serializable { @Comment("默认初始化目录") private List dirs; + @Column(hump = true) + @Comment("是否开启邮件变更提醒") + @Default("0") + private boolean emailNotify; + public List getDirs() { if (dirs == null) { this.dirs = new ArrayList<>(); @@ -49,6 +54,14 @@ public class ProjectConfig implements Serializable { return dirs; } + public boolean isEmailNotify() { + return emailNotify; + } + + public void setEmailNotify(boolean emailNotify) { + this.emailNotify = emailNotify; + } + public void setDirs(List dirs) { this.dirs = dirs; } diff --git a/src/main/java/com/rekoe/module/admin/AdminProjectAct.java b/src/main/java/com/rekoe/module/admin/AdminProjectAct.java index 99f0f09..e251e14 100644 --- a/src/main/java/com/rekoe/module/admin/AdminProjectAct.java +++ b/src/main/java/com/rekoe/module/admin/AdminProjectAct.java @@ -216,7 +216,7 @@ public class AdminProjectAct extends BaseAction { @RequiresPermissions({ "svn.project:conf" }) @PermissionTag(name = "配置管理", tag = "SVN项目管理", enable = false) public Message conf_update(@Param("::conf.") ProjectConfig conf, HttpServletRequest req) { - boolean isRight = projectConfigService.update(conf.getRepositoryPath(), conf.getDomainPath()); + boolean isRight = projectConfigService.update(conf); if (isRight) { return Message.success("ok", req); } diff --git a/src/main/java/com/rekoe/module/admin/AdminSvnUserAct.java b/src/main/java/com/rekoe/module/admin/AdminSvnUserAct.java index c125f68..6b99b74 100644 --- a/src/main/java/com/rekoe/module/admin/AdminSvnUserAct.java +++ b/src/main/java/com/rekoe/module/admin/AdminSvnUserAct.java @@ -1,11 +1,19 @@ package com.rekoe.module.admin; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.RandomStringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.aop.interceptor.async.Async; +import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; @@ -13,14 +21,22 @@ import org.nutz.mvc.annotation.Param; import com.rekoe.annotation.PermissionTag; import com.rekoe.common.Message; import com.rekoe.common.page.Pagination; +import com.rekoe.domain.Pj; +import com.rekoe.domain.ProjectConfig; import com.rekoe.domain.Usr; import com.rekoe.module.BaseAction; +import com.rekoe.service.EmailService; +import com.rekoe.service.ProjectConfigService; +import com.rekoe.service.SvnService; import com.rekoe.service.SvnUserService; +import com.rekoe.utils.EncryptUtil; @IocBean @At("/admin/svn/user") public class AdminSvnUserAct extends BaseAction { + private static final char[] RANDOM_ARRY_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray(); + @Inject private SvnUserService svnUserService; @@ -53,4 +69,53 @@ public class AdminSvnUserAct extends BaseAction { } return Message.error("error", req); } + + @Inject + private EmailService emailService; + + @Inject + private ProjectConfigService projectConfigService; + + @Inject + private SvnService svnService; + + /** + * 重置账号密码 + * + * @param usr + * @param req + * @return + */ + @At + @Ok("json") + @RequiresPermissions("svn.user:add") + @PermissionTag(name = "SVN添加账号", tag = "SVN账号管理", enable = false) + public Message restpwd(@Param("usr") String usr, HttpServletRequest req) { + Usr user = svnUserService.fetch(Cnd.where("usr", "=", usr)); + if (user == null) { + return Message.error("error.account.empty", req); + } + String code = RandomStringUtils.random(7, RANDOM_ARRY_CHAR); + svnUserService.update(Chain.make("psw", EncryptUtil.encrypt(code)), Cnd.where("usr", "=", usr)); + List list = svnUserService.getPjList(usr); + if (list != null) { + for (Pj pj : list) { + this.svnService.exportConfig(pj); + } + } + ProjectConfig conf = projectConfigService.get(); + emailNotify(user, emailService, conf, user.getEmail(), code); + return Message.success("ok", req); + } + + @Async + private void emailNotify(Usr user, EmailService emailService, ProjectConfig conf, String to, String pwd) { + if (conf.isEmailNotify() && Strings.isEmail(to)) { + Map root = new HashMap(); + root.put("name", user.getName()); + root.put("pwd", pwd); + root.put("usr", user.getUsr()); + emailService.restpwd(to, root); + } + } } diff --git a/src/main/java/com/rekoe/service/EmailService.java b/src/main/java/com/rekoe/service/EmailService.java index a271a2c..a17aa11 100644 --- a/src/main/java/com/rekoe/service/EmailService.java +++ b/src/main/java/com/rekoe/service/EmailService.java @@ -1,7 +1,27 @@ package com.rekoe.service; +import java.util.Map; + public interface EmailService { - boolean send(String to, String subject, String html); + public boolean send(String to, String subject, String templateFile, Map root); + + /** + * 密码重置 + * + * @param to + * @param root + * @return + */ + public boolean restpwd(String to, Map root); + + /** + * 项目开启 + * + * @param to + * @param root + * @return + */ + public boolean projectOpen(String to, Map root); } diff --git a/src/main/java/com/rekoe/service/EmailServiceImpl.java b/src/main/java/com/rekoe/service/EmailServiceImpl.java index 2470763..20615b1 100644 --- a/src/main/java/com/rekoe/service/EmailServiceImpl.java +++ b/src/main/java/com/rekoe/service/EmailServiceImpl.java @@ -1,31 +1,72 @@ package com.rekoe.service; +import java.io.File; +import java.util.Map; + import org.apache.commons.mail.HtmlEmail; import org.nutz.ioc.Ioc; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.log.Log; import org.nutz.log.Logs; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; -@IocBean(name="emailService") +import freemarker.template.Configuration; +import freemarker.template.Template; + +@IocBean(name = "emailService") public class EmailServiceImpl implements EmailService { private static final Log log = Logs.get(); - + @Inject("refer:$ioc") protected Ioc ioc; - public boolean send(String to, String subject, String html) { + @Inject + private Configuration configuration; + + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + public boolean send(String to, String subject, String templateFile, Map root) { try { HtmlEmail email = ioc.get(HtmlEmail.class); + email.setCharset("UTF-8"); email.setSubject(subject); - email.setHtmlMsg(html); + email.setHtmlMsg(processTemplateIntoString(templateFile, root)); email.addTo(to); - email.send(); + String res = email.send(); + if (log.isDebugEnabled()) { + log.debug(res); + } return true; - } catch (Throwable e) { - log.info("send email fail", e); + } catch (Exception e) { + log.error("send email fail", e); return false; } } + + private String processTemplateIntoString(String templateFile, Map root) { + try { + String path = "template" + File.separator + "admin" + File.separator + "common" + File.separator + templateFile + freeMarkerConfigurer.getSuffix(); + Template template = configuration.getTemplate(path); + template.setEncoding("UTF-8"); + java.io.StringWriter writer = new java.io.StringWriter(); + template.process(root, writer); + return writer.toString(); + } catch (Exception e) { + log.error(e); + } + return ""; + } + + @Override + public boolean restpwd(String to, Map root) { + return send(to, "svn-密码重置邮件<系统邮件,请勿回复>", "rest_pwd", root); + } + + @Override + public boolean projectOpen(String to, Map root) { + return send(to, "svn-项目开启邮件<系统邮件,请勿回复>", "project_open", root); + } } diff --git a/src/main/java/com/rekoe/service/ProjectConfigService.java b/src/main/java/com/rekoe/service/ProjectConfigService.java index fceceaf..76487ee 100644 --- a/src/main/java/com/rekoe/service/ProjectConfigService.java +++ b/src/main/java/com/rekoe/service/ProjectConfigService.java @@ -35,6 +35,10 @@ public class ProjectConfigService extends BaseService { dao().update(conf); return true; } + public boolean update(ProjectConfig conf) { + dao().update(conf); + return true; + } public void init() { get(); diff --git a/src/main/java/com/rekoe/service/ProjectService.java b/src/main/java/com/rekoe/service/ProjectService.java index a2f4814..51a7639 100644 --- a/src/main/java/com/rekoe/service/ProjectService.java +++ b/src/main/java/com/rekoe/service/ProjectService.java @@ -1,11 +1,19 @@ package com.rekoe.service; import java.io.File; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import org.apache.commons.lang3.StringUtils; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.sql.SqlCallback; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -166,4 +174,38 @@ public class ProjectService extends BaseService { public void update(Pj pj) { dao().update(pj); } + + /** + * @param usr + * 用户 + * @return 用户有权限的项目列表(用户是否是这个项目的管理员) + */ + public List getList(String usr) { + Sql sql = Sqls.create("select p.pj,p.path,p.url,p.des,p.type,pm.pj manager from ( " + " select distinct a.pj,a.path,a.url,a.des,a.type from pj a where " + " exists (select b.usr from pj_gr_usr b where a.pj=b.pj and b.usr=@usr) " + " or exists(select c.usr from pj_usr_auth c where a.pj=c.pj and c.usr=@usr) " + " ) p " + " left join ( " + " select distinct a.pj from pj a where " + " exists (select b.usr from pj_gr_usr b where a.pj=b.pj and b.usr=@usr and b.gr like @like)" + " ) pm on p.pj=pm.pj"); + final List list = new ArrayList(); + sql.setCallback(new SqlCallback() { + + @Override + public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException { + while (rs.next()) { + Pj pj = readPj(rs); + String manager = rs.getString("manager");// 是否是管理员组的用户 + pj.setManager(StringUtils.isNotBlank(manager)); + list.add(pj); + } + return list; + } + }); + sql.setParam("usr", usr).setParam("like", "%" + Constants.GROUP_MANAGER); + dao().execute(sql); + return list; + } + + public Pj readPj(ResultSet rs) throws SQLException { + Pj result = new Pj(); + result.setPj(rs.getString("pj")); + result.setDes(rs.getString("des")); + result.setType(rs.getString("type")); + return result; + } } \ No newline at end of file diff --git a/src/main/java/com/rekoe/service/SvnUserService.java b/src/main/java/com/rekoe/service/SvnUserService.java index 9496408..543da40 100644 --- a/src/main/java/com/rekoe/service/SvnUserService.java +++ b/src/main/java/com/rekoe/service/SvnUserService.java @@ -13,9 +13,11 @@ import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.dao.sql.SqlCallback; +import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; +import com.rekoe.domain.Pj; import com.rekoe.domain.Usr; /** @@ -91,4 +93,12 @@ public class SvnUserService extends BaseService { result.setRole(rs.getString("role")); return result; } + + @Inject + private ProjectService projectService; + + public List getPjList(String usr) { + List list = projectService.getList(usr);// 用户可以看到的所有项目 + return list; + } } diff --git a/src/main/java/com/rekoe/utils/CommonUtils.java b/src/main/java/com/rekoe/utils/CommonUtils.java index bf93aae..798ccc3 100644 --- a/src/main/java/com/rekoe/utils/CommonUtils.java +++ b/src/main/java/com/rekoe/utils/CommonUtils.java @@ -1,5 +1,8 @@ package com.rekoe.utils; +import java.io.File; +import java.net.URL; +import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -11,12 +14,15 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.nutz.lang.util.NutMap; +import org.nutz.log.Log; +import org.nutz.log.Logs; /** * 工具类 */ public class CommonUtils { + private final static Log log = Logs.get(); /** * 正则表达式:验证用户名 */ @@ -153,4 +159,21 @@ public class CommonUtils { } return paramsMap; } + + public static String getCurrentPath() { + URL url = CommonUtils.class.getProtectionDomain().getCodeSource().getLocation(); + String filePath = null; + try { + filePath = URLDecoder.decode(url.getPath(), "utf-8"); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + if (filePath.endsWith(".jar")) { + filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1); + } + File file = new File(filePath); + filePath = file.getAbsolutePath(); + return filePath; + } + } \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/template/admin/common/rest_pwd.ftl b/src/main/webapp/WEB-INF/template/admin/common/rest_pwd.ftl new file mode 100644 index 0000000..4d56da0 --- /dev/null +++ b/src/main/webapp/WEB-INF/template/admin/common/rest_pwd.ftl @@ -0,0 +1,6 @@ +${name}: 您好
+   + 账号:${usr}
+ 密码:${pwd}

+     密码信息请妥善保管。系统邮件请勿回复 +

\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/template/admin/email/rest_pwd.ftl b/src/main/webapp/WEB-INF/template/admin/email/rest_pwd.ftl new file mode 100644 index 0000000..ed5a8ab --- /dev/null +++ b/src/main/webapp/WEB-INF/template/admin/email/rest_pwd.ftl @@ -0,0 +1,60 @@ +

+

+${name}: 您好
+   + 账号:${usr}
+ 密码:${pwd}

+     密码信息请妥善保管。系统邮件请勿回复 + +

\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/template/admin/project/config.ftl b/src/main/webapp/WEB-INF/template/admin/project/config.ftl index 2434107..ba6812f 100644 --- a/src/main/webapp/WEB-INF/template/admin/project/config.ftl +++ b/src/main/webapp/WEB-INF/template/admin/project/config.ftl @@ -11,10 +11,12 @@
+<#assign isSend=obj.emailNotify> <@p.form id="jvForm" action="update" labelWidth="12" onsubmit="return false;"> <@p.hidden id="conf.id" name="conf.id" value='${obj.id}' /> <@p.text width="30" label="仓库路径" id="conf.repositoryPath" name="conf.repositoryPath" value="${obj.repositoryPath}" maxlength="100" class="required" required="true"/><@p.tr/> <@p.text width="30" label="访问url" id="conf.domainPath" name="conf.domainPath" value="${obj.domainPath}" maxlength="100" class="required" required="true"/><@p.tr/> +<@p.radio width="50" colspan="1" label="是否发送重置密码邮件" id="conf.emailNotify" name="conf.emailNotify" value=isSend list={"true":"global.true","false":"global.false"} required="true"/><@p.tr/> <@p.td label="默认开启的文件夹" colspan="6"> diff --git a/src/main/webapp/WEB-INF/template/admin/project_group/list.ftl b/src/main/webapp/WEB-INF/template/admin/project_group/list.ftl index 0a3fb9d..e99becb 100644 --- a/src/main/webapp/WEB-INF/template/admin/project_group/list.ftl +++ b/src/main/webapp/WEB-INF/template/admin/project_group/list.ftl @@ -25,7 +25,7 @@ function deleted(pj,gr){ $.message(message); if (message.type == "success") { - window.location.href = back; + window.location.href = list.rk; } } }); diff --git a/src/main/webapp/WEB-INF/template/admin/svn_user/list.ftl b/src/main/webapp/WEB-INF/template/admin/svn_user/list.ftl index f95522e..69b5f4d 100644 --- a/src/main/webapp/WEB-INF/template/admin/svn_user/list.ftl +++ b/src/main/webapp/WEB-INF/template/admin/svn_user/list.ftl @@ -8,6 +8,31 @@ function getTableForm() { return document.getElementById('tableForm'); } +function rest(usr){ + $.dialog({ + type: "warn", + content: '确定要充值用户密码?', + ok: 'Ok', + cancel: 'Cancel', + onOk: function() { + $.ajax({ + url: "restpwd.rk", + type: "POST", + data: {"usr":usr}, + dataType: "json", + cache: false, + success: function(message) { + $.message(message); + if (message.type == "success") + { + window.location.href = list.rk; + } + } + }); + } + }); + return false; +} @@ -30,6 +55,9 @@ function getTableForm() { <@p.column title="编辑" align="center"> 编辑<#rt/> <#t/> + <@p.column title="密码重置" align="center"> + 密码重置<#rt/> + <#t/>