|
|
@@ -3,9 +3,7 @@
|
|
|
<view class="login-top">
|
|
|
<image class="back-img" src="../../static/login/login-back.png"></image>
|
|
|
<view class="login-text">
|
|
|
- <view class="text">
|
|
|
- {{ $t("login.welcome") }}
|
|
|
- </view>
|
|
|
+ <view class="text"> {{ $t("login.welcome") }}</view>
|
|
|
<view class="text">
|
|
|
{{ $t("app.appName") }}
|
|
|
</view>
|
|
|
@@ -16,8 +14,7 @@
|
|
|
class="login-form"
|
|
|
ref="formRef"
|
|
|
:modelValue="loginData"
|
|
|
- :rules="loginRules"
|
|
|
- >
|
|
|
+ :rules="loginRules">
|
|
|
<uni-forms-item name="username" class="margin-bt">
|
|
|
<!-- type="number" -->
|
|
|
<uni-easyinput
|
|
|
@@ -25,8 +22,7 @@
|
|
|
v-model="loginData.username"
|
|
|
:placeholder="$t('login.enterUsername')"
|
|
|
:placeholderStyle="placeholderStyle"
|
|
|
- :styles="inputStyles"
|
|
|
- />
|
|
|
+ :styles="inputStyles" />
|
|
|
</uni-forms-item>
|
|
|
<uni-forms-item name="password" class="margin-bt">
|
|
|
<uni-easyinput
|
|
|
@@ -34,8 +30,7 @@
|
|
|
v-model="loginData.password"
|
|
|
:placeholder="$t('login.enterPassword')"
|
|
|
:placeholderStyle="placeholderStyle"
|
|
|
- :styles="inputStyles"
|
|
|
- />
|
|
|
+ :styles="inputStyles" />
|
|
|
</uni-forms-item>
|
|
|
</uni-forms>
|
|
|
<button type="primary" @click="formSubmit(formRef)">
|
|
|
@@ -51,45 +46,6 @@
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
|
- <!-- <view class="uni-padding-wrap">
|
|
|
- <!-- <view class="uni-padding-wrap">
|
|
|
- <view>
|
|
|
- <checkbox-group @change="handleChange">
|
|
|
- <label>
|
|
|
- <checkbox :value="true" :checked="isChecked" style="transform: scale(0.6)" />
|
|
|
- </label>
|
|
|
- </checkbox-group>
|
|
|
- </view>
|
|
|
-
|
|
|
- <view class="uni-title">
|
|
|
- 已阅读并同意
|
|
|
- <text style="text-decoration: underline" @click="goPrivacy">《隐私政策》</text>
|
|
|
-
|
|
|
- 和
|
|
|
- <text style="text-decoration: underline" @click="goAgreement">《用户服务协议》</text>
|
|
|
- </view>
|
|
|
-
|
|
|
- <uni-popup ref="privacyRef">
|
|
|
- <scroll-view scroll-y="true" class="privacy" style="height: 500px; border-radius: 20rpx">
|
|
|
- <view style="background-color: #fff; padding: 0 50rpx; border-radius: 20rpx">
|
|
|
- <Privacy />
|
|
|
- </view>
|
|
|
- </scroll-view>
|
|
|
- </uni-popup>
|
|
|
-
|
|
|
- <uni-popup ref="aggRef">
|
|
|
- <scroll-view scroll-y="true" class="privacy" style="height: 500px; border-radius: 20rpx">
|
|
|
- <view style="background-color: #fff; padding: 0 50rpx; border-radius: 20rpx">
|
|
|
- <Agg />
|
|
|
- </view>
|
|
|
- </scroll-view>
|
|
|
- </uni-popup>
|
|
|
- </view> -->
|
|
|
-
|
|
|
- <!-- 引用语言选择组件 -->
|
|
|
- <language-popup ref="languagePopupRef" />
|
|
|
- <upgrade ref="upgradeRef" />
|
|
|
- </view>
|
|
|
<!-- 引用语言选择组件 -->
|
|
|
<language-popup ref="languagePopupRef" />
|
|
|
<upgrade ref="upgradeRef" />
|
|
|
@@ -107,33 +63,20 @@ import {
|
|
|
getInfo,
|
|
|
getTokenByUserId,
|
|
|
} from "@/api/login.js";
|
|
|
-import {
|
|
|
- appLogin,
|
|
|
- dingTalkLogin,
|
|
|
- dingTalkLoginH5,
|
|
|
- getInfo,
|
|
|
- getTokenByUserId,
|
|
|
-} from "@/api/login.js";
|
|
|
// 引入配置文件
|
|
|
import config from "@/utils/config";
|
|
|
-import config from "@/utils/config";
|
|
|
// 引入数据库操作
|
|
|
import { saveUser } from "@/utils/appDb";
|
|
|
-import { saveUser } from "@/utils/appDb";
|
|
|
// 引入本地存储操作
|
|
|
import { setUserId, setToken, setDeptId, setUserInfo } from "@/utils/auth.js";
|
|
|
-import { setUserId, setToken, setDeptId, setUserInfo } from "@/utils/auth.js";
|
|
|
// 引入组件
|
|
|
import Upgrade from "@/components/upgrade.vue";
|
|
|
import LanguagePopup from "@/components/language-popup.vue";
|
|
|
-import Upgrade from "@/components/upgrade.vue";
|
|
|
-import LanguagePopup from "@/components/language-popup.vue";
|
|
|
|
|
|
// 引入钉钉JSAPI -- 仅在H5环境下使用
|
|
|
let dd = null;
|
|
|
// #ifdef H5
|
|
|
import * as dingTalkJsApi from "dingtalk-jsapi";
|
|
|
-import * as dingTalkJsApi from "dingtalk-jsapi";
|
|
|
dd = dingTalkJsApi;
|
|
|
// #endif
|
|
|
|
|
|
@@ -142,47 +85,17 @@ const t = appContext.config.globalProperties.$t;
|
|
|
const languagePopupRef = ref(null);
|
|
|
|
|
|
const openLanguagePopup = () => {
|
|
|
- languagePopupRef.value.open();
|
|
|
- languagePopupRef.value.open();
|
|
|
-};
|
|
|
-
|
|
|
-let isChecked = ref(false);
|
|
|
-let my_value = ref(false);
|
|
|
-
|
|
|
-const handleChange = (val) => {
|
|
|
- my_value.value = val.detail.value[0];
|
|
|
- my_value.value = val.detail.value[0];
|
|
|
+ languagePopupRef.value?.open();
|
|
|
};
|
|
|
|
|
|
-// let privacyRef = ref(null);
|
|
|
-// let aggRef = ref(null);
|
|
|
-
|
|
|
-// const goPrivacy = () => {
|
|
|
-// privacyRef.value.open();
|
|
|
-// };
|
|
|
-
|
|
|
-// const goAgreement = () => {
|
|
|
-// aggRef.value.open();
|
|
|
-// };
|
|
|
-
|
|
|
// 判断当前环境是否在钉钉环境
|
|
|
const isDingTalk = () => {
|
|
|
const ua = window.navigator.userAgent.toLowerCase();
|
|
|
console.log("🚀 ~ 当前环境 ~ ua:", ua);
|
|
|
return ua.includes("dingtalk") || ua.includes("dingtalkwork");
|
|
|
- const ua = window.navigator.userAgent.toLowerCase();
|
|
|
- console.log("🚀 ~ 当前环境 ~ ua:", ua);
|
|
|
- return ua.includes("dingtalk") || ua.includes("dingtalkwork");
|
|
|
};
|
|
|
|
|
|
-const dingTalkAutoLogin = async () => {
|
|
|
- // 判断是否在钉钉环境
|
|
|
- if (!isDingTalk()) {
|
|
|
- console.log("当前环境不是钉钉环境,无法自动登录");
|
|
|
- return;
|
|
|
- }
|
|
|
- // 执行钉钉微应用免登逻辑
|
|
|
- loginWithDingTalkH5();
|
|
|
+const dingTalkAutoLogin = () => {
|
|
|
// 判断是否在钉钉环境
|
|
|
if (!isDingTalk()) {
|
|
|
console.log("当前环境不是钉钉环境,无法自动登录");
|
|
|
@@ -214,39 +127,6 @@ const loginWithDingTalk = async () => {
|
|
|
}
|
|
|
});
|
|
|
// #endif
|
|
|
- // #ifdef APP
|
|
|
- const plugin = uni.requireNativePlugin("DingTalk");
|
|
|
- // 钉钉登录,这里无法使用async,否则java端会报参数错误
|
|
|
- plugin.login((res) => {
|
|
|
- console.log(res);
|
|
|
- if (res.success === 1) {
|
|
|
- dingTalkLogin({
|
|
|
- type: 20,
|
|
|
- code: res.code,
|
|
|
- state: res.state,
|
|
|
- }).then((res) => {
|
|
|
- console.log(res);
|
|
|
- handleLoginSuccess(res);
|
|
|
- });
|
|
|
- } else if (res.success === 2) {
|
|
|
- uni.showToast({ title: t("login.dingTalkError"), icon: "none" });
|
|
|
- console.error("APP端钉钉登录失败:", res);
|
|
|
- }
|
|
|
- });
|
|
|
- // #endif
|
|
|
-
|
|
|
- // #ifdef H5
|
|
|
- if (isDingTalk()) {
|
|
|
- if (!dd) {
|
|
|
- uni.showToast({ title: t("login.dingTalkJsapiMissing"), icon: "none" });
|
|
|
- return;
|
|
|
- }
|
|
|
- loginWithDingTalkH5();
|
|
|
- } else {
|
|
|
- console.log("当前是普通 H5 环境,无法使用钉钉登录");
|
|
|
- uni.showToast({ title: t("login.h5DingTalk"), icon: "none" });
|
|
|
- }
|
|
|
- // #endif
|
|
|
// #ifdef H5
|
|
|
if (isDingTalk()) {
|
|
|
if (!dd) {
|
|
|
@@ -266,10 +146,6 @@ const loginWithDingTalkH5 = async () => {
|
|
|
console.log("🚀 ~ loginWithDingTalkH5 ~ corpId:", corpId);
|
|
|
const clientId = config.default.clientId;
|
|
|
console.log("🚀 ~ loginWithDingTalkH5 ~ clientId:", clientId);
|
|
|
- const corpId = config.default.corpId;
|
|
|
- console.log("🚀 ~ loginWithDingTalkH5 ~ corpId:", corpId);
|
|
|
- const clientId = config.default.clientId;
|
|
|
- console.log("🚀 ~ loginWithDingTalkH5 ~ clientId:", clientId);
|
|
|
|
|
|
if (!corpId || !clientId) {
|
|
|
console.error("缺少必要参数");
|
|
|
@@ -302,37 +178,6 @@ const loginWithDingTalkH5 = async () => {
|
|
|
});
|
|
|
},
|
|
|
});
|
|
|
- if (!corpId || !clientId) {
|
|
|
- console.error("缺少必要参数");
|
|
|
- return;
|
|
|
- }
|
|
|
- dd.requestAuthCode({
|
|
|
- corpId,
|
|
|
- clientId,
|
|
|
- success: async (result) => {
|
|
|
- console.log("🚀 ~ loginWithDingTalkH5 ~ result:", result);
|
|
|
- const { code } = result;
|
|
|
- dingTalkLoginH5({
|
|
|
- type: 10,
|
|
|
- state: new Date().getTime(),
|
|
|
- code: code,
|
|
|
- })
|
|
|
- .then((res) => {
|
|
|
- console.log("🚀 ~ loginWithDingTalkH5 ~ res:", res);
|
|
|
- handleLoginSuccess(res);
|
|
|
- })
|
|
|
- .catch((err) => {
|
|
|
- console.log("🚀 ~ loginWithDingTalkH5 ~ err:", err);
|
|
|
- });
|
|
|
- },
|
|
|
- fail: (err) => {
|
|
|
- console.log("🚀 ~ loginWithDingTalkH5 ~ err:", err);
|
|
|
- uni.showToast({
|
|
|
- title: "获取code失败:" + JSON.stringify(err),
|
|
|
- icon: "none",
|
|
|
- });
|
|
|
- },
|
|
|
- });
|
|
|
};
|
|
|
|
|
|
onLoad(async (options) => {
|
|
|
@@ -340,7 +185,7 @@ onLoad(async (options) => {
|
|
|
"onLoad Login",
|
|
|
uni.getLocale(),
|
|
|
11,
|
|
|
- uni.getStorageSync("language"),
|
|
|
+ uni.getStorageSync("language")
|
|
|
);
|
|
|
|
|
|
console.log(options);
|
|
|
@@ -364,25 +209,6 @@ onLoad(async (options) => {
|
|
|
dingTalkAutoLogin();
|
|
|
}
|
|
|
// #endif
|
|
|
- // 保存钉钉消息传递的参数
|
|
|
- if (options.userId) {
|
|
|
- uni.setStorageSync("dingTalkJson", JSON.stringify(options));
|
|
|
- const isLoggedIn = uni.getStorageSync("userId");
|
|
|
- if (!isLoggedIn) {
|
|
|
- const result = await getTokenByUserId(options.userId);
|
|
|
- await handleLoginSuccess(result);
|
|
|
- }
|
|
|
- }
|
|
|
- // #ifdef H5
|
|
|
- // 当前环境为H5时,判断是否是通过钉钉微应用打开的链接
|
|
|
- // 获取当前Url地址
|
|
|
- const url = window.location.href;
|
|
|
- console.log("当前环境为H5时 当前Url地址:", url);
|
|
|
- // 判断是否是通过钉钉微应用打开的链接
|
|
|
- if (url.includes("/deepoil")) {
|
|
|
- dingTalkAutoLogin();
|
|
|
- }
|
|
|
- // #endif
|
|
|
});
|
|
|
|
|
|
onMounted(() => {
|
|
|
@@ -403,13 +229,10 @@ onMounted(() => {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-const placeholderStyle = ref("color:#797979;font-weight:500;font-size:16px");
|
|
|
const placeholderStyle = ref("color:#797979;font-weight:500;font-size:16px");
|
|
|
const inputStyles = reactive({
|
|
|
backgroundColor: "#F0F3FB",
|
|
|
color: "#797979",
|
|
|
- backgroundColor: "#F0F3FB",
|
|
|
- color: "#797979",
|
|
|
});
|
|
|
const loginData = reactive({
|
|
|
username: "",
|
|
|
@@ -432,169 +255,59 @@ const loginRules = ref({
|
|
|
},
|
|
|
],
|
|
|
},
|
|
|
- username: {
|
|
|
- rules: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- errorMessage: t("login.enterUsername"),
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- password: {
|
|
|
- rules: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- errorMessage: t("login.enterPassword"),
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
});
|
|
|
|
|
|
const formRef = ref();
|
|
|
const formSubmit = async (formEl) => {
|
|
|
- // if (!my_value.value) {
|
|
|
- // uni.showToast({
|
|
|
- // title: '请阅读并同意隐私政策和用户服务协议',
|
|
|
- // icon: 'none', // 可选 success/error/loading/none
|
|
|
- // duration: 2000, // 持续时间,单位ms
|
|
|
- // mask: true // 是否显示透明蒙层,防止触摸穿透
|
|
|
- // });
|
|
|
- // if (!my_value.value) {
|
|
|
- // uni.showToast({
|
|
|
- // title: '请阅读并同意隐私政策和用户服务协议',
|
|
|
- // icon: 'none', // 可选 success/error/loading/none
|
|
|
- // duration: 2000, // 持续时间,单位ms
|
|
|
- // mask: true // 是否显示透明蒙层,防止触摸穿透
|
|
|
- // });
|
|
|
-
|
|
|
- // return;
|
|
|
- // }
|
|
|
- if (!formEl) return;
|
|
|
- await formEl
|
|
|
- .validate()
|
|
|
- .then((res) => {
|
|
|
- appLogin({
|
|
|
- ...loginData,
|
|
|
- // rememberMe: ,
|
|
|
- // tenantName: ""
|
|
|
- })
|
|
|
- .then(async (result) => {
|
|
|
- console.log("result,", result.data);
|
|
|
- if (result) {
|
|
|
- await saveUser({
|
|
|
- name: loginData.username,
|
|
|
- pwd: loginData.password,
|
|
|
- });
|
|
|
- await handleLoginSuccess(result);
|
|
|
- }
|
|
|
- })
|
|
|
- .finally(() => {});
|
|
|
- })
|
|
|
- .catch((err) => {
|
|
|
- console.log("err", err);
|
|
|
- });
|
|
|
- // return;
|
|
|
- // }
|
|
|
if (!formEl) return;
|
|
|
- await formEl
|
|
|
- .validate()
|
|
|
- .then((res) => {
|
|
|
- appLogin({
|
|
|
- ...loginData,
|
|
|
- // rememberMe: ,
|
|
|
- // tenantName: ""
|
|
|
- })
|
|
|
- .then(async (result) => {
|
|
|
- console.log("result,", result.data);
|
|
|
- if (result) {
|
|
|
- await saveUser({
|
|
|
- name: loginData.username,
|
|
|
- pwd: loginData.password,
|
|
|
- });
|
|
|
- await handleLoginSuccess(result);
|
|
|
- }
|
|
|
- })
|
|
|
- .finally(() => {});
|
|
|
- })
|
|
|
- .catch((err) => {
|
|
|
- console.log("err", err);
|
|
|
+
|
|
|
+ try {
|
|
|
+ await formEl.validate();
|
|
|
+ const result = await appLogin({ ...loginData });
|
|
|
+
|
|
|
+ if (!result) return;
|
|
|
+
|
|
|
+ console.log("result,", result.data);
|
|
|
+ await saveUser({
|
|
|
+ name: loginData.username,
|
|
|
+ pwd: loginData.password,
|
|
|
});
|
|
|
+ await handleLoginSuccess(result);
|
|
|
+ } catch (err) {
|
|
|
+ console.log("err", err);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
const handleLoginSuccess = async (result) => {
|
|
|
- if (result) {
|
|
|
- await setUserId(result.data.userId);
|
|
|
- await setToken(result.data);
|
|
|
- await getInfo().then(async (res) => {
|
|
|
- // console.log('useres', res)
|
|
|
- const data = JSON.stringify({
|
|
|
- user: res.data.user,
|
|
|
- roles: res.data.roles,
|
|
|
- });
|
|
|
- // console.log('data', data)
|
|
|
- await setUserInfo(data);
|
|
|
- await setDeptId(res.data.user.deptId);
|
|
|
- if (result) {
|
|
|
- await setUserId(result.data.userId);
|
|
|
- await setToken(result.data);
|
|
|
- await getInfo().then(async (res) => {
|
|
|
- // console.log('useres', res)
|
|
|
- const data = JSON.stringify({
|
|
|
- user: res.data.user,
|
|
|
- roles: res.data.roles,
|
|
|
- });
|
|
|
- // console.log('data', data)
|
|
|
- await setUserInfo(data);
|
|
|
- await setDeptId(res.data.user.deptId);
|
|
|
+ if (!result) return;
|
|
|
|
|
|
- await uni.switchTab({
|
|
|
- url: "/pages/entry/index",
|
|
|
- });
|
|
|
- });
|
|
|
- }
|
|
|
+ await setUserId(result.data.userId);
|
|
|
+ await setToken(result.data);
|
|
|
+
|
|
|
+ const res = await getInfo();
|
|
|
+ const data = JSON.stringify({
|
|
|
+ user: res.data.user,
|
|
|
+ roles: res.data.roles,
|
|
|
+ });
|
|
|
+
|
|
|
+ await setUserInfo(data);
|
|
|
+ await setDeptId(res.data.user.deptId);
|
|
|
+ await uni.switchTab({
|
|
|
+ url: "/pages/entry/index",
|
|
|
+ });
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
-.privacy {
|
|
|
- height: 60vh;
|
|
|
- width: 85vw;
|
|
|
- overflow: hidden;
|
|
|
- height: 60vh;
|
|
|
- width: 85vw;
|
|
|
- overflow: hidden;
|
|
|
-}
|
|
|
-
|
|
|
-.uni-padding-wrap {
|
|
|
- display: flex;
|
|
|
- z-index: 999;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- padding: 0 10rpx;
|
|
|
- display: flex;
|
|
|
- z-index: 999;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- padding: 0 10rpx;
|
|
|
-}
|
|
|
-.uni-title {
|
|
|
- font-size: 12px;
|
|
|
- font-size: 12px;
|
|
|
-}
|
|
|
.login-top {
|
|
|
position: relative;
|
|
|
width: 100%;
|
|
|
height: 422rpx;
|
|
|
- position: relative;
|
|
|
- width: 100%;
|
|
|
- height: 422rpx;
|
|
|
}
|
|
|
|
|
|
.back-img {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
}
|
|
|
|
|
|
.login-text {
|
|
|
@@ -612,20 +325,6 @@ const handleLoginSuccess = async (result) => {
|
|
|
display: flex;
|
|
|
justify-content: center;
|
|
|
flex-direction: column;
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
- box-sizing: border-box;
|
|
|
- position: absolute;
|
|
|
- top: 0;
|
|
|
- left: 0;
|
|
|
- color: #ffffff;
|
|
|
- font-size: 40rpx;
|
|
|
- font-family: "Negreta,PingFang SC";
|
|
|
- font-weight: 600;
|
|
|
- padding: 0 56rpx;
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- flex-direction: column;
|
|
|
|
|
|
.text {
|
|
|
width: 100%;
|