浏览代码

增加登录、注册、获取短信验证码、或者图形验证码接口

develop
胡玲 6 个月前
父节点
当前提交
695cf4dc4f
共有 11 个文件被更改,包括 666 次插入72 次删除
  1. +2
    -2
      src/manifest.json
  2. +7
    -0
      src/pages.json
  3. +105
    -2
      src/pages/infoCollection/data.js
  4. +100
    -0
      src/pages/login/agreement/index.vue
  5. +151
    -19
      src/pages/login/forgetPassword/index.vue
  6. +134
    -9
      src/pages/login/index.vue
  7. +111
    -24
      src/pages/login/register/index.vue
  8. +21
    -1
      src/request/api.js
  9. +1
    -1
      src/request/http.js
  10. +14
    -14
      src/setting.js
  11. +20
    -0
      src/utils/utils.js

+ 2
- 2
src/manifest.json 查看文件

@@ -54,7 +54,7 @@
"port" : 8081,
"disableHostCheck" : true,
"proxy" : {
"/mediRecord" : {
"/stdc" : {
"target" : "https://dev.51trust.com",
"changeOrigin" : true,
"secure" : true
@@ -94,7 +94,7 @@
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics": {
"uniStatistics": {
"enable": false
},
"vueVersion" : "3"


+ 7
- 0
src/pages.json 查看文件

@@ -46,6 +46,13 @@
}
},
{
"path": "pages/login/agreement/index",
"style": {
"navigationBarTitleText": "用户服务协议",
"navigationBarBackgroundColor": "#ffffff"
}
},
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "首页"


+ 105
- 2
src/pages/infoCollection/data.js 查看文件

@@ -1,4 +1,107 @@
// 性别
export const genderList = [
{value: 1, label: '男'}, {value: 0, label: '女'}
]
{ label: '男', value: 1 },
{ label: '女', value: 0 },
];

// 专业技术职称
export const professionOptions = [
{ label: '高等学校教师', value: 0 },
{ label: '自然科学研究人员', value: 1 },
{ label: '哲学社会科学研究人员', value: 2 },
{ label: '卫生技术人员', value: 3 },
{ label: '工程技术人员', value: 4 },
{ label: '实验技术人员', value: 5 },
{ label: '文物博物专业人员', value: 6 },
{ label: '技工院校教师', value: 7 },
{ label: '会计人员', value: 8 },
{ label: '统计专业人员', value: 9 },
{ label: '经济专业人员', value: 10 },
{ label: '审计专业人员', value: 11 },
];

// 审核状态
export const approvalStatusOptions = [
{ label: '待审核', value: 0 },
{ label: '初审驳回', value: 1 },
{ label: '复审待审核', value: 2 },
{ label: '复审驳回', value: 3 },
{ label: '审核通过', value: 4 },
{ label: '待补充信息', value: 9 },
];

// 人才库技术类型
export const talentTechnicsOptions = [
{ label: '全部', value: null },
{ label: '基础研究', value: 0 },
{ label: '临床研究', value: 1 },
{ label: '产业应用', value: 2 },
{ label: '财务管理', value: 3 },
{ label: '法律服务', value: 4 },
{ label: '行政管理', value: 5 },
{ label: '其他', value: 7 },
];

// 最高学历
export const highestDegreeOptions = [
{ label: '研究生', value: 0 },
{ label: '本科', value: 1 },
{ label: '大专', value: 2 },
{ label: '中专', value: 3 },
{ label: '高中', value: 4 },
{ label: '其他', value: 5 },
];

// 等级
export const professionLevels = [
{ label: '初级', value: 0 },
{ label: '中级', value: 1 },
{ label: '副高级', value: 2 },
{ label: '高级', value: 3 },
];

// 人才库工作单位类型
export const talentWorkUnitType = [
{ label: '高等学校', value: 0 },
{ label: '研究机构', value: 1 },
{ label: '企业', value: 2 },
{ label: '其他', value: 3 },
];

// 人才库专利类型
export const talentPatentType = [
{ label: '发明专利', value: 0 },
{ label: '实用新型专利', value: 1 },
{ label: '外观设计专利', value: 2 },
];

// 证件类型
export const paperworkType = [
{ label: '身份证', value: 0 },
{ label: '护照', value: 1 },
];

// 学位
export const eduLevelType = [
{ label: '学士', value: 1 },
{ label: '硕士', value: 2 },
{ label: '博士', value: 3 },
{ label: '其他', value: 0 },
];

// 标准类别
export const standardType = [
{ label: '国际', value: 0 },
{ label: '国家', value: 1 },
{ label: '行业', value: 2 },
{ label: '地方', value: 3 },
{ label: '团体', value: 4 },
];

// 制订/修订
export const isFormulateType = [
{ label: '制定', value: 0 },
{ label: '修订', value: 1 },
];



