index.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <template>
  2. <v-page>
  3. <v-header class="nav-tab" :leftClick="()=>_router.replace('/pages/base/index')"></v-header>
  4. <main class="flex-fill flex-shrink">
  5. <view class="fn-center p-t-lg p-b-md">
  6. <img :src="logoMap.login_logo" class="h-80" />
  7. </view>
  8. <view class="form m-lg bg-panel-3 p-lg rounded-md box-shadow">
  9. <view class="form-item border-b m-b-lg p-b-xs ">
  10. <view class="label m-b-lg">{{$t('login.a0')}}</view>
  11. <v-input class="color-light" v-model="form.account" :placeholder="$t('login.a1')"></v-input>
  12. </view>
  13. <view class="form-item border-b m-b-xl p-b-xs">
  14. <view class="label m-b-lg">{{$t('login.a2')}}</view>
  15. <v-input
  16. class="color-light"
  17. v-model="form.password"
  18. type="password"
  19. :placeholder="$t('login.a3')"
  20. ></v-input>
  21. </view>
  22. <view class="m-b-lg">
  23. <v-button type="blue" block class="w-max rounded-md" key="loginbtn" @click="toLogin">{{$t('login.a4')}}</v-button>
  24. </view>
  25. </view>
  26. <view class="m-x-lg m-y-md d-flex">
  27. <v-link
  28. tag="div"
  29. to="/pages/safe/forget-password"
  30. class="tips fn-sm color-sell"
  31. >{{$t('login.a5')}}?</v-link>
  32. <view class="mlaotu fn-12">
  33. {{$t('login.a6')}},
  34. <v-link to="/pages/reg/index?from=login" class="color-sell d-inline-block" >{{$t('login.a7')}}</v-link>
  35. </view>
  36. </view>
  37. <!-- <view class="kefu">
  38. <view class="kefu m-b-lg">
  39. <v-button type="blue" block class="w-max rounded-md" key="loginbtn" @click="kefu">{{ $t("common.service") }}</v-button>
  40. </view>
  41. </view> -->
  42. </main>
  43. <view class="m-x-lg p-x-lg">
  44. <!-- <view class="p-y-md border-t fn-center">
  45. {{$t('login.a6')}},
  46. <v-link to="/pages/reg/index?from=login" class="color-theme-1 d-inline-block" >{{$t('login.a7')}}</v-link>
  47. </view> -->
  48. </view>
  49. <!-- 二次验证弹框 -->
  50. <van-popup
  51. :show="secondaryShow"
  52. @close="secondaryShow=false"
  53. closeable
  54. close-on-popstate
  55. position="bottom"
  56. custom-style="height:40%"
  57. >
  58. <van-tabs class="m-t-lg p-t-lg" v-if="secondaryShow" :sticky="false" :active="form2.code_type" @change="changeTab">
  59. <van-tab title="Google" v-if="secondaryData.google_status==1" :name="3">
  60. <v-input
  61. class="border h-40 m-y-md m-x-lg p-x-md"
  62. type="number"
  63. :placeholder="$t('common.code')"
  64. v-model="form2.code"
  65. ></v-input>
  66. </van-tab>
  67. <van-tab :title="$t('login.a8')" v-if="secondaryData.phone_status==1" :name="1">
  68. <v-input
  69. class="border h-40 m-y-md m-x-lg p-x-md"
  70. type="number"
  71. :placeholder="$t('common.code')"
  72. v-model="form2.code"
  73. >
  74. <template #right>
  75. <v-code
  76. type="green-plain"
  77. url="/login/sendSmsCodeBeforeLogin"
  78. :data="{signature:form2.signature}"
  79. ref="mobileCode"
  80. ></v-code>
  81. </template>
  82. </v-input>
  83. </van-tab>
  84. <van-tab :title="$t('login.a9')" v-if="secondaryData.email_status==1" :name="2">
  85. <v-input
  86. class="border h-40 m-y-md m-x-lg p-x-md"
  87. type="number"
  88. :placeholder="$t('common.code')"
  89. v-model="form2.code"
  90. >
  91. <template #right>
  92. <v-code
  93. type="green-plain"
  94. url="/login/sendEmailCodeBeforeLogin"
  95. :data="{signature:form2.signature}"
  96. ref="emailCode"
  97. ></v-code>
  98. </template>
  99. </v-input>
  100. <view class="m-md"></view>
  101. </van-tab>
  102. </van-tabs>
  103. <view class="m-md">
  104. <v-button type="blue" block class="w-max rounded-md" @click="sendCodeLogin">{{$t('login.a4')}}</v-button>
  105. </view>
  106. </van-popup>
  107. <van-toast id="van-toast" />
  108. </v-page>
  109. </template>
  110. <script>
  111. import Member from "@/api/member";
  112. import { mapActions, mapState } from "vuex";
  113. export default {
  114. data() {
  115. return {
  116. form: {
  117. type: 1,
  118. account: "",
  119. password: "",
  120. },
  121. form2: {
  122. code: "",
  123. code_type: "",
  124. signature: "",
  125. },
  126. secondaryData: {},
  127. secondaryShow: false,
  128. activeName: 1,
  129. };
  130. },
  131. computed: {
  132. ...mapState({
  133. logoMap: "logoMap",
  134. }),
  135. },
  136. methods: {
  137. ...mapActions({
  138. setToken: "token",
  139. setUser: "user",
  140. }),
  141. changeTab(ev){
  142. this.form2.code_type = ev.detail.name
  143. },
  144. // 去登陆
  145. toLogin() {
  146. if (this.form.account.includes("@")) {
  147. this.form.type = 2;
  148. } else {
  149. this.form.type = 1;
  150. }
  151. if (!this.form.account) {
  152. this.$toast(this.$t("login.a1"));
  153. return;
  154. }
  155. if (!this.form.password) {
  156. this.$toast(this.$t("login.a3"));
  157. return;
  158. }
  159. Member.login(this.form)
  160. .then((res) => {
  161. if (res.code == 1021) {
  162. //二次验证
  163. this.loginVer(res.data);
  164. } else {
  165. this.loginSuccess(res.data);
  166. }
  167. })
  168. .catch(() => {
  169. });
  170. },
  171. loginVer(data) {
  172. this.secondaryShow = true;
  173. this.secondaryData = data;
  174. this.form2.signature = data.signature;
  175. if (data.google_status == 1) {
  176. this.form2.code_type = 3;
  177. } else if (data.phone_status == 1) {
  178. this.form2.code_type = 1;
  179. this.$nextTick(() => {
  180. this.$refs.mobileCode.send();
  181. });
  182. } else if (data.email_status == 1) {
  183. this.form2.code_type = 2;
  184. this.$nextTick(() => {
  185. this.$refs.emailCode.send();
  186. });
  187. }
  188. },
  189. // 发送验证码 二次验证登录用
  190. sendCodeLogin() {
  191. Member.loginConfirm(this.form2, { loading: true }).then((res) => {
  192. this.loginSuccess(res.data);
  193. });
  194. },
  195. // 登录成功
  196. loginSuccess(data) {
  197. this.setToken(data.token);
  198. this.setUser(data.user);
  199. this._router.push("/pages/base/index");
  200. },
  201. kefu (e) {
  202. let user_id = '';
  203. let avatar = '';
  204. let nickname = '';
  205. // uni.navigateTo({
  206. // url:'/pages/assets/web-view'
  207. // })
  208. window.location.href = 'https://go.crisp.chat/chat/embed/?website_id=c6ffb47c-4db3-4d31-b84c-23c5b95f3255'
  209. },
  210. },
  211. mounted() {},
  212. };
  213. </script>
  214. <style lang="scss" scoped>
  215. .nav-tab {
  216. background: transparent;
  217. &::after {
  218. border: none;
  219. }
  220. }
  221. .mlaotu{
  222. margin-left: auto;
  223. }
  224. .kefu{
  225. width: 95%;
  226. margin:auto;
  227. }
  228. </style>