123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- <template>
- <view class="container">
- <view class="safe_content">
- <text class="close_icon" @click="closePage">{{closeIcon}}</text>
- <text class="title">这是一个普通uvue的dialogPage页面</text>
- <view class="number">
- <text id="number-text" class="number-text" ref="number-text">{{phone}}</text>
- <text id="slogan-text" class="slogan-text">{{slogan}}</text>
- </view>
- <button id="login-button" class="login-button" @click="loginIn">本机号码一键登录</button>
- <view class="privacy">
- <checkbox id="privacy-checkbox" class="privacy-checkbox" ref="privacy-checkbox" :checked="false"></checkbox>
- <text class="privacy-normal-text">登录即同意</text>
- <text id="privacy-text" class="privacy-text" @click="openLink">{{privacyName}}</text>
- </view>
- <text class="other" @click="otherLogin">其他登录方式</text>
- </view>
- </view>
- </template>
- <script>
- export default {
- data() {
- return {
- uniVerifyManager: null as UniVerifyManager | null,
- phone: '',
- slogan: '',
- privacyName: '',
- privacyUrl: '',
- closeIcon: '\uE650',
- isLoading: false //是否正在登录中
- }
- },
- onLoad(options : OnLoadOptions) {
- this.uniVerifyManager = uni.getUniVerifyManager();
- this.phone = options['phone'] as string;
- this.slogan = options['slogan'] as string;
- this.privacyName = options['name'] as string;
- this.privacyUrl = options['link'] as string;
- },
- methods: {
- closePage() {
- uni.closeDialogPage({
- dialogPage: this.$page,
- animationType: 'slide-out-bottom',
- success(res) {
- console.log('closeThisDialog success', res)
- },
- fail(err) {
- console.log('closeThisDialog fail', err)
- }
- })
- },
- openLink() {
- let url = '/pages/API/get-univerify-manager/full-webview-page?url=' + this.privacyUrl + '&title=' + this.privacyName + '&animationType=slide-out-bottom';
- uni.openDialogPage({
- url: url,
- animationType: 'slide-in-bottom',
- success(res) {
- console.log("打开隐私协议");
- },
- fail(err) {
- console.log(err);
- }
- })
- },
- loginIn() {
- if (this.isLoading) {
- uni.showToast({
- title: "正在登录中,请稍后",
- position: "bottom",
- duration: 2000
- })
- return;
- }else{
- this.isLoading = true;
- }
- const numberTextElement = this.$page.getElementById('number-text');
- const sloganTextElement = this.$page.getElementById('slogan-text');
- const loginButtonElement = this.$page.getElementById('login-button');
- const privacyCheckBoxElement = this.$page.getElementById('privacy-checkbox');
- const privacyTextElement = this.$page.getElementById('privacy-text');
- if (numberTextElement != null && sloganTextElement != null && loginButtonElement != null && privacyCheckBoxElement != null && privacyTextElement != null) {
- this.uniVerifyManager?.customLogin({
- numberTextElement: numberTextElement,
- sloganTextElement: sloganTextElement,
- loginButtonElement: loginButtonElement,
- privacyCheckBoxElement: privacyCheckBoxElement,
- privacyTextElement: privacyTextElement,
- success: (res) => {
- console.log(res);
- this.takePhoneNumber(res.accessToken, res.openId);
- },
- fail: (error) => {
- if (error.errCode == 40001) {
- uni.showToast({
- title: "请同意服务条款",
- position: "bottom",
- duration: 2000
- })
- } else if (error.errCode == 40002) {
- uni.showToast({
- title: "授权页不符合规范",
- position: "bottom",
- duration: 2000
- })
- } else {
- const errorMsg = JSON.parseObject(error.cause?.cause?.message ?? "")?.getString("errorDesc") ?? error.errMsg;
- uni.showToast({
- title: errorMsg,
- position: "bottom",
- duration: 2000
- })
- }
- },
- complete: () =>{
- this.isLoading = false;
- }
- })
- } else {
- uni.showToast({
- title: "未获取到页面元素",
- position: "bottom",
- duration: 2000
- })
- this.isLoading = false;
- }
- },
- takePhoneNumber(token : string, openId : string) {
- //云函数取号
- uniCloud.callFunction({
- name: 'univerify',
- data: {
- access_token: token, // 客户端一键登录接口返回的access_token
- openid: openId // 客户端一键登录接口返回的openid
- }
- }).then(res => {
- // 关闭登录页
- this.closePage();
- setTimeout(() => {
- uni.showModal({
- title: '取号成功',
- content: res.result.getJSON("res")?.getString("phoneNumber"),
- showCancel: false
- });
- }, 100);
- }).catch(err => {
- console.error(JSON.stringify(err));
- // 关闭登录页
- this.closePage();
- setTimeout(() => {
- uni.showModal({
- title: '取号失败',
- content: (err as Error).message,
- showCancel: false
- });
- }, 100);
- });
- },
- otherLogin() {
- //此处可实现其他登录方式
- uni.showToast({
- title: "使用其他方式登录",
- position: "bottom"
- })
- }
- }
- }
- </script>
- <style>
- .container {
- background-color: white;
- flex: 1;
- width: 100%;
- }
- .safe_content {
- padding-top: var(--status-bar-height);
- width: 100%;
- height: 100%;
- }
- .close_icon {
- left: 90%;
- top: 15px;
- font-family: uni-icon;
- font-size: 24px;
- /* font-weight: bold; */
- }
- .title {
- align-self: center;
- top: 20px;
- }
- .number {
- width: 100%;
- top: 25%;
- position: absolute;
- height: 120px;
- }
- .number-text {
- width: 100%;
- text-align: center;
- font-size: 28px;
- font-weight: bold;
- align-self: center;
- height: 30px;
- }
- .slogan-text {
- margin-top: 10px;
- width: 100%;
- font-size: 13px;
- text-align: center;
- align-self: center;
- color: gray;
- height: 20px;
- }
- .login-button {
- width: 80%;
- top: 40%;
- position: absolute;
- align-self: center;
- background-color: orangered;
- font-size: 16px;
- color: white;
- }
- .privacy {
- margin-top: 10px;
- flex-direction: row;
- flex-wrap: wrap;
- top: 45%;
- width: 100%;
- justify-content: center;
- align-self: center;
- position: absolute;
- }
- .privacy-checkbox {
- transform: scale(0.65);
- }
- .privacy-text {
- margin-top: 4px;
- color: #007aff;
- font-size: 14px;
- }
- .privacy-normal-text {
- margin-top: 4px;
- color: gray;
- font-size: 14px;
- }
- .other {
- bottom: 7%;
- transform: translateY(50%);
- position: absolute;
- align-self: center;
- font-size: 14px;
- }
- </style>
|