+ 100
- 0
src/pages/login/agreement/index.vue 查看文件

@@ -0,0 +1,100 @@
<template>
<div style="margin: 18rpx">
<h3> 欢迎您来到中国中医药科技发展中心平台(以下简称:中心平台)</h3>
<h4>中国中医药科技发展中心是主要依靠网络技术,通过中心平台向您在线提供信息填报、学习、信息管理等服务。请您在注册和使用中心平台前仔细阅读本协议。如您不同意本协议任何条款,请勿注册账号或使用本平台。</h4>
<h4> 一.注册协议条款的确认和接受</h4>
<ul>
<li>1. 本协议双方为中国中医药科技发展中心旗下的平台(以下亦称“本网站”)和中心平台注册用户。本协议阐述之条款和条件适用于中心平台(所涉域名为: www.****待补充****.com)的全部服务,包括但不限于各种课程视频、信息内容、源代码、相关信息资料及相应服务。</li>
<li>2. 中心平台同意按照本协议的规定及其不定时发布的操作规则提供基于互联网的相关服务(以下称“网络服务”)。为获得网络服务,申请人应当认真阅读、充分理解本《协议》中各条款, 包括免除或者限制本网站责任的免责条款及对用户的权利限制条款。认真阅读并选择接受或不接受本《协议》(未成年人不允许使用本网站)。同意接受本协议的全部条款的,申请人应当按照页面上的提示完成全部的注册程序,并在注册程序过程中点击“同意”按钮,否则视为不接受本《协议》全部条款,申请人应当终止并退出申请。</li>
<li>3. 注册用户在使用中心平台中的有关服务时,应承诺接受并遵守各项相关规则的规定。中心平台有权根据实际运营需要而不定时修改本协议或补充协议,如本协议有任何变更,将通过网站消息或其他方式通知用户。如注册用户不同意相关变更,则应立即终止账号使用,否则即视同用户同意并完全接受修订后的协议版本。经修订的协议一经公布于中心平台网站链接及页面,立即自动生效,亦成为本协议的一部分。注册用户登录且继续使用服务将被视为已接受修订后的协议。除另行声明外,任何扩大的服务范围及新增提供的内容均受本协议约束。</li>
</ul>
<h4>二. 注册用户的权利和义务</h4>
<ul>
<li> 1. 用户在注册时应按照注册提示提供准确的用户名、密码及真实的联系邮箱、手机号码、真实姓名等所要求的个人资料,并及时更新注册(个人/单位)资料,符合及时、详尽、准确的要求,用户(使用人或单位)输入的所有个人信息将被视作用户的准确身份信息。</li>
<li>2. 如果用户提供的资料包含有不正确或不良的信息,本网站保留结束用户使用网络服务资格的权利。</li>
<li>3. 如涉及到在线支付功能/模块,在支付相应费用并经中心平台确认后,注册用户有权通过本人在中心平台的注册的账号享受相应服务。具体服务内容的时间、进度及期限以中心平台的具体服务或产品说明、公告及内容为准。</li>
<li>4. 中心平台的注册账号只为注册用户本人(或本单位)所专有并仅限由其本人(或本单位)自己使用。一个注册账号同一时间,只能在一台终端设备上登录并使用。</li>
<li>5. 未经中心平台许可,不得以任何形式向第三方转让、授权、出售中心平台服务或授权第三方使用注册账号,不得以任何形式通过本站内容进行盈利活动,不得在商业环境下展映、传播本网站相关信息内容。</li>
<li>6. 未经中心平台或其他有权第三方的许可,用户不得对包括视频、信息资料、音频内容等在内的任何内容进行翻录、复制、发行、破解、信息网络传播或其他违反知识产权相关法律、法规的行为,否则所导致的一切民事、行政或刑事责任,由用户自行承担。</li>
<li>7. 对于用户在中心平台中所下载任何标有中心平台所有的资料,注册用户只得根据具体的使用协议进行使用,除非经相应的产品(或知识产权拥有人)使用协议许可,注册用户不得自行或授权他人对平台或其中的任何一部分进行复制、反编译、倒序制造、反汇编、试图推导源代码、破译、修改或创作衍生作品,因此而造成中心平台或任何第三方的损失,由用户承担全部责任。中心平台对上述侵权或违约行为保留追索的权利。</li>
<li>8. 对于注册用户在中心平台提交的问题与笔记,注册用户同意中心平台对此内容享有复制、发行及独家的出版权。</li>
<li>9. 注册用户应对其账号的全部使用行为承担责任,应严格遵守本协议、相关法律法规、账号及服务/产品使用规定。未经中心平台许可,禁止用户向任何第三方提供中心平台中的任何内容或资料。</li>
<li>10. 注册用户应自行配备上网的所需设备,包括个人电脑、调制解调器或其他必备上网装置;用户应自行负担因使用这种接入方式而产生的上网电话费、上网信息费等费用。</li>
<li>11. 中心平台的部分服务附期限,对于此类服务,用户应在服务截止日期前享受服务。因到期服务终止所导致的任何后果,中心平台不承担任何责任。</li>
<li>12. 用户在账号使用过程中不得制作、复制、发布、传播含有下列内容的信息:</li>
<ul style="margin-left: 10px">
<li>(1) 反对宪法所确定的基本原则的;</li>
<li>(2) 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;</li>
<li>(3) 损害国家荣誉和利益的;</li>
<li>(4) 煽动民族仇恨、民族歧视,破坏民族团结的;</li>
<li>(5) 破坏国家宗教政策,宣扬邪教和封建迷信的;</li>
<li>(6) 散布谣言,扰乱社会秩序,破坏社会稳定的;</li>
<li>(7) 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;</li>
<li>(8) 侮辱或者诽谤他人,侵害他人合法权益的;</li>
<li>(9) 干扰或者侵犯中心平台的正常运行和秩序,影响其他用户正常使用的;</li>
<li>(10) 含有法律、行政法规禁止的其他信息内容的。</li>
</ul>
<li>13. 注册用户将自行承担注册账号使用过程中可能发生的风险和损失。</li>
<li>14. 用户对本协议或将来的修改版本有任何异议的,或对产品服务存有异议或不满的,可以通过中心平台电话(010-64176171)向中心平台有关部门进行反映沟通,不得通过煽动、诋毁及通过散布其他不良信息方式进行。</li>
</ul>
<h4>三. 注册用户的违约责任</h4>
<ul>
<li>1. 注册用户如违反本协议第二条第四款、第五款、第六款、第七款的规定,中心平台将视其情况停止注册用户所享有的服务(或账号)2天至60天不等,情况及影响恶劣者,中心平台有权立即终止向其提供服务,并删除其账户信息。</li>
<li>2. 注册用户如违反本协议第二条第十二款规定,中心平台将立即终止向其提供的服务,同时保存有关记录,并向国家有关机关报告。</li>
<li>3. 注册用户如违反本协议约定,应赔偿所造成的中心平台全部经济损失,包括但不限于律师费、公证费、赔偿金及行政处罚金等,并承担其他法律责任。</li>
<li>4. 注册用户因违约而导致对任何第三方的侵权或任何索赔,均应由注册用户独自并完全承担,并且注册用户应赔偿中心平台为此所遭受的全部经济损失。如该等赔偿已由中心平台清付,注册用户应立即全数(含利息)偿还,并且,注册用户应赔偿中心平台为此所遭受的经济及商誉的损失。</li>
</ul>
<h4>四. 中心平台的权利和义务</h4>
<ul>
<li>1. 中心平台有义务通过现有技术维护平台的正常运行,并努力提升和改进服务使用户的平台线上活动得以顺利进行;由于不可抗力所导致服务的中止或终止,中心平台不对因此造成注册用户的任何损失承担责任。</li>
<li>2. 用户在注册及使用中心平台过程中遇到的相关问题,中心平台将力争及时作出反馈。</li>
<li>3. 如因系统维护或升级而需暂停服务时,中心平台应提前告知用户。</li>
<li>4. 中心平台不保证其服务一定能够满足用户的全部要求,也不担保其服务不会因各种客观原因中断。</li>
</ul>
<h4>五. 免责条款</h4>
<ul>
<li>1. 当用户所享有的服务中显示其他第三方网站或内容时,由于中心平台无法控制及审核该网站或内容,因此并不对该网站或内容真实性、有效性、合法性等效力承担责任。对于用户任何因使用或信赖该网站或内容所导致的任何直接或间接损失,中心平台均不承担任何责任。</li>
<li>2. 由于用户将个人注册账号信息告知他人或与他人共享注册帐号的,由此导致的任何风险或损失,中心平台不对此负任何责任。</li>
<li>3. 任何由于黑客攻击、计算机病毒侵入或发作、政府管制、硬件故障、不可抗力等非中心平台故意或严重过失而造成的用户个人资料泄露、丢失、被盗用、被篡改或服务暂定或终止的,对注册用户所造成的风险或损失,中心平台均得免责。</li>
<li>4. 若因线路及非中心平台控制范围外的或其它不可抗力而导致暂停服务暂定或终止,所造成的一切风险与损失,中心平台不负任何责任。</li>
<li>5. 中心平台有权根据用户的实际需求进行服务调整的权利,并有权根据实际情况调整本网站相关内容的定价、服务使用规则等, 由此造成的一切不便与损失,开课吧均得免责。</li>
<li>6. 中心平台有权利删减和维护平台内的相关信息与资料。</li>
</ul>
<h4>六. 隐私条款</h4>
<div>中心平台将严格履行用户个人隐私保密义务,承诺不公开、编辑或透露用户个人信息, 但以下情况除外:</div>
<ul>
<li>1. 经用户授权透露这些信息;</li>
<li>2. 应政府部门、法律及法规要求提供、披露相关用户个人资料;</li>
<li>3. 在特定情况下,为竭力维护用户个人、其他社会个体和公共安全需要。</li>
</ul>
<h4>七. 法律本协议根据现行中华人民共和国法律法规制定并解释。如发生协议条款与中华人民共和国法律法规相抵触时,则抵触内容将按法律规定重新解释,但不影响其它条款的效力。</h4>
<h4>八. 中心平台联系方式</h4>
<ul>
<li>地址:北京市朝阳区幸福一村55号</li>
<li>邮政编码:100027</li>
<li>联系电话:010-64176171</li>
<li>传真:010-64176179</li>
<li>电子邮箱:office@tcm.cn</li>
</ul>
<h4>九. 解释权 上述条款的解释权在法律允许的范围内归中心平台所有。相关参考法律法规:</h4>
<ul>
<li>1.《全国人大常委会关于维护互联网安全的决定》</li>
<li>2.《互联网文化管理暂行规定(2011修订)》</li>
<li>3.《互联网信息服务管理办法》</li>
<li>4.《互联网站禁止传播淫秽、色情等不良信息自律规范》</li>
<li>5.《中华人民共和国侵权责任法》</li>
<li>6.《中华人民共和国合同法》</li>
<li>7.《中华人民共和国著作权法》</li>
<li>8.《中华人民共和国计算机软件保护条例》</li>
<li> 9.《信息网络传播权保护条例》</li>
</ul>
</div>
</template>

