调整页面删除方式

添加 Jenkins JobName 代入和 BuildNumber 代入
This commit is contained in:
昭荣伊
2019-09-11 11:45:41 +08:00
parent e1a3b29790
commit f9faee6ee4
8 changed files with 235 additions and 116 deletions
@@ -11,7 +11,6 @@ import org.yzr.vo.AppViewModel;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -45,6 +44,20 @@ public class AppController {
return "list";
}
@RequestMapping("/packageList/{appID}")
@ResponseBody
public Map<String, Object> getAppPackageList(@PathVariable("appID") String appID) {
AppViewModel appViewModel = this.appService.getById(appID);
Map<String, Object> map = new HashMap<>();
try {
map.put("packages", appViewModel.getPackageList());
map.put("success", true);
} catch (Exception e) {
map.put("success", false);
}
return map;
}
@RequestMapping("/app/delete/{id}")
@ResponseBody
public Map<String, Object> deleteById(@PathVariable("id") String id) {
@@ -1,10 +1,12 @@
package org.yzr.controller;
import com.alibaba.fastjson.JSON;
import net.glxn.qrgen.javase.QRCode;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.yzr.model.App;
@@ -88,6 +90,18 @@ public class PackageController {
try {
String filePath = transfer(file);
Package aPackage = this.packageService.buildPackage(filePath);
Map<String , String> extra = new HashMap<>();
String jobName = request.getParameter("jobName");
String buildNumber = request.getParameter("buildNumber");
if (StringUtils.hasLength(jobName)) {
extra.put("jobName", jobName);
}
if (StringUtils.hasLength(buildNumber)) {
extra.put("buildNumber", buildNumber);
}
if (!extra.isEmpty()) {
aPackage.setExtra(JSON.toJSONString(extra));
}
App app = this.appService.getByPackage(aPackage);
app.getPackageList().add(aPackage);
app.setCurrentPackage(aPackage);
+2
View File
@@ -34,6 +34,8 @@ public class Package {
private String minVersion;
// 平台(Android 或 iOS)
private String platform;
// 扩展消息 (json格式)
private String extra;
// 文件名
private String fileName;
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@@ -1,8 +1,11 @@
package org.yzr.utils.webhook;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import org.springframework.util.StringUtils;
import org.yzr.model.App;
import org.yzr.model.Package;
import org.yzr.model.WebHook;
import org.yzr.utils.ImageUtils;
import org.yzr.utils.PathManager;
@@ -46,7 +49,7 @@ public class DingDingWebHook implements IWebHook {
}
Map<String, Object> markdown = new HashMap<>();
markdown.put("title", app.getName());
String url = pathManager.getBaseURL(false) + "s/" + app.getShortCode();
String url = pathManager.getBaseURL(false) + "s/" + app.getShortCode() + "?id=" + app.getCurrentPackage().getId();
String platform = "iOS";
if (app.getPlatform().equalsIgnoreCase("android")) {
platform = "Android";
@@ -58,7 +61,11 @@ public class DingDingWebHook implements IWebHook {
String icon = "data:image/jpg;base64," + ImageUtils.convertImageToBase64(iconPath);
String pathInfo = String.format("![%s](%s)", app.getName(), icon);
String otherInfo = String.format("链接:[%s](%s) \n\n 版本:%s (Build: %s)", url, url, app.getCurrentPackage().getVersion(), app.getCurrentPackage().getBuildVersion());
String message = this.getPackageMessage(app.getCurrentPackage());
String text = appInfo + " \n\n " + pathInfo + " \n\n " + otherInfo;
if (message.length() > 0) {
text += "\n\n" + message;
}
markdown.put("text", text);
JSONObject jsonObject = new JSONObject();
jsonObject.put("msgtype", "markdown");
@@ -69,4 +76,23 @@ public class DingDingWebHook implements IWebHook {
sendToDingding(json, webHook.getUrl());
}
}
/**
* 获取扩展消息
* @return
*/
private String getPackageMessage(Package aPackage) {
String message = "";
if (StringUtils.hasLength(aPackage.getExtra())) {
Map<String, String> extra = (Map<String, String>) JSON.parse(aPackage.getExtra());
if (extra.containsKey("jobName")) {
message += "任务名:" + extra.get("jobName");
}
if (extra.containsKey("buildNumber")) {
message += " 编号:#" + extra.get("buildNumber");
}
}
return message;
}
}
+16 -1
View File
@@ -1,15 +1,17 @@
package org.yzr.vo;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import org.apache.commons.io.FileUtils;
import org.springframework.util.StringUtils;
import org.yzr.model.Package;
import org.yzr.utils.PathManager;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Getter
@@ -31,6 +33,7 @@ public class PackageViewModel {
private String type;
private List<String> devices;
private int deviceCount;
private String message;
public PackageViewModel(Package aPackage, PathManager pathManager) {
this.downloadURL = pathManager.getBaseURL(false) + "p/" + aPackage.getId();
@@ -78,6 +81,18 @@ public class PackageViewModel {
} else {
this.type = "内测版";
}
String message = "";
if (StringUtils.hasLength(aPackage.getExtra())) {
Map<String, String> extra = (Map<String, String>) JSON.parse(aPackage.getExtra());
if (extra.containsKey("jobName")) {
message += " 任务名:" + extra.get("jobName");
}
if (extra.containsKey("buildNumber")) {
message += " 编号:#" + extra.get("buildNumber");
}
}
this.message = message;
}
}
+112 -22
View File
@@ -2,16 +2,16 @@
* 获取 webHook 列表
*/
function getWebHooks() {
var appId =$("#appId").val();
var appId = $("#appId").val();
var url = "/webHook/find/" + appId;
$.post(url, function(result){
$.post(url, function (result) {
$(".configrations").children(".config-name").remove();
var content="";
var content = "";
for (var i = 0; i < result.length; i++) {
content += '<a onclick="editWebHook(this)" class="config-name ng-binding ng-scope"';
content += 'data="'+ result[i].id +'" data-url="' + result[i].url + '" ';
content += 'data-name="'+ result[i].name;
content += '">#'+ result[i].name +'</a>';
content += 'data="' + result[i].id + '" data-url="' + result[i].url + '" ';
content += 'data-name="' + result[i].name;
content += '">#' + result[i].name + '</a>';
}
$(".configrations").append(content);
});
@@ -44,6 +44,84 @@ function editWebHook(e) {
}
}
/**
* 获取包列表
*/
function getPackageList() {
var appId = $("#appId").val();
var url = "/packageList/" + appId;
$.post(url, function (result) {
if (result.success) {
var packages = result.packages;
var packageList = '';
packageList += '<li>';
packageList += '<span class="dot"></span>';
packageList += '<span class="filter ng-binding">版本更新</span>';
packageList += '<span class="filter version-rollback ng-scope"></span>';
packageList += '</li>';
packageList += '<li>';
packageList += '<div class="market-app-info">';
packageList += '</div>';
packageList += '</li>';
for (var i = 0; i < packages.length; i++) {
var package = packages[i];
var version = package.version;
var buildVersion = package.buildVersion;
var displayTime = package.displayTime;
var type = package.type;
var downloadURL = package.downloadURL;
var displaySize = package.displaySize;
var previewURL = package.previewURL;
var id = package.id;
var message = package.message;
packageList += '<li class="package_index_' + id + '">';
packageList += '<div>';
packageList += '<div class="directive-view-release">';
packageList += '<i class="icon-upload-cloud2"></i>';
packageList += '<b class="ng-binding">' + version + ' (Build ' + buildVersion + ')' + message + '</b > ';
packageList += '<div class="release-metainfo ng-hide">';
packageList += '<small><i class="icon-calendar"></i>';
packageList += '<span class="ng-binding">' + displayTime + '</span>';
packageList += '</small>';
packageList += '</div>';
packageList += '<div class="release-metainfo">';
packageList += '<small><i class="icon-calendar"></i>';
packageList += '<span class="ng-binding">' + displayTime + '</span></small> &nbsp;&nbsp;·&nbsp;&nbsp;';
packageList += '<small class="ng-scope">' + type + '</small>';
packageList += '<i class="ng-hide">&nbsp;&nbsp;·&nbsp;&nbsp;</i>';
packageList += '<small class="ng-binding ng-hide"></small>';
packageList += '</div>';
packageList += '<div class="release-actions">';
packageList += '<button class="tooltip-top download-action" tooltip="下载原文件" value="' + downloadURL + '">';
packageList += '<i class="icon-cloud-download"></i>';
packageList += '<span class="ng-binding"> ' + displaySize + '</span>';
packageList += '</button>';
packageList += '<button class="preview" value="' + previewURL + '">';
packageList += '<i class="icon-eye"></i>';
packageList += '<span class="ng-binding"> 预览</span>';
packageList += '</button>';
if (i > 0) {
packageList += '<button class="ng-scope app-delete" data="' + id + '">';
packageList += '<i class="icon-trash"></i>';
packageList += '<span class="ng-binding"> 删除</span>';
packageList += '</button>';
}
packageList += '</div>';
packageList += '</div >';
packageList += '</div >';
packageList += '</li >';
}
packageList += '<li class="more ng-hide" ng-show="currentApp.releases.current_page &lt; currentApp.releases.total_pages">';
packageList += '<button ng-click="moreRelease()" class="ng-binding">显示更多版本</button></li>';
$("#app-activity-panel").empty();
$("#app-activity-panel").append(packageList);
bindActions();
}
});
}
/**
* 构造数据
* @returns {{appId: (*|jQuery|string|undefined), name: (*|jQuery|string|undefined), id: (*|jQuery|string|undefined), url: (*|jQuery|string|undefined)}}
@@ -53,11 +131,11 @@ function buildData() {
var url = $("#ding-ding-web-hook-url").val();
var appId = $("#appId").val();
var id = $("#webHookId").val();
var data ={
name:name,
url:url,
appId:appId,
id:id
var data = {
name: name,
url: url,
appId: appId,
id: id
};
return data;
}
@@ -110,7 +188,7 @@ function remove() {
function postWithURL(url) {
var data = buildData();
resetForm();
$.post(url, data, function(result){
$.post(url, data, function (result) {
getWebHooks();
});
}
@@ -130,9 +208,10 @@ function removeAllPanelClass() {
$("#app-integration-panel").removeClass("ng-hide");
}
$(function () {
getWebHooks();
/**
* 绑定事件
*/
function bindActions() {
$(".download-action").click(function () {
window.open($(this).val())
});
@@ -142,12 +221,23 @@ $(function () {
});
$(".app-delete").click(function () {
var url = "/p/delete/" + $(this).attr("data");
$.post(url, function(result){
window.location.href = window.location.href
window.location.reload
var id = $(this).attr("data");
var url = "/p/delete/" + id;
var li = "package_index_" + id;
console.log(li);
var self = $("." + li);
$.post(url, function (result) {
if (result.success) {
self.remove();
}
});
})
});
}
$(function () {
getPackageList();
getWebHooks();
$("#js-app-short-copy-trigger").click(function () {
new ClipboardJS('#js-app-short-copy-trigger', {
text: function (trigger) {
@@ -180,12 +270,12 @@ $(function () {
$("#delete-app").click(function () {
var url = "/app/delete/" + $(this).attr("data");
$.post(url, function(result){
$.post(url, function (result) {
window.location.href = "/apps"
});
});
$("#ding-ding-web-hook-name, #ding-ding-web-hook-url").bind("input propertychange",function(event){
$("#ding-ding-web-hook-name, #ding-ding-web-hook-url").bind("input propertychange", function (event) {
var name = $("#ding-ding-web-hook-name").val();
var url = $("#ding-ding-web-hook-url").val();
if (name.length > 0 && url.length > 0) {
@@ -59,6 +59,7 @@
<span itemprop="softwareVersion">[[${app.version}]] (Build [[${app.buildVersion}]]) -
[[${app.currentPackage.displaySize}]]</span></p>
<p>更新于: <span itemprop="datePublished">[[${app.currentPackage.displayTime}]]</span></p>
<p>[[${app.currentPackage.message}]]</p>
</div>
<div class="action-animate">
<input id="installURL" th:value="${app.currentPackage.installURL}" style="display: none" />
+49 -91
View File
@@ -1,62 +1,67 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Stict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="renderer" content="webkit">
<title class="ng-binding">[[${package.name}]] - 应用动态</title>
<link rel="icon" type="image/x-icon" th:href="@{/images/favicon.ico}"/>
<link rel="icon" type="image/x-icon" th:href="@{/images/favicon.ico}" />
<link rel="stylesheet" th:href="@{/css/bootstrap.css}">
<link rel="stylesheet" th:href="@{/css/index.css}">
<script type="text/javascript" th:src="@{/js/jquery-1.11.0.min.js}"></script>
<script type="text/javascript" th:src="@{/js/clipboard.min.js}"></script>
</head>
<body class="ng-scope">
<nav class="navbar navbar-transparent fade-out navbar-black">
<div class="navbar-header">
<a class="navbar-brand" href="/apps"><i class="icon-logo"></i></a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse ng-scope">
<div class="dropdown">
<div>
</div>
<nav class="navbar navbar-transparent fade-out navbar-black">
<div class="navbar-header">
<a class="navbar-brand" href="/apps"><i class="icon-logo"></i></a>
</div>
</div>
</nav>
<div class="menu-toggle fade-out">
<i class="icon-menu"></i>
</div>
<div class="navbar-wrapper ng-scope">
<div ng-controller="NavbarController" class="ng-scope">
<div class="navbar-header-wrap">
<div class="middle-wrapper">
<nav>
<h1 class="navbar-title logo">
<i class="icon-logo"></i>
</h1>
<i class="icon-angle-right"></i>
<div class="navbar-title primary-title">
<a class="ng-binding" href="/apps">我的应用</a>
</div>
<i class="icon-angle-right"></i>
<div class="navbar-title secondary-title ng-binding" style="">
[[${package.name}]]
</div>
</nav>
</div>
</div>
</div>
</div>
<!-- ngInclude: '/templates_manage/upload_modal.html' --><section data-ui-view="" class="ng-scope" style="">
<div id="info-container" class="page-app app-activities">
<div class="banner has-devices">
<div class="middle-wrapper clearfix">
<div id="app-activity-icon" class="pull-left icon-container appicon">
<img th:src="'/' + ${package.icon}" width="100" height="100" class="change_icon ng-isolate-scope"/>
<div class="collapse navbar-collapse navbar-ex1-collapse ng-scope">
<div class="dropdown">
<div>
</div>
<div class="badges">
<span tooltip-top="" tooltip="复制到剪贴板" id="js-app-short-copy-trigger" class="short tooltip-top ng-binding ng-isolate-scope" th:value="${package.installPath}" copy-trigger="">[[${package.installPath}]]</span>
<span class="apptype ng-binding" th:if="${#strings.containsIgnoreCase(package.platform,'ios')}">iOS</span>
</div>
</div>
</nav>
<div class="menu-toggle fade-out">
<i class="icon-menu"></i>
</div>
<div class="navbar-wrapper ng-scope">
<div ng-controller="NavbarController" class="ng-scope">
<div class="navbar-header-wrap">
<div class="middle-wrapper">
<nav>
<h1 class="navbar-title logo">
<i class="icon-logo"></i>
</h1>
<i class="icon-angle-right"></i>
<div class="navbar-title primary-title">
<a class="ng-binding" href="/apps">我的应用</a>
</div>
<i class="icon-angle-right"></i>
<div class="navbar-title secondary-title ng-binding" style="">
[[${package.name}]]
</div>
</nav>
</div>
</div>
</div>
</div>
<!-- ngInclude: '/templates_manage/upload_modal.html' -->
<section data-ui-view="" class="ng-scope" style="">
<div id="info-container" class="page-app app-activities">
<div class="banner has-devices">
<div class="middle-wrapper clearfix">
<div id="app-activity-icon" class="pull-left icon-container appicon">
<img th:src="'/' + ${package.icon}" width="100" height="100" class="change_icon ng-isolate-scope" />
</div>
<div class="badges">
<span tooltip-top="" tooltip="复制到剪贴板" id="js-app-short-copy-trigger"
class="short tooltip-top ng-binding ng-isolate-scope" th:value="${package.installPath}"
copy-trigger="">[[${package.installPath}]]</span>
<span class="apptype ng-binding" th:if="${#strings.containsIgnoreCase(package.platform,'ios')}">iOS</span>
<span class="apptype ng-binding" th:if="${#strings.containsIgnoreCase(package.platform,'android')}">Android</span>
<span class="bundleid ng-binding">BundleID<b class="ng-binding">&nbsp;&nbsp;[[${package.bundleID}]]</b></span>
<span class="version ng-scope" th:if="${#strings.containsIgnoreCase(package.platform,'ios')}">iOS&nbsp;[[${package.minVersion}]]&nbsp;或者高版本</span>
@@ -83,53 +88,6 @@
<div class="middle-wrapper" ng-show="activitiesReady">
<!-- 更新面板-->
<ul id="app-activity-panel" class="list-unstyled time-line">
<li>
<span class="dot"></span>
<span class="filter ng-binding">版本更新</span>
<span class="filter version-rollback ng-scope"></span>
</li>
<li>
<div class="market-app-info">
</div>
</li>
<li th:each="app,appStat : ${apps}">
<div>
<div class="directive-view-release">
<i class="icon-upload-cloud2"></i>
<b class="ng-binding">[[${app.version}]] (Build [[${app.buildVersion}]])</b>
<div class="release-metainfo ng-hide">
<small>
<i class="icon-calendar"></i>
<span class="ng-binding">[[${app.displayTime}]]</span>
</small>
</div>
<div class="release-metainfo">
<small>
<i class="icon-calendar"></i>
<span class="ng-binding">[[${app.displayTime}]]</span></small> &nbsp;&nbsp;·&nbsp;&nbsp;
<small class="ng-scope">[[${app.type}]]</small>
<i class="ng-hide">&nbsp;&nbsp;·&nbsp;&nbsp;</i>
<small class="ng-binding ng-hide"></small>
</div>
<div class="release-actions">
<button class="tooltip-top download-action" tooltip="下载原文件" th:value="${app.downloadURL}">
<i class="icon-cloud-download"></i>
<span class="ng-binding">[[${app.displaySize}]]</span>
</button>
<button class="preview" th:value="${app.previewURL}">
<i class="icon-eye"></i>
<span class="ng-binding">预览</span>
</button>
<button class="ng-scope app-delete" th:data="${app.id}" th:if="${appStat.index> 0}">
<i class="icon-trash"></i>
<span class="ng-binding">删除</span>
</button>
</div>
</div>
</div>
</li>
<li class="more ng-hide" ng-show="currentApp.releases.current_page &lt; currentApp.releases.total_pages">
<button ng-click="moreRelease()" class="ng-binding">显示更多版本</button></li>
</ul>
<!--信息面板-->
<div id="app-info-panel" class="app-info-form ng-pristine ng-valid ng-valid-required ng-valid-pattern ng-hide">