会员中心重构。

main
tamguo 7 years ago
parent ce3a950a76
commit 097d3244a4

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

@ -0,0 +1 @@
/target/

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>tamguo-mms</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

@ -0,0 +1,6 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding/<project>=UTF-8

@ -0,0 +1,5 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.8

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

@ -0,0 +1,171 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tamguo</groupId>
<artifactId>tamguo-mms</artifactId>
<version>1.0.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<mybatis-plus-boot-starter.version>2.1.9</mybatis-plus-boot-starter.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mybatis-plus begin -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
<exclusions>
<exclusion>
<artifactId>tomcat-jdbc</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- mybatis-plus end -->
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>cn.songxinqiang</groupId>
<artifactId>com.baidu.ueditor</artifactId>
<version>1.1.2-edit-1.0</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>com.bladejava</groupId>
<artifactId>blade-patchca</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.tamguo</groupId>
<artifactId>tamguo-modules-core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>mms</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,36 @@
package com.tamguo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@SpringBootApplication
@ComponentScan("com.tamguo")
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).run(args);
}
/**
* FastJsonJackson
* @return
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
fastConverter.setFastJsonConfig(fastJsonConfig);
FastJsonHttpMessageConverter converter = fastConverter;
return new HttpMessageConverters(converter);
}
}

@ -0,0 +1,23 @@
package com.tamguo.config.dao;
import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ,
*/
//@Component
public class MyMetaObjectHandler extends MetaObjectHandler {
protected final static Logger logger = LoggerFactory.getLogger(MyMetaObjectHandler.class);
@Override
public void insertFill(MetaObject metaObject) {
}
@Override
public void updateFill(MetaObject metaObject) {
}
}

@ -0,0 +1,93 @@
package com.tamguo.config.dao;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.mapper.ISqlInjector;
import com.baomidou.mybatisplus.mapper.LogicSqlInjector;
import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.plugins.parser.ISqlParser;
import com.baomidou.mybatisplus.plugins.parser.tenant.TenantHandler;
import com.baomidou.mybatisplus.plugins.parser.tenant.TenantSqlParser;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
@Configuration
@MapperScan("com.tamguo.modules.*.dao*")
public class MybatisPlusConfig {
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* mybatis-plus<br>
* http://mp.baomidou.com<br>
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setLocalPage(true);// 开启 PageHelper 的支持
/*
* SQL <br>
* 1 cookie SQL <br>
*/
List<ISqlParser> sqlParserList = new ArrayList<>();
TenantSqlParser tenantSqlParser = new TenantSqlParser();
tenantSqlParser.setTenantHandler(new TenantHandler() {
@Override
public Expression getTenantId() {
return new LongValue(1L);
}
@Override
public String getTenantIdColumn() {
return "course_id";
}
@Override
public boolean doTableFilter(String tableName) {
// 这里可以判断是否过滤表
return true;
}
});
sqlParserList.add(tenantSqlParser);
paginationInterceptor.setSqlParserList(sqlParserList);
// 以下过滤方式与 @SqlParser(filter = true) 注解等效
// paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
// @Override
// public boolean doFilter(MetaObject metaObject) {
// MappedStatement ms = PluginUtils.getMappedStatement(metaObject);
// // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
// if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {
// return true;
// }
// return false;
// }
// });
return paginationInterceptor;
}
@Bean
public MetaObjectHandler metaObjectHandler(){
return new MyMetaObjectHandler();
}
/**
* sql
*/
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
}

@ -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;
}
}

@ -0,0 +1,21 @@
package com.tamguo.config.web;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
@Component
public class ErrorConfigurar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage[] errorPages=new ErrorPage[2];
errorPages[0]=new ErrorPage(HttpStatus.NOT_FOUND,"/error404");
errorPages[1]=new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/error500");
registry.addErrorPages(errorPages);
}
}

@ -0,0 +1,40 @@
package com.tamguo.config.web;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import com.tamguo.common.utils.SystemConstant;
@Component
public class ThymeleafConfig implements EnvironmentAware{
@Resource
private Environment env;
@Resource
private void configureThymeleafStaticVars(ThymeleafViewResolver viewResolver) {
if(viewResolver != null) {
Map<String, Object> vars = new HashMap<>();
vars.put("domainName", env.getProperty("domain.name"));
vars.put("adminDomain", env.getProperty("admin.domain.name"));
vars.put("PAPER_TYPE_ZHENTI", SystemConstant.ZHENGTI_PAPER_ID);
vars.put("PAPER_TYPE_MONI", SystemConstant.MONI_PAPER_ID);
vars.put("PAPER_TYPE_YATI", SystemConstant.YATI_PAPER_ID);
vars.put("PAPER_TYPE_MINGXIAO", SystemConstant.MINGXIAO_PAPER_ID);
vars.put("BEIJING_AREA_ID", SystemConstant.BEIJING_AREA_ID);
viewResolver.setStaticVariables(vars);
}
}
@Override
public void setEnvironment(Environment environment) {
env = environment;
}
}

@ -0,0 +1,30 @@
package com.tamguo.config.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.tamguo.web.interceptor.MemberInterceptor;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Value("${file.storage.path}")
private String fileStoragePath;
@Autowired
private MemberInterceptor memberInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(memberInterceptor).addPathPatterns("/member/**").excludePathPatterns("login.html","register.html","password/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**").addResourceLocations("file:"+fileStoragePath);
}
}

@ -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();
}
}

@ -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, "未登录");
}
}

@ -0,0 +1,81 @@
package com.tamguo.web;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.tamguo.common.utils.Result;
import com.tamguo.common.utils.SystemConstant;
import com.tamguo.modules.member.service.IMemberService;
@Controller
public class PasswordController {
@Autowired
private IMemberService iMemberService;
@RequestMapping(value = "password/find.html", method = RequestMethod.GET)
public ModelAndView confirmAccount(ModelAndView model){
model.setViewName("password/confirmAccount");
return model;
}
@RequestMapping(value = "password/confirmAccount.html", method = RequestMethod.POST)
public ModelAndView submitConfirmAccount(String username , String veritycode , ModelAndView model , HttpSession session){
Result result = iMemberService.confirmAccount(username, veritycode);
String kaptcha = session.getAttribute(SystemConstant.KAPTCHA_SESSION_KEY).toString();
if (!veritycode.equalsIgnoreCase(kaptcha)) {
result = Result.result(202, null, "验证码错误");
}
if(result.getCode() == 200){
model.setViewName("password/securityCheck");
model.addObject("result", result);
model.addObject("isEmail", username.contains("@") ? "1" : "0");
}else{
model.setViewName("password/confirmAccount");
model.addObject("account", username);
model.addObject("username",username);
model.addObject("veritycode", veritycode);
model.addObject("code", result.getCode());
}
return model;
}
@RequestMapping(value = "password/securityCheck.html", method = RequestMethod.POST)
public ModelAndView securityCheck(String username , String isEmail , String mobileVcode , ModelAndView model){
Result result = iMemberService.securityCheck(username , isEmail , mobileVcode);
if(result.getCode() == 200){
model.addObject("username", username);
model.addObject("resetPasswordKey" , result.getResult());
model.setViewName("password/resetPassword");
}else{
model.addObject("result", result);
model.addObject("isEmail", isEmail);
model.addObject("codeError", "1");
model.setViewName("password/securityCheck");
}
return model;
}
@RequestMapping(value = "password/resetPassword.html", method = RequestMethod.POST)
public ModelAndView resetPassword(String resetPasswordKey , String username , String password , String verifypwd , ModelAndView model){
Result result = iMemberService.resetPassword(resetPasswordKey , username , password , verifypwd);
if(result.getCode() == 200){
model.setViewName("password/resetPwSuccess");
}else{
model.setViewName("password/resetPassword");
}
return model;
}
@RequestMapping(value = "password/checkAccount.html", method = RequestMethod.GET)
@ResponseBody
public Result checkAccount(String account){
return iMemberService.checkAccount(account);
}
}

@ -0,0 +1,69 @@
package com.tamguo.web;
import javax.servlet.http.HttpSession;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
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.utils.Result;
import com.tamguo.modules.member.model.MemberEntity;
import com.tamguo.modules.member.service.IMemberService;
import com.tamguo.utils.ShiroUtils;
@Controller
public class RegisterController {
@Autowired
private IMemberService iMemberService;
@RequestMapping(value = "/register.html", method = RequestMethod.GET)
public ModelAndView register(ModelAndView model , HttpSession session) {
model.setViewName("register");
return model;
}
@RequestMapping(value = "/checkUsername.html", method = RequestMethod.GET)
@ResponseBody
public Result checkUsername(String username){
return iMemberService.checkUsername(username);
}
@RequestMapping(value = "/checkMobile.html", method = RequestMethod.GET)
@ResponseBody
public Result checkMobile(String mobile){
return iMemberService.checkMobile(mobile);
}
@RequestMapping(value = "/subRegister.html", method = RequestMethod.POST)
@ResponseBody
public Result subRegister(@RequestBody MemberEntity member , HttpSession session){
Result result = iMemberService.register(member);
if(result.getCode() == 200) {
Subject subject = ShiroUtils.getSubject();
MemberEntity memberEntity = (MemberEntity) result.getResult();
UsernamePasswordToken token = new UsernamePasswordToken(memberEntity.getUsername(), member.getPassword());
try {
subject.login(token);
session.setAttribute("currMember", ShiroUtils.getMember());
} catch (UnknownAccountException e) {
return Result.result(201, null, "用户名或密码有误,请重新输入或找回密码");
} catch (IncorrectCredentialsException e) {
return Result.result(202, null, "用户名或密码有误,请重新输入或找回密码");
} catch (LockedAccountException e) {
return Result.result(203, null, "账号被锁定");
}
}
return result;
}
}

@ -0,0 +1,55 @@
package com.tamguo.web.interceptor;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@Component
public class MemberInterceptor extends HandlerInterceptorAdapter{
/** "重定向URL"参数名称 */
private static final String REDIRECT_URL_PARAMETER_NAME = "redirectUrl";
/** 默认登录URL */
private static final String DEFAULT_LOGIN_URL = "/login.html";
/** 登录URL */
private String loginUrl = DEFAULT_LOGIN_URL;
/**
*
*
* @param request
* HttpServletRequest
* @param response
* HttpServletResponse
* @param handler
*
* @return
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object currMember = request.getSession().getAttribute("currMember");
if (currMember != null) {
return true;
} else {
String requestType = request.getHeader("X-Requested-With");
if (requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest")) {
response.addHeader("loginStatus", "accessDenied");
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return false;
} else {
if (request.getMethod().equalsIgnoreCase("GET")) {
String redirectUrl = request.getQueryString() != null ? request.getRequestURI() + "?" + request.getQueryString() : request.getRequestURI();
response.sendRedirect(request.getContextPath() + loginUrl + "?" + REDIRECT_URL_PARAMETER_NAME + "=" + URLEncoder.encode(redirectUrl, "UTF-8"));
} else {
response.sendRedirect(request.getContextPath() + loginUrl);
}
return false;
}
}
}
}

@ -0,0 +1,62 @@
domain.name=http://localhost:8084/
admin.domain.name=http://localhost:8084/
server.port=8084
jasypt.encryptor.password=tamguo
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.filters=stat,wall,log4j
spring.datasource.initialSize=5
spring.datasource.maxActive=20
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.maxWait=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.minIdle=5
spring.datasource.password=123456
spring.datasource.poolPreparedStatements=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.testWhileIdle=true
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tamguo_20181110?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.validationQuery=SELECT 1 FROM DUAL
mybatis-plus.mapper-locations=classpath:/mappers/*Mapper.xml
mybatis-plus.typeAliasesPackage=com.tamguo.modules.*.model
mybatis-plus.typeEnumsPackage=com.tamguo.modules.*.model.enums
mybatis-plus.global-config.id-type=5
mybatis-plus.global-config.field-strategy=2
mybatis-plus.global-config.db-column-underline=true
mybatis-plus.global-config.refresh-mapper=true
mybatis-plus.global-config.key-generator=com.baomidou.mybatisplus.incrementer.H2KeyGenerator
mybatis-plus.global-config.logic-delete-value=0
mybatis-plus.global-config.logic-not-delete-value=1
mybatis-plus.global-config.sql-injector=com.baomidou.mybatisplus.mapper.LogicSqlInjector
mybatis-plus.global-config.meta-object-handler=com.tamguo.config.dao.MyMetaObjectHandler
mybatis-plus.global-config.sql-parser-cache=true
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false
redis.hostname=127.0.0.1
redis.port=6379
redis.password=
logging.level.root=INFO
logging.level.org.springframework.web=INFO
logging.file=/home/webdata/log/tamguo.log
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
file.storage.path=/home/webdata/files/

@ -0,0 +1,11 @@
<ehcache updateCheck="false" name="shiroCache">
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
</ehcache>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<redis>
<preKey value="TAMGUO:" />
<pool maxActive="50" maxIdle="20" maxWait="1000" />
<servers>
<!-- test -->
<server ip="127.0.0.1" port="6379"/>
</servers>
</redis>

@ -0,0 +1,560 @@
#wrapper {
background: #fff;
height: auto;
position: relative;
min-height: 100%;
_height: 100%;
width: 920px;
margin: 0 auto;
}
#wrapper {
width: 100%;
}
#head {
padding-top: 40px;
}
#head, #content, #foot {
width: 980px;
margin-left: auto;
margin-right: auto;
}
#head {
height: 75px;
z-index: 100;
}
.mod-header {
display: inline;
font-size: 66px;
}
a {
text-decoration: underline;
color: #00c;
}
#nav {
width: 100%;
background: #fafafa;
z-index: 1;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
}
#content {
margin-top: 30px;
width: 920px;
background: url(../../images/member/login-bg.png) no-repeat 0 center;
padding-bottom: 40px;
display: none;
}
.login-container {
_height: 475px;
min-height: 475px;
}
.login-form {
float: right;
width: 354px;
font-family: "Microsoft Yahei", , Arial, STHeiti;
box-shadow: rgb(239, 239, 239) 1px 1px 1px;
padding-top: 25px;
border-width: 1px;
border-style: solid;
border-color: rgb(239, 239, 239);
border-image: initial;
}
.tang-pass-login {
position: relative;
}
.tang-pass-login .pass-form {
padding: 0 28px;
}
p.pass-form-logo {
background: url(../../images/logo_731bc32.png) no-repeat left;
background: url(../../images/logo_731bc32.png) no-repeat left;
font-size: 16px;
height: 32px;
line-height: 46px;
padding-left: 118px;
color: #000;
margin-top: 0;
margin-bottom: 15px;
}
.tang-pass-login a, .tang-pass-login label, .tang-pass-login p, .tang-pass-login li, .tang-pass-login input {
font-size: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.tang-pass-login .pass-generalErrorWrapper {
height: auto;
_height: 28px;
min-height: 28px;
color: #fc4343;
padding-bottom: 2px;
}
.tang-pass-login .pass-generalError {
display: block;
font-size: 12px;
line-height: 14px;
padding-top: 8px;
}
.tang-pass-login .pass-form-item.pass-form-item-userName {
z-index: 21;
}
.tang-pass-login .pass-form-item {
position: relative;
clear: both;
z-index: 18;
}
.tang-pass-login .pass-form-item {
margin-bottom: 16px;
}
.tang-pass-login a, .tang-pass-login label, .tang-pass-login p, .tang-pass-login li, .tang-pass-login input {
font-size: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.tang-pass-login .pass-form-item input.pass-text-input-userName, .tang-pass-login .pass-form-item input.pass-text-input-password {
padding-left: 8px;
width: 284px;
}
.tang-pass-login .pass-form-item .pass-text-input {
position: relative;
z-index: 17;
display: block;
height: 20px;
line-height: 20px;
width: 300px;
font-size: 12px;
color: rgb(102, 102, 102);
font-family: Tahoma, Helvetica, "Microsoft Yahei", , Arial, STHeiti;
padding: 10px 8px;
margin: 0px;
border-width: 1px;
border-style: solid;
border-color: rgb(222, 222, 222);
border-image: initial;
transition: 0.3s;
}
.tang-pass-login a, .tang-pass-login label, .tang-pass-login p, .tang-pass-login li, .tang-pass-login input {
font-size: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.tang-pass-login .pass-form-item .pass-clearbtn {
position: absolute;
z-index: 20;
top: 14px;
right: 6px;
height: 16px;
width: 16px;
background: url(../../images/member/pass_login_icons.png) no-repeat 0 0;
cursor: pointer;
}
.tang-pass-login .pass-suggestion-list {
position: absolute;
margin: 0;
padding: 0;
z-index: 21;
top: 42px;
_top: 43px;
left: 0;
border: 1px solid #dedede;
border-top: 0;
background: #fff;
width: 300px;
}
.tang-pass-login li.pass-item-suggsetion {
position: relative;
z-index: 2001;
line-height: 14px;
font-family: ;
font-size: 12px;
color: rgb(51, 51, 51);
cursor: pointer;
word-break: break-all;
padding: 5px 0px 5px 6px;
}
.tang-pass-login a, .tang-pass-login label, .tang-pass-login p, .tang-pass-login li, .tang-pass-login input {
font-size: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.tang-pass-login li.pass-item-suggsetion a {
position: absolute;
display: none;
top: 4px;
right: 4px;
height: 16px;
width: 16px;
background: url(../../images/member/pass_login_icons.png) no-repeat 0 0;
}
.tang-pass-login a {
text-decoration: none;
color: #2e82ff;
}
.tang-pass-login a, .tang-pass-login label, .tang-pass-login p, .tang-pass-login li, .tang-pass-login input {
font-size: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.tang-pass-login .pass-form-item .pass-item-selectbtn-userName {
position: absolute;
display: block;
height: 16px;
width: 16px;
background: url(../../images/member/pass_login_icons.png) no-repeat 0 -30px;
top: 6px;
right: 31px;
_right: 50px;
cursor: pointer;
}
.tang-pass-login {
position: relative;
}
.tang-pass-qrcode p.pass-form-logo {
margin-left: 28px;
}
p.pass-form-logo {
background: url(../../images/logo_731bc32.png) no-repeat left;
background: url(../../images/logo_731bc32.png) no-repeat left;
font-size: 16px;
height: 32px;
line-height: 46px;
padding-left: 118px;
color: #000;
margin-top: 0;
margin-bottom: 15px;
}
.tang-pass-qrcode .tang-pass-qrcode-content {
padding-top: 24px;
height: 180px;
overflow: hidden;
text-align: center;
}
.tang-pass-qrcode .tang-pass-qrcode-imgWrapper {
display: block;
}
.Qrcode-animationRight {
-webkit-animation: marginRight .3s linear;
-moz-animation: marginRight .3s linear;
animation: marginRight .3s linear;
-webkit-transition: all .3s liner;
-moz-transition: all .3s liner;
transition: .3s liner;
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
.Qrcode-status-con {
width: 138px;
height: 138px;
border: 1px solid #ecedee;
padding: 9px;
text-align: center;
color: #000;
font-size: 14px;
display: none;
line-height: 20px;
margin: 0 auto;
-webkit-transition: all .3s liner;
-moz-transition: all .3s liner;
transition: .3s liner;
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
.tang-pass-qrcode .tang-pass-qrcode-content img {
width: 138px;
height: 138px;
}
.tang-pass-login a, .tang-pass-login label, .tang-pass-login p, .tang-pass-login li, .tang-pass-login input {
font-size: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.Qrcode-status-success .Qrcode-status-icon {
background: url(../../images/member/qrcode-success.png) no-repeat center;
}
.Qrcode-status-con .Qrcode-status-icon {
width: 36px;
height: 36px;
margin: 25px auto 15px;
}
.Qrcode-status-msg {
font-size: 12px;
color: #333;
}
.Qrcode-status-con {
width: 138px;
height: 138px;
border: 1px solid #ecedee;
padding: 9px;
text-align: center;
color: #000;
font-size: 14px;
display: none;
line-height: 20px;
margin: 0 auto;
-webkit-transition: all .3s liner;
-moz-transition: all .3s liner;
transition: .3s liner;
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
.Qrcode-status-error .Qrcode-status-icon {
background: url(../../images/member/qrcode-error.png) no-repeat center;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAIAAABuYg/PAAAAGXRFW/D4I4xl3xkwAY7jblOLLskcyH7N0XjiBnHLHsac/8IMAC4AzcrBhyRBQAAAABJRU5ErkJggg==);
}
.Qrcode-status-con .Qrcode-status-icon {
width: 36px;
height: 36px;
margin: 25px auto 15px;
}
.tang-pass-login p.Qrcode-refresh-btn {
color: #38f;
text-align: center;
padding: 8px 10px;
cursor: pointer;
display: inline-block;
margin-top: 3px;
}
.tang-pass-qrcode .tang-pass-qrcode-title {
font-size: 16px;
text-align: center;
line-height: 16px;
padding-left: 0;
}
.tang-pass-qrcode .tang-pass-qrcode-title a {
font-size: 16px;
}
.tang-pass-login a {
text-decoration: none;
color: #2e82ff;
}
.tang-pass-footerBar {
color: #2e82ff;
margin-top: 40px;
height: 60px;
line-height: 60px;
background: #f0f6ff;
padding: 0 28px;
position: relative;
}
.tang-pass-footerBarQrcode, .tang-pass-footerBarULogin {
display: inline-block;
width: 80px;
text-align: left;
margin: 0;
font-size: 14px;
cursor: pointer;
}
.tang-pass-footerBarPhoenix {
color: #2e82ff;
display: inline-block;
}
.tang-pass-footerBarPhoenixSplit {
width: 1px;
background: #3582f8;
height: 8px;
margin-right: 16px;
display: inline-block;
}
.tang-pass-login-phoenix {
padding: 0 0 10px 16px;
position: absolute;
margin-top: -36px;
}
.tang-pass-login-phoenix .pass-phoenix-list {
clear: both;
line-height: 20px;
zoom: 1;
}
.clear {
clear: both;
height: 0;
line-height: 0;
font-size: 0;
visibility: hidden;
overflow: hidden;
}
.tang-pass-login-phoenix .pass-phoenix-list .pass-phoenix-btn {
float: left;
}
.tang-pass-login-phoenix .pass-phoenix-list .bd-acc-list, .tang-pass-login-phoenix .pass-phoenix-list .bd-acc-list li {
float: left;
list-style: none;
margin: 0;
padding: 0;
}
.tang-pass-login-phoenix .pass-phoenix-list .bd-acc-list li {
width: 26px;
}
.tang-pass-login-phoenix .pass-phoenix-list .bd-acc-list, .tang-pass-login-phoenix .pass-phoenix-list .bd-acc-list li {
float: left;
list-style: none;
margin: 0;
padding: 0;
}
.tang-pass-footerBar a, .tang-pass-footerBar a:hover {
text-decoration: none;
font-size: 14px;
width: 80px;
text-align: center;
}
a.pass-reglink {
position: absolute;
right: 26px;
color: #2e82ff;
top: 0;
}
.tang-pass-login .pass-form-item-submit {
position: relative;
}
.tang-pass-login .pass-form-item {
position: relative;
clear: both;
z-index: 18;
}
.tang-pass-login .pass-form-item {
margin-bottom: 16px;
}
.tang-pass-login .pass-form-item-submit .pass-button-submit {
font-size: 14px;
font-weight: 800;
border: 0;
color: #fff;
cursor: pointer;
}
.tang-pass-login .pass-form-item-submit input {
width: 302px;
height: 40px;
line-height: 40px;
background: #2e82ff;
border-radius: 2px;
}
.tang-pass-login input[type=submit] {
-webkit-appearance: none;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.tang-pass-login .pass-form-item-submit .pass-fgtpwd {
display: inline-block;
margin-top: 12px;
font-size: 12px;
}
.tang-pass-login a {
text-decoration: none;
color: #2e82ff;
}
p.pass-form-logo {
background: url(../../images/logo_731bc32.png) no-repeat left;
background: url(../../images/logo_731bc32.png) no-repeat left;
font-size: 16px;
height: 32px;
line-height: 46px;
padding-left: 118px;
color: #000;
margin-top: 0;
margin-bottom: 15px;
}
.tang-pass-login-phoenix .pass-phoenix-list .phoenix-btn-item {
display: block;
margin-right: 15px;
color: #00C;
text-decoration: underline;
padding-left: 20px;
cursor: pointer;
font-size: 12px;
list-style: none;
background: url(../../images/member/loginv4.png) no-repeat;
_background: url(../../images/member/loginv4.gif) no-repeat;
width: 0;
height: 18px;
overflow: hidden;
}
.tang-pass-login-phoenix .pass-phoenix-list .bd-acc-qzone .phoenix-btn-item {
background-position: -6px -55px;
}
.tang-pass-login-phoenix .pass-phoenix-list .bd-acc-tsina .phoenix-btn-item {
background-position: -55px -33px;
}
.tang-pass-login-phoenix .pass-phoenix-list .bd-acc-weixin .phoenix-btn-item {
background-position: -30px -30px;
}
#foot {
text-align: center;
color: #7a77c8;
margin-top: 20px;
margin-bottom: 20px;
}
.tang-pass-login .pass-form-item .pass-text-input-focus {
border-color: #488ee7
}
.tang-pass-login .pass-form-item .pass-clearbtn:hover {
background-position: 0 -16px
}
.tang-pass-login .pass-form-item .pass-text-input-verifyCode {
width: 130px;
float: left;
}
.tang-pass-sms p.pass-form-item-smsVerifyCode, .tang-pass-login p.pass-form-item-verifyCode {
position: relative;
margin-bottom: 15px;
width: 302px;
zoom: 1;
}
.tang-pass-login .pass-form-item span.pass-clearbtn-verifyCode {
left: 125px;
z-index: 1999;
}
.tang-pass-login .pass-verifyCode {
width: 90px;
height: 40px;
background: url(../../images/member/loading_16.gif) no-repeat center center;
border: 1px solid #DDD;
float: left;
margin-left: 5px;
}
.tang-pass-login .pass-change-verifyCode {
padding-left: 12px;
font-size: 12px;
text-decoration: none;
line-height: 40px;
float: left;
cursor: pointer;
}
.tang-pass-login a {
text-decoration: none;
color: #2e82ff;
}
.tang-pass-login .pass-form-item-memberPass {
margin-bottom: 10px;
display: inline-block;
}
.tang-pass-sms p.pass-form-item-smsVerifyCode:after, .tang-pass-login p.pass-form-item-verifyCode:after {
line-height: 20px;
content: "\20";
display: block;
height: 0;
clear: both;
}

@ -0,0 +1,452 @@
#wrapper {
width: 100%;
}
#head, #content, #foot {
width: 980px;
margin-left: auto;
margin-right: auto;
}
#head {
height: 75px;
z-index: 100;
}
#head .mod-header {
display: block;
width: 330px;
}
.mod-header {
display: inline;
font-size: 66px;
}
#head .mod-header a {
display: none;
width: 330px;
height: 76px;
}
#head .mod-header a img {
margin-top: 15px;
}
#nav {
background: 0 0;
}
#nav .nav-2 {
height: 20px;
background: url(../../images/reg_hr.png) no-repeat center top;
}
.clearfix {
zoom: 1;
}
.mod-reg {
position: relative;
}
.tang-pass-reg {
position: relative;
width: 720px;
overflow: hidden;
}
.reg-content {
float: left;
}
.tang-pass-reg .pass-generalErrorWrapper {
margin: 0;
padding: 0;
}
.tang-pass-reg .pass-generalError {
color: #fc4343;
display: block;
height: 40px;
font-size: 12px;
line-height: 40px;
}
.tang-pass-reg .pass-form-item {
position: relative;
clear: both;
margin-bottom: 20px;
zoom: 1;
}
.tang-pass-reg .pass-label {
display: block;
float: left;
height: 42px;
width: 65px;
margin-right: 10px;
line-height: 42px;
font-size: 14px;
color: #666;
font-weight: 700;
text-align: right;
}
.tang-pass-reg .pass-text-input {
display: block;
position: relative;
float: left;
height: 16px;
width: 328px;
padding: 11px 10px;
margin-right: 10px;
border: 1px solid #ddd;
font-size: 14px;
color: #666;
transition: .3s;
}
.tang-pass-reg .pass-clearbtn {
display: block;
position: absolute;
width: 16px;
height: 16px;
background: url(../../images/reg_icons.png) -32px -24px no-repeat;
top: 12px;
left: 398px;
cursor: pointer;
}
.tang-pass-reg .pass-item-error-password {
position: absolute;
float: left;
background: 0 0;
padding: 0;
top: 0;
left: 434px;
height: 40px;
}
.tang-pass-reg .pass-item-error {
display: none;
float: left;
position: relative;
width: 250px;
top: 12px;
color: #fc4343;
height: 16px;
line-height: 14px;
padding-left: 20px;
background: url(../../images/err_small.png) 0 0 no-repeat;
}
.tang-pass-reg .pass-item-error-password .nopwd .pwd-strength-sum {
display: none;
}
.tang-pass-reg .pass-item-error-password .nopwd .pwd-strength-detail {
margin-top: 12px;
}
.tang-pass-reg .pass-item-error-password .pwd-strength-detail {
background: url(../../images/reg_icons.png) -80px -24px no-repeat;
padding-left: 20px;
line-height: 16px;
display: block;
width: 220px;
}
.tang-pass-reg .pass-item-error-password .pwd-strength-bg {
background-color: #eee;
}
.tang-pass-reg .pass-item-error-password .pwd-strength-sco, .tang-pass-reg .pass-item-error-password .pwd-strength-bg {
display: block;
position: absolute;
width: 130px;
height: 10px;
line-height: 10px;
}
.tang-pass-reg .pwd-checklist .pwd-checklist-item-error {
background-position: -86px -144px;
color: #fc4343;
}
.tang-pass-reg .pwd-checklist .pwd-checklist-item-success {
background-position: -86px -128px;
}
.tang-pass-reg .pwd-checklist .pwd-checklist-item-success {
background-position: -86px -128px;
}
.tang-pass-reg .pwd-checklist {
margin-left: 10px;
padding: 5px 10px;
border: 1px solid #ddd;
box-shadow: 1px 1px 1px #efefef;
background: #f9f9f9;
width: 200px;
}
.tang-pass-reg .pwd-checklist-wrapper .pwd-checklist-arrow {
position: absolute;
top: 8px;
left: 0;
}
.tang-pass-reg .pwd-checklist-wrapper .pwd-checklist-arrow em.arrowa {
color: #ddd;
left: 0;
}
.tang-pass-reg .pwd-checklist-wrapper .pwd-checklist-arrow em {
position: absolute;
left: 0;
top: 0;
font-size: 20px;
}
.tang-pass-reg .pwd-checklist-wrapper .pwd-checklist-arrow em.arrowb {
color: #f9f9f9;
left: 1px;
}
.tang-pass-reg .pass-item-tiptext-password {
padding-top: 0;
}
.tang-pass-reg .pass-item-tiptext {
display: block;
}
.tang-pass-reg .pass-form-item {
position: relative;
clear: both;
margin-bottom: 20px;
zoom: 1;
}
.tang-pass-reg .pass-form-item:after {
visibility: hidden;
display: block;
font-size: 0;
content: " ";
clear: both;
height: 0;
}
.tang-pass-reg .pass-item-placeholder {
top: 12px;
line-height: 16px;
_line-height: 18px;
font-size: 14px;
color: #ccc;
left: 87px;
display: none;
visibility: hidden;
width: 0;
left: 0;
}
.tang-pass-reg .pass-item-tiptext-password {
padding-top: 0;
}
.tang-pass-reg .pass-item-tip-password {
position: absolute;
left: 430px;
top: 0;
zoom: 1;
z-index: 20;
}
.tang-pass-reg .pass-item-tip {
width: 270px;
}
.tang-pass-reg .pass-form-item {
position: relative;
clear: both;
margin-bottom: 20px;
zoom: 1;
}
.tang-pass-reg .pass-label {
display: block;
float: left;
height: 42px;
width: 65px;
margin-right: 10px;
line-height: 42px;
font-size: 14px;
color: #666;
font-weight: 700;
text-align: right;
}
.tang-pass-reg .pass-text-input-verifyCode {
width: 156px;
}
.tang-pass-reg .pass-form-item-verifyCode span, .tang-pass-reg .pass-form-item-verifyCodeSend span {
float: left;
display: block;
}
.tang-pass-reg .pass-clearbtn-verifyCode {
left: 228px;
}
.tang-pass-reg .pass-clearbtn {
display: block;
position: absolute;
width: 16px;
height: 16px;
background: url(../../images/reg_icons.png) -32px -24px no-repeat;
top: 12px;
left: 398px;
cursor: pointer;
}
.tang-pass-reg input.pass-button-verifyCodeSend {
border-radius: 0;
border: 1px solid #ddd;
height: 40px;
background: #f7f7f7;
color: #666;
font-weight: 400;
width: 160px;
float: left;
margin-right: 10px;
font-size: 14px;
}
.tang-pass-reg .pass-button {
display: block;
height: 50px;
font-size: 16px;
font-weight: 700;
cursor: pointer;
color: #fff;
background-image: none;
border-radius: 3px;
border: 0;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
transition: .3s;
-moz-transition: .3s;
-o-transition: .3s;
-webkit-transition: .3s;
}
.tang-pass-reg .pass-form-item-verifyCode span.pass-item-error, .tang-pass-reg .pass-form-item-verifyCodeSend span.pass-item-error {
display: none;
}
.tang-pass-reg .pass-form-item-verifyCode span, .tang-pass-reg .pass-form-item-verifyCodeSend span {
float: left;
display: block;
}
.tang-pass-reg .pass-form-item-verifyCode span, .tang-pass-reg .pass-form-item-verifyCodeSend span {
float: left;
display: block;
}
.tang-pass-reg .pass-item-tip-verifyCodeSend {
padding-top: 2px;
}
.tang-pass-reg .pass-item-tip {
width: 270px;
}
.tang-pass-reg .pass-form-item-isAgree {
margin-left: 75px;
}
.tang-pass-reg .pass-form-item-isAgree .pass-checkbox-isAgree {
vertical-align: middle;
}
.tang-pass-reg .pass-form-item-isAgree label {
color: #666;
font-size: 12px;
margin-left: 5px;
}
.tang-pass-reg a {
text-decoration: none;
color: #1b66c7;
}
.tang-pass-reg a {
text-decoration: none;
color: #1b66c7;
}
.tang-pass-reg .pass-form-item-submit {
position: relative;
left: 75px;
}
.tang-pass-reg .pass-form-item {
position: relative;
clear: both;
margin-bottom: 20px;
zoom: 1;
}
.tang-pass-reg a {
text-decoration: none;
color: #1b66c7;
}
.mod-reg .tang-pass-reg .pass-button-submit {
background-color: #3f89ec;
}
.tang-pass-reg .pass-button-submit {
float: left;
width: 350px;
}
.tang-pass-reg .pass-button {
display: block;
height: 50px;
font-size: 16px;
font-weight: 700;
cursor: pointer;
color: #fff;
background-image: none;
border-radius: 3px;
border: 0;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
transition: .3s;
-moz-transition: .3s;
-o-transition: .3s;
-webkit-transition: .3s;
}
#foot {
text-align: center;
color: #7a77c8;
margin-top: 20px;
margin-bottom: 20px;
}
#foot {
margin-top: 80px;
}
#head, #content, #foot {
width: 980px;
margin-left: auto;
margin-right: auto;
}
.reg-sms {
width: 258px;
border: 1px solid #d1eeff;
background-color: #f5fbff;
margin-top: 40px;
}
.reg-sms {
float: right;
}
.mod-reg .login-link, .mod-regnotify .login-link {
position: absolute;
top: -70px;
right: 0;
color: #666;
}
.mod-reg .login-link span, .mod-regnotify .login-link span {
float: left;
display: block;
margin-right: 5px;
margin-top: 10px;
}
.mod-reg .login-link, .mod-regnotify .login-link {
position: absolute;
top: -70px;
right: 0;
color: #666;
}
.mod-reg .login-btn, .mod-regnotify .login-btn {
font-weight: 700;
color: #666;
height: 32px;
width: 64px;
border: 0;
background: url(../../images/reg_icons.png) no-repeat 0 -48px;
}
.tang-pass-reg .pass-item-tiptext-userName {
padding-top: 6px;
}
.mod-reg .tang-pass-reg .pass-text-input-error {
border-color: #fc4343;
}
.mod-reg .tang-pass-reg .pass-text-input-focus {
border-color: #488ee7
}
.tang-pass-reg input.pass-text-input-disabled {
background: #f6f6f6;
border-color: #ebebeb;
color: #c5c5c5
}
.tang-pass-reg span.pass-item-error-isAgree {
top: 0;
float: none;
}
button {
cursor: pointer;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
}

@ -0,0 +1,298 @@
#head, #content, #foot {
width: 980px;
margin-left: auto;
margin-right: auto;
}
#head {
height: 75px;
z-index: 100;
}
.mod-header {
display: inline;
font-size: 66px;
}
.mod-userbar {
position: absolute;
top: 15px;
right: 20px;
z-index: 300;
font-family: "Microsoft yahei", Arial, Helvetica, STHeiti, <EFBFBD>;
}
.mod-userbar li {
float: left;
margin: 0 5px;
color: #ccc;
height: 24px;
}
.mod-userbar li a {
color: #000;
text-decoration: underline;
}
#nav {
height: 42px;
}
#nav {
width: 100%;
background: #fafafa;
z-index: 1;
}
.nav-2 {
height: 46px;
background: url(../../images/password/hdbg.png) repeat-x 0 0;
width: 100%;
}
.mod-nav {
position: relative;
width: 980px;
margin-left: auto;
margin-right: auto;
}
.page-type-notab {
color: #333;
font-size: 14px;
font-weight: 700;
float: left;
margin-left: 70px;
line-height: 46px;
display: inline;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
}
#content {
height: auto;
}
#content .mod-forgot {
min-height: 500px;
height: auto;
}
.mod-forgot {
height: 450px;
margin-left: 70px;
width: 910px;
}
.mod-sub-nav {
height: 34px;
background: url(../../images/password/mod_sub_nav.png) no-repeat 0 0;
margin: 30px 0;
line-height: 34px;
color: #666;
font-size: 16px;
font-family: "Microsoft Yahei",\5fae\8f6f\96c5\9ed1,\9ed1\4f53;
}
.mod-sub-nav li.list1-active {
background: url(../../images/password/sub_nav_1.png) no-repeat 0 0;
color: #2e82ff;
}
.mod-sub-nav li {
float: left;
padding-left: 66px;
}
.mod-sub-list1 {
width: 175px;
}
.mod-step-detail .step-email-info, .mod-step-detail .step-form-info {
font-size: 12px;
padding-bottom: 10px;
}
.pass-input-container {
margin-bottom: 20px;
}
.pass-input-container {
position: relative;
}
.pass-input {
border: 1px solid #CCC;
border-bottom: 1px solid #ddd;
border-right: 1px solid #ddd;
background-color: #fff;
vertical-align: middle;
font-size: 12px;
_margin-top: 1px;
padding: 7px 0 7px 8px;
height: 16px;
line-height: 16px;
overflow: hidden;
color: #333;
font-size: 14px;
background: url(https://passport.baidu.com/static/passpc-base/img/ui/form_input_261.png) no-repeat left top;
-webkit-transition-property: all;
-webkit-transition-duration: .3s;
-moz-transition-property: all;
-moz-transition-duration: .3s;
-o-transition-property: all;
-o-transition-duration: .3s;
transition-property: all;
transition-duration: .3s;
outline: 0;
resize: none;
width: 253px;
float: left;
}
.pass-input-forgot {
display: block;
position: relative;
float: left;
height: 16px;
width: 328px;
padding: 11px 10px;
margin-right: 10px;
border: 1px solid #ddd;
font-size: 14px;
color: #666;
-webkit-transition: .3s;
-moz-transition: .3s;
-o-transition: .3s;
transition: .3s;
background: #fff;
}
.input-label-new1 {
top: 6px;
left: 10px;
font-size: 14px;
}
.userName-clearbtn {
background: url(../../images/password/close.png) no-repeat;
background-position: 0 0;
cursor: pointer;
position: absolute;
z-index: 8px;
top: 15px;
margin-left: -35px;
height: 12px;
width: 12px;
display: none;
transition: all ease-out .3s;
}
.l-h40 {
line-height: 40px;
}
.pass-input-msg {
line-height: 32px;
float: left;
color: #da1111;
margin-left: 10px;
font-size: 12px;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
}
.m_b15 {
margin-bottom: 15px;
}
.pass-account-slect .pass-radio-list {
clear: both;
margin-top: 10px;
line-height: 16px;
background-position: 0 0;
}
.pass-radio-list {
position: relative;
}
.pass-radio {
float: left;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR3IakF6mZAFyGGPGsDAMBoGgyUMnoAyBqnJGKrnCSOl2RkADS8pAQZncMwAAAAASUVORK5CYII=) no-repeat 0 8px;
padding-left: 25px;
cursor: pointer;
}
.pass-account-slect .pass-radio-list {
clear: both;
margin-top: 10px;
line-height: 16px;
background-position: 0 0;
}
.pass-radion-active {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSRAkCTIEBAmBDC8QEgDujwTAzBXoQsSzQflSFCWJMsQaHYGAIAFT0KWP06mAAAAAElFTkSuQmCC) no-repeat 0 8px;
}
.mod-step-detail .vcode-container {
margin-bottom: 30px;
}
.mod-step-detail .vcode-container .vcode-input-width {
width: 156px;
margin-right: 0;
}
.mod-step-detail .vcode-container .vcode-input {
float: left;
width: 97px;
}
.mod-step-detail .vcode-container .vcode-label {
width: 90px;
}
.mod-step-detail .vcode-container .vcode-img-big {
float: left;
width: 100px;
height: 38px;
border: 1px solid #ddd;
margin-left: 10px;
}
.mod-step-detail .vcode-container .p-t13 {
padding-top: 13px;
}
.mod-step-detail .vcode-container .vcode-img-change {
padding-left: 10px;
display: block;
padding-top: 9px;
float: left;
}
.l-h40 {
line-height: 40px;
}
.mod-step-detail .pass-button-submit {
display: block;
height: 40px;
font-size: 16px;
font-weight: 700;
cursor: pointer;
color: #fff;
background-image: none;
border-radius: 3px;
border: 0;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
transition: .3s;
-moz-transition: .3s;
-o-transition: .3s;
-webkit-transition: .3s;
background-color: #3f89ec;
width: 350px;
}
.pass-button-submit, .pass-button-timer2, .mod-btn1 {
height: 34px;
width: 109px;
color: #fff;
cursor: pointer;
text-align: center;
border: 0;
background: url(https://passport.baidu.com/static/passpc-base/img/ui/button_icon.png) no-repeat 0 0;
line-height: 32px;
}
#foot {
text-align: center;
color: #7a77c8;
margin-top: 20px;
margin-bottom: 20px;
}
.pass-input-focus {
border-color: #377bcb
}
a {
text-decoration: none;
color: #2b78e4;
}
.userName-clearbtn-hover {
background-position: 0 -15px
}
.pass-input-error {
border: 1px solid #da1111;
}

@ -0,0 +1,270 @@
#wrapper {
width: 100%;
}
#head, #content, #foot {
width: 980px;
margin-left: auto;
margin-right: auto;
}
#head {
height: 75px;
z-index: 100;
}
.mod-header {
display: inline;
font-size: 66px;
}
a {
text-decoration: none;
color: #2b78e4;
}
.mod-userbar {
position: absolute;
top: 15px;
right: 20px;
z-index: 300;
font-family: "Microsoft yahei",Arial,Helvetica,STHeiti,"宋体";
}
.mod-userbar li {
float: left;
margin: 0 5px;
color: #ccc;
height: 24px;
}
.mod-userbar li a {
color: #000;
text-decoration: underline;
}
#nav {
height: 42px;
}
#nav {
width: 100%;
background: #fafafa;
z-index: 1;
}
.nav-2 {
height: 46px;
background: url(../../images/password/hdbg.png) repeat-x 0 0;
width: 100%;
}
.mod-nav {
position: relative;
width: 980px;
margin-left: auto;
margin-right: auto;
}
.page-type-notab {
color: #333;
font-size: 14px;
font-weight: 700;
float: left;
margin-left: 70px;
line-height: 46px;
display: inline;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
}
#content {
height: auto;
}
#content .mod-forgot {
min-height: 500px;
height: auto;
}
.mod-forgot {
height: 450px;
margin-left: 70px;
width: 910px;
}
.mod-sub-nav {
height: 34px;
background: url(../../images/password/mod_sub_nav.png) no-repeat 0 0;
margin: 30px 0;
line-height: 34px;
color: #666;
font-size: 16px;
font-family: "Microsoft Yahei",\5fae\8f6f\96c5\9ed1,\9ed1\4f53;
}
.mod-sub-nav li {
float: left;
padding-left: 66px;
}
.mod-sub-list1 {
width: 175px;
}
.mod-sub-list2 {
width: 163px;
}
.mod-sub-nav li.list3-active {
background: url(../../images/password/sub_nav_3.png) no-repeat 0 0;
color: #2e82ff;
margin-left: -12px;
padding-left: 78px;
width: 163px;
}
.mod-step-detail .step-form-tip {
color: #999;
font-size: 12px;
padding-bottom: 20px;
}
.m_l80 {
margin-left: 80px;
}
form {
position: relative;
}
.pass-input-container {
margin-bottom: 20px;
}
.pass-input-container {
position: relative;
}
.l-h40 {
line-height: 40px;
}
.pass-input-title {
font-size: 14px;
width: 70px;
padding-right: 10px;
line-height: 32px;
float: left;
text-align: right;
}
.pass-input {
border: 1px solid #CCC;
border-bottom: 1px solid #ddd;
border-right: 1px solid #ddd;
background-color: #fff;
vertical-align: middle;
font-size: 12px;
_margin-top: 1px;
padding: 7px 0 7px 8px;
height: 16px;
line-height: 16px;
overflow: hidden;
color: #333;
font-size: 14px;
background: url(../../images/password/form_input_261.png) no-repeat left top;
-webkit-transition-property: all;
-webkit-transition-duration: .3s;
-moz-transition-property: all;
-moz-transition-duration: .3s;
-o-transition-property: all;
-o-transition-duration: .3s;
transition-property: all;
transition-duration: .3s;
outline: 0;
resize: none;
width: 253px;
float: left;
}
.pass-input-forgot {
display: block;
position: relative;
float: left;
height: 16px;
width: 328px;
padding: 11px 10px;
margin-right: 10px;
border: 1px solid #ddd;
font-size: 14px;
color: #666;
-webkit-transition: .3s;
-moz-transition: .3s;
-o-transition: .3s;
transition: .3s;
background: #fff;
}
.left {
float: left;
}
.pass-input-pwdmsg {
float: left;
width: 226px;
}
.pass-streng-wrapper {
visibility: hidden;
}
.pass-tips-streng {
float: left;
background: #f1f1f1;
width: 165px;
height: 10px;
overflow: hidden;
margin-left: 10px;
margin-right: 6px;
position: relative;
}
.pass-tips-streng span {
position: absolute;
left: 0;
top: 0;
height: 10px;
}
.pass-input-pwdmsg .pass-input-msg {
line-height: 1.3em;
margin-top: 2px;
display: inline-block;
width: 350px;
}
.l-h40 {
line-height: 40px;
}
.pass-input-msg {
line-height: 32px;
float: left;
color: #da1111;
margin-left: 10px;
font-size: 12px;
}
.m_l80 {
margin-left: 80px;
}
.mod-step-detail .pass-button-submit {
display: block;
height: 40px;
font-size: 16px;
font-weight: 700;
cursor: pointer;
color: #fff;
background-image: none;
border-radius: 3px;
border: 0;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
transition: .3s;
-moz-transition: .3s;
-o-transition: .3s;
-webkit-transition: .3s;
background-color: #3f89ec;
width: 350px;
}
.pass-button-submit, .pass-button-timer2, .mod-btn1 {
height: 34px;
width: 109px;
color: #fff;
cursor: pointer;
text-align: center;
border: 0;
background: url(../../images/password/button_icon.png) no-repeat 0 0;
line-height: 32px;
}
#foot {
text-align: center;
color: #7a77c8;
margin-top: 20px;
margin-bottom: 20px;
}
.pass-input-error {
border: 1px solid #da1111
}
.pass-input-focus {
border-color: #377bcb
}

@ -0,0 +1,211 @@
#wrapper {
width: 100%;
}
#head, #content, #foot {
width: 980px;
margin-left: auto;
margin-right: auto;
}
#head {
height: 75px;
z-index: 100;
}
.mod-header {
display: inline;
font-size: 66px;
}
a {
text-decoration: none;
color: #2b78e4;
}
.mod-userbar {
position: absolute;
top: 15px;
right: 20px;
z-index: 300;
font-family: "Microsoft yahei", Arial, Helvetica, STHeiti, ;
}
.mod-userbar li {
float: left;
margin: 0 5px;
color: #ccc;
height: 24px;
}
.mod-userbar li a {
color: #000;
text-decoration: underline;
}
.mod-userbar {
position: absolute;
top: 15px;
right: 20px;
z-index: 300;
font-family: "Microsoft yahei", Arial, Helvetica, STHeiti, ;
}
.mod-userbar li {
float: left;
margin: 0 5px;
color: #ccc;
height: 24px;
}
.mod-userbar li a {
color: #000;
text-decoration: underline;
}
#nav {
height: 42px;
}
.nav-2 {
height: 46px;
background: url(../../images/password/hdbg.png) repeat-x 0 0;
width: 100%;
}
.mod-nav {
position: relative;
width: 980px;
margin-left: auto;
margin-right: auto;
}
.page-type-notab {
color: #333;
font-size: 14px;
font-weight: 700;
float: left;
margin-left: 70px;
line-height: 46px;
display: inline;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
}
#content {
height: auto;
}
#content .mod-forgot {
min-height: 500px;
height: auto;
}
.mod-forgot {
height: 450px;
margin-left: 70px;
width: 910px;
}
.mod-sub-nav {
height: 34px;
background: url(../../images/password/mod_sub_nav.png) no-repeat 0 0;
margin: 30px 0;
line-height: 34px;
color: #666;
font-size: 16px;
font-family: "Microsoft Yahei",\5fae\8f6f\96c5\9ed1,\9ed1\4f53;
}
.mod-sub-nav li {
float: left;
padding-left: 66px;
}
.mod-sub-list1 {
width: 175px;
}
.mod-sub-list2 {
width: 163px;
}
.mod-sub-nav li.list3-active {
background: url(../../images/password/sub_nav_3.png) no-repeat 0 0;
color: #2e82ff;
margin-left: -12px;
padding-left: 78px;
width: 163px;
}
.mod-step-detail .result-info {
text-align: center;
padding-top: 60px;
width: 695px;
}
.mod-step-detail .result-info .result-message {
font-size: 18px;
font-weight: 700;
position: relative;
padding-bottom: 40px;
}
.result-message span, .result-message2 span {
position: relative;
top: -8px;
left: 8px;
}
.mod-setinfo .button, .mod-layer-body .button, .mod-step-detail .button {
display: block;
float: left;
text-align: center;
color: #fff;
font-weight: 400;
line-height: 30px;
width: 77px;
height: 30px;
background: #3f89ec;
border-radius: 3px;
}
.mod-setinfo .result-title-btn, .mod-step-detail .result-title-btn {
float: none;
height: 40px;
width: 140px;
line-height: 40px;
font-weight: 700;
font-size: 14px;
margin: 0 auto;
margin-top: 20px;
}
.result-content-msg {
font-size: 12px;
margin: 10px 0;
color: #999;
text-align: left;
display: block;
}
.result-content-table {
width: 700px;
}
.result-content-link {
display: block;
text-align: right;
margin-top: 5px;
}
tbody {
display: table-row-group;
vertical-align: middle;
border-color: inherit;
}
.result-content-title {
width: 700px;
height: 30px;
text-align: center;
font-size: 12px;
}
tr {
display: table-row;
vertical-align: inherit;
border-color: inherit;
}
.result-content-title th {
color: #666;
border-top: 1px solid #dfdfdf;
background: #f3f3f3;
text-align: center;
}
.result-content-list td {
border-bottom: 1px dotted #dcdcdc;
word-wrap: break-word;
word-break: break-all;
padding: 5px 0;
text-align: center;
}
#foot {
text-align: center;
color: #7a77c8;
margin-top: 20px;
margin-bottom: 20px;
}

@ -0,0 +1,393 @@
#wrapper {
width: 100%;
}
#head, #content, #foot {
width: 980px;
margin-left: auto;
margin-right: auto;
}
#head {
height: 75px;
z-index: 100;
}
.mod-header {
display: inline;
font-size: 66px;
}
a {
text-decoration: none;
color: #2b78e4;
}
.mod-userbar {
position: absolute;
top: 15px;
right: 20px;
z-index: 300;
font-family: "Microsoft yahei", Arial, Helvetica, STHeiti, ËÎÌå;
}
.mod-userbar li {
float: left;
margin: 0 5px;
color: #ccc;
height: 24px;
}
.mod-userbar li a {
color: #000;
text-decoration: underline;
}
#nav {
height: 42px;
}
#nav {
width: 100%;
background: #fafafa;
z-index: 1;
}
.nav-2 {
height: 46px;
background: url(../../images/password/hdbg.png) repeat-x 0 0;
width: 100%;
}
.mod-nav {
position: relative;
width: 980px;
margin-left: auto;
margin-right: auto;
}
.page-type-notab {
color: #333;
font-size: 14px;
font-weight: 700;
float: left;
margin-left: 70px;
line-height: 46px;
display: inline;
}
#content {
height: auto;
}
#content .mod-forgot {
min-height: 500px;
height: auto;
}
.mod-forgot {
height: 450px;
margin-left: 70px;
width: 910px;
}
.mod-sub-nav {
height: 34px;
background: url(../../images/password/mod_sub_nav.png) no-repeat 0 0;
margin: 30px 0;
line-height: 34px;
color: #666;
font-size: 16px;
font-family: "Microsoft Yahei",\5fae\8f6f\96c5\9ed1,\9ed1\4f53;
}
.mod-sub-nav li {
float: left;
padding-left: 66px;
}
.mod-sub-list1 {
width: 175px;
}
.mod-sub-nav li.list2-active {
background: url(../../images/password/sub_nav_2.png) no-repeat 0 0;
color: #2e82ff;
margin-left: -12px;
padding-left: 78px;
}
.forgot-auth-container {
width: 520px;
}
.mod-step-detail .step-email-info, .mod-step-detail .step-form-info {
font-size: 12px;
padding-bottom: 10px;
}
.mod-step-detail .step-email-info, .mod-step-detail .step-form-info {
font-size: 12px;
padding-bottom: 10px;
}
.forgot-auth-type {
position: relative;
z-index: 1;
}
.m-t10 {
margin-top: 10px;
}
form {
position: relative;
}
.forgot-auth-title {
font-weight: 700;
font-size: 14px;
margin-bottom: 20px;
}
.pass-input-container, .m-b15 {
margin-bottom: 15px;
}
.pass-input-container {
position: relative;
}
.form-2-label {
width: 70px;
font-size: 14px;
float: left;
margin-right: 10px;
text-align: right;
line-height: 32px;
}
label {
cursor: default;
}
.line-32 {
line-height: 32px;
}
.form-2-content {
font-size: 14px;
position: relative;
float: left;
}
.verify-method {
font-size: 14px;
font-weight: 700;
line-height: 30px;
}
.mod-step-detail .m-b-mobile {
margin-bottom: 8px;
}
.mod-step-detail .vcode-container {
margin-bottom: 30px;
}
.form-2-content {
font-size: 14px;
position: relative;
float: left;
}
.mod-step-detail .vcode-container .vcode-input {
float: left;
width: 97px;
}
.mod-step-detail .vcode-container .pass-input-new {
width: 220px;
height: 22px;
background: #fff;
}
.pass-input {
border: 1px solid #CCC;
border-bottom: 1px solid #ddd;
border-right: 1px solid #ddd;
background-color: #fff;
vertical-align: middle;
font-size: 12px;
_margin-top: 1px;
padding: 7px 0 7px 8px;
height: 16px;
line-height: 16px;
overflow: hidden;
color: #333;
font-size: 14px;
background: url(../../images/password/form_input_261.png) no-repeat left top;
-webkit-transition-property: all;
-webkit-transition-duration: .3s;
-moz-transition-property: all;
-moz-transition-duration: .3s;
-o-transition-property: all;
-o-transition-duration: .3s;
transition-property: all;
transition-duration: .3s;
outline: 0;
resize: none;
width: 253px;
float: left;
}
.input-label-new1 {
top: 6px;
left: 10px;
font-size: 14px;
}
.pass-input-label {
position: absolute;
left: 13px;
top: 3px;
_top: 5px;
color: #ccc;
height: 28px;
line-height: 28px;
cursor: text;
-webkit-transition-property: color;
-webkit-transition-duration: .3s;
-moz-transition-property: all;
-moz-transition-duration: .3s;
-o-transition-property: all;
-o-transition-duration: .3s;
transition-property: all;
transition-duration: .3s;
}
#pass-button-new1 {
width: 120px;
height: 36px;
border: 1px solid #ccc;
background: #f7f7f7;
color: #666;
line-height: 36px;
}
.form-2-content .pass-button-timer {
margin: 0 0 0 10px;
}
.pass-button-timer, .mod-btn2 {
height: 29px;
width: 107px;
color: #333;
cursor: pointer;
border: 0;
line-height: 29px;
text-align: center;
background: url(../../images/password/button_icon.png) no-repeat 0 -138px;
float: left;
}
.pass-input-stip {
line-height: 40px;
float: left;
font-size: 12px;
margin-left: 10px;
display: inline-block;
}
.pass-input-stip {
line-height: 40px;
float: left;
font-size: 12px;
margin-left: 10px;
display: inline-block;
}
.form-2-content .pass-input-msg {
clear: both;
margin-left: 0;
height: 32px;
width: 420px;
}
.pass-input-msg {
line-height: 32px;
float: left;
color: #da1111;
margin-left: 10px;
font-size: 12px;
}
.m-b30 {
margin-bottom: 30px;
}
.m-b30 .pass-button-new1 {
width: 360px;
height: 40px;
background: #2e82ff;
color: #fff;
font-weight: 700;
}
.mod-step-detail .pass-button-submit {
display: block;
height: 40px;
font-size: 16px;
font-weight: 700;
cursor: pointer;
color: #fff;
background-image: none;
border-radius: 3px;
border: 0;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
transition: .3s;
-moz-transition: .3s;
-o-transition: .3s;
-webkit-transition: .3s;
background-color: #3f89ec;
width: 350px;
}
.pass-button-submit, .pass-button-timer2, .mod-btn1 {
height: 34px;
width: 109px;
color: #fff;
cursor: pointer;
text-align: center;
border: 0;
background: url(../../images/password/button_icon.png) no-repeat 0 0;
line-height: 32px;
}
.forgot-auth-title {
font-weight: 700;
font-size: 14px;
margin-bottom: 20px;
}
.mod-step-detail .step-email-info, .mod-step-detail .step-form-info {
font-size: 12px;
padding-bottom: 10px;
}
.mod-step-detail .step-email-info, .mod-step-detail .step-form-info {
font-size: 12px;
padding-bottom: 10px;
}
.upsms-auth-content {
width: 400px;
height: 130px;
border: 1px solid #ccc;
margin-bottom: 15px;
}
.upsms-auth-left {
background: #f9f9f9;
width: 209px;
height: 100px;
float: left;
padding: 20px 20px 10px;
border-right: 1px solid #ccc;
}
.upsms-auth-left p {
margin-bottom: 10px;
}
.upsms-auth-left p {
margin-bottom: 10px;
}
.mod-step-detail .step-tip {
border-top: 1px dotted #e5e5e5;
margin: 70px 0 140px;
width: 910px;
}
.mod-step-detail .m-t0 {
margin-top: 0;
}
.mod-step-detail .step-tip li {
font-family: ËÎÌå, Arial, Helvetica, STHeiti;
}
.mod-step-detail .step-tip li {
margin-top: 12px;
}
.img-info {
padding-right: 5px;
}
.left {
float: left;
}
.hide {
display: none;
}
#foot {
text-align: center;
color: #7a77c8;
margin-top: 20px;
margin-bottom: 20px;
}
.mod-sub-list2 {
width: 163px;
}
.clearfix:after {
content: '\20';
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
}
.pass-input-focus {
border-color: #377bcb
}
.pass-input-error {
border: 1px solid #da1111
}

@ -0,0 +1,23 @@
/* reset */
html,body,h1,h2,h3,h4,h5,h6,div,dl,dt,dd,ul,ol,li,p,blockquote,pre,hr,figure,table,caption,th,td,form,fieldset,legend,input,button,textarea,menu{margin:0;padding:0;}
header,footer,section,article,aside,nav,hgroup,address,figure,figcaption,menu,details{display:block;}
table{border-collapse:collapse;border-spacing:0;}
caption,th{text-align:left;font-weight:normal;}
html,body,fieldset,img,iframe,abbr{border:0;}
i,cite,em,var,address,dfn{font-style:normal;}
[hidefocus],summary{outline:0;}
li{list-style:none;}
h1,h2,h3,h4,h5,h6,small{font-size:100%;}
sup,sub{font-size:83%;}
pre,code,kbd,samp{font-family:inherit;}
q:before,q:after{content:none;}
textarea{overflow:auto;resize:none;}
label,summary{cursor:default;}
a,button{cursor:pointer;}
h1,h2,h3,h4,h5,h6,em,strong,b{font-weight:bold;}
del,ins,u,s,a,a:hover{text-decoration:none;}
body,textarea,input,button,select,keygen,legend{font:12px/1.14 arial,\5b8b\4f53;color:#333;outline:0;}
body{background:#fff;}
a{color:#333;}
a:hover{color: #11a68d;}
body {height: 100%;font: 12px/1.333 "\5FAE\8F6F\96C5\9ED1","Hiragino Sans GB",arial,helvetica,clean;}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 936 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 899 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

File diff suppressed because one or more lines are too long

@ -0,0 +1,56 @@
$(function(){
$("#TANGRAM__PSP_3__userName").bind("focus",function(){
$("#TANGRAM__PSP_3__userName").addClass("pass-text-input-focus");
}).bind("keyup",function(){
if($("#TANGRAM__PSP_3__userName").val() != ""){
$("#TANGRAM__PSP_3__userName_clearbtn").show();
}else{
$("#TANGRAM__PSP_3__userName_clearbtn").hide();
}
}).bind("blur",function(){
$("#TANGRAM__PSP_3__userName").removeClass("pass-text-input-focus");
});
$("#TANGRAM__PSP_3__userName_clearbtn").bind("click",function(){
$("#TANGRAM__PSP_3__userName").val("");
$("#TANGRAM__PSP_3__userName_clearbtn").hide();
$("#TANGRAM__PSP_3__userName").focus();
});
$("#TANGRAM__PSP_3__verifyCodeChange").bind("click",function(){
$("#TANGRAM__PSP_3__verifyCodeImg").attr("src",mainHttp + "captcha.jpg?t=" + $.now());
});
$("#TANGRAM__PSP_3__password").bind("focus",function(){
$("#TANGRAM__PSP_3__password").addClass("pass-text-input-focus");
}).bind("blur",function(){
$("#TANGRAM__PSP_3__password").removeClass("pass-text-input-focus");
}).bind("keyup",function(){
if($("#TANGRAM__PSP_3__password").val() != ""){
$("#TANGRAM__PSP_3__password_clearbtn").show();
}else{
$("#TANGRAM__PSP_3__password_clearbtn").hide();
}
});
$("#TANGRAM__PSP_3__password_clearbtn").bind("click",function(){
$("#TANGRAM__PSP_3__password").val("");
$("#TANGRAM__PSP_3__password_clearbtn").hide();
$("#TANGRAM__PSP_3__password").focus();
});
$("#TANGRAM__PSP_3__submit").bind("click",function(){
if($("#TANGRAM__PSP_3__userName").val() == ""){
$("#TANGRAM__PSP_3__userName").focus();
$("#TANGRAM__PSP_3__error").text("请您输入手机/邮箱/用户名");
return false;
}
if($("#TANGRAM__PSP_3__password").val() == ""){
$("#TANGRAM__PSP_3__password").focus();
$("#TANGRAM__PSP_3__error").text("请您输入密码");
return false;
}
return true;
});
})

@ -0,0 +1,124 @@
// 校验
var validateCheckPass = (rule, value, callback) => {
if (value !== vm.member.password) {
callback(new Error('两次输入密码不一致!'));
} else {
callback();
}
};
var validateUsername = (rule, value, callback) => {
if(!/^(undefined|null|\s)$/.test(value)){
axios({method: 'get',url: mainHttp + 'checkUsername.html?username='+vm.member.username}).then(function(response){
if(response.data.code == 201){
callback(new Error('此用户名太受欢迎,请更换一个!'));
}else{
callback();
}
});
}
}
var validateMobile = (rule, value, callback) => {
if(!/^(undefined|null|\s)$/.test(value)){
axios({method: 'get',url: mainHttp + 'checkMobile.html?mobile='+vm.member.mobile}).then(function(response){
if(response.data.code == 201){
callback(new Error('该手机号已经存在!'));
}else{
callback();
}
});
}
}
var vm = new Vue({
el: '#content',
data() {
return {
smsDisabled:false,
loading:false,
member: {
username: '',
mobile:'',
password:'',
checkPass:'',
verifyCode:''
},
courses: [],
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 6 , message: '长度大于6个字符', trigger: 'blur' },
{ validator: validateUsername, trigger: 'blur' }
],
mobile: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ pattern: /^1[345678]\d{9}$/, message: '手机号格式错误', trigger: 'blur' },
{ validator: validateMobile, trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
],
checkPass: [
{ required: true, message: '请输入确认密码', trigger: 'blur' },
{ validator: validateCheckPass, trigger: 'blur' }
],
verifyCode:[
{ required: true, message: '请输入验证码', trigger: 'blur' },
],
kemuId:[
{required: true, message: '请选择科目', trigger: 'change'}
],
email:[
{ required: true, message: '请输入邮箱地址', trigger: 'blur' },
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
]
}
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
vm.loading = true;
vm.member.subjectId = vm.member.kemuId[0];
axios({method: 'post',url: mainHttp + 'subRegister.html',data: vm.member}).then(function(response){
if(response.data.code == 200){
vm.loading = false;
vm.$message({message: "注册成功",duration:500,type: 'success',onClose:function(){
window.location.href = "member/index.html";
}});
}else{
vm.loading = false;
vm.$message.error(response.data.message);
vm.$refs[formName].validate();
}
});
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
getCourses:function(){
axios.get(mainHttp + 'subject/getSubjectTree.html').then(function(response){
vm.courses = response.data.result;
});
},
sendSms:function(){
// 校验成功才能发送短信
vm.$refs['member'].validateField('mobile',function(message){
if(message == ""){
axios.get(mainHttp + 'sms/sendFindPasswordSms.html?mobile='+vm.member.mobile).then(function(response){
if(response.data.code == 200){
vm.$message({message: response.data.message,type: 'success'});
}else{
vm.$message.error(response.data.message);
}
});
}
});
}
}
});
vm.getCourses();

@ -0,0 +1,88 @@
$(function(){
$("#account").bind("focus",function(){
$("#account").addClass("pass-input-focus");
$("#pass-auth-select .pass-input-msg").text("");
$("#account").removeClass("pass-input-error");
}).bind("blur",function(){
$("#account").removeClass("pass-input-focus");
// 验证码用户名/邮箱/手机号是否存在
if($("#account").val() != ""){
$.ajax({
type : "get",
url : "checkAccount.html",
async : false,
data:{account:$("#account").val()},
dataType : "json",
success : function(data) {
if(data.code == 201){
$("#pass-auth-select .pass-input-msg").text("用户名不存在,请重新输入");
$("#account").addClass("pass-input-error");
}
}
});
}
});
$("#account").bind("keyup",function(){
if($("#account").val() != ""){
$("#userName_clearBtn").show();
}else{
$("#userName_clearBtn").hide();
}
});
$("#userName_clearBtn").bind("mouseover",function(){
$("#userName_clearBtn").addClass("userName-clearbtn-hover");
}).bind("mouseleave",function(){
$("#userName_clearBtn").removeClass("userName-clearbtn-hover");
}).bind("click",function(){
$("#account").val("");
$("#userName_clearBtn").hide();
$("#account").trigger("focus");
});
$("#veritycode").bind("focus",function(){
$("#veritycode").addClass("pass-input-focus");
$("#veritycode").removeClass("pass-input-error");
$(".vcode-container .pass-input-msg").text("");
}).bind("blur",function(){
$("#veritycode").removeClass("pass-input-focus");
});
$("#submit").bind("click",function(){
var flag = true;
if($("#account").val() == ""){
$("#pass-auth-select .pass-input-msg").text("请您输入用户名/邮箱/手机");
$("#account").addClass("pass-input-error");
flag = false;
}
if($("#veritycode").val() == ""){
$(".vcode-container .pass-input-msg").text("请您输入验证码");
$("#veritycode").addClass("pass-input-error");
flag = false;
}
// 验证码用户名/邮箱/手机号是否存在
$.ajax({
type : "get",
url : "checkAccount.html",
async : false,
data:{account:$("#account").val()},
dataType : "json",
success : function(data) {
if(data.code == 201){
$("#pass-auth-select .pass-input-msg").text("用户名不存在,请重新输入");
$("#account").addClass("pass-input-error");
flag = false;
}
}
});
if(!flag){
return false;
}
});
$(".vcode-img-change").bind("click",function(){
$(".vcode-img").attr("src",mainHttp + "captcha.jpg?t=" + $.now());
});
})

@ -0,0 +1,40 @@
$(function(){
$("#password").bind("focus",function(){
$("#password").addClass("pass-input-focus");
$("#password").removeClass("pass-input-error");
$("#pass_input_msg_Pwd").text("");
}).bind("blur",function(){
$("#password").removeClass("pass-input-focus");
});
$("#verifypwd").bind("focus",function(){
$("#verifypwd").addClass("pass-input-focus");
$("#verifypwd").removeClass("pass-input-error");
$("#repassword_msg").text("");
}).bind("blur",function(){
$("#verifypwd").removeClass("pass-input-focus");
});
$("#submit-resetpwd").bind("click",function(){
var flag = true;
if($("#password").val() == ""){
$("#password").addClass("pass-input-error");
$("#pass_input_msg_Pwd").text("请您填写密码");
flag = false;
}
if($("#verifypwd").val() == ""){
$("#verifypwd").addClass("pass-input-error");
$("#repassword_msg").text("请您输入确认密码");
flag = false;
}
if($("#password").val() != $("#verifypwd").val()){
$("#verifypwd").addClass("pass-input-error");
$("#verifypwd").val("");
$("#repassword_msg").text("确认新密码和新密码不同");
flag = false;
}
return flag;
});
})

@ -0,0 +1,64 @@
$(function(){
$("#pass-input-mobileVcode").bind("focus",function(){
$("#pass-input-mobileVcode").removeClass("pass-input-error");
$("#pass-input-mobileVcode").addClass("pass-input-focus");
$("#forgot-mobileVcode-tip").text("");
}).bind("blur",function(){
$("#pass-input-mobileVcode").removeClass("pass-input-focus");
});
$("#pass-button-new1").bind("click",function(){
$("#forgot-mobileVcode-success").text("短信已经发送");
$("#forgot-mobileVcode-success").show();
$("#pass-button-new1").css("disabled","disabled");
var u = 60;
var t = function() {
if (u < 2) {
$("#pass-button-new1").text("重新发送");
$("#pass-button-new1").css("disabled","");
return
} else {
u--;
$("#pass-button-new1").text("重新发送("+u+")");
}
setTimeout(t, 1000)
};
t();
var isEmail = $("input[name='isEmail']").val();
if(isEmail == "0"){
// 发送短信
$.ajax({
type : "get",
url : mainHttp + "sms/sendFindPasswordSms.html",
async : false,
data:{mobile:$("input[name='mobile']").val()},
dataType : "json",
success : function(data) {
console.log(data);
}
});
}else{
// 发送邮件
$.ajax({
type : "get",
url : mainHttp + "email/sendFindPasswordEmail.html",
async : false,
data:{email:$("input[name='email']").val()},
dataType : "json",
success : function(data) {
console.log(data);
}
});
}
});
$("#submit-mobile").bind("click",function(){
if($("input[name='mobileVcode']").val() == ""){
$("#pass-input-mobileVcode").addClass("pass-input-error");
$("#forgot-mobileVcode-tip").text("请填写验证码");
return false;
}
});
})

@ -0,0 +1,102 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登录_探果网</title>
<meta name="keywords" content="高考,财会类,建筑工程,职业资格,医卫类,考研,会计类"/>
<meta name="description" content="探果网,高考试题,高考试卷,高校试题,名校,名校试题,名校试卷,高校名师,名师专访,名师教案,名师课堂试题库,试卷库,智能题库,历年真题,模拟试题,押题,预测试题,高考,会计证,会计从业,会计师,经济师,施工员,建造师,建筑师,造价师,职业资格,证券资格,考研,计算机考试,建筑考试,财会类,医卫类,护士资格,公务员,知识点,试题,试卷"/>
<meta name="author" content="Tamguo Team" />
<meta name="copyright" content="Tamguo" />
<link rel="stylesheet" th:href="${domainName + 'css/reset.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/member/login.css'}" />
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
</head>
<body>
<div id="wrapper" class="">
<div id="head">
<div class="mod-header">
<a th:href="${domainName + 'login.html'}"><img th:src="${domainName + 'images/logo_731bc32.png'}" alt="logo"></a>
</div>
</div>
<div id="nav">
<div class="nav-2">
<div class="mod-nav clearfix">
<h1 class="page-type-notab"></h1>
</div>
</div>
</div>
<div id="content" style="display: block;">
<div class="clearfix login-container">
<div class="login-form">
<div class="login-wrapper">
<div id="login" class="tang-pass-login animation" style="display: block; visibility: visible; opacity: 1;">
<form id="TANGRAM__PSP_3__form" th:action="${domainName + 'submitLogin.html'}" class="pass-form pass-form-normal" method="POST" autocomplete="off">
<p class="pass-form-logo">用户名密码登录</p>
<p id="TANGRAM__PSP_3__errorWrapper" class="pass-generalErrorWrapper">
<span id="TANGRAM__PSP_3__error" class="pass-generalError pass-generalError-error" th:text="${msg}"></span>
</p>
<p id="TANGRAM__PSP_3__MakeTextWrapper" class="pass-make-text" style="display:none;"></p>
<p id="TANGRAM__PSP_3__hiddenFields" style="display:none"></p>
<p id="TANGRAM__PSP_3__userNameWrapper" class="pass-form-item pass-form-item-userName" style="display:"><input type="text" style="display:none;">
<input id="TANGRAM__PSP_3__userName" type="text" name="username" class="pass-text-input pass-text-input-userName open" autocomplete="off" th:value="${username}" placeholder="手机/邮箱/用户名">
<span id="TANGRAM__PSP_3__userName_clearbtn" class="pass-clearbtn pass-clearbtn-userName" style="display: none; visibility: visible; opacity: 1;"></span><span id="TANGRAM__PSP_3__userNameTip" class="pass-item-tip pass-item-tip-userName" style="display:none"><span id="TANGRAM__PSP_3__userNameTipText" class="pass-item-tiptext pass-item-tiptext-userName"></span></span>
<span class="pass-item-selectbtn pass-item-selectbtn-userName" style="display: none; visibility: hidden; opacity: 1;"></span></p>
<p id="TANGRAM__PSP_3__passwordWrapper" class="pass-form-item pass-form-item-password" style="display:">
<input type="password" style="display: none;">
<input id="TANGRAM__PSP_3__password" type="password" name="password" class="pass-text-input pass-text-input-password" readonly onfocus="this.removeAttribute('readonly');" value="" placeholder="密码"><span id="TANGRAM__PSP_3__password_clearbtn" class="pass-clearbtn pass-clearbtn-password" style="display:none;"></span><span id="TANGRAM__PSP_3__passwordTip" class="pass-item-tip pass-item-tip-password" style="display:none"><span id="TANGRAM__PSP_3__passwordTipText" class="pass-item-tiptext pass-item-tiptext-password"></span></span>
</p>
<p id="TANGRAM__PSP_3__verifyCodeImgWrapper" class="pass-form-item pass-form-item-verifyCode">
<input id="TANGRAM__PSP_3__verifyCode" type="text" name="verifyCode" class="pass-text-input pass-text-input-verifyCode" maxlength="6" placeholder="验证码" autocomplete="off">
<span id="TANGRAM__PSP_3__verifyCode_clearbtn" class="pass-clearbtn pass-clearbtn-verifyCode" style="display:none;"></span>
<span id="TANGRAM__PSP_3__verifyCodeImgParent" class="pass-verifyCodeImgParent">
<img id="TANGRAM__PSP_3__verifyCodeImg" class="pass-verifyCode" th:src="${domainName + 'captcha.jpg'}"></span>
<a id="TANGRAM__PSP_3__verifyCodeChange" href="#" class="pass-change-verifyCode">换一张</a><span id="TANGRAM__PSP_3__verifyCodeError" class="pass-error pass-error-verifyCode"></span><span id="TANGRAM__PSP_3__verifyCodeTip" class="pass-tip pass-tip-verifyCode"></span><span id="TANGRAM__PSP_3__verifyCodeSuccess" class="pass-success pass-success-verifyCode"></span></p>
<p id="TANGRAM__PSP_3__memberPassWrapper" class="pass-form-item pass-form-item-memberPass"><input id="TANGRAM__PSP_3__memberPass" type="checkbox" name="memberPass" class="pass-checkbox-input pass-checkbox-memberPass" checked="checked"><label for="TANGRAM__PSP_3__memberPass" id="TANGRAM__PSP_3__memberPassLabel" class="">下次自动登录</label></p>
<p id="TANGRAM__PSP_3__submitWrapper" class="pass-form-item pass-form-item-submit"><input id="TANGRAM__PSP_3__submit" type="submit" value="登录" class="pass-button pass-button-submit">
<a class="pass-fgtpwd pass-link" th:href="${domainName + 'password/find.html'}" target="_blank">忘记密码?</a>
</p>
</form>
</div>
<div class="tang-pass-footerBar">
<p class="tang-pass-footerBarULogin pass-link" title="用户名登录" data-type="normal" id="TANGRAM__PSP_3__footerULoginBtn">用户名登录</p>
<div class="tang-pass-footerBarPhoenix"><span class="tang-pass-footerBarPhoenixSplit"></span>
<div class="tang-pass-footerBarPhoenixItem" id="TANGRAM__PSP_3__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-qzone" data-dialog="1" data-acc="15" data-height="450" data-width="750">
<a class="phoenix-btn-item" href="#" data-title="qzone" title="QQ帐号">QQ帐号</a>
</li>
<li class="bd-acc-tsina" data-dialog="1" data-acc="2" data-height="669" data-width="800">
<a class="phoenix-btn-item" href="#" 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="#" data-title="weixin" title="微信">微信</a>
</li>
</ul>
</div>
</div>
<div class="clear"></div>
</div>
</div>
</div>
<a class="pass-reglink pass-link" th:href="${domainName + 'register.html'}" target="_blank">立即注册</a>
</div>
</div>
</div>
</div>
</div>
<div id="foot">
<div class="mod-footer">
<div class="copy-box">2018&nbsp;©Tamguo</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" th:inline="javascript">
var mainHttp = [[${domainName}]];
</script>
<script type="text/javascript" th:src="${domainName + 'js/jquery-1.8.3.min.js'}" ></script>
<script type="text/javascript" th:src="${domainName + 'js/member/login.js'}"></script>
</html>

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>找回密码_探果网</title>
<meta name="description" content="探果网携手高校名师为考生提供高效的智能备考服务,涵括领域有高考、财会类、建筑工程、职业资格、医卫类、计算机类和学历类等热门考试题库。拥有高校名师丰富的经验,优质的学习资料和备考全阶段的高效服务,助您丰富自我,不断前行!"/>
<meta name="keyword" content="探果网,高校名师,名师专访,名师教案,名师课堂试题库,试卷库,智能题库,历年真题,模拟试题,押题,预测试题,高考,会计证,会计从业,会计师,经济师,施工员,建造师,建筑师,造价师,职业资格,证券资格,考研,计算机考试,建筑考试,财会类,医卫类,护士资格,公务员,知识点,试题,试卷"/>
<link rel="stylesheet" th:href="${domainName + 'css/reset.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/password/confirmAccount.css'}" />
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
</head>
<body>
<div id="wrapper" class="">
<div id="head">
<div class="mod-header">
<a th:href="${domainName + 'login.html'}"><img th:src="${domainName + 'images/logo_731bc32.png'}" alt="logo"></a>
</div>
<ul class="mod-userbar">
<li>
<a id="mod-userbar-login" th:href="${domainName + 'login.html'}">登录</a>
</li>
<li>|</li>
<li>
<a th:href="${domainName + 'register.html'}">注册</a>
</li>
</ul>
</div>
<div id="nav">
<div class="nav-2">
<div class="mod-nav clearfix">
<h1 class="page-type-notab">找回密码</h1>
</div>
</div>
</div>
<div id="content">
<div class="mod-forgot">
<ul class="mod-sub-nav">
<li class="mod-sub-list1 list1-active">确认帐号</li>
<li class="mod-sub-list2">安全验证</li>
<li class="mod-sub-list3">重置密码</li>
</ul>
<form th:action="${domainName + 'password/confirmAccount.html'}" method="post" id="forgotsel">
<div class="mod-step-detail">
<p class="step-email-info">请填写您需要找回的帐号
</p>
<div class="pass-input-container clearfix" id="pass-auth-select">
<input type="text" th:class="${code == 201 ? 'pass-input pass-input-forgot pass-input-error':'pass-input pass-input-forgot'}" name="username" th:value="${username}" id="account" placeholder="手机/邮箱/用户名">
<span class="fix-clear userName-clearbtn" id="userName_clearBtn"></span>
<span class="pass-input-msg l-h40" th:text="${code == '201' ? '用户名不存在,请重新输入' : ''}"></span>
</div>
<div class="pass-account-slect clearfix m_b15 hide" style="position: relative; display: none;">
<p>请协助我们确认一下您输入的内容,便于更快的定位您的信息:</p>
<p class="pass-radio pass-radio-list" s="username">我输入的是用户名</p>
<p class="pass-radio pass-radio-list pass-radion-active" s="securemobil">我输入的是手机号</p>
</div>
<div class="pass-input-container vcode-container clearfix">
<input type="text" th:class="${code == 202 ? 'pass-input pass-input-forgot vcode-input vcode-input-width pass-input-error' : 'pass-input pass-input-forgot vcode-input vcode-input-width'}" name="veritycode" value="" id="veritycode" placeholder="请输入验证码">
<img class="vcode-img vcode-img-big hide" alt="验证码图片" title="验证码图片" th:src="${domainName + 'captcha.jpg'}" style="display: inline;">
<a class="vcode-img-change p-t13">换一张</a>
<span class="pass-input-msg l-h40" th:text="${code == 202 ? '验证码错误,请重新输入' : ''}"></span>
</div>
<div>
<input type="submit" name="" value="下一步" class="pass-button-submit" id="submit">
</div>
</div>
</form>
</div>
</div>
<div id="foot">
<div class="mod-footer">
<div class="copy-box">2018&nbsp;©Tamguo</div>
</div>
</div>
</div>
<!-- 底部结束-->
</body>
<script type="text/javascript" th:src="${domainName + 'js/jquery-1.8.3.min.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'js/password/confirmAccount.js'}"></script>
<script type="text/javascript" th:inline="javascript">
var mainHttp = [[${domainName}]];
</script>
</html>

@ -0,0 +1,90 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>找回密码_探果网</title>
<meta name="description" content="探果网携手高校名师为考生提供高效的智能备考服务,涵括领域有高考、财会类、建筑工程、职业资格、医卫类、计算机类和学历类等热门考试题库。拥有高校名师丰富的经验,优质的学习资料和备考全阶段的高效服务,助您丰富自我,不断前行!"/>
<meta name="keyword" content="探果网,高校名师,名师专访,名师教案,名师课堂试题库,试卷库,智能题库,历年真题,模拟试题,押题,预测试题,高考,会计证,会计从业,会计师,经济师,施工员,建造师,建筑师,造价师,职业资格,证券资格,考研,计算机考试,建筑考试,财会类,医卫类,护士资格,公务员,知识点,试题,试卷"/>
<link rel="stylesheet" th:href="${setting.domain + 'css/reset.css'}" />
<link rel="stylesheet" th:href="${setting.domain + 'css/password/resetPassword.css'}" />
<link type="favicon" rel="shortcut icon" th:href="${setting.domain + 'images/favicon.png'}" />
</head>
<body>
<div id="wrapper" class="">
<div id="head">
<div class="mod-header">
<a th:href="${setting.domain + 'login.html'}"><img th:src="${setting.domain + 'images/logo_731bc32.png'}" alt="logo"></a>
</div>
<ul class="mod-userbar">
<li>
<a id="mod-userbar-login" th:href="${setting.domain + 'login.html'}">登录</a>
</li>
<li>|</li>
<li>
<a th:href="${setting.domain + 'register.html'}">注册</a>
</li>
</ul>
</div>
<div id="nav">
<div class="nav-2">
<div class="mod-nav clearfix">
<h1 class="page-type-notab">找回密码</h1>
</div>
</div>
</div>
<div id="content">
<div class="mod-forgot">
<ul class="mod-sub-nav">
<li class="mod-sub-list1">确认帐号</li>
<li class="mod-sub-list2">安全验证</li>
<li class="mod-sub-list3 list3-active">重置密码</li>
</ul>
<div class="mod-step-detail">
<p class="step-form-tip m_l80">您正在找回的帐号是:喜欢吃鱼的果果</p>
<form th:action="${setting.domain + 'password/resetPassword.html'}" method="post" id="form-resetpwd">
<div class="pass-input-container clearfix">
<label class="pass-input-title l-h40" for="password">新密码</label>
<input type="password" class="pass-input pass-input-forgot left" name="password" id="password" value="" autocomplete="off">
<div class="pass-input-pwdmsg">
<div class="pass-streng-wrapper" id="pass_pwdMsg">
<span class="pass-tips-streng">
<span id="pass-tips-level"></span>
</span>
<span id="pass-tips-title" class="left"></span>
</div>
<span class="pass-input-msg l-h40" id="pass_input_msg_Pwd"></span>
</div>
</div>
<div class="pass-input-container clearfix">
<label class="pass-input-title l-h40" for="repassword">确认新密码</label>
<input type="password" class="pass-input pass-input-forgot left" name="verifypwd" id="verifypwd" value="" autocomplete="off">
<span class="pass-input-msg l-h40" id="repassword_msg"></span>
</div>
<div class="m_l80">
<input type="hidden" name="resetPasswordKey" th:value="${resetPasswordKey}">
<input type="hidden" name="username" th:value="${username}">
<input class="pass-button-submit" type="submit" name="" value="确定" id="submit-resetpwd">
</div>
</form>
</div>
</div>
<div class="pass-tips hide" id="pass-tips" style="top: 245px; left: 505px; display: none;">
<span class="pwd-checklist-arrow"><em class="arrowa"></em><em class="arrowb"></em></span>
<ul class="pass-tips-content">
<li id="pwdLen" class="pass-tips-content-item pass-tips-content-item-error">长度为6~14个字符</li>
<li id="pwdCha" class="pass-tips-content-item">支持数字,大小写字母和标点符号</li>
<li id="pwdSpa" class="pass-tips-content-item pass-tips-content-item-success">不允许有空格</li>
</ul>
</div>
</div>
<div id="foot">
<div class="mod-footer">
<div class="copy-box">2018&nbsp;©Tamguo</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" th:src="${setting.domain + 'js/jquery-1.8.3.min.js'}"></script>
<script type="text/javascript" th:src="${setting.domain + 'js/password/resetPassword.js'}"></script>
</html>

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>修改密码_探果网</title>
<meta name="description" content="探果网携手高校名师为考生提供高效的智能备考服务,涵括领域有高考、财会类、建筑工程、职业资格、医卫类、计算机类和学历类等热门考试题库。拥有高校名师丰富的经验,优质的学习资料和备考全阶段的高效服务,助您丰富自我,不断前行!"/>
<meta name="keyword" content="探果网,高校名师,名师专访,名师教案,名师课堂试题库,试卷库,智能题库,历年真题,模拟试题,押题,预测试题,高考,会计证,会计从业,会计师,经济师,施工员,建造师,建筑师,造价师,职业资格,证券资格,考研,计算机考试,建筑考试,财会类,医卫类,护士资格,公务员,知识点,试题,试卷"/>
<link rel="stylesheet" th:href="${setting.domain + 'css/reset.css'}" />
<link rel="stylesheet" th:href="${setting.domain + 'css/password/resetPwSuccess.css'}" />
<link type="favicon" rel="shortcut icon" th:href="${setting.domain + 'images/favicon.png'}" />
</head>
<body>
<div id="wrapper" class="">
<div id="head">
<div class="mod-header">
<a th:href="${setting.domain + 'login.html'}"><img th:src="${setting.domain + 'images/logo_731bc32.png'}" alt="logo"></a>
</div>
<ul class="mod-userbar">
<li>
<a id="mod-userbar-login" th:href="${setting.domain + 'login.html'}">登录</a>
</li>
<li>|</li>
<li>
<a th:href="${setting.domain + 'register.html'}">注册</a>
</li>
</ul>
</div>
<div id="nav">
<div class="nav-2">
<div class="mod-nav clearfix">
<h1 class="page-type-notab">找回密码</h1>
</div>
</div>
</div>
<div id="content">
<div class="mod-forgot">
<ul class="mod-sub-nav">
<li class="mod-sub-list1">确认帐号</li>
<li class="mod-sub-list2">安全验证</li>
<li class="mod-sub-list3 list3-active">重置密码</li>
</ul>
<div class="mod-step-detail">
<div class="result-info">
<div class="result-message">
<img th:src="${setting.domain + 'images/password/success_icon.png'}">
<span>恭喜,探果帐号喜欢吃鱼的果果重置密码成功</span>
<a class="button result-title-btn" th:href="${setting.domain + 'login.html'}">直接登录</a>
</div>
<div class="result-list-content">
<span class="result-content-msg">以下为您最近2次的操作记录请仔细检查手机及邮箱如非本人所有可通过帐号申诉更换。</span>
<table class="result-content-table">
<tbody>
<tr class="result-content-title">
<th width="120px">时间</th>
<th width="120">操作记录</th>
<th width="130">IP</th>
</tr>
<tr class="result-content-list">
<td>2018-03-19 </td>
<td>找回密码</td>
<td>220.248.*.*</td>
</tr>
<tr class="result-content-list">
<td>2018-03-13 </td>
<td>设置用户名:喜欢吃鱼的果果</td>
<td>220.248.*.*</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div id="foot">
<div class="mod-footer">
<div class="copy-box">2018&nbsp;©Tamguo</div>
</div>
</div>
</div>
</body>
</html>

@ -0,0 +1,90 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>找回密码_探果网</title>
<meta name="description" content="探果网携手高校名师为考生提供高效的智能备考服务,涵括领域有高考、财会类、建筑工程、职业资格、医卫类、计算机类和学历类等热门考试题库。拥有高校名师丰富的经验,优质的学习资料和备考全阶段的高效服务,助您丰富自我,不断前行!"/>
<meta name="keyword" content="探果网,高校名师,名师专访,名师教案,名师课堂试题库,试卷库,智能题库,历年真题,模拟试题,押题,预测试题,高考,会计证,会计从业,会计师,经济师,施工员,建造师,建筑师,造价师,职业资格,证券资格,考研,计算机考试,建筑考试,财会类,医卫类,护士资格,公务员,知识点,试题,试卷"/>
<link rel="stylesheet" th:href="${domainName + 'css/reset.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/password/securityCheck.css'}" />
<link type="favicon" rel="shortcut icon" th:href="${domainName + 'images/favicon.png'}" />
</head>
<body>
<div id="wrapper" class="">
<div id="head">
<div class="mod-header">
<a th:href="${domainName + 'login.html'}"><img th:src="${domainName + 'images/logo_731bc32.png'}" alt="logo"></a>
</div>
<ul class="mod-userbar">
<li>
<a id="mod-userbar-login" th:href="${domainName + 'login.html'}">登录</a>
</li>
<li>|</li>
<li>
<a th:href="${domainName + 'register.html'}">注册</a>
</li>
</ul>
</div>
<div id="nav">
<div class="nav-2">
<div class="mod-nav clearfix">
<h1 class="page-type-notab">找回密码</h1>
</div>
</div>
</div>
<div id="content">
<div class="mod-forgot">
<ul class="mod-sub-nav">
<li class="mod-sub-list1">确认帐号</li>
<li class="mod-sub-list2 list2-active">安全验证</li>
<li class="mod-sub-list3">重置密码</li>
</ul>
<div class="mod-step-detail" style="position:relative;">
<div class="forgot-auth-container">
<p class="step-form-info">为了你的帐号安全,请完成身份验证</p>
<div class="forgot-auth-type m-t10" id="mobile-auth">
<form th:action="${domainName + 'password/securityCheck.html'}" method="post" class="form-2" id="form-mobile">
<div class="forgot-auth-title" th:text="${isEmail == '1' ? '邮箱验证' : '手机验证'}">手机验证</div>
<div class="form-2-item clearfix pass-input-container">
<label class="form-2-label" th:text="${isEmail == '1' ? '邮箱' : '手机号'}">手机号:</label>
<div class="form-2-content line-32" th:text="${isEmail == '0' ? result.result.mobile : result.result.email}">
156******86</div>
</div>
<p class="verify-method">验证码:</p>
<div class="form-2-item clearfix">
<div class="form-2-content pass-input-container vcode-container m-b-mobile">
<input type="text" th:class="${codeError == '1' ? 'pass-input vcode-input pass-input-new pass-input-error' : 'pass-input vcode-input pass-input-new'}" name="mobileVcode" value="" id="pass-input-mobileVcode" th:placeholder="${isEmail == '1' ? '邮箱验证码' : '手机验证码'}">
<div class="pass-button-timer" id="pass-button-new1">发送验证码</div>
<span class="pass-input-stip" id="forgot-mobileVcode-success"></span>
<div class="clear"></div>
<a class="pass-input-stip" id="forgot-mobileVcode-unreceived" style="margin-left:0;display:none;">收不到短信验证码?</a>
<span class="pass-input-msg" id="forgot-mobileVcode-tip" th:text="${codeError == '1' ? '验证码错误' : ''}"></span>
</div>
</div>
<div class="m-b30">
<input type="hidden" name="username" th:value="${result.result.username}"></input>
<input type="hidden" name="mobile" th:value="${result.result.mobile}"></input>
<input type="hidden" name="email" th:value="${result.result.email}"></input>
<input type="hidden" name="isEmail" th:value="${isEmail}"></input>
<input class="pass-button-submit pass-submit-form pass-button-new1" type="submit" name="" value="下一步" id="submit-mobile" t="mobile">
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div id="foot">
<div class="mod-footer">
<div class="copy-box">2018&nbsp;©Tamguo</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" th:src="${domainName + 'js/jquery-1.8.3.min.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'js/password/securityCheck.js'}"></script>
<script type="text/javascript" th:inline="javascript">
var mainHttp = [[${domainName}]];
</script>
</html>

@ -0,0 +1,84 @@
<!DOCTYPE html>
<html lang="Zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>注册_探果网</title>
<meta name="keywords" content="高考,财会类,建筑工程,职业资格,医卫类,考研,会计类"/>
<meta name="description" content="探果网,高考试题,高考试卷,高校试题,名校,名校试题,名校试卷,高校名师,名师专访,名师教案,名师课堂试题库,试卷库,智能题库,历年真题,模拟试题,押题,预测试题,高考,会计证,会计从业,会计师,经济师,施工员,建造师,建筑师,造价师,职业资格,证券资格,考研,计算机考试,建筑考试,财会类,医卫类,护士资格,公务员,知识点,试题,试卷"/>
<meta name="author" content="Tamguo Team" />
<meta name="copyright" content="Tamguo" />
<link rel="stylesheet" th:href="${domainName + 'css/reset.css'}" />
<link rel="stylesheet" th:href="${domainName + 'css/member/register.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">
</head>
<body>
<div id="wrapper" class="">
<div id="head">
<div class="mod-header">
<a th:href="${domainName}" style="display: block;">
<img th:src="${domainName + 'images/logo_731bc32.png'}" alt="logo"></a>
</div>
</div>
<div id="nav">
<div class="nav-2">
<div class="mod-nav clearfix">
<h1 class="page-type-notab"></h1>
</div>
</div>
</div>
<div id="content">
<div class="mod-reg clearfix mod-reg-">
<div class="reg-content tang-pass-reg" id="reg_content" style="width:50%;margin-top:10px;">
<el-form :model="member" :rules="rules" ref="member" label-width="100px" class="demo-ruleForm" v-loading="loading">
<el-form-item label="用戶名" prop="username">
<el-input v-model="member.username"></el-input>
</el-form-item>
<el-form-item label="类型" prop="kemuId">
<el-cascader
:options="courses"
v-model="member.kemuId">
</el-cascader>
</el-form-item>
<el-form-item label="手机号" prop="mobile">
<el-input v-model="member.mobile"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="member.email"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model="member.password" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="checkPass">
<el-input type="password" v-model="member.checkPass" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="验证码" prop="verifyCode">
<el-input v-model="member.verifyCode" style="width:60%;"></el-input>
<el-button @click="sendSms" :disabled="smsDisabled">发送短信</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('member')">立即注册</el-button>
<el-button @click="resetForm('member')">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="login-link" id="login_link">
<span>我已注册,现在就</span>
<button class="login-btn" id="login_btn"><a title="探果网登录" th:href="${domainName + 'login.html'}">登录</a></button></div>
</div>
<div id="foot">
<div class="mod-footer">
<div class="copy-box">2018&nbsp;©Tamguo</div></div>
</div>
</div>
</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/register.js'}"></script>
</html>

@ -134,7 +134,7 @@ public class MemberService extends ServiceImpl<MemberMapper, MemberEntity> imple
return Result.result(201, null, "帐号不存在!");
}
List<MemberEntity> members = memberMapper.selectList(Condition.create().eq("user_name", account).or().eq("mobile", account));
List<MemberEntity> members = memberMapper.selectList(Condition.create().eq("username", account).or().eq("mobile", account));
if(members.size() == 0){
return Result.result(201, null, "帐号不存在!");
}

Loading…
Cancel
Save