| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- <template>
- <view
- style="height: calc(100vh - env(safe-area-inset-top));width: 100vw;background-color: #fff;padding-top: 120rpx;box-sizing: border-box;">
- <view class="head-image">
- <image src="/static/image/logo1.png" mode="heightFix" />
- </view>
- <view class="input-box">
- <view class="content">
- <picker class="picker" mode="selector" :range="countryCodes" range-key="name" :value="countryCode"
- @change="changeCountryCode">
- {{ countryCode }}
- </picker>
- <input type="number" :value="phonenumber" :focus="focused == 'phonenumber'"
- @input="onInput($event, 'phonenumber')" placeholder="请输入手机号" class="input" />
- </view>
- </view>
- <view class="input-box" style="margin-top:70rpx;">
- <view class="content">
- <input type="number" :value="password" :focus="focused == 'password'"
- @input="onInput($event, 'password')" placeholder="请输入验证码" class="input" />
- <view class="auth-code" @click="getAuthCode">
- {{ downTime == 0 ? '获取验证码' : downTime + "S" }}
- </view>
- </view>
- </view>
- <My-button :customStyle="customStyle" class="my-but" :loading="loading" :disabled="disabled" text="登录"
- @onClick="logIn" />
- <!-- <view class="agreement-box">
- <up-checkbox label="已阅读并同意" name="agree" usedAlone v-model:checked="isAgreement" />
- <view @click="checkTheAgreement" style="color: #3874F6;">
- 《隐私协议》
- </view>
- </view>
- -->
- <up-modal negativeTop="100" asyncClose :show="showModal" confirmColor="#052E5D" showCancelButton
- confirmText="阅读并获取" @confirm="onConfirm1" @cancel="showModal = false">
- <view class="modal-u">请阅读并同意<text style="color: #3874F6;" @click="checkTheAgreement">《隐私协议》</text></view>
- </up-modal>
- <!-- 正式无需使用 -->
- <up-picker title="选择站点" :show="account_list.length != 0" :columns="account_list" keyName="sitename"
- @cancel="onCancel" @confirm='onConfirm' />
- </view>
- </template>
- <script setup>
- import { ref, reactive, getCurrentInstance, computed } from 'vue'
- import { onLoad } from '@dcloudio/uni-app';
- const { $Http } = getCurrentInstance().proxy;
- onLoad(() => {
- const storedPhone = uni.getStorageSync('phonenumber');
- if (storedPhone) {
- phonenumber.value = storedPhone;
- isAgreement.value = true;
- }
- });
- // 登陆按钮相关
- const loading = ref(false);
- const disabled = computed(() => {
- return !(phonenumber.value.length > 0 && password.value.length >= 4);
- });
- const customStyle = ref({
- width: '380rpx',
- margin: '120rpx auto 0',
- });
- // 表单相关
- const focused = ref('');
- const countryCode = ref('+86');
- const phonenumber = ref('');
- const password = ref('');
- const countryCodes = reactive([
- { code: '+86', name: '中国 +86', regex: /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/ }, // 中国手机号验证规则
- { code: '+1', name: '美国 +1', regex: /^[2-9]\d{2}[2-9](?!11)\d{6}$/ }, // 美国手机号验证规则
- { code: '+44', name: '英国 +44', regex: /^7\d{9}$/ }, // 英国手机号验证规则
- ]);
- function onInput(e, name) {
- if (name == 'phonenumber') {
- phonenumber.value = e.detail.value;
- } else if (name == 'password') {
- password.value = e.detail.value;
- }
- }
- function validatephonenumber() {
- const selectedCountry = countryCodes.find(country => country.code === countryCode.value);
- if (!selectedCountry || !selectedCountry.regex.test(phonenumber.value)) {
- uni.showToast({
- title: `请输入有效的${selectedCountry ? selectedCountry.name.split(" ")[0] + '号码' : '手机号'}`,
- icon: 'none',
- });
- focused.value = 'phonenumber'; // 聚焦输入框
- return false;
- }
- return true;
- }
- function changeCountryCode(e) {
- countryCode.value = countryCodes[e.detail.value].code;
- if (phonenumber.value) validatephonenumber();
- }
- // 验证码相关
- let countDown = null;
- const downTime = ref(0); // 倒计时初始值
- function getAuthCode() {
- if (downTime.value > 0) return;
- if (!validatephonenumber()) return;
- $Http.getpassword({ "phonenumber": phonenumber.value, "systemclient": "wechatsaletool" }).then(res => {
- console.log('获取验证码结果:', res);
- if (res.code == 1) {
- downTime.value = 60;
- countDown = setInterval(() => {
- downTime.value--;
- if (downTime.value <= 0) {
- clearInterval(countDown);
- downTime.value = 0;
- }
- }, 1000);
- const code = res.msg.split('手机验证码为:');
- if (code[1]) {
- password.value = code[1].trim(); // 自动填充验证码
- } else {
- focused.value = 'password'; // 聚焦输入框
- }
- } else {
- if (res.msg == '当前手机号未注册!') {
- $Http.base({
- "id": "2025082114174203",
- "content": {
- "name": "用户" + phonenumber.value.slice(-4),
- "phonenumber": phonenumber.value,
- accountprefix: 'MD',// 测试用的楚楚站点 正式要改为美大
- siteid: 'MD',
- }
- }).then(res => {
- console.log("注册结果:", res);
- if (res.code == 1) {
- getAuthCode();
- } else {
- uni.showToast({
- title: res.msg,
- icon: 'none',
- });
- }
- })
- } else {
- uni.showToast({
- title: res.msg,
- icon: 'none',
- });
- }
- }
- })
- }
- // 登录相关
- let account_list = reactive([]);
- function logIn() {
- if (!validatephonenumber()) return;
- // if (isAgreement.value == false) return showModal.value = true;
- loading.value = true;
- $Http.plogin({ "phonenumber": phonenumber.value, "password": hexMD5(password.value), "systemclient": "wechatsaletool" }).then(res => {
- if (res.code == 1) {
- if (res.account_list.length == 1) {
- handleLogin(res.account_list[0]);
- } else {
- account_list = reactive([res.account_list]);
- }
- } else {
- loading.value = false;
- uni.showToast({
- title: res.msg,
- icon: 'none',
- });
- }
- })
- }
- function onCancel() {
- account_list = reactive([]);
- }
- function onConfirm(e) {
- handleLogin(e.value[0]);
- account_list = reactive([]);
- }
- function handleLogin(data) {
- uni.removeStorageSync('userMsg');
- uni.setStorageSync('userMsg', data);
- uni.removeStorageSync('phonenumber');
- uni.setStorageSync('phonenumber', phonenumber.value);
- $Http.isLoad = true;
- if (getCurrentPages().length > 1) {
- uni.navigateBack();
- } else {
- uni.reLaunch({
- url: '/pages/index/index',
- });
- }
- $Http.basic({
- "classname": "webmanage.site.site",
- "method": "querySite_Parameter", //查询站点数据
- content: {
- nocache: true
- }
- }).then(res => {
- if (res.code == 1) {
- uni.removeStorageSync('siteP');
- uni.setStorageSync("siteP", res.data)
- }
- })
- $Http.basic({
- "id": "2025082114391803",
- "content": {
- "phonenumber": phonenumber.value
- }
- }).then(res => {
- console.log('用户档案', res)
- if (res.code == 1) {
- uni.removeStorageSync('userRecord');
- uni.setStorageSync("userRecord", res.data)
- }
- })
- }
- //隐私协议相关
- const isAgreement = ref(false);
- const showModal = ref(false);
- function checkTheAgreement() {
- uni.showLoading({
- title: "加载中...",
- });
- uni.downloadFile({
- url: "https://yossys22170.obs.cn-east-2.myhuaweicloud.com:443/202309261695715892017B6ef5bd76.docx",
- success: (res) => {
- uni.openDocument({
- filePath: res.tempFilePath,
- fileType: "docx",
- success: (s) => {
- uni.hideLoading();
- },
- fail: (err) => {
- console.log("openDocument", err);
- uni.hideLoading();
- uni.showToast({
- title: "读取失败,请稍后再试",
- icon: "none",
- });
- },
- });
- },
- fail: (err) => {
- console.log("downloadFile", err);
- uni.hideLoading();
- uni.showToast({
- title: "读取失败,请稍后再试",
- icon: "none",
- });
- },
- });
- }
- function onConfirm1() {
- showModal.value = false;
- isAgreement.value = true;
- logIn();
- }
- /* 以下为MD5加密 */
- function hexMD5(str) {
- return binl2hex(coreMD5(str2binl(str)))
- }
- function safe_add(x, y) {
- var lsw = (x & 0xFFFF) + (y & 0xFFFF)
- var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
- return (msw << 16) | (lsw & 0xFFFF)
- }
- function rol(num, cnt) {
- return (num << cnt) | (num >>> (32 - cnt))
- }
- function cmn(q, a, b, x, s, t) {
- return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)
- }
- function ff(a, b, c, d, x, s, t) {
- return cmn((b & c) | ((~b) & d), a, b, x, s, t)
- }
- function gg(a, b, c, d, x, s, t) {
- return cmn((b & d) | (c & (~d)), a, b, x, s, t)
- }
- function hh(a, b, c, d, x, s, t) {
- return cmn(b ^ c ^ d, a, b, x, s, t)
- }
- function ii(a, b, c, d, x, s, t) {
- return cmn(c ^ (b | (~d)), a, b, x, s, t)
- }
- function coreMD5(x) {
- var a = 1732584193
- var b = -271733879
- var c = -1732584194
- var d = 271733878
- for (var i = 0; i < x.length; i += 16) {
- var olda = a
- var oldb = b
- var oldc = c
- var oldd = d
- a = ff(a, b, c, d, x[i + 0], 7, -680876936)
- d = ff(d, a, b, c, x[i + 1], 12, -389564586)
- c = ff(c, d, a, b, x[i + 2], 17, 606105819)
- b = ff(b, c, d, a, x[i + 3], 22, -1044525330)
- a = ff(a, b, c, d, x[i + 4], 7, -176418897)
- d = ff(d, a, b, c, x[i + 5], 12, 1200080426)
- c = ff(c, d, a, b, x[i + 6], 17, -1473231341)
- b = ff(b, c, d, a, x[i + 7], 22, -45705983)
- a = ff(a, b, c, d, x[i + 8], 7, 1770035416)
- d = ff(d, a, b, c, x[i + 9], 12, -1958414417)
- c = ff(c, d, a, b, x[i + 10], 17, -42063)
- b = ff(b, c, d, a, x[i + 11], 22, -1990404162)
- a = ff(a, b, c, d, x[i + 12], 7, 1804603682)
- d = ff(d, a, b, c, x[i + 13], 12, -40341101)
- c = ff(c, d, a, b, x[i + 14], 17, -1502002290)
- b = ff(b, c, d, a, x[i + 15], 22, 1236535329)
- a = gg(a, b, c, d, x[i + 1], 5, -165796510)
- d = gg(d, a, b, c, x[i + 6], 9, -1069501632)
- c = gg(c, d, a, b, x[i + 11], 14, 643717713)
- b = gg(b, c, d, a, x[i + 0], 20, -373897302)
- a = gg(a, b, c, d, x[i + 5], 5, -701558691)
- d = gg(d, a, b, c, x[i + 10], 9, 38016083)
- c = gg(c, d, a, b, x[i + 15], 14, -660478335)
- b = gg(b, c, d, a, x[i + 4], 20, -405537848)
- a = gg(a, b, c, d, x[i + 9], 5, 568446438)
- d = gg(d, a, b, c, x[i + 14], 9, -1019803690)
- c = gg(c, d, a, b, x[i + 3], 14, -187363961)
- b = gg(b, c, d, a, x[i + 8], 20, 1163531501)
- a = gg(a, b, c, d, x[i + 13], 5, -1444681467)
- d = gg(d, a, b, c, x[i + 2], 9, -51403784)
- c = gg(c, d, a, b, x[i + 7], 14, 1735328473)
- b = gg(b, c, d, a, x[i + 12], 20, -1926607734)
- a = hh(a, b, c, d, x[i + 5], 4, -378558)
- d = hh(d, a, b, c, x[i + 8], 11, -2022574463)
- c = hh(c, d, a, b, x[i + 11], 16, 1839030562)
- b = hh(b, c, d, a, x[i + 14], 23, -35309556)
- a = hh(a, b, c, d, x[i + 1], 4, -1530992060)
- d = hh(d, a, b, c, x[i + 4], 11, 1272893353)
- c = hh(c, d, a, b, x[i + 7], 16, -155497632)
- b = hh(b, c, d, a, x[i + 10], 23, -1094730640)
- a = hh(a, b, c, d, x[i + 13], 4, 681279174)
- d = hh(d, a, b, c, x[i + 0], 11, -358537222)
- c = hh(c, d, a, b, x[i + 3], 16, -722521979)
- b = hh(b, c, d, a, x[i + 6], 23, 76029189)
- a = hh(a, b, c, d, x[i + 9], 4, -640364487)
- d = hh(d, a, b, c, x[i + 12], 11, -421815835)
- c = hh(c, d, a, b, x[i + 15], 16, 530742520)
- b = hh(b, c, d, a, x[i + 2], 23, -995338651)
- a = ii(a, b, c, d, x[i + 0], 6, -198630844)
- d = ii(d, a, b, c, x[i + 7], 10, 1126891415)
- c = ii(c, d, a, b, x[i + 14], 15, -1416354905)
- b = ii(b, c, d, a, x[i + 5], 21, -57434055)
- a = ii(a, b, c, d, x[i + 12], 6, 1700485571)
- d = ii(d, a, b, c, x[i + 3], 10, -1894986606)
- c = ii(c, d, a, b, x[i + 10], 15, -1051523)
- b = ii(b, c, d, a, x[i + 1], 21, -2054922799)
- a = ii(a, b, c, d, x[i + 8], 6, 1873313359)
- d = ii(d, a, b, c, x[i + 15], 10, -30611744)
- c = ii(c, d, a, b, x[i + 6], 15, -1560198380)
- b = ii(b, c, d, a, x[i + 13], 21, 1309151649)
- a = ii(a, b, c, d, x[i + 4], 6, -145523070)
- d = ii(d, a, b, c, x[i + 11], 10, -1120210379)
- c = ii(c, d, a, b, x[i + 2], 15, 718787259)
- b = ii(b, c, d, a, x[i + 9], 21, -343485551)
- a = safe_add(a, olda)
- b = safe_add(b, oldb)
- c = safe_add(c, oldc)
- d = safe_add(d, oldd)
- }
- return [a, b, c, d]
- }
- function binl2hex(binarray) {
- var hex_tab = "0123456789abcdef"
- var str = ""
- for (var i = 0; i < binarray.length * 4; i++) {
- str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +
- hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF)
- }
- return str
- }
- function str2binl(str) {
- var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks
- var blks = new Array(nblk * 16)
- for (var i = 0; i < nblk * 16; i++) blks[i] = 0
- for (var i = 0; i < str.length; i++)
- blks[i >> 2] |= (str.charCodeAt(i) & 0xFF) << ((i % 4) * 8)
- blks[i >> 2] |= 0x80 << ((i % 4) * 8)
- blks[nblk * 16 - 2] = str.length * 8
- return blks
- }
- </script>
- <style lang="scss" scoped>
- .head-image {
- display: flex;
- justify-content: center;
- height: 148rpx;
- margin-bottom: 120rpx;
- image {
- height: 100%;
- }
- }
- .input-box {
- width: 630rpx;
- padding-bottom: 20rpx;
- margin: 0 auto;
- border-bottom: 1px solid #dcdcdc;
- box-sizing: border-box;
- .content {
- display: flex;
- justify-content: space-between;
- align-items: center;
- height: 48rpx;
- width: 100%;
- .picker {
- font-family: Microsoft YaHei, Microsoft YaHei;
- font-weight: bold;
- font-size: 32rpx;
- color: #333333;
- margin-right: 20rpx;
- }
- .input {
- flex: 1;
- }
- .auth-code {
- margin-left: 20rpx;
- font-family: Microsoft YaHei, Microsoft YaHei;
- font-weight: bold;
- font-size: 28rpx;
- color: #3874F6;
- }
- }
- }
- .my-but {
- width: 380rpx;
- }
- .agreement-box {
- position: fixed;
- bottom: 80rpx;
- width: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- up-checkbox {
- font-family: Microsoft YaHei, Microsoft YaHei;
- font-weight: bold;
- font-size: 28rpx;
- color: #333333;
- }
- }
- </style>
|