Commit 3f8f3d18 by 侯昆

app 添加编辑信息,封面

1 parent 8a9d7222
Showing 127 changed files with 2925 additions and 10 deletions
......@@ -44,3 +44,4 @@ build/
.vscode/
/serverside/cihai-pc/cihai-pc.iml
......@@ -15,7 +15,7 @@ package com.dookay.cihai.app.controller;
****************************************/
import com.baidu.aip.util.Base64Util;
import com.dookay.cihai.app.controller.dto.WordDTO;
import com.dookay.cihai.core.word.dto.WordDTO;
import com.dookay.cihai.core.aip.AipDefaultClient;
import com.dookay.cihai.core.aip.AipWordUtilBean;
import com.dookay.cihai.core.aip.model.LexerItem;
......
......@@ -14,7 +14,8 @@ package com.dookay.cihai.app.controller;
* *
****************************************/
import com.dookay.cihai.app.controller.dto.WordDTO;
import com.dookay.cihai.core.word.dto.WordDTO;
import com.dookay.cihai.app.controller.vo.EditionVO;
import com.dookay.cihai.app.controller.vo.WordPicsVO;
import com.dookay.cihai.core.word.domain.WordDomain;
import com.dookay.cihai.core.word.service.IWordRelationService;
......@@ -32,7 +33,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* 词语控制器
......@@ -76,11 +79,30 @@ public class WordController extends BaseController {
if (wordDomain == null || StringUtils.isEmpty(wordDomain.getBaikePhotos())) {
return errorResult("图册不存在");
}
List<ImageModel> imageModels = ImageModel.toList(wordDomain.getBaikePhotos());
List<ImageModel> images =
ImageModel.toList(wordDomain.getBaikePhotos())
.stream()
.sorted(Comparator.comparing(ImageModel::getFile))
.collect(Collectors.toList());
WordPicsVO vo = new WordPicsVO();
vo.setPics(imageModels);
vo.setPics(images);
return successResult("图册", vo);
}
/**
* 词的编辑信息
*
* @param id
* @return
*/
@RequestMapping(value = "/edition/{id}", method = RequestMethod.GET)
@ApiOperation(value = "词的编辑信息", httpMethod = "GET", response = WordPicsVO.class)
public JsonResult edition(@PathVariable @ApiParam(value = "词的id", required = true) Long id) {
WordDomain wordDomain = wordService.get(id);
if (wordDomain == null) {
return errorResult("词不存在");
}
return successResult("词的编辑信息", EditionVO.fromDomain(wordDomain));
}
}
......@@ -14,7 +14,7 @@ package com.dookay.cihai.app.controller;
* *
****************************************/
import com.dookay.cihai.app.controller.dto.WordDTO;
import com.dookay.cihai.core.word.dto.WordDTO;
import com.dookay.cihai.app.controller.vo.CharacterBaikeVO;
import com.dookay.cihai.app.controller.vo.CharacterParaphVO;
import com.dookay.cihai.app.controller.vo.StatementBaikeVO;
......
......@@ -21,6 +21,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
......@@ -68,7 +69,12 @@ public class CharacterBaikeVO {
.collect(Collectors.toList());
dto.setBody(body);
if (StringUtils.isNotEmpty(word.getBaikePhotos())) {
dto.setImages(ImageModel.toList(word.getBaikePhotos()));
List<ImageModel> images =
ImageModel.toList(word.getBaikePhotos())
.stream()
.sorted(Comparator.comparing(ImageModel::getFile))
.collect(Collectors.toList());
dto.setImages(images);
}
if (StringUtils.isNotEmpty(word.getBaikeVideo())) {
dto.setVideos(ImageModel.toList(word.getBaikeVideo()));
......
package com.dookay.cihai.app.controller.vo;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.cihai.core.word.domain.WordDomain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 编辑信息
* @author houkun
* @date 2018/1/15
*/
@Data
public class EditionVO {
@ApiModelProperty("主编")
private String mainEditor;
@ApiModelProperty("修订者")
private String reviser;
@ApiModelProperty("修订记录")
private Integer reviseCount;
@ApiModelProperty("浏览次数")
private Long viewCount;
public static EditionVO fromDomain(WordDomain wordDomain) {
EditionVO vo = new EditionVO();
if (wordDomain.getWord().equals("中华人民共和国")) {
vo.setMainEditor("刘君德");
} else {
vo.setMainEditor("王继如");
}
vo.setReviser("");
vo.setReviseCount((int) wordDomain.getId().longValue());
vo.setViewCount(wordDomain.getId() * 2 + 1);
return vo;
}
}
......@@ -14,7 +14,7 @@ package com.dookay.cihai.app.controller.vo;
* *
****************************************/
import com.dookay.cihai.app.controller.dto.WordDTO;
import com.dookay.cihai.core.word.dto.WordDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
......@@ -21,6 +21,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
......@@ -63,7 +64,12 @@ public class StatementBaikeVO {
.collect(Collectors.toList());
dto.setBody(body);
if (StringUtils.isNotEmpty(word.getBaikePhotos())) {
dto.setImages(ImageModel.toList(word.getBaikePhotos()));
List<ImageModel> images =
ImageModel.toList(word.getBaikePhotos())
.stream()
.sorted(Comparator.comparing(ImageModel::getFile))
.collect(Collectors.toList());
dto.setImages(images);
}
if (StringUtils.isNotEmpty(word.getBaikeVideo())) {
dto.setVideos(ImageModel.toList(word.getBaikeVideo()));
......
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="word" scope="request" type="com.dookay.cihai.core.word.domain.WordDomain"/>
<jsp:useBean id="vos" scope="request" type="java.util.List<com.dookay.cihai.app.controller.dto.WordDTO>"/>
<jsp:useBean id="vos" scope="request" type="java.util.List<com.dookay.cihai.core.word.dto.WordDTO>"/>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
......
<%@ page import="com.dookay.cihai.app.helper.HtmlHelper" %>
<%@ page import="com.google.common.collect.Lists" %>
<%@ page import="com.alibaba.fastjson.JSON" %>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
......
......@@ -15,6 +15,11 @@
<groupId>com.dookay</groupId>
<artifactId>coral-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.dookay</groupId>
<artifactId>coral-common-web</artifactId>
<scope>provided</scope>
</dependency>
<!--稻壳基础类库核心部分 不包含web -->
<!--开发工具-->
......
......@@ -28,6 +28,8 @@ import lombok.Data;
@Data
public class OneCharacterDTO {
@ApiModelProperty("字id")
private Long wordId;
@ApiModelProperty("字名")
private String word;
@ApiModelProperty("描述")
......@@ -41,6 +43,7 @@ public class OneCharacterDTO {
description = StringUtils.substring(baikeBrief, 0, i + 1);
}
OneCharacterDTO dto = new OneCharacterDTO();
dto.setWordId(word.getId());
dto.setWord(word.getWord());
dto.setDescription(description);
return dto;
......
package com.dookay.cihai.app.controller.dto;
package com.dookay.cihai.core.word.dto;
/*****************************************
* *
......@@ -19,9 +19,11 @@ import com.dookay.cihai.core.word.enums.WordType;
import com.dookay.cihai.core.word.service.IWordRelationService;
import com.dookay.coral.common.core.utils.lang.CollectionUtils;
import com.dookay.coral.common.core.utils.lang.StringUtils;
import com.dookay.coral.common.web.utils.upload.model.ImageModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Comparator;
import java.util.List;
/**
......@@ -45,6 +47,8 @@ public class WordDTO {
private Boolean hasBaike;
@ApiModelProperty("是否有相关词")
private Boolean hasRelated;
@ApiModelProperty("封面图 若不存在则返回null")
private ImageModel thumb;
public static WordDTO fromDomain(WordDomain word, IWordRelationService wordRelationService) {
WordDTO wordDTO = new WordDTO();
......@@ -59,6 +63,15 @@ public class WordDTO {
wordDTO.setHasBaike(!StringUtils.isAllBlank(word.getBaikeBrief(), word.getBaikeParaphrase()));
List<WordDomain> relateWord = wordRelationService.getRelateWord(word.getId());
wordDTO.setHasRelated(CollectionUtils.isNotEmpty(relateWord));
if (StringUtils.isNotEmpty(word.getBaikePhotos())) {
ImageModel thumb =
ImageModel.toList(word.getBaikePhotos())
.stream()
.sorted(Comparator.comparing(ImageModel::getFile))
.findFirst()
.orElse(null);
wordDTO.setThumb(thumb);
}
return wordDTO;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cihai</artifactId>
<groupId>com.dookay</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cihai-pc</artifactId>
<packaging>war</packaging>
<name>cihai-pc</name>
<properties>
<maven.test.skip>true</maven.test.skip>
<jetty.scope>compile</jetty.scope>
</properties>
<dependencies>
<dependency>
<groupId>com.dookay</groupId>
<artifactId>coral-common-web</artifactId>
</dependency>
<dependency>
<groupId>com.dookay</groupId>
<artifactId>cihai-core</artifactId>
</dependency>
<!--开发工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--表现层-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>${jetty.scope}</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<scope>${jetty.scope}</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<scope>${jetty.scope}</scope>
</dependency>
<!--表现层-->
<!--工具-->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
</dependencies>
</project>
package com.dookay.cihai.pc;
import com.dookay.cihai.core.CiHaiCoreApplication;
import com.dookay.coral.common.core.CoralCommonCoreMarker;
import com.dookay.coral.common.web.CoralCommonWebMarker;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
/**
* 项目运行入口
*
* @author houkun
*/
@SpringBootApplication(
// 加载不同模块的配置与待注入的Bean
scanBasePackageClasses = {
CoralCommonCoreMarker.class,
CoralCommonWebMarker.class,
CiHaiCoreApplication.class,
CihaiPcApplication.class,
})
@MapperScan(basePackageClasses = CiHaiCoreApplication.class)
@ServletComponentScan(basePackageClasses = {
CoralCommonWebMarker.class,
CihaiPcApplication.class,
CiHaiCoreApplication.class
})
@EnableCaching
public class CihaiPcApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(CihaiPcApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(CihaiPcApplication.class, args);
}
}
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* NO BUG ENJOY LIFE *
* *
****************************************/
package com.dookay.cihai.pc.controller;
import com.baidu.aip.util.Base64Util;
import com.dookay.cihai.core.aip.AipDefaultClient;
import com.dookay.cihai.core.aip.AipImageClassifyClient;
import com.dookay.cihai.core.aip.AipWordUtilBean;
import com.dookay.cihai.core.aip.model.LexerItem;
import com.dookay.cihai.core.aip.model.ScanResult;
import com.dookay.cihai.core.word.domain.CustomDictionaryDomain;
import com.dookay.cihai.core.word.domain.WordDomain;
import com.dookay.cihai.core.word.dto.WordDTO;
import com.dookay.cihai.core.word.query.CustomDictionaryQuery;
import com.dookay.cihai.core.word.query.WordQuery;
import com.dookay.cihai.core.word.service.ICustomDictionaryService;
import com.dookay.cihai.core.word.service.IWordRelationService;
import com.dookay.cihai.core.word.service.IWordService;
import com.dookay.coral.common.core.utils.lang.StringUtils;
import com.dookay.coral.common.web.constant.MediaTypes;
import com.dookay.coral.common.web.controller.BaseController;
import com.dookay.coral.common.web.response.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
import java.util.stream.Collectors;
/**
* 主页
*
* @author houkun
* @date 2018/1/15
*/
@Controller
@RequestMapping(value = "/")
@Slf4j
public class HomeController extends BaseController {
@Autowired
private IWordService wordService;
@Autowired
private IWordRelationService wordRelationService;
@Autowired
private ICustomDictionaryService customDictionaryService;
@Autowired
private AipWordUtilBean aipWordUtilBean;
@Autowired
private AipImageClassifyClient aipImageClassifyClient;
@Autowired
private AipDefaultClient aipDefaultClient;
/**
* 首页
*
* @author houkun
* @date 2018/1/15
*/
@RequestMapping(method = RequestMethod.GET)
public ModelAndView index() {
ModelAndView mv = new ModelAndView("/home/index");
mv.addObject("oneDayCharacter", wordService.oneDayOnCharacter());
mv.addObject("recommendStatement", wordService.recomendStatement());
return mv;
}
/**
* 搜索
*
* @author houkun
* @date 2018/1/15
*/
@RequestMapping(value = "/home/search", method = RequestMethod.GET)
@ResponseBody
public JsonResult search(String keyword) {
log.info("进入搜索:" + keyword);
if (StringUtils.isBlank(keyword)) {
return errorResult("搜索内容不能为空");
}
String result = null;
boolean inDic = false;
List<CustomDictionaryDomain> dictionaryDomainList = customDictionaryService.getList(new CustomDictionaryQuery());
for (CustomDictionaryDomain dic : dictionaryDomainList) {
if (keyword.contains(dic.getWord())) {
result = dic.getWord();
inDic = true;
}
}
try {
if (!inDic) {
result = aipWordUtilBean.extractQueryKeyword(keyword);
}
WordQuery wordQuery = new WordQuery();
wordQuery.setKeyword(result);
WordDomain wordDomain = wordService.getFirst(wordQuery);
if (wordDomain == null) {
List<LexerItem> items = aipWordUtilBean.getLexerItems(result);
wordQuery.setKeywordList(items.stream().map(LexerItem::getItem).collect(Collectors.toList()));
wordQuery.setKeyword(null);
wordDomain = wordService.getFirst(wordQuery);
if (wordDomain == null) return errorResult(String.format("暂无\"%s\"检索结果", keyword));
return successResult("搜索结果", WordDTO.fromDomain(wordDomain, wordRelationService));
}
return successResult("success", WordDTO.fromDomain(wordDomain, wordRelationService));
} catch (Exception ex) {
return errorResult(String.format("暂无\"%s\"检索结果", keyword));
}
}
/**
* 图片搜索
*
* @author houkun
* @date 2018/1/15
*/
@RequestMapping(value = "/image/search", method = RequestMethod.POST, produces = MediaTypes.JSON_UTF_8)
@ResponseBody
public JsonResult imageSearch(MultipartFile image) {
log.info("图片名称", image.getOriginalFilename());
try {
String encode = Base64Util.encode(image.getBytes());
ScanResult imageResult = aipDefaultClient.scan(encode);
log.info(imageResult.getWordsList().toString());
if (imageResult.getWordsList().size() <= 0) {
return errorResult("暂无检索结果");
}
String name = imageResult.getWordsList().get(0);
log.info(name);
WordQuery wordQuery = new WordQuery();
wordQuery.setKeyword(name);
WordDomain wordDomain = wordService.getFirst(wordQuery);
if (wordDomain == null) {
List<LexerItem> items = aipWordUtilBean.getLexerItems(name);
wordQuery.setKeywordList(items.stream().map(LexerItem::getItem).collect(Collectors.toList()));
wordQuery.setKeyword(null);
wordDomain = wordService.getFirst(wordQuery);
if (wordDomain == null) return errorResult("暂无检索结果");
}
return successResult("搜索结果", WordDTO.fromDomain(wordDomain, wordRelationService));
} catch (Exception e) {
return errorResult("暂无检索结果");
}
}
}
package com.dookay.cihai.pc.controller;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.cihai.core.word.domain.WordDomain;
import com.dookay.cihai.core.word.dto.WordDTO;
import com.dookay.cihai.core.word.enums.WordType;
import com.dookay.cihai.core.word.service.IWordRelationService;
import com.dookay.cihai.core.word.service.IWordService;
import com.dookay.cihai.pc.controller.vo.CharacterBaikeVO;
import com.dookay.cihai.pc.controller.vo.CharacterParaphVO;
import com.dookay.cihai.pc.controller.vo.StatementBaikeVO;
import com.dookay.cihai.pc.controller.vo.StatementParaphVO;
import com.dookay.coral.common.core.exception.ServiceException;
import com.dookay.coral.common.core.utils.lang.StringUtils;
import com.dookay.coral.common.web.controller.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
import java.util.stream.Collectors;
/**
* 词控制器
*
* @author houkun
* @date 2018/1/16
*/
@Controller
@RequestMapping("/word")
public class WordController extends BaseController {
@Autowired
private IWordService wordService;
@Autowired
private IWordRelationService wordRelationService;
/**
* 词详情跳转页
*
* @author houkun
* @date 2018/1/16
*/
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ModelAndView detail(@PathVariable Long id) {
WordDomain wordDomain = wordService.get(id);
WordDTO wordDTO = WordDTO.fromDomain(wordDomain, wordRelationService);
Integer type = wordDTO.getType();
Boolean hasParaph = wordDTO.getHasParaph();
Boolean hasBaike = wordDTO.getHasBaike();
String forward = "";
if (type == WordType.CHARACTER.getValue()
&& hasParaph) {
forward = "/word/character/paraph/";
} else if (type == WordType.CHARACTER.getValue()
&& !hasParaph && hasBaike) {
forward = "/word/character/paraph/";
} else if (type == WordType.STATEMENT.getValue()
&& hasParaph) {
forward = "/word/statement/paraph/";
} else if (type == WordType.STATEMENT.getValue()
&& !hasParaph && hasBaike) {
forward = "/word/statement/baike/";
}
if (StringUtils.isEmpty(forward)) {
throw new ServiceException("词不存在");
}
ModelAndView mv = new ModelAndView("forward:" + forward + id);
return mv;
}
/**
* 字释义
*
* @author houkun
* @date 2018/1/9
*/
@RequestMapping(value = "/character/paraph/{id}", method = RequestMethod.GET)
public ModelAndView characterParaph(@PathVariable("id") Long id) {
WordDomain character = wordService.get(id);
ModelAndView mv = new ModelAndView("/word/character_paraph");
mv.addObject("vo", CharacterParaphVO.fromDomain(character));
return mv;
}
/**
* 字百科
*
* @author houkun
* @date 2018/1/9
*/
@RequestMapping(value = "/character/baike/{id}", method = RequestMethod.GET)
public ModelAndView characterBaike(@PathVariable("id") Long id) {
WordDomain character = wordService.get(id);
ModelAndView mv = new ModelAndView("/word/character_baike");
mv.addObject("vo", CharacterBaikeVO.fromDomain(character));
return mv;
}
/**
* 词组释义
*
* @author houkun
* @date 2018/1/9
*/
@RequestMapping(value = "/statement/paraph/{id}", method = RequestMethod.GET)
public ModelAndView statementParaph(@PathVariable("id") Long id) {
WordDomain statement = wordService.get(id);
ModelAndView mv = new ModelAndView("/word/statement_paraph");
mv.addObject("vo", StatementParaphVO.fromDomain(statement));
return mv;
}
/**
* 词组百科
*
* @author houkun
* @date 2018/1/9
*/
@RequestMapping(value = "/statement/baike/{id}", method = RequestMethod.GET)
public ModelAndView statementBaike(@PathVariable("id") Long id) {
WordDomain statement = wordService.get(id);
ModelAndView mv = new ModelAndView("/word/statement_baike");
mv.addObject("vo", StatementBaikeVO.fromDomain(statement));
return mv;
}
/**
* 相关词
*
* @param id
* @return
*/
@RequestMapping(value = "/relate/{id}", method = RequestMethod.GET)
public ModelAndView relate(@PathVariable("id") Long id) {
WordDomain wordDomain = wordService.get(id);
List<WordDomain> relateWords = wordRelationService.getRelateWord(id);
List<WordDTO> vos = relateWords.stream().filter(r -> !r.getId().equals(id)).map(word -> WordDTO.fromDomain(word, wordRelationService)).collect(Collectors.toList());
ModelAndView mv = new ModelAndView("/word/relate");
mv.addObject("word", wordDomain);
mv.addObject("vos", vos);
return mv;
}
}
package com.dookay.cihai.pc.controller.dto;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.coral.common.core.utils.lang.StringUtils;
import lombok.Data;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 语词释义模型
*
* @author houkun
* @date 2018/1/14
*/
@Data
public class ParaphBodyDTO {
private String main;
private List<String> description;
public ParaphBodyDTO(String content) {
int firstPeriodIndex = StringUtils.indexOf(content, '。');
if (firstPeriodIndex == -1) {
this.main = content + '。';
} else {
this.main = StringUtils.trim(StringUtils.substring(content, 0, firstPeriodIndex + 1));
String descriptionContent = StringUtils.substring(content, firstPeriodIndex + 1);
this.description = Arrays.stream(StringUtils.split(descriptionContent, '\r'))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
}
}
}
package com.dookay.cihai.pc.controller.vo;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.cihai.core.word.domain.WordDomain;
import com.dookay.coral.common.core.utils.lang.StringUtils;
import com.dookay.coral.common.web.utils.upload.model.ImageModel;
import lombok.Data;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* 单字百科
*
* @author houkun
* @date 2018/1/9
*/
@Data
public class CharacterBaikeVO {
private Long wordId;
private String word;
private List<String> brief;
private List<String> body;
private List<String> spell;
private List<ImageModel> images;
private List<ImageModel> videos;
public static CharacterBaikeVO fromDomain(WordDomain word) {
CharacterBaikeVO dto = new CharacterBaikeVO();
dto.setWordId(word.getId());
dto.setWord(word.getWord());
List<String> brief = Arrays.stream(StringUtils.split(word.getBaikeBrief(), '`'))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
dto.setBrief(brief);
List<String> spell = Arrays.stream(StringUtils.split(word.getWordSpell(), ' '))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
dto.setSpell(spell);
List<String> body = Arrays.stream(StringUtils.split(word.getBaikeParaphrase(), '\n'))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
dto.setBody(body);
if (StringUtils.isNotEmpty(word.getBaikePhotos())) {
List<ImageModel> images =
ImageModel.toList(word.getBaikePhotos())
.stream()
.sorted(Comparator.comparing(ImageModel::getFile))
.collect(Collectors.toList());
dto.setImages(images);
}
if (StringUtils.isNotEmpty(word.getBaikeVideo())) {
dto.setVideos(ImageModel.toList(word.getBaikeVideo()));
}
return dto;
}
}
package com.dookay.cihai.pc.controller.vo;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.cihai.app.controller.dto.ParaphBodyDTO;
import com.dookay.cihai.core.word.domain.WordDomain;
import com.dookay.coral.common.core.utils.lang.StringUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 单字释义
* @author houkun
* @date 2018/1/9
*/
@Data
public class CharacterParaphVO {
private Long wordId;
private String word;
private List<String> brief;
private List<ParaphBodyDTO> body;
private List<String> spell;
public static CharacterParaphVO fromDomain(WordDomain word) {
CharacterParaphVO dto = new CharacterParaphVO();
dto.setWordId(word.getId());
dto.setWord(word.getWord());
List<String> brief = Arrays.stream(StringUtils.split(word.getWordBrief(), '`'))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
dto.setBrief(brief);
List<String> spell = Arrays.stream(StringUtils.split(word.getWordSpell(), ' '))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
dto.setSpell(spell);
List<ParaphBodyDTO> body = Arrays.stream(StringUtils.split(word.getBody(), '`'))
.filter(StringUtils::isNoneBlank)
.map(ParaphBodyDTO::new)
.collect(Collectors.toList());
dto.setBody(body);
return dto;
}
}
package com.dookay.cihai.pc.controller.vo;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.cihai.core.word.domain.WordDomain;
import lombok.Data;
/**
* 编辑信息
*
* @author houkun
* @date 2018/1/15
*/
@Data
public class EditionVO {
private String mainEditor;
private String reviser;
private Integer reviseCount;
private Long viewCount;
public static EditionVO fromDomain(WordDomain wordDomain) {
EditionVO vo = new EditionVO();
if (wordDomain.getWord().equals("中华人民共和国")) {
vo.setMainEditor("刘君德");
} else {
vo.setMainEditor("王继如");
}
vo.setReviser("");
vo.setReviseCount((int) wordDomain.getId().longValue());
vo.setViewCount(wordDomain.getId() * 2 + 1);
return vo;
}
}
package com.dookay.cihai.pc.controller.vo;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.cihai.core.word.dto.WordDTO;
import lombok.Data;
import java.util.List;
/**
* @author houkun
* @date 2018/1/14
*/
@Data
public class RelateWordsVO {
public List<WordDTO> words;
}
package com.dookay.cihai.pc.controller.vo;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.cihai.core.word.domain.WordDomain;
import com.dookay.coral.common.core.utils.lang.StringUtils;
import com.dookay.coral.common.web.utils.upload.model.ImageModel;
import lombok.Data;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* 词组百科
*
* @author houkun
* @date 2018/1/9
*/
@Data
public class StatementBaikeVO {
private Long wordId;
private String word;
private List<String> brief;
private List<String> body;
private String spell;
private List<ImageModel> images;
private List<ImageModel> videos;
public static StatementBaikeVO fromDomain(WordDomain word) {
StatementBaikeVO dto = new StatementBaikeVO();
dto.setWordId(word.getId());
dto.setWord(word.getWord());
List<String> brief = Arrays.stream(StringUtils.split(word.getBaikeBrief(), '`'))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
dto.setBrief(brief);
dto.setSpell(word.getWordSpell());
List<String> body = Arrays.stream(StringUtils.split(word.getBaikeParaphrase(), '\n'))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
dto.setBody(body);
if (StringUtils.isNotEmpty(word.getBaikePhotos())) {
List<ImageModel> images =
ImageModel.toList(word.getBaikePhotos())
.stream()
.sorted(Comparator.comparing(ImageModel::getFile))
.collect(Collectors.toList());
dto.setImages(images);
}
if (StringUtils.isNotEmpty(word.getBaikeVideo())) {
dto.setVideos(ImageModel.toList(word.getBaikeVideo()));
}
return dto;
}
}
package com.dookay.cihai.pc.controller.vo;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.cihai.core.word.domain.WordDomain;
import com.dookay.cihai.pc.controller.dto.ParaphBodyDTO;
import com.dookay.coral.common.core.utils.lang.StringUtils;
import lombok.Data;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 词组释义
*
* @author houkun
* @date 2018/1/9
*/
@Data
public class StatementParaphVO {
private Long wordId;
private String word;
private List<String> brief;
private List<ParaphBodyDTO> body;
private String spell;
public static StatementParaphVO fromDomain(WordDomain word) {
StatementParaphVO dto = new StatementParaphVO();
dto.setWordId(word.getId());
dto.setWord(word.getWord());
List<String> brief = Arrays.stream(StringUtils.split(word.getWordBrief(), '`'))
.filter(StringUtils::isNoneBlank)
.map(StringUtils::trim)
.collect(Collectors.toList());
dto.setBrief(brief);
dto.setSpell(word.getWordSpell());
List<ParaphBodyDTO> body = Arrays.stream(StringUtils.split(word.getBody(), '`'))
.filter(StringUtils::isNoneBlank)
.map(ParaphBodyDTO::new)
.collect(Collectors.toList());
dto.setBody(body);
return dto;
}
}
package com.dookay.cihai.pc.controller.vo;
/*****************************************
* *
* @dookay.com Internet make it happen *
* ----------- ----------------------- *
* dddd ddddd Internet make it happen *
* o o o Internet make it happen *
* k k k Internet make it happen *
* a a a Internet make it happen *
* yyyy yyyyy Internet make it happen *
* ----------- ----------------------- *
* @dookay.com Internet make it happen *
* *
****************************************/
import com.dookay.coral.common.web.utils.upload.model.ImageModel;
import lombok.Data;
import java.util.List;
/**
* @author houkun
* @date 2018/1/14
*/
@Data
public class WordPicsVO {
private List<ImageModel> pics;
}
# 解决 springboot-devtool 影响 tk.mybatis.mapper 插件报错问题
# 详见: https://github.com/abel533/MyBatis-Spring-Boot/issues/5
restart.include.mapper=/mapper-[\\w-\\.]+jar
restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar
restart.include.coralcommon=/coral-common-[\\w-\\.]+jar
restart.include.coraldemocore=/cihai-core[\\w-\\.]+jar
\ No newline at end of file
debug=false
# 数据库连接
spring.datasource.url=jdbc:mysql://192.168.2.24:3306/cihai
spring.datasource.username=root
# 加密后的密码
spring.datasource.password=AmwpshLB35Fgazrs4rCfGlwNBZOTD34ezY/zS751V+7iSJHjr3tDNkpOfnW/y0fjFcMTNX0ycMt3KIUnDi8JYg==
# 加密时的公钥
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKgof5ExfKmEZEjq+GuqEoHA8tkIftarLRzUDAxdQzJQtF57DF63gPJJkIZLcKa2t8jt5JC2SRdxERg1A/kx0BMCAwEAAQ==
# 日志
logging.level.root=info
logging.level.com.dookay.core=trace
# redis
spring.redis.host=192.168.2.27
spring.redis.password=100001
# 文件存储
coral.web.resource.mapping.uploads-inner=/uploads/*
coral.web.resource.mapping.uploads-mapping=/data/www/uploads/cihai
#wechat config
#AppID
coral.wechat.WechatConfig.appId=wx319ed3575ffe9ff8
#AppSecret
coral.wechat.WechatConfig.appSecret=eed9c0728fb20521bb61be4ac6e4e67d
#Token(令牌)
coral.wechat.WechatConfig.token=eGgg3CoOihZQwCf1sr8jU8zmBfx4u5WT
#EncodingAESKey(消息加解密密钥)
coral.wechat.WechatConfig.encodingAESKey=agkC7tsPUoOtbbUyxxcCLVJZVqVOCTeJgxUCXAx87op
# 是否加密
coral.wechat.WechatConfig.messageEncrypt=false
# 微信授权回调地址
# 数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/cihai
spring.datasource.username=root
# 加密后的密码
spring.datasource.password=oeIOLg5LNEaK9BSQiwmjwdfkVksUrrt6kgBdEoONs3X4gZQN1TmweFerGfm8Jt+Cj94RxFumQ3N733MRlF4uoA==
# 加密时的公钥
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKk6Fd6Bnc5NWXx5PSkdRwVxhG9WPGnvhQZJYtjy1+ug2ivEvwGValq0z3BDmA0uy3NBx9iOkPEWdGS24M6g3cMCAwEAAQ==
# 日志
logging.level.root=error
logging.level.com.dookay.coral.common.core=info
logging.level.com.dookay.coral.common.web=info
logging.level.com.dookay.cihai=info
logging.file=/data/www/log/cihai.log
# redis
spring.redis.host=127.0.0.1
spring.redis.password=sZ17ZaA9
# 文件存储
coral.web.resource.mapping.uploads-inner=/uploads/*
coral.web.resource.mapping.uploads-mapping=/data/www/uploads/cihai
#wechat config
#AppID
coral.wechat.WechatConfig.appId=wx319ed3575ffe9ff8
#AppSecret
coral.wechat.WechatConfig.appSecret=eed9c0728fb20521bb61be4ac6e4e67d
#Token(令牌)
coral.wechat.WechatConfig.token=eGgg3CoOihZQwCf1sr8jU8zmBfx4u5WT
#EncodingAESKey(消息加解密密钥)
coral.wechat.WechatConfig.encodingAESKey=agkC7tsPUoOtbbUyxxcCLVJZVqVOCTeJgxUCXAx87op
# 是否加密
coral.wechat.WechatConfig.messageEncrypt=false
# 微信授权回调地址
# 打开 gzip
server.compression.enabled=true
# 数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/cihai
spring.datasource.username=root
# 加密后的密码
spring.datasource.password=oeIOLg5LNEaK9BSQiwmjwdfkVksUrrt6kgBdEoONs3X4gZQN1TmweFerGfm8Jt+Cj94RxFumQ3N733MRlF4uoA==
# 加密时的公钥
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKk6Fd6Bnc5NWXx5PSkdRwVxhG9WPGnvhQZJYtjy1+ug2ivEvwGValq0z3BDmA0uy3NBx9iOkPEWdGS24M6g3cMCAwEAAQ==
# 日志
logging.level.root=warn
logging.level.com.dookay.coral.common.core=debug
logging.level.com.dookay.coral.common.web=debug
logging.level.com.dookay.front=debug
logging.level.com.dookay.core=debug
logging.file=/data/www/log/cihai.log
# redis
spring.redis.host=127.0.0.1
spring.redis.password=sZ17ZaA9
# 文件存储
coral.web.resource.mapping.uploads-inner=/uploads/*
coral.web.resource.mapping.uploads-mapping=/data/www/uploads/cihai
#wechat config
#AppID
coral.wechat.WechatConfig.appId=wx319ed3575ffe9ff8
#AppSecret
coral.wechat.WechatConfig.appSecret=eed9c0728fb20521bb61be4ac6e4e67d
#Token(令牌)
coral.wechat.WechatConfig.token=eGgg3CoOihZQwCf1sr8jU8zmBfx4u5WT
#EncodingAESKey(消息加解密密钥)
coral.wechat.WechatConfig.encodingAESKey=agkC7tsPUoOtbbUyxxcCLVJZVqVOCTeJgxUCXAx87op
# 是否加密
coral.wechat.WechatConfig.messageEncrypt=false
# 微信授权回调地址
# 打开 gzip
server.compression.enabled=true
# 通用配置
spring.profiles.active=dev
# druid性能相关配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=50
spring.datasource.druid.min-idle=5
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.validation-query=select 1
spring.datasource.druid.max-wait=5000
spring.datasource.druid.time-between-eviction-runs-millis=600000
spring.datasource.druid.min-evictable-idle-time-millis=1800000
# druid解密配置
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
spring.datasource.druid.filter.config.enabled=true
# 关闭druid监控
spring.datasource.druid.filter.stat.enabled=false
# mybatis插件配置
# 设置扫描 mapper xml路径
mapper.mappers=com.dookay.coral.common.core.persistence.Mapper
mybatis.mapper-locations=classpath*:mapper/*.xml
# jsp页面配置
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
# 错误页面
coral.web.view.error.not-found=404
coral.web.view.error.bad-request=400
coral.web.view.error.internal-error=500
coral.web.view.error.service=service
coral.web.view.error.other=other
security.basic.enabled=false
security.enable-csrf=false
server.jetty.max-http-post-size=20971520
# 映射
spring.resources.static-locations=/static/
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="/WEB-INF/jsp/include/header.jsp">
<jsp:param name="pageTitle" value="coral-list"/>
</jsp:include>
<h1>400</h1>
<p>${error.get("status")}</p>
<p>${error.get("code")}</p>
<p>${error.get("message")}</p>
<p>${error.get("path")}</p>
<p>${error.get("errorDetail")}</p>
<jsp:include page="/WEB-INF/jsp/include/footer.jsp"/>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="/WEB-INF/jsp/include/header.jsp">
<jsp:param name="pageTitle" value="coral-list"/>
</jsp:include>
<h1>404</h1>
<p>${error.get("status")}</p>
<p>${error.get("code")}</p>
<p>${error.get("message")}</p>
<p>${error.get("path")}</p>
<p>${error.get("errorDetail")}</p>
<jsp:include page="/WEB-INF/jsp/include/footer.jsp"/>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="/WEB-INF/jsp/include/header.jsp">
<jsp:param name="pageTitle" value="coral-list"/>
</jsp:include>
<h1>500</h1>
<p>${error.get("status")}</p>
<p>${error.get("code")}</p>
<p>${error.get("message")}</p>
<p>${error.get("path")}</p>
<p>${error.get("errorDetail")}</p>
<jsp:include page="/WEB-INF/jsp/include/footer.jsp"/>
<%@ page import="org.apache.commons.lang3.time.DateFormatUtils" %>
<%@ page import="java.util.Date" %>
<jsp:useBean id="oneDayCharacter" scope="request" type="com.dookay.cihai.core.word.dto.OneCharacterDTO"/>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="/WEB-INF/jsp/include/header.jsp">
<jsp:param name="pageTitle" value="首页"/>
</jsp:include>
<div class="wrapper-index">
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="index.html">
<img src="images/logo.png">
</a>
</div>
<div class="navbar-collapse">
<form class="navbar-form clearfix">
<div class="navbar-main-list">
<span class="icon icon-search"></span>
<a href="#">语词</a>
<a href="#">哲学</a>
<a href="#">社会</a>
<a href="#">民族</a>
<a href="#">历史</a>
<a href="#">地理</a>
<a href="#">文学</a>
<a href="#">艺术</a>
<a href="#">生命</a>
<a href="#">农业</a>
<a href="#">医学</a>
<a href="#">科技</a>
</div>
</form>
<ul class="nav navbar-nav navbar-right">
<li>
<a class="btn btn-primary" href="#">登录</a>
</li>
<li>
<a class="btn btn-default" href="#">注册</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container-fluid search-main">
<form class="navbar-form clearfix j_search_form" action="/home/search" method="GET">
<div class="logo-search">
<a>
<img class="img-responsive" src="images/logo-search.png">
</a>
</div>
<div class="search-main-input-wrapper">
<div class="search-main-input-inner clearfix">
<div class="form-group input-group-lg">
<input class="form-control j_search_content" name="keyword" type="text">
<%--<button class="btn navbar-search-camera j_image_serch" type="button">--%>
<%--<div class="icon icon-camera"></div>--%>
<%--</button>--%>
<%--<button class="btn navbar-search-microphone" type="button">--%>
<%--<div class="icon icon-microphone"></div>--%>
<%--</button>--%>
</div>
<button class="btn btn-inverse btn-lg" type="submit">搜索</button>
</div>
</div>
<a class="btn btn-link btn-lg" type="button">搜索助手
<span class="icon icon-help"></span>
</a>
</form>
</div>
<div class="push-main">
<div class="container-fluid">
<div class="row">
<div class="col-lg-11 col-lg-push-6 col-xs-24">
<div class="card">
<div class="card-title">每日一字</div>
<div class="card-title">推荐词条</div>
<div class="card-main">
<div class="card-col card-character">
<div class="card-character-main">
<a href="/word/${oneDayCharacter.word}">${oneDayCharacter.word}</a>
<div class="card-character-voice">
<div class="icon icon-horn"></div>
</div>
</div>
<div class="card-character-date"><%=DateFormatUtils.format(new Date(), "yyyy/MM/dd")%>
</div>
</div>
<div class="card-col card-word">
<div class="card-word-value">春节</div>
<div class="card-word-content">
<div class="card-word-desc">中国民间最隆重的传统节日。
<br>时间在每年夏历元旦,即正月初一。
</div>
<div class="card-word-metas">对联 / 福 / 中秋节 / 团圆节</div>
</div>
<div class="card-word-share">
<div class="icon icon-share"></div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-6 col-lg-pull-11 col-xs-12">
<div class="card">
<div class="card-title">知识专题</div>
<div class="card-main">
<div class="theme clearfix">
<a class="theme-cell" href="javascript:;">中国特色社会主义</a>
<a class="theme-cell" href="javascript:;">心脏</a>
<a class="theme-cell" href="javascript:;">一般天文数据</a>
<a class="theme-cell" href="javascript:;">中国历史朝代</a>
<a class="theme-refresh" href="javascript:;">
<div class="icon icon-refresh"></div>
</a>
</div>
</div>
</div>
</div>
<div class="col-lg-7 col-xs-12">
<div class="card">
<div class="card-title">历史上的今天</div>
<div class="card-main">
<div class="card-history">
<div class="card-calendar">
<span class="prev">前</span>
<span class="current"><%=DateFormatUtils.format(new Date(), "yyyy年M月d日")%></span>
<img src="images/calendar.png">
<span class="next">后</span>
</div>
<div class="card-history-list">
<div class="card-history-item">2004年<%=DateFormatUtils.format(new Date(), "M月d日")%>人类第一次进行从彗星核中取样</div>
<div class="card-history-item">2001年<%=DateFormatUtils.format(new Date(), "M月d日")%>金门与厦门之间 两岸“小三通”首航</div>
<div class="card-history-item">1997年<%=DateFormatUtils.format(new Date(), "M月d日")%>科菲·安南正式就任联合国秘书长</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer-main">
<div class="qr">
<a href="#">
<span class="icon icon-qr"></span>
</a>
</div>
<p class="copyright">Copyright © 2006-2018 上海辞书出版社有限公司
<a class="beian" href="#" target="_blank">沪ICP备12009386号-3</a>
</p>
</footer>
</div>
</div>
</div>
<jsp:include page="/WEB-INF/jsp/include/footer.jsp"/>
<script>
$(function () {
$('.j_search_form').ajaxSubmitForm({
success: function ($form, data) {
if(data.code ==="OK"){
location.href = '/word/' + data.data.wordId;
}
else{
$.tip(data.message);
}
},
});
})
</script>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--添加此行消除额外空格--%>
<%@ page trimDirectiveWhitespaces="true" %>
<%--添加此行消除额外空格--%>
<script src="js/plugins/jquery.min.js"></script>
<script src="js/vendor.js" merge="true"></script>
<script src="js/backend.js"></script>
<script src="js/layer/layer.js"></script>
<script src="js/plugins/validator/jquery.validator.js"></script>
<script>
$(function () {
backEndApp.init();
})
</script>
</body>
</html>
\ No newline at end of file
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--添加此行消除额外空格--%>
<%@ page trimDirectiveWhitespaces="true" %>
<%--添加此行消除额外空格--%>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit">
<title>辞海-${param.pageTitle}</title>
<link rel="stylesheet" href="css/vendor.css">
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="cl" uri="coral-list" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
\ No newline at end of file
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="/WEB-INF/jsp/include/header.jsp">
<jsp:param name="pageTitle" value="coral-list"/>
</jsp:include>
<h1>other error</h1>
<p>${error.get("status")}</p>
<p>${error.get("code")}</p>
<p>${error.get("message")}</p>
<p>${error.get("path")}</p>
<p>${error.get("errorDetail")}</p>
<jsp:include page="/WEB-INF/jsp/include/footer.jsp"/>
<%--@elvariable id="error" type="java.util.Map"--%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="/WEB-INF/jsp/include/header.jsp">
<jsp:param name="pageTitle" value="coral-list"/>
</jsp:include>
<h1>service error</h1>
<p>${error.get("status")}</p>
<p>${error.get("code")}</p>
<p>${error.get("message")}</p>
<p>${error.get("path")}</p>
<p>${error.get("errorDetail")}</p>
<jsp:include page="/WEB-INF/jsp/include/footer.jsp"/>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
\ No newline at end of file
body,html{height:100%}.wrapper-index{position:relative;height:100%;min-height:770px;background:url(../images/bg-index.jpg) top center no-repeat}.wrapper-index .navbar-default{padding:40px 0}.wrapper-index .navbar-default,.wrapper-index .navbar-default .navbar-collapse{background-color:transparent;border-color:transparent}.wrapper-index .navbar-nav{top:18px}.wrapper-index .navbar-form .navbar-main-list{margin-top:20px}.wrapper-index .search-main{position:absolute;top:40%;width:100%!important;margin-top:-80px}.wrapper-index .search-main .navbar-form{width:775px}.wrapper-index .search-main .navbar-form .btn-link{float:left;margin-left:15px}.wrapper-index .search-main .navbar-form .logo-search{text-align:center;width:380px;height:70px;padding-right:150px;margin:0 auto 30px}.wrapper-index .search-main .navbar-form .logo-search img{display:inline-block}.wrapper-index .push-main{position:absolute;width:100%;left:0;top:60%;padding:0 50px}.wrapper-index .push-main .footer-main .qr{float:right;margin-top:-2px}.wrapper-index .push-main .footer-main .qr a:hover .icon-qr{background-image:url(../images/sprite-1.png);background-position:0 0}.wrapper-index .push-main .footer-main .copyright{text-align:left}.wrapper-index .search-main-input-wrapper{float:left;padding:0 6px 4px 0;background:url(../images/bg-search-main-right.png) right 0 no-repeat}.wrapper-index .search-main-input-wrapper .search-main-input-inner{padding:0 0 6px 0;background:url(../images/bg-search-main.png) 4px bottom no-repeat}@media (min-width:1400px){.wrapper-index .navbar-form .navbar-main-list{width:103%;font-size:22px;line-height:30px}.wrapper-index .navbar-form .navbar-main-list .icon-search{margin-top:-4px}.wrapper-index .navbar-form .navbar-main-list a{margin:0 18px}.wrapper-index .navbar .navbar-form{width:1005px}}@media (max-width:1400px){.wrapper-index .container .navbar-form .form-group,.wrapper-index .container-fluid .navbar-form .form-group{width:531px}.wrapper-index .container .navbar-form .form-group .form-control,.wrapper-index .container-fluid .navbar-form .form-group .form-control{width:441px!important}.wrapper-index .container .navbar-form .form-group .btn,.wrapper-index .container-fluid .navbar-form .form-group .btn{width:38px}.wrapper-index .push-main{padding:0 40px}}@media (max-width:1200px){.container-fluid .navbar-header{margin-left:0}.container-fluid .navbar-collapse{margin-right:0}.wrapper-index .push-main{padding:0 10px}}@media (max-width:1200px){.container-fluid .navbar-header{margin-left:-10px}.container-fluid .navbar-collapse{margin-right:0}.wrapper-index .push-main{padding:0}}
\ No newline at end of file
This diff could not be displayed because it is too large.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit">
<title>搜索</title>
<link rel="stylesheet" href="css/vendor.css">
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<div class="wrapper-index">
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="index.html">
<img src="images/logo.png">
</a>
</div>
<div class="navbar-collapse">
<form class="navbar-form clearfix">
<div class="navbar-main-list">
<span class="icon icon-search"></span>
<a href="#">语词</a>
<a href="#">哲学</a>
<a href="#">社会</a>
<a href="#">民族</a>
<a href="#">历史</a>
<a href="#">地理</a>
<a href="#">文学</a>
<a href="#">艺术</a>
<a href="#">生命</a>
<a href="#">农业</a>
<a href="#">医学</a>
<a href="#">科技</a>
</div>
</form>
<ul class="nav navbar-nav navbar-right">
<li>
<a class="btn btn-primary" href="#">登录</a>
</li>
<li>
<a class="btn btn-default" href="#">注册</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container-fluid search-main">
<form class="navbar-form clearfix">
<div class="logo-search">
<a>
<img class="img-responsive" src="images/logo-search.png">
</a>
</div>
<div class="search-main-input-wrapper">
<div class="search-main-input-inner clearfix">
<div class="form-group input-group-lg">
<input class="form-control" type="text">
<button class="btn navbar-search-camera" type="button">
<div class="icon icon-camera"></div>
</button>
<button class="btn navbar-search-microphone" type="button">
<div class="icon icon-microphone"></div>
</button>
</div>
<button class="btn btn-inverse btn-lg" type="button">搜索</button>
</div>
</div>
<a class="btn btn-link btn-lg" type="button">搜索助手
<span class="icon icon-help"></span>
</a>
</form>
</div>
<div class="push-main">
<div class="container-fluid">
<div class="row">
<div class="col-lg-11 col-lg-push-6 col-xs-24">
<div class="card">
<div class="card-title">每日一字</div>
<div class="card-title">推荐词条</div>
<div class="card-main">
<div class="card-col card-character">
<div class="card-character-main">
<a href="javascript:;"></a>
<div class="card-character-voice">
<div class="icon icon-horn"></div>
</div>
</div>
<div class="card-character-date">2018/01/2</div>
</div>
<div class="card-col card-word">
<div class="card-word-value">春节</div>
<div class="card-word-content">
<div class="card-word-desc">中国民间最隆重的传统节日。
<br>时间在每年夏历元旦,即正月初一。</div>
<div class="card-word-metas">对联 / 福 / 中秋节 / 团圆节</div>
</div>
<div class="card-word-share">
<div class="icon icon-share"></div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-6 col-lg-pull-11 col-xs-12">
<div class="card">
<div class="card-title">知识专题</div>
<div class="card-main">
<div class="theme clearfix">
<a class="theme-cell" href="javascript:;">中国特色社会主义</a>
<a class="theme-cell" href="javascript:;">心脏</a>
<a class="theme-cell" href="javascript:;">一般天文数据</a>
<a class="theme-cell" href="javascript:;">中国历史朝代</a>
<a class="theme-refresh" href="javascript:;">
<div class="icon icon-refresh"></div>
</a>
</div>
</div>
</div>
</div>
<div class="col-lg-7 col-xs-12">
<div class="card">
<div class="card-title">历史上的今天</div>
<div class="card-main">
<div class="card-history">
<div class="card-calendar">
<span class="prev"></span>
<span class="current">2018年1月2日</span>
<img src="images/calendar.png">
<span class="next"></span>
</div>
<div class="card-history-list">
<div class="card-history-item">2004年1月2日人类第一次进行从彗星核中取样</div>
<div class="card-history-item">2001年1月2日金门与厦门之间 两岸“小三通”首航</div>
<div class="card-history-item">1997年1月2日科菲·安南正式就任联合国秘书长</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer-main">
<div class="qr">
<a href="#">
<span class="icon icon-qr"></span>
</a>
</div>
<p class="copyright">Copyright © 2006-2016 上海辞书出版社有限公司
<a class="beian" href="#" target="_blank">沪ICP备12009386号-3</a>
</p>
</footer>
</div>
</div>
</div>
<script src="js/plugins/jquery.min.js"></script>
<script src="js/vendor.js" merge="true"></script>
</body>
</html>
\ No newline at end of file
var commonApp = function () {
/**
* 页面图片展示
* @param gallerySelector string class类名
* @private
*/
var _initPhotoSwipeFromDOM = function(gallerySelector) {
var parseThumbnailElements = function(el) {
var thumbElements = el.childNodes,
numNodes = thumbElements.length,
items = [],
figureEl,
linkEl,
size,
item;
for(var i = 0; i < numNodes; i++) {
figureEl = thumbElements[i];
if(figureEl.nodeType !== 1) {
continue;
}
linkEl = figureEl.children[0];
size = linkEl.getAttribute('data-size').split('x');
item = {
src: linkEl.getAttribute('href'),
//msrc:$(linkEl).find('img').attr('src'),
w: parseInt(size[0], 10),
h: parseInt(size[1], 10)
};
if(figureEl.children.length > 1) {
item.title = figureEl.children[1].innerHTML;
}
if(linkEl.children.length > 0) {
item.msrc = linkEl.children[0].getAttribute('src');
}
item.el = figureEl;
items.push(item);
}
return items;
};
var closest = function closest(el, fn) {
return el && ( fn(el) ? el : closest(el.parentNode, fn) );
};
var onThumbnailsClick = function(e) {
e = e || window.event;
e.preventDefault ? e.preventDefault() : e.returnValue = false;
var eTarget = e.target || e.srcElement;
var clickedListItem = closest(eTarget, function(el) {
return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
});
if(!clickedListItem) {
return;
}
var clickedGallery = clickedListItem.parentNode,
childNodes = clickedListItem.parentNode.childNodes,
numChildNodes = childNodes.length,
nodeIndex = 0,
index;
for (var i = 0; i < numChildNodes; i++) {
if(childNodes[i].nodeType !== 1) {
continue;
}
if(childNodes[i] === clickedListItem) {
index = nodeIndex;
break;
}
nodeIndex++;
}
if(index >= 0) {
openPhotoSwipe( index, clickedGallery );
}
return false;
};
var photoswipeParseHash = function() {
var hash = window.location.hash.substring(1),
params = {};
if(hash.length < 5) {
return params;
}
var vars = hash.split('&');
for (var i = 0; i < vars.length; i++) {
if(!vars[i]) {
continue;
}
var pair = vars[i].split('=');
if(pair.length < 2) {
continue;
}
params[pair[0]] = pair[1];
}
if(params.gid) {
params.gid = parseInt(params.gid, 10);
}
return params;
};
var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
var pswpElement = document.querySelectorAll('.pswp')[0],
gallery,
options,
items;
items = parseThumbnailElements(galleryElement);
options = {
shareEl:false,
errorMsg:'<div class="pswp__error-msg">无法加载<a href="%url%" target="_blank">图片</a>。</div>',
galleryUID: galleryElement.getAttribute('data-pswp-uid'),
getThumbBoundsFn: function(index) {
var thumbnail = items[index].el.getElementsByTagName('img')[0],
pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
rect = thumbnail.getBoundingClientRect();
return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
}
};
if(fromURL) {
if(options.galleryPIDs) {
for(var j = 0; j < items.length; j++) {
if(items[j].pid === index) {
options.index = j;
break;
}
}
} else {
options.index = parseInt(index, 10) - 1;
}
} else {
options.index = parseInt(index, 10);
}
if( isNaN(options.index) ) {
return;
}
if(disableAnimation) {
options.showAnimationDuration = 0;
}
gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
gallery.init();
};
var galleryElements = document.querySelectorAll( gallerySelector );
for(var i = 0, l = galleryElements.length; i < l; i++) {
galleryElements[i].setAttribute('data-pswp-uid', i+1);
galleryElements[i].onclick = onThumbnailsClick;
}
var hashData = photoswipeParseHash();
if(hashData.pid && hashData.gid) {
openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true );
}
};
return {
photoSwipeFromDom:_initPhotoSwipeFromDOM
}
}();
\ No newline at end of file
/*! layer弹层组件拓展类 */
;!function(){layer.use("skin/layer.ext.css",function(){layer.layui_layer_extendlayerextjs=!0});var a=layer.cache||{},b=function(b){return a.skin?" "+a.skin+" "+a.skin+"-"+b:""};layer.prompt=function(a,c){a=a||{},"function"==typeof a&&(c=a);var d,e=2==a.formType?'<textarea class="layui-layer-input">'+(a.value||"")+"</textarea>":function(){return'<input type="'+(1==a.formType?"password":"text")+'" class="layui-layer-input" value="'+(a.value||"")+'">'}();return layer.open($.extend({btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],content:e,skin:"layui-layer-prompt"+b("prompt"),success:function(a){d=a.find(".layui-layer-input"),d.focus()},yes:function(b){var e=d.val();""===e?d.focus():e.length>(a.maxlength||500)?layer.tips("&#x6700;&#x591A;&#x8F93;&#x5165;"+(a.maxlength||500)+"&#x4E2A;&#x5B57;&#x6570;",d,{tips:1}):c&&c(e,b,d)}},a))},layer.tab=function(a){a=a||{};var c=a.tab||{};return layer.open($.extend({type:1,skin:"layui-layer-tab"+b("tab"),title:function(){var a=c.length,b=1,d="";if(a>0)for(d='<span class="layui-layer-tabnow">'+c[0].title+"</span>";a>b;b++)d+="<span>"+c[b].title+"</span>";return d}(),content:'<ul class="layui-layer-tabmain">'+function(){var a=c.length,b=1,d="";if(a>0)for(d='<li class="layui-layer-tabli xubox_tab_layer">'+(c[0].content||"no content")+"</li>";a>b;b++)d+='<li class="layui-layer-tabli">'+(c[b].content||"no content")+"</li>";return d}()+"</ul>",success:function(a){var b=a.find(".layui-layer-title").children(),c=a.find(".layui-layer-tabmain").children();b.on("mousedown",function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0;var b=$(this),d=b.index();b.addClass("layui-layer-tabnow").siblings().removeClass("layui-layer-tabnow"),c.eq(d).show().siblings().hide()})}},a))},layer.photos=function(a,c,d){function e(a,b,c){var d=new Image;d.onload=function(){d.onload=null,b(d)},d.onerror=function(a){d.onload=null,c(a)},d.src=a}var f={};if(a=a||{},a.photos){var g=a.photos.constructor===Object,h=g?a.photos:{},i=h.data||[],j=h.start||0;if(f.imgIndex=j+1,g){if(0===i.length)return void layer.msg("&#x6CA1;&#x6709;&#x56FE;&#x7247;")}else{var k=$(a.photos),l=k.find(a.img||"img");if(0===l.length)return;if(c||k.find(h.img||"img").each(function(b){var c=$(this);i.push({alt:c.attr("alt"),pid:c.attr("layer-pid"),src:c.attr("layer-src")||c.attr("src"),thumb:c.attr("src")}),c.on("click",function(){layer.photos($.extend(a,{photos:{start:b,data:i,tab:a.tab},full:a.full}),!0)})}),!c)return}f.imgprev=function(a){f.imgIndex--,f.imgIndex<1&&(f.imgIndex=i.length),f.tabimg(a)},f.imgnext=function(a){f.imgIndex++,f.imgIndex>i.length&&(f.imgIndex=1),f.tabimg(a)},f.keyup=function(a){if(!f.end){var b=a.keyCode;a.preventDefault(),37===b?f.imgprev(!0):39===b?f.imgnext(!0):27===b&&layer.close(f.index)}},f.tabimg=function(b){i.length<=1||(h.start=f.imgIndex-1,layer.close(f.index),layer.photos(a,!0,b))},f.event=function(){f.bigimg.hover(function(){f.imgsee.show()},function(){f.imgsee.hide()}),f.bigimg.find(".layui-layer-imgprev").on("click",function(a){a.preventDefault(),f.imgprev()}),f.bigimg.find(".layui-layer-imgnext").on("click",function(a){a.preventDefault(),f.imgnext()}),$(document).on("keyup",f.keyup)},f.loadi=layer.load(1,{shade:"shade"in a?!1:.9,scrollbar:!1}),e(i[j].src,function(c){layer.close(f.loadi),f.index=layer.open($.extend({type:1,area:function(){var b=[c.width,c.height],d=[$(window).width()-100,$(window).height()-100];return!a.full&&b[0]>d[0]&&(b[0]=d[0],b[1]=b[0]*d[1]/b[0]),[b[0]+"px",b[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,shift:5*Math.random()|0,skin:"layui-layer-photos"+b("photos"),content:'<div class="layui-layer-phimg"><img src="'+i[j].src+'" alt="'+(i[j].alt||"")+'" layer-pid="'+i[j].pid+'"><div class="layui-layer-imgsee">'+(i.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(d?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(i[j].alt||"")+"</a><em>"+f.imgIndex+"/"+i.length+"</em></span></div></div></div>",success:function(b,c){f.bigimg=b.find(".layui-layer-phimg"),f.imgsee=b.find(".layui-layer-imguide,.layui-layer-imgbar"),f.event(b),a.tab&&a.tab(i[j],b)},end:function(){f.end=!0,$(document).off("keyup",f.keyup)}},a))},function(){layer.close(f.loadi),layer.msg("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;",{time:2e3},function(){i.length>1&&f.imgnext(!0)})})}}}();
\ No newline at end of file
body .selectCountry {
background-color: rgba(0,0,0,.8);
}
\ No newline at end of file
/* ========================================================================
* Bootstrap: affix.js v3.3.7
* http://getbootstrap.com/javascript/#affix
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// AFFIX CLASS DEFINITION
// ======================
var Affix = function (element, options) {
this.options = $.extend({}, Affix.DEFAULTS, options)
this.$target = $(this.options.target)
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
this.$element = $(element)
this.affixed = null
this.unpin = null
this.pinnedOffset = null
this.checkPosition()
}
Affix.VERSION = '3.3.7'
Affix.RESET = 'affix affix-top affix-bottom'
Affix.DEFAULTS = {
offset: 0,
target: window
}
Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
var targetHeight = this.$target.height()
if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
if (this.affixed == 'bottom') {
if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
}
var initializing = this.affixed == null
var colliderTop = initializing ? scrollTop : position.top
var colliderHeight = initializing ? targetHeight : height
if (offsetTop != null && scrollTop <= offsetTop) return 'top'
if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
return false
}
Affix.prototype.getPinnedOffset = function () {
if (this.pinnedOffset) return this.pinnedOffset
this.$element.removeClass(Affix.RESET).addClass('affix')
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
return (this.pinnedOffset = position.top - scrollTop)
}
Affix.prototype.checkPositionWithEventLoop = function () {
setTimeout($.proxy(this.checkPosition, this), 1)
}
Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return
var height = this.$element.height()
var offset = this.options.offset
var offsetTop = offset.top
var offsetBottom = offset.bottom
var scrollHeight = Math.max($(document).height(), $(document.body).height())
if (typeof offset != 'object') offsetBottom = offsetTop = offset
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
if (this.affixed != affix) {
if (this.unpin != null) this.$element.css('top', '')
var affixType = 'affix' + (affix ? '-' + affix : '')
var e = $.Event(affixType + '.bs.affix')
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
this.affixed = affix
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
this.$element
.removeClass(Affix.RESET)
.addClass(affixType)
.trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
}
if (affix == 'bottom') {
this.$element.offset({
top: scrollHeight - height - offsetBottom
})
}
}
// AFFIX PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.affix')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.affix
$.fn.affix = Plugin
$.fn.affix.Constructor = Affix
// AFFIX NO CONFLICT
// =================
$.fn.affix.noConflict = function () {
$.fn.affix = old
return this
}
// AFFIX DATA-API
// ==============
$(window).on('load', function () {
$('[data-spy="affix"]').each(function () {
var $spy = $(this)
var data = $spy.data()
data.offset = data.offset || {}
if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
if (data.offsetTop != null) data.offset.top = data.offsetTop
Plugin.call($spy, data)
})
})
}(jQuery);
/* ========================================================================
* Bootstrap: alert.js v3.3.7
* http://getbootstrap.com/javascript/#alerts
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// ALERT CLASS DEFINITION
// ======================
var dismiss = '[data-dismiss="alert"]'
var Alert = function (el) {
$(el).on('click', dismiss, this.close)
}
Alert.VERSION = '3.3.7'
Alert.TRANSITION_DURATION = 150
Alert.prototype.close = function (e) {
var $this = $(this)
var selector = $this.attr('data-target')
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
}
var $parent = $(selector === '#' ? [] : selector)
if (e) e.preventDefault()
if (!$parent.length) {
$parent = $this.closest('.alert')
}
$parent.trigger(e = $.Event('close.bs.alert'))
if (e.isDefaultPrevented()) return
$parent.removeClass('in')
function removeElement() {
// detach from parent, fire event then clean up data
$parent.detach().trigger('closed.bs.alert').remove()
}
$.support.transition && $parent.hasClass('fade') ?
$parent
.one('bsTransitionEnd', removeElement)
.emulateTransitionEnd(Alert.TRANSITION_DURATION) :
removeElement()
}
// ALERT PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.alert')
if (!data) $this.data('bs.alert', (data = new Alert(this)))
if (typeof option == 'string') data[option].call($this)
})
}
var old = $.fn.alert
$.fn.alert = Plugin
$.fn.alert.Constructor = Alert
// ALERT NO CONFLICT
// =================
$.fn.alert.noConflict = function () {
$.fn.alert = old
return this
}
// ALERT DATA-API
// ==============
$(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
}(jQuery);
/* ========================================================================
* Bootstrap: carousel.js v3.3.7
* http://getbootstrap.com/javascript/#carousel
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// CAROUSEL CLASS DEFINITION
// =========================
var Carousel = function (element, options) {
this.$element = $(element)
this.$indicators = this.$element.find('.carousel-indicators')
this.options = options
this.paused = null
this.sliding = null
this.interval = null
this.$active = null
this.$items = null
this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
.on('mouseenter.bs.carousel', $.proxy(this.pause, this))
.on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
}
Carousel.VERSION = '3.3.7'
Carousel.TRANSITION_DURATION = 600
Carousel.DEFAULTS = {
interval: 5000,
pause: 'hover',
wrap: true,
keyboard: true
}
Carousel.prototype.keydown = function (e) {
if (/input|textarea/i.test(e.target.tagName)) return
switch (e.which) {
case 37: this.prev(); break
case 39: this.next(); break
default: return
}
e.preventDefault()
}
Carousel.prototype.cycle = function (e) {
e || (this.paused = false)
this.interval && clearInterval(this.interval)
this.options.interval
&& !this.paused
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
return this
}
Carousel.prototype.getItemIndex = function (item) {
this.$items = item.parent().children('.item')
return this.$items.index(item || this.$active)
}
Carousel.prototype.getItemForDirection = function (direction, active) {
var activeIndex = this.getItemIndex(active)
var willWrap = (direction == 'prev' && activeIndex === 0)
|| (direction == 'next' && activeIndex == (this.$items.length - 1))
if (willWrap && !this.options.wrap) return active
var delta = direction == 'prev' ? -1 : 1
var itemIndex = (activeIndex + delta) % this.$items.length
return this.$items.eq(itemIndex)
}
Carousel.prototype.to = function (pos) {
var that = this
var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
if (pos > (this.$items.length - 1) || pos < 0) return
if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
if (activeIndex == pos) return this.pause().cycle()
return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
}
Carousel.prototype.pause = function (e) {
e || (this.paused = true)
if (this.$element.find('.next, .prev').length && $.support.transition) {
this.$element.trigger($.support.transition.end)
this.cycle(true)
}
this.interval = clearInterval(this.interval)
return this
}
Carousel.prototype.next = function () {
if (this.sliding) return
return this.slide('next')
}
Carousel.prototype.prev = function () {
if (this.sliding) return
return this.slide('prev')
}
Carousel.prototype.slide = function (type, next) {
var $active = this.$element.find('.item.active')
var $next = next || this.getItemForDirection(type, $active)
var isCycling = this.interval
var direction = type == 'next' ? 'left' : 'right'
var that = this
if ($next.hasClass('active')) return (this.sliding = false)
var relatedTarget = $next[0]
var slideEvent = $.Event('slide.bs.carousel', {
relatedTarget: relatedTarget,
direction: direction
})
this.$element.trigger(slideEvent)
if (slideEvent.isDefaultPrevented()) return
this.sliding = true
isCycling && this.pause()
if (this.$indicators.length) {
this.$indicators.find('.active').removeClass('active')
var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
$nextIndicator && $nextIndicator.addClass('active')
}
var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
if ($.support.transition && this.$element.hasClass('slide')) {
$next.addClass(type)
$next[0].offsetWidth // force reflow
$active.addClass(direction)
$next.addClass(direction)
$active
.one('bsTransitionEnd', function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
setTimeout(function () {
that.$element.trigger(slidEvent)
}, 0)
})
.emulateTransitionEnd(Carousel.TRANSITION_DURATION)
} else {
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger(slidEvent)
}
isCycling && this.cycle()
return this
}
// CAROUSEL PLUGIN DEFINITION
// ==========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.carousel')
var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
var action = typeof option == 'string' ? option : options.slide
if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option)
else if (action) data[action]()
else if (options.interval) data.pause().cycle()
})
}
var old = $.fn.carousel
$.fn.carousel = Plugin
$.fn.carousel.Constructor = Carousel
// CAROUSEL NO CONFLICT
// ====================
$.fn.carousel.noConflict = function () {
$.fn.carousel = old
return this
}
// CAROUSEL DATA-API
// =================
var clickHandler = function (e) {
var href
var $this = $(this)
var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
if (!$target.hasClass('carousel')) return
var options = $.extend({}, $target.data(), $this.data())
var slideIndex = $this.attr('data-slide-to')
if (slideIndex) options.interval = false
Plugin.call($target, options)
if (slideIndex) {
$target.data('bs.carousel').to(slideIndex)
}
e.preventDefault()
}
$(document)
.on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
.on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
$(window).on('load', function () {
$('[data-ride="carousel"]').each(function () {
var $carousel = $(this)
Plugin.call($carousel, $carousel.data())
})
})
}(jQuery);
/* ========================================================================
* Bootstrap: modal.js v3.3.7
* http://getbootstrap.com/javascript/#modals
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// MODAL CLASS DEFINITION
// ======================
var Modal = function (element, options) {
this.options = options
this.$body = $(document.body)
this.$element = $(element)
this.$dialog = this.$element.find('.modal-dialog')
this.$backdrop = null
this.isShown = null
this.originalBodyPad = null
this.scrollbarWidth = 0
this.ignoreBackdropClick = false
if (this.options.remote) {
this.$element
.find('.modal-content')
.load(this.options.remote, $.proxy(function () {
this.$element.trigger('loaded.bs.modal')
}, this))
}
}
Modal.VERSION = '3.3.7'
Modal.TRANSITION_DURATION = 300
Modal.BACKDROP_TRANSITION_DURATION = 150
Modal.DEFAULTS = {
backdrop: true,
keyboard: true,
show: true
}
Modal.prototype.toggle = function (_relatedTarget) {
return this.isShown ? this.hide() : this.show(_relatedTarget)
}
Modal.prototype.show = function (_relatedTarget) {
var that = this
var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
this.$element.trigger(e)
if (this.isShown || e.isDefaultPrevented()) return
this.isShown = true
this.checkScrollbar()
this.setScrollbar()
this.$body.addClass('modal-open')
this.escape()
this.resize()
this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
this.$dialog.on('mousedown.dismiss.bs.modal', function () {
that.$element.one('mouseup.dismiss.bs.modal', function (e) {
if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
})
})
this.backdrop(function () {
var transition = $.support.transition && that.$element.hasClass('fade')
if (!that.$element.parent().length) {
that.$element.appendTo(that.$body) // don't move modals dom position
}
that.$element
.show()
.scrollTop(0)
that.adjustDialog()
if (transition) {
that.$element[0].offsetWidth // force reflow
}
that.$element.addClass('in')
that.enforceFocus()
var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
transition ?
that.$dialog // wait for modal to slide in
.one('bsTransitionEnd', function () {
that.$element.trigger('focus').trigger(e)
})
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
that.$element.trigger('focus').trigger(e)
})
}
Modal.prototype.hide = function (e) {
if (e) e.preventDefault()
e = $.Event('hide.bs.modal')
this.$element.trigger(e)
if (!this.isShown || e.isDefaultPrevented()) return
this.isShown = false
this.escape()
this.resize()
$(document).off('focusin.bs.modal')
this.$element
.removeClass('in')
.off('click.dismiss.bs.modal')
.off('mouseup.dismiss.bs.modal')
this.$dialog.off('mousedown.dismiss.bs.modal')
$.support.transition && this.$element.hasClass('fade') ?
this.$element
.one('bsTransitionEnd', $.proxy(this.hideModal, this))
.emulateTransitionEnd(Modal.TRANSITION_DURATION) :
this.hideModal()
}
Modal.prototype.enforceFocus = function () {
$(document)
.off('focusin.bs.modal') // guard against infinite focus loop
.on('focusin.bs.modal', $.proxy(function (e) {
if (document !== e.target &&
this.$element[0] !== e.target &&
!this.$element.has(e.target).length) {
this.$element.trigger('focus')
}
}, this))
}
Modal.prototype.escape = function () {
if (this.isShown && this.options.keyboard) {
this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
e.which == 27 && this.hide()
}, this))
} else if (!this.isShown) {
this.$element.off('keydown.dismiss.bs.modal')
}
}
Modal.prototype.resize = function () {
if (this.isShown) {
$(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
} else {
$(window).off('resize.bs.modal')
}
}
Modal.prototype.hideModal = function () {
var that = this
this.$element.hide()
this.backdrop(function () {
that.$body.removeClass('modal-open')
that.resetAdjustments()
that.resetScrollbar()
that.$element.trigger('hidden.bs.modal')
})
}
Modal.prototype.removeBackdrop = function () {
this.$backdrop && this.$backdrop.remove()
this.$backdrop = null
}
Modal.prototype.backdrop = function (callback) {
var that = this
var animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate
this.$backdrop = $(document.createElement('div'))
.addClass('modal-backdrop ' + animate)
.appendTo(this.$body)
this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
if (this.ignoreBackdropClick) {
this.ignoreBackdropClick = false
return
}
if (e.target !== e.currentTarget) return
this.options.backdrop == 'static'
? this.$element[0].focus()
: this.hide()
}, this))
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
this.$backdrop.addClass('in')
if (!callback) return
doAnimate ?
this.$backdrop
.one('bsTransitionEnd', callback)
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
callback()
} else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in')
var callbackRemove = function () {
that.removeBackdrop()
callback && callback()
}
$.support.transition && this.$element.hasClass('fade') ?
this.$backdrop
.one('bsTransitionEnd', callbackRemove)
.emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
callbackRemove()
} else if (callback) {
callback()
}
}
// these following methods are used to handle overflowing modals
Modal.prototype.handleUpdate = function () {
this.adjustDialog()
}
Modal.prototype.adjustDialog = function () {
var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
this.$element.css({
paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
})
}
Modal.prototype.resetAdjustments = function () {
this.$element.css({
paddingLeft: '',
paddingRight: ''
})
}
Modal.prototype.checkScrollbar = function () {
var fullWindowWidth = window.innerWidth
if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
var documentElementRect = document.documentElement.getBoundingClientRect()
fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
}
this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
this.scrollbarWidth = this.measureScrollbar()
}
Modal.prototype.setScrollbar = function () {
var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
this.originalBodyPad = document.body.style.paddingRight || ''
if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
}
Modal.prototype.resetScrollbar = function () {
this.$body.css('padding-right', this.originalBodyPad)
}
Modal.prototype.measureScrollbar = function () { // thx walsh
var scrollDiv = document.createElement('div')
scrollDiv.className = 'modal-scrollbar-measure'
this.$body.append(scrollDiv)
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
this.$body[0].removeChild(scrollDiv)
return scrollbarWidth
}
// MODAL PLUGIN DEFINITION
// =======================
function Plugin(option, _relatedTarget) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.modal')
var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option](_relatedTarget)
else if (options.show) data.show(_relatedTarget)
})
}
var old = $.fn.modal
$.fn.modal = Plugin
$.fn.modal.Constructor = Modal
// MODAL NO CONFLICT
// =================
$.fn.modal.noConflict = function () {
$.fn.modal = old
return this
}
// MODAL DATA-API
// ==============
$(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
var $this = $(this)
var href = $this.attr('href')
var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
if ($this.is('a')) e.preventDefault()
$target.one('show.bs.modal', function (showEvent) {
if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
$target.one('hidden.bs.modal', function () {
$this.is(':visible') && $this.trigger('focus')
})
})
Plugin.call($target, option, this)
})
}(jQuery);
/* ========================================================================
* Bootstrap: popover.js v3.3.7
* http://getbootstrap.com/javascript/#popovers
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// POPOVER PUBLIC CLASS DEFINITION
// ===============================
var Popover = function (element, options) {
this.init('popover', element, options)
}
if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
Popover.VERSION = '3.3.7'
Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
placement: 'right',
trigger: 'click',
content: '',
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
})
// NOTE: POPOVER EXTENDS tooltip.js
// ================================
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
Popover.prototype.constructor = Popover
Popover.prototype.getDefaults = function () {
return Popover.DEFAULTS
}
Popover.prototype.setContent = function () {
var $tip = this.tip()
var title = this.getTitle()
var content = this.getContent()
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
$tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
](content)
$tip.removeClass('fade top bottom left right in')
// IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
// this manually by checking the contents.
if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
}
Popover.prototype.hasContent = function () {
return this.getTitle() || this.getContent()
}
Popover.prototype.getContent = function () {
var $e = this.$element
var o = this.options
return $e.attr('data-content')
|| (typeof o.content == 'function' ?
o.content.call($e[0]) :
o.content)
}
Popover.prototype.arrow = function () {
return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
}
// POPOVER PLUGIN DEFINITION
// =========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.popover')
var options = typeof option == 'object' && option
if (!data && /destroy|hide/.test(option)) return
if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.popover
$.fn.popover = Plugin
$.fn.popover.Constructor = Popover
// POPOVER NO CONFLICT
// ===================
$.fn.popover.noConflict = function () {
$.fn.popover = old
return this
}
}(jQuery);
/* ========================================================================
* Bootstrap: scrollspy.js v3.3.7
* http://getbootstrap.com/javascript/#scrollspy
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// SCROLLSPY CLASS DEFINITION
// ==========================
function ScrollSpy(element, options) {
this.$body = $(document.body)
this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
this.selector = (this.options.target || '') + ' .nav li > a'
this.offsets = []
this.targets = []
this.activeTarget = null
this.scrollHeight = 0
this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
this.refresh()
this.process()
}
ScrollSpy.VERSION = '3.3.7'
ScrollSpy.DEFAULTS = {
offset: 10
}
ScrollSpy.prototype.getScrollHeight = function () {
return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
}
ScrollSpy.prototype.refresh = function () {
var that = this
var offsetMethod = 'offset'
var offsetBase = 0
this.offsets = []
this.targets = []
this.scrollHeight = this.getScrollHeight()
if (!$.isWindow(this.$scrollElement[0])) {
offsetMethod = 'position'
offsetBase = this.$scrollElement.scrollTop()
}
this.$body
.find(this.selector)
.map(function () {
var $el = $(this)
var href = $el.data('target') || $el.attr('href')
var $href = /^#./.test(href) && $(href)
return ($href
&& $href.length
&& $href.is(':visible')
&& [[$href[offsetMethod]().top + offsetBase, href]]) || null
})
.sort(function (a, b) { return a[0] - b[0] })
.each(function () {
that.offsets.push(this[0])
that.targets.push(this[1])
})
}
ScrollSpy.prototype.process = function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
var scrollHeight = this.getScrollHeight()
var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
var offsets = this.offsets
var targets = this.targets
var activeTarget = this.activeTarget
var i
if (this.scrollHeight != scrollHeight) {
this.refresh()
}
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
}
if (activeTarget && scrollTop < offsets[0]) {
this.activeTarget = null
return this.clear()
}
for (i = offsets.length; i--;) {
activeTarget != targets[i]
&& scrollTop >= offsets[i]
&& (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
&& this.activate(targets[i])
}
}
ScrollSpy.prototype.activate = function (target) {
this.activeTarget = target
this.clear()
var selector = this.selector +
'[data-target="' + target + '"],' +
this.selector + '[href="' + target + '"]'
var active = $(selector)
.parents('li')
.addClass('active')
if (active.parent('.dropdown-menu').length) {
active = active
.closest('li.dropdown')
.addClass('active')
}
active.trigger('activate.bs.scrollspy')
}
ScrollSpy.prototype.clear = function () {
$(this.selector)
.parentsUntil(this.options.target, '.active')
.removeClass('active')
}
// SCROLLSPY PLUGIN DEFINITION
// ===========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.scrollspy')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.scrollspy
$.fn.scrollspy = Plugin
$.fn.scrollspy.Constructor = ScrollSpy
// SCROLLSPY NO CONFLICT
// =====================
$.fn.scrollspy.noConflict = function () {
$.fn.scrollspy = old
return this
}
// SCROLLSPY DATA-API
// ==================
$(window).on('load.bs.scrollspy.data-api', function () {
$('[data-spy="scroll"]').each(function () {
var $spy = $(this)
Plugin.call($spy, $spy.data())
})
})
}(jQuery);
/**
* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);
\ No newline at end of file
/*! layer mobile-v2.0.0 Web弹层组件 MIT License http://layer.layui.com/mobile By 贤心 */
;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'<h3 style="'+(e?n.title[1]:"")+'">'+(e?n.title[0]:n.title)+"</h3>":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type="1">'+n.btn[0]+"</span>",2===t&&(e='<span no type="0">'+n.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(n.content||"")+"</p>"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"<div "+("string"==typeof n.shade?'style="'+n.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(n.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(n.skin?"layui-m-layer-"+n.skin+" ":"")+(n.className?n.className:"")+" "+(n.anim?"layui-m-anim-"+n.anim:"")+'" '+(n.style?'style="'+n.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+n.content+"</div>"+c+"</div></div></div>",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i]("layui-m-layershade")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:"2.0",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a("#"+o[0]+e)[0];n&&(n.innerHTML="",t.body.removeChild(n),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute("index"))}},"function"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf("/")+1);n.getAttribute("merge")||document.head.appendChild(function(){var e=t.createElement("link");return e.href=a+"need/layer.css?2.0",e.type="text/css",e.rel="styleSheet",e.id="layermcss",e}())}()}(window);
\ No newline at end of file
.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
This diff could not be displayed because it is too large.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!