Merge pull request #180 from halo-dev/dev

Dev
pull/193/head v1.0.1
Ryan Wang 2019-06-05 10:08:02 +08:00 committed by GitHub
commit f62f54d4ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
71 changed files with 169 additions and 137 deletions

View File

@ -8,7 +8,7 @@ apply plugin: 'io.spring.dependency-management'
group = 'run.halo.app'
archivesBaseName = 'halo'
version = '1.0.0'
version = '1.0.1'
sourceCompatibility = '1.8'
description = 'Halo, personal blog system developed in Java.'
@ -26,6 +26,7 @@ configurations {
}
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
@ -70,6 +71,9 @@ dependencies {
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
developmentOnly 'org.springframework.boot:spring-boot-devtools'

View File

@ -5,6 +5,6 @@ VERSION=$(ls build/libs | sed 's/.*halo-//' | sed 's/.jar$//')
echo "Halo version: $VERSION"
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
docker build --build-arg JAR_FILE=build/libs/halo-$VERSION.jar -t $DOCKER_USERNAME/halo -t $DOCKER_USERNAME/$VERSION .
docker build --build-arg JAR_FILE=build/libs/halo-$VERSION.jar -t $DOCKER_USERNAME/halo -t $DOCKER_USERNAME/halo:$VERSION .
docker images
docker push $DOCKER_USERNAME/halo

View File

@ -69,8 +69,8 @@ public class SwaggerConfiguration {
return buildApiDocket("run.halo.app.content.api",
"run.halo.app.controller.content.api",
"/api/content/**")
.securitySchemes(portalApiKeys())
.securityContexts(portalSecurityContext())
.securitySchemes(contentApiKeys())
.securityContexts(contentSecurityContext())
.enable(!haloProperties.isDocDisabled());
}
@ -137,14 +137,14 @@ public class SwaggerConfiguration {
);
}
private List<ApiKey> portalApiKeys() {
private List<ApiKey> contentApiKeys() {
return Arrays.asList(
new ApiKey("Token from header", ApiAuthenticationFilter.API_TOKEN_HEADER_NAME, In.HEADER.name()),
new ApiKey("Token from query", ApiAuthenticationFilter.API_TOKEN_QUERY_NAME, In.QUERY.name())
new ApiKey("Access key from header", ApiAuthenticationFilter.API_ACCESS_KEY_HEADER_NAME, In.HEADER.name()),
new ApiKey("Access key from query", ApiAuthenticationFilter.API_ACCESS_KEY_QUERY_NAME, In.QUERY.name())
);
}
private List<SecurityContext> portalSecurityContext() {
private List<SecurityContext> contentSecurityContext() {
return Collections.singletonList(
SecurityContext.builder()
.securityReferences(defaultAuth())

View File

@ -1,6 +1,8 @@
package run.halo.app.model.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import run.halo.app.model.dto.base.OutputConverter;
import run.halo.app.model.entity.Menu;
@ -11,6 +13,8 @@ import run.halo.app.model.entity.Menu;
* @date 4/3/19
*/
@Data
@EqualsAndHashCode
@ToString
public class MenuDTO implements OutputConverter<MenuDTO, Menu> {
private Integer id;

View File

@ -17,7 +17,7 @@ import java.util.Date;
*/
@Data
@Entity(name = "BasePost")
@Table(name = "posts", indexes = @Index(columnList = "url"))
@Table(name = "posts")
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER, columnDefinition = "int default 0")
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)

View File

@ -1,6 +1,7 @@
package run.halo.app.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.persistence.*;

View File

@ -1,6 +1,7 @@
package run.halo.app.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.persistence.*;

View File

@ -14,7 +14,7 @@ import javax.persistence.*;
*/
@Data
@Entity
@Table(name = "tags", indexes = @Index(columnList = "slug_name"))
@Table(name = "tags")
@ToString
@EqualsAndHashCode(callSuper = true)
public class Tag extends BaseEntity {

View File

@ -14,7 +14,7 @@ import javax.persistence.*;
*/
@Data
@Entity
@Table(name = "theme_settings", indexes = {@Index(columnList = "setting_key")})
@Table(name = "theme_settings")
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class ThemeSetting extends BaseEntity {

View File

@ -10,7 +10,7 @@ public enum OtherProperties implements PropertyEnum {
API_ENABLED("api_enabled", Boolean.class, "false"),
API_TOKEN("api_token", String.class, ""),
API_ACCESS_KEY("api_access_key", String.class, ""),
STATISTICS_CODE("statistics_code", String.class, ""),

View File

@ -1,6 +1,8 @@
package run.halo.app.model.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import run.halo.app.model.dto.MenuDTO;
import java.util.List;
@ -10,6 +12,8 @@ import java.util.List;
* @date : 2019-04-07
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MenuVO extends MenuDTO {
private List<MenuVO> children;

View File

@ -27,9 +27,9 @@ import java.util.Optional;
@Slf4j
public class ApiAuthenticationFilter extends AbstractAuthenticationFilter {
public final static String API_TOKEN_HEADER_NAME = "API-" + HttpHeaders.AUTHORIZATION;
public final static String API_ACCESS_KEY_HEADER_NAME = "API-" + HttpHeaders.AUTHORIZATION;
public final static String API_TOKEN_QUERY_NAME = "api_token";
public final static String API_ACCESS_KEY_QUERY_NAME = "api_access_key";
private final OptionService optionService;
@ -55,27 +55,27 @@ public class ApiAuthenticationFilter extends AbstractAuthenticationFilter {
return;
}
// Get token
String token = getTokenFromRequest(request);
// Get access key
String accessKey = getTokenFromRequest(request);
if (StringUtils.isBlank(token)) {
// If the token is missing
getFailureHandler().onFailure(request, response, new AuthenticationException("Missing API token"));
if (StringUtils.isBlank(accessKey)) {
// If the access key is missing
getFailureHandler().onFailure(request, response, new AuthenticationException("Missing API access key"));
return;
}
// Get token from option
Optional<String> optionalToken = optionService.getByProperty(OtherProperties.API_TOKEN, String.class);
// Get access key from option
Optional<String> optionalAccessKey = optionService.getByProperty(OtherProperties.API_ACCESS_KEY, String.class);
if (!optionalToken.isPresent()) {
// If the token is not set
getFailureHandler().onFailure(request, response, new AuthenticationException("API Token hasn't been set by blogger"));
if (!optionalAccessKey.isPresent()) {
// If the access key is not set
getFailureHandler().onFailure(request, response, new AuthenticationException("API access key hasn't been set by blogger"));
return;
}
if (!StringUtils.equals(token, optionalToken.get())) {
// If the token is mismatch
getFailureHandler().onFailure(request, response, new AuthenticationException("Token is mismatch"));
if (!StringUtils.equals(accessKey, optionalAccessKey.get())) {
// If the access key is mismatch
getFailureHandler().onFailure(request, response, new AuthenticationException("API access key is mismatch"));
return;
}
@ -103,17 +103,17 @@ public class ApiAuthenticationFilter extends AbstractAuthenticationFilter {
Assert.notNull(request, "Http servlet request must not be null");
// Get from header
String token = request.getHeader(API_TOKEN_HEADER_NAME);
String accessKey = request.getHeader(API_ACCESS_KEY_HEADER_NAME);
// Get from param
if (StringUtils.isBlank(token)) {
token = request.getParameter(API_TOKEN_QUERY_NAME);
if (StringUtils.isBlank(accessKey)) {
accessKey = request.getParameter(API_ACCESS_KEY_QUERY_NAME);
log.debug("Got token from parameter: [{}: {}]", API_TOKEN_QUERY_NAME, token);
log.debug("Got access key from parameter: [{}: {}]", API_ACCESS_KEY_QUERY_NAME, accessKey);
} else {
log.debug("Got token from header: [{}: {}]", API_TOKEN_HEADER_NAME, token);
log.debug("Got access key from header: [{}: {}]", API_ACCESS_KEY_HEADER_NAME, accessKey);
}
return token;
return accessKey;
}
}

View File

@ -429,6 +429,11 @@ public abstract class BaseCommentServiceImpl<COMMENT extends BaseComment> extend
// Get all comments
Page<COMMENT> topCommentPage = baseCommentRepository.findAllByPostIdAndStatusAndParentId(targetId, status, 0L, pageable);
if (topCommentPage.isEmpty()) {
// If the comments is empty
return ServiceUtils.buildEmptyPageImpl(topCommentPage);
}
// Get top comment ids
Set<Long> topCommentIds = ServiceUtils.fetchProperty(topCommentPage.getContent(), BaseComment::getId);

View File

@ -1,8 +1,6 @@
package run.halo.app.utils;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.*;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@ -136,6 +134,21 @@ public class ServiceUtils {
return buildLatestPageable(top, "createTime");
}
/**
* Build empty page result.
*
* @param page page info must not be null
* @param <T> target page result type
* @param <S> source page result type
* @return empty page result
*/
@NonNull
public static <T, S> Page<T> buildEmptyPageImpl(@NonNull Page<S> page) {
Assert.notNull(page, "Page result must not be null");
return new PageImpl<>(Collections.emptyList(), page.getPageable(), page.getTotalElements());
}
/**
* Builds latest page request.
*

View File

@ -0,0 +1 @@
.attach-detail-img img{width:100%}.ant-divider-horizontal[data-v-b694bf52]{margin:24px 0 12px 0}.search-box[data-v-b694bf52]{padding-bottom:12px}.attach-thumb[data-v-b694bf52]{width:100%;margin:0 auto;position:relative;padding-bottom:56%;overflow:hidden}.attach-thumb img[data-v-b694bf52]{width:100%;height:100%;position:absolute;top:0;left:0}.ant-card-meta[data-v-b694bf52]{padding:.8rem}.attach-detail-img img[data-v-b694bf52]{width:100%}.table-operator[data-v-b694bf52]{margin-bottom:0}

View File

@ -1 +0,0 @@
.category-tree[data-v-0f333a36]{margin-top:1rem}

View File

@ -1 +1 @@
.attach-item{width:50%;margin:0 auto;position:relative;padding-bottom:28%;overflow:hidden;float:left;cursor:pointer}.attach-item img{width:100%;height:100%;position:absolute;top:0;left:0}.page-header-wrapper-grid-content-main[data-v-23ca7e76]{width:100%;height:100%;min-height:100%;-webkit-transition:.3s;transition:.3s}.page-header-wrapper-grid-content-main .profile-center-avatarHolder[data-v-23ca7e76]{text-align:center;margin-bottom:24px}.page-header-wrapper-grid-content-main .profile-center-avatarHolder>.avatar[data-v-23ca7e76]{margin:0 auto;width:104px;height:104px;margin-bottom:20px;border-radius:50%;overflow:hidden;cursor:pointer}.page-header-wrapper-grid-content-main .profile-center-avatarHolder>.avatar img[data-v-23ca7e76]{height:100%;width:100%}.page-header-wrapper-grid-content-main .profile-center-avatarHolder .username[data-v-23ca7e76]{color:rgba(0,0,0,.85);font-size:20px;line-height:28px;font-weight:500;margin-bottom:4px}.page-header-wrapper-grid-content-main .profile-center-detail p[data-v-23ca7e76]{margin-bottom:8px;padding-left:26px;position:relative}.page-header-wrapper-grid-content-main .profile-center-detail i[data-v-23ca7e76]{position:absolute;height:14px;width:14px;left:0;top:4px}
.attach-item{width:50%;margin:0 auto;position:relative;padding-bottom:28%;overflow:hidden;float:left;cursor:pointer}.attach-item img{width:100%;height:100%;position:absolute;top:0;left:0}.page-header-wrapper-grid-content-main[data-v-0c60a972]{width:100%;height:100%;min-height:100%;-webkit-transition:.3s;transition:.3s}.page-header-wrapper-grid-content-main .profile-center-avatarHolder[data-v-0c60a972]{text-align:center;margin-bottom:24px}.page-header-wrapper-grid-content-main .profile-center-avatarHolder>.avatar[data-v-0c60a972]{margin:0 auto;width:104px;height:104px;margin-bottom:20px;border-radius:50%;overflow:hidden;cursor:pointer}.page-header-wrapper-grid-content-main .profile-center-avatarHolder>.avatar img[data-v-0c60a972]{height:100%;width:100%}.page-header-wrapper-grid-content-main .profile-center-avatarHolder .username[data-v-0c60a972]{color:rgba(0,0,0,.85);font-size:20px;line-height:28px;font-weight:500;margin-bottom:4px}.page-header-wrapper-grid-content-main .profile-center-detail p[data-v-0c60a972]{margin-bottom:8px;padding-left:26px;position:relative}.page-header-wrapper-grid-content-main .profile-center-detail i[data-v-0c60a972]{position:absolute;height:14px;width:14px;left:0;top:4px}

View File

@ -1 +0,0 @@
.height-100[data-v-1ac0b863]{height:100vh}.install-action[data-v-1ac0b863]{margin-top:1rem}.previus-button[data-v-1ac0b863]{margin-right:1rem}.install-card[data-v-1ac0b863]{-webkit-box-shadow:0 10px 20px 0 hsla(0,0%,92.5%,.86);box-shadow:0 10px 20px 0 hsla(0,0%,92.5%,.86)}

View File

@ -1 +0,0 @@
.attach-detail-img img{width:100%}.ant-divider-horizontal[data-v-40ab62a8]{margin:24px 0 12px 0}.search-box[data-v-40ab62a8]{padding-bottom:12px}.attach-thumb[data-v-40ab62a8]{width:100%;margin:0 auto;position:relative;padding-bottom:56%;overflow:hidden}.attach-thumb img[data-v-40ab62a8]{width:100%;height:100%;position:absolute;top:0;left:0}.ant-card-meta[data-v-40ab62a8]{padding:.8rem}.attach-detail-img img[data-v-40ab62a8]{width:100%}.table-operator[data-v-40ab62a8]{margin-bottom:0}

View File

@ -0,0 +1 @@
.height-100[data-v-f2997e68]{height:100vh}.install-action[data-v-f2997e68]{margin-top:1rem}.previus-button[data-v-f2997e68]{margin-right:1rem}.install-card[data-v-f2997e68]{-webkit-box-shadow:0 10px 20px 0 hsla(0,0%,92.5%,.86);box-shadow:0 10px 20px 0 hsla(0,0%,92.5%,.86)}

View File

@ -1 +0,0 @@
.v-note-wrapper[data-v-6778754a]{z-index:1000;min-height:580px}.sheet-thum .img[data-v-6778754a]{width:100%;cursor:pointer;border-radius:4px}.sheet-thum .sheet-thum-remove[data-v-6778754a]{margin-top:16px}

View File

@ -1 +0,0 @@
.v-note-wrapper[data-v-348cd59e]{z-index:1000;min-height:580px}.post-thum .img[data-v-348cd59e]{width:100%;cursor:pointer;border-radius:4px}.post-thum .post-thum-remove[data-v-348cd59e]{margin-top:16px}

View File

@ -0,0 +1 @@
.category-tree[data-v-77634e76]{margin-top:1rem}

View File

@ -0,0 +1 @@
.v-note-wrapper[data-v-5a42b07f]{z-index:1000;min-height:580px}.sheet-thum .img[data-v-5a42b07f]{width:100%;cursor:pointer;border-radius:4px}.sheet-thum .sheet-thum-remove[data-v-5a42b07f]{margin-top:16px}

View File

@ -1 +0,0 @@
.attach-item{width:50%;margin:0 auto;position:relative;padding-bottom:28%;overflow:hidden;float:left;cursor:pointer}.attach-item img{width:100%;height:100%;position:absolute;top:0;left:0}.ant-divider-horizontal[data-v-4bf43659]{margin:24px 0 12px 0}.search-box[data-v-4bf43659]{padding-bottom:12px}.photo-thumb[data-v-4bf43659]{width:100%;margin:0 auto;position:relative;padding-bottom:56%;overflow:hidden}.photo-thumb img[data-v-4bf43659]{width:100%;height:100%;position:absolute;top:0;left:0}.ant-card-meta[data-v-4bf43659]{padding:.8rem}.photo-detail-img img[data-v-4bf43659]{width:100%}.table-operator[data-v-4bf43659]{margin-bottom:0}

View File

@ -1 +1 @@
.attach-detail-img img{width:100%}.attach-item{width:50%;margin:0 auto;position:relative;padding-bottom:28%;overflow:hidden;float:left;cursor:pointer}.attach-item img{width:100%;height:100%;position:absolute;top:0;left:0}.upload-button[data-v-773a8e75]{position:fixed;bottom:30px;right:30px}.theme-thumb[data-v-773a8e75]{width:100%;margin:0 auto;position:relative;padding-bottom:56%;overflow:hidden}.theme-thumb img[data-v-773a8e75]{width:100%;height:100%;position:absolute;top:0;left:0}
.attach-detail-img img{width:100%}.attach-item{width:50%;margin:0 auto;position:relative;padding-bottom:28%;overflow:hidden;float:left;cursor:pointer}.attach-item img{width:100%;height:100%;position:absolute;top:0;left:0}.upload-button[data-v-40d5a5ae]{position:fixed;bottom:30px;right:30px}.theme-thumb[data-v-40d5a5ae]{width:100%;margin:0 auto;position:relative;padding-bottom:56%;overflow:hidden}.theme-thumb img[data-v-40d5a5ae]{width:100%;height:100%;position:absolute;top:0;left:0}

View File

@ -0,0 +1 @@
.analysis-card-container[data-v-4cadd8f2]{position:relative;overflow:hidden;width:100%}.analysis-card-container .meta[data-v-4cadd8f2]{position:relative;overflow:hidden;width:100%;color:rgba(0,0,0,.45);font-size:14px;line-height:22px}.analysis-card-container .meta .analysis-card-action[data-v-4cadd8f2]{cursor:pointer;position:absolute;top:0;right:0}.number[data-v-4cadd8f2]{overflow:hidden;text-overflow:ellipsis;word-break:break-all;white-space:nowrap;color:#000;margin-top:4px;margin-bottom:0;font-size:32px;line-height:38px;height:38px}

View File

@ -0,0 +1 @@
.v-note-wrapper[data-v-669770a4]{z-index:1000;min-height:580px}.post-thum .img[data-v-669770a4]{width:100%;cursor:pointer;border-radius:4px}.post-thum .post-thum-remove[data-v-669770a4]{margin-top:16px}

View File

@ -0,0 +1 @@
.attach-item{width:50%;margin:0 auto;position:relative;padding-bottom:28%;overflow:hidden;float:left;cursor:pointer}.attach-item img{width:100%;height:100%;position:absolute;top:0;left:0}.ant-divider-horizontal[data-v-2a97a053]{margin:24px 0 12px 0}.search-box[data-v-2a97a053]{padding-bottom:12px}.photo-thumb[data-v-2a97a053]{width:100%;margin:0 auto;position:relative;padding-bottom:56%;overflow:hidden}.photo-thumb img[data-v-2a97a053]{width:100%;height:100%;position:absolute;top:0;left:0}.ant-card-meta[data-v-2a97a053]{padding:.8rem}.photo-detail-img img[data-v-2a97a053]{width:100%}.table-operator[data-v-2a97a053]{margin-bottom:0}

View File

@ -1 +0,0 @@
.analysis-card-container[data-v-704c3674]{position:relative;overflow:hidden;width:100%}.analysis-card-container .meta[data-v-704c3674]{position:relative;overflow:hidden;width:100%;color:rgba(0,0,0,.45);font-size:14px;line-height:22px}.analysis-card-container .meta .analysis-card-action[data-v-704c3674]{cursor:pointer;position:absolute;top:0;right:0}.number[data-v-704c3674]{overflow:hidden;text-overflow:ellipsis;word-break:break-all;white-space:nowrap;color:#000;margin-top:4px;margin-bottom:0;font-size:32px;line-height:38px;height:38px}

View File

@ -1 +0,0 @@
.exception[data-v-230942b4]{min-height:500px;height:80%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;margin-top:150px}.exception .img[data-v-230942b4]{display:inline-block;padding-right:52px;zoom:1}.exception .img img[data-v-230942b4]{height:360px;max-width:430px}.exception .content[data-v-230942b4]{display:inline-block;-webkit-box-flex:1;-ms-flex:auto;flex:auto}.exception .content h1[data-v-230942b4]{color:#434e59;font-size:72px;font-weight:600;line-height:72px;margin-bottom:24px}.exception .content .desc[data-v-230942b4]{color:rgba(0,0,0,.45);font-size:20px;line-height:28px;margin-bottom:16px}.mobile .exception[data-v-230942b4]{margin-top:30px}.mobile .exception .img[data-v-230942b4]{padding-right:unset}.mobile .exception .img img[data-v-230942b4]{height:40%;max-width:80%}

View File

@ -0,0 +1 @@
.exception[data-v-729a8fea]{min-height:500px;height:80%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;margin-top:150px}.exception .img[data-v-729a8fea]{display:inline-block;padding-right:52px;zoom:1}.exception .img img[data-v-729a8fea]{height:360px;max-width:430px}.exception .content[data-v-729a8fea]{display:inline-block;-webkit-box-flex:1;-ms-flex:auto;flex:auto}.exception .content h1[data-v-729a8fea]{color:#434e59;font-size:72px;font-weight:600;line-height:72px;margin-bottom:24px}.exception .content .desc[data-v-729a8fea]{color:rgba(0,0,0,.45);font-size:20px;line-height:28px;margin-bottom:16px}.mobile .exception[data-v-729a8fea]{margin-top:30px}.mobile .exception .img[data-v-729a8fea]{padding-right:unset}.mobile .exception .img img[data-v-729a8fea]{height:40%;max-width:80%}

View File

@ -1 +1 @@
<!DOCTYPE html><html lang=zh-cmn-Hans><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=robots content=noindex,nofllow><meta name=generator content=Halo><link rel=icon href=/logo.png><title>Halo Dashboard</title><link href=/css/chunk-0337f7a6.4c6b622f.css rel=prefetch><link href=/css/chunk-14e0b302.32f796a8.css rel=prefetch><link href=/css/chunk-1be69b35.b6783003.css rel=prefetch><link href=/css/chunk-2a007c18.45475c5a.css rel=prefetch><link href=/css/chunk-31c8ea42.4a090118.css rel=prefetch><link href=/css/chunk-35e63e70.6a83ae7d.css rel=prefetch><link href=/css/chunk-4851a43a.09186be6.css rel=prefetch><link href=/css/chunk-4e835ab8.5f75da19.css rel=prefetch><link href=/css/chunk-55d28d8a.5710ea86.css rel=prefetch><link href=/css/chunk-5b9151a2.5ac5144c.css rel=prefetch><link href=/css/chunk-6d8b31f6.ad8d17b2.css rel=prefetch><link href=/css/chunk-9449c032.6f053d75.css rel=prefetch><link href=/css/chunk-bb4f0d4a.c1990d7c.css rel=prefetch><link href=/css/chunk-f1eac230.8481e8b4.css rel=prefetch><link href=/css/fail.809a6bc5.css rel=prefetch><link href=/js/chunk-0337f7a6.53ede862.js rel=prefetch><link href=/js/chunk-142c8832.919c15cb.js rel=prefetch><link href=/js/chunk-14e0b302.8cbbed1c.js rel=prefetch><link href=/js/chunk-1be69b35.3b96d59c.js rel=prefetch><link href=/js/chunk-2a007c18.d7c59ddb.js rel=prefetch><link href=/js/chunk-2d0b64bf.2af37a5a.js rel=prefetch><link href=/js/chunk-2d0d65a2.cea2ab69.js rel=prefetch><link href=/js/chunk-2d21a35c.8a7b3003.js rel=prefetch><link href=/js/chunk-2d228d13.f8dd7bb5.js rel=prefetch><link href=/js/chunk-31c8ea42.fcec41a2.js rel=prefetch><link href=/js/chunk-35e63e70.25724764.js rel=prefetch><link href=/js/chunk-4851a43a.eadb6121.js rel=prefetch><link href=/js/chunk-4b5e9e93.8033dcf8.js rel=prefetch><link href=/js/chunk-4e835ab8.734baaf4.js rel=prefetch><link href=/js/chunk-55d28d8a.e28b3150.js rel=prefetch><link href=/js/chunk-5b9151a2.9189da9d.js rel=prefetch><link href=/js/chunk-5bf599cc.c2681092.js rel=prefetch><link href=/js/chunk-6d8b31f6.cb49297f.js rel=prefetch><link href=/js/chunk-87e2df70.b954f846.js rel=prefetch><link href=/js/chunk-9449c032.8f6a0d1a.js rel=prefetch><link href=/js/chunk-bb4f0d4a.c336573f.js rel=prefetch><link href=/js/chunk-f1eac230.05982c8b.js rel=prefetch><link href=/js/fail.13f5cbab.js rel=prefetch><link href=/css/app.8abf48c5.css rel=preload as=style><link href=/css/chunk-vendors.da56ac75.css rel=preload as=style><link href=/js/app.e0ba5034.js rel=preload as=script><link href=/js/chunk-vendors.fe7dde0e.js rel=preload as=script><link href=/css/chunk-vendors.da56ac75.css rel=stylesheet><link href=/css/app.8abf48c5.css rel=stylesheet></head><body><noscript><strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.fe7dde0e.js></script><script src=/js/app.e0ba5034.js></script></body></html>
<!DOCTYPE html><html lang=zh-cmn-Hans><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=robots content=noindex,nofllow><meta name=generator content=Halo><link rel=icon href=/logo.png><title>Halo Dashboard</title><link href=/css/chunk-009936c1.f3153164.css rel=prefetch><link href=/css/chunk-0aa79c38.26a33a1b.css rel=prefetch><link href=/css/chunk-1be69b35.b6783003.css rel=prefetch><link href=/css/chunk-2ca3170e.61a5a976.css rel=prefetch><link href=/css/chunk-37d95348.909d3d1b.css rel=prefetch><link href=/css/chunk-436563a2.cb1e7f15.css rel=prefetch><link href=/css/chunk-46d7532c.94c6eb30.css rel=prefetch><link href=/css/chunk-4851a43a.210847fe.css rel=prefetch><link href=/css/chunk-6e38bcf5.2ee2b33a.css rel=prefetch><link href=/css/chunk-70b33d4d.701a4459.css rel=prefetch><link href=/css/chunk-75c7eed4.7cf84e9e.css rel=prefetch><link href=/css/chunk-9449c032.dafef2de.css rel=prefetch><link href=/css/chunk-9cb97d52.046bf41d.css rel=prefetch><link href=/css/chunk-bb4f0d4a.c1990d7c.css rel=prefetch><link href=/css/fail.e9c3e2d8.css rel=prefetch><link href=/js/chunk-009936c1.cde57fa8.js rel=prefetch><link href=/js/chunk-0aa79c38.2659df6e.js rel=prefetch><link href=/js/chunk-0ba750a2.02c8e842.js rel=prefetch><link href=/js/chunk-142c8832.8aceee71.js rel=prefetch><link href=/js/chunk-1be69b35.4a496da5.js rel=prefetch><link href=/js/chunk-2ca3170e.258d6e52.js rel=prefetch><link href=/js/chunk-2d0b64bf.25665dba.js rel=prefetch><link href=/js/chunk-2d0d65a2.1c8f2476.js rel=prefetch><link href=/js/chunk-2d21a35c.2fc10284.js rel=prefetch><link href=/js/chunk-2d228d13.dd7018e7.js rel=prefetch><link href=/js/chunk-37d95348.9ac04f40.js rel=prefetch><link href=/js/chunk-436563a2.89c8f183.js rel=prefetch><link href=/js/chunk-46d7532c.7500e276.js rel=prefetch><link href=/js/chunk-4851a43a.e3ce92c4.js rel=prefetch><link href=/js/chunk-5bf599cc.fc6c7d8c.js rel=prefetch><link href=/js/chunk-6e38bcf5.7b552106.js rel=prefetch><link href=/js/chunk-70b33d4d.f5bbad6f.js rel=prefetch><link href=/js/chunk-75c7eed4.cee58ce6.js rel=prefetch><link href=/js/chunk-87e2df70.f4b6bdc6.js rel=prefetch><link href=/js/chunk-9449c032.0036f54b.js rel=prefetch><link href=/js/chunk-9cb97d52.abfd8c14.js rel=prefetch><link href=/js/chunk-bb4f0d4a.3b7dfaaa.js rel=prefetch><link href=/js/fail.8a6d08f5.js rel=prefetch><link href=/css/app.d748d7bc.css rel=preload as=style><link href=/css/chunk-vendors.278be955.css rel=preload as=style><link href=/js/app.1842d5e6.js rel=preload as=script><link href=/js/chunk-vendors.811663b9.js rel=preload as=script><link href=/css/chunk-vendors.278be955.css rel=stylesheet><link href=/css/app.d748d7bc.css rel=stylesheet></head><body><noscript><strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.811663b9.js></script><script src=/js/app.1842d5e6.js></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-4b5e9e93"],{aa1e:function(t,a,e){"use strict";e.r(a);var n=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"page-header-index-wide"},[e("a-row",{attrs:{gutter:12}},[e("a-col",{style:{"padding-bottom":"12px"},attrs:{xl:10,lg:10,md:10,sm:24,xs:24}},[e("a-card",{attrs:{title:t.title}},[e("a-form",{attrs:{layout:"horizontal"}},[e("a-form-item",{attrs:{label:"名称:",help:"* 页面上所显示的名称"}},[e("a-input",{model:{value:t.tagToCreate.name,callback:function(a){t.$set(t.tagToCreate,"name",a)},expression:"tagToCreate.name"}})],1),e("a-form-item",{attrs:{label:"别名",help:"* 一般为单个标签页面的标识,最好为英文"}},[e("a-input",{model:{value:t.tagToCreate.slugName,callback:function(a){t.$set(t.tagToCreate,"slugName",a)},expression:"tagToCreate.slugName"}})],1),e("a-form-item",["create"===t.formType?e("a-button",{attrs:{type:"primary"},on:{click:t.handleSaveClick}},[t._v("保存")]):e("a-button-group",[e("a-button",{attrs:{type:"primary"},on:{click:t.handleSaveClick}},[t._v("更新")]),"update"===t.formType?e("a-button",{attrs:{type:"dashed"},on:{click:t.handleAddTag}},[t._v("返回添加")]):t._e()],1),"update"===t.formType?e("a-popconfirm",{attrs:{title:"你确定要删除【"+t.tagToCreate.name+"】标签?",okText:"确定",cancelText:"取消"},on:{confirm:function(a){return t.handleDeleteTag(t.tagToCreate.id)}}},[e("a-button",{staticStyle:{float:"right"},attrs:{type:"danger"}},[t._v("删除")])],1):t._e()],1)],1)],1)],1),e("a-col",{style:{"padding-bottom":"12px"},attrs:{xl:14,lg:14,md:14,sm:24,xs:24}},[e("a-card",{attrs:{title:"所有标签"}},t._l(t.tags,function(a){return e("a-tooltip",{key:a.id,attrs:{placement:"topLeft"}},[e("template",{slot:"title"},[e("span",[t._v(t._s(a.postCount)+" 篇文章")])]),e("a-tag",{staticStyle:{"margin-bottom":"8px"},attrs:{color:"blue"},on:{click:function(e){return t.handleEditTag(a)}}},[t._v(t._s(a.name))])],2)}),1)],1)],1)],1)},o=[],r=e("d28db"),s={data:function(){return{formType:"create",tags:[],tagToCreate:{}}},computed:{title:function(){return this.tagToCreate.id?"修改标签":"添加标签"}},created:function(){this.loadTags()},methods:{loadTags:function(){var t=this;r["a"].listAll(!0).then(function(a){t.tags=a.data.data})},handleSaveClick:function(){this.createOrUpdateTag()},handleAddTag:function(){this.formType="create",this.tagToCreate={}},handleEditTag:function(t){this.tagToCreate=t,this.formType="update"},handleDeleteTag:function(t){var a=this;r["a"].delete(t).then(function(t){a.$message.success("删除成功!"),a.loadTags(),a.handleAddTag()})},createOrUpdateTag:function(){var t=this;this.tagToCreate.id?r["a"].update(this.tagToCreate.id,this.tagToCreate).then(function(a){t.$message.success("更新成功!"),t.loadTags(),t.tagToCreate={}}):r["a"].create(this.tagToCreate).then(function(a){t.$message.success("保存成功!"),t.loadTags(),t.tagToCreate={}}),this.handleAddTag()}}},i=s,l=e("17cc"),c=Object(l["a"])(i,n,o,!1,null,null,null);a["default"]=c.exports},d28db:function(t,a,e){"use strict";var n=e("9efd"),o="/api/admin/tags",r={listAll:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Object(n["a"])({url:o,params:{more:t},method:"get"})},createWithName:function(t){return Object(n["a"])({url:o,data:{name:t},method:"post"})},create:function(t){return Object(n["a"])({url:o,data:t,method:"post"})},update:function(t,a){return Object(n["a"])({url:"".concat(o,"/").concat(t),data:a,method:"put"})},delete:function(t){return Object(n["a"])({url:"".concat(o,"/").concat(t),method:"delete"})}};a["a"]=r}}]);
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-0ba750a2"],{aa1e:function(t,a,e){"use strict";e.r(a);var n=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"page-header-index-wide"},[e("a-row",{attrs:{gutter:12}},[e("a-col",{style:{"padding-bottom":"12px"},attrs:{xl:10,lg:10,md:10,sm:24,xs:24}},[e("a-card",{attrs:{title:t.title}},[e("a-form",{attrs:{layout:"horizontal"}},[e("a-form-item",{attrs:{label:"名称:",help:"* 页面上所显示的名称"}},[e("a-input",{model:{value:t.tagToCreate.name,callback:function(a){t.$set(t.tagToCreate,"name",a)},expression:"tagToCreate.name"}})],1),e("a-form-item",{attrs:{label:"别名",help:"* 一般为单个标签页面的标识,最好为英文"}},[e("a-input",{model:{value:t.tagToCreate.slugName,callback:function(a){t.$set(t.tagToCreate,"slugName",a)},expression:"tagToCreate.slugName"}})],1),e("a-form-item",["create"===t.formType?e("a-button",{attrs:{type:"primary"},on:{click:t.handleSaveClick}},[t._v("保存")]):e("a-button-group",[e("a-button",{attrs:{type:"primary"},on:{click:t.handleSaveClick}},[t._v("更新")]),"update"===t.formType?e("a-button",{attrs:{type:"dashed"},on:{click:t.handleAddTag}},[t._v("返回添加")]):t._e()],1),"update"===t.formType?e("a-popconfirm",{attrs:{title:"你确定要删除【"+t.tagToCreate.name+"】标签?",okText:"确定",cancelText:"取消"},on:{confirm:function(a){return t.handleDeleteTag(t.tagToCreate.id)}}},[e("a-button",{staticStyle:{float:"right"},attrs:{type:"danger"}},[t._v("删除")])],1):t._e()],1)],1)],1)],1),e("a-col",{style:{"padding-bottom":"12px"},attrs:{xl:14,lg:14,md:14,sm:24,xs:24}},[e("a-card",{attrs:{title:"所有标签"}},t._l(t.tags,function(a){return e("a-tooltip",{key:a.id,attrs:{placement:"topLeft"}},[e("template",{slot:"title"},[e("span",[t._v(t._s(a.postCount)+" 篇文章")])]),e("a-tag",{staticStyle:{"margin-bottom":"8px"},attrs:{color:"blue"},on:{click:function(e){return t.handleEditTag(a)}}},[t._v(t._s(a.name))])],2)}),1)],1)],1)],1)},o=[],r=e("d28d"),s={data:function(){return{formType:"create",tags:[],tagToCreate:{}}},computed:{title:function(){return this.tagToCreate.id?"修改标签":"添加标签"}},created:function(){this.loadTags()},methods:{loadTags:function(){var t=this;r["a"].listAll(!0).then(function(a){t.tags=a.data.data})},handleSaveClick:function(){this.createOrUpdateTag()},handleAddTag:function(){this.formType="create",this.tagToCreate={}},handleEditTag:function(t){this.tagToCreate=t,this.formType="update"},handleDeleteTag:function(t){var a=this;r["a"].delete(t).then(function(t){a.$message.success("删除成功!"),a.loadTags(),a.handleAddTag()})},createOrUpdateTag:function(){var t=this;this.tagToCreate.id?r["a"].update(this.tagToCreate.id,this.tagToCreate).then(function(a){t.$message.success("更新成功!"),t.loadTags(),t.tagToCreate={}}):r["a"].create(this.tagToCreate).then(function(a){t.$message.success("保存成功!"),t.loadTags(),t.tagToCreate={}}),this.handleAddTag()}}},i=s,l=e("17cc"),c=Object(l["a"])(i,n,o,!1,null,null,null);a["default"]=c.exports},d28d:function(t,a,e){"use strict";var n=e("9efd"),o="/api/admin/tags",r={listAll:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Object(n["a"])({url:o,params:{more:t},method:"get"})},createWithName:function(t){return Object(n["a"])({url:o,data:{name:t},method:"post"})},create:function(t){return Object(n["a"])({url:o,data:t,method:"post"})},update:function(t,a){return Object(n["a"])({url:"".concat(o,"/").concat(t),data:a,method:"put"})},delete:function(t){return Object(n["a"])({url:"".concat(o,"/").concat(t),method:"delete"})}};a["a"]=r}}]);

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-1be69b35"],{"031c":function(t,a,e){},2967:function(t,a,e){"use strict";e.r(a);var n=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"page-header-index-wide"},[e("a-row",[e("a-col",{attrs:{span:24}},[e("a-card",{attrs:{bordered:!1}},[e("a-list",{attrs:{itemLayout:"horizontal"}},[e("a-list-item",[e("a-list-item-meta",[e("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 环境信息\n ")]),e("template",{slot:"description"},[e("ul",[e("li",[t._v("版本:"+t._s(t.environments.version))]),e("li",[t._v("数据库:"+t._s(t.environments.database))]),e("li",[t._v("启动时间:"+t._s(t._f("moment")(t.environments.startTime)))])]),e("a",{attrs:{href:"https://github.com/halo-dev",target:"_blank"}},[t._v("开源地址\n "),e("a-icon",{attrs:{type:"link"}})],1),t._v(" \n "),e("a",{attrs:{href:"https://halo.run/docs",target:"_blank"}},[t._v("用户文档\n "),e("a-icon",{attrs:{type:"link"}})],1),t._v(" \n "),e("a",{attrs:{href:"https://bbs.halo.run",target:"_blank"}},[t._v("在线社区\n "),e("a-icon",{attrs:{type:"link"}})],1),t._v(" \n ")])],2)],1),e("a-list-item",[e("a-list-item-meta",[e("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 开发者\n ")]),e("template",{slot:"description"},t._l(t.developers,function(t,a){return e("a-tooltip",{key:a,attrs:{placement:"top",title:t.name}},[e("a-avatar",{style:{marginRight:"10px"},attrs:{size:"large",src:t.avatar}})],1)}),1)],2)],1),e("a-list-item",[e("a-list-item-meta",[e("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 时间轴\n ")]),e("template",{slot:"description"},[e("a-timeline",[e("a-timeline-item",[t._v("...")]),t._l(t.steps,function(a,n){return e("a-timeline-item",{key:n},[t._v(t._s(a.date)+" "+t._s(a.content))])})],2)],1)],2)],1)],1)],1)],1)],1)],1)},i=[],s=e("50fc"),r={data:function(){return{environments:{},developers:[{name:"Ryan Wang",avatar:"https://gravatar.loli.net/avatar/7cc7f29278071bd4dce995612d428834?s=256&d=mm",website:"https://ryanc.cc",github:"https://github.com/ruibaby"},{name:"John Niang",avatar:"https://gravatar.loli.net/avatar/1dcf60ef27363dae539385d5bae9b2bd?s=256&d=mm",website:"https://johnniang.me",github:"https://github.com/johnniang"},{name:"Aquan",avatar:"https://gravatar.loli.net/avatar/3958035fa354403fa9ca3fca36b08068?s=256&d=mm",website:"https://blog.eunji.cn",github:"https://github.com/aquanlerou"},{name:"appdev",avatar:"https://gravatar.loli.net/avatar/08cf681fb7c6ad1b4fe70a8269c2103c?s=256&d=mm",website:"https://www.apkdv.com",github:"https://github.com/appdev"}],steps:[{date:"2019-??-??",content:"1.0 正式版发布"},{date:"2019-05-03",content:"Star 数达到 3300"},{date:"2019-01-30",content:"John Niang 加入开发"},{date:"2018-10-18",content:"构建镜像到 Docker hub"},{date:"2018-09-22",content:"Star 数达到 800"},{date:"2018-05-02",content:"第一条 Issue"},{date:"2018-05-01",content:"Star 数达到 100"},{date:"2018-04-29",content:"第一个 Pull request"},{date:"2018-04-28",content:"正式开源"},{date:"2018-03-21",content:"确定命名为 Halo并上传到 Github"}]}},created:function(){this.getEnvironments()},methods:{getEnvironments:function(){var t=this;s["a"].environments().then(function(a){t.environments=a.data.data})}}},o=r,l=(e("5ea2"),e("17cc")),c=Object(l["a"])(o,n,i,!1,null,null,null);a["default"]=c.exports},"5ea2":function(t,a,e){"use strict";var n=e("031c"),i=e.n(n);i.a}}]);
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-1be69b35"],{"031c":function(t,a,e){},2967:function(t,a,e){"use strict";e.r(a);var n=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"page-header-index-wide"},[e("a-row",[e("a-col",{attrs:{span:24}},[e("a-card",{attrs:{bordered:!1}},[e("a-list",{attrs:{itemLayout:"horizontal"}},[e("a-list-item",[e("a-list-item-meta",[e("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 环境信息\n ")]),e("template",{slot:"description"},[e("ul",[e("li",[t._v("版本:"+t._s(t.environments.version))]),e("li",[t._v("数据库:"+t._s(t.environments.database))]),e("li",[t._v("启动时间:"+t._s(t._f("moment")(t.environments.startTime)))])]),e("a",{attrs:{href:"https://github.com/halo-dev",target:"_blank"}},[t._v("开源地址\n "),e("a-icon",{attrs:{type:"link"}})],1),t._v(" \n "),e("a",{attrs:{href:"https://halo.run/docs",target:"_blank"}},[t._v("用户文档\n "),e("a-icon",{attrs:{type:"link"}})],1),t._v(" \n "),e("a",{attrs:{href:"https://bbs.halo.run",target:"_blank"}},[t._v("在线社区\n "),e("a-icon",{attrs:{type:"link"}})],1),t._v(" \n ")])],2)],1),e("a-list-item",[e("a-list-item-meta",[e("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 开发者\n ")]),e("template",{slot:"description"},t._l(t.developers,function(t,a){return e("a-tooltip",{key:a,attrs:{placement:"top",title:t.name}},[e("a-avatar",{style:{marginRight:"10px"},attrs:{size:"large",src:t.avatar}})],1)}),1)],2)],1),e("a-list-item",[e("a-list-item-meta",[e("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 时间轴\n ")]),e("template",{slot:"description"},[e("a-timeline",[e("a-timeline-item",[t._v("...")]),t._l(t.steps,function(a,n){return e("a-timeline-item",{key:n},[t._v(t._s(a.date)+" "+t._s(a.content))])})],2)],1)],2)],1)],1)],1)],1)],1)],1)},i=[],s=e("50fc"),r={data:function(){return{environments:{},developers:[{name:"Ryan Wang",avatar:"//cn.gravatar.com/avatar/7cc7f29278071bd4dce995612d428834?s=256&d=mm",website:"https://ryanc.cc",github:"https://github.com/ruibaby"},{name:"John Niang",avatar:"//cn.gravatar.com/avatar/1dcf60ef27363dae539385d5bae9b2bd?s=256&d=mm",website:"https://johnniang.me",github:"https://github.com/johnniang"},{name:"Aquan",avatar:"//cn.gravatar.com/avatar/3958035fa354403fa9ca3fca36b08068?s=256&d=mm",website:"https://blog.eunji.cn",github:"https://github.com/aquanlerou"},{name:"appdev",avatar:"//cn.gravatar.com/avatar/08cf681fb7c6ad1b4fe70a8269c2103c?s=256&d=mm",website:"https://www.apkdv.com",github:"https://github.com/appdev"}],steps:[{date:"2019-06-01",content:"1.0 正式版发布"},{date:"2019-05-03",content:"Star 数达到 3300"},{date:"2019-01-30",content:"John Niang 加入开发"},{date:"2018-10-18",content:"构建镜像到 Docker hub"},{date:"2018-09-22",content:"Star 数达到 800"},{date:"2018-05-02",content:"第一条 Issue"},{date:"2018-05-01",content:"Star 数达到 100"},{date:"2018-04-29",content:"第一个 Pull request"},{date:"2018-04-28",content:"正式开源"},{date:"2018-03-21",content:"确定命名为 Halo并上传到 Github"}]}},created:function(){this.getEnvironments()},methods:{getEnvironments:function(){var t=this;s["a"].environments().then(function(a){t.environments=a.data.data})}}},o=r,c=(e("5ea2"),e("17cc")),l=Object(c["a"])(o,n,i,!1,null,null,null);a["default"]=l.exports},"5ea2":function(t,a,e){"use strict";var n=e("031c"),i=e.n(n);i.a}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d21a35c"],{bb17:function(t,e,n){"use strict";n.r(e);var a=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"page-header-index-wide"},[n("a-row",{attrs:{gutter:12}},[n("a-col",{style:{"padding-bottom":"12px"},attrs:{xl:10,lg:10,md:10,sm:24,xs:24}},[n("a-card",{attrs:{title:t.title}},[n("a-form",{attrs:{layout:"horizontal"}},[n("a-form-item",{attrs:{label:"网站名称:"}},[n("a-input",{model:{value:t.link.name,callback:function(e){t.$set(t.link,"name",e)},expression:"link.name"}})],1),n("a-form-item",{attrs:{label:"网站地址:",help:"* 需要加上 http://"}},[n("a-input",{model:{value:t.link.url,callback:function(e){t.$set(t.link,"url",e)},expression:"link.url"}})],1),n("a-form-item",{attrs:{label:"Logo"}},[n("a-input",{model:{value:t.link.logo,callback:function(e){t.$set(t.link,"logo",e)},expression:"link.logo"}})],1),n("a-form-item",{attrs:{label:"分组:",help:"* 非必填"}},[n("a-input",{model:{value:t.link.team,callback:function(e){t.$set(t.link,"team",e)},expression:"link.team"}})],1),n("a-form-item",{attrs:{label:"描述:"}},[n("a-input",{attrs:{type:"textarea",autosize:{minRows:5}},model:{value:t.link.description,callback:function(e){t.$set(t.link,"description",e)},expression:"link.description"}})],1),n("a-form-item",["create"===t.formType?n("a-button",{attrs:{type:"primary"},on:{click:t.handleSaveClick}},[t._v("保存")]):n("a-button-group",[n("a-button",{attrs:{type:"primary"},on:{click:t.handleSaveClick}},[t._v("更新")]),"update"===t.formType?n("a-button",{attrs:{type:"dashed"},on:{click:t.handleAddLink}},[t._v("返回添加")]):t._e()],1)],1)],1)],1)],1),n("a-col",{style:{"padding-bottom":"12px"},attrs:{xl:14,lg:14,md:14,sm:24,xs:24}},[n("a-card",{attrs:{title:"所有友情链接"}},[n("a-table",{attrs:{columns:t.columns,dataSource:t.links,loading:t.loading,rowKey:function(t){return t.id}},scopedSlots:t._u([{key:"url",fn:function(e){return[n("a",{attrs:{target:"_blank",href:e}},[t._v(t._s(e))])]}},{key:"name",fn:function(e){return n("ellipsis",{attrs:{length:15,tooltip:""}},[t._v(t._s(e))])}},{key:"action",fn:function(e,a){return n("span",{},[n("a",{attrs:{href:"javascript:;"},on:{click:function(e){return t.handleEditLink(a.id)}}},[t._v("编辑")]),n("a-divider",{attrs:{type:"vertical"}}),n("a-popconfirm",{attrs:{title:"你确定要删除【"+a.name+"】链接?",okText:"确定",cancelText:"取消"},on:{confirm:function(e){return t.handleDeleteLink(a.id)}}},[n("a",{attrs:{href:"javascript:;"}},[t._v("删除")])])],1)}}])})],1)],1)],1)],1)},i=[],l=(n("3aba"),n("9efd")),o="/api/admin/links",r={listAll:function(){return Object(l["a"])({url:"".concat(o),method:"get"})},create:function(t){return Object(l["a"])({url:o,data:t,method:"post"})},get:function(t){return Object(l["a"])({url:"".concat(o,"/").concat(t),method:"get"})},update:function(t,e){return Object(l["a"])({url:"".concat(o,"/").concat(t),data:e,method:"put"})},delete:function(t){return Object(l["a"])({url:"".concat(o,"/").concat(t),method:"delete"})}},c=r,s=[{title:"名称",dataIndex:"name",scopedSlots:{customRender:"name"}},{title:"网址",dataIndex:"url",scopedSlots:{customRender:"url"}},{title:"分组",dataIndex:"team"},{title:"操作",key:"action",scopedSlots:{customRender:"action"}}],d={data:function(){return{formType:"create",data:[],loading:!1,columns:s,links:[],link:{}}},computed:{title:function(){return this.link.id?"修改友情链接":"添加友情链接"}},created:function(){this.loadLinks()},methods:{loadLinks:function(){var t=this;this.loading=!0,c.listAll().then(function(e){t.links=e.data.data,t.loading=!1})},handleSaveClick:function(){this.createOrUpdateLink()},handleAddLink:function(){this.formType="create",this.link={}},handleEditLink:function(t){var e=this;c.get(t).then(function(t){e.link=t.data.data,e.formType="update"})},handleDeleteLink:function(t){var e=this;c.delete(t).then(function(t){e.$message.success("删除成功!"),e.loadLinks()})},createOrUpdateLink:function(){var t=this;this.link.id?c.update(this.link.id,this.link).then(function(e){t.$message.success("更新成功!"),t.loadLinks()}):c.create(this.link).then(function(e){t.$message.success("保存成功!"),t.loadLinks()}),this.handleAddLink()}}},u=d,m=n("17cc"),k=Object(m["a"])(u,a,i,!1,null,"56d4c6ed",null);e["default"]=k.exports}}]);
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d21a35c"],{bb17:function(t,e,n){"use strict";n.r(e);var a=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"page-header-index-wide"},[n("a-row",{attrs:{gutter:12}},[n("a-col",{style:{"padding-bottom":"12px"},attrs:{xl:10,lg:10,md:10,sm:24,xs:24}},[n("a-card",{attrs:{title:t.title}},[n("a-form",{attrs:{layout:"horizontal"}},[n("a-form-item",{attrs:{label:"网站名称:"}},[n("a-input",{model:{value:t.link.name,callback:function(e){t.$set(t.link,"name",e)},expression:"link.name"}})],1),n("a-form-item",{attrs:{label:"网站地址:",help:"* 需要加上 http://"}},[n("a-input",{model:{value:t.link.url,callback:function(e){t.$set(t.link,"url",e)},expression:"link.url"}})],1),n("a-form-item",{attrs:{label:"Logo"}},[n("a-input",{model:{value:t.link.logo,callback:function(e){t.$set(t.link,"logo",e)},expression:"link.logo"}})],1),n("a-form-item",{attrs:{label:"分组:",help:"* 非必填"}},[n("a-input",{model:{value:t.link.team,callback:function(e){t.$set(t.link,"team",e)},expression:"link.team"}})],1),n("a-form-item",{attrs:{label:"描述:"}},[n("a-input",{attrs:{type:"textarea",autosize:{minRows:5}},model:{value:t.link.description,callback:function(e){t.$set(t.link,"description",e)},expression:"link.description"}})],1),n("a-form-item",["create"===t.formType?n("a-button",{attrs:{type:"primary"},on:{click:t.handleSaveClick}},[t._v("保存")]):n("a-button-group",[n("a-button",{attrs:{type:"primary"},on:{click:t.handleSaveClick}},[t._v("更新")]),"update"===t.formType?n("a-button",{attrs:{type:"dashed"},on:{click:t.handleAddLink}},[t._v("返回添加")]):t._e()],1)],1)],1)],1)],1),n("a-col",{style:{"padding-bottom":"12px"},attrs:{xl:14,lg:14,md:14,sm:24,xs:24}},[n("a-card",{attrs:{title:"所有友情链接"}},[n("a-table",{attrs:{columns:t.columns,dataSource:t.links,loading:t.loading,rowKey:function(t){return t.id}},scopedSlots:t._u([{key:"url",fn:function(e){return[n("a",{attrs:{target:"_blank",href:e}},[t._v(t._s(e))])]}},{key:"name",fn:function(e){return n("ellipsis",{attrs:{length:15,tooltip:""}},[t._v(t._s(e))])}},{key:"action",fn:function(e,a){return n("span",{},[n("a",{attrs:{href:"javascript:;"},on:{click:function(e){return t.handleEditLink(a.id)}}},[t._v("编辑")]),n("a-divider",{attrs:{type:"vertical"}}),n("a-popconfirm",{attrs:{title:"你确定要删除【"+a.name+"】链接?",okText:"确定",cancelText:"取消"},on:{confirm:function(e){return t.handleDeleteLink(a.id)}}},[n("a",{attrs:{href:"javascript:;"}},[t._v("删除")])])],1)}}])})],1)],1)],1)],1)},i=[],l=(n("69a3"),n("9efd")),o="/api/admin/links",c={listAll:function(){return Object(l["a"])({url:"".concat(o),method:"get"})},create:function(t){return Object(l["a"])({url:o,data:t,method:"post"})},get:function(t){return Object(l["a"])({url:"".concat(o,"/").concat(t),method:"get"})},update:function(t,e){return Object(l["a"])({url:"".concat(o,"/").concat(t),data:e,method:"put"})},delete:function(t){return Object(l["a"])({url:"".concat(o,"/").concat(t),method:"delete"})}},r=c,s=[{title:"名称",dataIndex:"name",scopedSlots:{customRender:"name"}},{title:"网址",dataIndex:"url",scopedSlots:{customRender:"url"}},{title:"分组",dataIndex:"team"},{title:"操作",key:"action",scopedSlots:{customRender:"action"}}],d={data:function(){return{formType:"create",data:[],loading:!1,columns:s,links:[],link:{}}},computed:{title:function(){return this.link.id?"修改友情链接":"添加友情链接"}},created:function(){this.loadLinks()},methods:{loadLinks:function(){var t=this;this.loading=!0,r.listAll().then(function(e){t.links=e.data.data,t.loading=!1})},handleSaveClick:function(){this.createOrUpdateLink()},handleAddLink:function(){this.formType="create",this.link={}},handleEditLink:function(t){var e=this;r.get(t).then(function(t){e.link=t.data.data,e.formType="update"})},handleDeleteLink:function(t){var e=this;r.delete(t).then(function(t){e.$message.success("删除成功!"),e.loadLinks()})},createOrUpdateLink:function(){var t=this;this.link.id?r.update(this.link.id,this.link).then(function(e){t.$message.success("更新成功!"),t.loadLinks()}):r.create(this.link).then(function(e){t.$message.success("保存成功!"),t.loadLinks()}),this.handleAddLink()}}},u=d,m=n("17cc"),k=Object(m["a"])(u,a,i,!1,null,"243cf1cf",null);e["default"]=k.exports}}]);

View File

@ -1 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d228d13"],{db98:function(a,t,o){"use strict";o.r(t);var e=function(){var a=this,t=a.$createElement,o=a._self._c||t;return o("div",{staticClass:"page-header-index-wide"},[o("div",{staticClass:"card-content"},[o("a-row",{attrs:{gutter:12}},[o("a-col",{attrs:{xl:6,lg:6,md:12,sm:24,xs:24}},[o("a-card",{attrs:{title:"Markdown 文章导入",bordered:!1,bodyStyle:{padding:"16px"}}},[o("p",[a._v("支持 Hexo/Jekyll 文章导入并解析元数据")]),o("a-button",{staticStyle:{float:"right"},attrs:{type:"primary"},on:{click:a.handleImportMarkdown}},[a._v("导入")])],1)],1)],1),o("a-modal",{attrs:{title:"Markdown 文章导入",footer:null},model:{value:a.markdownUpload,callback:function(t){a.markdownUpload=t},expression:"markdownUpload"}},[o("upload",{attrs:{name:"files",multiple:"",accept:"text/markdown",uploadHandler:a.uploadHandler},on:{change:a.handleChange}},[o("p",{staticClass:"ant-upload-drag-icon"},[o("a-icon",{attrs:{type:"inbox"}})],1),o("p",{staticClass:"ant-upload-text"},[a._v("拖拽或点击选择 Markdown 文件到此处")]),o("p",{staticClass:"ant-upload-hint"},[a._v("支持多个文件同时上传")])])],1)],1)])},n=[],d=(o("3a23"),o("9efd")),r="/api/admin/backups",l={importMarkdown:function(a,t,o){return Object(d["a"])({url:"".concat(r,"/import/markdowns"),timeout:864e4,data:a,onUploadProgress:t,cancelToken:o,method:"post"})}},s=l,i={data:function(){return{markdownUpload:!1,uploadHandler:s.importMarkdown}},methods:{handleImportMarkdown:function(){this.markdownUpload=!0},handleChange:function(a){var t=a.file.status;"uploading"!==t&&console.log(a.file,a.fileList),"done"===t?this.$message.success("".concat(a.file.name," 导入成功!")):"error"===t&&this.$message.error("".concat(a.file.name," 导入失败!"))}}},c=i,p=o("17cc"),u=Object(p["a"])(c,e,n,!1,null,"8dab78e6",null);t["default"]=u.exports}}]);
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d228d13"],{db98:function(a,t,o){"use strict";o.r(t);var e=function(){var a=this,t=a.$createElement,o=a._self._c||t;return o("div",{staticClass:"page-header-index-wide"},[o("div",{staticClass:"card-content"},[o("a-row",{attrs:{gutter:12}},[o("a-col",{attrs:{xl:6,lg:6,md:12,sm:24,xs:24}},[o("a-card",{attrs:{title:"Markdown 文章导入",bordered:!1,bodyStyle:{padding:"16px"}}},[o("p",[a._v("支持 Hexo/Jekyll 文章导入并解析元数据")]),o("a-button",{staticStyle:{float:"right"},attrs:{type:"primary"},on:{click:a.handleImportMarkdown}},[a._v("导入")])],1)],1)],1),o("a-modal",{attrs:{title:"Markdown 文章导入",footer:null},model:{value:a.markdownUpload,callback:function(t){a.markdownUpload=t},expression:"markdownUpload"}},[o("upload",{attrs:{name:"files",multiple:"",accept:"text/markdown",uploadHandler:a.uploadHandler},on:{change:a.handleChange}},[o("p",{staticClass:"ant-upload-drag-icon"},[o("a-icon",{attrs:{type:"inbox"}})],1),o("p",{staticClass:"ant-upload-text"},[a._v("拖拽或点击选择 Markdown 文件到此处")]),o("p",{staticClass:"ant-upload-hint"},[a._v("支持多个文件同时上传")])])],1)],1)])},n=[],d=(o("7364"),o("9efd")),r="/api/admin/backups",l={importMarkdown:function(a,t,o){return Object(d["a"])({url:"".concat(r,"/import/markdowns"),timeout:864e4,data:a,onUploadProgress:t,cancelToken:o,method:"post"})}},s=l,i={data:function(){return{markdownUpload:!1,uploadHandler:s.importMarkdown}},methods:{handleImportMarkdown:function(){this.markdownUpload=!0},handleChange:function(a){var t=a.file.status;"uploading"!==t&&console.log(a.file,a.fileList),"done"===t?this.$message.success("".concat(a.file.name," 导入成功!")):"error"===t&&this.$message.error("".concat(a.file.name," 导入失败!"))}}},c=i,p=o("17cc"),u=Object(p["a"])(c,e,n,!1,null,"5fc42ae9",null);t["default"]=u.exports}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-9449c032"],{9231:function(a,e,t){"use strict";var s=t("ea0a"),n=t.n(s);n.a},ac2a5:function(a,e,t){"use strict";t.r(e);var s=function(){var a=this,e=a.$createElement,t=a._self._c||e;return t("div",{staticClass:"container"},[a._m(0),t("div",{staticClass:"loginBody animated"},[t("a-form",{attrs:{layout:"vertical"},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&a._k(e.keyCode,"enter",13,e.key,"Enter")?null:a.handleLogin(e)}}},[t("a-form-item",{staticClass:"animated fadeInUp",style:{"animation-delay":"0.1s"}},[t("a-input",{attrs:{placeholder:"用户名/邮箱"},model:{value:a.username,callback:function(e){a.username=e},expression:"username"}},[t("a-icon",{staticStyle:{color:"rgba(0,0,0,.25)"},attrs:{slot:"prefix",type:"user"},slot:"prefix"})],1)],1),t("a-form-item",{staticClass:"animated fadeInUp",style:{"animation-delay":"0.2s"}},[t("a-input",{attrs:{type:"password",placeholder:"密码"},model:{value:a.password,callback:function(e){a.password=e},expression:"password"}},[t("a-icon",{staticStyle:{color:"rgba(0,0,0,.25)"},attrs:{slot:"prefix",type:"lock"},slot:"prefix"})],1)],1),t("a-row",[t("a-button",{staticClass:"animated fadeInUp",style:{"animation-delay":"0.3s"},attrs:{type:"primary",block:!0},on:{click:a.handleLogin}},[a._v("登录")])],1)],1)],1)])},n=[function(){var a=this,e=a.$createElement,t=a._self._c||e;return t("div",{staticClass:"loginLogo animated fadeInUp"},[t("span",[a._v("Halo")])])}],i=(t("f91a"),t("3556")),r=t("591a"),o={data:function(){return{username:null,password:null}},methods:Object(i["a"])({},Object(r["b"])(["login","loadUser"]),{handleLogin:function(){var a=this;this.username?this.password?this.login({username:this.username,password:this.password}).then(function(e){a.loginSuccess()}):this.$message.warn("密码不能为空!"):this.$message.warn("用户名不能为空!")},loginSuccess:function(){this.loadUser(),this.$route.query.redirect?this.$router.replace(this.$route.query.redirect):this.$router.replace({name:"Dashboard"})}})},l=o,c=(t("9231"),t("17cc")),u=Object(c["a"])(l,s,n,!1,null,null,null);e["default"]=u.exports},ea0a:function(a,e,t){}}]);
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-9449c032"],{9231:function(a,e,t){"use strict";var s=t("ea0a"),n=t.n(s);n.a},ac2a5:function(a,e,t){"use strict";t.r(e);var s=function(){var a=this,e=a.$createElement,t=a._self._c||e;return t("div",{staticClass:"container"},[a._m(0),t("div",{staticClass:"loginBody animated"},[t("a-form",{attrs:{layout:"vertical"},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&a._k(e.keyCode,"enter",13,e.key,"Enter")?null:a.handleLogin(e)}}},[t("a-form-item",{staticClass:"animated fadeInUp",style:{"animation-delay":"0.1s"}},[t("a-input",{attrs:{placeholder:"用户名/邮箱"},model:{value:a.username,callback:function(e){a.username=e},expression:"username"}},[t("a-icon",{staticStyle:{color:"rgba(0,0,0,.25)"},attrs:{slot:"prefix",type:"user"},slot:"prefix"})],1)],1),t("a-form-item",{staticClass:"animated fadeInUp",style:{"animation-delay":"0.2s"}},[t("a-input",{attrs:{type:"password",placeholder:"密码"},model:{value:a.password,callback:function(e){a.password=e},expression:"password"}},[t("a-icon",{staticStyle:{color:"rgba(0,0,0,.25)"},attrs:{slot:"prefix",type:"lock"},slot:"prefix"})],1)],1),t("a-row",[t("a-button",{staticClass:"animated fadeInUp",style:{"animation-delay":"0.3s"},attrs:{type:"primary",block:!0},on:{click:a.handleLogin}},[a._v("登录")])],1)],1)],1)])},n=[function(){var a=this,e=a.$createElement,t=a._self._c||e;return t("div",{staticClass:"loginLogo animated fadeInUp"},[t("span",[a._v("Halo")])])}],i=(t("34a3"),t("e20c")),r=t("591a"),o={data:function(){return{username:null,password:null}},methods:Object(i["a"])({},Object(r["b"])(["login","loadUser"]),{handleLogin:function(){var a=this;this.username?this.password?this.login({username:this.username,password:this.password}).then(function(e){a.loginSuccess()}):this.$message.warn("密码不能为空!"):this.$message.warn("用户名不能为空!")},loginSuccess:function(){this.loadUser(),this.$route.query.redirect?this.$router.replace(this.$route.query.redirect):this.$router.replace({name:"Dashboard"})}})},l=o,c=(t("9231"),t("17cc")),u=Object(c["a"])(l,s,n,!1,null,null,null);e["default"]=u.exports},ea0a:function(a,e,t){}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["fail"],{"01a4":function(t,e,s){},2254:function(t,e,s){"use strict";var a=s("01a4"),c=s.n(a);c.a},cc89:function(t,e,s){"use strict";s.r(e);var a=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("exception-page",{attrs:{type:"404"}})},c=[],n=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"exception"},[s("div",{staticClass:"img"},[s("img",{attrs:{src:t.config[t.type].img}})]),s("div",{staticClass:"content"},[s("h1",[t._v(t._s(t.config[t.type].title))]),s("div",{staticClass:"desc"},[t._v(t._s(t.config[t.type].desc))]),s("div",{staticClass:"action"},[s("a-button",{attrs:{type:"primary"},on:{click:t.handleToHome}},[t._v("返回首页")])],1)])])},i=[],o={404:{img:"https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg",title:"404",desc:"抱歉,你访问的页面不存在"},500:{img:"https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg",title:"500",desc:"抱歉,服务器出错了"}},p=o,r={name:"Exception",props:{type:{type:String,default:"404"}},data:function(){return{config:p}},methods:{handleToHome:function(){this.$router.push({name:"Dashboard"})}}},l=r,u=(s("2254"),s("17cc")),d=Object(u["a"])(l,n,i,!1,null,"230942b4",null),m=d.exports,g={components:{ExceptionPage:m}},f=g,v=Object(u["a"])(f,a,c,!1,null,"e319b3a6",null);e["default"]=v.exports}}]);
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["fail"],{5517:function(t,e,s){"use strict";var c=s("92530"),n=s.n(c);n.a},92530:function(t,e,s){},cc89:function(t,e,s){"use strict";s.r(e);var c=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("exception-page",{attrs:{type:"404"}})},n=[],a=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"exception"},[s("div",{staticClass:"img"},[s("img",{attrs:{src:t.config[t.type].img}})]),s("div",{staticClass:"content"},[s("h1",[t._v(t._s(t.config[t.type].title))]),s("div",{staticClass:"desc"},[t._v(t._s(t.config[t.type].desc))]),s("div",{staticClass:"action"},[s("a-button",{attrs:{type:"primary"},on:{click:t.handleToHome}},[t._v("返回首页")])],1)])])},i=[],o={404:{img:"https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg",title:"404",desc:"抱歉,你访问的页面不存在"},500:{img:"https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg",title:"500",desc:"抱歉,服务器出错了"}},p=o,r={name:"Exception",props:{type:{type:String,default:"404"}},data:function(){return{config:p}},methods:{handleToHome:function(){this.$router.push({name:"Dashboard"})}}},l=r,u=(s("5517"),s("17cc")),d=Object(u["a"])(l,a,i,!1,null,"729a8fea",null),f=d.exports,m={components:{ExceptionPage:f}},g=m,v=Object(u["a"])(g,c,n,!1,null,"388fe08d",null);e["default"]=v.exports}}]);