diff --git a/src/main/java/com/cym/controller/HooksController.java b/src/main/java/com/cym/controller/HooksController.java new file mode 100644 index 0000000000000000000000000000000000000000..e2fa926b5b2edb59a52caa93b13b2177931a162d --- /dev/null +++ b/src/main/java/com/cym/controller/HooksController.java @@ -0,0 +1,120 @@ +package com.cym.controller; + + +import cn.hutool.core.date.DateUtil; +import com.cym.ext.RepositoryHisExt; +import com.cym.model.Repository; +import com.cym.model.RepositoryHis; +import com.cym.model.User; +import com.cym.service.RepositoryHisService; +import com.cym.service.RepositoryService; +import com.cym.service.SettingService; +import com.cym.service.UserService; +import com.cym.sqlhelper.bean.Page; +import com.cym.utils.BaseController; +import com.cym.utils.BeanExtUtil; +import com.cym.utils.PathUtls; +import com.cym.utils.SvnAdminUtils; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tmatesoft.svn.core.ISVNLogEntryHandler; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNLogEntry; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; +import org.tmatesoft.svn.core.io.SVNRepository; +import org.tmatesoft.svn.core.io.SVNRepositoryFactory; +import org.tmatesoft.svn.core.wc.SVNWCUtil; + +import java.util.List; + +@Controller +@Mapping("/hooks/") +public class HooksController extends BaseController { + + Logger logger = LoggerFactory.getLogger(HooksController.class); + @Inject + SettingService settingService; + @Inject + PathUtls pathUtls; + @Inject + SvnAdminUtils svnAdminUtils; + @Inject + RepositoryHisService repositoryHisService; + @Inject + UserService userService; + @Inject + RepositoryService repositoryService; + + /** + * 后台Hooks提交日志的方法 + * @param REPOS + * @param REV + * @param TXN_NAME + * @return + */ + @Mapping("addHis") + public String addHis( String REPOS ,String REV,String TXN_NAME ) { + + logger.error("REPOS====:"+ REPOS ); + logger.error("REV====:"+ REV ); + logger.error("TXN_NAME====:"+ TXN_NAME ); + + + try { + + String[] reps = REPOS.split("\\/"); + String repName = reps[reps.length-1]; + + String port = settingService.get("port"); + String url = pathUtls.buildUrl(port) + "/" + repName ; + Repository repository = repositoryService.getByName(repName,""); + + boolean repis = repositoryHisService.getIsRepositoryHis(repository.getId() , REV); + if(repis){ + return "仓库已存在"; + } + + SVNRepository svnRepository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(url)); + ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(svnAdminUtils.adminUserName, svnAdminUtils.adminUserPass.toCharArray()); + svnRepository.setAuthenticationManager(authManager); + + long version = Long.parseLong(REV); + svnRepository.log(new String[] { }, version , version , true, true, new ISVNLogEntryHandler() { + @Override + public void handleLogEntry(SVNLogEntry svnlogentry) throws SVNException { + + String Auther = svnlogentry.getAuthor(); + String commitMessage = svnlogentry.getMessage(); + String time = DateUtil.format(svnlogentry.getDate(), "yyyy-MM-dd HH:mm:ss"); + + User user = userService.getByName(Auther,""); + + RepositoryHis repositoryHis = new RepositoryHis(); + repositoryHis.setUserId(user.getId()); + repositoryHis.setRepositoryId(repository.getId()); + repositoryHis.setVersion(REV); + repositoryHis.setBizdate(time); + repositoryHis.setDescription(commitMessage); + + repositoryHisService.insertOrUpdate(repositoryHis); + + } + }); + + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + + return "仓库日志记录成功;REPOS="+REPOS+ "|REV="+REV +"|TXN_NAME="+TXN_NAME; + + + } + + + +} diff --git a/src/main/java/com/cym/controller/RepositoryController.java b/src/main/java/com/cym/controller/RepositoryController.java index 94caf562b2e3d1f6ca8324bc5d65c4294d3219f5..52f2a30760c51cd5296b5432e065ca17fbf2ba2d 100644 --- a/src/main/java/com/cym/controller/RepositoryController.java +++ b/src/main/java/com/cym/controller/RepositoryController.java @@ -102,7 +102,7 @@ public class RepositoryController extends BaseController { } @Mapping("addOver") - public JsonResult addOver(String name) { + public JsonResult addOver(String name,String describe,String rependdate,boolean cbislog) { if (StrUtil.isEmpty(name)) { return renderError("仓库名为空"); } @@ -118,7 +118,7 @@ public class RepositoryController extends BaseController { return renderError("该仓库文件夹已存在, 请使用扫描功能添加"); } - repositoryService.insertOrUpdate(name); + repositoryService.insertOrUpdate(name,describe,rependdate,cbislog); configService.refresh(); return renderSuccess(); diff --git a/src/main/java/com/cym/controller/RepositoryHisController.java b/src/main/java/com/cym/controller/RepositoryHisController.java new file mode 100644 index 0000000000000000000000000000000000000000..153e4003d6642c3873a47334136da358ff2e39fb --- /dev/null +++ b/src/main/java/com/cym/controller/RepositoryHisController.java @@ -0,0 +1,78 @@ +package com.cym.controller; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.cym.ext.RepositoryHisExt; +import com.cym.model.Repository; +import com.cym.model.RepositoryHis; +import com.cym.model.User; +import com.cym.service.RepositoryHisService; +import com.cym.service.RepositoryService; +import com.cym.service.SettingService; +import com.cym.service.UserService; +import com.cym.sqlhelper.bean.Page; +import com.cym.utils.*; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tmatesoft.svn.core.ISVNLogEntryHandler; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNLogEntry; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; +import org.tmatesoft.svn.core.io.SVNRepository; +import org.tmatesoft.svn.core.io.SVNRepositoryFactory; +import org.tmatesoft.svn.core.wc.SVNWCUtil; + +import java.util.List; + +@Controller +@Mapping("/adminPage/repositoryHis") +public class RepositoryHisController extends BaseController { + + Logger logger = LoggerFactory.getLogger(RepositoryHisController.class); + @Inject + RepositoryHisService repositoryHisService; + @Inject + UserService userService; + @Inject + RepositoryService repositoryService; + + @Mapping("") + public ModelAndView index(Page page , String keywords) { + + User user = getLoginUser(); + + page = repositoryHisService.getListByRepositoryHis( page , user , keywords); + + Page pageExt = BeanExtUtil.copyPageByProperties(page, RepositoryHisExt.class); + + for (RepositoryHisExt repositoryHisExt : (List) pageExt.getRecords()) { + + repositoryHisExt.setUser( userService.getById( repositoryHisExt.getUserId() ) ); + + repositoryHisExt.setUserLastName( repositoryHisExt.getUser().getTrueName().substring(repositoryHisExt.getUser().getTrueName().length()-1) ); + + repositoryHisExt.setRepository( repositoryService.getById( repositoryHisExt.getRepositoryId() )); + + repositoryHisExt.setBizdate( repositoryHisExt.getBizdate().substring(0,19) ); + + } + + ModelAndView modelAndView = new ModelAndView("/adminPage/repositoryHis/index.html"); + modelAndView.put("keywords", keywords); + modelAndView.put("page", pageExt); + + return modelAndView; + + } + + + + +} diff --git a/src/main/java/com/cym/ext/RepositoryHisExt.java b/src/main/java/com/cym/ext/RepositoryHisExt.java new file mode 100644 index 0000000000000000000000000000000000000000..dc30f3d9f3bf792c5fc6ec753c6809291fe7a983 --- /dev/null +++ b/src/main/java/com/cym/ext/RepositoryHisExt.java @@ -0,0 +1,46 @@ +package com.cym.ext; + +import com.cym.model.Repository; +import com.cym.model.RepositoryHis; +import com.cym.model.User; + +public class RepositoryHisExt extends RepositoryHis { + + RepositoryHis repositoryHis; + + Repository repository; + + User user; + + String userLastName; + + + public RepositoryHis getRepositoryHis() { + return repositoryHis; + } + + public void setRepositoryHis(RepositoryHis repositoryHis) { + this.repositoryHis = repositoryHis; + } + + public Repository getRepository() { + return repository; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getUserLastName() { return userLastName; } + + public void setUserLastName(String userLastName) { this.userLastName = userLastName; } + +} diff --git a/src/main/java/com/cym/model/Repository.java b/src/main/java/com/cym/model/Repository.java index 7427a093dd5ae737e69d52484c89d8b3fa289df2..1b095cff5be744247e2124e23baa8ac120c09b0f 100644 --- a/src/main/java/com/cym/model/Repository.java +++ b/src/main/java/com/cym/model/Repository.java @@ -15,6 +15,13 @@ public class Repository extends BaseModel { // 文件夹大小 String size; + //描述 + String describe; + + //到期时间 + String rependdate; + + public String getSize() { return size; } @@ -39,4 +46,11 @@ public class Repository extends BaseModel { this.name = name; } + public String getDescribe() {return describe;} + + public void setDescribe(String describe) { this.describe = describe;} + + public String getRependdate() {return rependdate;} + + public void setRependdate(String rependdate) { this.rependdate = rependdate;} } diff --git a/src/main/java/com/cym/model/RepositoryHis.java b/src/main/java/com/cym/model/RepositoryHis.java new file mode 100644 index 0000000000000000000000000000000000000000..6445e3ed00d159c48b4b024f7ce50ac364619af6 --- /dev/null +++ b/src/main/java/com/cym/model/RepositoryHis.java @@ -0,0 +1,59 @@ +package com.cym.model; + +import com.cym.sqlhelper.bean.BaseModel; +import com.cym.sqlhelper.config.Table; + + +@Table +public class RepositoryHis extends BaseModel { + + String repositoryId; + + String userId; + + String bizdate; + + String description; + + String version; + + public String getRepositoryId() { + return repositoryId; + } + + public void setRepositoryId(String repositoryId) { + this.repositoryId = repositoryId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getBizdate() { + return bizdate; + } + + public void setBizdate(String bizdate) { + this.bizdate = bizdate; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/src/main/java/com/cym/nsl/utils/WebHooks.java b/src/main/java/com/cym/nsl/utils/WebHooks.java new file mode 100644 index 0000000000000000000000000000000000000000..b60e9dff31d82155175c5fabb2ebcbe6f2349e54 --- /dev/null +++ b/src/main/java/com/cym/nsl/utils/WebHooks.java @@ -0,0 +1,81 @@ +package com.cym.nsl.utils; + +import cn.hutool.http.HttpUtil; +import com.mysql.cj.util.StringUtils; +import org.codehaus.plexus.util.Base64; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +public class WebHooks { + + + public static String WebHooks(String url , String secret , String json ){ + + String postUrl = ""; + //钉钉 + if(url.contains("https://oapi.dingtalk.com/robot/send")){ + postUrl = dingding_WebHooks(url,secret); + } + + + + if(StringUtils.isNullOrEmpty(postUrl)){ + return "请求无法识别,请确认推送地址!"; + } + + String res = HttpUtil.post( postUrl , json, 2000); + System.out.println(res); + return res ; + + } + + + private static String dingding_WebHooks( String url , String secret ){ + String postUrl = ""; + try { + + Long timestamp = System.currentTimeMillis(); + + String stringToSign = timestamp + "\n" + secret; + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256")); + byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); + String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8"); + System.out.println(sign); + + postUrl = url + "×tamp="+timestamp+ "&sign=" + sign ; + + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } catch (InvalidKeyException e) { + throw new RuntimeException(e); + } + + return postUrl ; + + } + + public static void main(String[] arRepositoryHisServicegs) throws Exception { + + WebHooks("https://oapi.dingtalk.com/robot/send?access_token=73ff144ed6c1416ab7f60b6e73168a986dd53bb7cc0239785f0385265154f755","SECafaa07270caeae61527ff11d07b892567b5010a447249d551e9ee6b722d7f62a","{\n" + + " \"commitMessage\": \"123\",\n" + + " \"author\": \"svnAdmin\",\n" + + " \"repository\": \"test3\",\n" + + " \"revision\": 7,\n" + + " \"password\": \"SECafaa07270caeae61527ff11d07b892567b5010a447249d551e9ee6b722d7f62a\",\n" + + " \"time\": \"2022-04-12 22:58:30\"\n" + + "}"); + + } + + + + +} diff --git a/src/main/java/com/cym/service/RepositoryHisService.java b/src/main/java/com/cym/service/RepositoryHisService.java new file mode 100644 index 0000000000000000000000000000000000000000..364616f9640c0233a01e5153367d4fa324000621 --- /dev/null +++ b/src/main/java/com/cym/service/RepositoryHisService.java @@ -0,0 +1,91 @@ +package com.cym.service; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import com.cym.model.Repository; +import com.cym.model.RepositoryHis; +import com.cym.model.RepositoryUser; +import com.cym.model.User; +import com.cym.sqlhelper.bean.Page; +import com.cym.sqlhelper.bean.Sort; +import com.cym.sqlhelper.utils.ConditionAndWrapper; +import com.cym.sqlhelper.utils.ConditionOrWrapper; +import com.cym.sqlhelper.utils.SqlHelper; +import org.noear.solon.annotation.Inject; +import org.noear.solon.extend.aspect.annotation.Service; + +import java.io.File; +import java.io.InputStream; +import java.util.List; + + +@Service +public class RepositoryHisService { + + @Inject + SqlHelper sqlHelper; + + public Page getListByRepositoryHis(Page page , User user, String keywords) { + + ConditionAndWrapper conditionAndWrapper = new ConditionAndWrapper(); + Sort sort = new Sort(); + sort.add("bizdate",Sort.Direction.DESC ) ; + + //这里是首页仓库查询权限需要的 + if( 1 != user.getType() ){ + //查询用户直接授权 + List listRepositoryUser = sqlHelper.findListByQuery (new ConditionAndWrapper().eq(RepositoryUser::getUserId, user.getId() ), RepositoryUser.class); + + String[] strArr = new String[listRepositoryUser.size()]; + for (int i = 0; i < listRepositoryUser.size(); i++) { + strArr[i] = listRepositoryUser.get(i).getRepositoryId(); + } + + conditionAndWrapper.and(new ConditionOrWrapper().in( RepositoryHis::getRepositoryId , strArr )); + } + if (StrUtil.isNotEmpty(keywords)) { + conditionAndWrapper.and(new ConditionOrWrapper().like(Repository::getName, keywords)); + } + + Page pageResp = sqlHelper.findPage( conditionAndWrapper, sort , page , RepositoryHis.class); + + return pageResp; + + } + + public boolean getIsRepositoryHis(String repository , String version ) { + + ConditionAndWrapper conditionAndWrapper = new ConditionAndWrapper(); + conditionAndWrapper.and(new ConditionOrWrapper().eq( RepositoryHis::getId, repository ).eq(RepositoryHis::getVersion, version )); +// conditionAndWrapper.and(new ConditionOrWrapper().eq( RepositoryHis::getVersion, version )); + + //查询仓库是否存在直接授权 + List repositoryHis = sqlHelper.findListByQuery (conditionAndWrapper , RepositoryHis.class); + + return repositoryHis.size() > 0 ? true : false; + + } + + public Page getListByRepositoryHis(Page page , String repositoryId) { + + ConditionAndWrapper conditionAndWrapper = new ConditionAndWrapper(); + Sort sort = new Sort(); + sort.add("bizdate",Sort.Direction.DESC ) ; + + conditionAndWrapper.and(new ConditionOrWrapper().eq( RepositoryHis::getRepositoryId , repositoryId) ); + + Page pageResp = sqlHelper.findPage( conditionAndWrapper, sort , page , RepositoryHis.class); + + return pageResp; + + } + + public void insertOrUpdate(RepositoryHis repositoryhis) { + + sqlHelper.insertOrUpdate(repositoryhis); + } + + +} diff --git a/src/main/java/com/cym/service/RepositoryService.java b/src/main/java/com/cym/service/RepositoryService.java index fd1bc0bf77a9e046bbed581b13e527dfd134dae1..f42c210db430624d990f30db91a4843b370b1749 100644 --- a/src/main/java/com/cym/service/RepositoryService.java +++ b/src/main/java/com/cym/service/RepositoryService.java @@ -5,6 +5,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import com.cym.utils.RuntimeExec; import org.noear.solon.annotation.Inject; import org.noear.solon.extend.aspect.annotation.Service; import org.slf4j.Logger; @@ -26,11 +27,9 @@ import com.cym.sqlhelper.utils.ConditionAndWrapper; import com.cym.sqlhelper.utils.ConditionOrWrapper; import com.cym.sqlhelper.utils.SqlHelper; import com.cym.utils.BeanExtUtil; -import com.cym.utils.SystemTool; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.resource.ClassPathResource; -import cn.hutool.core.util.RuntimeUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; @@ -63,6 +62,11 @@ public class RepositoryService { return sqlHelper.findOneByQuery(conditionAndWrapper, Repository.class); } + public Repository getById( String repositoryId) { + ConditionAndWrapper conditionAndWrapper = new ConditionAndWrapper().eq(Repository::getId, repositoryId); + return sqlHelper.findOneByQuery(conditionAndWrapper, Repository.class); + } + public void deleteById(String repositoryId) { Repository repository = sqlHelper.findById(repositoryId, Repository.class); String dir = homeConfig.home + "repo" + File.separator + repository.getName(); @@ -74,7 +78,7 @@ public class RepositoryService { } - public void insertOrUpdate(String name) { + public void insertOrUpdate(String name, String describe,String rependdate,boolean cbislog) { // 创建仓库 String dir = homeConfig.home + "repo" + File.separator + name; @@ -86,10 +90,21 @@ public class RepositoryService { FileUtil.mkdir(dir); ZipUtil.unzip(temp, new File(dir)); FileUtil.del(temp); + //勾选表示需要,则进行授权,否则进行删除 + if(cbislog){ + RuntimeExec.Runtime(dir); + }else{ + FileUtil.del(dir+"\\hooks\\pre-commit"); + } + + } Repository repository = new Repository(); repository.setName(name); + repository.setDescribe(describe); + repository.setRependdate(rependdate); + sqlHelper.insertOrUpdate(repository); } @@ -266,7 +281,7 @@ public class RepositoryService { && FileUtil.exist(file.getPath() + File.separator + "locks")) { Long count = sqlHelper.findCountByQuery(new ConditionAndWrapper().eq(Repository::getName, file.getName()), Repository.class); if (count == 0) { - insertOrUpdate(file.getName()); + insertOrUpdate(file.getName(), "","",false); } } } diff --git a/src/main/java/com/cym/service/UserService.java b/src/main/java/com/cym/service/UserService.java index cef426f3878770610b3e9f15e963a04c6c1f6324..8cdb339f26ad7006e29f06530c7b3a5dfec5f1d9 100644 --- a/src/main/java/com/cym/service/UserService.java +++ b/src/main/java/com/cym/service/UserService.java @@ -54,6 +54,11 @@ public class UserService { return sqlHelper.findOneByQuery(conditionAndWrapper, User.class); } + public User getById( String userId ) { + ConditionAndWrapper conditionAndWrapper = new ConditionAndWrapper().eq( User:: getId, userId ) ; + + return sqlHelper.findOneByQuery(conditionAndWrapper, User.class); + } public void importUser(String name, String pass) { Long count = sqlHelper.findCountByQuery(new ConditionAndWrapper().eq(User::getName, name), User.class); diff --git a/src/main/java/com/cym/utils/RuntimeExec.java b/src/main/java/com/cym/utils/RuntimeExec.java new file mode 100644 index 0000000000000000000000000000000000000000..11d49f12434ba5d8a26615cb6d2eb6d908136a87 --- /dev/null +++ b/src/main/java/com/cym/utils/RuntimeExec.java @@ -0,0 +1,48 @@ +package com.cym.utils; + +import java.io.IOException; + +public class RuntimeExec { + + public static void Runtime(String pathName ) { + try { + + String osType = getOSType(); + if("linux".equals(osType)){ + String [] cmd={"/bin/sh","-c","chmod -R 777 " + pathName }; + //执行curl命令 + Process proc = Runtime.getRuntime().exec(cmd); + //进程阻塞(非常重要,缺少则容易报错) + proc.waitFor(); + }else if("windows".equals(osType)){ + //windos 暂时不考虑授权 + + + } + + }catch (IOException e) { + throw new RuntimeException(e); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + } + + public static String getOSType(){ + String ostype = ""; + String os = System.getProperty("os.name"); + //Windows操作系统 + if (os != null && os.toLowerCase().startsWith("windows")) { + System.out.println(String.format("当前系统版本是:%s", os)); + ostype = "windows"; + } else if (os != null && os.toLowerCase().startsWith("linux")) {//Linux操作系统 + System.out.println(String.format("当前系统版本是:%s", os)); + ostype = "linux"; + } else { //其它操作系统 + System.out.println(String.format("当前系统版本是:%s", os)); + ostype = "other"; + } + return ostype; + } + +} diff --git a/src/main/java/com/cym/utils/SvnAdminUtils.java b/src/main/java/com/cym/utils/SvnAdminUtils.java index 7a032a20bbf3b55cd20a01f5f2a0d7001d78c417..d40d23b9972edeab236247764f0ecc2d9b5fd72f 100644 --- a/src/main/java/com/cym/utils/SvnAdminUtils.java +++ b/src/main/java/com/cym/utils/SvnAdminUtils.java @@ -16,7 +16,7 @@ public class SvnAdminUtils { @Init public void init() throws UnknownHostException, SocketException { adminUserName = "svnAdmin"; - adminUserPass = UUID.randomUUID().toString(); + adminUserPass = "f12ffcbc-4acf-4632-ae7c-19128a517e93";//UUID.randomUUID().toString(); } public String getAdminUserName() { diff --git a/src/main/resources/WEB-INF/view/adminPage/menu.html b/src/main/resources/WEB-INF/view/adminPage/menu.html index b1ed501f58c3d2fc6c91cc68827913a54ecc38f6..572a55109c31dee27444e13fbd6875f6cfb88cee 100644 --- a/src/main/resources/WEB-INF/view/adminPage/menu.html +++ b/src/main/resources/WEB-INF/view/adminPage/menu.html @@ -27,6 +27,9 @@
小组管理
+
+ 提交日志 +
diff --git a/src/main/resources/WEB-INF/view/adminPage/repository/index.html b/src/main/resources/WEB-INF/view/adminPage/repository/index.html index 38b0430ef079a45c1efd5c9043f66520a20321ec..45ad6985950e53860748038fca667261d35b1f1a 100644 --- a/src/main/resources/WEB-INF/view/adminPage/repository/index.html +++ b/src/main/resources/WEB-INF/view/adminPage/repository/index.html @@ -49,11 +49,13 @@ - +
+ + @@ -68,6 +70,8 @@ ${repositoryExt.url}    复制 + +
仓库名 url描述到期日期 仓库大小 全体授权 授权 ${repositoryExt.describe}${repositoryExt.rependdate} ${repositoryExt.size} <#if repositoryExt.allPermission=='r'> 只读 @@ -86,6 +90,10 @@ + + + +
@@ -98,13 +106,15 @@
+
-
+ + @@ -122,6 +132,33 @@
+
仓库的访问路径地址,建议使用英文和数字
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
默认仓库到期时间为90天
+
+
+
+
+
diff --git a/src/main/resources/WEB-INF/view/adminPage/repositoryHis/index.html b/src/main/resources/WEB-INF/view/adminPage/repositoryHis/index.html new file mode 100644 index 0000000000000000000000000000000000000000..4bf6ac16db3f6ad8ea0fea0a94001a21e3305338 --- /dev/null +++ b/src/main/resources/WEB-INF/view/adminPage/repositoryHis/index.html @@ -0,0 +1,66 @@ + + + +<#include "/adminPage/common.html"/> + + + +
+ <#include "/adminPage/header.html"/> + <#include "/adminPage/menu.html"/> + +
+ +
+
+ 仓库动态 +
+ + + + + + + + + + + + + + <#list page.records as recordsHisExt> + + + + + + + + + + +
仓库名头像更新人描述提交时间操作
+ + ${recordsHisExt.repository.name} + + <#if recordsHisExt.user.avatarUrl != null> + + <#else> +
${recordsHisExt.userLastName}
+ +
${recordsHisExt.user.trueName}${recordsHisExt.description}${recordsHisExt.bizdate} + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/src/main/resources/app.yml b/src/main/resources/app.yml index 66e60805c422afaa2a452fc3532e60a557a63193..3eb69cdc93b8d082a0f960274c5b22b2e220edf8 100644 --- a/src/main/resources/app.yml +++ b/src/main/resources/app.yml @@ -7,7 +7,7 @@ server: project: sqlPrint: false beanPackage: com.cym.model - home: /home/svnWebUI/ + home: /data/svn findPass: false solon: @@ -23,8 +23,7 @@ solon: level: INFO database: - type: h2 - url: - username: - password: - \ No newline at end of file + type: mysql + url: jdbc:mysql://xajxnm.com:43306/svnwebui66?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC + username: svnwebui66 + password: sFZf7WsTadSGejbY diff --git a/src/main/resources/file/repo.zip b/src/main/resources/file/repo.zip index d547becef110bc4a4eb5c1e9638ab796e13fe206..b49cd72cb6492e52e065e36f6fc93d11f3a8e03c 100644 Binary files a/src/main/resources/file/repo.zip and b/src/main/resources/file/repo.zip differ diff --git a/src/main/resources/static/css/adminPage/base.css b/src/main/resources/static/css/adminPage/base.css index a59e6495e492c53b6bdbf5b2f3fab84cf56716dc..2fda589e5529b2e96b584b9266ef3a50df8eae56 100644 --- a/src/main/resources/static/css/adminPage/base.css +++ b/src/main/resources/static/css/adminPage/base.css @@ -35,4 +35,20 @@ font-weight:bolder; display: inline-block; margin-left: 10px; -} \ No newline at end of file +} + +.avatar-container { + height: 2rem; + width: 2rem; + line-height: 2rem; + display: inline-block; + background: #009688 ; + text-align: center; + border-radius: 2rem; + color:#FFFFFF; +} + +.avatar-content { + display: block; +} + diff --git a/src/main/resources/static/js/adminPage/base.js b/src/main/resources/static/js/adminPage/base.js index c9e080fa3c8c71f297c95a6ab8a3aaedc0faaee3..0f2b86213718afa2ef40b7eb28be16e65f5bac49 100644 --- a/src/main/resources/static/js/adminPage/base.js +++ b/src/main/resources/static/js/adminPage/base.js @@ -120,6 +120,14 @@ function formatDate(now) { return new Date(now).format("yyyy-MM-dd HH:mm:ss"); } +function formatDate(format,adddays ){ + var d = new Date();//定义了一个时间类型d, 来获取当前的时间 + + d.setDate(d.getDate() + adddays) + return d.format(format); + +} + // 查看图片 function seePic(url) { window.open(url); diff --git a/src/main/resources/static/js/adminPage/repository/index.js b/src/main/resources/static/js/adminPage/repository/index.js index df99f0003c6fd50fa553ae286172ddd0e924d4f4..6ca4e0e0fabac7b8abdfcb74a1f247353dd18ca2 100644 --- a/src/main/resources/static/js/adminPage/repository/index.js +++ b/src/main/resources/static/js/adminPage/repository/index.js @@ -29,6 +29,102 @@ $(function() { }); + var date = formatDate("yyyy-MM-dd", 90 ); + layui.use('laydate', function(){ + var laydate = layui.laydate; + //执行一个laydate实例 + laydate.render({ + elem: '#rependdate' //指定元素 + ,value: date + ,isInitValue: true //是否允许填充初始值,默认为 true + }); + }); + + var dropdown = layui.dropdown + dropdown.render({ + elem: '#actionRep' //可绑定在任意元素中,此处以上述按钮为例 + ,data: [{ + title: '查看文件' + ,id: 100 + ,href: 'javascript:void(0);' + ,repurl: $("#actionRep").attr("repurl") + },{ + title: '导入备份' + ,id: 101 + ,href: 'javascript:void(0);' //开启超链接 + ,onclick:"loadBak('"+ $("#actionRep").attr("repid") +"', '"+ $("#actionRep").attr("repname") +"')" + },{ + title: '导出备份' + ,id: 102 + ,href: 'javascript:void(0);' //开启超链接 + ,onclick:"dumpBak('"+ $("#actionRep").attr("repid") +"')" + },{ + title: '删除' + ,id: 103 + ,href: 'javascript:void(0);' //开启超链接 + ,onclick:"del('"+ $("#actionRep").attr("repid") +"')" + } + + ] + ,id: 'actionRep' + //菜单被点击的事件 + ,click: function(obj){ + debugger + if (obj.id == 100 ){ + seeFile(obj.repurl,'rw') + }else if (obj.id == 101){ + + }else if (obj.id == 102){ + + }else if (obj.id == 103){ + + } + + console.log(obj); + } + + }); + + + var table = layui.table //表格 + //监听行工具事件 + table.on('tool(reptable)', function(obj){ //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值" + debugger + var data = obj.data //获得当前行数据 + ,layEvent = obj.event; //获得 lay-event 对应的值 + if(layEvent === 'detail'){ + layer.msg('查看操作'); + } else if(layEvent === 'more'){ + //下拉菜单 + dropdown.render({ + elem: this //触发事件的 DOM 对象 + ,show: true //外部事件触发即显示 + ,data: [{ + title: '编辑' + ,id: 'edit' + },{ + title: '删除' + ,id: 'del' + }] + ,click: function(menudata){ + debugger + if(menudata.id === 'del'){ + layer.confirm('真的删除行么', function(index){ + obj.del(); //删除对应行(tr)的DOM结构 + layer.close(index); + //向服务端发送删除指令 + }); + } else if(menudata.id === 'edit'){ + layer.msg('编辑操作,当前行 ID:'+ data.id); + } + } + ,align: 'right' //右对齐弹出(v2.6.8 新增) + ,style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' //设置额外样式 + }) + } + }); + + }) @@ -70,7 +166,7 @@ function showWindow(title) { layer.open({ type: 1, title: title, - area: ['400px', '200px'], // 宽高 + area: ['550px', '420px'], // 宽高 content: $('#windowDiv') }); } @@ -88,16 +184,20 @@ function addOver() { layer.msg("仓库名不能包含特殊字符"); return; } - +debugger $.ajax({ type: 'POST', url: ctx + '/adminPage/repository/addOver', data: { - name: $("#name").val() + name: $("#name").val(), + describe: $("#describe").val(), + rependdate: $("#rependdate").val(), + cbislog: $("#cbislog").prop("checked") }, dataType: 'json', success: function(data) { if (data.success) { + layer.msg("添加成功"); location.reload(); } else { layer.msg(data.msg);