| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730 |
- <template>
- <div class="inner_box">
- <div id="udb_reg_phone_password">
- <div class="udb_phone_code_box">
- <div class="title">
- 注册
- <Back />
- </div>
- <div class="reg_input_box">
- <!-- 账密输入 -->
- <div class="phone_code">
- <div class="phone_code_input">
- <!-- 账号名 -->
- <div class="phone_code_tel" @keyup.enter="checkPassport">
- <i class="red">*</i>
- <div
- v-if="canPassport"
- class="bind_send"
- @click="checkPassport"
- >
- 验证账号
- </div>
- <div v-else class="bind_send gray">验证中</div>
- <input
- class="phone_code_input_captcha"
- placeholder="请输入账号名"
- v-model="passport"
- type="text"
- compositionstart="compositionstartInput"
- @input="passportKeyup"
- />
- </div>
- <!-- 手机号 -->
- <!-- <div class="phone_code_tel">
- <i class="red">*</i>
- <input
- class="phone_code_input_username"
- type="tel"
- maxlength="11"
- placeholder="请输入手机号"
- oninput="value=value.replace(/[^\d]/g,'')"
- v-model="phoneNumber"
- />
- </div> -->
- <!-- 验证码 -->
- <!-- <div class="phone_code_captcha">
- <i class="red">*</i>
- <div
- class="bind_send"
- :class="{ gray: canVerif }"
- @click="sendPhoneNumber"
- >
- {{ verifText }}
- </div>
- <input
- class="phone_code_input_captcha"
- placeholder="请输入验证码"
- v-model="captcha"
- maxlength="4"
- />
- </div> -->
- <!-- 密码 -->
- <div class="reg_password">
- <i class="red">*</i>
- <input
- class="reg_input_password"
- type="password"
- placeholder="请输入密码"
- password="true"
- maxlength="20"
- oninput="value=value.replace(/[\u4E00-\u9FA5]|[\uFE30-\uFFA0]|\s+|[^\w\u4e00-\u9fa5\/\-]|[/|]/ig,'');"
- v-model="password"
- />
- </div>
- <!-- 确认密码 -->
- <div class="reg_password2">
- <i class="red">*</i>
- <input
- class="reg_input_password2"
- type="password"
- placeholder="请再次输入密码"
- password="true"
- maxlength="20"
- oninput="value=value.replace(/[\u4E00-\u9FA5]|[\uFE30-\uFFA0]|\s+|[^\w\u4e00-\u9fa5\/\-]|[/|]/ig,'');"
- v-model="passwordAgin"
- />
- </div>
- </div>
- </div>
- <!-- 阅读协议 -->
- <!-- <div class="reg_phone_protocol">
- <input
- class="reg_phone_protocol_checkbox"
- type="checkbox"
- id="is_phone_read"
- checked
- v-model="ischeckRegPhone"
- />
- <label
- for="is_phone_read"
- :class="{ red: !ischeckRegPhone }"
- class="reg_phone_protocol_text"
- >
- 阅读并同意
- </label>
- <span @click="onAgreement" class="agreement">用户协议</span>
- </div> -->
- <div v-if="canReg" class="bind_phone_true" @click="bindTrue">
- 注册
- </div>
- <div v-else class="bind_phone_true gray">注册中</div>
- <!-- 底部跳其他页面 -->
- <div class="other" @click="onLogin">返回登录</div>
- </div>
- </div>
- </div>
- </div>
- </template>
- <script>
- import { mapState } from "vuex";
- import Back from "@/components/Inner/Back"; // 返回按钮
- export default {
- name: "RegPhonePwd",
- components: {
- Back,
- },
- inject: ["checkCode", "routeLink"],
- data() {
- return {
- passport: "", // 账号名
- phoneNumber: "", // 手机号
- captcha: "", // 验证码
- password: "", // 密码
- passwordAgin: "", // 确认密码
- ischeckRegPhone: true, // 阅读并同意
- verifText: "获取验证码", // 获取验证码按钮文本
- canVerif: false, // 获取验证码按钮是否可以点击
- countDownTimer: null, // 验证码倒计时
- canSms: true, // 是否可以请求验证码接口
- canReg: true, // 是否可以注册
- canPassport: true, // 是否可以验证
- accountList: [], // 账密列表
- accountLocal: [], // 本地存储的账密
- checkPassportInput: false, // 是否校验过账号
- };
- },
- computed: {
- ...mapState(["query"]),
- },
- watch: {},
- created() {},
- mounted() {
- // 初始化操作
- this.init();
- },
- destroyed() {
- clearInterval(this.countDownTimer);
- },
- methods: {
- // ios中文输入
- compositionstartInput() {
- this.passport = "";
- },
- // 账号 输入
- passportKeyup() {
- this.passport = this.passport.replace(
- /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]|\s+|[^\w\u4e00-\u9fa5\/\-]|[/|]/gi,
- ""
- );
- this.checkPassportInput = false;
- },
- // 初始化操作
- init() {
- // 初始化账密列表内容
- this.initAccountList();
- },
- // 验证账号
- checkPassport() {
- const { passport } = this;
- const regpassport = /^[a-zA-Z][a-zA-Z0-9_]{3,31}$/.test(passport);
- if (!regpassport) {
- this.$toast.text("账号需用字母开头, 且长度大于4位");
- return;
- }
- if (passport == "admin" || passport == "root") {
- this.$toast.text("此账号已被注册");
- return;
- }
- this.passportExists();
- },
- // 验证账号
- passportExists() {
- if (!this.canPassport) {
- return;
- }
- this.canPassport = false;
- const { passport } = this;
- this.$api
- .passportExists({
- passport,
- })
- .then((res) => {
- this.checkCode(res);
- this.canPassport = true;
- const { code, data, msg } = res.data;
- // 错误
- if (code) {
- return;
- }
- if (data) {
- this.$toast.text("此账号已被注册");
- return;
- }
- this.checkPassportInput = true;
- this.$toast.text("此账号可用");
- });
- },
- // 获取验证码
- sendPhoneNumber() {
- if (!this.canSms) {
- return;
- }
- const { phoneNumber } = this;
- // 1. 验证手机号格式
- this.canVerif = this.$utils.checkVerification(phoneNumber);
- if (!this.canVerif) {
- this.$toast.text("手机号格式不正确");
- return;
- }
- // 3. 请求接口 发送验证码
- this.$api
- .sendSms({
- mobile: phoneNumber,
- reason: "regist",
- })
- .then((res) => {
- this.checkCode(res);
- const { code, data, msg } = res.data;
- // 错误
- if (code) {
- this.canVerif = false;
- return;
- }
- // 2. 验证码倒计时
- this.countDown();
- });
- },
- // 用户协议
- onAgreement() {},
- // 倒计时
- countDown() {
- this.canSms = false;
- let count = 60;
- this.verifText = count + "s";
- this.countDownTimer = setInterval(() => {
- count--;
- this.verifText = count + "s";
- // 倒计时结束
- if (count === 0) {
- this.canVerif = false;
- this.verifText = "获取验证码";
- this.canSms = true;
- clearInterval(this.countDownTimer);
- }
- }, 1000);
- },
- // 注册
- bindTrue() {
- const {
- phoneNumber,
- captcha,
- password,
- passwordAgin,
- ischeckRegPhone,
- passport,
- checkPassportInput,
- } = this;
- // 0. 校验账号是否为空
- if (!passport) {
- this.$toast.text("账号不能为空");
- return;
- }
- // 是否验证过账号
- if (!checkPassportInput) {
- this.$toast.text("请先验证账号是否可用");
- return;
- }
- // 1. 验证手机号格式
- // const telCheck = this.$utils.checkVerification(phoneNumber);
- // if (!telCheck) {
- // this.$toast.text("手机号格式不准确");
- // return;
- // }
- // 2. 验证验证码是否为空
- // if (!captcha) {
- // this.$toast.text("验证码不能为空");
- // return;
- // }
- // 3. 验证密码
- if (!password) {
- this.$toast.text("密码不能为空");
- return;
- }
- if (password !== passwordAgin) {
- this.$toast.text("两次密码不一致");
- return;
- }
- // 4. 阅读协议
- if (!ischeckRegPhone) {
- this.$toast.text("请阅读与同意协议");
- return;
- }
- // 5. 校验账号
- const regpassport = /^[a-zA-Z][a-zA-Z0-9_]{3,31}$/.test(passport);
- if (!regpassport) {
- this.$toast.text("账号需用字母开头, 且长度大于4位");
- return;
- }
- if (passport == "admin" || passport == "root") {
- this.$toast.text("此账号已被注册");
- return;
- }
- // 是否验证过账号
- if (!checkPassportInput) {
- this.passportExists().then(() => {
- if (this.checkPassportInput) {
- this.onRegister();
- }
- });
- return;
- }
- // 6. 注册
- this.onRegister();
- },
- // 返回登录
- onLogin() {
- this.routeLink("Login");
- },
- // 注册接口
- onRegister() {
- if (!this.canReg) {
- return;
- }
- this.canReg = false;
- const { phoneNumber, captcha, password, passport } = this;
- const promoCode = this.$utils.getQueryString("promoCode");
- const { appid } = this.$CONFIG;
- const registObj = {
- passport,
- // mobile: phoneNumber,
- // smsCode: captcha,
- password,
- promoCode,
- appId: appid,
- };
- this.$api.regist(registObj).then((res) => {
- this.checkCode(res);
- this.canReg = true;
- const { code, msg } = res.data;
- // 错误
- if (code) {
- return;
- }
- this.$toast.text(msg);
- // 记住密码
- this.rememberFun(passport, password);
- // 成功 去登录
- this.onLogin();
- });
- },
- // 初始化账密列表
- initAccountList() {
- // const accountLocal = JSON.parse(localStorage.getItem("jhremember"));
- let accountLocal = this.$utils.readStorage("", "jhremember");
- accountLocal = accountLocal && JSON.parse(accountLocal);
- accountLocal &&
- accountLocal.length &&
- accountLocal.map((ele) => {
- const _account = ele.split("&&")[0];
- const _pwd = ele.split("&&")[1];
- const account = this.$utils.decrypt(_account);
- const pwd = this.$utils.decrypt(_pwd);
- this.accountList.push({
- account,
- pwd,
- });
- });
- },
- // 记住密码
- rememberFun(account, password) {
- this.$utils.rememberFun(account, password);
- },
- },
- };
- </script>
- <style lang="less">
- #udb_reg_phone_password {
- input {
- outline: none;
- }
- .udb_phone_code_box {
- width: 700 / @rem;
- height: 550 / @rem;
- position: absolute;
- top: 50%;
- left: 50%;
- margin-left: -350 / @rem;
- margin-top: -275 / @rem;
- font-size: 32 / @rem;
- background-color: #fff;
- box-sizing: border-box;
- border-radius: 5px;
- overflow: hidden;
- .title {
- height: 100 / @rem;
- line-height: 100 / @rem;
- background-color: #3faeed;
- color: #fff;
- font-size: 36 / @rem;
- }
- .reg_input_box {
- padding: 0 / @rem 30 / @rem;
- .other {
- margin-top: 20 / @rem;
- float: left;
- color: #3faeed;
- font-size: 28 / @rem;
- }
- }
- .reg_phone_protocol_text {
- display: inline-block;
- }
- .red {
- line-height: 70 / @rem;
- color: #e43633;
- float: left;
- }
- .agreement {
- color: #e65c1c;
- border-bottom: 1 / @rem solid #e65c1c;
- margin-left: -2 / @rem;
- }
- .reg_phone_protocol {
- font-size: 32 / @rem;
- margin-top: 20 / @rem;
- }
- .reg_phone_protocol_checkbox {
- vertical-align: middle;
- -webkit-appearance: checkbox;
- }
- .phone_code_input {
- width: 100%;
- margin-top: 25 / @rem;
- }
- .phone_code_tel,
- .phone_code_captcha {
- width: 100%;
- height: 70 / @rem;
- position: relative;
- margin-top: 20 / @rem;
- }
- .phone_code_tel {
- margin-top: 20 / @rem;
- }
- .icon-shouji1,
- .icon-mima {
- width: 50 / @rem;
- height: 70 / @rem;
- line-height: 70 / @rem;
- position: absolute;
- left: 0;
- z-index: 5;
- }
- .phone_code_input_username,
- .phone_code_input_captcha {
- width: 94.5%;
- height: 75 / @rem;
- padding-left: 20 / @rem;
- float: right;
- font-size: 32 / @rem;
- border: 1 / @rem solid #d6d6d6;
- box-sizing: border-box;
- }
- .phone_code_input_captcha {
- width: 60%;
- margin-right: 30 / @rem;
- }
- input::-webkit-input-placeholder {
- color: #888;
- }
- .phone_code_protocol {
- width: 100%;
- font-size: 32 / @rem;
- margin: auto;
- margin-top: 50 / @rem;
- height: 40 / @rem;
- line-height: 40 / @rem;
- }
- .phone_code_protocol_checkbox {
- position: relative;
- top: 2 / @rem;
- }
- .phone_code_protocol_text {
- display: inline-block;
- }
- .phone_code_check,
- .bind_captcha_check {
- font-size: 32 / @rem;
- color: #e43633;
- position: absolute;
- }
- .bind_send {
- width: 30%;
- height: 75 / @rem;
- line-height: 70 / @rem;
- float: right;
- color: #ffffff;
- font-size: 32 / @rem;
- border-radius: 10 / @rem;
- background-color: #3faeed;
- }
- .bind_phone_true {
- width: 80%;
- height: 90 / @rem;
- line-height: 90 / @rem;
- margin: 20 / @rem auto 0;
- border-radius: 15 / @rem;
- background-color: #3faeed;
- color: #ffffff;
- box-sizing: border-box;
- font-size: 32 / @rem;
- }
- .gray {
- background-color: #888;
- }
- .reg_password,
- .reg_password2 {
- width: 100%;
- height: 70 / @rem;
- margin-top: 20 / @rem;
- position: relative;
- }
- .reg_input_password {
- width: 94.5%;
- height: 70 / @rem;
- padding-left: 20 / @rem;
- float: right;
- font-size: 32 / @rem;
- box-sizing: border-box;
- border: 1 / @rem solid #d6d6d6;
- }
- .reg_input_password2 {
- width: 94.5%;
- height: 70 / @rem;
- padding-left: 20 / @rem;
- float: right;
- z-index: 4;
- font-size: 32 / @rem;
- box-sizing: border-box;
- border: 1 / @rem solid #d6d6d6;
- outline: none;
- }
- .icon-mima {
- position: absolute;
- left: 0;
- width: 50 / @rem;
- z-index: 5;
- height: 70 / @rem;
- line-height: 70 / @rem;
- }
- .login_password_check,
- .login_passwordAgin_check {
- font-size: 32 / @rem;
- color: #e43633;
- position: absolute;
- }
- .is_hide_password,
- .is_hide_pwd_agin {
- display: none;
- }
- }
- }
- // 横屏
- @media screen and (orientation: landscape),
- /**竖屏 */ all and (orientation: portrait) and (min-width: 600px) and (min-height: 800px),
- /**ipad */ all and (min-device-aspect-ratio: 3/4) and (max-device-aspect-ratio: 4/3),
- all and (device-aspect-ratio: 4/3) {
- #udb_reg_phone_password {
- .udb_phone_code_box {
- width: 350 / @rem;
- height: 300 / @rem;
- margin-left: -175 / @rem;
- margin-top: -150 / @rem;
- font-size: 16 / @rem;
- overflow-y: auto;
- .title {
- height: 50 / @rem;
- line-height: 50 / @rem;
- font-size: 18 / @rem;
- }
- .reg_input_box {
- padding: 0 / @rem 15 / @rem;
- .other {
- margin-top: 5 / @rem;
- font-size: 14 / @rem;
- }
- }
- .red {
- line-height: 35 / @rem;
- }
- .agreement {
- margin-left: -1 / @rem;
- }
- .reg_phone_protocol {
- font-size: 16 / @rem;
- margin-top: 5 / @rem;
- }
- .phone_code_input {
- margin-top: 15 / @rem;
- }
- .phone_code_tel,
- .phone_code_captcha {
- height: 40 / @rem;
- margin-top: 10 / @rem;
- }
- .phone_code_tel {
- margin-top: 5 / @rem;
- }
- .phone_code_input_username,
- .phone_code_input_captcha {
- height: 40 / @rem;
- padding-left: 10 / @rem;
- font-size: 16 / @rem;
- }
- .phone_code_input_captcha {
- width: 55.15%;
- }
- .phone_code_protocol {
- height: 20 / @rem;
- line-height: 20 / @rem;
- margin-top: 5 / @rem;
- font-size: 16 / @rem;
- }
- .phone_code_protocol_checkbox {
- top: 1 / @rem;
- }
- .phone_code_check,
- .bind_captcha_check {
- font-size: 16 / @rem;
- }
- .bind_send {
- height: 40 / @rem;
- line-height: 40 / @rem;
- font-size: 16 / @rem;
- border-radius: 5 / @rem;
- }
- .bind_phone_true {
- height: 40 / @rem;
- line-height: 40 / @rem;
- margin: 15 / @rem auto 0;
- border-radius: 7 / @rem;
- font-size: 16 / @rem;
- }
- .reg_password,
- .reg_password2 {
- height: 40 / @rem;
- margin-top: 15 / @rem;
- }
- .reg_input_password {
- height: 40 / @rem;
- padding-left: 10 / @rem;
- font-size: 16 / @rem;
- }
- .reg_input_password2 {
- height: 40 / @rem;
- padding-left: 10 / @rem;
- font-size: 16 / @rem;
- }
- .login_password_check,
- .login_passwordAgin_check {
- font-size: 16 / @rem;
- }
- }
- }
- }
- // ipad 横屏
- @media /** 伪竖屏*/all and (orientation: portrait) and (min-width: 600px) and (min-height: 800px),
- /**ipad伪横屏 */ all and (orientation: landscape) and (min-width: 800px) and (min-height: 600px),
- all and (min-device-aspect-ratio: 3/4) and (max-device-aspect-ratio: 4/3),
- all and (device-aspect-ratio: 4/3) {
- #udb_reg_phone_password {
- .udb_phone_code_box {
- height: 300 / @rem;
- }
- }
- }
- </style>
|