|
@@ -0,0 +1,222 @@
|
|
|
+<template>
|
|
|
+ <div class="login">
|
|
|
+ <van-nav-bar style="background: #252828" :title="t('login.name')" />
|
|
|
+ <lang/>
|
|
|
+ <van-form>
|
|
|
+ <van-field
|
|
|
+ v-model="form.type"
|
|
|
+ label-align="top"
|
|
|
+ required
|
|
|
+ :border="false"
|
|
|
+ :label="t('login.type')"
|
|
|
+ @click="showPicker = true"
|
|
|
+ >
|
|
|
+ <template #input>
|
|
|
+ <div class="select">
|
|
|
+ <span>{{ form.type }}</span>
|
|
|
+ <van-icon name="arrow-down" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </van-field>
|
|
|
+ <van-field
|
|
|
+ v-model="form.account"
|
|
|
+ type="text"
|
|
|
+ :label="t('login.account')"
|
|
|
+ :border="false"
|
|
|
+ label-align="top"
|
|
|
+ required
|
|
|
+ :placeholder="t('enter') + t('login.account')"
|
|
|
+ :rules="[{ required: true, message: t('enter') + t('login.account') }]"
|
|
|
+ >
|
|
|
+ </van-field>
|
|
|
+ <van-field
|
|
|
+ v-model="form.password"
|
|
|
+ :type="inputtype"
|
|
|
+ :label="t('login.password')"
|
|
|
+ label-align="top"
|
|
|
+ :border="false"
|
|
|
+ required
|
|
|
+ :placeholder="t('enter') + t('login.password')"
|
|
|
+ :rules="[{ required: true, message: t('enter') + t('login.password') }]"
|
|
|
+ >
|
|
|
+ <template #right-icon>
|
|
|
+ <van-icon
|
|
|
+ @click="showPassword"
|
|
|
+ :name="inputtype == 'text' ? 'eye-o' : 'closed-eye'"
|
|
|
+ />
|
|
|
+ <!-- <van-icon name="closed-eye" /> -->
|
|
|
+ </template>
|
|
|
+ </van-field>
|
|
|
+ <!-- <van-field
|
|
|
+ v-model="detailInfo.coverableCities"
|
|
|
+ type="text"
|
|
|
+ label="四维官网账号"
|
|
|
+ label-align="top"
|
|
|
+ required
|
|
|
+ placeholder="请输入四维官网账号"
|
|
|
+ >
|
|
|
+ </van-field> -->
|
|
|
+ </van-form>
|
|
|
+ <div style="margin: 16px">
|
|
|
+ <van-button
|
|
|
+ round
|
|
|
+ block
|
|
|
+ type="primary"
|
|
|
+ @click="submit"
|
|
|
+ native-type="submit"
|
|
|
+ >
|
|
|
+ {{ t("login.loginBut") }}
|
|
|
+ </van-button>
|
|
|
+ </div>
|
|
|
+ <van-popup v-model:show="showPicker" destroy-on-close position="bottom">
|
|
|
+ <van-picker
|
|
|
+ :columns="columns"
|
|
|
+ :model-value="pickerValue"
|
|
|
+ @confirm="onConfirm"
|
|
|
+ @cancel="showPicker = false"
|
|
|
+ />
|
|
|
+ </van-popup>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { showToast } from "vant";
|
|
|
+import { ref, reactive } from "vue";
|
|
|
+import { useI18n } from "vue-i18n";
|
|
|
+import { useStore } from "../store/user";
|
|
|
+import { login } from "../axios/home";
|
|
|
+import { useRouter } from 'vue-router'
|
|
|
+import { Base64 } from 'js-base64'
|
|
|
+const router = useRouter();
|
|
|
+const { t, locale } = useI18n();
|
|
|
+const userState = useStore();
|
|
|
+const type = ref("password");
|
|
|
+const form = ref({
|
|
|
+ type: "中国服",
|
|
|
+ account: "",
|
|
|
+ password: "",
|
|
|
+});
|
|
|
+const zlLengedTxtOne = ref(t("aa.name"));
|
|
|
+const zlLengedTxtTwo = ref(t("aa.bb"));
|
|
|
+// 可以通过locale切换语言包
|
|
|
+locale.value = "zh"; // 切换为中文
|
|
|
+
|
|
|
+console.log("zlLengedTxtOne", zlLengedTxtOne.value); // 中文显示姓名,英文显示name
|
|
|
+console.log("zlLengedTxtTwo", zlLengedTxtTwo.value); // 中文显示你好,英文显示hello
|
|
|
+const submit = () => {
|
|
|
+ let params = {
|
|
|
+ phoneNum: form.value.account,
|
|
|
+ password: encodeStr(Base64.encode(form.value.password)),
|
|
|
+ randomcode: '1234',
|
|
|
+ rememberMe: false,
|
|
|
+ type: form.value.type,
|
|
|
+ };
|
|
|
+ login(params).then((res) => {
|
|
|
+ if(res.code == 0) {
|
|
|
+ userState.setAccount(form.value.account);
|
|
|
+ // 跳转
|
|
|
+ router.push('/from?account='+ form.value.account)
|
|
|
+ }else {
|
|
|
+ showToast(t(`toast.${res.code}`))
|
|
|
+ }
|
|
|
+ console.log("res", res);
|
|
|
+ })
|
|
|
+};
|
|
|
+const showPicker = ref(false);
|
|
|
+const pickerValue = ref([]);
|
|
|
+const columns = [
|
|
|
+ { text: "中国服", value: "中国服" },
|
|
|
+ { text: "国际服", value: "国际服" },
|
|
|
+];
|
|
|
+
|
|
|
+const onConfirm = ({ selectedValues }) => {
|
|
|
+ console.log("selectedValues", selectedValues);
|
|
|
+ form.value.type = selectedValues.join(",");
|
|
|
+ showPicker.value = false;
|
|
|
+ showToast(form.value.type)
|
|
|
+};
|
|
|
+let result = ref("请选择");
|
|
|
+const inputtype = ref("password");
|
|
|
+const showPassword = () => {
|
|
|
+ inputtype.value = type.value === "password" ? "text" : "password";
|
|
|
+};
|
|
|
+function randomWord (randomFlag, min, max) {
|
|
|
+ let str = ''
|
|
|
+ let range = min
|
|
|
+ let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
|
|
|
+ // 随机产生
|
|
|
+ if (randomFlag) {
|
|
|
+ range = Math.round(Math.random() * (max - min)) + min
|
|
|
+ }
|
|
|
+ for (var i = 0; i < range; i++) {
|
|
|
+ let pos = Math.round(Math.random() * (arr.length - 1))
|
|
|
+ str += arr[pos]
|
|
|
+ }
|
|
|
+ return str
|
|
|
+}
|
|
|
+function encodeStr (str, strv = '') {
|
|
|
+ // 定义常量NUM为2
|
|
|
+ const NUM = 2
|
|
|
+ const front = randomWord(false, 8)
|
|
|
+ const middle = randomWord(false, 8)
|
|
|
+ const end = randomWord(false, 8)
|
|
|
+
|
|
|
+ let str1 = str.substring(0, NUM)
|
|
|
+ let str2 = str.substring(NUM)
|
|
|
+
|
|
|
+ if (strv) {
|
|
|
+ let strv1 = strv.substring(0, NUM)
|
|
|
+ let strv2 = strv.substring(NUM)
|
|
|
+ return [front + str2 + middle + str1 + end, front + strv2 + middle + strv1 + end]
|
|
|
+ }
|
|
|
+
|
|
|
+ return front + str2 + middle + str1 + end
|
|
|
+ }
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less">
|
|
|
+body {
|
|
|
+ font-size: 16px;
|
|
|
+ background-color: #f8f8f8;
|
|
|
+ -webkit-font-smoothing: antialiased;
|
|
|
+}
|
|
|
+
|
|
|
+.goods {
|
|
|
+ padding-bottom: 50px;
|
|
|
+
|
|
|
+ &-swipe {
|
|
|
+ img {
|
|
|
+ width: 100%;
|
|
|
+ display: block;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &-title {
|
|
|
+ font-size: 16px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &-price {
|
|
|
+ color: #f44;
|
|
|
+ }
|
|
|
+
|
|
|
+ &-express {
|
|
|
+ color: #999;
|
|
|
+ font-size: 12px;
|
|
|
+ padding: 5px 15px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &-cell-group {
|
|
|
+ margin: 15px 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ &-tag {
|
|
|
+ margin-left: 5px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.select {
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+</style>
|