main
tamguo 7 years ago
parent 753fff1ce3
commit bf6b8c1166

@ -0,0 +1,72 @@
package com.tamguo.config.shiro;
import java.util.Set;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import com.tamguo.modules.member.model.MemberEntity;
import com.tamguo.modules.member.service.IMemberService;
/**
*
*
*/
public class MemberRealm extends AuthorizingRealm {
@Autowired
private IMemberService iMemberService;
/**
* ()
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
Set<String > permsSet = null;
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setStringPermissions(permsSet);
return info;
}
/**
* ()
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
MemberEntity member = iMemberService.findByUsername(username);
if(member == null) {
throw new UnknownAccountException("用户名或密码有误,请重新输入或找回密码");
}
Integer loginFailureCount = iMemberService.getLoginFailureCount(member);
if(loginFailureCount > 10) {
throw new LockedAccountException("账号被锁定");
}
if(!new Sha256Hash(password).toHex().equals(member.getPassword())){
loginFailureCount++;
iMemberService.updateLoginFailureCount(member , loginFailureCount);
throw new IncorrectCredentialsException("用户名或密码有误,请重新输入或找回密码");
}
// 更新登录时间
iMemberService.updateLastLoginTime(member.getId());
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(member, password, getName());
return info;
}
}

@ -0,0 +1,69 @@
package com.tamguo.config.shiro;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ShiroConfiguration {
private static Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
@Bean(name = "shiroRealm")
public MemberRealm getShiroRealm() {
return new MemberRealm();
}
@Bean(name = "shiroEhcacheManager")
public EhCacheManager getEhCacheManager() {
EhCacheManager em = new EhCacheManager();
em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
return em;
}
@Bean(name = "lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
daap.setProxyTargetClass(true);
return daap;
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
dwsm.setRealm(getShiroRealm());
dwsm.setCacheManager(getEhCacheManager());
return dwsm;
}
@Bean
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
aasa.setSecurityManager(getDefaultWebSecurityManager());
return new AuthorizationAttributeSourceAdvisor();
}
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager());
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/index");
filterChainDefinitionMap.put("/member/**", "authc");
filterChainDefinitionMap.put("/**", "anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
}

@ -23,6 +23,7 @@ public class ThymeleafConfig implements EnvironmentAware{
Map<String, Object> vars = new HashMap<>(); Map<String, Object> vars = new HashMap<>();
vars.put("domainName", env.getProperty("domain.name")); vars.put("domainName", env.getProperty("domain.name"));
vars.put("adminDomain", env.getProperty("admin.domain.name")); vars.put("adminDomain", env.getProperty("admin.domain.name"));
vars.put("memberDomain", env.getProperty("member.domain.name"));
vars.put("PAPER_TYPE_ZHENTI", SystemConstant.ZHENGTI_PAPER_ID); vars.put("PAPER_TYPE_ZHENTI", SystemConstant.ZHENGTI_PAPER_ID);
vars.put("PAPER_TYPE_MONI", SystemConstant.MONI_PAPER_ID); vars.put("PAPER_TYPE_MONI", SystemConstant.MONI_PAPER_ID);
vars.put("PAPER_TYPE_YATI", SystemConstant.YATI_PAPER_ID); vars.put("PAPER_TYPE_YATI", SystemConstant.YATI_PAPER_ID);

@ -0,0 +1,43 @@
package com.tamguo.utils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import com.tamguo.modules.member.model.MemberEntity;
public class ShiroUtils {
public static Session getSession() {
return SecurityUtils.getSubject().getSession();
}
public static Subject getSubject() {
return SecurityUtils.getSubject();
}
public static MemberEntity getMember() {
return (MemberEntity)SecurityUtils.getSubject().getPrincipal();
}
public static String getMemberId() {
return getMember().getId();
}
public static void setSessionAttribute(Object key, Object value) {
getSession().setAttribute(key, value);
}
public static Object getSessionAttribute(Object key) {
return getSession().getAttribute(key);
}
public static boolean isLogin() {
return SecurityUtils.getSubject().getPrincipal() != null;
}
public static void logout() {
SecurityUtils.getSubject().logout();
}
}

@ -47,6 +47,7 @@ public class BookController {
model.addObject("documentList", iDocumentService.selectList(Condition.create().eq("book_id", id).eq("status", DocumentStatusEnum.NORMAL.getValue()).orderAsc(Arrays.asList("create_date")))); model.addObject("documentList", iDocumentService.selectList(Condition.create().eq("book_id", id).eq("status", DocumentStatusEnum.NORMAL.getValue()).orderAsc(Arrays.asList("create_date"))));
return model; return model;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@RequestMapping(value="document/{id}.html" , method=RequestMethod.GET) @RequestMapping(value="document/{id}.html" , method=RequestMethod.GET)

@ -1,9 +1,16 @@
package com.tamguo.web; package com.tamguo.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import com.baomidou.mybatisplus.plugins.Page;
import com.tamguo.modules.book.model.BookEntity;
import com.tamguo.modules.book.service.IBookService;
import com.tamguo.modules.member.model.MemberEntity;
import com.tamguo.modules.member.service.IMemberService;
/** /**
* Controller - * Controller -
* *
@ -12,10 +19,28 @@ import org.springframework.web.servlet.ModelAndView;
*/ */
@Controller @Controller
public class IndexController { public class IndexController {
@Autowired
IBookService iBookService;
@Autowired
IMemberService iMemberService;
@RequestMapping(path= {"index" , "/"}) @RequestMapping(path= {"index" , "/" , "index.html"})
public ModelAndView index(ModelAndView model) { public ModelAndView index(Integer current , ModelAndView model) {
if(current == null) {
current = 1;
}
model.setViewName("index"); model.setViewName("index");
Page<BookEntity> bookPage = iBookService.selectPage(new Page<>(current, 18));
for(BookEntity book : bookPage.getRecords()) {
MemberEntity member = iMemberService.selectById(book.getOwner());
if(member != null) {
book.setMemberName(member.getUsername());
}
}
model.addObject("bookPage", bookPage);
model.setViewName("index");
return model; return model;
} }

@ -0,0 +1,115 @@
package com.tamguo.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
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.servlet.ModelAndView;
import com.tamguo.common.image.CaptchaUtils;
import com.tamguo.common.utils.Result;
import com.tamguo.common.utils.SystemConstant;
import com.tamguo.utils.ShiroUtils;
@Controller
public class LoginController {
@RequestMapping("captcha.jpg")
public void captcha(HttpServletResponse response , HttpSession session) throws ServletException, IOException {
response.setHeader("Cache-Control", "no-store, no-cache");
response.setContentType("image/jpeg");
String a = CaptchaUtils.generateCaptcha(response.getOutputStream());
session.setAttribute(SystemConstant.KAPTCHA_SESSION_KEY, a);
}
@RequestMapping(value = "/login.html", method = RequestMethod.GET)
public ModelAndView login(ModelAndView model){
model.setViewName("login");
model.addObject("isVerifyCode" , "0");
return model;
}
@RequestMapping(value = "/submitLogin.html", method = RequestMethod.POST)
public ModelAndView submitLogin(String username , String password , String verifyCode , ModelAndView model , HttpSession session , HttpServletResponse response) throws IOException{
Result result = Result.successResult(null);
if(StringUtils.isEmpty(verifyCode)) {
result = Result.result(202, null, "请输入验证码");
} else if(StringUtils.isNotEmpty(verifyCode)){
String kaptcha = session.getAttribute(SystemConstant.KAPTCHA_SESSION_KEY).toString();
if (!verifyCode.equalsIgnoreCase(kaptcha)) {
result = Result.result(205, null, "验证码错误");
} else {
Subject subject = ShiroUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
session.setAttribute("currMember", ShiroUtils.getMember());
response.sendRedirect("member/index.html");
return null;
} catch (UnknownAccountException e) {
result = Result.result(201, null, "用户名或密码有误,请重新输入或找回密码");
} catch (IncorrectCredentialsException e) {
result = Result.result(202, null, "用户名或密码有误,请重新输入或找回密码");
} catch (LockedAccountException e) {
result = Result.result(203, null, "账号被锁定");
}
}
}
model.setViewName("login");
model.addObject("code", result.getCode());
model.addObject("msg" , result.getMessage());
model.addObject("username", username);
return model;
}
@RequestMapping(value = "/miniLogin.html", method = RequestMethod.GET)
@ResponseBody
public Result miniLogin(String username , String password , String captcha, ModelAndView model , HttpSession session) {
Result result = null;
if(StringUtils.isEmpty(captcha)) {
result = Result.result(204, null, "请输入验证码");
} else if(StringUtils.isNotEmpty(captcha)){
String kaptcha = session.getAttribute(SystemConstant.KAPTCHA_SESSION_KEY).toString();
if (!captcha.equalsIgnoreCase(kaptcha)) {
result = Result.result(205, null, "验证码错误");
}else {
Subject subject = ShiroUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
session.setAttribute("currMember", ShiroUtils.getMember());
result = Result.successResult(ShiroUtils.getMember());
} catch (UnknownAccountException e) {
result = Result.result(201, null, "用户名或密码有误,请重新输入或找回密码");
} catch (IncorrectCredentialsException e) {
result = Result.result(202, null, "用户名或密码有误,请重新输入或找回密码");
} catch (LockedAccountException e) {
result = Result.result(203, null, "账号被锁定");
}
}
}
return result;
}
@RequestMapping(value = "/isLogin.html", method = RequestMethod.GET)
@ResponseBody
public Result isLogin() {
if(ShiroUtils.isLogin()) {
return Result.result(1, null , "已经登录");
}
return Result.result(0, null, "未登录");
}
}

@ -1,6 +1,7 @@
domain.name=https://book.tamguo.com/ domain.name=https://book.tamguo.com/
admin.domain.name=https://book.tamguo.com/ admin.domain.name=https://admin.tamguo.com/
tamguo.admin.name=https://www.tamguo.com/login tamguo.admin.name=https://www.tamguo.com/
member.domain.name=https://member.tamguo.com/
cookie.domian.name=tamguo.com cookie.domian.name=tamguo.com
server.port=8083 server.port=8083
jasypt.encryptor.password=tamguo jasypt.encryptor.password=tamguo

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

@ -0,0 +1,12 @@
$(function(){
// 首页轮播
$(".content-wp .banner .play-nav li").bind("click",function(event){
$(".content-wp .banner .play-nav li").removeClass("cur");
$(this).addClass("cur");
$(".content-wp .banner .banner-list li").css("z-index","1");
$(".content-wp .banner .banner-list a[data-index='"+$(this).find("a").text()+"']").parent().css("z-index","9");
event.stopPropagation();
});
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,425 @@
/**
* jQuery拖拽 & 弹出层
* API: http://dreamback.github.io/idialog/
* @author: heshimeng1987@qq.com
*/
~function($, window, undefined) {
var win = $(window),
doc = $(document),
ie = $.browser.msie,
version = parseInt($.browser.version),
ie6 = ie && version < 7,
dialog,
dialogZindex = 1e4;
//插入皮肤
(function(){
var script = document.getElementsByTagName('script'),
i = 0,
len = script.length,
link = document.createElement('link'),
theme,
path;
link.setAttribute('rel', 'stylesheet');
for( ; i < len; i++){
theme = script['dialog-theme']||script[i].getAttribute('dialog-theme');
if(theme){
path = (script[i].src||script[i].getAttribute('src'));
path = path.substring(0, path.lastIndexOf('/'))+'/theme/';
link.setAttribute('href', path+theme+'/style.css');
script[i].parentNode.insertBefore(link, script[i]);
break;
}
}
})();
drag = function(target, options) {
return new drag.fn.init(target, options);
};
drag.fn = drag.prototype = {
init: function(options) {
var that = this,
ie6fix = '(document.documentElement || document.body)';
this.target = $(options.target);
options = options || {};
this.root = options.root ? $(options.root) : this.target;
this.min = options.min;
this.max = options.max;
this.start = options.start;
this.move = options.move;
this.end = options.end;
this.fixed = options.fixed;
this.startPosition = {};
this.movePosition = {};
var _down = function(e) {
e = that.fixEvent(e);
that.startPosition = {
x: e.layerX,
y: e.layerY
};
that.start && that.start(that.startPosition);
doc.bind('mousemove', _move)
.bind('mouseup', _end);
this.setCapture && this.setCapture(false); //ie 鼠标移出浏览器依然可以拖拽
e.preventDefault(); //阻止默认行为chrome的拖拽选择文字行为
return false;
},
_move = function(e) {
e = that.fixEvent(e);
that.movePosition = {
x: e.clientX - that.startPosition.x,
y: e.clientY - that.startPosition.y
};
that.limit();
if (that.fixed && ie6) { //IE6 fixed
that.root[0].style.setExpression('left', 'eval(' + ie6fix + '.scrollLeft + ' + (that.movePosition.x - win.scrollLeft()) + ') + "px"');
that.root[0].style.setExpression('top', 'eval(' + ie6fix + '.scrollTop + ' + (that.movePosition.y - win.scrollTop()) + ') + "px"');
} else {
that.root.css({
left: that.movePosition.x,
top: that.movePosition.y
});
}
that.move && that.move(that.movePosition);
return false;
},
_end = function() {
doc.unbind('mousemove', _move)
.unbind('mouseup', _end);
that.end && that.end(that.movePosition);
return false;
};
this.target.bind('mousedown', _down).bind('mouseup', function() {
this.releaseCapture && this.releaseCapture();
});
},
fixEvent: function(e) {
if (!e.pageX) {
e.pageX = e.clientX + win.scrollTop();
e.pageY = e.clientY + win.scrollLeft();
}
if (!e.layerX) {
e.layerX = e.clientX - parseInt(this.root.css('left'));
e.layerY = e.clientY - parseInt(this.root.css('top'));
}
return e;
},
/**
* 限制
*/
limit: function() {
if (this.min !== undefined) {
this.movePosition = {
x: Math.max(this.min.x, this.movePosition.x),
y: Math.max(this.min.y, this.movePosition.y)
};
}
if (this.max !== undefined) {
this.movePosition = {
x: Math.min(this.max.x, this.movePosition.x),
y: Math.min(this.max.y, this.movePosition.y)
};
}
}
};
drag.fn.init.prototype = drag.fn;
window.iDrag = $.drag = drag;
dialog = function(options) {
if (options.id && dialog.get[options.id] !== undefined) {
dialog.get[options.id].show();
return dialog.get[options.id];
}
return new dialog.fn.init(options);
};
dialog.fn = dialog.prototype = {
init: function(options) {
this.id = options.id;
this._lock = options.lock || false;
this.fixed = options.fixed || false;
this.width = options.width || 'auto';
this.height = options.height || 'auto';
this.top = options.top;
this.left = options.left;
this.padding = options.padding || 20;
this._content = options.content || 'loading...';
this._init = options.init;
this._show = options.show || function(){};
this._hide = options.hide || function(){};
this.opacity = options.opacity === undefined ? .3 : options.opacity;
this.background = options.background || '#000';
this.title = options.title === undefined ? '消息' : options.title;
this.follow = options.follow === undefined ? false : $(options.follow);
this.drag = options.drag === undefined ? true : options.drag;
this.effect = options.effect === undefined ? 'i-scale' : options.effect;
this.esc = options.esc===undefined ? true : options.esc;
this.time = options.time;
this.inited = false;
this.myDrag = {};
this._btn = options.btn;
this.$body = $(document.body);
this.show();
this.events();
this._init && this._init.call(this);
},
lock: function() {
var lock = document.createElement('div');
this.$lock = $(lock).addClass('i-dialog-lock').css({
zIndex: ++dialogZindex,
height: doc.height(),
background: this.background
}).html(!ie6 ? '' : '<iframe src="about:blank"></iframe>');
this.$body[0].appendChild(lock);
},
createHTML: function() {
this._lock && this.lock();
this.inited = true;
var dialog = document.createElement('div'),
html = '',
that = this;
if (this.title!==false) {
html = '<div class="target">' +
'<h2 class="title">' + this.title + '</h2>' +
'<a href="javascript:void(0);" title="关闭" class="close">×</a>' +
'</div>';
}
html += '<div class="content"></div>';
if(this._btn) html+='<div class="wrapBtn"></div>';
this.$body[0].appendChild(dialog);
this.$dialog = $(dialog).addClass('i-dialog').html(html).css({
zIndex: ++dialogZindex,
width: this.width,
height: this.height
});
this.$dialog.find('*').each(function(){
that[ '$'+this.className ] = $(this);
this.className = 'i-'+this.className;
});
this.$content.css({
padding: this.padding
});
this.effect&&this.$dialog.addClass(this.effect);
this._btn && this.btn(this._btn,1);
if(this.drag){
this.myDrag = $.drag({
target: this.$target,
root: this.$dialog,
fixed: this.fixed
});
}else{
this.$target.css('cursor','default');
}
this.setPosition();
this.content();
if(this.title===false){
this.$dialog.css({background:'none',boxShadow:'none',borderRadius:0,border:'none'});
}
},
content: function(content) {
this.content = content || this.content;
if (typeof this._content == 'string') {
this.$content.html(this._content);
} else if (typeof this._content == 'object' && this._content.nodeType === 1) {
this.$content[0].appendChild(this._content);
this._content.style.display='block';
}
return this;
},
setPosition: function() {
if (this.fixed) {
if (!ie6) {
this.$dialog.css({
position: 'fixed'
});
} else {
this.$dialog.css({
position: 'absolute'
});
$('html').css({
backgroundImage: 'url(about:blank)',
backgroundAttachment: 'fixed'
});
}
} else {
this.$dialog.css({
position: 'absolute'
});
}
},
show: function() {
!this.inited && this.createHTML();
if(this.id && !dialog.get[this.id]){
dialog.get[this.id] = this;
}
if(this._show.call(this)===false)return;
if(this._lock){
this.$lock.show();
ie&&version<9&&this.$lock.css({opacity: this.opacity});
}
this.width = this.$dialog.width();
this.height = this.$dialog.height();
var winWidth = win.width(),
winHeight = win.height(),
scrollLeft = win.scrollLeft(),
scrollTop = win.scrollTop(),
that = this;
this.follow&&this._follow();
this.$dialog.show().css({
top: this.top!==undefined?this.top : ((winHeight - this.height)*.382 + (ie6 || !this.fixed ? scrollTop : 0)),
left: this.top!==undefined?this.left : ((winWidth - this.width) / 2 + (ie6 || !this.fixed ? scrollLeft : 0)),
width: this.width,
height: this.height
});
this.width = this.$dialog.outerWidth();
this.height = this.$dialog.outerHeight();
setTimeout(function() {
that._lock && that.$lock.css({
opacity: that.opacity
});
that.effect&&that.$dialog.addClass('i-show');
}, this.effect?50:0);
this.time = this.time ? setTimeout(function(){that.hide();}, this.time) : 0;
},
_follow: function(){
var offset = this.follow.offset(),
width = parseInt(this.follow.outerWidth()),
height = parseInt(this.follow.outerHeight()),
scrollTop = win.scrollTop(),
scrollLeft = win.scrollLeft(),
winWidth = win.width(),
winHeight = win.height(),
maxTop = scrollTop+winHeight-this.height,
maxLeft = scrollLeft+winWidth-this.width;
this.top = offset.top + height;
this.left = offset.left-(this.width-width)/2;
this.top = this.top > maxTop ? offset.top-this.height : this.top;
this.left = this.left > maxLeft ? maxLeft : this.left;
},
hide: function() {
if(this._hide.call(this)===false)return;
var style = this.$dialog[0].style,
time = 0,
that = this;
if (style.transform !== undefined || style.webkitTransform !== undefined ||
style.mozTransform !== undefined || style.msTransform !== undefined) {
time = 300;
}
this.$dialog.removeClass('i-show');
this._lock && this.$lock.css({
opacity: 0
});
this.time && clearTimeout(this.time);
setTimeout(function() {
that._lock && that.$lock.hide();
that.$dialog.hide();
}, this.effect?time:0);
},
events: function() {
var that = this,
timeout = null;
win.bind('resize', function() {
timeout && clearTimeout(timeout);
timeout = setTimeout(function() {
that.limit();
(parseInt(that.$dialog.css('left'))>that.myDrag.max.x)&&that.$dialog.css('left',that.myDrag.max.x);
(parseInt(that.$dialog.css('top'))>that.myDrag.max.y)&&that.$dialog.css('top',that.myDrag.max.y);
}, 100);
});
this.$close && this.$close.bind('click', function() {
that.hide();
});
this.$lock && this.$lock.bind('dblclick', function() {
that.hide();
});
this.esc&&doc.bind('keyup', function(e) {
if (e.keyCode == 27&&that.$dialog.css('display')!='none'){
that.hide();
}
});
this.$dialog.bind('mousedown', function () {
$.each(dialog.get, function(){
if(this.$dialog.zIndex == dialogZindex)this.$dialog.css({zIndex:dialogZindex-1});
});
$(this).css({zIndex:dialogZindex});
})
//设置限制拖拽区域
if(this.drag){
this.myDrag.start = function() {
that.limit();
}
};
},
limit: function(){
var winWidth = win.width(),
winHeight = win.height(),
scrollLeft = win.scrollLeft(),
scrollTop = win.scrollTop();
this.myDrag.min = {
x: 0,
y: 0
};
if (this.fixed && ie6) {
this.myDrag.min = {
x: scrollLeft,
y: scrollTop
};
}
if (this.fixed) {
this.myDrag.max = !ie6 ? {
x: winWidth - this.width,
y: winHeight - this.height
} : {
x: winWidth + scrollLeft - this.width,
y: winHeight + scrollTop - this.height
};
} else {
this.myDrag.max = {
x: winWidth - this.width,
y: doc.height() - this.height
};
}
},
btn: function(btns,type){
var input, that = this;
$.each(btns, function(key){
input = (!type&&that._btn[key]) ? that._btn[key].input : document.createElement('input');
input.type = 'button';
input.value = this.val||input.value;
input.className = this.type || input.className || '';
if(this.disabled === true){
input.disabled = 'disabled';
input.className += ' i-disabled';
}else if(this.disabled === false){
input.disabled = '';
input.className = input.className.replace(' i-disabled','');
}
if(type||!that._btn[key])that.$wrapBtn.append(input);
if(!that._btn[key])that._btn[key] = this;
that._btn[key].input = input;
input.onclick = this.click ? (function(self){
return function(){
if((self.click&&false !== self.click.call(that, this))||!self.click)that.hide();
}
})(this) : input.onclick || function(){that.hide()};
});
}
};
dialog.fn.init.prototype = dialog.fn;
window.iDialog = $.dialog = dialog;
dialog.get = {};
window.iDialog.get = $.dialog.get = dialog.get;
}(jQuery, this);

@ -0,0 +1,73 @@
$(function(){
// 头部选项事件
$(".header .menu .menu-contain .contain-ul .contain-li-hashover").bind("mouseover",function(event){
$(".header .menu .menu-contain .contain-ul li i").css("transform","rotate(0deg)");
$(this).find("i").css("transform","rotate(180deg)");
$(".header .submenu-container .subm-ul").addClass("dis-none");
$(".header .submenu-container .all-exm").addClass("dis-none");
$(".header .submenu-container ."+$(this).attr("data-class")+"").removeClass("dis-none");
$(this).addClass("li-hover");
event.stopPropagation();
}).bind("mouseleave",function(event){
if(event.relatedTarget == null || $(event.relatedTarget).attr("data-id") != "submenu"){
$(this).find("i").css("transform","rotate(0deg)");
$(".header .submenu-container .subm-ul").addClass("dis-none");
$(".header .submenu-container .all-exm").addClass("dis-none");
$(".header .menu .menu-contain .contain-ul li").removeClass("li-hover");
event.stopPropagation();
}
});
$(".header .submenu-container").bind("mouseleave",function(event){
if(event.relatedTarget.className != "contain-ul"){
$(".header .menu .menu-contain .contain-ul li i").css("transform","rotate(0deg)");
$(".header .submenu-container .subm-ul").addClass("dis-none");
$(".header .submenu-container .all-exm").addClass("dis-none");
$(".header .menu .menu-contain .contain-ul li").removeClass("li-hover");
event.stopPropagation();
}
});
// 左侧导航
$(".content-wp .navbar-container .navbar-list .navbar-list-item").bind("mouseover",function(event){
$(".content-wp .navbar-container .navbar-list .navbar-list-item").removeClass("navbar-list-item-hover");
$(this).addClass("navbar-list-item-hover");
$(".content-wp .navbar-container .navbar-list-item-section").css("display","none");
$("div[datatype='"+$(this).attr("datatype")+"']").css("display","block");
event.stopPropagation();
}).bind("mouseleave",function(event){
if(event.relatedTarget.className != "navbar-list-item-section"){
$(".content-wp .navbar-container .navbar-list .navbar-list-item").removeClass("navbar-list-item-hover");
$(".content-wp .navbar-container .navbar-list-item-section").css("display","none");
event.stopPropagation();
}
});
$(".content-wp .navbar-container .navbar-list-item-section").bind("mouseleave",function(event){
$(".content-wp .navbar-container .navbar-list .navbar-list-item").removeClass("navbar-list-item-hover");
$(".content-wp .navbar-container .navbar-list-item-section").css("display","none");
event.stopPropagation();
});
// 马上做题
$(".detail-kpoint-2").bind("mouseover",function(event){
$(this).find(".mask").show();
event.stopPropagation();
}).bind("mouseleave",function(event){
$(this).find(".mask").hide();
event.stopPropagation();
});
// 问题列表
$(".quelist-wrap .question-box").bind("mouseover",function(event){
$(this).addClass("hover-quescontainer");
$(this).find(".view-analyse").find(".view-link").css("color","#11a68d!important");
event.stopPropagation();
}).bind("mouseleave",function(event){
$(this).removeClass("hover-quescontainer");
$(this).find(".view-analyse").find(".view-link").css("color","#11a68d!important");
event.stopPropagation();
});
})

@ -0,0 +1,152 @@
$(function(){
// 登录窗口拖动
$.drag({
target:'#TANGRAM__PSP_19__title',
root:'#passport-login-pop',
lock:true
});
$(".header .login-container").bind("click",function(event){
if($(this).find("span").length == 1){
$(".mask").css("display","block");
$("#passport-login-pop").css("display","block");
}
});
$("#TANGRAM__PSP_19__closeBtn").bind("click",function(event){
$(".mask").css("display","none");
$("#passport-login-pop").css("display","none");
});
$(".pass-login-pop-content .pass-text-input").bind("focus",function(event){
$(this).addClass("pass-text-input-hover");
}).bind("blur",function(event){
$(this).removeClass("pass-text-input-hover");
$(this).removeClass("pass-text-input-error");
}).bind("keyup",function(event){
if($(this).val() != ""){
$("#"+$(this).attr("id")+"_clearbtn").css("display","block").css("visibility","visible");
}
});
$(".pass-login-pop-content .pass-clearbtn").bind("click",function(event){
$(this).css("display","none").css("visibility","hidden");
$(this).prev().val("");
$(this).prev().trigger("focus");
})
$("#TANGRAM__PSP_25__submit").bind("click",function(event){
if($("#TANGRAM__PSP_25__userName").val() == ""){
$("#TANGRAM__PSP_25__userName").focus();
$("#TANGRAM__PSP_25__error").html('请输入用户名/手机号/邮箱');
return false;
}
if($("#TANGRAM__PSP_25__password").val() == ""){
$("#TANGRAM__PSP_25__password").focus();
$("#TANGRAM__PSP_25__error").html('请输入密码');
return false;
}
var username = $("#TANGRAM__PSP_25__userName").val();
var password = $("#TANGRAM__PSP_25__password").val();
$.ajax({
type : "get",
url : mainHttp + "miniLogin.html",
async : true,
data:{username:username,password:password,captcha:$("#TANGRAM__PSP_25__verifyCode").val()},
dataType : "json",
success : function(data) {// 返回数据根据结果进行相应的处理,无论请求成功还是失败,都会走这个方法的
if(data.code == 201){
$("#TANGRAM__PSP_25__userName").addClass("pass-text-input-error").focus();
$("#TANGRAM__PSP_25__userName").removeClass("pass-text-input-hover");
$("#TANGRAM__PSP_25__userName").val("");
$("#TANGRAM__PSP_25__password").val("");
$("#TANGRAM__PSP_25__verifyCode").val("");
$("#TANGRAM__PSP_25__verifyCodeChange").trigger("click");
$("#TANGRAM__PSP_25__error").html('帐号或密码错误,请重新输入或者<a href="'+mainHttp+'password/find.html" target="_blank">找回密码</a>');
}else if(data.code == 202){
$("#TANGRAM__PSP_25__password").addClass("pass-text-input-error").focus();
$("#TANGRAM__PSP_25__password").removeClass("pass-text-input-hover");
$("#TANGRAM__PSP_25__password").val("");
$("#TANGRAM__PSP_25__verifyCode").val("");
$("#TANGRAM__PSP_25__verifyCodeChange").trigger("click");
$("#TANGRAM__PSP_25__error").html('帐号或密码错误,请重新输入或者<a href="'+mainHttp+'password/find.html" target="_blank">找回密码</a>');
} else if(data.code == 203){
$("#TANGRAM__PSP_25__error").html('账号被锁定两小时');
} else if(data.code == 204){
$("#TANGRAM__PSP_25__verifyCodeImgWrapper").css("display","block");
$("#TANGRAM__PSP_25__verifyCode").addClass("pass-text-input-error").focus();
$("#TANGRAM__PSP_25__verifyCode").removeClass("pass-text-input-hover");
$("#TANGRAM__PSP_25__verifyCode").val("");
$("#TANGRAM__PSP_25__verifyCodeChange").trigger("click");
$("#TANGRAM__PSP_25__error").html('请输入验证码!');
} else if(data.code == 205){
$("#TANGRAM__PSP_25__verifyCode").addClass("pass-text-input-error").focus();
$("#TANGRAM__PSP_25__verifyCode").removeClass("pass-text-input-hover");
$("#TANGRAM__PSP_25__verifyCode").val("");
$("#TANGRAM__PSP_25__verifyCodeChange").trigger("click");
$("#TANGRAM__PSP_25__error").html('验证码错误,请重新输入!');
} else if(data.code == 0){
window.location.reload();
}
}
});
return false;
});
$(".header .login-container").bind("mouseover",function(){
if($(this).find("img").length == 1){
$(this).addClass("black");
$(".header .login-option").removeClass("dis-none");
$(this).find("i").css("transform","rotate(180deg)");
}
}).bind("mouseleave",function(event){
if(event.relatedTarget == null){
$(this).find("i").css("transform","rotate(0deg)");
$(".header .submenu-container .subm-ul").addClass("dis-none");
$(".header .submenu-container .all-exm").addClass("dis-none");
$(".header .menu .menu-contain .contain-ul li").removeClass("li-hover");
$("#loginOptionUl").addClass("dis-none");
event.stopPropagation();
}
if(event.relatedTarget.id != "loginOptionUl" && event.relatedTarget.parentElement.id != "loginOptionUl"){
$(this).find("i").css("transform","rotate(0deg)");
$(".header .submenu-container .subm-ul").addClass("dis-none");
$(".header .submenu-container .all-exm").addClass("dis-none");
$(".header .menu .menu-contain .contain-ul li").removeClass("li-hover");
$("#loginOptionUl").addClass("dis-none");
event.stopPropagation();
}
});
$("#loginOptionUl").bind("mouseleave",function(){
$(".header .login-container").find("i").css("transform","rotate(0deg)");
$(".header .submenu-container .subm-ul").addClass("dis-none");
$(".header .submenu-container .all-exm").addClass("dis-none");
$(".header .menu .menu-contain .contain-ul li").removeClass("li-hover");
$("#loginOptionUl").addClass("dis-none");
event.stopPropagation();
});
$("#TANGRAM__PSP_25__smsSwitchWrapper").bind("click",function(){
$("#passport-login-pop-api").css("display","none").css("visibility","hidden");
$("#TANGRAM__PSP_25__sms").css("display","block").css("visibility","visible");
$("#TANGRAM__PSP_25__footerQrcodeBtn").show();
$("#TANGRAM__PSP_25__footerULoginBtn").hide();
});
$("#TANGRAM__PSP_25__sms_btn_back").bind("click",function(){
$("#passport-login-pop-api").css("display","block").css("visibility","visible");
$("#TANGRAM__PSP_25__sms").css("display","none").css("visibility","hidden");
$("#TANGRAM__PSP_25__footerULoginBtn").show();
$("#TANGRAM__PSP_25__footerQrcodeBtn").hide();
});
$("#TANGRAM__PSP_25__verifyCodeChange").bind("click",function(){
$("#TANGRAM__PSP_25__verifyCodeImg").attr("src",mainHttp + "captcha.jpg?t=" + $.now());
});
$("#TANGRAM__PSP_25__verifyCodeImg").bind("click",function(){
$("#TANGRAM__PSP_25__verifyCodeImg").attr("src",mainHttp + "captcha.jpg?t=" + $.now());
});
})

@ -0,0 +1,79 @@
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<div class="footer" th:fragment="footer">
<div class="footer-contain clearfix">
<div class="intro">
<div class="title">探果网</div>
<p>
探果网旨在为用户提供高效的备考服务,让知识能无障碍传播,为用户创造价值,助您不断前行!
</p>
</div>
<div class="connect">
<div class="title">联系我们</div>
<p>
<i class="iconfont icon-yonghu"></i> 谭先生
</p>
<p>
<i class="iconfont icon-mail"></i> candy.tam@aliyun.com
</p>
<p>
<i class="iconfont icon-qq"></i> qq431047779
</p>
</div>
<div class="suggest">
<div class="title">微信公众号</div>
<p>
<img style="width:80px;height:80px;" alt="探果网公众号" th:src="${domainName + 'images/qrcode_for_gh_30d79d8188a1_258.jpg'}">
</p>
</div>
<div class="cooperation">
<div class="title">合作机构</div>
<span class="left iconfont icon-xiangzuo1"></span> <span
class="right iconfont icon-xiangyou1"></span>
<div class="coo-view clearfix">
<ul class="contain-ul dis-none" style="display: block;">
<li class="contain-li"><a class="contain-link"
href="http://www.tamyun.com/" style="color:#fff;" target="_blank" title="探云网,云养殖">探云网</a>
</li>
<li class="contain-li"><a class="contain-link" style="color:#fff;"
href="http://www.tamguo.com/" target="_blank" title="题库,课本">探果网</a></li>
<li class="contain-li"><a class="contain-link" style="color:#fff;"
href="http://www.xunaiquan.com/" target="_blank" title="找狗,寻狗">寻爱犬</a></li>
</ul>
</div>
</div>
</div>
<p class="bottom">
沪备案号 <a href="http://www.miitbeian.gov.cn" target="_blank">沪ICP备14022608号-1</a> Copyright © 2018 Tamguo
</p>
</div>
<script type="text/javascript" th:inline="javascript" th:fragment="footer">
//百度统计 www.tamguo.com
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?877e9c9ef462fe55b7750d478a41c981";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
// 百度推送 www.tamguo.com
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
<!--360搜索自动推送 www.tamguo.com-->
(function(){
var src = (document.location.protocol == "http:") ? "http://js.passport.qihucdn.com/11.0.1.js?40ee03bede7c19e05d89f18db868df8a":"https://jspassport.ssl.qhimg.com/11.0.1.js?40ee03bede7c19e05d89f18db868df8a";
document.write('<script src="' + src + '" id="sozz"><\/script>');
})();
</script>

@ -0,0 +1,29 @@
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<div class="header" th:fragment="header">
<div class="menu">
<div class="menu-contain clearfix">
<a th:href="${domainName}"><span class="container-logo"></span></a>
<div class="contain-login">
<div class="login-container">
<i th:if="${session.currMember == null}" class="login-icon iconfont icon-yonghu"></i><span th:if="${session.currMember == null}">登录</span>
<img style="border-radius:55px;" th:if="${session.currMember != null}" class="user-photo" th:src="${domainName + session.currMember.avatar}" alt="用户头像">
<i th:if="${session.currMember != null}" class="photo-icon iconfont icon-down" style="transform: rotate(0deg);"></i>
</div>
<ul th:class="${currMember == null} ? 'login-option dis-none' : 'login-option'" id="loginOptionUl">
<li><a th:href="${memberDomain + 'index.html'}" title="我的首页">我的首页</a></li>
<li><a th:href="${memberDomain + 'index.html'}" title="账号设置">账号设置</a></li>
<li><a th:href="${memberDomain + 'logout.html'}" title="退出">退出</a></li>
</ul>
</div>
<ul class="contain-ul">
<li class="contain-li jiaoshirukou">
<a th:href="${memberDomain + 'regist.html'}" title="注册">注册</a><i class="li-icon iconfont icon-jiaoshi1"></i>
</li>
</ul>
</div>
</div>
</div>
<script type="text/javascript" th:inline="javascript" th:fragment="header">
var mainHttp = [[${domainName}]];
</script>

@ -0,0 +1,92 @@
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<div id="passport-login-pop" class="tang-pass-pop-login-merge tang-pass-pop-login-tpl-do tang-pass-pop-login-color-blue tang-pass-pop-login" style="left:40%;top:10%;z-index: 60001;display:none;" th:fragment="minilogin">
<div class="tang-foreground" id="TANGRAM__PSP_19__foreground" style="width: 356px;">
<div class="tang-title tang-title-dragable" id="TANGRAM__PSP_19__title">
<div class="buttons" id="TANGRAM__PSP_19__titleButtons">
<a id="TANGRAM__PSP_19__closeBtn" class="close-btn" href="###" onmousedown="event.stopPropagation &amp;&amp; event.stopPropagation(); event.cancelBubble = true; return false;" onclick="return false;"></a>
</div><span id="TANGRAM__PSP_19__titleText">&nbsp;</span></div>
<div class="tang-body" id="TANGRAM__PSP_19__body">
<div class="tang-content" id="TANGRAM__PSP_19__content">
<div id="passport-login-pop-dialog">
<div class="clearfix">
<div class="pass-login-pop-content">
<div class="pass-login-pop-form">
<div id="passport-login-pop-api" class="tang-pass-login" style="display: block; visibility: visible; opacity: 1;">
<form id="TANGRAM__PSP_25__form" class="pass-form pass-form-normal" method="POST" autocomplete="off">
<p class="pass-form-logo">用户名密码登录</p>
<p id="TANGRAM__PSP_25__errorWrapper" class="pass-generalErrorWrapper"><span id="TANGRAM__PSP_25__error" class="pass-generalError pass-generalError-error"></span></p>
<p id="TANGRAM__PSP_25__MakeTextWrapper" class="pass-make-text" style="display:none;"></p>
<p id="TANGRAM__PSP_25__hiddenFields" style="display:none"><input type="hidden" id="TANGRAM__PSP_25__codeString" name="codeString" value=""><input type="hidden" id="TANGRAM__PSP_25__safeFlag" name="safeFlag" value="0"><input type="hidden" id="TANGRAM__PSP_25__isPhone" name="isPhone" value="false"><input type="hidden" id="TANGRAM__PSP_25__detect" name="detect" value="1"><input type="hidden" id="TANGRAM__PSP_25__gid" name="gid" value="526B53B-9A68-476F-9971-D1091BAC80E4"><input type="hidden" id="TANGRAM__PSP_25__quick_user" name="quick_user" value="0"><input type="hidden" id="TANGRAM__PSP_25__logintype" name="logintype" value="dialogLogin"><input type="hidden" id="TANGRAM__PSP_25__logLoginType" name="logLoginType" value="pc_loginDialog"><input type="hidden" id="TANGRAM__PSP_25__subpro" name="subpro" value=""><input type="hidden" id="TANGRAM__PSP_25__idc" name="idc" value=""><input type="hidden" id="TANGRAM__PSP_25__loginMerge" name="loginMerge" value="true"></p>
<p id="TANGRAM__PSP_25__userNameWrapper" class="pass-form-item pass-form-item-userName" style="display:">
<input type="text" style="display:none;">
<input id="TANGRAM__PSP_25__userName" type="text" name="userName" class="pass-text-input pass-text-input-userName open" autocomplete="new-password" value="" placeholder="手机/邮箱/用户名">
<span id="TANGRAM__PSP_25__userName_clearbtn" class="pass-clearbtn pass-clearbtn-userName" style="display: none; visibility: hidden; opacity: 1;"></span><span id="TANGRAM__PSP_25__userNameTip" class="pass-item-tip pass-item-tip-userName" style="display:none"><span id="TANGRAM__PSP_25__userNameTipText" class="pass-item-tiptext pass-item-tiptext-userName"></span></span>
</p>
<p id="TANGRAM__PSP_25__passwordWrapper" class="pass-form-item pass-form-item-password" style="display:"><input type="password" style="display: none;"><input id="TANGRAM__PSP_25__password" type="password" name="password" class="pass-text-input pass-text-input-password" autocomplete="new-password" value="" placeholder="密码"><span id="TANGRAM__PSP_25__password_clearbtn" class="pass-clearbtn pass-clearbtn-password" style="display: none; visibility: hidden;"></span><span id="TANGRAM__PSP_25__passwordTip" class="pass-item-tip pass-item-tip-password" style="display:none"><span id="TANGRAM__PSP_25__passwordTipText" class="pass-item-tiptext pass-item-tiptext-password"></span></span>
</p>
<p id="TANGRAM__PSP_25__verifyCodeImgWrapper" class="pass-form-item pass-form-item-verifyCode"><input id="TANGRAM__PSP_25__verifyCode" type="text" name="verifyCode" class="pass-text-input pass-text-input-verifyCode" maxlength="6" placeholder="验证码"><span id="TANGRAM__PSP_25__verifyCode_clearbtn" class="pass-clearbtn pass-clearbtn-verifyCode" style="display:none;"></span><span id="TANGRAM__PSP_25__verifyCodeImgParent" class="pass-verifyCodeImgParent">
<img id="TANGRAM__PSP_25__verifyCodeImg" class="pass-verifyCode" style="cursor:pointer;" th:src="${domainName + 'captcha.jpg'}"></span>
<a id="TANGRAM__PSP_25__verifyCodeChange" href="javascript:(0);" class="pass-change-verifyCode">换一张</a><span id="TANGRAM__PSP_25__verifyCodeError" class="pass-error pass-error-verifyCode"></span><span id="TANGRAM__PSP_25__verifyCodeTip" class="pass-tip pass-tip-verifyCode"></span><span id="TANGRAM__PSP_25__verifyCodeSuccess" class="pass-success pass-success-verifyCode"></span></p>
<p id="TANGRAM__PSP_25__memberPassWrapper" class="pass-form-item pass-form-item-memberPass"><input id="TANGRAM__PSP_25__memberPass" type="checkbox" name="memberPass" class="pass-checkbox-input pass-checkbox-memberPass" checked="checked"><label for="TANGRAM__PSP_25__memberPass" id="TANGRAM__PSP_25__memberPassLabel" class="">下次自动登录</label></p>
<p id="TANGRAM__PSP_25__submitWrapper" class="pass-form-item pass-form-item-submit">
<input id="TANGRAM__PSP_25__submit" type="submit" value="登录" class="pass-button pass-button-submit">
<a class="pass-sms-btn pass-link" title="短信快捷登录" data-type="sms" id="TANGRAM__PSP_25__smsSwitchWrapper">短信快捷登录</a>
<a class="pass-fgtpwd pass-link" th:href="${memberDomain + 'password/find.html'}" target="_blank">忘记密码?</a>
</p>
</form>
</div>
<div id="TANGRAM__PSP_25__sms" class="tang-pass-login tang-pass-sms" style="display: none; visibility: hidden; opacity: 1;">
<p class="pass-form-logo">短信快捷登录</p>
<p class="tang-pass-sms-tip">验证即登录,未注册将自动创建探果帐号</p>
<form id="TANGRAM__PSP_25__smsForm" method="POST">
<p id="TANGRAM__PSP_25__smsHiddenFields" style="display:none"><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_tpl" name="tpl" value="do"><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_idc" name="idc" value=""><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_isdpass" name="isdpass" value="1"><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_gid" name="gid" value="526B53B-9A68-476F-9971-D1091BAC80E4"><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_switchuname" name="switchuname" value=""><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_smsCodeString" name="smsCodeString" value=""><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_smsVcodesign" name="smsVcodesign" value=""><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_smsVcodestr" name="smsVcodestr" value=""><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_subpro" name="subpro" value=""><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_is_voice_sms" name="is_voice_sms" value="0"><input type="hidden" id="TANGRAM__PSP_25__smsHiddenFields_voice_sms_flag" name="voice_sms_flag" value="0"></p>
<p id="TANGRAM__PSP_25__smsErrorWrapper" class="pass-generalErrorWrapper"><span id="TANGRAM__PSP_25__smsError" class="pass-generalError"></span></p>
<div id="TANGRAM__PSP_25__smsPhoneWrapper" class="pass-form-item pass-form-item-smsPhone"><input id="TANGRAM__PSP_25__smsPhone" type="text" name="username" class="pass-text-input pass-text-input-smsPhone" placeholder="请输入手机号"><span id="TANGRAM__PSP_25__smsPhone_clearbtn" class="pass-clearbtn pass-clearbtn-smsPhone" style="display:none;"></span><span id="TANGRAM__PSP_25__smsPhoneTip" class="pass-item-tip pass-item-tip-smsPhone" style="display:none"><span id="TANGRAM__PSP_25__smsPhoneTipText"></span></span>
</div>
<p id="TANGRAM__PSP_25__smsVerifyCodeWrapper" class="pass-form-item pass-form-item-smsVerifyCode"><input id="TANGRAM__PSP_25__smsVerifyCode" type="text" name="password" class="pass-text-input pass-text-input-smsVerifyCode" placeholder="验证码"><span id="TANGRAM__PSP_25__smsVerifyCode_clearbtn" class="pass-clearbtn pass-clearbtn-smsVerifyCode" style="display:none;"></span><button id="TANGRAM__PSP_25__smsTimer" class="pass-item-timer">发送验证码</button><span id="TANGRAM__PSP_25__smsVerifyCodeTip" class="pass-item-tip pass-item-tip-smsVerifyCode" style="display:none"><span id="TANGRAM__PSP_25__smsVerifyCodeTipText"></span></span>
</p>
<p id="TANGRAM__PSP_25__smsSubmitWrapper" class="pass-form-item pass-form-item-submit"><input id="TANGRAM__PSP_25__smsSubmit" type="submit" value="登录" class="pass-button pass-button-submit"><span class="tang-pass-sms-agreement pass-link">阅读并接受<a target="_blank" th:href="${domainName}">《探果用户协议》</a></span>
<a id="TANGRAM__PSP_25__sms_btn_back" class="pass-sms-link pass-sms-link-back pass-link">用户名密码登录</a>
</p>
</form>
</div>
<div class="tang-pass-footerBar">
<p class="tang-pass-footerBarQrcode pass-link" title="扫码登录" data-type="qrcode" id="TANGRAM__PSP_25__footerQrcodeBtn" style="display: none;">扫码登录</p>
<a th:href="${domainName + 'login.html'}" title="探果网登录" target="_blank">
<p class="tang-pass-footerBarULogin pass-link" title="探果网登录" data-type="normal" id="TANGRAM__PSP_25__footerULoginBtn" style="display: block;">立即登录
</p></a>
<div class="tang-pass-footerBarPhoenix"><span class="tang-pass-footerBarPhoenixSplit"></span>
<div class="tang-pass-footerBarPhoenixItem" id="TANGRAM__PSP_25__PhoenixItem">
<div id="pass-phoenix-login" class="tang-pass-login-phoenix">
<div id="pass-phoenix-list-login" class="pass-phoenix-list clearfix">
<div class="pass-phoenix-btn clearfix" id="pass_phoenix_btn">
<ul class="bd-acc-list">
<li class="bd-acc-tsina" data-dialog="1" data-acc="2" data-height="669" data-width="800">
<a class="phoenix-btn-item" href="javascript:(0);" data-title="tsina" title="新浪微博">新浪微博</a>
</li>
<li class="bd-acc-weixin" data-dialog="1" data-acc="42" data-height="450" data-width="850">
<a class="phoenix-btn-item" href="javascript:(0);" data-title="weixin" title="微信">微信</a>
</li>
<li class="bd-acc-qzone" data-dialog="1" data-acc="15" data-height="450" data-width="750">
<a class="phoenix-btn-item" href="javascript:(0);" data-title="qzone" title="QQ帐号">QQ帐号</a>
</li>
</ul>
</div>
</div>
<div class="clear"></div>
</div>
</div>
</div>
<a class="pass-reglink pass-link" th:href="${memberDomain + 'register.html'}" target="_blank">立即注册</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mask firstleader" th:fragment="minilogin"></div>

@ -0,0 +1,124 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>聪明的学生都在这里 - 探果网</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="renderer" content="webkit">
<meta name="author" content="tamguo" />
<meta name="site" content="https://book.tamguo.com" />
<meta name="keywords" content="高考,考研,财会类,建筑工程,职业资格,医卫类,会计类">
<meta name="description" content="MinDoc文档在线管理系统探果网,高考试题,高考试卷,高校试题,名校,名校试题,名校试卷,高校名师,名师专访,名师教案,名师课堂试题库,试卷库,智能题库,历年真题,模拟试题,押题,预测试题,高考,会计证,会计从业,会计师,经济师,施工员,建造师,建筑师,造价师,职业资格,证券资格,考研,计算机考试,建筑考试,财会类,医卫类,护士资格,公务员,知识点,试题,试卷">
<link th:href="${domainName + 'bootstrap/css/bootstrap.min.css'}" rel="stylesheet">
<link th:href="${domainName + 'font-awesome/css/font-awesome.min.css'}" rel="stylesheet">
<link th:href="${domainName + 'css/main.css'}" rel="stylesheet">
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
</head>
<body>
<div class="manual-reader manual-container">
<header class="navbar navbar-static-top navbar-fixed-top manual-header" role="banner">
<div class="container">
<div class="navbar-header col-sm-12 col-md-9 col-lg-8">
<a th:href="${domainName}" class="navbar-brand" title="探果网">
<img alt="logo" src="https://www.tamguo.com/images/logo_731bc32.png">
</a>
<nav class="collapse navbar-collapse col-sm-10">
<ul class="nav navbar-nav">
<li class="active">
<a th:href="${domainName}" title="首页">首页</a>
</li>
</ul>
<div class="searchbar pull-left visible-lg-inline-block visible-md-inline-block">
<form class="form-inline" th:action="${domainName}" method="get">
<input class="form-control" name="keyword" type="search" style="width: 230px;" placeholder="请输入关键词..." value="">
<button class="search-btn">
<i class="fa fa-search"></i>
</button>
</form>
</div>
</nav>
<div class="btn-group dropdown-menu-right pull-right slidebar visible-xs-inline-block visible-sm-inline-block">
<button class="btn btn-default dropdown-toggle hidden-lg" type="button" data-toggle="dropdown"><i class="fa fa-align-justify"></i></button>
<ul class="dropdown-menu" role="menu">
<li><a th:href="${memberDomain + 'login.html'}" title="用户登录">登录</a></li>
</ul>
</div>
</div>
<nav class="navbar-collapse hidden-xs hidden-sm" role="navigation">
<ul class="nav navbar-nav navbar-right">
<li><a th:href="${memberDomain + 'login.html'}" title="用户登录">登录</a></li>
</ul>
</nav>
</div>
</header>
<div class="container manual-body">
<div class="row">
<div class="manual-list">
<div class="list-item" th:each="book,bookstatus:${bookPage.records}">
<dl class="manual-item-standard">
<dt>
<a th:href="${domainName + 'book/' + book.id + '.html'}" th:title="${book.name}" target="_blank">
<img th:src="${book.bookImage}" class="cover" th:alt="${book.name}" onerror="this.src='https://book.tamguo.com/images/book.jpg';">
</a>
</dt>
<dd>
<a th:href="${domainName + 'book/' + book.id + '.html'}" class="name" th:title="${book.name}" target="_blank" th:text="${book.name}">运行支持组</a>
</dd>
<dd>
<span class="author">
<b class="text">作者</b>
<b class="text">-</b>
<b class="text" th:text="${book.memberName}">mayun12</b>
</span>
</dd>
</dl>
</div>
<div class="clearfix"></div>
</div>
<nav class="pagination-container">
<ul class="pagination pagination-lg" >
<li th:class="${bookPage.current==1}?'disabled' : ''"><a href="#">上一页</a></li>
<li th:if="${bookPage.current-3 >=1}" ><a th:href="@{'index.html?current=' + ${bookPage.current-3}}" th:text="${bookPage.current -3}" >1</a></li>
<li th:if="${bookPage.current-2 >=1}" ><a th:href="@{'index.html?current=' + ${bookPage.current-2}}" th:text="${bookPage.current -2}" >1</a></li>
<li th:if="${bookPage.current-1 >=1}" ><a th:href="@{'index.html?current=' + ${bookPage.current-1}}" th:text="${bookPage.current -1}" >1</a></li>
<li class="active"><a href="#" th:text="${bookPage.current}" >1</a></li>
<li th:if="${bookPage.current+1 <=bookPage.pages}" ><a th:href="@{'index.html?current=' + ${bookPage.current+1}}" th:text="${bookPage.current +1}" >1</a></li>
<li th:if="${bookPage.current+2 <=bookPage.pages}" ><a th:href="@{'index.html?current=' + ${bookPage.current+2}}" th:text="${bookPage.current +2}" >1</a></li>
<li th:if="${bookPage.current+3 <=bookPage.pages}" ><a th:href="@{'index.html?current=' + ${bookPage.current+3}}" th:text="${bookPage.current +3}" >1</a></li>
<li th:class="${bookPage.current==bookPage.total}?'disabled' : ''" ><a href="#">下一页</a></li>
</ul>
<div class="clearfix"></div>
</nav>
</div>
</div>
<div class="footer">
<div class="container">
<div class="row text-center border-top">
<span><a href="https://www.tamguo.com/" target="_blank">官方网站</a></span>
<span>&nbsp;·&nbsp;</span>
<span><a th:href="${domainName}" target="_blank">意见反馈</a></span>
<span>&nbsp;·&nbsp;</span>
<span><a th:href="${domainName}" target="_blank">项目源码</a></span>
<span>&nbsp;·&nbsp;</span>
<span><a th:href="${domainName}" target="_blank">使用手册</a></span>
</div>
<div class="row text-center">
<a href="http://www.miitbeian.gov.cn" target="_blank">沪备案号 沪ICP备14022608号-1 Copyright © 2018 Tamguo</a>
</div>
</div>
</div>
</div>
<script th:src="${domainName + 'js/jquery-1.12.4.min.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'bootstrap/js/bootstrap.min.js'}" type="text/javascript"></script>
</body>
</html>

@ -1,141 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>文档比较 - Tamguo</title>
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
<link th:href="${domainName + 'fonts/notosans.css'}" rel='stylesheet' type='text/css' />
<link type='text/css' rel='stylesheet' th:href="${domainName + 'mergely/editor/lib/wicked-ui.css'}" />
<link type='text/css' rel='stylesheet' th:href="${domainName + 'mergely/editor/lib/tipsy/tipsy.css'}" />
<link type="text/css" rel="stylesheet" th:href="${domainName + 'mergely/editor/lib/farbtastic/farbtastic.css'}" />
<link type="text/css" rel="stylesheet" th:href="${domainName + 'mergely/lib/codemirror.css'}" />
<link type="text/css" rel="stylesheet" th:href="${domainName + 'mergely/lib/mergely.css'}" />
<link type='text/css' rel='stylesheet' th:href="${domainName + 'mergely/editor/editor.css'}" />
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
<script type="text/javascript" th:src="${domainName + 'jquery/1.12.4/jquery.min.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/editor/lib/wicked-ui.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/editor/lib/tipsy/jquery.tipsy.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/editor/lib/farbtastic/farbtastic.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/lib/codemirror.min.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/lib/mergely.min.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/editor/editor.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/lib/searchcursor.js'}"></script>
<script type="text/javascript">
var key = '';
</script>
</head>
<body style="visibility:hidden">
<ul id="toolbar">
<li id="tb-file-save" data-icon="icon-save" title="保存">保存合并</li>
<li class="separator"></li>
<li id="tb-view-change-prev" data-icon="icon-arrow-up" title="上一处差异">上一处差异</li>
<li id="tb-view-change-next" data-icon="icon-arrow-down" title="下一处差异">下一处差异</li>
<li class="separator"></li>
<li id="tb-edit-right-merge-left" data-icon="icon-arrow-left-v" title="合并到左侧">合并到左侧</li>
<li id="tb-edit-left-merge-right" data-icon="icon-arrow-right-v" title="合并到右侧">合并到右侧</li>
<li id="tb-view-swap" data-icon="icon-swap" title="左右切换">左右切换</li>
</ul>
<div class="find">
<input type="text" placeholder="请输入关键字"/>
<button class="find-prev"><span class="icon icon-arrow-up"></span></button>
<button class="find-next"><span class="icon icon-arrow-down"></span></button>
<button class="find-close"><span class="icon icon-x-mark"></span></button>
</div>
<div style="position: absolute;top: 33px;bottom: 10px;left: 5px;right: 5px;overflow-y: hidden;padding-bottom: 2px;">
<div id="mergely"></div>
</div>
<template id="historyContent" th:utext="${history.markdown}">## 测试文件
@ 爱仕达sad
#@@@@
72
6
1
as5
dsad
as3
da24
sd
@@
@@@
@@@
@
@
@@
@@@</template>
<template id="documentContent" th:utext="${document.markdown}">## 测试文件
2
@ 爱仕达sad2
#@@@@1
72
6
1
as5
dsad
as3
da24
sd
@@
@@@
@@@
@
@
@@
@@@</template>
<script type="text/javascript" th:src="${domainName + 'layer/layer.js'}"></script>
</body>
</html>

@ -1,781 +0,0 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>书籍 - 探果网</title>
<script type="text/javascript">
window.treeCatalog = null;
window.baseUrl = "[[${domainName}]]";
window.saveing = false;
window.katex = { js: "[[${domainName}]]" + "katex/katex",css: "[[${domainName}]]" + "katex/katex"};
window.editormdLib = "[[${domainName}]]" + "editor.md/lib/";
window.editor = null;
window.imageUploadURL = "[[${domainName}]]" + "member/document/uploadImage";
window.fileUploadURL = "[[${domainName}]]" + "member/document/uploadFile";
window.selectNode = null;
window.deleteURL = "[[${domainName}]]" + "member/document/delete";
window.editURL = "[[${domainName}]]" + "member/document/";
window.releaseURL = "[[${domainName}]]" + "/book/xingzheng/release";
window.sortURL = "[[${domainName}]]" + "/book/xingzheng/sort";
window.historyURL = "[[${domainName}]]" + "member/document/history";
window.removeAttachURL = "[[${domainName}]]" + "member/document/removeFile";
window.highlightStyle = "github";
window.template = { "getUrl":"[[${domainName}]]" + "/api/template/get", "listUrl" : "[[${domainName}]]" + "/api/template/list", "deleteUrl" : "[[${domainName}]]" + "/api/template/remove", "saveUrl" :"[[${domainName}]]" + "/api/template/add"}
// ajax 获取文档信息
function getDocumentCategory() {
$.ajax({
url: "[[${domainName}]]" + "member/book/getDocumentList",
data: { "id": "[[${bookId}]]" },
type: "post",
dataType: "json",
async: false,
success: function (res) {
if (res.code === 0) {
window.documentCategory = res.result.documentList;
window.book = res.result.book;
}
}
});
}
</script>
<link th:href="${domainName + 'bootstrap/css/bootstrap.min.css'}" rel="stylesheet">
<link th:href="${domainName + 'font-awesome/css/font-awesome.min.css'}" rel="stylesheet">
<link th:href="${domainName + 'jstree/3.3.4/themes/default/style.min.css'}" rel="stylesheet">
<link th:href="${domainName + 'editor.md/css/editormd.css'}" rel="stylesheet">
<link th:href="${domainName + 'css/jstree.css'}" rel="stylesheet">
<link th:href="${domainName + 'webuploader/webuploader.css'}" rel="stylesheet">
<link th:href="${domainName + 'css/markdown.css'}" rel="stylesheet">
<link th:href="${domainName + 'css/markdown.preview.css'}" rel="stylesheet">
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
<style type="text/css">
.text{
font-size: 12px;
color: #999999;
font-weight: 200;
}
</style>
</head>
<body>
<div class="m-manual manual-editor">
<div class="manual-head" id="editormd-tools" style="min-width: 1200px; position:absolute;">
<div class="editormd-group">
<a href="http://doc.iminho.me/book" data-toggle="tooltip" data-title="返回"><i class="fa fa-chevron-left" aria-hidden="true"></i></a>
</div>
<div class="editormd-group">
<a href="javascript:;" id="markdown-save" data-toggle="tooltip" data-title="保存" class="disabled save"><i class="fa fa-save first" aria-hidden="true" name="save"></i></a>
<a href="javascript:;" id="markdown-template" data-toggle="tooltip" data-title="保存为模板" class="template"><i class="fa fa-briefcase last" aria-hidden="true" name="save-template"></i></a>
</div>
<div class="editormd-group">
<a href="javascript:;" data-toggle="tooltip" data-title="撤销 (Ctrl-Z)"><i class="fa fa-undo first" name="undo" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="重做 (Ctrl-Y)"><i class="fa fa-repeat last" name="redo" unselectable="on"></i></a>
</div>
<div class="editormd-group">
<a href="javascript:;" data-toggle="tooltip" data-title="粗体"><i class="fa fa-bold first" name="bold" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="斜体"><i class="fa fa-italic item" name="italic" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="删除线"><i class="fa fa-strikethrough last" name="del" unselectable="on"></i></a>
</div>
<div class="editormd-group">
<a href="javascript:;" data-toggle="tooltip" data-title="标题一"><i class="fa editormd-bold first" name="h1" unselectable="on">H1</i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="标题二"><i class="fa editormd-bold item" name="h2" unselectable="on">H2</i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="标题三"><i class="fa editormd-bold item" name="h3" unselectable="on">H3</i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="标题四"><i class="fa editormd-bold item" name="h4" unselectable="on">H4</i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="标题五"><i class="fa editormd-bold item" name="h5" unselectable="on">H5</i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="标题六"><i class="fa editormd-bold last" name="h6" unselectable="on">H6</i></a>
</div>
<div class="editormd-group">
<a href="javascript:;" data-toggle="tooltip" data-title="无序列表"><i class="fa fa-list-ul first" name="list-ul" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="有序列表"><i class="fa fa-list-ol item" name="list-ol" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="横线"><i class="fa fa-minus last" name="hr" unselectable="on"></i></a>
</div>
<div class="editormd-group">
<a href="javascript:;" data-toggle="tooltip" data-title="链接"><i class="fa fa-link first" name="link" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="引用链接"><i class="fa fa-anchor item" name="reference-link" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="添加图片"><i class="fa fa-picture-o item" name="image" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="行内代码"><i class="fa fa-code item" name="code" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="代码块" unselectable="on"><i class="fa fa-file-code-o item" name="code-block" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="添加表格"><i class="fa fa-table item" name="table" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="引用"><i class="fa fa-quote-right item" name="quote" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="GFM 任务列表"><i class="fa fa-tasks item" name="tasks" aria-hidden="true"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="附件"><i class="fa fa-paperclip item" aria-hidden="true" name="attachment"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="模板"><i class="fa fa-tachometer last" name="template"></i></a>
</div>
<div class="editormd-group pull-right">
<a href="javascript:;" data-toggle="tooltip" data-title="关闭实时预览"><i class="fa fa-eye-slash first" name="watch" unselectable="on"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="修改历史"><i class="fa fa-history item" name="history" aria-hidden="true"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="边栏"><i class="fa fa-columns item" aria-hidden="true" name="sidebar"></i></a>
<a href="javascript:;" data-toggle="tooltip" data-title="使用帮助"><i class="fa fa-question-circle-o last" aria-hidden="true" name="help"></i></a>
</div>
<div class="editormd-group pull-right">
<a href="javascript:;" data-toggle="tooltip" data-title="发布"><i class="fa fa-cloud-upload" name="release" aria-hidden="true"></i></a>
</div>
<div class="editormd-group">
<a href="javascript:;" data-toggle="tooltip" data-title=""></a>
<a href="javascript:;" data-toggle="tooltip" data-title=""></a>
</div>
<div class="clearfix"></div>
</div>
<div class="manual-body">
<div class="manual-category" id="manualCategory" style="position:absolute;">
<div class="manual-nav">
<div class="nav-item active"><i class="fa fa-bars" aria-hidden="true"></i> 文档</div>
<div class="nav-plus pull-right" id="btnAddDocument" data-toggle="tooltip" data-title="创建文档" data-direction="right"><i class="fa fa-plus" aria-hidden="true"></i></div>
<div class="clearfix"></div>
</div>
<div class="manual-tree" id="sidebar"> </div>
</div>
<div class="manual-editor-container" id="manualEditorContainer" style="min-width: 920px;">
<div class="manual-editormd">
<div id="docEditor" class="manual-editormd-active"></div>
</div>
<div class="manual-editor-status">
<div id="attachInfo" class="item">0 个附件</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="addDocumentModal" tabindex="-1" role="dialog" aria-labelledby="addDocumentModalLabel">
<div class="modal-dialog" role="document">
<form method="post" th:action="${domainName + 'member/document/create'}" id="addDocumentForm" class="form-horizontal">
<input type="hidden" name="bookId" th:value="${bookId}">
<input type="hidden" name="parentId" id="parentId" value="0">
<input type="hidden" name="id" id="docId" value="">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">添加文档</h4>
</div>
<div class="modal-body">
<div class="form-group">
<label class="col-sm-2 control-label">文档名称 <span class="error-message">*</span></label>
<div class="col-sm-10">
<input type="text" name="name" id="documentName" placeholder="文档名称" class="form-control" maxlength="50">
</div>
</div>
<div class="form-group">
<div class="col-lg-6">
<label>
<input type="radio" name="isOpen" value="1"> 展开<span class="text">(在阅读时会自动展开节点)</span>
</label>
</div>
<div class="col-lg-6">
<label>
<input type="radio" name="isOpen" value="0" checked> 关闭<span class="text">(在阅读时会关闭节点)</span>
</label>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="modal-footer">
<span id="add-error-message" class="error-message"></span>
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="submit" class="btn btn-primary" id="btnSaveDocument" data-loading-text="保存中...">立即保存</button>
</div>
</div>
</form>
</div>
</div>
<div class="modal fade" id="uploadAttachModal" tabindex="-1" role="dialog" aria-labelledby="uploadAttachModalLabel">
<div class="modal-dialog" role="document">
<form method="post" id="uploadAttachModalForm" class="form-horizontal">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">上传附件</h4>
</div>
<div class="modal-body">
<div class="attach-drop-panel">
<div class="upload-container" id="filePicker"><i class="fa fa-upload" aria-hidden="true"></i></div>
</div>
<div class="attach-list" id="attachList">
<template v-for="item in lists">
<div class="attach-item" :id="item.attachment_id">
<template v-if="item.state == 'wait'">
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100">
<span class="sr-only">0% Complete (success)</span>
</div>
</div>
</template>
<template v-else-if="item.state == 'error'">
<span class="error-message">${item.message}</span>
<button type="button" class="btn btn-sm close" @click="removeAttach(item.id)">
<i class="fa fa-remove" aria-hidden="true"></i>
</button>
</template>
<template v-else>
<a :href="item.filePath" target="_blank" :title="item.fileName">${item.fileName}</a>
<span class="text">(${ formatBytes(item.fileSize) })</span>
<span class="error-message">${item.message}</span>
<button type="button" class="btn btn-sm close" @click="removeAttach(item.id)">
<i class="fa fa-remove" aria-hidden="true"></i>
</button>
<div class="clearfix"></div>
</template>
</div>
</template>
</div>
</div>
<div class="modal-footer">
<span id="add-error-message" class="error-message"></span>
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" id="btnUploadAttachFile" data-dismiss="modal">确定</button>
</div>
</div>
</form>
</div>
</div>
<div class="modal fade" id="documentHistoryModal" tabindex="-1" role="dialog" aria-labelledby="documentHistoryModalModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">文档历史记录</h4>
</div>
<div class="modal-body text-center" id="historyList">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="documentTemplateModal" tabindex="-1" role="dialog" aria-labelledby="请选择模板类型" aria-hidden="true">
<div class="modal-dialog" style="width: 780px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="modal-title">请选择模板类型</h4>
</div>
<div class="modal-body template-list">
<div class="container">
<div class="section">
<a data-type="normal" href="javascript:;"><i class="fa fa-file-o"></i></a>
<h3><a data-type="normal" href="javascript:;">普通文档</a></h3>
<ul>
<li>默认类型</li>
<li>简单的文本文档</li>
</ul>
</div>
<div class="section">
<a data-type="api" href="javascript:;"><i class="fa fa-file-code-o"></i></a>
<h3><a data-type="api" href="javascript:;">API文档</a></h3>
<ul>
<li>用于API文档速写</li>
<li>支持代码高亮</li>
</ul>
</div>
<div class="section">
<a data-type="code" href="javascript:;"><i class="fa fa-book"></i></a>
<h3><a data-type="code" href="javascript:;">数据字典</a></h3>
<ul>
<li>用于数据字典显示</li>
<li>表格支持</li>
</ul>
</div>
<div class="section">
<a data-type="customs" href="javascript:;"><i class="fa fa-briefcase"></i></a>
<h3><a data-type="customs" href="javascript:;">自定义模板</a></h3>
<ul>
<li>自定义模板</li>
<li>支持任意类型文档</li>
<li>可以设置为全局模板</li>
</ul>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="displayCustomsTemplateModal" tabindex="-1" role="dialog" aria-labelledby="displayCustomsTemplateModalLabel">
<div class="modal-dialog" role="document" style="width: 750px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">自定义模板</h4>
</div>
<div class="modal-body text-center" id="displayCustomsTemplateList">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<td>#</td>
<td class="col-sm-3">模板名称</td>
<td class="col-sm-2">模板类型</td>
<td class="col-sm-2">创建人</td>
<td class="col-sm-3">创建时间</td>
<td class="col-sm-2">操作</td>
</tr>
</thead>
<tbody>
<tr>
<td colspan="7" class="text-center">暂无数据</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="saveTemplateModal" tabindex="-1" role="dialog" aria-labelledby="saveTemplateModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form method="post" action="http://doc.iminho.me/api/template/add" id="saveTemplateForm" class="form-horizontal">
<input type="hidden" name="identify" value="xingzheng">
<input type="hidden" name="content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">保存为模板</h4>
</div>
<div class="modal-body text-center">
<div class="form-group">
<label class="col-sm-2 control-label">模板名称 <span class="error-message">*</span></label>
<div class="col-sm-10">
<input type="text" name="template_name" id="templateName" placeholder="模板名称" class="form-control" maxlength="50">
</div>
</div>
<div class="form-group">
<div class="col-lg-6">
<label>
<input type="radio" name="is_global" value="1"> 全局<span class="text">(任何项目都可用)</span>
</label>
</div>
<div class="col-lg-6">
<label>
<input type="radio" name="is_global" value="0" checked> 项目<span class="text">(只有当前项目可用)</span>
</label>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="modal-footer">
<span class="error-message show-error-message"></span>
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="submit" class="btn btn-primary" id="btnSaveTemplate" data-loading-text="保存中...">立即保存</button>
</div>
</form>
</div>
</div>
</div>
<template id="template-normal">
# MinDoc 简介
[![Build Status](http://travis-ci.org/lifei6671/mindoc.svg?branch=master)](http://travis-ci.org/lifei6671/mindoc)
MinDoc 是一款针对IT团队开发的简单好用的文档管理系统。
MinDoc 的前身是 SmartWiki 文档系统。SmartWiki 是基于 PHP 框架 laravel 开发的一款文档管理系统。因 PHP 的部署对普通用户来说太复杂,所以改用 Golang 开发。可以方便用户部署和实用。
开发缘起是公司IT部门需要一款简单实用的项目接口文档管理和分享的系统。其功能和界面源于 kancloud 。
可以用来储存日常接口文档,数据库字典,手册说明等文档。内置项目管理,用户管理,权限管理等功能,能够满足大部分中小团队的文档管理需求。
演示站点: [http://doc.iminho.me](http://doc.iminho.me)
# 安装与使用
**如果你的服务器上没有安装golang程序请手动设置一个环境变量如下键名为 ZONEINFO值为MinDoc跟目录下的/lib/time/zoneinfo.zip 。**
**Windows 教程:** [http://github.com/lifei6671/minblob/master/README_WIN.md](docs/README_WIN.md)
**Linux 教程:** [http://github.com/lifei6671/minblob/master/README_LINUX.md](docs/README_LINUX.md)
**PDF 导出配置教程** [http://github.com/lifei6671/minblob/master/docs/README_LINUX.md](docs/WKHTMLTOPDF.md)
对于没有Golang使用经验的用户可以从 [http://github.com/lifei6671/minreleases](http://github.com/lifei6671/minreleases) 这里下载编译完的程序。
如果有Golang开发经验建议通过编译安装。
```bash
git clone http://github.com/lifei6671/mindoc.git
go get -d ./...
go build -ldflags "-w"
```
MinDoc 使用MySQL储存数据且编码必须是`utf8mb4_general_ci`。请在安装前,把数据库配置填充到项目目录下的 conf/app.conf 中。
如果conf目录下不存在 app.conf 请重命名 app.conf.example 为 app.conf。
如果 MinDoc 根目录下存在 install.lock 文件表示已经初始化过数据库,想要重新初始化数据库,只需要删除该文件重新启动程序即可。
**默认程序会自动创建表同时初始化一个超级管理员用户admin 密码123456 。请登录后重新设置密码。**
## Linux 下后台运行
在 Linux 如果想让程序后台运行可以执行如下命令:
```bash
#使程序后台运行
nohup ./godoc &
```
该命令会使程序后台执行,但是服务器重启后不会自动启动服务。
使用 supervisor 做服务,可以使服务器重启后自动重启 MinDoc。
## Windows 下后台运行
Windows 下后台运行需要借助 CMD 命令行命令:
```bash
#在MinDoc跟目录下新建一个slave.vbs文件
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c start.bat",vbhide
#再建一个start.bat文件
@echo off
godoc_windows_amd64.exe
```
启动时双击slave.vbs即可等待程序初始化完数据库会在该目录下创建一个install.lock文件标识已安装成功。
如果是自己编译可以用以下命令即可编译出不依赖cmd命令的后台运行的程序
```bash
go build -ldflags "-H=windowsgui"
```
通过该命令编译的Golang程序在Windows上默认后台运行。
请将将 MinDoc 加入开机启动列表,使程序开机启动。
## 密码找回功能
密码找回功能依赖邮件服务,因此,需要配置邮件服务才能使用该功能,该配置位于 `conf/app.conf` 中:
```bash
#邮件配置
#是否启用邮件
enable_mail=true
#smtp服务器的账号
smtp_user_name=admin@iminho.me
#smtp服务器的地址
smtp_host=smtp.ym.163.com
#密码
smtp_password=1q2w3e__ABC
#端口号
smtp_port=25
#邮件发送人的地址
form_user_name=admin@iminho.me
#邮件有效期30分钟
mail_expired=30
```
# 使用Docker部署
如果是Docker用户可参考项目内置的Dockerfile文件编译镜像。
在启动镜像时需要提供如下的环境变量:
```ini
MYSQL_PORT_3306_TCP_ADDR MySQL地址
MYSQL_PORT_3306_TCP_PORT MySQL端口号
MYSQL_INSTANCE_NAME MySQL数据库名称
MYSQL_USERNAME MySQL账号
MYSQL_PASSWORD MySQL密码
HTTP_PORT 程序监听的端口号
```
举个栗子
```bash
docker run -p 8181:8181 -e MYSQL_PORT_3306_TCP_ADDR=127.0.0.1 -e MYSQL_PORT_3306_TCP_PORT=3306 -e MYSQL_INSTANCE_NAME=mindoc_db -e MYSQL_USERNAME=root -e MYSQL_PASSWORD=123456 -e httpport=8181 -d daocloud.io/lifei6671/mindoc:latest
```
# 项目截图
**创建项目**
![创建项目](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501204438.png)
**项目列表**
![项目列表](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501203542.png)
**项目概述**
![项目概述](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501203619.png)
**项目成员**
![项目成员](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501203637.png)
**项目设置**
![项目设置](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501203656.png)
**基于Editor.md开发的Markdown编辑器**
![基于Editor.md开发的Markdown编辑器](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501203854.png)
**基于wangEditor开发的富文本编辑器**
![基于wangEditor开发的富文本编辑器](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501204651.png)
**项目预览**
![项目预览](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501204609.png)
**超级管理员后台**
![超级管理员后台](http://raw.githubusercontent.com/lifei6671/minmaster/uploads/20170501204710.png)
# 使用的技术
- beego 1.8.1
- mysql 5.6
- editor.md
- bootstrap 3.2
- jquery 库
- layer 弹出层框架
- webuploader 文件上传框架
- Nprogress 库
- jstree 树状结构库
- font awesome 字体库
- cropper 图片剪裁库
- layer 弹出层框架
- highlight 代码高亮库
- to-markdown HTML转Markdown库
- wangEditor 富文本编辑器
# 主要功能
- 项目管理,可以对项目进行编辑更改,成员添加等。
- 文档管理,添加和删除文档等。
- 评论管理,可以管理文档评论和自己发布的评论。
- 用户管理,添加和禁用用户,个人资料更改等。
- 用户权限管理 实现用户角色的变更。
- 项目加密可以设置项目公开状态私有项目需要通过Token访问。
- 站点配置,可开启匿名访问、验证码等。
# 参与开发
我们欢迎您在 MinDoc 项目的 GitHub 上报告 issue 或者 pull request。
如果您还不熟悉GitHub的Fork and Pull开发模式您可以阅读GitHub的文档http://help.github.com/articles/using-pull-requests 获得更多的信息。
# 关于作者
一个不纯粹的PHPer一个不自由的 gopher 。
</template>
<template id="template-api">
#### 简要描述:
- 用户登录接口
#### 接口版本:
|版本号|制定人|制定日期|修订日期|
|:---- |:---|:----- |----- |
|2.1.0 |秦亮 |2017-03-20 | xxxx-xx-xx |
#### 请求URL:
- http://xx.com/api/login
#### 请求方式:
- GET
- POST
#### 请求头:
|参数名|是否必须|类型|说明|
|:---- |:---|:----- |----- |
|Content-Type |是 |string |请求类型: application/json |
|Content-MD5 |是 |string | 请求内容签名 |
#### 请求参数:
|参数名|是否必须|类型|说明|
|:---- |:---|:----- |----- |
|username |是 |string |用户名 |
|password |是 |string | 密码 |
#### 返回示例:
**正确时返回:**
```
{
"errcode": 0,
"data": {
"uid": "1",
"account": "admin",
"nickname": "Minho",
"group_level": 0 ,
"create_time": "1436864169",
"last_login_time": "0",
}
}
```
**错误时返回:**
```
{
"errcode": 500,
"errmsg": "invalid appid"
}
```
#### 返回参数说明:
|参数名|类型|说明|
|:----- |:-----|----- |
|group_level |int |用户组id1超级管理员2普通用户 |
#### 备注:
- 更多返回错误代码请看首页的错误代码描述
</template>
<template id="template-code">
### 数据库字典
#### 用户表,储存用户信息
|字段|类型|空|默认|注释|
|:---- |:------- |:--- |-- -|------ |
|uid |int(10) |否 | | |
|username |varchar(20) |否 | | 用户名 |
|password |varchar(50) |否 | | 密码 |
|name |varchar(15) |是 | | 昵称 |
|reg_time |int(11) |否 | 0 | 注册时间 |
#### 备注:无
</template>
<script th:src="${domainName + 'js/array.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'jquery/1.12.4/jquery.min.js'}"></script>
<script th:src="${domainName + 'vuejs/vue.min.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'bootstrap/js/bootstrap.min.js'}"></script>
<script th:src="${domainName + 'webuploader/webuploader.min.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'jstree/3.3.4/jstree.min.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'editor.md/editormd.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'layer/layer.js'}" type="text/javascript" ></script>
<script th:src="${domainName + 'js/jquery.form.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'js/array.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'js/editor.js'}" type="text/javascript"></script>
<script th:src="${domainName + 'js/markdown.js'}" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$("#attachInfo").on("click",function () {
$("#uploadAttachModal").modal("show");
});
window.uploader = null;
$("#uploadAttachModal").on("shown.bs.modal",function () {
if(window.uploader === null){
try {
window.uploader = WebUploader.create({
auto: true,
dnd : true,
swf: '[[${domainName}]]' + 'static/webuploader/Uploader.swf',
server: '[[${domainName}]]' + 'member/document/uploadFile',
formData : { "bookId" : $("input[name='bookId']").val() , "documentId" : window.selectNode.id},
pick: "#filePicker",
fileVal : "editormd-file-file",
compress : false,
fileSingleSizeLimit: 10485760
}).on("beforeFileQueued",function (file) {
this.options.formData.documentId = window.selectNode.id;
this.options.formData.bookId = $("input[name='bookId']").val();
}).on( 'fileQueued', function( file ) {
var item = {
state : "wait",
attachment_id : file.id,
file_size : file.size,
file_name : file.name,
message : "正在上传"
};
window.vueApp.lists.push(item);
}).on("uploadError",function (file,reason) {
for(var i in window.vueApp.lists){
var item = window.vueApp.lists[i];
if(item.attachment_id == file.id){
item.state = "error";
item.message = "上传失败:" + reason;
break;
}
}
}).on("uploadSuccess",function (file, res) {
for(var index in window.vueApp.lists){
var item = window.vueApp.lists[index];
if(item.attachment_id === file.id){
if(res.code === 0) {
window.vueApp.lists.splice(index, 1, res.result ? res.result : res.result);
}else{
item.message = res.message;
item.state = "error";
}
}
}
}).on("uploadProgress",function (file, percentage) {
var $li = $( '#'+file.id ),
$percent = $li.find('.progress .progress-bar');
$percent.css( 'width', percentage * 100 + '%' );
}).on("error", function (type) {
if(type === "F_EXCEED_SIZE"){
layer.msg("文件超过了限定大小");
}
console.log(type);
});
}catch(e){
console.log(e);
}
}
});
});
getDocumentCategory();
</script>
</body>
</html>

@ -1,130 +0,0 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="SmartWiki" />
<title>历史版本 - Tamguo</title>
<link th:href="${domainName + 'bootstrap/css/bootstrap.min.css'}" rel="stylesheet">
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
<script th:src="${domainName + 'jquery/1.12.4/jquery.min.js'}"></script>
<style type="text/css">
.container{margin: 5px auto;}
</style>
</head>
<body>
<div class="container">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<td class="col-sm-6">修改时间</td>
<td class="col-sm-2">修改人</td>
<td class="col-sm-2">操作</td>
</tr>
</thead>
<tbody>
<tr th:each="history,status:${historyList}">
<td th:text="${#dates.format(history.updateDate, 'yyyy-MM-dd HH:mm:ss')}">2018-11-14 06:55:34</td>
<td th:text="${history.owner}">admin</td>
<td>
<button class="btn btn-danger btn-sm delete-btn" th:attr="data-id=${history.id}" data-loading-text="删除中...">
删除
</button>
<button class="btn btn-success btn-sm restore-btn" th:attr="data-id=${history.id}" data-loading-text="恢复中...">
恢复
</button>
<button class="btn btn-success btn-sm compare-btn" th:attr="data-id=${history.id}">
合并
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<script th:src="${domainName + 'bootstrap/js/bootstrap.min.js'}"></script>
<script th:src="${domainName + 'layer/layer.js'}" type="text/javascript" ></script>
<script type="text/javascript">
$(function () {
$(".delete-btn").on("click",function () {
var id = $(this).attr('data-id');
var $btn = $(this).button('loading');
var $then = $(this);
if(!id){
layer.msg('参数错误');
}else{
$.ajax({
url : "[[${domainName}]]" + "member/document/history/delete",
type : "post",
dataType : "json",
data : { "id" : id },
success :function (res) {
if(res.code === 0){
$then.parents('tr').remove().empty();
}else{
layer.msg(res.message);
}
},
error : function () {
$btn.button('reset');
}
})
}
});
$(".restore-btn").on("click",function () {
var id = $(this).attr('data-id');
var $btn = $(this).button('loading');
var $then = $(this);
var index = parent.layer.getFrameIndex(window.name);
if(!id){
layer.msg('参数错误');
}else{
$.ajax({
url : "[[${domainName}]]" + "member/document/history/restore",
type : "post",
dataType : "json",
data : { "id" : id },
success :function (res) {
if(res.code === 0){
var $node = { "node" : { "id" : res.result.id}};
parent.loadDocument($node);
parent.layer.close(index);
}else{
layer.msg(res.message);
}
},
error : function () {
$btn.button('reset');
}
})
}
});
$(".compare-btn").on("click",function () {
var historyId = $(this).attr("data-id");
window.compareIndex = window.top.layer.open({
type: 2,
title: '文档比较【左侧为历史文档,右侧为当前文档,请将文档合并到右侧】',
shade: 0.8,
area: ['380px', '90%'],
content: "[[${domainName}]]" + "member/document/history/compare/" + historyId
});
window.top.layer.full(window.compareIndex);
});
});
</script>
</body>
</html>

@ -1,113 +0,0 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>书籍列表 - 探果网</title>
<link rel="stylesheet" th:href="${domainName + 'css/reset.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/iconfont.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/member/bookList.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/member/memberMain.css'}" />
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
<!-- 引入样式 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.4.2/lib/theme-chalk/index.css">
<style type="text/css">
.time {
font-size: 13px;
color: #999;
}
.bottom {
margin-top: 13px;
line-height: 12px;
}
.button {
padding: 0;
float: right;
}
.image {
width: 100%;
display: block;
}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both
}
</style>
</head>
<body style="position: relative;height: auto;min-height: 100%;">
<div class="head" th:fragment="memberHeader">
<div class="head-bar public">
<div class="logo">
<a target="_blank" th:href="${domainName}">
<img th:src="${domainName + 'images/logo_731bc32.png'}">
</a>
<p><span>书籍中心</span></p>
</div>
<ul class="nav">
<li><a th:href="${domainName + 'member/index.html'}">首页</a></li>
<li class="active"><a th:href="${domainName + 'member/book/list.html'}">书籍</a></li>
<li><a th:href="${domainName + 'member/account.html'}">帐号</a></li>
</ul>
<div class="mguser">
<div class="mguser-box">
<span th:text="${session.currMember.username}">tamguo</span>
<a th:href="${domainName + 'logout.html'}">退出</a>
</div>
</div>
</div>
</div>
<div class="cnav">
<div class="public cnav_b">
<div class="cnav_left">
探果五步曲
</div>
<div class="cnav_right">
<ul>
<li><span class="Cnav_t">1</span><b>新建书籍</b></li>
<li><span>2</span>添加章节</li>
<li><span>3</span>书写内容</li>
<li><span>4</span>发布试卷</li>
<li><span>5</span>等待收益</li>
</ul>
</div>
</div>
</div>
<div class="plist test_public myPositionList ng-scope" style="padding:10px;">
<div class="topbt topbt-2">
<h3>我的试卷</h3>
</div>
<div class="pageShow" id="pageShow" style="padding:40px;">
<div class="con_top addNewPaper">
<span style="text-align: center;" id="addSiama"><a href="javascript:void(0)">+ 新建试卷</a></span>
</div>
<div class="slide-list" style="width: 4050px; left: -2025px;"><ul class="list-col list-col5 list-express slide-item clone">
</div>
<div class="clear" style="margin-top: 20px;"></div>
</div>
</div>
<!-- 尾部-->
<div th:replace="include/memberFooter :: memberFooter"></div>
</body>
<script type="text/javascript" th:inline="javascript">
var mainHttp = [[${domainName}]];
</script>
<!-- import JavaScript -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16"></script>
<script src="https://cdn.jsdelivr.net/npm/element-ui@2.4.2/lib/index.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios@0.18.0/dist/axios.min.js"></script>
<script type="text/javascript" th:src="${domainName + 'js/member/bookList.js'}" ></script>
</html>

@ -1,134 +0,0 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>会员中心 - 探果网</title>
<link rel="stylesheet" th:href="${domainName + 'css/reset.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/iconfont.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/member/index.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/member/memberMain.css'}" />
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
</head>
<body>
<!-- 头部-->
<div class="head" th:fragment="memberHeader">
<div class="head-bar public">
<div class="logo">
<a target="_blank" th:href="${domainName}">
<img th:src="${domainName + 'images/logo_731bc32.png'}">
</a>
<p><span>书籍中心</span></p>
</div>
<ul class="nav">
<li class="active"><a th:href="${domainName + 'member/index.html'}">首页</a></li>
<li><a th:href="${domainName + 'member/book/list.html'}">书籍</a></li>
<li><a th:href="${domainName + 'member/account.html'}">帐号</a></li>
</ul>
<div class="mguser">
<div class="mguser-box">
<span th:text="${member.username}">tamguo</span>
<a th:href="${domainName + 'logout.html'}">退出</a>
</div>
</div>
</div>
</div>
<!--主体-->
<div class="cnav">
<div class="public cnav_b">
<div class="cnav_left">
探果五步曲
</div>
<div class="cnav_right">
<ul>
<li><span class="Cnav_t">1</span><b>新建书籍</b></li>
<li><span>2</span>添加章节</li>
<li><span>3</span>书写内容</li>
<li><span>4</span>发布书籍</li>
<li><span>5</span>等待收益</li>
</ul>
</div>
</div>
</div>
<div class="PCshow hide" style="display: block;">
<div class="examContent public">
<h2>
<img th:src="${domainName + 'images/member/index/face-xiao.png'}"
style="position: relative; top: -2px;"> &nbsp;<span
style="letter-spacing: 4px;">
<b id="userName" style="font-weight: normal; color: #2abcb8" th:text="${member.nickName}">tamguo</b>,您好!欢迎来到探果网会员中心
</span>
</h2>
<!-- 左侧基本信息项 -->
<div class="newsLeft">
<div class="baseNews">
<h3><i></i> 基本信息</h3>
<div id="borderBox">
<table style="float: left;">
<tbody><tr>
<td>
<span class="logoV">
<img th:src="${domainName + member.avatar}">
</span>
</td>
</tr>
</tbody></table>
<b th:title="${member.username}" style="font-size: 16px; margin-left: 14px;float: left;display: inline-block;font-weight: normal;max-width: 100px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;" th:text="${member.username}">盘诚软件</b>
<a style="font-size: 12px;" th:href="${domainName + 'member/account.html'}"><i class="iconfont icon-icon_edit"></i> 编辑</a>
</div>
<p style="clear: both;height: 0px;"></p>
</div>
<div class="well"></div>
<div class="userNews">
<h3><i></i> 账户信息</h3>
<ul>
<li style="padding-left: 21px;">积分:
<b style="margin-left:14px;color:#009688;" id="examCandsNum" th:text="${member.point + ' '}">1000</b>
</li>
<li style="padding-left: 24px;">余额:<b style="margin-left: 19px;color:#009688;" th:text="${#numbers.formatDecimal(member.amount,1,2) + ' '}">50</b></li>
<li style="padding-left: 21px;">最近登录时间:<b style="margin-left: 13px;" th:text="${#dates.format(member.lastLoginTime * 1000, 'yyyy/MM/ss HH:mm')}">2018-04-27 10:32</b></li>
</ul>
<a th:href="${domainName}" target="_blank" id="addMoney">我的钱包</a>
</div>
</div>
<!-- 右侧信息显示 -->
<div class="newsR">
<div class="topNews" id="numList1">
<ul>
<li>
<img th:src="${domainName + 'images/member/index/peneil.png'}" style="margin-top: 26px;position: relative;top: -4px;"><br>
<span><b id="datab1" th:text="${member.downNum}">0</b></span><br>
<span>下载总数</span>
</li>
<li>
<img th:src="${domainName + 'images/member/index/paperm.png'}" style="margin-top: 26px;position: relative;top: -4px;"><br>
<span><b id="datab2" th:text="${member.paperNum}">1</b></span><br>
<span>书籍总数</span>
</li>
<li>
<img th:src="${domainName + 'images/member/index/peoplem.png'}" style="margin-top: 26px;position: relative;top: -4px;"><br>
<span><b id="datab3" th:text="${member.hitsNum}">0</b></span><br>
<span>阅读总数</span>
</li>
<li>
<img th:src="${domainName + 'images/member/index/testnew.png'}" style="margin-top: 26px;position: relative;top: -6px;"><br>
<span><b id="datab4" th:text="${member.questionNum}">19</b></span><br>
<span>章节总数</span>
</li>
</ul>
<div class="newExam">
<div class="add-p">
<a th:href="${domainName + 'member/book/list.html'}"><i class="iconfont icon-jia" style="font-size:130px;"></i></a>
</div>
<a th:href="${domainName + 'member/book/list.html'}">开始新建书籍</a>
</div>
</div>
</div>
</div>
</div>
<!-- 尾部-->
<div th:replace="include/memberFooter :: memberFooter"></div>
</body>
</html>

@ -28,6 +28,8 @@ public class BookEntity extends Model<BookEntity>{
@TableField(exist=false) @TableField(exist=false)
private List<String> categoryIds; private List<String> categoryIds;
@TableField(exist=false)
private String memberName;
public String getId() { public String getId() {
return id; return id;
@ -99,4 +101,10 @@ public class BookEntity extends Model<BookEntity>{
public void setCategoryIds(List<String> categoryIds) { public void setCategoryIds(List<String> categoryIds) {
this.categoryIds = categoryIds; this.categoryIds = categoryIds;
} }
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
} }

Loading…
Cancel
Save