|
|
@@ -1,357 +1,428 @@
|
|
|
-<template>
|
|
|
- <view class="login">
|
|
|
- <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('app.appName') }}
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view class="login-form-wrap">
|
|
|
- <uni-forms class="login-form" ref="formRef" :modelValue="loginData" :rules="loginRules">
|
|
|
- <uni-forms-item name="username" class="margin-bt">
|
|
|
- <!-- type="number" -->
|
|
|
- <uni-easyinput
|
|
|
- class="login-input"
|
|
|
- v-model="loginData.username"
|
|
|
- :placeholder="$t('login.enterUsername')"
|
|
|
- :placeholderStyle="placeholderStyle"
|
|
|
- :styles="inputStyles" />
|
|
|
- </uni-forms-item>
|
|
|
- <uni-forms-item name="password" class="margin-bt">
|
|
|
- <uni-easyinput
|
|
|
- type="password"
|
|
|
- v-model="loginData.password"
|
|
|
- :placeholder="$t('login.enterPassword')"
|
|
|
- :placeholderStyle="placeholderStyle"
|
|
|
- :styles="inputStyles" />
|
|
|
- </uni-forms-item>
|
|
|
- </uni-forms>
|
|
|
- <button type="primary" @click="formSubmit(formRef)">
|
|
|
- {{ $t('login.login') }}
|
|
|
- </button>
|
|
|
- <view class="flex-row align-center justify-between">
|
|
|
- <view class="btn-text" @click="loginWithDingTalk">
|
|
|
- {{ $t('login.loginWithDingTalk') }}
|
|
|
- </view>
|
|
|
- <view class="btn-text" @click="openLanguagePopup">
|
|
|
- {{ $t('login.languageChange') }}
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 引用语言选择组件 -->
|
|
|
- <language-popup ref="languagePopupRef" />
|
|
|
- <upgrade ref="upgradeRef" />
|
|
|
- </view>
|
|
|
-</template>
|
|
|
-
|
|
|
-<script setup>
|
|
|
- import { reactive, ref, onMounted, nextTick, getCurrentInstance } from 'vue';
|
|
|
- import { onLoad } from '@dcloudio/uni-app';
|
|
|
- // 引入接口api
|
|
|
- import { appLogin, dingTalkLogin, dingTalkLoginH5, getInfo, getTokenByUserId } from '@/api/login.js';
|
|
|
- // 引入配置文件
|
|
|
- import config from '@/utils/config';
|
|
|
- // 引入数据库操作
|
|
|
- import { saveUser } from '@/utils/appDb';
|
|
|
- // 引入本地存储操作
|
|
|
- import { setUserId, setToken, setDeptId, setUserInfo } from '@/utils/auth.js';
|
|
|
- // 引入组件
|
|
|
- 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';
|
|
|
- dd = dingTalkJsApi;
|
|
|
- // #endif
|
|
|
-
|
|
|
- const { appContext } = getCurrentInstance();
|
|
|
- const t = appContext.config.globalProperties.$t;
|
|
|
- const languagePopupRef = ref(null);
|
|
|
-
|
|
|
- const openLanguagePopup = () => {
|
|
|
- languagePopupRef.value.open();
|
|
|
- };
|
|
|
-
|
|
|
- // 判断当前环境是否在钉钉环境
|
|
|
- const isDingTalk = () => {
|
|
|
- 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 loginWithDingTalk = async () => {
|
|
|
- // #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
|
|
|
- };
|
|
|
-
|
|
|
- const loginWithDingTalkH5 = async () => {
|
|
|
- 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('缺少必要参数');
|
|
|
- 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 => {
|
|
|
- console.log('onLoad Login', uni.getLocale(), 11, uni.getStorageSync('language'));
|
|
|
-
|
|
|
- console.log(options);
|
|
|
-
|
|
|
- // 保存钉钉消息传递的参数
|
|
|
- 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(() => {
|
|
|
- // console.log("onMounted");
|
|
|
- // 检查是否需要显示语言选择弹窗
|
|
|
- if (!uni.getStorageSync('language')) {
|
|
|
- nextTick(() => {
|
|
|
- openLanguagePopup();
|
|
|
- });
|
|
|
- }
|
|
|
- // 检查是否已登录
|
|
|
- const isLoggedIn = uni.getStorageSync('userId');
|
|
|
- // console.log("isLoggedIn", isLoggedIn);
|
|
|
- if (isLoggedIn) {
|
|
|
- uni.switchTab({
|
|
|
- url: '/pages/home/index',
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- const placeholderStyle = ref('color:#797979;font-weight:500;font-size:16px');
|
|
|
- const inputStyles = reactive({
|
|
|
- backgroundColor: '#F0F3FB',
|
|
|
- color: '#797979',
|
|
|
- });
|
|
|
- const loginData = reactive({
|
|
|
- username: '',
|
|
|
- password: '',
|
|
|
- });
|
|
|
- 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 (!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);
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- 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);
|
|
|
-
|
|
|
- await uni.switchTab({
|
|
|
- url: '/pages/home/index',
|
|
|
- });
|
|
|
- });
|
|
|
- }
|
|
|
- };
|
|
|
-</script>
|
|
|
-
|
|
|
-<style lang="scss" scoped>
|
|
|
- .login-top {
|
|
|
- position: relative;
|
|
|
- width: 100%;
|
|
|
- height: 422rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .back-img {
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
- }
|
|
|
-
|
|
|
- .login-text {
|
|
|
- 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%;
|
|
|
- margin-bottom: 6rpx;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .margin-bt {
|
|
|
- margin-bottom: 25px;
|
|
|
- }
|
|
|
-
|
|
|
- .login-form-wrap {
|
|
|
- padding: 60rpx;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.uni-easyinput__content-input) {
|
|
|
- height: 45px;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.uni-input-input) {
|
|
|
- color: #999999 !important;
|
|
|
- }
|
|
|
-
|
|
|
- uni-button[type='primary'] {
|
|
|
- background: #004098;
|
|
|
- }
|
|
|
-
|
|
|
- .btn-text {
|
|
|
- color: #004098;
|
|
|
- margin-top: 20px;
|
|
|
- font-size: 14px;
|
|
|
- font-weight: 500;
|
|
|
- }
|
|
|
-</style>
|
|
|
+<template>
|
|
|
+ <view class="login">
|
|
|
+ <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('app.appName') }}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="login-form-wrap">
|
|
|
+ <uni-forms class="login-form" ref="formRef" :modelValue="loginData" :rules="loginRules">
|
|
|
+ <uni-forms-item name="username" class="margin-bt">
|
|
|
+ <!-- type="number" -->
|
|
|
+ <uni-easyinput class="login-input" v-model="loginData.username" :placeholder="$t('login.enterUsername')" :placeholderStyle="placeholderStyle" :styles="inputStyles" />
|
|
|
+ </uni-forms-item>
|
|
|
+ <uni-forms-item name="password" class="margin-bt">
|
|
|
+ <uni-easyinput type="password" v-model="loginData.password" :placeholder="$t('login.enterPassword')" :placeholderStyle="placeholderStyle" :styles="inputStyles" />
|
|
|
+ </uni-forms-item>
|
|
|
+ </uni-forms>
|
|
|
+ <button type="primary" @click="formSubmit(formRef)">
|
|
|
+ {{ $t('login.login') }}
|
|
|
+ </button>
|
|
|
+ <view class="flex-row align-center justify-between">
|
|
|
+ <view class="btn-text" @click="loginWithDingTalk">
|
|
|
+ {{ $t('login.loginWithDingTalk') }}
|
|
|
+ </view>
|
|
|
+ <view class="btn-text" @click="openLanguagePopup">
|
|
|
+ {{ $t('login.languageChange') }}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <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>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { reactive, ref, onMounted, nextTick, getCurrentInstance } from 'vue';
|
|
|
+import { onLoad } from '@dcloudio/uni-app';
|
|
|
+// 引入接口api
|
|
|
+import { appLogin, dingTalkLogin, dingTalkLoginH5, getInfo, getTokenByUserId } from '@/api/login.js';
|
|
|
+// 引入配置文件
|
|
|
+import config from '@/utils/config';
|
|
|
+// 引入数据库操作
|
|
|
+import { saveUser } from '@/utils/appDb';
|
|
|
+// 引入本地存储操作
|
|
|
+import { setUserId, setToken, setDeptId, setUserInfo } from '@/utils/auth.js';
|
|
|
+// 引入组件
|
|
|
+import Upgrade from '@/components/upgrade.vue';
|
|
|
+import LanguagePopup from '@/components/language-popup.vue';
|
|
|
+import Privacy from './privacy.vue';
|
|
|
+import Agg from './agreement.vue';
|
|
|
+
|
|
|
+// 引入钉钉JSAPI -- 仅在H5环境下使用
|
|
|
+let dd = null;
|
|
|
+// #ifdef H5
|
|
|
+import * as dingTalkJsApi from 'dingtalk-jsapi';
|
|
|
+dd = dingTalkJsApi;
|
|
|
+// #endif
|
|
|
+
|
|
|
+const { appContext } = getCurrentInstance();
|
|
|
+const t = appContext.config.globalProperties.$t;
|
|
|
+const languagePopupRef = ref(null);
|
|
|
+
|
|
|
+const openLanguagePopup = () => {
|
|
|
+ languagePopupRef.value.open();
|
|
|
+};
|
|
|
+
|
|
|
+let isChecked = ref(false);
|
|
|
+let my_value = ref(false);
|
|
|
+
|
|
|
+const handleChange = (val) => {
|
|
|
+ my_value.value = val.detail.value[0];
|
|
|
+};
|
|
|
+
|
|
|
+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 dingTalkAutoLogin = async () => {
|
|
|
+ // 判断是否在钉钉环境
|
|
|
+ if (!isDingTalk()) {
|
|
|
+ console.log('当前环境不是钉钉环境,无法自动登录');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 执行钉钉微应用免登逻辑
|
|
|
+ loginWithDingTalkH5();
|
|
|
+};
|
|
|
+
|
|
|
+// 钉钉登录
|
|
|
+const loginWithDingTalk = async () => {
|
|
|
+ // #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
|
|
|
+};
|
|
|
+
|
|
|
+const loginWithDingTalkH5 = async () => {
|
|
|
+ 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('缺少必要参数');
|
|
|
+ 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) => {
|
|
|
+ console.log('onLoad Login', uni.getLocale(), 11, uni.getStorageSync('language'));
|
|
|
+
|
|
|
+ console.log(options);
|
|
|
+
|
|
|
+ // 保存钉钉消息传递的参数
|
|
|
+ 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(() => {
|
|
|
+ // console.log("onMounted");
|
|
|
+ // 检查是否需要显示语言选择弹窗
|
|
|
+ if (!uni.getStorageSync('language')) {
|
|
|
+ nextTick(() => {
|
|
|
+ openLanguagePopup();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 检查是否已登录
|
|
|
+ const isLoggedIn = uni.getStorageSync('userId');
|
|
|
+ // console.log("isLoggedIn", isLoggedIn);
|
|
|
+ if (isLoggedIn) {
|
|
|
+ uni.switchTab({
|
|
|
+ url: '/pages/home/index'
|
|
|
+ });
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+const placeholderStyle = ref('color:#797979;font-weight:500;font-size:16px');
|
|
|
+const inputStyles = reactive({
|
|
|
+ backgroundColor: '#F0F3FB',
|
|
|
+ color: '#797979'
|
|
|
+});
|
|
|
+const loginData = reactive({
|
|
|
+ username: '',
|
|
|
+ password: ''
|
|
|
+});
|
|
|
+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 // 是否显示透明蒙层,防止触摸穿透
|
|
|
+ });
|
|
|
+
|
|
|
+ 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);
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+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);
|
|
|
+
|
|
|
+ await uni.switchTab({
|
|
|
+ url: '/pages/home/index'
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.privacy {
|
|
|
+ height: 60vh;
|
|
|
+ width: 85vw;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+
|
|
|
+.uni-padding-wrap {
|
|
|
+ display: flex;
|
|
|
+ z-index: 999;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ padding: 0 10rpx;
|
|
|
+}
|
|
|
+.uni-title {
|
|
|
+ font-size: 12px;
|
|
|
+}
|
|
|
+.login-top {
|
|
|
+ position: relative;
|
|
|
+ width: 100%;
|
|
|
+ height: 422rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.back-img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.login-text {
|
|
|
+ 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%;
|
|
|
+ margin-bottom: 6rpx;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.margin-bt {
|
|
|
+ margin-bottom: 25px;
|
|
|
+}
|
|
|
+
|
|
|
+.login-form-wrap {
|
|
|
+ padding: 60rpx;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.uni-easyinput__content-input) {
|
|
|
+ height: 45px;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.uni-input-input) {
|
|
|
+ color: #999999 !important;
|
|
|
+}
|
|
|
+
|
|
|
+uni-button[type='primary'] {
|
|
|
+ background: #004098;
|
|
|
+}
|
|
|
+
|
|
|
+.btn-text {
|
|
|
+ color: #004098;
|
|
|
+ margin-top: 20px;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+</style>
|