login.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <template>
  2. <div class="login">
  3. <div class="login-header">
  4. <img class="logo" :style="VUE_APP_USERNAME == 'smt' ? 'width:200px;height:200px' : ''" :src=" logo" />
  5. <h2 v-if="VUE_APP_USERNAME != 'smt'">{{ $t('login.title') }}</h2>
  6. </div>
  7. <div class="login-form">
  8. <!-- <van-field v-model="loginForm.tenantId" name="" label="" :placeholder="$t('login.form.tenantId')"
  9. :rules="[{ required: true, message: $t('login.form.tenantId') }]" autocomplete="off" /> -->
  10. <van-field v-model="loginForm.username" name="" label="" :placeholder="$t('login.form.username')"
  11. :rules="[{ required: true, message: $t('login.form.username') }]" autocomplete="off" />
  12. <van-field v-model="loginForm.password" type="password" name="" label="" :placeholder="$t('login.form.password')"
  13. :rules="[{ required: true, message: $t('login.form.password') }]" />
  14. <van-form @submit="onSubmit">
  15. <van-cell-group inset> </van-cell-group>
  16. <div style="margin: 16px">
  17. <van-button round block type="primary" native-type="submit">
  18. {{$t('common.submit')}}
  19. </van-button>
  20. </div>
  21. <div class="check-warp" style="text-align: left; justify-content: left">
  22. <div class="check-icon-warp">
  23. <van-checkbox icon-size="16px" v-model="rememberMe"></van-checkbox>
  24. </div>
  25. {{$t('login.rememberPassword')}}
  26. </div>
  27. </van-form>
  28. </div>
  29. <!-- <div class="login-btn">
  30. <div class="check-warp">
  31. <div class="check-icon-warp">
  32. <van-checkbox icon-size="16px" v-model="clause"></van-checkbox>
  33. </div>
  34. <div>
  35. {{ $t('login.agreement.text') }}
  36. <span>{{ $t('login.agreement.clause') }}</span>
  37. {{ $t('login.agreement.and') }}
  38. <span>{{ $t('login.agreement.agreement') }}</span>
  39. </div>
  40. </div>
  41. </div> -->
  42. <van-dialog v-model:show="langModal" title="选择语言" show-cancel-button @confirm="changeLang">
  43. <van-radio-group v-model="langType">
  44. <van-radio name="zh-cn" style="height:50px;padding-left: 20px;">简体中文</van-radio>
  45. <van-radio name="en-us" style="height:50px;padding-left: 20px;">English</van-radio>
  46. </van-radio-group>
  47. </van-dialog>
  48. </div>
  49. </template>
  50. <style lang="scss" scoped>
  51. .login {
  52. height: 100vh;
  53. width: 100%;
  54. background-size: 100% 100%;
  55. background: #fff;
  56. .check-warp {
  57. display: flex;
  58. align-items: center;
  59. justify-content: center;
  60. .check-icon-warp {
  61. margin-right: 5px;
  62. }
  63. span {
  64. color: #3370ff;
  65. margin: 0 4px;
  66. }
  67. }
  68. .login-form {
  69. padding: 5px 20px;
  70. }
  71. .login-btn {
  72. font-size: 12px;
  73. position: fixed;
  74. bottom: 50px;
  75. left: 0;
  76. right: 0;
  77. }
  78. .van-cell {
  79. border: 5px;
  80. background: #f1f1f1;
  81. margin-bottom: 12px;
  82. height: 50px;
  83. box-sizing: border-box;
  84. line-height: 44px;
  85. padding: 3px 12px;
  86. font-size: 16px;
  87. }
  88. .login-header {
  89. background: url(../assets/images/login-header.png) no-repeat;
  90. height: 200px;
  91. background-size: cover;
  92. padding: 44px 20px 17px;
  93. box-sizing: border-box;
  94. .logo {
  95. height: 45px;
  96. }
  97. h2 {
  98. margin-top: 40px;
  99. }
  100. }
  101. }
  102. </style>
  103. <script setup>
  104. import "vant/lib/index.css";
  105. import { ref, getCurrentInstance, onMounted } from "vue";
  106. import { setUserInfo, setToken, getUserInfo, getToken } from "@/utils/auth";
  107. import { showSuccessToast, showFailToast, showConfirmDialog } from "vant";
  108. import * as dd from "dingtalk-jsapi";
  109. import axios from "axios";
  110. import { useRoute } from "vue-router";
  111. import logo from "@/assets/logo.png";
  112. import smtLogo from "@/assets/smtLogo.png";
  113. const route = useRoute();
  114. const proxy = getCurrentInstance().proxy;
  115. const VUE_APP_USERNAME = ref(process.env.VUE_APP_USERNAME);
  116. const langModal = ref(false);
  117. const langType = ref("zh-cn");
  118. const loginForm = ref({
  119. username: "",
  120. password: "",
  121. rememberMe: false,
  122. tenantId: "000000",
  123. code: "",
  124. uuid: "",
  125. });
  126. const rememberMe = ref(false);
  127. const clause = ref(false);
  128. const radioChange = () => {
  129. console.log(loginForm.rememberMe);
  130. // loginForm.value.rememberMe = loginForm.value.rememberMe ? false : false;
  131. };
  132. const onSubmit = () => {
  133. proxy
  134. .post("login", loginForm.value, "post", {
  135. tenantId: loginForm.value.tenantId,
  136. })
  137. .then((res) => {
  138. console.log(res);
  139. if (res.code == 200) {
  140. setToken(res.token);
  141. getInfo();
  142. }
  143. });
  144. };
  145. const changeLang = () => {
  146. proxy.$i18n.locale = langType.value;
  147. window.localStorage.setItem("lang", langType.value);
  148. langModal.value = false;
  149. };
  150. const getInfo = () => {
  151. proxy.post("getInfo", {}, "get").then((res) => {
  152. console.log(res);
  153. if (res.code == 200) {
  154. setUserInfo(res.user);
  155. window.localStorage.setItem("tenantId", loginForm.value.tenantId);
  156. if (rememberMe.value) {
  157. window.localStorage.setItem("username", loginForm.value.username);
  158. window.localStorage.setItem("password", loginForm.value.password);
  159. window.localStorage.setItem("rememberMe", rememberMe.value);
  160. } else {
  161. window.localStorage.setItem("username", "");
  162. window.localStorage.setItem("password", "");
  163. window.localStorage.setItem("tenantId", "");
  164. window.localStorage.setItem("rememberMe", false);
  165. }
  166. showSuccessToast("登录成功");
  167. proxy.$router.push("/main");
  168. }
  169. });
  170. };
  171. onMounted(() => {
  172. let username = window.localStorage.getItem("username");
  173. let password = window.localStorage.getItem("password");
  174. let tenantId = window.localStorage.getItem("tenantId");
  175. let rememberMeCopy = window.localStorage.getItem("rememberMe");
  176. let lang = window.localStorage.getItem("lang");
  177. if (!lang) {
  178. langModal.value = true;
  179. }
  180. if (rememberMeCopy == "true") {
  181. loginForm.value.username = username;
  182. loginForm.value.password = password;
  183. rememberMe.value = true;
  184. loginForm.value.tenantId = tenantId;
  185. }
  186. });
  187. const loginData = ref({});
  188. let code = ref("");
  189. const ddLoginInit = () => {
  190. if (getToken()) {
  191. //proxy.$router.push('/main')
  192. }
  193. dd.ready(function () {
  194. dd.ui.webViewBounce.disable();
  195. dd.runtime.permission.requestAuthCode({
  196. corpId: route.query.id, // 企业id
  197. onSuccess: function (info) {
  198. code.value = info.code;
  199. proxy
  200. .post("/open/dingApi/getUserToken", {
  201. code: code.value,
  202. corpId: route.query.id,
  203. })
  204. .then(
  205. (res) => {
  206. window.localStorage.setItem("corpId", route.query.id);
  207. setToken(res.data);
  208. getInfo();
  209. },
  210. (catchError) => {}
  211. );
  212. },
  213. onFail: function (err) {},
  214. });
  215. });
  216. };
  217. ddLoginInit();
  218. </script>