<script>

</script>

<style lang="scss" scoped>

</style>

+ 151
- 19
src/pages/login/forgetPassword/index.vue 查看文件

@@ -8,29 +8,44 @@
<u-image width="334rpx" height="52rpx" src="/static/login_rc_logo.png"></u-image>
</view>
</view>
<view class="login_back">
<view class="login_back" v-if="!data.isUpdateSuccess">
<text class="title">重置密码</text>
<view class="input_back">
<u-form :model="form" ref="uFormRef" id="uFormRef" :border-bottom="false">
<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="text" :border="true" border-color="#F6F9FE"
<u-input v-model="form.phone" type="text" :border="true" border-color="#F6F9FE"
class="input_text"
placeholder="请输入您的手机号码"
clearable></u-input>
</u-form-item>
<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="text" :border="true" border-color="#F6F9FE"
class="input_pass"
placeholder="请输入短信验证码"></u-input>
<u-form-item prop="shortNotice" :border-bottom="false">
<u-input v-model="form.shortNotice" type="text" :border="true" border-color="#F6F9FE"
class="input_pass" style="padding-right: 230rpx" maxlength="6"
placeholder="请输入短信验证码">
</u-input>
<view class="code_back">
<u-verification-code
start-text="获取验证码"
change-text="Xs后重新获取"
:seconds="seconds"
ref="uCode"
@start="start"
@end="data.disable = false"
@change="codeChange"></u-verification-code>
<view class="line_back"></view>
<text class="code_text" size="mini" :disabled="data.disable" @click="getCode">{{tips}}
</text>
</view>

