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/>
@p.column><#t/>
+ <@p.column title="密码重置" align="center">
+ 密码重置<#rt/>
+ @p.column><#t/>
@shiro.hasPermission>
@p.table>
@p.form>