+
忘记密码?
+
@if (ViewBag.TeachSwitch)
{
教师注册
diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/Login/ForgotPassword.cshtml b/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/Login/ForgotPassword.cshtml
new file mode 100644
index 000000000..d4b6b682e
--- /dev/null
+++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/Login/ForgotPassword.cshtml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
数字化校园 - 登录页面
+
+
+
+
+ @Html.AppendCssFile("/Views/Login/Default/Index.css")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @Html.AppendJsFile("/Views/Login/ForgotPassword.js")
+
+
\ No newline at end of file
diff --git a/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/Login/ForgotPassword.js b/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/Login/ForgotPassword.js
new file mode 100644
index 000000000..04166d9be
--- /dev/null
+++ b/Learun.Framework.Ultimate V7/Learun.Application.Web/Views/Login/ForgotPassword.js
@@ -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)
\ No newline at end of file
diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj
index 0f8437269..af48bee46 100644
--- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj
+++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Learun.Application.WebApi.csproj
@@ -220,6 +220,7 @@
+
@@ -396,6 +397,10 @@
{1D192591-B85A-41DB-AE3A-4BF9765786C1}
Learun.Workflow.Engine
+
+ {55F0F08D-2A9F-489A-BE1B-2EEAE80687E6}
+ Quanjiang.DigitalScholl.SendSms
+
diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/UserApi.cs b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/UserApi.cs
index 1765b8cde..b669259d4 100644
--- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/UserApi.cs
+++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/UserApi.cs
@@ -1,9 +1,13 @@
using Learun.Application.Base.SystemModule;
using Learun.Application.Organization;
using Learun.Application.TwoDevelopment.EducationalAdministration;
+using Learun.Cache.Base;
+using Learun.Cache.Factory;
using Learun.Util;
using Learun.Util.Operat;
using Nancy;
+using Quanjiang.DigitalScholl.SendSms;
+using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
@@ -30,6 +34,7 @@ namespace Learun.Application.WebApi
Post["/modifypwiden"] = ModifyPasswordiden;
Post["/unbundWeiXin"] = DoUnbundWeiXin;
Post["/loginbyIdCard"] = LoginByIdCard;
+ Post["/updateMobile"] = UpdateMobile;
Get["/info"] = Info;
Get["/map"] = GetMap;
@@ -43,9 +48,106 @@ namespace Learun.Application.WebApi
private RoleIBLL roleIBLL = new RoleBLL();
private StuInfoBasicIBLL stuInfoBasicIBLL = new StuInfoBasicBLL();
CdMajorIBLL majorIbll = new CdMajorBLL();
+ private readonly ISms aliyunSms = new AliyunSms();
+ private ICache redisCache = CacheFactory.CaChe();
+ ///
+ /// 短信验证码校验
+ ///
+ ///
+ ///
+ private Response LoginCodeVerify(dynamic _)
+ {
+ MobileVerify mobileVerify = this.GetReqData();
+ if (string.IsNullOrEmpty(mobileVerify.codeType))
+ {
+ return Fail("未指定短信类型。");
+ }
+ if (string.IsNullOrEmpty(mobileVerify.mobile))
+ {
+ return Fail("手机号不能为空。");
+ }
+ var code = redisCache.Read("sendcodeinapp_" + mobileVerify.codeType + "_" + mobileVerify.mobile, CacheId.sms);
+ if (!string.IsNullOrEmpty(code) && code == mobileVerify.verifycode)
+ {
+ return Success("验证成功。");
+ }
+ else
+ {
+ return Fail("验证失败,验证码错误或已失效。");
+ }
+
+ }
+ ///
+ /// 发送短信验证码
+ ///
+ ///
+ ///
+ private Response Sendcode(dynamic _)
+ {
+ LoginModel loginModel = this.GetReqData();
+ 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();
+ var result = aliyunSms.SendSmsToSingle(loginModel.username, SmsType.LoginBind, listStr);
+ if (result.Result.code == "OK")
+ {
+ redisCache.Write("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);
+ }
+ }
+
///
/// 登录接口
///
@@ -284,6 +386,34 @@ namespace Learun.Application.WebApi
}
///
+ /// 修改手机号
+ ///
+ ///
+ ///
+ private Response UpdateMobile(dynamic _)
+ {
+ MobileVerify mobileVerify = this.GetReqData();
+ if (string.IsNullOrEmpty(mobileVerify.codeType))
+ {
+ return Fail("未指定短信类型。");
+ }
+ if (string.IsNullOrEmpty(mobileVerify.mobile))
+ {
+ return Fail("手机号不能为空。");
+ }
+ var code = redisCache.Read("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("验证失败,验证码错误或已失效。");
+ }
+ }
+ ///
/// 获取所有员工账号列表
///
///
@@ -488,12 +618,21 @@ namespace Learun.Application.WebApi
///
public string deviceid { get; set; }
public string openid { get; set; }
+ ///
+ /// 发送短信类型:忘记密码forgetpwd,首次登录firstlogin,绑定微信bindwx,解绑微信unbindwx,修改手机号modifymobile,;
+ ///
+ public string codeType { get; set; }
+ ///
+ /// 短信验证码
+ ///
+ public string verifycode { get; set; }
}
///
/// 修改密码
///
public class ModifyModel
{
+ public string phone { set; get; }
///
/// 新密码
///
@@ -504,6 +643,16 @@ namespace Learun.Application.WebApi
public string oldpassword { get; set; }
}
+ public class MobileVerify
+ {
+ public string mobile { get; set; }
+ public string verifycode { get; set; }
+ ///
+ /// 发送短信类型
+ ///
+ public string codeType { get; set; }
+ }
+
public class UserAccount
{
diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/UsernologinApi.cs b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/UsernologinApi.cs
new file mode 100644
index 000000000..51e83bfec
--- /dev/null
+++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/UsernologinApi.cs
@@ -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
+{
+ ///
+ /// 版 本 Learun-ADMS V7.0.0 数字化智慧校园
+ /// Copyright (c) 2013-2018 北京泉江科技有限公司
+ /// 创建人:数字化智慧校园-框架开发组
+ /// 日 期:2017.05.12
+ /// 描 述:用户信息
+ ///
+ public class UsernologinApi : BaseNoLoginApi
+ {
+ ///
+ /// 注册接口
+ ///
+ 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();
+
+
+
+ ///
+ /// 短信验证码校验
+ ///
+ ///
+ ///
+ private Response LoginCodeVerify(dynamic _)
+ {
+ MobileVerify mobileVerify = this.GetReqData();
+ if (string.IsNullOrEmpty(mobileVerify.codeType))
+ {
+ return Fail("未指定短信类型。");
+ }
+ if (string.IsNullOrEmpty(mobileVerify.mobile))
+ {
+ return Fail("手机号不能为空。");
+ }
+ var code = redisCache.Read("sendcodeinapp_" + mobileVerify.codeType + "_" + mobileVerify.mobile, CacheId.sms);
+ if (!string.IsNullOrEmpty(code) && code == mobileVerify.verifycode)
+ {
+ return Success("验证成功。");
+ }
+ else
+ {
+ return Fail("验证失败,验证码错误或已失效。");
+ }
+
+ }
+ ///
+ /// 发送短信验证码
+ ///
+ ///
+ ///
+ private Response Sendcode(dynamic _)
+ {
+ LoginModel loginModel = this.GetReqData();
+ 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();
+ var result = aliyunSms.SendSmsToSingle(userEntity.F_Mobile, SmsType.LoginBind, listStr);
+ if (result.Result.code == "OK")
+ {
+ redisCache.Write("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);
+ }
+ }
+ ///
+ /// 忘记密码:修改密码
+ ///
+ ///
+ ///
+ private Response forgetpass(dynamic _)
+ {
+ ModifyModel modifyModel = this.GetReqData();
+
+ UserEntity userEntity = userIBLL.GetEntityByMobile(modifyModel.phone);
+ if (userEntity == null)
+ {
+ return Fail("用户不存在");
+ }
+ userIBLL.setPassword(userEntity.F_UserId, modifyModel.newpassword);
+
+ return Success("密码修改成功");
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Util/Learun.Util/Common/CommonHelper.cs b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Util/Learun.Util/Common/CommonHelper.cs
index 9bf04161c..340f425bf 100644
--- a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Util/Learun.Util/Common/CommonHelper.cs
+++ b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Util/Learun.Util/Common/CommonHelper.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
+using System.Text.RegularExpressions;
namespace Learun.Util
{
@@ -145,5 +146,19 @@ namespace Learun.Util
return str;
}
#endregion
+
+ #region 验证字符串的格式
+
+ ///
+ /// 是否是手机格式
+ ///
+ ///
+ ///
+ public static bool IsValidMobile(string mobile)
+ {
+ return Regex.IsMatch(mobile, @"^(\+\d{2,3}\-)?\d{11}$");
+ }
+
+ #endregion
}
}
diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages.json b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages.json
index 6228baccb..915e80e5e 100644
--- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages.json
+++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages.json
@@ -66,6 +66,13 @@
"disableScroll": true
}
},
+ {
+ "path": "pages/forgotPassword",
+ "style": {
+ "navigationBarTitleText": "忘记密码",
+ "disableScroll": true
+ }
+ },
// 消息(tabBar #2)
{
@@ -150,6 +157,13 @@
"backgroundColor": "#FFFFFF"
}
},
+ {
+ "path": "pages/my/changePhone",
+ "style": {
+ "navigationBarTitleText": "修改手机号",
+ "backgroundColor": "#FFFFFF"
+ }
+ },
// 统一应用
{
"path": "pages/SSO/MyApp/list",
diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/forgotPassword.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/forgotPassword.vue
new file mode 100644
index 000000000..9b9090744
--- /dev/null
+++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/forgotPassword.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+ 发送验证码
+
+
+
+
+
+
+
+
+
+ 未收到验证码?{if(time==0)type='sendCode'}">重新发送
+ {{time?'( '+time+ 's'+' )' :''}}
+
+ 下一步
+
+
+
+
+
+
+
+
+
+
+
+ 确认修改
+
+
+
+
+
+
+
diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue
index cb6ccccfb..2cd9a3239 100644
--- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue
+++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/login.vue
@@ -33,7 +33,9 @@
登 录
微信登录
-
+
+ 忘记密码?
+
@@ -279,6 +281,17 @@ page {
margin-top: 20rpx;
}
}
+
+ .otherLogin{
+ display: flex;
+ justify-content: space-between;
+ margin-top: 4px;
+ color: #2e82ff;
+ .textBtn{
+ width: 100px;
+ color: #606266;
+ }
+ }
.more {
margin-top: 30rpx;
diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my.vue
index cfd6573c3..627b5e362 100644
--- a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my.vue
+++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my.vue
@@ -37,6 +37,10 @@
解绑微信
+
+
+ 修改手机号
+
diff --git a/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/changePhone.vue b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/changePhone.vue
new file mode 100644
index 000000000..5f43d86c9
--- /dev/null
+++ b/Learun.Framework.Ultimate V7/LearunApp-2.2.0/pages/my/changePhone.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+ 发送验证码
+
+ {time==0&&sendCode()}" v-if="hasSendCode" :style="{opacity:time==0?1:0.5}">
+ 重新发送{{time?'( '+time+ 's'+' )' :''}}
+
+
+ 确认更换手机号
+
+
+
+
+
+
+