</u-form-item>
<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="text" :border="true" border-color="#F6F9FE"
<u-form-item prop="password" :border-bottom="false">
<u-input v-model="form.password" type="password" :border="true" border-color="#F6F9FE"
class="input_pass"
placeholder="请设置新密码"
clearable></u-input>
</u-form-item>
<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="text" :border="true" border-color="#F6F9FE"
<u-form-item prop="passwordAgain" :border-bottom="false">
<u-input v-model="form.passwordAgain" type="password" :border="true" border-color="#F6F9FE"
class="input_pass"
placeholder="请再次输入新密码"
clearable></u-input>
@@ -38,17 +53,17 @@
</u-form>
</view>
<view class="login_back_button">
<u-button class="register_text" shape="circle" type="primary" @click="toSubmit">提交</u-button>
<u-button class="register_text" shape="circle" type="primary" @click="resetPassword">提交</u-button>
<u-button class="login_text" shape="circle" @click="toLogin">登录</u-button>
</view>
</view>
<!-- <view class="submit_back">-->
<!-- <u-image class="icon_back" width="120rpx" height="120rpx" src="/static/password_pass.png"></u-image>-->
<!-- <text class="title_text">密码重置成功</text>-->
<!-- <view class="login_back">-->
<!-- <u-button class="login_text_button" shape="circle" type="primary" @click="toLogin">返回登录</u-button>-->
<!-- </view>-->
<!-- </view>-->
<view class="submit_back" v-if="data.isUpdateSuccess">
<u-image class="icon_back" width="120rpx" height="120rpx" src="/static/password_pass.png"></u-image>
<text class="title_text">密码重置成功</text>
<view class="login_back">
<u-button class="login_text_button" shape="circle" type="primary" @click="toLogin">返回登录</u-button>
</view>
</view>

</view>
</scroll-view>
@@ -57,8 +72,103 @@

<script setup>

const toSubmit =() =>{
import {ref, reactive, computed, watch, toRefs, getCurrentInstance} from 'vue'
import {onReady} from '@dcloudio/uni-app'
import { ShortNotice , AuthResetPassword} from '@/request/api'

// 获取dom
const uFormRef = ref()
const uCode = ref()


const data = reactive({
agreeChecked: false,
disable: false,
isUpdateSuccess: false
})

// 倒计时
const codeInfo = reactive({
seconds: 60,
tips: ''
})
const { seconds, tips } = toRefs(codeInfo)

// 注册
const form = reactive({
phone: '',//账户
shortNotice: '',//验证码
password: '',//密码
passwordAgain: '', //确认密码
type: 2, // type 验证类型0:注册;1:登录;2:重置密码
})

const rules = {
phone: [
{ required: true, message: '请输入手机号', trigger: ['blur', 'change'] },
{
// pattern: /^1[345678]\d{9}$/, message: '请输入11位有效手机号号码', trigger: ['blur', 'change'],
pattern: /^1[23456789][0-9]{9}$/, message: '请输入11位有效手机号号码', trigger: ['blur', 'change'],
},
],
shortNotice: [
{ required: true, message: '请输入验证码', trigger: 'blur' },
{ pattern: /^[0-9]{6}$/, message: '验证码应是数字', trigger: ['blur', 'change'] },
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
// /^(?![0-9]*$)(?![a-zA-Z]*$)[a-zA-Z0-9]{6,20}$/
{ pattern: /^[a-zA-Z0-9]{8,20}$/, message: '密码必须为8-20位字母数字', trigger: ['blur', 'change'] },
],
passwordAgain: [
{ required: true, message: '请输入确认密码', trigger: 'blur' },
{ pattern: /^[a-zA-Z0-9]{8,20}$/, message: '密码必须为8-20位字母数字', trigger: ['blur', 'change'] },
],
}

onReady(() => {
uFormRef.value.setRules(rules)
})

const codeChange = (text) => {
tips.value = text
}

const start = () => {
data.disable = true
}

const getCode = ()=>{
if (uCode.value.canGetCode) {
const reg = /^1[23456789][0-9]{9}$/
if(form.phone.match(reg)){
ShortNotice({ phone: form.phone ,type: form.type }).then((res)=>{
uCode.value.start()
uni.$u.toast('短信已发送,请注意查收!');
})
}else{
uni.$u.toast('请输入11位有效手机号号码');
}
}
}

const resetPassword=()=>{
data.isUpdateSuccess = true
// uFormRef.value.validate(valid => {
// if (valid) {
// console.log('校验通过')
// AuthResetPassword({...form}).then((res) => {
// if (res) {
// uni.$u.toast('重置密码成功');
// data.isUpdateSuccess = true
// }
// }).catch((e) => {
// uni.$u.toast(e.message);
// })
// }else {
// console.log('校验失败')
// }
// })
}

const toLogin =() =>{
@@ -239,5 +349,27 @@
}
}

.code_back {
display: flex;
flex-direction: row;
align-items: center;
position: absolute;
right: 90rpx;
}

.code_text{
color: #2E5AFE;
font-size: 30rpx;
line-height: 42rpx;
font-weight: 400;
}

.line_back {
margin: 30rpx;
height: 30rpx;
background-color: #ACAEB6;
width: 2rpx;
}


</style>

+ 134
- 9
src/pages/login/index.vue 查看文件

@@ -13,31 +13,47 @@
<view class="input_back">
<u-form :model="form" ref="uFormRef" id="uFormRef" :border-bottom="false">
<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="text" :border="true" border-color="#F6F9FE"
<u-input v-model="form.phone" type="text" :border="true" border-color="#F6F9FE"
maxlength="11"
class="input_text"
placeholder="请输入您的登录账号(企业名称)"
clearable></u-input>
</u-form-item>
<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="password" :border="true" border-color="#F6F9FE"
<u-form-item prop="password" :border-bottom="false">
<u-input v-model="form.password" type="password" :border="true" border-color="#F6F9FE"
maxlength="20"
class="input_pass"
placeholder="请输入您的登录密码"
password-icon></u-input>
</u-form-item>
<u-form-item v-if="data.isShowPhotoVerify" prop="photoVerification" :border-bottom="false">
<u-input v-model="form.photoVerification" type="text" :border="true" border-color="#F6F9FE"
maxlength="4"
class="input_pass"
placeholder="图形验证码"
style="padding-right: 230rpx"
password-icon></u-input>
<view class="code_back">
<image style="width: 200rpx;height: 80rpx;background-color: #f7f7f7;margin-top: 10rpx"
@click="getImageVerification"
:src="data.verifyCode.imgBase64"></image>
</view>
</u-form-item>
</u-form>
</view>
<view class="agreement">
<u-checkbox label-size="26rpx" v-model="isSelect" @change="changeCheckbox" size="26rpx"
<u-checkbox label-size="26rpx" v-model="data.agreeChecked"
@change="data.agreeChecked =!data.agreeChecked" size="26rpx"
shape="circle"
icon-size="28rpx" active-color="#0466FC" label="阅读" class="checkBox">已阅读并同意
</u-checkbox>
<text class="privacyAgreement"
@tap="goWebView('https://www.51trust.com/trt/trt-uni-userprivacy.html')">
@tap="goWebView()">
《用户服务协议》
</text>
</view>
<view class="login_back_button">
<u-button class="login_text" shape="circle" type="primary" @click="toInfoPage">登录</u-button>
<u-button class="login_text" shape="circle" type="primary" @click="login">登录</u-button>
<view class="text_back">
<text class="text_button" @tap="toRegister">
立即注册
@@ -72,24 +88,125 @@

<script setup>

const toRegister =() =>{
import {ref, reactive, computed, watch, toRefs, getCurrentInstance} from 'vue'
import {onReady} from '@dcloudio/uni-app'
import {Login, AuthGetImageVerification} from '@/request/api'
import Util from '@/utils/utils';

const phone = ref('')

const {proxy} = getCurrentInstance()
// 获取dom
const uFormRef = ref()

const data = reactive({
isShowPhotoVerify: false,
agreeChecked: false,
count: 0,
verifyCode: {
imgBase64: ''
}
})

// 登录
const form = reactive({
phone: phone,//账户
password: '',//密码
photoVerification: '',//图形验证码
type: 1, // type 验证类型0:注册;1:登录;2:重置密码
})

const rules = {
phone: [
{required: true, message: '请输入手机号', trigger: ['blur', 'change']},
{
pattern: /^1[23456789][0-9]{9}$/, message: '请输入11位有效手机号号码', trigger: ['blur', 'change'],
},
],
password: [
{required: true, message: '请输入您的账户登录密码', trigger: 'blur'},
{pattern: /^[a-zA-Z0-9]{8,20}$/, message: '密码必须为8-20位字母数字', trigger: ['blur', 'change']},
],
photoVerification: [
{required: data.isShowPhotoVerify, message: '请输入图形验证码', trigger: ['blur', 'change']},
{pattern: /^[a-zA-Z0-9]{4}$/, message: '请输入正确图形验证码', trigger: ['blur', 'change']},
],
}


onReady(() => {
uFormRef.value.setRules(rules)
})

const toRegister = () => {
uni.navigateTo({
url: `/pages/login/register/index`
})
}

const toForgetPassword =() =>{
const toForgetPassword = () => {
uni.navigateTo({
url: `/pages/login/forgetPassword/index`
})
}

const toInfoPage =() =>{
//登录
const login = () => {
uFormRef.value.validate(valid => {
if (valid) {
console.log('校验通过')
if (!data.agreeChecked) {
uni.showToast({title: '请阅读并勾选用户协议', icon: 'none'})
return
}
Login({
...form,
}).then(res => {
data.count = 0
uni.showToast({title: '登录成功', icon: 'none'})
toInfoPage()
}).catch(e => {
uni.showToast({title: e.message, icon: 'none'})
if(e && e.code === 412 && e.message === '图片验证码错误'){ //图片验证码错误
getImageVerification()
}
})
} else {
console.log('校验失败')
}
})
}

// 获取图形验证码
const getImageVerification = () => {
// Util.debounce(() => {
// console.log(111,'getImageVerification')
//
// })
AuthGetImageVerification({
phone: form.phone, // 手机号
type: form.type, // 验证类型0:注册;1:登录;2:重置密码
}).then(res => {
form.photoVerification = ''
data.isShowPhotoVerify = true
if(res.data){
data.verifyCode.imgBase64 = res.data
}
})
}

const toInfoPage = () => {
uni.navigateTo({
url: `/pages/infoCollection/index`
})
}

const goWebView = () => {
uni.navigateTo({
url: `/pages/login/agreement/index`
})
}

</script>

<style lang="scss" scoped>
@@ -240,5 +357,13 @@

}

.code_back {
display: flex;
flex-direction: row;
align-items: center;
position: absolute;
right: 90rpx;
}


</style>

+ 111
- 24
src/pages/login/register/index.vue 查看文件

@@ -11,42 +11,42 @@
<view class="login_back">
<text class="title">欢迎登录人才库系统</text>
<view class="input_back">
<u-form :model="data.formData" ref="uFormRef" id="uFormRef" :border-bottom="false">
<u-form :model="form" ref="uFormRef" id="uFormRef" :border-bottom="false">
<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="text" :border="true" border-color="#F6F9FE"
<u-input v-model="form.phone" type="text" :border="true" border-color="#F6F9FE" maxlength="11"
class="input_text"
placeholder="请输入您的手机号码"
clearable></u-input>
</u-form-item>
<u-form-item :border-bottom="false">
<u-input type="text" :border="true" border-color="#F6F9FE"
class="input_pass" style="padding-right: 230rpx"
<u-form-item prop="shortNotice" :border-bottom="false">
<u-input v-model="form.shortNotice" type="text" :border="true" border-color="#F6F9FE"
class="input_pass" style="padding-right: 230rpx" maxlength="6"
placeholder="请输入短信验证码">
</u-input>
<view class="code_back">
<u-verification-code
start-text="获取验证码"
change-text="Xs重新获取"
change-text="Xs重新获取"
:seconds="seconds"
ref="uCode"
@start="start"
@end="end"
@end="data.disable = false"
@change="codeChange"></u-verification-code>
<view class="line_back"></view>
<text class="code_text" size="mini" :disabled="disable" @click="getCode">{{data.tips}}
<text class="code_text" size="mini" :disabled="data.disable" @click="getCode">{{tips}}
</text>
</view>

</u-form-item>

<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="text" :border="true" border-color="#F6F9FE"
<u-form-item prop="password" :border-bottom="false">
<u-input v-model="form.password" type="password" :border="true" border-color="#F6F9FE" maxlength="20"
class="input_pass"
placeholder="请设置密码"
clearable></u-input>
</u-form-item>
<u-form-item prop="phone" :border-bottom="false">
<u-input v-model="value" type="text" :border="true" border-color="#F6F9FE"
<u-form-item prop="passwordAgain" :border-bottom="false">
<u-input v-model="form.passwordAgain" type="password" :border="true" border-color="#F6F9FE" maxlength="20"
class="input_pass"
placeholder="请再次输入密码"
clearable></u-input>
@@ -54,17 +54,18 @@
</u-form>
</view>
<view class="agreement">
<u-checkbox label-size="26rpx" v-model="isSelect" @change="changeCheckbox" size="26rpx"
<u-checkbox label-size="26rpx" v-model="data.agreeChecked"
@change="data.agreeChecked =!data.agreeChecked" size="26rpx"
shape="circle"
icon-size="28rpx" active-color="#0466FC" label="阅读" class="checkBox">已阅读并同意
</u-checkbox>
<text class="privacyAgreement"
@tap="goWebView('https://www.51trust.com/trt/trt-uni-userprivacy.html')">
@tap="goWebView()">
《用户服务协议》
</text>
</view>
<view class="login_back_button">
<u-button class="register_text" shape="circle" type="primary">注册</u-button>
<u-button class="register_text" shape="circle" type="primary" @click="registerAccount">注册</u-button>
<u-button class="login_text" shape="circle" @click="toLogin">登录</u-button>
</view>
</view>
@@ -75,30 +76,116 @@

<script setup>

import {ref, reactive, toRefs} from 'vue';
import {ref, reactive, computed, watch, toRefs, getCurrentInstance} from 'vue'
import {onReady} from '@dcloudio/uni-app'
import { ShortNotice , AuthRegister} from '@/request/api'

// 获取dom
const uFormRef = ref()
const uCode = ref()


const data = reactive({
formData: {},
seconds: 10,
tips: '获取验证码'
agreeChecked: false,
disable: false,
})

const codeChange = () => {
// 倒计时
const codeInfo = reactive({
seconds: 60,
tips: ''
})
const { seconds, tips } = toRefs(codeInfo)

// 注册
const form = reactive({
phone: '',//账户
shortNotice: '',//验证码
password: '',//密码
passwordAgain: '', //确认密码
type: 0, // type 验证类型0:注册;1:登录;2:重置密码
})

const rules = {
phone: [
{ required: true, message: '请输入手机号', trigger: ['blur', 'change'] },
{
// pattern: /^1[345678]\d{9}$/, message: '请输入11位有效手机号号码', trigger: ['blur', 'change'],
pattern: /^1[23456789][0-9]{9}$/, message: '请输入11位有效手机号号码', trigger: ['blur', 'change'],
},
],
shortNotice: [
{ required: true, message: '请输入验证码', trigger: 'blur' },
{ pattern: /^[0-9]{6}$/, message: '验证码应是数字', trigger: ['blur', 'change'] },
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
// /^(?![0-9]*$)(?![a-zA-Z]*$)[a-zA-Z0-9]{6,20}$/
{ pattern: /^[a-zA-Z0-9]{8,20}$/, message: '密码必须为8-20位字母数字', trigger: ['blur', 'change'] },
],
passwordAgain: [
{ required: true, message: '请输入确认密码', trigger: 'blur' },
{ pattern: /^[a-zA-Z0-9]{8,20}$/, message: '密码必须为8-20位字母数字', trigger: ['blur', 'change'] },
],
}

const end = () => {
uni.$u.toast('倒计时结束');
onReady(() => {
uFormRef.value.setRules(rules)
})

const codeChange = (text) => {
tips.value = text
}

const start = () => {
uni.$u.toast('倒计时开始');
data.disable = true
}

const getCode = ()=>{
if (uCode.value.canGetCode) {
const reg = /^1[23456789][0-9]{9}$/
if(form.phone.match(reg)){
ShortNotice({ phone: form.phone ,type: form.type }).then((res)=>{
uCode.value.start()
uni.$u.toast('短信已发送,请注意查收!');
})
}else{
uni.$u.toast('请输入11位有效手机号号码');
}
}
}

const registerAccount=()=>{
uFormRef.value.validate(valid => {
if (valid) {
console.log('校验通过')
if (!data.agreeChecked) {
uni.showToast({title: '请阅读并勾选用户协议', icon: 'none'})
return
}
AuthRegister({...form}).then((res) => {
if (res) {
uni.$u.toast('注册成功');
toLogin()
}
}).catch((e) => {
uni.$u.toast(e.message);
})
}else {
console.log('校验失败')
}
})
}

const toLogin = () => {
uni.navigateTo({
url: `/pages/login/index`
url: `/pages/login/index?phone=${form.phone}`
})
}

const goWebView = () => {
uni.navigateTo({
url: `/pages/login/agreement/index`
})
}



+ 21
- 1
src/request/api.js 查看文件

@@ -1,7 +1,27 @@

import Http from './http'
const baseUrl = '/mediRecord'
// const baseUrl = '/mediRecord'
const baseUrl = '/stdc/api/talentpool'

export const WxRegister = (params) => Http.post(`${baseUrl}/wx/register`, params)

export const ProvinceList = (params) => Http.get(`${baseUrl}/area/provinceList`, params)


// 登录
export const Login = (params) =>
Http.post(`${baseUrl}/auth/loginBypass`, params, { isTocken: false })
// 获取图片验证码
export const AuthGetImageVerification = (params) =>
Http.post(`${baseUrl}/auth/getImageVerification`, params)
// 获取短信验证码
export const ShortNotice = (params) =>
Http.post(`${baseUrl}/auth/getShortNotice`, params)// 获取短信验证码
// 注册
export const AuthRegister = (params) =>
Http.post(`${baseUrl}/auth/register`, params)
// 重置密码
export const AuthResetPassword = (params) =>
Http.post(`${baseUrl}/auth/resetPassword`, params)



+ 1
- 1
src/request/http.js 查看文件

@@ -106,7 +106,7 @@ class Http {
uni.$u.toast(`网络错误,错误码:${res.statusCode}`)
return false
}
if (res.data.status === '0') {
if (res.data.code === 200) {
return res.data
} else if (res.data.status === 201) {
// 假设201为token失效,这里跳转登录


+ 14
- 14
src/setting.js 查看文件

@@ -2,20 +2,20 @@ const baseSeting = {
baseUrl: ''
}
if (process.env.VUE_APP_PLATFORM === 'mp-weixin') {
switch (import.meta.env.MODE) {
case 'dev':
baseSeting.baseUrl = 'https://dev.51trust.com'
break
case 'test':
baseSeting.baseUrl = 'https://beta.51trust.com'
break
case 'pro':
baseSeting.baseUrl = 'https://www.51trust.com'
break
default:
baseSeting.baseUrl = 'https://dev.51trust.com'
break
}
// switch (import.meta.env.MODE) {
// case 'dev':
// baseSeting.baseUrl = 'https://dev.51trust.com'
// break
// case 'test':
// baseSeting.baseUrl = 'https://beta.51trust.com'
// break
// case 'pro':
// baseSeting.baseUrl = 'https://www.51trust.com'
// break
// default:
// baseSeting.baseUrl = 'https://dev.51trust.com'
// break
// }
} else if (process.env.VUE_APP_PLATFORM === 'h5') {
baseSeting.baseUrl = ''
}


+ 20
- 0
src/utils/utils.js 查看文件

@@ -0,0 +1,20 @@
// 防抖
const debounce = (fn, time = 1000) => {
let timeout = null;
return function timeoutFn(event) {
if (timeout) {
clearTimeout(timeout);
}
const show = !timeout;
timeout = setTimeout(() => {
timeout = null;
}, time);
if (show) {
fn.call(this, event);
}
};
};

export default {
debounce,
};

正在加载...
取消
保存