mirror of https://github.com/halo-dev/halo
commit
018d3f6667
|
@ -64,7 +64,3 @@ nbdist/
|
|||
|
||||
### VSCode
|
||||
.vscode
|
||||
|
||||
### Halo
|
||||
admin/
|
||||
|
||||
|
|
42
.travis.yml
42
.travis.yml
|
@ -1,15 +1,49 @@
|
|||
language: java
|
||||
jdk:
|
||||
- oraclejdk8
|
||||
before_cache:
|
||||
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
|
||||
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
|
||||
cache:
|
||||
directories:
|
||||
- .autoconf
|
||||
- $HOME/.m2
|
||||
script:
|
||||
- mvn clean package -Pci
|
||||
- $HOME/.gradle/caches/
|
||||
- $HOME/.gradle/wrapper/
|
||||
- $TRAVIS_BUILD_DIR/build/libs/
|
||||
dist: trusty
|
||||
jobs:
|
||||
include:
|
||||
- stage: test
|
||||
script: ./gradlew check
|
||||
- stage: build
|
||||
script: ./gradlew clean build -x test
|
||||
- stage: Build Docker Image for Release
|
||||
script: ./scripts/docker-build-release.sh
|
||||
- stage: Build Docker Image for Dev
|
||||
script: ./scripts/docker-build-dev.sh
|
||||
- stage: GitHub Release
|
||||
script: echo "Deploying to GitHub releases ..." && pwd
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key: $GITHUB_OAUTH_TOKEN
|
||||
file_glob: true
|
||||
file: $TRAVIS_BUILD_DIR/build/libs/*
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- name: GitHub Release
|
||||
if: tag =~ /^v\d+\.\d+(\.\d+)?(-\S*)?$/
|
||||
- name: Build Docker Image for Release
|
||||
if: tag =~ /^v\d+\.\d+(\.\d+)?(-release)?$/
|
||||
- name: Build Docker Image for Dev
|
||||
if: tag =~ /^v\d+\.\d+(\.\d+)?-(beta|alpha)+(\.\d+)?$/
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- dev
|
||||
- /^v\d+\.\d+(\.\d+)?(-\S*)?$/
|
||||
notifications:
|
||||
webhooks:
|
||||
- https://fathomless-fjord-24024.herokuapp.com/notify
|
||||
|
|
|
@ -2,10 +2,11 @@ FROM openjdk:8-jdk-alpine
|
|||
|
||||
VOLUME /tmp
|
||||
|
||||
ARG JAR_FILE=build/libs/halo-1.0.0.bata.jar
|
||||
ARG JAR_FILE=build/libs/halo.jar
|
||||
ARG PORT=8090
|
||||
ARG TIME_ZONE=Asia/Shanghai
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
ENV TZ=${TIME_ZONE}
|
||||
|
||||
COPY ${JAR_FILE} halo.jar
|
||||
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
<p align="center">
|
||||
<a href="https://ryanc.cc"><img alt="Author" src="https://img.shields.io/badge/author-ruibaby-red.svg?style=flat-square"/></a>
|
||||
<a href="#"><img alt="JDK" src="https://img.shields.io/badge/JDK-1.8-yellow.svg?style=flat-square"/></a>
|
||||
<a href="https://github.com/ruibaby/halo/releases"><img alt="GitHub release" src="https://img.shields.io/github/release/ruibaby/halo.svg?style=flat-square"/></a>
|
||||
<a href="https://travis-ci.org/ruibaby/halo"><img alt="Travis CI" src="https://img.shields.io/travis/ruibaby/halo.svg?style=flat-square"/></a>
|
||||
<a href="https://hub.docker.com/r/ruibaby/halo/"><img alt="Docker Build Status" src="https://img.shields.io/docker/build/ruibaby/halo.svg?style=flat-square"/></a>
|
||||
<a href="https://github.com/halo-dev/halo/releases"><img alt="GitHub release" src="https://img.shields.io/github/release/halo-dev/halo.svg?style=flat-square"/></a>
|
||||
<a href="https://travis-ci.org/halo-dev/halo"><img alt="Travis CI" src="https://img.shields.io/travis/halo-dev/halo.svg?style=flat-square"/></a>
|
||||
<a href="https://hub.docker.com/r/halo-dev/halo/"><img alt="Docker Build Status" src="https://img.shields.io/docker/build/halo-dev/halo.svg?style=flat-square"/></a>
|
||||
</p>
|
||||
|
||||
------------------------------
|
||||
|
|
|
@ -8,12 +8,16 @@ apply plugin: 'io.spring.dependency-management'
|
|||
|
||||
group = 'run.halo.app'
|
||||
archivesBaseName = 'halo'
|
||||
version = '1.0.0.beta'
|
||||
version = '1.0.0-beta.4'
|
||||
sourceCompatibility = '1.8'
|
||||
description = 'Halo, personal blog system developed in Java.'
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url 'https://maven.aliyun.com/nexus/content/groups/public'
|
||||
}
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
}
|
||||
|
||||
configurations {
|
||||
|
|
|
@ -18,7 +18,7 @@ services:
|
|||
- halo
|
||||
|
||||
halo:
|
||||
image: ruibaby/halo
|
||||
image: ruibaby/halo:latest-dev
|
||||
container_name: halo
|
||||
hostname: halo
|
||||
restart: always
|
||||
|
@ -29,7 +29,7 @@ services:
|
|||
env_file:
|
||||
- ./halo.env
|
||||
volumes:
|
||||
- ~/halo:/root/halo
|
||||
- ~/.halo:/root/.halo
|
||||
|
||||
docker-gen:
|
||||
image: jwilder/docker-gen
|
||||
|
|
|
@ -25,10 +25,8 @@ services:
|
|||
- VIRTUAL_HOST=localhost # 你的博客地址(务必修改)
|
||||
- LETSENCRYPT_HOST=localhost # 你的博客地址 (务必修改)
|
||||
- LETSENCRYPT_EMAIL=i@example.com # 证书所有者的邮箱,快过期时会提醒(务必修改)
|
||||
- DB_USER=admin # h2数据库用户名,自定义(务必修改)
|
||||
- DB_PASSWORD=123456 # h2数据库密码,自定义(务必修改)
|
||||
volumes:
|
||||
- ~/halo:/root/halo
|
||||
- ~/.halo:/root/.halo
|
||||
|
||||
docker-gen:
|
||||
restart: always
|
||||
|
|
|
@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
|||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
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:latest-dev -t $DOCKER_USERNAME/halo:$VERSION.dev .
|
||||
docker images
|
||||
docker push $DOCKER_USERNAME/halo
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
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 images
|
||||
docker push $DOCKER_USERNAME/halo
|
|
@ -151,8 +151,6 @@ public class HaloConfiguration {
|
|||
"/api/admin/installations",
|
||||
"/api/admin/recoveries/migrations/*"
|
||||
);
|
||||
adminAuthenticationFilter.addTryAuthUrlMethodPattern("/api/admin/comments", HttpMethod.POST.name());
|
||||
adminAuthenticationFilter.addTryAuthUrlMethodPattern("/api/content/comments", HttpMethod.POST.name());
|
||||
adminAuthenticationFilter.setFailureHandler(
|
||||
failureHandler);
|
||||
|
||||
|
|
|
@ -16,24 +16,22 @@ import run.halo.app.model.entity.BaseComment;
|
|||
import run.halo.app.model.entity.Category;
|
||||
import run.halo.app.model.entity.Post;
|
||||
import run.halo.app.model.entity.User;
|
||||
import run.halo.app.model.enums.AttachmentType;
|
||||
import run.halo.app.model.enums.LogType;
|
||||
import run.halo.app.model.enums.PostStatus;
|
||||
import run.halo.app.model.params.*;
|
||||
import run.halo.app.model.properties.*;
|
||||
import run.halo.app.model.properties.BlogProperties;
|
||||
import run.halo.app.model.properties.PrimaryProperties;
|
||||
import run.halo.app.model.properties.PropertyEnum;
|
||||
import run.halo.app.model.support.BaseResponse;
|
||||
import run.halo.app.model.support.CreateCheck;
|
||||
import run.halo.app.service.*;
|
||||
import run.halo.app.utils.ValidationUtils;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static run.halo.app.model.support.HaloConst.DEFAULT_THEME_ID;
|
||||
|
||||
/**
|
||||
* Installation controller.
|
||||
*
|
||||
|
@ -196,6 +194,8 @@ public class InstallController {
|
|||
return userService.getCurrentUser().map(user -> {
|
||||
// Update this user
|
||||
installParam.update(user);
|
||||
// Set password manually
|
||||
userService.setPassword(user, installParam.getPassword());
|
||||
// Update user
|
||||
return userService.update(user);
|
||||
}).orElseGet(() -> userService.createBy(installParam));
|
||||
|
|
|
@ -43,7 +43,7 @@ public class PostCommentController {
|
|||
|
||||
@GetMapping("latest")
|
||||
@ApiOperation("Pages latest comments")
|
||||
public List<PostCommentWithPostVO> pageLatest(@RequestParam(name = "top", defaultValue = "10") int top,
|
||||
public List<PostCommentWithPostVO> listLatest(@RequestParam(name = "top", defaultValue = "10") int top,
|
||||
@RequestParam(name = "status", required = false) CommentStatus status) {
|
||||
// Get latest comment
|
||||
List<PostComment> content = postCommentService.pageLatest(top, status).getContent();
|
||||
|
|
|
@ -6,12 +6,9 @@ import org.springframework.boot.web.servlet.error.ErrorController;
|
|||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import run.halo.app.model.entity.User;
|
||||
import run.halo.app.model.support.HaloConst;
|
||||
import run.halo.app.service.ThemeService;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
/**
|
||||
* Error page Controller
|
||||
|
@ -29,8 +26,6 @@ public class CommonController implements ErrorController {
|
|||
|
||||
private static final String INTERNAL_ERROR_TEMPLATE = "500.ftl";
|
||||
|
||||
private static final String ADMIN_URL = "/admin";
|
||||
|
||||
private final ThemeService themeService;
|
||||
|
||||
public CommonController(ThemeService themeService) {
|
||||
|
@ -44,13 +39,9 @@ public class CommonController implements ErrorController {
|
|||
* @return String
|
||||
*/
|
||||
@GetMapping(value = ERROR_PATH)
|
||||
public String handleError(HttpServletRequest request, HttpSession session) {
|
||||
public String handleError(HttpServletRequest request) {
|
||||
final Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
|
||||
|
||||
final String requestURI = request.getRequestURI();
|
||||
|
||||
final User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY);
|
||||
|
||||
log.error("Error path: [{}], status: [{}]", getErrorPath(), statusCode);
|
||||
|
||||
// Get the exception
|
||||
|
@ -62,40 +53,17 @@ public class CommonController implements ErrorController {
|
|||
if (StringUtils.startsWithIgnoreCase(throwable.getMessage(), "Could not resolve view with name '")) {
|
||||
// TODO May cause unknown-reason problem
|
||||
// if Ftl was not found then redirect to /404
|
||||
if (requestURI.contains(ADMIN_URL) && null != user) {
|
||||
return "redirect:/admin/404";
|
||||
} else {
|
||||
return "redirect:/404";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (requestURI.contains(ADMIN_URL) && null != user) {
|
||||
return "redirect:/admin/500";
|
||||
} else {
|
||||
|
||||
if (statusCode == 500) {
|
||||
return "redirect:/500";
|
||||
} else {
|
||||
return "redirect:/404";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render 404 error page
|
||||
*
|
||||
* @return template path:
|
||||
*/
|
||||
@GetMapping(value = "/admin/404")
|
||||
public String adminNotFround() {
|
||||
return "common/error/404";
|
||||
}
|
||||
|
||||
/**
|
||||
* Render 500 error page
|
||||
*
|
||||
* @return template path:
|
||||
*/
|
||||
@GetMapping(value = "/admin/500")
|
||||
public String adminInternalError() {
|
||||
return "common/error/500";
|
||||
}
|
||||
|
||||
/**
|
||||
* Render 404 error page
|
||||
*
|
||||
|
|
|
@ -74,6 +74,8 @@ public class CommentEventListener {
|
|||
// Get postComment id
|
||||
PostComment postComment = postCommentService.getById(newEvent.getCommentId());
|
||||
|
||||
log.debug("Got post comment: [{}]", postComment);
|
||||
|
||||
Post post = postService.getById(postComment.getPostId());
|
||||
|
||||
StrBuilder url = new StrBuilder(optionService.getBlogBaseUrl())
|
||||
|
@ -86,6 +88,8 @@ public class CommentEventListener {
|
|||
} else if (newEvent.getSource() instanceof SheetService) {
|
||||
SheetComment sheetComment = sheetCommentService.getById(newEvent.getCommentId());
|
||||
|
||||
log.debug("Got sheet comment: [{}]", sheetComment);
|
||||
|
||||
Sheet sheet = sheetService.getById(sheetComment.getPostId());
|
||||
|
||||
StrBuilder url = new StrBuilder(optionService.getBlogBaseUrl())
|
||||
|
@ -98,6 +102,8 @@ public class CommentEventListener {
|
|||
} else if (newEvent.getSource() instanceof JournalService) {
|
||||
JournalComment journalComment = journalCommentService.getById(newEvent.getCommentId());
|
||||
|
||||
log.debug("Got journal comment: [{}]", journalComment);
|
||||
|
||||
Journal journal = journalService.getById(journalComment.getPostId());
|
||||
|
||||
StrBuilder url = new StrBuilder(optionService.getBlogBaseUrl())
|
||||
|
@ -133,7 +139,7 @@ public class CommentEventListener {
|
|||
|
||||
Map<String, Object> data = new HashMap<>();
|
||||
|
||||
log.debug("replyEvent.getSource():"+replyEvent.getSource().toString());
|
||||
log.debug("replyEvent.getSource():" + replyEvent.getSource().toString());
|
||||
|
||||
if (replyEvent.getSource() instanceof PostCommentService) {
|
||||
|
||||
|
|
|
@ -49,7 +49,6 @@ public class FreemarkerConfigAwareListener {
|
|||
this.userService = userService;
|
||||
}
|
||||
|
||||
@Async
|
||||
@EventListener
|
||||
@Order(Ordered.HIGHEST_PRECEDENCE + 1)
|
||||
public void onApplicationStartedEvent(ApplicationStartedEvent applicationStartedEvent) throws TemplateModelException {
|
||||
|
@ -60,7 +59,6 @@ public class FreemarkerConfigAwareListener {
|
|||
loadUserConfig();
|
||||
}
|
||||
|
||||
@Async
|
||||
@EventListener
|
||||
public void onThemeActivatedEvent(ThemeActivatedEvent themeActivatedEvent) throws TemplateModelException {
|
||||
log.debug("Received theme activated event");
|
||||
|
@ -68,7 +66,6 @@ public class FreemarkerConfigAwareListener {
|
|||
loadThemeConfig();
|
||||
}
|
||||
|
||||
@Async
|
||||
@EventListener
|
||||
public void onUserUpdate(UserUpdatedEvent event) throws TemplateModelException {
|
||||
log.debug("Received user updated event, user id: [{}]", event.getUserId());
|
||||
|
@ -76,7 +73,6 @@ public class FreemarkerConfigAwareListener {
|
|||
loadUserConfig();
|
||||
}
|
||||
|
||||
@Async
|
||||
@EventListener
|
||||
public void onOptionUpdate(OptionUpdatedEvent event) throws TemplateModelException {
|
||||
log.debug("Received option updated event");
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package run.halo.app.event.theme;
|
||||
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
import run.halo.app.cache.StringCacheStore;
|
||||
import run.halo.app.event.options.OptionUpdatedEvent;
|
||||
import run.halo.app.service.ThemeService;
|
||||
|
||||
/**
|
||||
|
@ -13,7 +14,7 @@ import run.halo.app.service.ThemeService;
|
|||
* @date 19-4-29
|
||||
*/
|
||||
@Component
|
||||
public class ThemeUpdatedListener implements ApplicationListener<ThemeUpdatedEvent> {
|
||||
public class ThemeUpdatedListener {
|
||||
|
||||
private final StringCacheStore cacheStore;
|
||||
|
||||
|
@ -21,9 +22,13 @@ public class ThemeUpdatedListener implements ApplicationListener<ThemeUpdatedEve
|
|||
this.cacheStore = cacheStore;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Async
|
||||
@EventListener
|
||||
public void onApplicationEvent(ThemeUpdatedEvent event) {
|
||||
cacheStore.delete(ThemeService.THEMES_CACHE_KEY);
|
||||
}
|
||||
|
||||
@EventListener
|
||||
public void onOptionUpdatedEvent(OptionUpdatedEvent optionUpdatedEvent) {
|
||||
cacheStore.delete(ThemeService.THEMES_CACHE_KEY);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
package run.halo.app.handler.file;
|
||||
|
||||
import run.halo.app.exception.FileOperationException;
|
||||
import run.halo.app.model.enums.AttachmentType;
|
||||
import run.halo.app.model.support.UploadResult;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.lang.NonNull;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import run.halo.app.exception.FileOperationException;
|
||||
import run.halo.app.model.enums.AttachmentType;
|
||||
import run.halo.app.model.support.UploadResult;
|
||||
|
||||
import java.io.File;
|
||||
import static run.halo.app.model.support.HaloConst.FILE_SEPARATOR;
|
||||
|
||||
/**
|
||||
* File handler interface.
|
||||
|
@ -80,6 +80,6 @@ public interface FileHandler {
|
|||
static String normalizeDirectory(@NonNull String dir) {
|
||||
Assert.hasText(dir, "Directory full name must not be blank");
|
||||
|
||||
return StringUtils.appendIfMissing(dir, File.separator);
|
||||
return StringUtils.appendIfMissing(dir, FILE_SEPARATOR);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,15 +18,15 @@ import org.springframework.web.multipart.MultipartFile;
|
|||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Calendar;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
import static run.halo.app.model.support.HaloConst.FILE_SEPARATOR;
|
||||
|
||||
/**
|
||||
* Local file handler.
|
||||
*
|
||||
|
@ -97,7 +97,7 @@ public class LocalFileHandler implements FileHandler {
|
|||
int month = current.get(Calendar.MONTH) + 1;
|
||||
|
||||
// Build directory
|
||||
String subDir = UPLOAD_SUB_DIR + year + File.separator + month + File.separator;
|
||||
String subDir = UPLOAD_SUB_DIR + year + FILE_SEPARATOR + month + FILE_SEPARATOR;
|
||||
|
||||
String originalBasename = FilenameUtils.getBasename(file.getOriginalFilename());
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package run.halo.app.model.dto;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import run.halo.app.model.dto.base.OutputConverter;
|
||||
import run.halo.app.model.entity.Category;
|
||||
import lombok.Data;
|
||||
|
@ -11,6 +13,8 @@ import lombok.Data;
|
|||
* @date 3/19/19
|
||||
*/
|
||||
@Data
|
||||
@ToString
|
||||
@EqualsAndHashCode
|
||||
public class CategoryDTO implements OutputConverter<CategoryDTO, Category> {
|
||||
|
||||
private Integer id;
|
||||
|
|
|
@ -14,4 +14,6 @@ public class EnvironmentDTO {
|
|||
private String database;
|
||||
|
||||
private long startTime;
|
||||
|
||||
private String version;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package run.halo.app.model.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* Tag with post count output dto.
|
||||
|
@ -9,6 +11,8 @@ import lombok.Data;
|
|||
* @date 3/20/19
|
||||
*/
|
||||
@Data
|
||||
@ToString(callSuper = true)
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class TagWithPostCountDTO extends TagDTO {
|
||||
|
||||
private Long postCount;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package run.halo.app.model.entity;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package run.halo.app.model.entity;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
|
|
@ -16,8 +16,8 @@ import javax.validation.constraints.Size;
|
|||
@Data
|
||||
public class AttachmentParam implements InputConverter<Attachment> {
|
||||
|
||||
@NotBlank(message = "Attachment name must not be blank")
|
||||
@Size(max = 255, message = "Length of attachment name must not be more than {max}")
|
||||
@NotBlank(message = "附件名称不能为空")
|
||||
@Size(max = 255, message = "附件名称的字符长度不能超过 {max}")
|
||||
private String name;
|
||||
|
||||
}
|
||||
|
|
|
@ -19,20 +19,20 @@ import java.lang.reflect.ParameterizedType;
|
|||
@Data
|
||||
public abstract class BaseCommentParam<COMMENT> implements InputConverter<COMMENT> {
|
||||
|
||||
@NotBlank(message = "评论者名称不能为空")
|
||||
@Size(max = 50, message = "Length of comment author name must not be more than {max}")
|
||||
@NotBlank(message = "评论者昵称不能为空")
|
||||
@Size(max = 50, message = "评论者昵称的字符长度不能超过 {max}")
|
||||
private String author;
|
||||
|
||||
@NotBlank(message = "邮箱不能为空")
|
||||
@Email(message = "邮箱格式不正确")
|
||||
@Size(max = 255, message = "邮箱的长度不能超过 {max}")
|
||||
@Size(max = 255, message = "邮箱的字符长度不能超过 {max}")
|
||||
private String email;
|
||||
|
||||
@Size(max = 127, message = "评论者博客链接不能超过 {max}")
|
||||
@Size(max = 127, message = "评论者博客链接的字符长度不能超过 {max}")
|
||||
private String authorUrl;
|
||||
|
||||
@NotBlank(message = "评论内容不能为空")
|
||||
@Size(max = 1023, message = "评论内容的长额不能超过 {max}")
|
||||
@Size(max = 1023, message = "评论内容的字符长度不能超过 {max}")
|
||||
private String content;
|
||||
|
||||
@Min(value = 1, message = "Post id must not be less than {value}")
|
||||
|
|
|
@ -22,20 +22,20 @@ public class CategoryParam implements InputConverter<Category> {
|
|||
/**
|
||||
* Category name.
|
||||
*/
|
||||
@NotBlank(message = "Category name must not be blank")
|
||||
@Size(max = 50, message = "Length of category name must not be more than {max}")
|
||||
@NotBlank(message = "分类名称不能为空")
|
||||
@Size(max = 50, message = "分类名称的字符长度不能超过 {max}")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* Category slug name.
|
||||
*/
|
||||
@Size(max = 50, message = "Length of category slug name must not be more than {max}")
|
||||
@Size(max = 50, message = "分类别名的字符长度不能超过 {max}")
|
||||
private String slugName;
|
||||
|
||||
/**
|
||||
* Category description.
|
||||
*/
|
||||
@Size(max = 100, message = "Length of category description must not be more than {max}")
|
||||
@Size(max = 100, message = "分类描述的字符长度不能超过 {max}")
|
||||
private String description;
|
||||
|
||||
/**
|
||||
|
|
|
@ -24,7 +24,7 @@ public class InstallParam extends UserParam {
|
|||
/**
|
||||
* Blog title.
|
||||
*/
|
||||
@NotBlank(message = "Blog title must not be blank", groups = CreateCheck.class)
|
||||
@NotBlank(message = "博客名称不能为空", groups = CreateCheck.class)
|
||||
private String title;
|
||||
|
||||
/**
|
||||
|
|
|
@ -16,7 +16,7 @@ import javax.validation.constraints.Size;
|
|||
@Data
|
||||
public class JournalParam implements InputConverter<Journal> {
|
||||
|
||||
@NotBlank(message = "Content must not be blank")
|
||||
@Size(max = 511, message = "Length of comment content must not be more than {max}")
|
||||
@NotBlank(message = "内容不能为空")
|
||||
@Size(max = 511, message = "内容的字符长度不能超过 {max}")
|
||||
private String content;
|
||||
}
|
||||
|
|
|
@ -17,22 +17,22 @@ import javax.validation.constraints.Size;
|
|||
@Data
|
||||
public class LinkParam implements InputConverter<Link> {
|
||||
|
||||
@NotBlank(message = "Link name must not be blank")
|
||||
@Size(max = 255, message = "Length of link name must not be more than {max}")
|
||||
@NotBlank(message = "友情链接名称不能为空")
|
||||
@Size(max = 255, message = "友情链接名称的字符长度不能超过 {max}")
|
||||
private String name;
|
||||
|
||||
@NotBlank(message = "Link url must not be blank")
|
||||
@Size(max = 1023, message = "Length of link url must not be more than {max}")
|
||||
@URL(message = "Link url format is incorrect")
|
||||
@NotBlank(message = "友情链接地址不能为空")
|
||||
@Size(max = 1023, message = "友情链接地址的字符长度不能超过 {max}")
|
||||
@URL(message = "友情链接地址格式不正确")
|
||||
private String url;
|
||||
|
||||
@Size(max = 1023, message = "Length of link logo must not be more than {max}")
|
||||
@Size(max = 1023, message = "友情链接 Logo 的字符长度不能超过 {max}")
|
||||
private String logo;
|
||||
|
||||
@Size(max = 255, message = "Length of link description must not be more than {max}")
|
||||
@Size(max = 255, message = "友情链接描述的字符长度不能超过 {max}")
|
||||
private String description;
|
||||
|
||||
@Size(max = 255, message = "Length of link team must not be more than {max}")
|
||||
@Size(max = 255, message = "友情链接分组的字符长度 {max}")
|
||||
private String team;
|
||||
|
||||
}
|
||||
|
|
|
@ -16,12 +16,12 @@ import javax.validation.constraints.Size;
|
|||
@ToString
|
||||
public class LoginParam {
|
||||
|
||||
@NotBlank(message = "Username or email must not be blank")
|
||||
@Size(max = 255, message = "Length of username or email must not be more than {max}")
|
||||
@NotBlank(message = "用户名或邮箱不能为空")
|
||||
@Size(max = 255, message = "用户名或邮箱的字符长度不能超过 {max}")
|
||||
private String username;
|
||||
|
||||
@NotBlank(message = "Password must not be blank")
|
||||
@Size(max = 100, message = "Length of password must not be more than {max}")
|
||||
@NotBlank(message = "登陆密码不能为空")
|
||||
@Size(max = 100, message = "用户密码字符长度不能超过 {max}")
|
||||
private String password;
|
||||
|
||||
}
|
||||
|
|
|
@ -19,21 +19,21 @@ import javax.validation.constraints.Size;
|
|||
@ToString
|
||||
public class MenuParam implements InputConverter<Menu> {
|
||||
|
||||
@NotBlank(message = "Menu name must not be blank")
|
||||
@Size(max = 50, message = "Length of menu name must not be more than {max}")
|
||||
@NotBlank(message = "菜单名称不能为空")
|
||||
@Size(max = 50, message = "菜单名称的字符长度不能超过 {max}")
|
||||
private String name;
|
||||
|
||||
@NotBlank(message = "Menu url must not be blank")
|
||||
@Size(max = 1023, message = "Length of menu url must not be more than {max}")
|
||||
@NotBlank(message = "菜单地址不能为空")
|
||||
@Size(max = 1023, message = "菜单地址的字符长度不能超过 {max}")
|
||||
private String url;
|
||||
|
||||
@Min(value = 0, message = "Menu priority must not be less than {value}")
|
||||
@Min(value = 0, message = "排序编号不能低于 {value}")
|
||||
private Integer priority;
|
||||
|
||||
@Size(max = 50, message = "Length of menu target must not be more than {max}")
|
||||
private String target;
|
||||
|
||||
@Size(max = 50, message = "Length of menu icon must not be more than {max}")
|
||||
@Size(max = 50, message = "菜单图标的字符长度不能超过 {max}")
|
||||
private String icon;
|
||||
|
||||
private Integer parentId;
|
||||
|
|
|
@ -14,12 +14,12 @@ import javax.validation.constraints.Size;
|
|||
@Data
|
||||
public class PasswordParam {
|
||||
|
||||
@NotBlank(message = "Old password must not be blank")
|
||||
@Size(max = 100, message = "Length of password must not be more than {max}")
|
||||
@NotBlank(message = "旧密码不能为空")
|
||||
@Size(max = 100, message = "密码的字符长度不能超过 {max}")
|
||||
private String oldPassword;
|
||||
|
||||
@NotBlank(message = "New password must not be blank")
|
||||
@Size(max = 100, message = "Length of password must not be more than {max}")
|
||||
@NotBlank(message = "新密码不能为空")
|
||||
@Size(max = 100, message = "密码的字符长度不能超过 {max}")
|
||||
private String newPassword;
|
||||
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ import java.util.Date;
|
|||
@Data
|
||||
public class PhotoParam implements InputConverter<Photo> {
|
||||
|
||||
@NotBlank(message = "Photo name must not be blank")
|
||||
@NotBlank(message = "照片名称不能为空")
|
||||
private String name;
|
||||
|
||||
private String description;
|
||||
|
@ -25,10 +25,10 @@ public class PhotoParam implements InputConverter<Photo> {
|
|||
|
||||
private String location;
|
||||
|
||||
@NotBlank(message = "Photo thumbnail must not be blank")
|
||||
@NotBlank(message = "照片缩略图链接地址不能为空")
|
||||
private String thumbnail;
|
||||
|
||||
@NotBlank(message = "Photo url must not be blank")
|
||||
@NotBlank(message = "照片链接地址不能为空")
|
||||
private String url;
|
||||
|
||||
private String team;
|
||||
|
|
|
@ -23,25 +23,25 @@ import java.util.Set;
|
|||
@Data
|
||||
public class PostParam implements InputConverter<Post> {
|
||||
|
||||
@NotBlank(message = "Title must not be blank")
|
||||
@Size(max = 100, message = "Length of title must not be more than {max}")
|
||||
@NotBlank(message = "文章标题不能为空")
|
||||
@Size(max = 100, message = "文章标题的字符长度不能超过 {max}")
|
||||
private String title;
|
||||
|
||||
private PostStatus status = PostStatus.DRAFT;
|
||||
|
||||
private String url;
|
||||
|
||||
@NotBlank(message = "Original content must not be blank")
|
||||
@NotBlank(message = "文章内容不能为空")
|
||||
private String originalContent;
|
||||
|
||||
private String summary;
|
||||
|
||||
@Size(max = 255, message = "Length of thumbnail must not be more than {max}")
|
||||
@Size(max = 255, message = "文章缩略图链接的字符长度不能超过 {max}")
|
||||
private String thumbnail;
|
||||
|
||||
private Boolean disallowComment = false;
|
||||
|
||||
@Size(max = 255, message = "Length of password must not be more than {max}")
|
||||
@Size(max = 255, message = "文章密码的字符长度不能超过 {max}")
|
||||
private String password;
|
||||
|
||||
@Size(max = 255, message = "Length of template must not be more than {max}")
|
||||
|
|
|
@ -19,18 +19,18 @@ import javax.validation.constraints.Size;
|
|||
@Data
|
||||
public class SheetParam implements InputConverter<Sheet> {
|
||||
|
||||
@NotBlank(message = "Title must not be blank")
|
||||
@Size(max = 100, message = "Length of title must not be more than {max}")
|
||||
@NotBlank(message = "页面标题不能为空")
|
||||
@Size(max = 100, message = "页面标题的字符长度不能超过 {max}")
|
||||
private String title;
|
||||
|
||||
private PostStatus status = PostStatus.DRAFT;
|
||||
|
||||
private String url;
|
||||
|
||||
@NotBlank(message = "Original content must not be blank")
|
||||
@NotBlank(message = "页面内容不能为空")
|
||||
private String originalContent;
|
||||
|
||||
@Size(max = 255, message = "Length of thumbnail must not be more than {max}")
|
||||
@Size(max = 255, message = "页面缩略图链接的字符长度不能超过 {max}")
|
||||
private String thumbnail;
|
||||
|
||||
private Boolean disallowComment = false;
|
||||
|
|
|
@ -21,11 +21,11 @@ import javax.validation.constraints.Size;
|
|||
@Data
|
||||
public class TagParam implements InputConverter<Tag> {
|
||||
|
||||
@NotBlank(message = "Tag name must not be blank")
|
||||
@Size(max = 255, message = "Length of tag name must not be more than {max}")
|
||||
@NotBlank(message = "标签名称不能为空")
|
||||
@Size(max = 255, message = "标签名称的字符长度不能超过 {max}")
|
||||
private String name;
|
||||
|
||||
@Size(max = 255, message = "Length of tag slug name must not be more than {max}")
|
||||
@Size(max = 255, message = "标签别名的字符长度不能超过 {max}")
|
||||
private String slugName;
|
||||
|
||||
@Override
|
||||
|
|
|
@ -21,27 +21,27 @@ import javax.validation.constraints.Size;
|
|||
@Data
|
||||
public class UserParam implements InputConverter<User> {
|
||||
|
||||
@NotBlank(message = "Username must not be blank", groups = {AllCheck.class})
|
||||
@Size(max = 50, message = "Length of username must not be more than {max}", groups = {AllCheck.class})
|
||||
@NotBlank(message = "用户名不能为空", groups = {AllCheck.class})
|
||||
@Size(max = 50, message = "用户名的字符长度不能超过 {max}", groups = {AllCheck.class})
|
||||
private String username;
|
||||
|
||||
@NotBlank(message = "Nickname must not be blank", groups = {AllCheck.class})
|
||||
@Size(max = 255, message = "Length of nickname must not be more than {max}", groups = {AllCheck.class})
|
||||
@NotBlank(message = "用户昵称不能为空", groups = {AllCheck.class})
|
||||
@Size(max = 255, message = "用户昵称的字符长度不能超过 {max}", groups = {AllCheck.class})
|
||||
private String nickname;
|
||||
|
||||
@Email(message = "The email format is incorrect", groups = {AllCheck.class})
|
||||
@NotBlank(message = "Email must not be blank", groups = {AllCheck.class})
|
||||
@Size(max = 127, message = "Length of email must not be more than {max}", groups = {AllCheck.class})
|
||||
@Email(message = "电子邮件地址的格式不正确", groups = {AllCheck.class})
|
||||
@NotBlank(message = "电子邮件地址不能为空", groups = {AllCheck.class})
|
||||
@Size(max = 127, message = "电子邮件的字符长度不能超过 {max}", groups = {AllCheck.class})
|
||||
private String email;
|
||||
|
||||
@Null(groups = UpdateCheck.class)
|
||||
@Size(min = 8, max = 100, message = "Length of password must be between {min} and {max}", groups = {CreateCheck.class})
|
||||
@Size(min = 8, max = 100, message = "密码的字符长度必须在 {min} - {max} 之间", groups = {CreateCheck.class})
|
||||
private String password;
|
||||
|
||||
@Size(max = 1023, message = "Length of avatar link must not be more than {max}", groups = {AllCheck.class})
|
||||
@Size(max = 1023, message = "头像链接地址的字符长度不能超过 {max}", groups = {AllCheck.class})
|
||||
private String avatar;
|
||||
|
||||
@Size(max = 1023, message = "Length of description must not be more than {max}", groups = {AllCheck.class})
|
||||
@Size(max = 1023, message = "用户描述的字符长度不能超过 {max}", groups = {AllCheck.class})
|
||||
private String description;
|
||||
|
||||
}
|
||||
|
|
|
@ -12,7 +12,12 @@ public enum OtherProperties implements PropertyEnum {
|
|||
|
||||
API_TOKEN("api_token", String.class, ""),
|
||||
|
||||
STATISTICS_CODE("statistics_code", String.class, "");
|
||||
STATISTICS_CODE("statistics_code", String.class, ""),
|
||||
|
||||
/**
|
||||
* 是否禁止爬虫
|
||||
*/
|
||||
SPIDER_DISABLED("spider_disabled",Boolean.class,"false");
|
||||
|
||||
private final String value;
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package run.halo.app.model.support;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.data.domain.PageImpl;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
|
@ -13,6 +15,8 @@ import java.util.List;
|
|||
* @date 3/25/19
|
||||
*/
|
||||
@Data
|
||||
@ToString(callSuper = true)
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class CommentPage<T> extends PageImpl<T> {
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package run.halo.app.model.support;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 公共常量
|
||||
|
@ -25,6 +27,11 @@ public class HaloConst {
|
|||
*/
|
||||
public static final String HALO_VERSION;
|
||||
|
||||
/**
|
||||
* Path separator.
|
||||
*/
|
||||
public static final String FILE_SEPARATOR = File.separator;
|
||||
|
||||
/**
|
||||
* Suffix of freemarker template file
|
||||
*/
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package run.halo.app.model.vo;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import run.halo.app.model.dto.CategoryDTO;
|
||||
import lombok.Data;
|
||||
|
||||
|
@ -12,6 +14,8 @@ import java.util.List;
|
|||
* @date 3/21/19
|
||||
*/
|
||||
@Data
|
||||
@ToString(callSuper = true)
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class CategoryVO extends CategoryDTO {
|
||||
|
||||
private List<CategoryVO> children;
|
||||
|
|
|
@ -18,7 +18,10 @@ import javax.servlet.ServletException;
|
|||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Abstract authentication filter.
|
||||
|
@ -35,11 +38,6 @@ public abstract class AbstractAuthenticationFilter extends OncePerRequestFilter
|
|||
*/
|
||||
private Set<String> excludeUrlPatterns = new HashSet<>(2);
|
||||
|
||||
/**
|
||||
* Try authenticating url, method patterns.
|
||||
*/
|
||||
private Map<String, String> tryAuthUrlMethodPatterns = new HashMap<>(2);
|
||||
|
||||
protected final AntPathMatcher antPathMatcher;
|
||||
|
||||
protected final HaloProperties haloProperties;
|
||||
|
@ -72,26 +70,6 @@ public abstract class AbstractAuthenticationFilter extends OncePerRequestFilter
|
|||
return excludeUrlPatterns.stream().anyMatch(p -> antPathMatcher.match(p, request.getServletPath()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Should skip authentication failure.
|
||||
*
|
||||
* @param request http servlet request must not be null.
|
||||
* @return true if the request should skip authentication failure; false otherwise
|
||||
*/
|
||||
@Deprecated
|
||||
protected boolean shouldSkipAuthenticateFailure(@NonNull HttpServletRequest request) {
|
||||
Assert.notNull(request, "Http servlet request must not be null");
|
||||
|
||||
for (String url : tryAuthUrlMethodPatterns.keySet()) {
|
||||
if (antPathMatcher.match(url, request.getServletPath())
|
||||
&& tryAuthUrlMethodPatterns.get(url).equalsIgnoreCase(request.getMethod())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets exclude url patterns.
|
||||
*
|
||||
|
@ -124,20 +102,6 @@ public abstract class AbstractAuthenticationFilter extends OncePerRequestFilter
|
|||
return excludeUrlPatterns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds try authenticating url method pattern.
|
||||
*
|
||||
* @param url url must not be blank
|
||||
* @param method method must not be blank
|
||||
*/
|
||||
@Deprecated
|
||||
public void addTryAuthUrlMethodPattern(@NonNull String url, @NonNull String method) {
|
||||
Assert.hasText(url, "Try authenticating url must not be blank");
|
||||
Assert.hasText(method, "Try authenticating method must not be blank");
|
||||
|
||||
tryAuthUrlMethodPatterns.put(url, method);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets authentication failure handler. (Default: @DefaultAuthenticationFailureHandler)
|
||||
|
@ -145,7 +109,7 @@ public abstract class AbstractAuthenticationFilter extends OncePerRequestFilter
|
|||
* @return authentication failure handler
|
||||
*/
|
||||
@NonNull
|
||||
public AuthenticationFailureHandler getFailureHandler() {
|
||||
protected AuthenticationFailureHandler getFailureHandler() {
|
||||
if (failureHandler == null) {
|
||||
synchronized (this) {
|
||||
if (failureHandler == null) {
|
||||
|
|
|
@ -71,6 +71,7 @@ public interface OptionService extends CrudService<Option, Integer> {
|
|||
* @return Map
|
||||
*/
|
||||
@NonNull
|
||||
@Transactional
|
||||
Map<String, Object> listOptions();
|
||||
|
||||
/**
|
||||
|
|
|
@ -78,17 +78,6 @@ public interface UserService extends CrudService<User, Integer> {
|
|||
@NonNull
|
||||
User getByEmailOfNonNull(@NonNull String email);
|
||||
|
||||
/**
|
||||
* Logins by username and password.
|
||||
*
|
||||
* @param key username or email must not be blank
|
||||
* @param password password must not be blank
|
||||
* @return user info
|
||||
*/
|
||||
@NonNull
|
||||
@Deprecated
|
||||
User login(@NonNull String key, @NonNull String password);
|
||||
|
||||
/**
|
||||
* Updates user password.
|
||||
*
|
||||
|
@ -125,4 +114,12 @@ public interface UserService extends CrudService<User, Integer> {
|
|||
* @return true if the given password is match the user password; false otherwise
|
||||
*/
|
||||
boolean passwordMatch(@NonNull User user, @Nullable String plainPassword);
|
||||
|
||||
/**
|
||||
* Set user password.
|
||||
*
|
||||
* @param user user must not be null
|
||||
* @param plainPassword plain password must not be blank
|
||||
*/
|
||||
void setPassword(@NonNull User user, @NonNull String plainPassword);
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ import run.halo.app.model.entity.User;
|
|||
import run.halo.app.model.enums.CommentStatus;
|
||||
import run.halo.app.model.enums.PostStatus;
|
||||
import run.halo.app.model.params.LoginParam;
|
||||
import run.halo.app.model.support.HaloConst;
|
||||
import run.halo.app.security.authentication.Authentication;
|
||||
import run.halo.app.security.context.SecurityContextHolder;
|
||||
import run.halo.app.security.token.AuthToken;
|
||||
|
@ -181,6 +182,8 @@ public class AdminServiceImpl implements AdminService {
|
|||
|
||||
environmentDTO.setDatabase("org.h2.Driver".equals(driverClassName) ? "H2" : "MySQL");
|
||||
|
||||
environmentDTO.setVersion(HaloConst.HALO_VERSION);
|
||||
|
||||
return environmentDTO;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ import run.halo.app.repository.AttachmentRepository;
|
|||
import run.halo.app.service.AttachmentService;
|
||||
import run.halo.app.service.OptionService;
|
||||
import run.halo.app.service.base.AbstractCrudService;
|
||||
import run.halo.app.utils.HaloUtils;
|
||||
|
||||
import javax.persistence.criteria.Predicate;
|
||||
import java.util.LinkedList;
|
||||
|
@ -108,7 +109,8 @@ public class AttachmentServiceImpl extends AbstractCrudService<Attachment, Integ
|
|||
// Build attachment
|
||||
Attachment attachment = new Attachment();
|
||||
attachment.setName(uploadResult.getFilename());
|
||||
attachment.setPath(uploadResult.getFilePath());
|
||||
// Convert separator
|
||||
attachment.setPath(HaloUtils.changeFileSeparatorToUrlSeparator(uploadResult.getFilePath()));
|
||||
attachment.setFileKey(uploadResult.getKey());
|
||||
attachment.setThumbPath(uploadResult.getThumbPath());
|
||||
attachment.setMediaType(uploadResult.getMediaType().toString());
|
||||
|
|
|
@ -16,6 +16,7 @@ import org.springframework.util.CollectionUtils;
|
|||
import run.halo.app.event.comment.CommentNewEvent;
|
||||
import run.halo.app.event.comment.CommentPassEvent;
|
||||
import run.halo.app.event.comment.CommentReplyEvent;
|
||||
import run.halo.app.exception.BadRequestException;
|
||||
import run.halo.app.model.dto.BaseCommentDTO;
|
||||
import run.halo.app.model.entity.BaseComment;
|
||||
import run.halo.app.model.entity.User;
|
||||
|
@ -32,6 +33,7 @@ import run.halo.app.repository.base.BaseCommentRepository;
|
|||
import run.halo.app.security.authentication.Authentication;
|
||||
import run.halo.app.security.context.SecurityContextHolder;
|
||||
import run.halo.app.service.OptionService;
|
||||
import run.halo.app.service.UserService;
|
||||
import run.halo.app.service.base.AbstractCrudService;
|
||||
import run.halo.app.service.base.BaseCommentService;
|
||||
import run.halo.app.utils.ServiceUtils;
|
||||
|
@ -55,14 +57,17 @@ public abstract class BaseCommentServiceImpl<COMMENT extends BaseComment> extend
|
|||
|
||||
protected final OptionService optionService;
|
||||
|
||||
protected final UserService userService;
|
||||
|
||||
protected final ApplicationEventPublisher eventPublisher;
|
||||
|
||||
public BaseCommentServiceImpl(BaseCommentRepository<COMMENT> baseCommentRepository,
|
||||
OptionService optionService,
|
||||
ApplicationEventPublisher eventPublisher) {
|
||||
UserService userService, ApplicationEventPublisher eventPublisher) {
|
||||
super(baseCommentRepository);
|
||||
this.baseCommentRepository = baseCommentRepository;
|
||||
this.optionService = optionService;
|
||||
this.userService = userService;
|
||||
this.eventPublisher = eventPublisher;
|
||||
}
|
||||
|
||||
|
@ -275,6 +280,7 @@ public abstract class BaseCommentServiceImpl<COMMENT extends BaseComment> extend
|
|||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
|
||||
if (authentication != null) {
|
||||
// Blogger comment
|
||||
User user = authentication.getDetail().getUser();
|
||||
commentParam.setAuthor(StringUtils.isBlank(user.getNickname()) ? user.getUsername() : user.getNickname());
|
||||
commentParam.setEmail(user.getEmail());
|
||||
|
@ -284,6 +290,14 @@ public abstract class BaseCommentServiceImpl<COMMENT extends BaseComment> extend
|
|||
// Validate the comment param manually
|
||||
ValidationUtils.validate(commentParam);
|
||||
|
||||
if (authentication == null) {
|
||||
// Anonymous comment
|
||||
// Check email
|
||||
if (userService.getByEmail(commentParam.getEmail()).isPresent()) {
|
||||
throw new BadRequestException("不能使用博主的邮件,如果您是博主,请登录管理端进行回复。");
|
||||
}
|
||||
}
|
||||
|
||||
// Convert to comment
|
||||
return create(commentParam.convertTo());
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ import run.halo.app.repository.JournalCommentRepository;
|
|||
import run.halo.app.repository.JournalRepository;
|
||||
import run.halo.app.service.JournalCommentService;
|
||||
import run.halo.app.service.OptionService;
|
||||
import run.halo.app.service.UserService;
|
||||
import run.halo.app.utils.ServiceUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
|
@ -38,8 +39,9 @@ public class JournalCommentServiceImpl extends BaseCommentServiceImpl<JournalCom
|
|||
|
||||
public JournalCommentServiceImpl(JournalCommentRepository journalCommentRepository,
|
||||
OptionService optionService,
|
||||
UserService userService,
|
||||
ApplicationEventPublisher eventPublisher, JournalRepository journalRepository) {
|
||||
super(journalCommentRepository, optionService, eventPublisher);
|
||||
super(journalCommentRepository, optionService, userService, eventPublisher);
|
||||
this.journalCommentRepository = journalCommentRepository;
|
||||
this.journalRepository = journalRepository;
|
||||
}
|
||||
|
|
|
@ -100,7 +100,7 @@ public class PostCategoryServiceImpl extends AbstractCrudService<PostCategory, I
|
|||
Assert.notNull(pageable, "Page info must not be null");
|
||||
|
||||
// Find all post ids
|
||||
Set<Integer> postIds = postCategoryRepository.findAllCategoryIdsByPostId(categoryId);
|
||||
Set<Integer> postIds = postCategoryRepository.findAllPostIdsByCategoryId(categoryId);
|
||||
|
||||
return postRepository.findAllByIdIn(postIds, pageable);
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ import run.halo.app.repository.PostCommentRepository;
|
|||
import run.halo.app.repository.PostRepository;
|
||||
import run.halo.app.service.OptionService;
|
||||
import run.halo.app.service.PostCommentService;
|
||||
import run.halo.app.service.UserService;
|
||||
import run.halo.app.utils.ServiceUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
|
@ -42,9 +43,10 @@ public class PostCommentServiceImpl extends BaseCommentServiceImpl<PostComment>
|
|||
|
||||
public PostCommentServiceImpl(PostCommentRepository postCommentRepository,
|
||||
PostRepository postRepository,
|
||||
UserService userService,
|
||||
OptionService optionService,
|
||||
ApplicationEventPublisher eventPublisher) {
|
||||
super(postCommentRepository, optionService, eventPublisher);
|
||||
super(postCommentRepository, optionService, userService, eventPublisher);
|
||||
this.postCommentRepository = postCommentRepository;
|
||||
this.postRepository = postRepository;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ import run.halo.app.repository.SheetCommentRepository;
|
|||
import run.halo.app.repository.SheetRepository;
|
||||
import run.halo.app.service.OptionService;
|
||||
import run.halo.app.service.SheetCommentService;
|
||||
import run.halo.app.service.UserService;
|
||||
import run.halo.app.utils.ServiceUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
|
@ -38,9 +39,10 @@ public class SheetCommentServiceImpl extends BaseCommentServiceImpl<SheetComment
|
|||
|
||||
public SheetCommentServiceImpl(SheetCommentRepository sheetCommentRepository,
|
||||
OptionService optionService,
|
||||
UserService userService,
|
||||
ApplicationEventPublisher eventPublisher,
|
||||
SheetRepository sheetRepository) {
|
||||
super(sheetCommentRepository, optionService, eventPublisher);
|
||||
super(sheetCommentRepository, optionService, userService, eventPublisher);
|
||||
this.sheetCommentRepository = sheetCommentRepository;
|
||||
this.sheetRepository = sheetRepository;
|
||||
}
|
||||
|
|
|
@ -353,7 +353,7 @@ public class ThemeServiceImpl implements ThemeService {
|
|||
public ThemeProperty upload(MultipartFile file) {
|
||||
Assert.notNull(file, "Multipart file must not be null");
|
||||
|
||||
if (!HaloMediaType.isZipType(file.getContentType())) {
|
||||
if (!StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), ".zip")) {
|
||||
throw new UnsupportedMediaTypeException("Unsupported theme media type: " + file.getContentType()).setErrorData(file.getOriginalFilename());
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package run.halo.app.service.impl;
|
||||
|
||||
import cn.hutool.core.lang.Validator;
|
||||
import cn.hutool.crypto.digest.BCrypt;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
|
@ -19,14 +18,10 @@ import run.halo.app.model.entity.User;
|
|||
import run.halo.app.model.enums.LogType;
|
||||
import run.halo.app.model.params.UserParam;
|
||||
import run.halo.app.repository.UserRepository;
|
||||
import run.halo.app.security.context.SecurityContextHolder;
|
||||
import run.halo.app.security.filter.AdminAuthenticationFilter;
|
||||
import run.halo.app.security.support.UserDetail;
|
||||
import run.halo.app.service.UserService;
|
||||
import run.halo.app.service.base.AbstractCrudService;
|
||||
import run.halo.app.utils.DateUtils;
|
||||
import run.halo.app.utils.HaloUtils;
|
||||
import run.halo.app.utils.ServletUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
@ -104,68 +99,6 @@ public class UserServiceImpl extends AbstractCrudService<User, Integer> implemen
|
|||
return getByEmail(email).orElseThrow(() -> new NotFoundException("The email dose not exist").setErrorData(email));
|
||||
}
|
||||
|
||||
@Override
|
||||
public User login(String key, String password) {
|
||||
Assert.hasText(key, "Username or email must not be blank");
|
||||
Assert.hasText(password, "Password must not be blank");
|
||||
|
||||
// Check login status
|
||||
if (SecurityContextHolder.getContext().isAuthenticated()) {
|
||||
throw new BadRequestException("You have logged in already, no need to log in again");
|
||||
}
|
||||
|
||||
// Ger user by username
|
||||
User user = Validator.isEmail(key) ? getByEmailOfNonNull(key) : getByUsernameOfNonNull(key);
|
||||
|
||||
Date now = DateUtils.now();
|
||||
|
||||
// Check expiration
|
||||
if (user.getExpireTime() != null && user.getExpireTime().after(now)) {
|
||||
long seconds = TimeUnit.MILLISECONDS.toSeconds(user.getExpireTime().getTime() - now.getTime());
|
||||
// If expired
|
||||
throw new BadRequestException("You have been temporarily disabled,please try again " + HaloUtils.timeFormat(seconds) + " later").setErrorData(seconds);
|
||||
}
|
||||
|
||||
if (!BCrypt.checkpw(password, user.getPassword())) {
|
||||
// If the password is mismatch
|
||||
// Add login failure count
|
||||
Integer loginFailureCount = stringCacheStore.getAny(LOGIN_FAILURE_COUNT_KEY, Integer.class).orElse(0);
|
||||
|
||||
if (loginFailureCount >= MAX_LOGIN_TRY - 1) {
|
||||
// Set expiration
|
||||
user.setExpireTime(org.apache.commons.lang3.time.DateUtils.addMinutes(now, LOCK_MINUTES));
|
||||
// Update user
|
||||
update(user);
|
||||
}
|
||||
|
||||
loginFailureCount++;
|
||||
|
||||
stringCacheStore.putAny(LOGIN_FAILURE_COUNT_KEY, loginFailureCount, LOCK_MINUTES, TimeUnit.MINUTES);
|
||||
|
||||
int remainder = MAX_LOGIN_TRY - loginFailureCount;
|
||||
|
||||
String errorMessage = String.format("Username or password incorrect, you%shave %s", remainder <= 0 ? "" : " still ", HaloUtils.pluralize(remainder, "chance", "chances"));
|
||||
|
||||
// Lot it
|
||||
eventPublisher.publishEvent(new LogEvent(this, key, LogType.LOGIN_FAILED, password));
|
||||
|
||||
throw new BadRequestException(errorMessage);
|
||||
}
|
||||
|
||||
// Clear the login failure count cache
|
||||
stringCacheStore.delete(LOGIN_FAILURE_COUNT_KEY);
|
||||
|
||||
// Set session
|
||||
ServletUtils.getCurrentRequest().ifPresent(request -> {
|
||||
request.getSession().setAttribute(AdminAuthenticationFilter.ADMIN_SESSION_KEY, new UserDetail(user));
|
||||
});
|
||||
|
||||
// Log it
|
||||
eventPublisher.publishEvent(new LogEvent(this, user.getId().toString(), LogType.LOGGED_IN, user.getUsername()));
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
@Override
|
||||
public User updatePassword(String oldPassword, String newPassword, Integer userId) {
|
||||
Assert.hasText(oldPassword, "Old password must not be blank");
|
||||
|
@ -252,7 +185,8 @@ public class UserServiceImpl extends AbstractCrudService<User, Integer> implemen
|
|||
return updatedUser;
|
||||
}
|
||||
|
||||
private void setPassword(@NonNull User user, @NonNull String plainPassword) {
|
||||
@Override
|
||||
public void setPassword(@NonNull User user, @NonNull String plainPassword) {
|
||||
Assert.notNull(user, "User must not be null");
|
||||
Assert.hasText(plainPassword, "Plain password must not be blank");
|
||||
|
||||
|
|
|
@ -64,31 +64,4 @@ public class HaloMediaType extends MediaType {
|
|||
super(type, subtype, parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the media type is zip type or not .
|
||||
*
|
||||
* @param mediaType media type
|
||||
* @return true if the given media type is zip type; false otherwise
|
||||
*/
|
||||
public static boolean isZipType(MediaType mediaType) {
|
||||
if (mediaType == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return mediaType.includes(APPLICATION_ZIP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the media type is zip type or not .
|
||||
*
|
||||
* @param contentType content type
|
||||
* @return true if the given content type is zip type; false otherwise
|
||||
*/
|
||||
public static boolean isZipType(String contentType) {
|
||||
if (StringUtils.isBlank(contentType)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return isZipType(valueOf(contentType));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@ import java.nio.file.attribute.BasicFileAttributes;
|
|||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
|
||||
import static run.halo.app.model.support.HaloConst.FILE_SEPARATOR;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 常用工具
|
||||
|
@ -31,6 +33,18 @@ import java.util.UUID;
|
|||
@Slf4j
|
||||
public class HaloUtils {
|
||||
|
||||
/**
|
||||
* Changes file separator to url separator.
|
||||
*
|
||||
* @param pathname full path name must not be blank.
|
||||
* @return text with url separator
|
||||
*/
|
||||
public static String changeFileSeparatorToUrlSeparator(@NonNull String pathname) {
|
||||
Assert.hasText(pathname, "Path name must not be blank");
|
||||
|
||||
return pathname.replace(FILE_SEPARATOR, "/");
|
||||
}
|
||||
|
||||
/**
|
||||
* Time format.
|
||||
*
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Copyright (C) 2017 by original authors @ fontello.com</metadata>
|
||||
<defs>
|
||||
<font id="fontello" horiz-adv-x="1000" >
|
||||
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
||||
<missing-glyph horiz-adv-x="1000" />
|
||||
<glyph glyph-name="bold" unicode="" d="M310 1q41-18 78-18 210 0 210 187 0 64-23 101-15 24-34 41t-38 26-45 14-47 6-53 1q-40 0-56-6 0-29 0-88t-1-88q0-5 0-38t0-54 2-47 7-37z m-8 417q23-4 61-4 46 0 80 7t61 25 42 50 14 79q0 39-16 68t-45 46-60 24-69 8q-28 0-73-7 0-28 3-84t2-85q0-15 0-45t-1-44q0-26 1-38z m-302-497l1 53q9 2 48 9t59 15q4 7 7 15t4 19 4 18 1 21 0 19v36q0 548-12 572-2 5-12 8t-25 6-28 4-27 3-17 2l-2 46q55 1 190 6t208 6q13 0 38-1t38 0q39 0 76-7t72-24 60-39 41-59 16-76q0-29-9-54t-22-40-36-32-41-25-47-22q86-20 144-75t57-138q0-56-20-101t-52-72-77-48-91-27-98-8q-25 0-74 2t-74 1q-59 0-171-6t-129-7z" horiz-adv-x="785.7" />
|
||||
|
||||
<glyph glyph-name="italic" unicode="" d="M0-78l10 48q12 4 34 9t40 11 33 13q16 19 23 56 1 4 35 162t63 303 29 165v14q-13 8-30 11t-39 4-32 3l10 58q19-1 67-4t84-4 67-1q27 0 55 1t68 4 54 4q-2-22-10-50-17-6-57-16t-60-19q-5-10-8-23t-5-23-4-25-4-24q-15-82-49-234t-43-198q-1-5-7-32t-11-51-9-46-4-32l1-10q9-3 103-18-2-24-9-55-6 0-18-1t-18-1q-16 0-49 6t-48 6q-77 1-115 1-28 0-79-5t-68-7z" horiz-adv-x="571.4" />
|
||||
|
||||
<glyph glyph-name="thumb-tack" unicode="" d="M650 779q12 0 24-5 19-8 29-23t11-35v-719q0-19-11-35t-29-23q-10-4-24-4-27 0-47 18l-246 236-246-236q-20-19-46-19-13 0-25 5-18 7-29 23t-11 35v719q0 19 11 35t29 23q12 5 25 5h585z" horiz-adv-x="714.3" />
|
||||
|
||||
<glyph glyph-name="link" unicode="" d="M813 171q0 23-16 38l-116 116q-16 16-38 16-24 0-40-18 1-1 10-10t12-12 9-11 7-14 2-15q0-23-16-38t-38-16q-8 0-15 2t-14 7-11 9-12 12-10 10q-19-17-19-40 0-23 16-38l115-116q15-15 38-15 22 0 38 15l82 81q16 16 16 37z m-393 394q0 22-15 38l-115 115q-16 16-38 16-22 0-38-15l-82-82q-16-15-16-37 0-22 16-38l116-116q15-15 38-15 23 0 40 17-2 2-11 11t-12 12-8 10-7 14-2 16q0 22 15 38t38 15q9 0 16-2t14-7 11-8 12-12 10-11q18 17 18 41z m500-394q0-66-48-113l-82-81q-46-47-113-47-68 0-114 48l-115 115q-46 47-46 114 0 68 49 116l-49 49q-48-49-116-49-67 0-114 47l-116 116q-47 47-47 114t47 113l82 82q47 46 114 46 67 0 114-47l115-116q46-46 46-113 0-69-49-117l49-49q48 49 116 49 67 0 114-47l116-116q47-47 47-114z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="picture-o" unicode="" d="M357 529q0-45-31-76t-76-32-76 32-31 76 31 76 76 31 76-31 31-76z m572-215v-250h-786v107l178 179 90-89 285 285z m53 393h-893q-7 0-12-5t-6-13v-678q0-7 6-13t12-5h893q7 0 13 5t5 13v678q0 8-5 13t-13 5z m89-18v-678q0-37-26-63t-63-27h-893q-36 0-63 27t-26 63v678q0 37 26 63t63 27h893q37 0 63-27t26-63z" horiz-adv-x="1071.4" />
|
||||
|
||||
<glyph glyph-name="repeat" unicode="" d="M857 707v-250q0-14-10-25t-26-11h-250q-23 0-32 23-10 22 7 38l77 77q-82 77-194 77-58 0-111-23t-91-61-61-91-23-111 23-111 61-91 91-61 111-23q66 0 125 29t100 82q4 6 13 7 8 0 14-5l76-77q5-4 6-11t-5-13q-60-74-147-114t-182-41q-87 0-167 34t-136 92-92 137-34 166 34 166 92 137 136 92 167 34q82 0 158-31t137-88l72 72q17 18 39 8 22-9 22-33z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="undo" unicode="" d="M857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="trash-o" unicode="" d="M286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q23 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
|
||||
|
||||
<glyph glyph-name="floppy-o" unicode="" d="M214-7h429v214h-429v-214z m500 0h72v500q0 8-6 21t-11 20l-157 156q-5 6-19 12t-22 5v-232q0-22-15-38t-38-16h-322q-22 0-37 16t-16 38v232h-72v-714h72v232q0 22 16 38t37 16h465q22 0 38-16t15-38v-232z m-214 518v178q0 8-5 13t-13 5h-107q-7 0-13-5t-5-13v-178q0-7 5-13t13-5h107q7 0 13 5t5 13z m357-18v-518q0-22-15-38t-38-16h-750q-23 0-38 16t-16 38v750q0 22 16 38t38 16h517q23 0 50-12t42-26l156-157q16-15 27-42t11-49z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="compress" unicode="" d="M429 314v-250q0-14-11-25t-25-10-25 10l-81 81-185-186q-5-5-13-5t-12 5l-64 64q-6 6-6 13t6 13l185 185-80 80q-11 11-11 25t11 25 25 11h250q14 0 25-11t11-25z m421 375q0-7-6-12l-185-186 80-80q11-11 11-25t-11-25-25-11h-250q-14 0-25 11t-10 25v250q0 14 10 25t25 10 25-10l81-80 185 185q6 5 13 5t13-5l63-64q6-5 6-13z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="eye" unicode="" d="M929 314q-85 132-213 197 34-58 34-125 0-103-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197 75-114 187-182t242-68 243 68 186 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38t11 39q78 128 210 205t279 78 279-78 210-205q11-20 11-39z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="eye-slash" unicode="" d="M310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-91l157 280q4-25 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-85t81-103q11-19 11-39z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="question-circle" unicode="" d="M500 82v107q0 8-5 13t-13 5h-107q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h107q8 0 13 5t5 13z m143 375q0 49-31 91t-77 65-95 23q-136 0-207-119-9-13 4-24l74-55q4-4 10-4 9 0 14 7 30 38 48 51 19 14 48 14 27 0 48-15t21-33q0-21-11-34t-38-25q-35-15-65-48t-29-70v-20q0-8 5-13t13-5h107q8 0 13 5t5 13q0 10 12 27t30 28q18 10 28 16t25 19 25 27 16 34 7 45z m214-107q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="times" unicode="" d="M724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" />
|
||||
|
||||
<glyph glyph-name="align-left" unicode="" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-714q-15 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-857q-15 0-25 11t-11 25v72q0 14 11 25t25 10h857q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-643q-15 0-25 10t-11 25v72q0 14 11 25t25 11h643q14 0 25-11t10-25z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="align-center" unicode="" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-500q-14 0-25 11t-11 25v71q0 15 11 25t25 11h500q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-786q-14 0-25 11t-11 25v72q0 14 11 25t25 10h786q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-358q-14 0-25 10t-10 25v72q0 14 10 25t25 11h358q14 0 25-11t10-25z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="align-right" unicode="" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 214v-71q0-15-11-25t-25-11h-714q-14 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m0 215v-72q0-14-11-25t-25-11h-857q-14 0-25 11t-11 25v72q0 14 11 25t25 10h857q15 0 25-10t11-25z m0 214v-72q0-14-11-25t-25-10h-643q-14 0-25 10t-10 25v72q0 14 10 25t25 11h643q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="arrows-alt" unicode="" d="M716 548l-198-198 198-198 80 80q17 18 39 8 22-9 22-33v-250q0-14-10-25t-26-11h-250q-23 0-32 23-10 21 7 38l81 81-198 198-198-198 80-81q17-17 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l80-80 198 198-198 198-80-80q-11-11-25-11-7 0-14 3-22 9-22 33v250q0 14 11 25t25 11h250q23 0 33-23 9-21-8-38l-80-81 198-198 198 198-81 81q-17 17-7 38 9 23 32 23h250q15 0 26-11t10-25v-250q0-24-22-33-7-3-14-3-14 0-25 11z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="bars" unicode="" d="M857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-14-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="list-ul" unicode="" d="M214 64q0-44-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m0 286q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m786-232v-107q0-7-5-13t-13-5h-678q-8 0-13 5t-5 13v107q0 7 5 12t13 6h678q7 0 13-6t5-12z m-786 518q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m786-232v-108q0-7-5-12t-13-5h-678q-8 0-13 5t-5 12v108q0 7 5 12t13 5h678q7 0 13-5t5-12z m0 285v-107q0-7-5-12t-13-6h-678q-8 0-13 6t-5 12v107q0 8 5 13t13 5h678q7 0 13-5t5-13z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="list-ol" unicode="" d="M213-54q0-45-31-70t-75-26q-60 0-96 37l31 49q28-25 60-25 16 0 28 8t12 24q0 35-59 31l-14 31q4 6 18 24t24 31 20 21v1q-9 0-27-1t-27 0v-30h-59v85h186v-49l-53-65q28-6 45-27t17-49z m1 350v-89h-202q-4 20-4 30 0 29 14 52t31 38 37 27 31 24 14 25q0 14-9 22t-22 7q-25 0-45-32l-47 33q13 28 40 44t59 16q40 0 68-23t28-63q0-28-19-51t-42-36-42-28-20-30h71v34h59z m786-178v-107q0-7-5-13t-13-5h-678q-8 0-13 5t-5 13v107q0 8 5 13t13 5h678q7 0 13-6t5-12z m-786 502v-56h-187v56h60q0 22 0 67t1 68v7h-1q-5-10-28-30l-40 42 76 71h59v-225h60z m786-216v-108q0-7-5-12t-13-5h-678q-8 0-13 5t-5 12v108q0 7 5 12t13 5h678q7 0 13-5t5-12z m0 285v-107q0-7-5-12t-13-6h-678q-8 0-13 6t-5 12v107q0 8 5 13t13 5h678q7 0 13-5t5-13z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="strikethrough" unicode="" d="M982 350q8 0 13-5t5-13v-36q0-7-5-12t-13-5h-964q-8 0-13 5t-5 12v36q0 8 5 13t13 5h964z m-712 36q-16 19-29 44-27 55-27 105 0 101 75 173 74 71 219 71 28 0 94-11 36-7 98-27 6-21 12-66 8-68 8-102 0-10-3-25l-7-2-46 4-8 1q-28 83-58 114-49 51-117 51-64 0-101-33-38-32-38-81 0-41 37-78t156-72q38-12 96-37 33-16 53-29h-414z m283-143h229q4-22 4-51 0-62-23-119-13-31-40-58-20-19-61-45-44-27-85-37-45-12-113-12-64 0-109 13l-78 23q-32 8-40 15-5 5-5 12v8q0 60-1 87 0 17 0 38l1 20v25l57 1q8-19 17-40t12-31 7-15q20-32 45-52 24-20 59-32 33-12 73-12 36 0 78 15 43 14 68 48 26 34 26 72 0 47-45 87-19 16-76 40z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="underline" unicode="" d="M27 726q-21 1-25 2l-2 49q7 1 22 1 34 0 63-3 74-4 93-4 47 0 93 2 65 2 82 3 31 0 48 1l-1-8 1-36v-5q-33-5-69-5-33 0-44-14-7-7-7-73 0-7 0-18t0-15l1-127 8-157q3-69 28-112 20-33 54-52 49-26 98-26 59 0 107 16 31 10 55 28 27 20 37 36 20 31 29 63 12 41 12 128 0 44-2 72t-6 68-8 89l-2 33q-3 37-13 49-19 20-43 19l-56-1-8 2 1 48h47l114-6q43-2 110 6l10-1q3-22 3-29 0-4-2-17-25-7-47-8-41-6-44-9-8-8-8-23 0-4 0-15t1-17q5-11 13-221 3-109-9-170-8-42-23-68-21-36-62-69-42-31-102-49-61-19-142-19-93 0-159 26-66 26-99 68-34 42-47 109-9 45-9 132v186q0 105-9 119-14 20-82 22z m830-787v36q0 8-5 13t-13 5h-821q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h821q8 0 13 5t5 13z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="table" unicode="" d="M286 82v107q0 8-5 13t-13 5h-179q-7 0-12-5t-6-13v-107q0-8 6-13t12-5h179q8 0 13 5t5 13z m0 214v108q0 7-5 12t-13 5h-179q-7 0-12-5t-6-12v-108q0-7 6-12t12-5h179q8 0 13 5t5 12z m285-214v107q0 8-5 13t-12 5h-179q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h179q7 0 12 5t5 13z m-285 429v107q0 8-5 13t-13 5h-179q-7 0-12-5t-6-13v-107q0-8 6-13t12-5h179q8 0 13 5t5 13z m285-215v108q0 7-5 12t-12 5h-179q-8 0-13-5t-5-12v-108q0-7 5-12t13-5h179q7 0 12 5t5 12z m286-214v107q0 8-5 13t-13 5h-178q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h178q8 0 13 5t5 13z m-286 429v107q0 8-5 13t-12 5h-179q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h179q7 0 12 5t5 13z m286-215v108q0 7-5 12t-13 5h-178q-8 0-13-5t-5-12v-108q0-7 5-12t13-5h178q8 0 13 5t5 12z m0 215v107q0 8-5 13t-13 5h-178q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h178q8 0 13 5t5 13z m72 178v-607q0-37-27-63t-63-26h-750q-36 0-63 26t-26 63v607q0 37 26 63t63 27h750q37 0 63-27t27-63z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="columns" unicode="" d="M89-7h340v643h-358v-625q0-7 6-13t12-5z m768 18v625h-357v-643h339q8 0 13 5t5 13z m72 678v-678q0-37-27-63t-63-27h-750q-36 0-63 27t-26 63v678q0 37 26 63t63 27h750q37 0 63-27t27-63z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="quote-left" unicode="" d="M429 314v-214q0-45-32-76t-76-31h-214q-44 0-76 31t-31 76v393q0 58 23 111t61 91 91 61 111 23h35q15 0 26-11t10-25v-72q0-14-10-25t-26-10h-35q-59 0-101-42t-42-101v-18q0-22 16-38t37-16h125q45 0 76-31t32-76z m500 0v-214q0-45-32-76t-76-31h-214q-44 0-76 31t-31 76v393q0 58 23 111t61 91 91 61 111 23h35q15 0 26-11t10-25v-72q0-14-10-25t-26-10h-35q-59 0-101-42t-42-101v-18q0-22 16-38t37-16h125q45 0 76-31t32-76z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="code" unicode="" d="M344 69l-28-28q-5-5-12-5t-13 5l-260 261q-6 5-6 12t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13t-6-13z m330 596l-208-721q-2-7-9-11t-13-1l-34 9q-8 3-11 9t-2 14l209 720q2 8 8 11t13 2l35-10q7-2 11-9t1-13z m367-363l-260-261q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13t-5-12z" horiz-adv-x="1071.4" />
|
||||
|
||||
<glyph glyph-name="superscript" unicode="" d="M501 86v-93h-139l-89 141-13 23q-4 5-6 12h-2q0-2-1-4t-2-4-2-4q-5-11-14-25l-86-139h-144v93h71l110 162-103 152h-76v94h154l77-127q1-2 13-24 4-5 6-11h2q1 5 6 11l14 24 78 127h143v-94h-69l-103-149 114-165h61z m355 379v-115h-287l-1 15q-3 16-3 26 0 36 15 65t36 48 47 37 47 30 36 30 15 36q0 21-17 35t-39 13q-29 0-54-21-8-6-20-22l-59 52q15 20 35 37 47 36 105 36 61 0 99-33t38-89q0-31-13-57t-35-43-45-33-46-28-37-28-17-36h130v45h70z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="subscript" unicode="" d="M501 86v-93h-139l-89 141-13 23q-4 5-6 12h-2q0-2-1-4t-2-4-2-4q-5-11-14-25l-86-139h-144v93h71l110 162-103 152h-76v94h154l77-127q1-2 13-24 4-5 6-11h2q1 5 6 11l14 24 78 127h143v-94h-69l-103-149 114-165h61z m356-121v-115h-287l-2 15q-2 25-2 26 0 35 15 65t36 48 47 37 47 30 36 30 15 36q0 21-17 35t-39 13q-28 0-54-21-8-6-20-22l-59 52q15 20 35 37 45 36 105 36 62 0 100-33t37-89q0-37-19-66t-47-48-55-35-49-35-23-41h130v45h70z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="header" unicode="" d="M939-79q-25 0-74 2t-75 2q-24 0-73-2t-74-2q-13 0-21 12t-7 25q0 18 9 26t22 9 29 4 25 9q18 11 18 78l0 218q0 12-1 17-7 3-28 3h-376q-22 0-29-3 0-5 0-17l-1-207q0-79 21-91 9-6 26-8t32-2 25-8 11-26q0-14-6-26t-21-13q-26 0-78 2t-77 2q-24 0-71-2t-71-2q-13 0-20 12t-7 25q0 17 9 25t20 10 26 4 24 9q18 13 18 80l-1 31v454q0 2 1 15t0 20-1 21-2 24-4 20-6 18-9 10q-8 5-25 7t-29 1-23 7-10 26q0 14 6 26t20 13q26 0 78-2t77-2q23 0 71 2t70 2q14 0 21-13t7-26q0-17-9-25t-22-8-27-2-24-7q-20-12-20-90l1-178q0-12 0-18 7-2 22-2h390q14 0 21 2 1 6 1 18l0 178q0 78-19 90-10 6-33 7t-37 7-14 28q0 14 7 26t21 13q24 0 74-2t73-2q24 0 72 2t72 2q14 0 21-13t7-26q0-17-10-25t-22-8-29-2-24-7q-20-13-20-90l1-526q0-66 19-78 9-6 25-8t30-2 23-9 10-25q0-14-6-26t-20-13z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="window-maximize" unicode="" d="M143 64h714v429h-714v-429z m857 625v-678q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63v678q0 37 26 63t63 27h822q37 0 63-27t26-63z" horiz-adv-x="1000" />
|
||||
</font>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 16 KiB |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
.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}
|
|
@ -0,0 +1 @@
|
|||
ul{margin:0;padding:0;list-style:none}
|
|
@ -0,0 +1 @@
|
|||
.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}
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
.v-note-wrapper[data-v-aa6295de]{z-index:1000;min-height:580px}.sheet-thum .img[data-v-aa6295de]{width:100%;cursor:pointer;border-radius:4px}.sheet-thum .sheet-thum-remove[data-v-aa6295de]{margin-top:16px}
|
|
@ -0,0 +1 @@
|
|||
.v-note-wrapper[data-v-b71c008c]{z-index:1000;min-height:580px}.post-thum .img[data-v-b71c008c]{width:100%;cursor:pointer;border-radius:4px}.post-thum .post-thum-remove[data-v-b71c008c]{margin-top:16px}
|
|
@ -0,0 +1 @@
|
|||
.height-100[data-v-7e6c753c]{height:100vh}.install-action[data-v-7e6c753c]{margin-top:1rem}.previus-button[data-v-7e6c753c]{margin-right:1rem}.install-card[data-v-7e6c753c]{-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)}
|
|
@ -0,0 +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-377ce948]{position:fixed;bottom:30px;right:30px}.theme-thumb[data-v-377ce948]{width:100%;margin:0 auto;position:relative;padding-bottom:56%;overflow:hidden}.theme-thumb img[data-v-377ce948]{width:100%;height:100%;position:absolute;top:0;left:0}
|
|
@ -0,0 +1 @@
|
|||
.category-tree[data-v-23f67544]{margin-top:1rem}
|
|
@ -0,0 +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}@font-face{font-family:fontello;src:url(../fonts/fontello.e73a0647.eot);src:url(../fonts/fontello.e73a0647.eot#iefix) format("embedded-opentype"),url(../fonts/fontello.8d4a4e6f.woff2) format("woff2"),url(../fonts/fontello.a782baa8.woff) format("woff"),url(../fonts/fontello.068ca2b3.ttf) format("truetype"),url(../assets/fontello.9354499c.svg#fontello) format("svg");font-weight:400;font-style:normal}[class*=" fa-mavon-"]:before,[class^=fa-mavon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-mavon-bold:before{content:"\E800"}.fa-mavon-italic:before{content:"\E801"}.fa-mavon-thumb-tack:before{content:"\E802"}.fa-mavon-link:before{content:"\E803"}.fa-mavon-picture-o:before{content:"\E804"}.fa-mavon-repeat:before{content:"\E805"}.fa-mavon-undo:before{content:"\E806"}.fa-mavon-trash-o:before{content:"\E807"}.fa-mavon-floppy-o:before{content:"\E808"}.fa-mavon-compress:before{content:"\E809"}.fa-mavon-eye:before{content:"\E80A"}.fa-mavon-eye-slash:before{content:"\E80B"}.fa-mavon-question-circle:before{content:"\E80C"}.fa-mavon-times:before{content:"\E80D"}.fa-mavon-align-left:before{content:"\E80F"}.fa-mavon-align-center:before{content:"\E810"}.fa-mavon-align-right:before{content:"\E811"}.fa-mavon-arrows-alt:before{content:"\F0B2"}.fa-mavon-bars:before{content:"\F0C9"}.fa-mavon-list-ul:before{content:"\F0CA"}.fa-mavon-list-ol:before{content:"\F0CB"}.fa-mavon-strikethrough:before{content:"\F0CC"}.fa-mavon-underline:before{content:"\F0CD"}.fa-mavon-table:before{content:"\F0CE"}.fa-mavon-columns:before{content:"\F0DB"}.fa-mavon-quote-left:before{content:"\F10D"}.fa-mavon-code:before{content:"\F121"}.fa-mavon-superscript:before{content:"\F12B"}.fa-mavon-subscript:before{content:"\F12C"}.fa-mavon-header:before{content:"\F1DC"}.fa-mavon-window-maximize:before{content:"\F2D0"}.markdown-body strong{font-weight:bolder}.markdown-body .hljs-center{text-align:center}.markdown-body .hljs-right{text-align:right}.markdown-body .hljs-left{text-align:left}
|
|
@ -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-f82dfdc0]{margin:24px 0 12px 0}.search-box[data-v-f82dfdc0]{padding-bottom:12px}.photo-thumb[data-v-f82dfdc0]{width:100%;margin:0 auto;position:relative;padding-bottom:56%;overflow:hidden}.photo-thumb img[data-v-f82dfdc0]{width:100%;height:100%;position:absolute;top:0;left:0}.ant-card-meta[data-v-f82dfdc0]{padding:.8rem}.photo-detail-img img[data-v-f82dfdc0]{width:100%}.table-operator[data-v-f82dfdc0]{margin-bottom:0}
|
|
@ -0,0 +1 @@
|
|||
body{height:100%;background-color:#f5f5f5}.container{background:#f7f7f7;position:absolute;top:45%;left:50%;margin:-160px 0 0 -160px;width:320px;padding:16px 32px 32px 32px;-webkit-box-shadow:-4px 7px 46px 2px rgba(0,0,0,.1);box-shadow:-4px 7px 46px 2px rgba(0,0,0,.1)}.loginLogo{margin-bottom:20px;text-align:center}.loginLogo span{vertical-align:text-bottom;font-size:36px;display:inline-block;font-weight:600;color:#1790fe;background-image:-webkit-gradient(linear,37.219838% 34.532506%,36.425669% 93.178216%,from(#36c8f5),to(#1790fe),color-stop(.37,#1790fe));-webkit-text-fill-color:transparent;-webkit-background-clip:text}
|
|
@ -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}.page-header-wrapper-grid-content-main[data-v-03b28064]{width:100%;height:100%;min-height:100%;-webkit-transition:.3s;transition:.3s}.page-header-wrapper-grid-content-main .profile-center-avatarHolder[data-v-03b28064]{text-align:center;margin-bottom:24px}.page-header-wrapper-grid-content-main .profile-center-avatarHolder>.avatar[data-v-03b28064]{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-03b28064]{height:100%;width:100%}.page-header-wrapper-grid-content-main .profile-center-avatarHolder .username[data-v-03b28064]{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-03b28064]{margin-bottom:8px;padding-left:26px;position:relative}.page-header-wrapper-grid-content-main .profile-center-detail i[data-v-03b28064]{position:absolute;height:14px;width:14px;left:0;top:4px}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
.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%}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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-0e9a1aaa.02508ef3.css rel=prefetch><link href=/css/chunk-0fce0b20.b63bc0c1.css rel=prefetch><link href=/css/chunk-1842ae66.b6783003.css rel=prefetch><link href=/css/chunk-1a9e5fd6.f2a1ab27.css rel=prefetch><link href=/css/chunk-38995698.8b73819d.css rel=prefetch><link href=/css/chunk-3b1aebf0.8481e8b4.css rel=prefetch><link href=/css/chunk-559c36ba.c1990d7c.css rel=prefetch><link href=/css/chunk-5cf64070.e190fb28.css rel=prefetch><link href=/css/chunk-66751b1c.19d096da.css rel=prefetch><link href=/css/chunk-70d656f6.d6ed662c.css rel=prefetch><link href=/css/chunk-ae3b7b16.b2814feb.css rel=prefetch><link href=/css/chunk-bec449fa.83f70656.css rel=prefetch><link href=/css/chunk-c938f95a.09186be6.css rel=prefetch><link href=/css/chunk-ed9ea95e.6f053d75.css rel=prefetch><link href=/css/fail.809a6bc5.css rel=prefetch><link href=/js/chunk-0ba750a2.0d170937.js rel=prefetch><link href=/js/chunk-0e9a1aaa.1881ccc9.js rel=prefetch><link href=/js/chunk-0fce0b20.a3026806.js rel=prefetch><link href=/js/chunk-142c8832.7d835aa9.js rel=prefetch><link href=/js/chunk-1842ae66.6e9112b0.js rel=prefetch><link href=/js/chunk-1a9e5fd6.fa0f576c.js rel=prefetch><link href=/js/chunk-28db7404.656982ea.js rel=prefetch><link href=/js/chunk-2d0b64bf.00f0ca35.js rel=prefetch><link href=/js/chunk-2d21a35c.692a15b0.js rel=prefetch><link href=/js/chunk-38995698.6f1a256b.js rel=prefetch><link href=/js/chunk-3b1aebf0.6d76a86f.js rel=prefetch><link href=/js/chunk-559c36ba.6927c28a.js rel=prefetch><link href=/js/chunk-5bf599cc.70b0e978.js rel=prefetch><link href=/js/chunk-5cf64070.f296599d.js rel=prefetch><link href=/js/chunk-66751b1c.f6023b8c.js rel=prefetch><link href=/js/chunk-70d656f6.eef13ba5.js rel=prefetch><link href=/js/chunk-87e2df70.a2342fdd.js rel=prefetch><link href=/js/chunk-ae3b7b16.c7d73887.js rel=prefetch><link href=/js/chunk-b57a30e4.099a5953.js rel=prefetch><link href=/js/chunk-bec449fa.d0064f92.js rel=prefetch><link href=/js/chunk-c938f95a.df72ba72.js rel=prefetch><link href=/js/chunk-ed9ea95e.ed523470.js rel=prefetch><link href=/js/fail.86aca829.js rel=prefetch><link href=/css/app.9783d8cc.css rel=preload as=style><link href=/css/chunk-vendors.454e2a41.css rel=preload as=style><link href=/js/app.90b1dd93.js rel=preload as=script><link href=/js/chunk-vendors.ddc041b6.js rel=preload as=script><link href=/css/chunk-vendors.454e2a41.css rel=stylesheet><link href=/css/app.9783d8cc.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.ddc041b6.js></script><script src=/js/app.90b1dd93.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-13e4f411.8481e8b4.css rel=prefetch><link href=/css/chunk-14e8932a.b6783003.css rel=prefetch><link href=/css/chunk-1a112dee.45475c5a.css rel=prefetch><link href=/css/chunk-1c8b985a.c1990d7c.css rel=prefetch><link href=/css/chunk-2292601a.3796d963.css rel=prefetch><link href=/css/chunk-326c9cc0.f3d819ff.css rel=prefetch><link href=/css/chunk-3d0d3479.d6ed662c.css rel=prefetch><link href=/css/chunk-430d5ab2.a192a5b3.css rel=prefetch><link href=/css/chunk-4680d970.02508ef3.css rel=prefetch><link href=/css/chunk-4fb0639b.09186be6.css rel=prefetch><link href=/css/chunk-54edf48d.e7ee2717.css rel=prefetch><link href=/css/chunk-9449c032.6f053d75.css rel=prefetch><link href=/css/chunk-ce798896.c624e695.css rel=prefetch><link href=/css/chunk-fba59fe4.5ac5144c.css rel=prefetch><link href=/css/fail.809a6bc5.css rel=prefetch><link href=/js/chunk-13e4f411.d49af1be.js rel=prefetch><link href=/js/chunk-142c8832.715bdc27.js rel=prefetch><link href=/js/chunk-14e8932a.59eedd4d.js rel=prefetch><link href=/js/chunk-1a112dee.8db74f52.js rel=prefetch><link href=/js/chunk-1c8b985a.b30be155.js rel=prefetch><link href=/js/chunk-2292601a.c6056b46.js rel=prefetch><link href=/js/chunk-2d0b64bf.edda42f8.js rel=prefetch><link href=/js/chunk-2d0d65a2.611872ef.js rel=prefetch><link href=/js/chunk-2d21a35c.a35eae67.js rel=prefetch><link href=/js/chunk-326c9cc0.29d10314.js rel=prefetch><link href=/js/chunk-3d0d3479.03f0a46b.js rel=prefetch><link href=/js/chunk-407d6578.e43ee2d4.js rel=prefetch><link href=/js/chunk-430d5ab2.7949e496.js rel=prefetch><link href=/js/chunk-4680d970.7a8dd3c7.js rel=prefetch><link href=/js/chunk-4fb0639b.e57f582f.js rel=prefetch><link href=/js/chunk-54edf48d.23058ce4.js rel=prefetch><link href=/js/chunk-5a69cdaa.4485525a.js rel=prefetch><link href=/js/chunk-5bf599cc.b18a9360.js rel=prefetch><link href=/js/chunk-87e2df70.f9d1497b.js rel=prefetch><link href=/js/chunk-9449c032.386ae712.js rel=prefetch><link href=/js/chunk-ce798896.2efd9e1c.js rel=prefetch><link href=/js/chunk-fba59fe4.be119cc8.js rel=prefetch><link href=/js/fail.af1881f8.js rel=prefetch><link href=/css/app.cf1b528f.css rel=preload as=style><link href=/css/chunk-vendors.6b95225a.css rel=preload as=style><link href=/js/app.891ab89a.js rel=preload as=script><link href=/js/chunk-vendors.674200fc.js rel=preload as=script><link href=/css/chunk-vendors.6b95225a.css rel=stylesheet><link href=/css/app.cf1b528f.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.674200fc.js></script><script src=/js/app.891ab89a.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
|
@ -0,0 +1 @@
|
|||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-14e8932a"],{2967:function(t,e,a){"use strict";a.r(e);var n=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"page-header-index-wide"},[a("a-row",[a("a-col",{attrs:{span:24}},[a("a-card",{attrs:{bordered:!1}},[a("a-list",{attrs:{itemLayout:"horizontal"}},[a("a-list-item",[a("a-list-item-meta",[a("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 环境信息\n ")]),a("template",{slot:"description"},[a("ul",[a("li",[t._v("版本:1.0")]),a("li",[t._v("数据库:"+t._s(t.environments.database))]),a("li",[t._v("启动时间:"+t._s(t._f("moment")(t.environments.startTime)))])]),a("a",{attrs:{href:"https://github.com/halo-dev",target:"_blank"}},[t._v("开源地址\n "),a("a-icon",{attrs:{type:"link"}})],1),t._v(" \n "),a("a",{attrs:{href:"https://docs.halo.run",target:"_blank"}},[t._v("用户文档\n "),a("a-icon",{attrs:{type:"link"}})],1),t._v(" \n "),a("a",{attrs:{href:"https://bbs.halo.run",target:"_blank"}},[t._v("问题反馈\n "),a("a-icon",{attrs:{type:"link"}})],1),t._v(" \n ")])],2)],1),a("a-list-item",[a("a-list-item-meta",[a("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 开发者\n ")]),a("template",{slot:"description"},t._l(t.developers,function(t,e){return a("a-tooltip",{key:e,attrs:{placement:"top",title:t.name}},[a("a-avatar",{style:{marginRight:"10px"},attrs:{size:"large",src:t.avatar}})],1)}),1)],2)],1),a("a-list-item",[a("a-list-item-meta",[a("h3",{attrs:{slot:"title"},slot:"title"},[t._v("\n 时间轴\n ")]),a("template",{slot:"description"},[a("a-timeline",[a("a-timeline-item",[t._v("...")]),t._l(t.steps,function(e,n){return a("a-timeline-item",{key:n},[t._v(t._s(e.date)+" "+t._s(e.content))])})],2)],1)],2)],1)],1)],1)],1)],1)],1)},i=[],s=a("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://johnniang.me/imgs/avatar.png",website:"https://johnniang.me",github:"https://github.com/johnniang"}],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(e){t.environments=e.data.data})}}},o=r,l=(a("5ea2"),a("17cc")),c=Object(l["a"])(o,n,i,!1,null,null,null);e["default"]=c.exports},"5ea2":function(t,e,a){"use strict";var n=a("8b55"),i=a.n(n);i.a},"8b55":function(t,e,a){}}]);
|
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
|
@ -0,0 +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}}]);
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-407d6578"],{aa1e9: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:"添加标签"}},[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",[e("a-button",{attrs:{type:"primary"},on:{click:t.handleCreateTag}},[t._v("保存")])],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",{attrs:{closable:"",color:"blue"},on:{close:function(e){return t.handleDeleteTag(a.id)}}},[t._v(t._s(a.name))])],2)}),1)],1)],1)],1)},o=[],l=e("d28db"),r={data:function(){return{tags:[],tagToCreate:{},tagToUpdate:{}}},created:function(){this.loadTags()},methods:{loadTags:function(){var t=this;l["a"].listAll(!0).then(function(a){t.tags=a.data.data})},handleCreateTag:function(){var t=this;l["a"].create(this.tagToCreate).then(function(a){t.loadTags()})},handleUpdateTag:function(t){var a=this;l["a"].update(t,this.tagToUpdate).then(function(t){a.loadTags()})},handleDeleteTag:function(t){var a=this;l["a"].delete(t).then(function(t){a.$message.success("删除成功!"),a.loadTags()})}}},s=r,c=e("17cc"),i=Object(c["a"])(s,n,o,!1,null,null,null);a["default"]=i.exports},d28db:function(t,a,e){"use strict";var n=e("9efd"),o="/api/admin/tags",l={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"]=l}}]);
|
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
|
@ -0,0 +1 @@
|
|||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-5a69cdaa"],{"10a3":function(n,t,u){"use strict";var a=function(){var n=this,t=n.$createElement,u=n._self._c||t;return u("div")},r=[];u.d(t,"a",function(){return a}),u.d(t,"b",function(){return r})},"46b4":function(n,t){},"7ad4":function(n,t,u){"use strict";u.r(t);var a=u("46b4"),r=u.n(a);for(var c in a)"default"!==c&&function(n){u.d(t,n,function(){return a[n]})}(c);t["default"]=r.a},bb51:function(n,t,u){"use strict";u.r(t);var a=u("10a3"),r=u("7ad4");for(var c in r)"default"!==c&&function(n){u.d(t,n,function(){return r[n]})}(c);var e=u("17cc"),i=Object(e["a"])(r["default"],a["a"],a["b"],!1,null,"ac9e2e42",null);t["default"]=i.exports}}]);
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue