@@ -382,6 +382,27 @@ namespace Learun.Application.Organization | |||||
} | } | ||||
} | } | ||||
} | } | ||||
public UserEntity GetEntityByMobile(string mobile) | |||||
{ | |||||
try | |||||
{ | |||||
UserEntity userEntity; | |||||
userEntity = userService.GetEntityByMobile(mobile); | |||||
return userEntity; | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
if (ex is ExceptionEx) | |||||
{ | |||||
throw; | |||||
} | |||||
else | |||||
{ | |||||
throw ExceptionEx.ThrowBusinessException(ex); | |||||
} | |||||
} | |||||
} | |||||
/// <summary> | /// <summary> | ||||
/// 获取实体,通过用户账号 | /// 获取实体,通过用户账号 | ||||
/// </summary> | /// </summary> | ||||
@@ -1060,6 +1081,29 @@ namespace Learun.Application.Organization | |||||
} | } | ||||
} | } | ||||
} | } | ||||
/// <summary> | |||||
/// 修改手机号 | |||||
/// </summary> | |||||
/// <param name="keyValue"></param> | |||||
/// <param name="mobile"></param> | |||||
public void UpdateMobile(string keyValue, string mobile) | |||||
{ | |||||
try | |||||
{ | |||||
userService.UpdateMobile(keyValue, mobile); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
if (ex is ExceptionEx) | |||||
{ | |||||
throw; | |||||
} | |||||
else | |||||
{ | |||||
throw ExceptionEx.ThrowBusinessException(ex); | |||||
} | |||||
} | |||||
} | |||||
#endregion | #endregion | ||||
#region 验证数据 | #region 验证数据 | ||||
@@ -240,6 +240,11 @@ namespace Learun.Application.Organization | |||||
/// </summary> | /// </summary> | ||||
[Column("F_MODIFYPWDDATE")] | [Column("F_MODIFYPWDDATE")] | ||||
public DateTime? F_ModifyPwdDate { get; set; } | public DateTime? F_ModifyPwdDate { get; set; } | ||||
/// <summary> | |||||
/// 是否已登录标记 | |||||
/// </summary> | |||||
[Column("F_HAVELOGMARK")] | |||||
public bool? F_HaveLogMark { get; set; } | |||||
#endregion | #endregion | ||||
#region 扩展操作 | #region 扩展操作 | ||||
@@ -69,6 +69,8 @@ namespace Learun.Application.Organization | |||||
/// </summary> | /// </summary> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
void GetExportListOfStudent(); | void GetExportListOfStudent(); | ||||
UserEntity GetEntityByMobile(string mobile); | |||||
/// <summary> | /// <summary> | ||||
/// 获取实体,通过用户账号 | /// 获取实体,通过用户账号 | ||||
/// </summary> | /// </summary> | ||||
@@ -153,6 +155,12 @@ namespace Learun.Application.Organization | |||||
/// 解绑微信 | /// 解绑微信 | ||||
/// </summary> | /// </summary> | ||||
void DoUnbundWeiXin(string keyValue); | void DoUnbundWeiXin(string keyValue); | ||||
/// <summary> | |||||
/// 修改手机号 | |||||
/// </summary> | |||||
/// <param name="keyValue"></param> | |||||
/// <param name="mobile"></param> | |||||
void UpdateMobile(string keyValue, string mobile); | |||||
#endregion | #endregion | ||||
#region 验证数据 | #region 验证数据 | ||||
@@ -26,6 +26,32 @@ namespace Learun.Application.Organization | |||||
#endregion | #endregion | ||||
#region 获取数据 | #region 获取数据 | ||||
public UserEntity GetEntityByMobile(string mobile) | |||||
{ | |||||
try | |||||
{ | |||||
var strSql = new StringBuilder(); | |||||
strSql.Append("SELECT "); | |||||
strSql.Append(fieldSql); | |||||
strSql.Append(" FROM LR_Base_User t "); | |||||
strSql.Append(" WHERE t.F_Mobile = @account AND t.F_DeleteMark = 0 "); | |||||
return this.BaseRepository().FindEntity<UserEntity>(strSql.ToString(), new | |||||
{ | |||||
account = mobile | |||||
}); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
if (ex is ExceptionEx) | |||||
{ | |||||
throw; | |||||
} | |||||
else | |||||
{ | |||||
throw ExceptionEx.ThrowServiceException(ex); | |||||
} | |||||
} | |||||
} | |||||
/// <summary> | /// <summary> | ||||
/// 获取实体,通过用户账号 | /// 获取实体,通过用户账号 | ||||
/// </summary> | /// </summary> | ||||
@@ -833,6 +859,35 @@ namespace Learun.Application.Organization | |||||
} | } | ||||
} | } | ||||
} | } | ||||
/// <summary> | |||||
/// 修改手机号 | |||||
/// </summary> | |||||
/// <param name="keyValue"></param> | |||||
/// <param name="mobile"></param> | |||||
public void UpdateMobile(string keyValue, string mobile) | |||||
{ | |||||
try | |||||
{ | |||||
var userEntity = this.BaseRepository().FindEntity<UserEntity>(keyValue); | |||||
if (userEntity != null) | |||||
{ | |||||
userEntity.F_Mobile = mobile; | |||||
userEntity.Modify(keyValue); | |||||
this.BaseRepository().Update(userEntity); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
if (ex is ExceptionEx) | |||||
{ | |||||
throw; | |||||
} | |||||
else | |||||
{ | |||||
throw ExceptionEx.ThrowServiceException(ex); | |||||
} | |||||
} | |||||
} | |||||
public void UpdateIp(string ip, string id) | public void UpdateIp(string ip, string id) | ||||
{ | { | ||||
@@ -17,6 +17,10 @@ using System.Web; | |||||
using Quanjiang.DigitalScholl.WebLicense; | using Quanjiang.DigitalScholl.WebLicense; | ||||
using Learun.Application.TwoDevelopment.EducationalAdministration; | using Learun.Application.TwoDevelopment.EducationalAdministration; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
using Quanjiang.DigitalScholl.SendSms; | |||||
using Learun.Cache.Factory; | |||||
using Learun.Cache.Base; | |||||
using System.Collections.Generic; | |||||
namespace Learun.Application.Web.Controllers | namespace Learun.Application.Web.Controllers | ||||
{ | { | ||||
@@ -38,6 +42,8 @@ namespace Learun.Application.Web.Controllers | |||||
private LoginModelIBLL loginModelIbll = new LoginModelBLL(); | private LoginModelIBLL loginModelIbll = new LoginModelBLL(); | ||||
private AnnexesFileIBLL annexesFileIbll = new AnnexesFileBLL(); | private AnnexesFileIBLL annexesFileIbll = new AnnexesFileBLL(); | ||||
WeChatDevelopIBLL weChatDevelopIbll = new WeChatDevelopBLL(); | WeChatDevelopIBLL weChatDevelopIbll = new WeChatDevelopBLL(); | ||||
private readonly ISms aliyunSms = new AliyunSms(); | |||||
private ICache redisCache = CacheFactory.CaChe(); | |||||
#endregion | #endregion | ||||
#region 视图功能 | #region 视图功能 | ||||
@@ -1010,6 +1016,119 @@ namespace Learun.Application.Web.Controllers | |||||
#endregion | #endregion | ||||
#region 短信发送、校验 | |||||
/// <summary> | |||||
/// 忘记密码 | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public ActionResult ForgotPassword() | |||||
{ | |||||
return View(); | |||||
} | |||||
/// <summary> | |||||
/// 发送短信验证码 | |||||
/// </summary> | |||||
/// <param name="codeType">发送短信类型:忘记密码forgetpwd,首次登录firstlogin,绑定微信bindwx,解绑微信unbindwx,修改手机号modifymobile,;</param> | |||||
/// <param name="phone">手机号</param> | |||||
/// <returns></returns> | |||||
[HttpPost] | |||||
public ActionResult Sendcode(string codeType, string phone) | |||||
{ | |||||
if (string.IsNullOrEmpty(codeType)) | |||||
{ | |||||
return Fail("未指定短信类型。"); | |||||
} | |||||
UserEntity userEntity = null; | |||||
userEntity = userBll.GetEntityByMobile(phone); | |||||
if (userEntity == null) | |||||
{ | |||||
return Fail("用户不存在!"); | |||||
} | |||||
if (string.IsNullOrEmpty(userEntity.F_Mobile)) | |||||
{ | |||||
return Fail("用户手机号不存在!"); | |||||
} | |||||
if (!CommonHelper.IsValidMobile(userEntity.F_Mobile)) | |||||
{ | |||||
return Fail("手机号格式不正确!"); | |||||
} | |||||
if (codeType == "firstlogin" && userEntity.F_HaveLogMark == true) | |||||
{ | |||||
return Fail("当前用户非首次登录,请使用账号密码进行登录!"); | |||||
} | |||||
var listStr = new List<string>(); | |||||
var result = aliyunSms.SendSmsToSingle(userEntity.F_Mobile, SmsType.LoginBind, listStr); | |||||
if (result.Result.code == "OK") | |||||
{ | |||||
redisCache.Write<string>("sendcodeinpc_" + codeType + "_" + userEntity.F_Mobile, result.Result.randomNum, new TimeSpan(0, 5, 0), CacheId.sms); | |||||
//日志 | |||||
LogEntity logEntity = new LogEntity(); | |||||
logEntity.F_CategoryId = 3; | |||||
logEntity.F_SourceObjectId = codeType; | |||||
logEntity.F_OperateTypeId = "sms"; | |||||
logEntity.F_OperateType = "sms"; | |||||
logEntity.F_OperateAccount = "system"; | |||||
logEntity.F_ExecuteResult = 200; | |||||
logEntity.F_ExecuteResultJson = "短信发送成功:" + result.Result.message; | |||||
logEntity.F_Description = "短信发送:" + userEntity.F_Mobile + " 验证码:" + result.Result.randomNum; | |||||
logEntity.WriteLog(); | |||||
return Success("短信发送成功:" + result.Result.message); | |||||
} | |||||
else | |||||
{ | |||||
LogEntity logEntity = new LogEntity(); | |||||
logEntity.F_CategoryId = 4; | |||||
logEntity.F_SourceObjectId = codeType; | |||||
logEntity.F_OperateTypeId = "sms"; | |||||
logEntity.F_OperateType = "sms"; | |||||
logEntity.F_OperateAccount = "system"; | |||||
logEntity.F_ExecuteResult = 400; | |||||
logEntity.F_ExecuteResultJson = "短信发送失败:" + result.Result.message + result.Result.errorType; | |||||
logEntity.F_Description = "短信发送:" + userEntity.F_Mobile; | |||||
logEntity.WriteLog(); | |||||
return Fail("短信发送失败:" + result.Result.message + result.Result.errorType); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 忘记密码:修改密码 | |||||
/// </summary> | |||||
/// <param name="phone"></param> | |||||
/// <param name="newpassword"></param> | |||||
/// <returns></returns> | |||||
[HttpPost] | |||||
public ActionResult ForgotPasswordHandle(string codeType, string phone, string verifycode, string newpassword) | |||||
{ | |||||
//短信验证码校验 | |||||
if (string.IsNullOrEmpty(codeType)) | |||||
{ | |||||
return Fail("未指定短信类型。"); | |||||
} | |||||
if (string.IsNullOrEmpty(phone)) | |||||
{ | |||||
return Fail("手机号不能为空。"); | |||||
} | |||||
var code = redisCache.Read<string>("sendcodeinpc_" + codeType + "_" + phone, CacheId.sms); | |||||
if (!string.IsNullOrEmpty(code) && code == verifycode) | |||||
{ | |||||
//return Success("验证成功。"); | |||||
UserEntity userEntity = userBll.GetEntityByMobile(phone); | |||||
if (userEntity == null) | |||||
{ | |||||
return Fail("用户不存在"); | |||||
} | |||||
userBll.setPassword(userEntity.F_UserId, newpassword); | |||||
return Success("密码修改成功"); | |||||
} | |||||
else | |||||
{ | |||||
return Fail("验证失败,验证码错误或已失效。"); | |||||
} | |||||
} | |||||
#endregion | |||||
/// <summary> | /// <summary> | ||||
/// 获取IP | /// 获取IP | ||||
/// </summary> | /// </summary> | ||||
@@ -4371,6 +4371,7 @@ | |||||
<Content Include="Views\Login\Default\Index.css" /> | <Content Include="Views\Login\Default\Index.css" /> | ||||
<Content Include="Views\Login\Default\Index.js" /> | <Content Include="Views\Login\Default\Index.js" /> | ||||
<Content Include="Views\Login\Default\qrcode.min.js" /> | <Content Include="Views\Login\Default\qrcode.min.js" /> | ||||
<Content Include="Views\Login\ForgotPassword.js" /> | |||||
<Content Include="Views\Login\images\login1.png" /> | <Content Include="Views\Login\images\login1.png" /> | ||||
<Content Include="Views\Login\images\loginBg.jpg" /> | <Content Include="Views\Login\images\loginBg.jpg" /> | ||||
<Content Include="Views\Login\PageFive\IndexWxLogin.js" /> | <Content Include="Views\Login\PageFive\IndexWxLogin.js" /> | ||||
@@ -7332,6 +7333,10 @@ | |||||
<Project>{1d192591-b85a-41db-ae3a-4bf9765786c1}</Project> | <Project>{1d192591-b85a-41db-ae3a-4bf9765786c1}</Project> | ||||
<Name>Learun.Workflow.Engine</Name> | <Name>Learun.Workflow.Engine</Name> | ||||
</ProjectReference> | </ProjectReference> | ||||
<ProjectReference Include="..\Quanjiang.DigitalScholl.SendSms\Quanjiang.DigitalScholl.SendSms.csproj"> | |||||
<Project>{55F0F08D-2A9F-489A-BE1B-2EEAE80687E6}</Project> | |||||
<Name>Quanjiang.DigitalScholl.SendSms</Name> | |||||
</ProjectReference> | |||||
<ProjectReference Include="..\Quanjiang.DigitalScholl.WebLicense\Quanjiang.DigitalScholl.WebLicense.csproj"> | <ProjectReference Include="..\Quanjiang.DigitalScholl.WebLicense\Quanjiang.DigitalScholl.WebLicense.csproj"> | ||||
<Project>{4D841EAD-3FD8-4FAC-BC67-C4CE6C0D1181}</Project> | <Project>{4D841EAD-3FD8-4FAC-BC67-C4CE6C0D1181}</Project> | ||||
<Name>Quanjiang.DigitalScholl.WebLicense</Name> | <Name>Quanjiang.DigitalScholl.WebLicense</Name> | ||||
@@ -8431,6 +8436,7 @@ | |||||
<None Include="Properties\PublishProfiles\FolderProfile8.pubxml" /> | <None Include="Properties\PublishProfiles\FolderProfile8.pubxml" /> | ||||
<None Include="Properties\PublishProfiles\FolderProfile9.pubxml" /> | <None Include="Properties\PublishProfiles\FolderProfile9.pubxml" /> | ||||
<None Include="Properties\PublishProfiles\learunadms6.1.pubxml" /> | <None Include="Properties\PublishProfiles\learunadms6.1.pubxml" /> | ||||
<Content Include="Views\Login\ForgotPassword.cshtml" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<WCFMetadata Include="Connected Services\" /> | <WCFMetadata Include="Connected Services\" /> | ||||
@@ -99,6 +99,8 @@ | |||||
<!-- <div class="lr-login-weixin" style="font-size: 12px;margin-top: 15px;text-align: right;padding-right: 71px;"><a href="https://open.weixin.qq.com/connect/qrconnect?appid=wxd75b6651c86f816b&redirect_uri=http%3a%2f%2fwww.learun.cn&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect">微信登录</a></div> --> | <!-- <div class="lr-login-weixin" style="font-size: 12px;margin-top: 15px;text-align: right;padding-right: 71px;"><a href="https://open.weixin.qq.com/connect/qrconnect?appid=wxd75b6651c86f816b&redirect_uri=http%3a%2f%2fwww.learun.cn&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect">微信登录</a></div> --> | ||||
<div class="lr-login-version"> | <div class="lr-login-version"> | ||||
<a style="float: left;font-family: PingFangSC-Regular;font-size: 12px;color: #3298DC;margin-right:20px;" href="/Login/ForgotPassword">忘记密码?</a> | |||||
@if (ViewBag.TeachSwitch) | @if (ViewBag.TeachSwitch) | ||||
{ | { | ||||
<a style="float: left;font-family: PingFangSC-Regular;font-size: 12px;color: #3298DC;" href="/EducationalAdministration/EmpInfoEnternal/FormAdd">教师注册</a> | <a style="float: left;font-family: PingFangSC-Regular;font-size: 12px;color: #3298DC;" href="/EducationalAdministration/EmpInfoEnternal/FormAdd">教师注册</a> | ||||
@@ -0,0 +1,149 @@ | |||||
<!DOCTYPE html> | |||||
<html lang="zh-cn"> | |||||
<head> | |||||
<meta name=”renderer” content=”webkit|ie-comp|ie-stand” /> | |||||
<meta name="viewport" content="width=device-width" /> | |||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> | |||||
<meta http-equiv="X-UA-Compatible" content="chrome=1,IE=edge"> | |||||
<link rel="icon" href="~/favicon.ico"> | |||||
<title>数字化校园 - 登录页面</title> | |||||
<style> | |||||
/* for Chrome */ | |||||
body::-webkit-scrollbar { | |||||
display: none; | |||||
} | |||||
.lr-login-logo .lr-login-title:before { | |||||
background-color: transparent !important | |||||
} | |||||
.lr-login-footer .OnlineUserNumBox { | |||||
float: right; | |||||
} | |||||
.lr-login-footer > p { | |||||
width: 880px; | |||||
margin: auto; | |||||
} | |||||
.tips { | |||||
position: absolute; | |||||
left: 50%; | |||||
bottom: 35px; | |||||
color: #fff; | |||||
font-size: 13px; | |||||
margin-left: -91px; | |||||
} | |||||
.tips > * { | |||||
display: inline-block; | |||||
vertical-align: middle; | |||||
} | |||||
.tips img { | |||||
margin-right: 8px | |||||
} | |||||
.titleImg { | |||||
border: none !important; | |||||
} | |||||
.titleImg img { | |||||
width: 35px !important; | |||||
} | |||||
.wxLogin { | |||||
color: #53b947 !important; | |||||
} | |||||
.titleImg { | |||||
color: #da9835 !important; | |||||
} | |||||
.wxLogin img { | |||||
width: 35px !important; | |||||
top: -2px; | |||||
} | |||||
.downBox { | |||||
width: 100%; | |||||
height: 60px; | |||||
/*background: red;*/ | |||||
position: absolute; | |||||
bottom: -40px; | |||||
right: 0 color:#fff !important; | |||||
} | |||||
.downBox a { | |||||
color: #fff !important; | |||||
border: 1px solid #fff | |||||
} | |||||
.codeBtn { | |||||
border: 1px solid #DCDFE6; | |||||
padding: 6px 10px; | |||||
color: #606266; | |||||
font-size: 12px; | |||||
cursor: pointer; | |||||
border-radius: 2px; | |||||
position: absolute; | |||||
left: 260px; | |||||
top: 10px; | |||||
} | |||||
.codeBtn:hover { | |||||
border-color: #CBCFD5; | |||||
} | |||||
</style> | |||||
</head> | |||||
<body> | |||||
@Html.AppendCssFile("/Views/Login/Default/Index.css") | |||||
<link href="~/Content/css/process.css" rel="stylesheet" /> | |||||
<!-- <img src="~/Content/images/Logins/loginBg.jpg" /> --> | |||||
<input id="errornum" type="hidden" value="@ViewBag.errornum" /> | |||||
<div class="lr-login-body"> | |||||
<div class="lr-login-logo"> | |||||
<div class="lr-login-title" style="left: 0%;margin-left: 0;width: 100%;text-align: center;"> | |||||
<img src="/Content/images/logins/login4.png" alt=""> | |||||
</div> | |||||
</div> | |||||
<div class="lr-login-middle" style="height:480px"> | |||||
<img src="~/Content/images/logins/login2.png" /> | |||||
<!--修改密码框--> | |||||
<div class="lr-login-main lr-login-normal" id="updatepwBox"> | |||||
<!--表单--> | |||||
<div class="lr-login-bypsw"> | |||||
<div class="error_info">* <span></span></div> | |||||
<div class="lr-login-input"> | |||||
<img class="inp_icon" src="~/Content/images/Login/default_account0.png" alt=""> <input id="phone" type="text" placeholder="请输入用户绑定的手机号"> | |||||
</div> | |||||
<div class="lr-login-input"> | |||||
<img class="inp_icon" src="~/Content/images/Login/default_psw0.png" alt=""><input id="newpassword" type="password" placeholder="请输入新密码"> | |||||
<span id="psw_change" class="psw_change"></span> | |||||
</div> | |||||
<div class="lr-login-input"> | |||||
<img class="inp_icon" src="~/Content/images/Login/default_psw0.png" alt=""><input id="newpassword1" type="password" placeholder="请再次输入新密码"> | |||||
<span id="psw_change" class="psw_change"></span> | |||||
</div> | |||||
<div class="lr-login-input"> | |||||
<img class="inp_icon" src="~/Content/images/Login/default_psw0.png" alt=""><input id="verifycode" type="text" placeholder="验证码"> | |||||
<span id="sendCode" class="codeBtn">发送验证码</span> | |||||
</div> | |||||
<div class="lr-login-btn" id="confirmUpdate"><span>确认</span></div> | |||||
</div> | |||||
</div> | |||||
<a href="Javascript:void(0)" id="goLogin" class="down titleImg" title="去登录"> | |||||
<img src="~/Content/images/LoginPage/title.jpg" alt="" /> <span>去登录</span> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
<img id="loginFoot" src="~/Content/images/logins/login1.png" alt=""> | |||||
<script src="~/Content/jquery/jquery-1.10.2.min.js"></script> | |||||
<script src="~/Content/jquery/jquery.md5.min.js"></script> | |||||
<script src="~/Content/jquery/qrcode.min.js"></script> | |||||
<script src="~/Content/jquery/plugin/layer/layer.js"></script> | |||||
@Html.AppendJsFile("/Views/Login/ForgotPassword.js") | |||||
</body> | |||||
</html> |
@@ -0,0 +1,179 @@ | |||||
/*! | |||||
* 版 本 Learun-ADMS-Ultimate V7.0.0 数字化智慧校园(http://www.learun.cn) | |||||
* Copyright (c) 2013-2018 北京泉江科技有限公司 | |||||
* 创建人:陈彬彬 | |||||
* 日 期:2017.03.08 | |||||
* 描 述:登录页面前端脚本 | |||||
*/ | |||||
(function ($) { | |||||
"use strict"; | |||||
var codeType = 'forgetpwd', hasSendCode = false, time = 0, timeT = '', isSending = false; | |||||
var lrPage = { | |||||
init: function () { | |||||
lrPage.bind(); | |||||
}, | |||||
bind: function () { | |||||
// 去登陆 | |||||
$('#goLogin').click(function () { | |||||
window.location.href = "/"; | |||||
}) | |||||
// 确认修改按钮 | |||||
$("#confirmUpdate").on('click', function () { | |||||
lrPage.confirmUpdate(); | |||||
}); | |||||
// 发送验证码事件 | |||||
$("#sendCode").on('click', function () { | |||||
lrPage.sendCode(); | |||||
}); | |||||
$('.psw_change').css({ | |||||
'background': 'url(' + '/Content/images/Login/psw0.png) no-repeat center center' | |||||
}); | |||||
//点击密码icon 显示/隐藏 | |||||
$('.psw_change').click(function (event) { | |||||
var event = event || window.event; | |||||
event.stopPropagation(); | |||||
var $this = $(this); | |||||
$this.toggleClass('psw_show'); | |||||
//如果当前隐藏 变显示 | |||||
if ($this.hasClass('psw_show')) { | |||||
$this.css({ | |||||
'background': 'url(' + '/Content/images/Login/psw1.png) no-repeat center center' | |||||
}); | |||||
$this.prev().attr('type', 'text'); | |||||
} else { | |||||
$this.css( | |||||
'background', 'url(/Content/images/Login/psw0.png) no-repeat center center' | |||||
); | |||||
$this.prev().attr('type', 'password'); | |||||
} | |||||
}); | |||||
}, | |||||
updating: function (isShow) { | |||||
if (isShow) { | |||||
$('#updatepwBox input').attr('disabled', 'disabled'); | |||||
$("#confirmUpdate").addClass('active').attr('disabled', 'disabled').find('span').hide(); | |||||
$("#confirmUpdate").css('background', '#eeecec url(/Content/images/Login/loading.gif) no-repeat center 10px'); | |||||
} | |||||
else { | |||||
$('#updatepwBox input').removeAttr('disabled'); | |||||
$("#confirmUpdate").removeClass('active').removeAttr('disabled').find('span').show(); | |||||
$("#confirmUpdate").css('background', '#268fe2'); | |||||
} | |||||
}, | |||||
sendCode: function () { | |||||
if (isSending || hasSendCode) return; | |||||
let phone = $('#phone').val() | |||||
if (!phone) { | |||||
$('#updatepwBox .error_info span').text('请输入手机号') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} else if (!/^1[0-9]{10}$/.test(phone)) { | |||||
$('#updatepwBox .error_info span').text('手机号格式不正确') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} | |||||
$('#updatepwBox .error_info').hide() | |||||
isSending = true | |||||
$.ajax({ | |||||
url: "/Login/Sendcode", | |||||
data: { phone, codeType }, | |||||
dataType: 'json', | |||||
type: "post", | |||||
success: (res) => { | |||||
isSending = false; | |||||
if (res.code == 200) { | |||||
$('#updatepwBox .error_info span').text('短信已发送') | |||||
$('#updatepwBox .error_info').show() | |||||
hasSendCode = true | |||||
time = 60 | |||||
$('#sendCode').text(`重新发送(${time}s)`) | |||||
timeT = setInterval(() => { | |||||
time-- | |||||
if (time == 0) { | |||||
hasSendCode = false | |||||
clearInterval(timeT) | |||||
timeT = '' | |||||
} | |||||
$('#sendCode').text(`重新发送${time ? '(' + time + 's' + ')' : ''}`) | |||||
}, 1000); | |||||
} else { | |||||
$('#updatepwBox .error_info span').text(res.info) | |||||
$('#updatepwBox .error_info').show() | |||||
} | |||||
} | |||||
}); | |||||
}, | |||||
confirmUpdate: async function () { | |||||
let phone = $('#phone').val() | |||||
let verifycode = $('#verifycode').val() | |||||
let newpassword = $('#newpassword').val() | |||||
let newpassword1 = $('#newpassword1').val() | |||||
if (!phone) { | |||||
$('#updatepwBox .error_info span').text('请输入手机号') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} else if (!/^1[0-9]{10}$/.test(phone)) { | |||||
$('#updatepwBox .error_info span').text('手机号格式不正确') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} | |||||
if (!newpassword) { | |||||
$('#updatepwBox .error_info span').text('请输入新密码') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} | |||||
if (!/^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*,\.])[0-9a-zA-Z!@#$%^&*,\.]{8,20}$/.test(newpassword)) { | |||||
$('#updatepwBox .error_info span').text('您的密码不满足强度要求,请重新输入') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} | |||||
if (!newpassword1) { | |||||
$('#updatepwBox .error_info span').text('请再次输入新密码') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} | |||||
if (newpassword != newpassword1) { | |||||
$('#updatepwBox .error_info span').text('两次密码输入不一致') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} | |||||
if (!verifycode) { | |||||
$('#updatepwBox .error_info span').text('请输入验证码') | |||||
$('#updatepwBox .error_info').show() | |||||
return | |||||
} | |||||
$('#updatepwBox .error_info').hide() | |||||
lrPage.updating(true); | |||||
$.ajax({ | |||||
url: "/Login/ForgotPasswordHandle", | |||||
data: { phone, verifycode, codeType, newpassword: $.md5(newpassword) }, | |||||
dataType: 'json', | |||||
type: "post", | |||||
success: (res) => { | |||||
if (res.code == 200) { | |||||
$('#updatepwBox .error_info span').text('修改密码成功') | |||||
$('#updatepwBox .error_info').show() | |||||
setTimeout(() => { | |||||
window.location.href = "/"; | |||||
}, 1500) | |||||
} else { | |||||
lrPage.updating(false); | |||||
$('#updatepwBox .error_info span').text(res.info) | |||||
$('#updatepwBox .error_info').show() | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
}; | |||||
$(function () { | |||||
lrPage.init(); | |||||
}); | |||||
})(window.jQuery) |
@@ -220,6 +220,7 @@ | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<Compile Include="Bootstraper.cs" /> | <Compile Include="Bootstraper.cs" /> | ||||
<Compile Include="Modules\UsernologinApi.cs" /> | |||||
<Compile Include="Modules\VisitmanageApi.cs" /> | <Compile Include="Modules\VisitmanageApi.cs" /> | ||||
<Compile Include="Modules\LessonInfoOfElectiveOnlineApi.cs" /> | <Compile Include="Modules\LessonInfoOfElectiveOnlineApi.cs" /> | ||||
<Compile Include="Modules\RepairReport\RepairReportTeacherApi.cs" /> | <Compile Include="Modules\RepairReport\RepairReportTeacherApi.cs" /> | ||||
@@ -396,6 +397,10 @@ | |||||
<Project>{1D192591-B85A-41DB-AE3A-4BF9765786C1}</Project> | <Project>{1D192591-B85A-41DB-AE3A-4BF9765786C1}</Project> | ||||
<Name>Learun.Workflow.Engine</Name> | <Name>Learun.Workflow.Engine</Name> | ||||
</ProjectReference> | </ProjectReference> | ||||
<ProjectReference Include="..\Quanjiang.DigitalScholl.SendSms\Quanjiang.DigitalScholl.SendSms.csproj"> | |||||
<Project>{55F0F08D-2A9F-489A-BE1B-2EEAE80687E6}</Project> | |||||
<Name>Quanjiang.DigitalScholl.SendSms</Name> | |||||
</ProjectReference> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<Folder Include="App_Data\" /> | <Folder Include="App_Data\" /> | ||||
@@ -1,9 +1,13 @@ | |||||
using Learun.Application.Base.SystemModule; | using Learun.Application.Base.SystemModule; | ||||
using Learun.Application.Organization; | using Learun.Application.Organization; | ||||
using Learun.Application.TwoDevelopment.EducationalAdministration; | using Learun.Application.TwoDevelopment.EducationalAdministration; | ||||
using Learun.Cache.Base; | |||||
using Learun.Cache.Factory; | |||||
using Learun.Util; | using Learun.Util; | ||||
using Learun.Util.Operat; | using Learun.Util.Operat; | ||||
using Nancy; | using Nancy; | ||||
using Quanjiang.DigitalScholl.SendSms; | |||||
using System; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Configuration; | using System.Configuration; | ||||
using System.Linq; | using System.Linq; | ||||
@@ -30,6 +34,7 @@ namespace Learun.Application.WebApi | |||||
Post["/modifypwiden"] = ModifyPasswordiden; | Post["/modifypwiden"] = ModifyPasswordiden; | ||||
Post["/unbundWeiXin"] = DoUnbundWeiXin; | Post["/unbundWeiXin"] = DoUnbundWeiXin; | ||||
Post["/loginbyIdCard"] = LoginByIdCard; | Post["/loginbyIdCard"] = LoginByIdCard; | ||||
Post["/updateMobile"] = UpdateMobile; | |||||
Get["/info"] = Info; | Get["/info"] = Info; | ||||
Get["/map"] = GetMap; | Get["/map"] = GetMap; | ||||
@@ -43,9 +48,106 @@ namespace Learun.Application.WebApi | |||||
private RoleIBLL roleIBLL = new RoleBLL(); | private RoleIBLL roleIBLL = new RoleBLL(); | ||||
private StuInfoBasicIBLL stuInfoBasicIBLL = new StuInfoBasicBLL(); | private StuInfoBasicIBLL stuInfoBasicIBLL = new StuInfoBasicBLL(); | ||||
CdMajorIBLL majorIbll = new CdMajorBLL(); | CdMajorIBLL majorIbll = new CdMajorBLL(); | ||||
private readonly ISms aliyunSms = new AliyunSms(); | |||||
private ICache redisCache = CacheFactory.CaChe(); | |||||
/// <summary> | |||||
/// 短信验证码校验 | |||||
/// </summary> | |||||
/// <param name="_"></param> | |||||
/// <returns></returns> | |||||
private Response LoginCodeVerify(dynamic _) | |||||
{ | |||||
MobileVerify mobileVerify = this.GetReqData<MobileVerify>(); | |||||
if (string.IsNullOrEmpty(mobileVerify.codeType)) | |||||
{ | |||||
return Fail("未指定短信类型。"); | |||||
} | |||||
if (string.IsNullOrEmpty(mobileVerify.mobile)) | |||||
{ | |||||
return Fail("手机号不能为空。"); | |||||
} | |||||
var code = redisCache.Read<string>("sendcodeinapp_" + mobileVerify.codeType + "_" + mobileVerify.mobile, CacheId.sms); | |||||
if (!string.IsNullOrEmpty(code) && code == mobileVerify.verifycode) | |||||
{ | |||||
return Success("验证成功。"); | |||||
} | |||||
else | |||||
{ | |||||
return Fail("验证失败,验证码错误或已失效。"); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 发送短信验证码 | |||||
/// </summary> | |||||
/// <param name="_"></param> | |||||
/// <returns></returns> | |||||
private Response Sendcode(dynamic _) | |||||
{ | |||||
LoginModel loginModel = this.GetReqData<LoginModel>(); | |||||
if (string.IsNullOrEmpty(loginModel.codeType)) | |||||
{ | |||||
return Fail("未指定短信类型。"); | |||||
} | |||||
UserEntity userEntity = null; | |||||
userEntity = userIBLL.GetEntityByUserId(userInfo.userId); | |||||
if (userEntity == null) | |||||
{ | |||||
return Fail("用户不存在!"); | |||||
} | |||||
if (loginModel.codeType == "unbindwx") | |||||
{ | |||||
if (string.IsNullOrEmpty(userEntity.F_Mobile)) | |||||
{ | |||||
return Fail("用户手机号不存在!"); | |||||
} | |||||
loginModel.username = userEntity.F_Mobile; | |||||
} | |||||
if (string.IsNullOrEmpty(loginModel.username)) | |||||
{ | |||||
return Fail("手机号不能为空。"); | |||||
} | |||||
if (!CommonHelper.IsValidMobile(loginModel.username)) | |||||
{ | |||||
return Fail("手机号格式不正确!"); | |||||
} | |||||
var listStr = new List<string>(); | |||||
var result = aliyunSms.SendSmsToSingle(loginModel.username, SmsType.LoginBind, listStr); | |||||
if (result.Result.code == "OK") | |||||
{ | |||||
redisCache.Write<string>("sendcodeinapp_" + loginModel.codeType + "_" + loginModel.username, result.Result.randomNum, new TimeSpan(0, 5, 0), CacheId.sms); | |||||
//日志 | |||||
LogEntity logEntity = new LogEntity(); | |||||
logEntity.F_CategoryId = 3; | |||||
logEntity.F_SourceObjectId = loginModel.codeType; | |||||
logEntity.F_OperateTypeId = "sms"; | |||||
logEntity.F_OperateType = "sms"; | |||||
logEntity.F_OperateAccount = "system"; | |||||
logEntity.F_ExecuteResult = 200; | |||||
logEntity.F_ExecuteResultJson = "短信发送成功:" + result.Result.message; | |||||
logEntity.F_Description = "短信发送:" + loginModel.username + " 验证码:" + result.Result.randomNum; | |||||
logEntity.WriteLog(); | |||||
return Success("短信发送成功:" + result.Result.message); | |||||
} | |||||
else | |||||
{ | |||||
LogEntity logEntity = new LogEntity(); | |||||
logEntity.F_CategoryId = 4; | |||||
logEntity.F_SourceObjectId = loginModel.codeType; | |||||
logEntity.F_OperateTypeId = "sms"; | |||||
logEntity.F_OperateType = "sms"; | |||||
logEntity.F_OperateAccount = "system"; | |||||
logEntity.F_ExecuteResult = 400; | |||||
logEntity.F_ExecuteResultJson = "短信发送失败:" + result.Result.message + result.Result.errorType; | |||||
logEntity.F_Description = "短信发送:" + loginModel.username; | |||||
logEntity.WriteLog(); | |||||
return Fail("短信发送失败:" + result.Result.message + result.Result.errorType); | |||||
} | |||||
} | |||||
/// <summary> | /// <summary> | ||||
/// 登录接口 | /// 登录接口 | ||||
/// </summary> | /// </summary> | ||||
@@ -284,6 +386,34 @@ namespace Learun.Application.WebApi | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// 修改手机号 | |||||
/// </summary> | |||||
/// <param name="_"></param> | |||||
/// <returns></returns> | |||||
private Response UpdateMobile(dynamic _) | |||||
{ | |||||
MobileVerify mobileVerify = this.GetReqData<MobileVerify>(); | |||||
if (string.IsNullOrEmpty(mobileVerify.codeType)) | |||||
{ | |||||
return Fail("未指定短信类型。"); | |||||
} | |||||
if (string.IsNullOrEmpty(mobileVerify.mobile)) | |||||
{ | |||||
return Fail("手机号不能为空。"); | |||||
} | |||||
var code = redisCache.Read<string>("sendcodeinapp_" + mobileVerify.codeType + "_" + mobileVerify.mobile, CacheId.sms); | |||||
if (!string.IsNullOrEmpty(code) && code == mobileVerify.verifycode) | |||||
{ | |||||
//return Success("验证成功。"); | |||||
userIBLL.UpdateMobile(userInfo.userId, mobileVerify.mobile); | |||||
return Success("修改成功"); | |||||
} | |||||
else | |||||
{ | |||||
return Fail("验证失败,验证码错误或已失效。"); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 获取所有员工账号列表 | /// 获取所有员工账号列表 | ||||
/// </summary> | /// </summary> | ||||
/// <param name="_"></param> | /// <param name="_"></param> | ||||
@@ -488,12 +618,21 @@ namespace Learun.Application.WebApi | |||||
/// </summary> | /// </summary> | ||||
public string deviceid { get; set; } | public string deviceid { get; set; } | ||||
public string openid { get; set; } | public string openid { get; set; } | ||||
/// <summary> | |||||
/// 发送短信类型:忘记密码forgetpwd,首次登录firstlogin,绑定微信bindwx,解绑微信unbindwx,修改手机号modifymobile,; | |||||
/// </summary> | |||||
public string codeType { get; set; } | |||||
/// <summary> | |||||
/// 短信验证码 | |||||
/// </summary> | |||||
public string verifycode { get; set; } | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// 修改密码 | /// 修改密码 | ||||
/// </summary> | /// </summary> | ||||
public class ModifyModel | public class ModifyModel | ||||
{ | { | ||||
public string phone { set; get; } | |||||
/// <summary> | /// <summary> | ||||
/// 新密码 | /// 新密码 | ||||
/// </summary> | /// </summary> | ||||
@@ -504,6 +643,16 @@ namespace Learun.Application.WebApi | |||||
public string oldpassword { get; set; } | public string oldpassword { get; set; } | ||||
} | } | ||||
public class MobileVerify | |||||
{ | |||||
public string mobile { get; set; } | |||||
public string verifycode { get; set; } | |||||
/// <summary> | |||||
/// 发送短信类型 | |||||
/// </summary> | |||||
public string codeType { get; set; } | |||||
} | |||||
public class UserAccount | public class UserAccount | ||||
{ | { | ||||
@@ -0,0 +1,168 @@ | |||||
using System; | |||||
using Learun.Application.Base.SystemModule; | |||||
using Learun.Application.Organization; | |||||
using Learun.Application.TwoDevelopment.EducationalAdministration; | |||||
using Learun.Util; | |||||
using Learun.Util.Operat; | |||||
using Nancy; | |||||
using System.Collections.Generic; | |||||
using System.Configuration; | |||||
using System.Linq; | |||||
using Learun.Application.TwoDevelopment.LR_Desktop; | |||||
using Learun.Cache.Base; | |||||
using Learun.Cache.Factory; | |||||
using Quanjiang.DigitalScholl.SendSms; | |||||
namespace Learun.Application.WebApi | |||||
{ | |||||
/// <summary> | |||||
/// 版 本 Learun-ADMS V7.0.0 数字化智慧校园 | |||||
/// Copyright (c) 2013-2018 北京泉江科技有限公司 | |||||
/// 创建人:数字化智慧校园-框架开发组 | |||||
/// 日 期:2017.05.12 | |||||
/// 描 述:用户信息 | |||||
/// </summary> | |||||
public class UsernologinApi : BaseNoLoginApi | |||||
{ | |||||
/// <summary> | |||||
/// 注册接口 | |||||
/// </summary> | |||||
public UsernologinApi() | |||||
: base("/learun/adms/usernologin") | |||||
{ | |||||
Post["/logincodeverify"] = LoginCodeVerify; | |||||
Post["/sendcode"] = Sendcode; | |||||
Post["/forgetpass"] = forgetpass; | |||||
} | |||||
private UserIBLL userIBLL = new UserBLL(); | |||||
private PostIBLL postIBLL = new PostBLL(); | |||||
private RoleIBLL roleIBLL = new RoleBLL(); | |||||
private StuInfoBasicIBLL stuInfoBasicIBLL = new StuInfoBasicBLL(); | |||||
private EmpInfoIBLL empInfoIBLL = new EmpInfoBLL(); | |||||
CdMajorIBLL majorIbll = new CdMajorBLL(); | |||||
private readonly ISms aliyunSms = new AliyunSms(); | |||||
private ICache redisCache = CacheFactory.CaChe(); | |||||
private Sys_UpdateRecordIBLL sysUpdateRecordIbll = new Sys_UpdateRecordBLL(); | |||||
AnnexesFileIBLL annexesFileIbll = new AnnexesFileBLL(); | |||||
/// <summary> | |||||
/// 短信验证码校验 | |||||
/// </summary> | |||||
/// <param name="_"></param> | |||||
/// <returns></returns> | |||||
private Response LoginCodeVerify(dynamic _) | |||||
{ | |||||
MobileVerify mobileVerify = this.GetReqData<MobileVerify>(); | |||||
if (string.IsNullOrEmpty(mobileVerify.codeType)) | |||||
{ | |||||
return Fail("未指定短信类型。"); | |||||
} | |||||
if (string.IsNullOrEmpty(mobileVerify.mobile)) | |||||
{ | |||||
return Fail("手机号不能为空。"); | |||||
} | |||||
var code = redisCache.Read<string>("sendcodeinapp_" + mobileVerify.codeType + "_" + mobileVerify.mobile, CacheId.sms); | |||||
if (!string.IsNullOrEmpty(code) && code == mobileVerify.verifycode) | |||||
{ | |||||
return Success("验证成功。"); | |||||
} | |||||
else | |||||
{ | |||||
return Fail("验证失败,验证码错误或已失效。"); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 发送短信验证码 | |||||
/// </summary> | |||||
/// <param name="_"></param> | |||||
/// <returns></returns> | |||||
private Response Sendcode(dynamic _) | |||||
{ | |||||
LoginModel loginModel = this.GetReqData<LoginModel>(); | |||||
if (string.IsNullOrEmpty(loginModel.codeType)) | |||||
{ | |||||
return Fail("未指定短信类型。"); | |||||
} | |||||
UserEntity userEntity = null; | |||||
if (loginModel.codeType == "bindwx") | |||||
{ | |||||
userEntity = userIBLL.GetEntityByAccount(loginModel.username); | |||||
} | |||||
else | |||||
{ | |||||
userEntity = userIBLL.GetEntityByMobile(loginModel.username); | |||||
} | |||||
if (userEntity == null) | |||||
{ | |||||
return Fail("用户不存在!"); | |||||
} | |||||
if (string.IsNullOrEmpty(userEntity.F_Mobile)) | |||||
{ | |||||
return Fail("用户手机号不存在!"); | |||||
} | |||||
if (!CommonHelper.IsValidMobile(userEntity.F_Mobile)) | |||||
{ | |||||
return Fail("手机号格式不正确!"); | |||||
} | |||||
if (loginModel.codeType == "firstlogin" && userEntity.F_HaveLogMark == true) | |||||
{ | |||||
return Fail("当前用户非首次登录,请使用账号密码进行登录!"); | |||||
} | |||||
var listStr = new List<string>(); | |||||
var result = aliyunSms.SendSmsToSingle(userEntity.F_Mobile, SmsType.LoginBind, listStr); | |||||
if (result.Result.code == "OK") | |||||
{ | |||||
redisCache.Write<string>("sendcodeinapp_" + loginModel.codeType + "_" + userEntity.F_Mobile, result.Result.randomNum, new TimeSpan(0, 5, 0), CacheId.sms); | |||||
//日志 | |||||
LogEntity logEntity = new LogEntity(); | |||||
logEntity.F_CategoryId = 3; | |||||
logEntity.F_SourceObjectId = loginModel.codeType; | |||||
logEntity.F_OperateTypeId = "sms"; | |||||
logEntity.F_OperateType = "sms"; | |||||
logEntity.F_OperateAccount = "system"; | |||||
logEntity.F_ExecuteResult = 200; | |||||
logEntity.F_ExecuteResultJson = "短信发送成功:" + result.Result.message; | |||||
logEntity.F_Description = "短信发送:" + userEntity.F_Mobile + " 验证码:" + result.Result.randomNum; | |||||
logEntity.WriteLog(); | |||||
return Success("短信发送成功:" + result.Result.message); | |||||
} | |||||
else | |||||
{ | |||||
LogEntity logEntity = new LogEntity(); | |||||
logEntity.F_CategoryId = 4; | |||||
logEntity.F_SourceObjectId = loginModel.codeType; | |||||
logEntity.F_OperateTypeId = "sms"; | |||||
logEntity.F_OperateType = "sms"; | |||||
logEntity.F_OperateAccount = "system"; | |||||
logEntity.F_ExecuteResult = 400; | |||||
logEntity.F_ExecuteResultJson = "短信发送失败:" + result.Result.message + result.Result.errorType; | |||||
logEntity.F_Description = "短信发送:" + userEntity.F_Mobile; | |||||
logEntity.WriteLog(); | |||||
return Fail("短信发送失败:" + result.Result.message + result.Result.errorType); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 忘记密码:修改密码 | |||||
/// </summary> | |||||
/// <param name="_"></param> | |||||
/// <returns></returns> | |||||
private Response forgetpass(dynamic _) | |||||
{ | |||||
ModifyModel modifyModel = this.GetReqData<ModifyModel>(); | |||||
UserEntity userEntity = userIBLL.GetEntityByMobile(modifyModel.phone); | |||||
if (userEntity == null) | |||||
{ | |||||
return Fail("用户不存在"); | |||||
} | |||||
userIBLL.setPassword(userEntity.F_UserId, modifyModel.newpassword); | |||||
return Success("密码修改成功"); | |||||
} | |||||
} | |||||
} |
@@ -2,6 +2,7 @@ | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using System.Text; | using System.Text; | ||||
using System.Text.RegularExpressions; | |||||
namespace Learun.Util | namespace Learun.Util | ||||
{ | { | ||||
@@ -145,5 +146,19 @@ namespace Learun.Util | |||||
return str; | return str; | ||||
} | } | ||||
#endregion | #endregion | ||||
#region 验证字符串的格式 | |||||
/// <summary> | |||||
/// 是否是手机格式 | |||||
/// </summary> | |||||
/// <param name="mobile"></param> | |||||
/// <returns></returns> | |||||
public static bool IsValidMobile(string mobile) | |||||
{ | |||||
return Regex.IsMatch(mobile, @"^(\+\d{2,3}\-)?\d{11}$"); | |||||
} | |||||
#endregion | |||||
} | } | ||||
} | } |
@@ -66,6 +66,13 @@ | |||||
"disableScroll": true | "disableScroll": true | ||||
} | } | ||||
}, | }, | ||||
{ | |||||
"path": "pages/forgotPassword", | |||||
"style": { | |||||
"navigationBarTitleText": "忘记密码", | |||||
"disableScroll": true | |||||
} | |||||
}, | |||||
// 消息(tabBar #2) | // 消息(tabBar #2) | ||||
{ | { | ||||
@@ -150,6 +157,13 @@ | |||||
"backgroundColor": "#FFFFFF" | "backgroundColor": "#FFFFFF" | ||||
} | } | ||||
}, | }, | ||||
{ | |||||
"path": "pages/my/changePhone", | |||||
"style": { | |||||
"navigationBarTitleText": "修改手机号", | |||||
"backgroundColor": "#FFFFFF" | |||||
} | |||||
}, | |||||
// 统一应用 | // 统一应用 | ||||
{ | { | ||||
"path": "pages/SSO/MyApp/list", | "path": "pages/SSO/MyApp/list", | ||||
@@ -0,0 +1,150 @@ | |||||
<template> | |||||
<view class="page"> | |||||
<view class="content" v-if="type == 'sendCode'"> | |||||
<l-input v-model="phone" placeholder="请输入用户绑定的手机号" left> | |||||
<l-icon slot="title" type="phone" /> | |||||
</l-input> | |||||
<view class="btn" @click="sendCode">发送验证码</view> | |||||
</view> | |||||
<view class="content" v-if="type == 'checkCode'"> | |||||
<l-input v-model="phone" placeholder="请输入用户绑定的手机号" left disabled> | |||||
<l-icon slot="title" type="phone" /> | |||||
</l-input> | |||||
<l-input v-model="verifycode" placeholder="请输入验证码" left password> | |||||
<l-icon slot="title" type="lock" /> | |||||
</l-input> | |||||
<view style="margin-top: 4px;color: color: #606266;"> | |||||
未收到验证码?<text :style="{color:time==0?'#409EFF':'#999'}" @click="()=>{if(time==0)type='sendCode'}">重新发送</text> | |||||
{{time?'( '+time+ 's'+' )' :''}} | |||||
</view> | |||||
<view class="btn" @click="checkverifycode">下一步</view> | |||||
</view> | |||||
<view class="content" v-if="type == 'setPassword'"> | |||||
<l-input v-model="phone" placeholder="请输入用户绑定的手机号" left disabled> | |||||
<l-icon slot="title" type="phone" /> | |||||
</l-input> | |||||
<l-input v-model="form.newpassword" placeholder="请输入新密码" left password> | |||||
<l-icon slot="title" type="lock" /> | |||||
</l-input> | |||||
<l-input v-model="form.newpassword1" placeholder="请再次输入新密码" left password> | |||||
<l-icon slot="title" type="lock" /> | |||||
</l-input> | |||||
<view class="btn" @click="setPassword">确认修改</view> | |||||
</view> | |||||
</view> | |||||
</template> | |||||
<script> | |||||
// import moment from 'moment'; | |||||
export default{ | |||||
data() { | |||||
return { | |||||
type:'sendCode', | |||||
phone:'', | |||||
verifycode:'', | |||||
time: 0, | |||||
timeT: '', | |||||
form:{ | |||||
newpassword:'', | |||||
newpassword1:'', | |||||
}, | |||||
codeType:'forgetpwd', | |||||
} | |||||
}, | |||||
destroyed() { | |||||
this.timeT && clearInterval(this.timeT) | |||||
}, | |||||
methods:{ | |||||
// 发送验证码 | |||||
sendCode(){ | |||||
if(!this.phone){ | |||||
this.TOAST('请输入手机号!') | |||||
return | |||||
}else if(!/^1[0-9]{10}$/.test(this.phone)){ | |||||
this.TOAST('手机号格式不正确!') | |||||
return | |||||
} | |||||
this.LOADING() | |||||
this.HTTP_POST('learun/adms/usernologin/sendcode',{username:this.phone,codeType:this.codeType}).then(res=>{ | |||||
this.HIDE_LOADING() | |||||
if(!res){ | |||||
return | |||||
} | |||||
this.type = 'checkCode' | |||||
this.time = 60 | |||||
this.timeT = setInterval(() => { | |||||
this.time-- | |||||
if (this.time == 0) { | |||||
clearInterval(this.timeT) | |||||
this.timeT = '' | |||||
return | |||||
} | |||||
}, 1000); | |||||
}) | |||||
}, | |||||
// 验证码校验 | |||||
async checkverifycode() { | |||||
if (!this.verifycode) { | |||||
this.TOAST('请输入验证码'); | |||||
return | |||||
} | |||||
this.LOADING('正在校验...') | |||||
let codeResult = await this.HTTP_POST('learun/adms/usernologin/logincodeverify', { | |||||
mobile: this.phone, | |||||
verifycode: this.verifycode, | |||||
codeType: this.codeType | |||||
}) | |||||
this.HIDE_LOADING() | |||||
if(!codeResult)return | |||||
this.type = 'setPassword' | |||||
}, | |||||
// 设置密码 | |||||
async setPassword(){ | |||||
if(!this.form.newpassword){ | |||||
this.TOAST('请输入新密码'); | |||||
return | |||||
} | |||||
if(!/^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*,\.])[0-9a-zA-Z!@#$%^&*,\.]{8,20}$/.test(this.form.newpassword)){ | |||||
this.TOAST('您的密码不满足强度要求,请重新输入'); | |||||
return | |||||
} | |||||
if(!this.form.newpassword1){ | |||||
this.TOAST('请再次输入新密码'); | |||||
return | |||||
} | |||||
if(this.form.newpassword != this.form.newpassword1){ | |||||
this.TOAST('两次密码输入不一致'); | |||||
return | |||||
} | |||||
this.LOADING() | |||||
let res = await this.HTTP_POST('learun/adms/usernologin/forgetpass', { | |||||
newpassword:this.MD5(this.form.newpassword), | |||||
// this.MD5() | |||||
phone:this.phone | |||||
}) | |||||
this.HIDE_LOADING() | |||||
if(!res)return | |||||
this.TOAST('修改成功') | |||||
setTimeout(()=>{ | |||||
this.NAV_TO('/pages/login') | |||||
},500) | |||||
} | |||||
}, | |||||
} | |||||
</script> | |||||
<style scoped> | |||||
.page { | |||||
height: 100vh; | |||||
width: 100%; | |||||
display: flex; | |||||
justify-content: center; | |||||
align-items: center; | |||||
} | |||||
.content{ | |||||
width: 80%; | |||||
padding-bottom: 60px; | |||||
} | |||||
</style> |
@@ -33,7 +33,9 @@ | |||||
</l-input> | </l-input> | ||||
<l-button @click="login(null)" size="lg" color="blue" class="margin-top-sm block" block>登 录</l-button> | <l-button @click="login(null)" size="lg" color="blue" class="margin-top-sm block" block>登 录</l-button> | ||||
<l-button @click="signUp('/pages/wxLogin')" size="lg" color="blue" class="margin-top-sm block" block>微信登录</l-button> | <l-button @click="signUp('/pages/wxLogin')" size="lg" color="blue" class="margin-top-sm block" block>微信登录</l-button> | ||||
<view class="otherLogin"> | |||||
<navigator url="/pages/forgotPassword">忘记密码?</text></navigator> | |||||
</view> | |||||
<!-- 【仅小程序】一键登录按钮 --> | <!-- 【仅小程序】一键登录按钮 --> | ||||
<!-- #ifdef MP --> | <!-- #ifdef MP --> | ||||
<l-button v-if="MPLogin" @click="login(PLATFORM)" size="lg" line="green" class="margin-top-sm block" block> | <l-button v-if="MPLogin" @click="login(PLATFORM)" size="lg" line="green" class="margin-top-sm block" block> | ||||
@@ -279,6 +281,17 @@ page { | |||||
margin-top: 20rpx; | margin-top: 20rpx; | ||||
} | } | ||||
} | } | ||||
.otherLogin{ | |||||
display: flex; | |||||
justify-content: space-between; | |||||
margin-top: 4px; | |||||
color: #2e82ff; | |||||
.textBtn{ | |||||
width: 100px; | |||||
color: #606266; | |||||
} | |||||
} | |||||
.more { | .more { | ||||
margin-top: 30rpx; | margin-top: 30rpx; | ||||
@@ -37,6 +37,10 @@ | |||||
<image src="@/static/unbound.png" mode="" style="color: #0081ff;width: 14px;height: 14px;margin: 0 10px 0 5px;"></image> | <image src="@/static/unbound.png" mode="" style="color: #0081ff;width: 14px;height: 14px;margin: 0 10px 0 5px;"></image> | ||||
解绑微信 | 解绑微信 | ||||
</l-list-item> | </l-list-item> | ||||
<l-list-item @click="goTo('changePhone')" arrow> | |||||
<l-icon type="edit" color="blue" /> | |||||
修改手机号 | |||||
</l-list-item> | |||||
</l-list> | </l-list> | ||||
<!-- 关于菜单 --> | <!-- 关于菜单 --> | ||||
@@ -0,0 +1,121 @@ | |||||
<template> | |||||
<view class="page"> | |||||
<view class="content"> | |||||
<l-input v-model="phone" placeholder="请输入将绑定的手机号" left :disabled="hasSendCode"> | |||||
<l-icon slot="title" type="phone" /> | |||||
</l-input> | |||||
<view class="inputBtn"> | |||||
<l-input v-model="verifycode" placeholder="请输入验证码" left> | |||||
<l-icon slot="title" type="lock" /> | |||||
</l-input> | |||||
<view class="btn" @click="sendCode" v-if="!hasSendCode"> | |||||
发送验证码 | |||||
</view> | |||||
<view class="btn" @click="()=>{time==0&&sendCode()}" v-if="hasSendCode" :style="{opacity:time==0?1:0.5}"> | |||||
<text>重新发送{{time?'( '+time+ 's'+' )' :''}}</text> | |||||
</view> | |||||
</view> | |||||
<view class="btn" style="width: 100%;margin-top: 24px;margin-bottom: 8px;" @click="changePhone">确认更换手机号</view> | |||||
</view> | |||||
</view> | |||||
</template> | |||||
<script> | |||||
export default{ | |||||
data() { | |||||
return { | |||||
hasSendCode:false, | |||||
phone:'', | |||||
verifycode:'', | |||||
time: 0, | |||||
timeT: '', | |||||
codeType:'modifymobile', | |||||
} | |||||
}, | |||||
destroyed() { | |||||
this.timeT && clearInterval(this.timeT) | |||||
}, | |||||
methods:{ | |||||
// 发送验证码 | |||||
sendCode(){ | |||||
if(!this.phone){ | |||||
this.TOAST('请输入手机号!') | |||||
return | |||||
}else if(!/^1[0-9]{10}$/.test(this.phone)){ | |||||
this.TOAST('手机号格式不正确!') | |||||
return | |||||
} | |||||
this.LOADING() | |||||
this.HTTP_POST('learun/adms/user/sendcode',{username:this.phone,codeType:this.codeType}).then(res=>{ | |||||
this.HIDE_LOADING() | |||||
if(!res){ | |||||
return | |||||
} | |||||
this.TOAST('短信已发送!') | |||||
this.hasSendCode = true | |||||
this.time = 60 | |||||
this.timeT = setInterval(() => { | |||||
this.time-- | |||||
if (this.time == 0) { | |||||
this.hasSendCode = false | |||||
clearInterval(this.timeT) | |||||
this.timeT = '' | |||||
return | |||||
} | |||||
}, 1000); | |||||
}) | |||||
}, | |||||
// 验证码校验 | |||||
async changePhone() { | |||||
if(!this.phone){ | |||||
this.TOAST('请输入手机号!') | |||||
return | |||||
}else if(!/^1[0-9]{10}$/.test(this.phone)){ | |||||
this.TOAST('手机号格式不正确!') | |||||
return | |||||
} | |||||
if (!this.verifycode) { | |||||
this.TOAST('请输入验证码'); | |||||
return | |||||
} | |||||
this.LOADING('正在修改...') | |||||
let res = await this.HTTP_POST('learun/adms/user/updateMobile',{ | |||||
mobile: this.phone, | |||||
verifycode: this.verifycode, | |||||
codeType: this.codeType | |||||
}) | |||||
this.HIDE_LOADING() | |||||
if(!res)return | |||||
this.TOAST('修改手机号成功!'); | |||||
setTimeout(()=>{ | |||||
this.NAV_BACK() | |||||
},500) | |||||
}, | |||||
}, | |||||
} | |||||
</script> | |||||
<style scoped> | |||||
.page { | |||||
height: 100vh; | |||||
width: 100%; | |||||
display: flex; | |||||
justify-content: center; | |||||
align-items: center; | |||||
} | |||||
.content{ | |||||
width: 80%; | |||||
padding-bottom: 60px; | |||||
text-align: center; | |||||
} | |||||
.inputBtn{ | |||||
background-color: #fff; | |||||
display: flex; | |||||
align-items: center; | |||||
.btn{ | |||||
margin: 0; | |||||
} | |||||
} | |||||
</style> |