Browse Source

登录页面和消息提示组件

pull/1/head
张立 9 months ago
parent
commit
3e278ce6e2
  1. 2
      src/main.ts
  2. 359
      src/mycomponents/common/comMessage.vue
  3. 8
      src/pages.json
  4. 222
      src/pages/login/index.vue

2
src/main.ts

@ -3,6 +3,7 @@ import * as Pinia from 'pinia'
// @ts-ignore // @ts-ignore
import uView from 'vk-uview-ui' import uView from 'vk-uview-ui'
import App from './App.vue' import App from './App.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
@ -30,6 +31,7 @@ export function createApp() {
app.config.globalProperties.$modal = modal app.config.globalProperties.$modal = modal
// 时间对象 // 时间对象
app.config.globalProperties.$time = time app.config.globalProperties.$time = time
app.component('com-message', comMessage)

359
src/mycomponents/common/comMessage.vue

@ -29,132 +29,127 @@
</view> </view>
</template> </template>
<script> <script setup lang="ts">
/** /**
* modal 模态框 * modal 模态框
* @description 弹出模态框常用于消息提示消息确认在当前页面内完成特定的交互操作 * @description 弹出模态框常用于消息提示消息确认在当前页面内完成特定的交互操作
* */ * */
export default { import {
data() { ref,
return { getCurrentInstance
timer: null, } from 'vue'
show: false, // const timer = ref(null)
iconType: '消息', const show = ref(false) //
icon: '../../static/icons/error-circle.svg', const iconType = ref('消息')
title: '', // const icon = ref('../../static/icons/error-circle.svg')
content: '', // const title = ref('')
cancelText: '取消', // const content = ref('') //
confirmText: '确定', // const cancelText = ref('取消') //
showCancel: true, // true const confirmText = ref('确定') //
confirmColor: '#007aff', // const showCancel = ref(true) // true
cancelColor: null, // const confirmColor = ref('#007aff') //
showConfirmButton: true, // const cancelColor = ref(null) //
showConfirmCountdown: true, // const showConfirmButton = ref(true) //
showCancelButton: true, // const showConfirmCountdown = ref(true) //
showClose: false, const showCancelButton = ref(true) //
confirm: false, // true const showClose = ref(false)
cancel: false, // true const confirm = ref(false) // true
isDisabled: true, // true const cancel = ref(false) // true
seconds: 0, const isDisabled = ref(true) // true
success: () => {} // const seconds = ref(0)
} const success = () => {
},
}
const open = () => {
methods: { show.value = true;
open() { isDisabled.value = true;
this.show = true; }
this.isDisabled = true; const close = () => {
}, show.value = false
close() { isDisabled.value = false;
this.$.refs.modal.popupClose(); }
this.isDisabled = false; const confirmClose = () => {
}, if (!isDisabled.value) return
confirmClose() { isDisabled.value = false
if (!this.isDisabled) return
this.isDisabled = false
// console.log('') // console.log('')
if (this.show) { if (show.value) {
this.show = false; show.value = false;
clearInterval(this.timer) //timer clearInterval(timer.value) //timer
this.$.refs.modal.popupClose(); success({
this.success({
// cancel: false, // cancel: false,
confirm: true, confirm: true,
}); });
} }
}, }
const cancelClose = () => {
cancelClose() { if (!isDisabled.value) return
if (!this.isDisabled) return isDisabled.value = false
this.isDisabled = false clearInterval(timer.value) //timer
clearInterval(this.timer) //timer show.value = false
this.$.refs.modal.popupClose(); success({
this.success({
// cancel: true, // cancel: true,
confirm: false, confirm: false,
}); });
}, }
// (+) // (+)
showMessage(mContent, callback) { const showMessage = (mContent, callback) => {
this.showConfirmCountdownModal("消息", mContent, callback); showConfirmCountdownModal("消息", mContent, callback);
}, }
// (+) // (+)
showSuccessMessage(mContent, callback) { const showSuccessMessage = (mContent, callback) => {
this.showConfirmCountdownModal("成功", mContent, callback); showConfirmCountdownModal("成功", mContent, callback);
}, }
// ( // (
showErrorMessage(mContent, callback) { const showErrorMessage = (mContent, callback) => {
this.showConfirmModal("失败", mContent, callback);
}, console.log(333)
showConfirmModal("失败", mContent, callback);
}
// ( // (
showBreakMessage(mContent, callback) { const showBreakMessage = (mContent, callback) => {
this.showNoButtonModal("失败", mContent, callback); showNoButtonModal("失败", mContent, callback);
}, }
// (+ // (+
showQuestionMessage(mContent, callback) { const showQuestionMessage = (mContent, callback) => {
this.showSelectModal("疑问", mContent, callback); showSelectModal("疑问", mContent, callback);
}, }
// (+) // (+)
showWarningMessage(mContent, callback) { const showWarningMessage = (mContent, callback) => {
this.showConfirmCountdownModal("警告", mContent, callback); showConfirmCountdownModal("警告", mContent, callback);
}, }
// (+) // (+)
showConfirmCountdownFailModal(mContent, callback) { const showConfirmCountdownFailModal = (mContent, callback) => {
this.showConfirmCountdownModal("失败", mContent, callback); showConfirmCountdownModal("失败", mContent, callback);
}, }
// ( // (
showConfirmMessageModal(mContent, callback) { const showConfirmMessageModal = (mContent, callback) => {
this.showConfirmModal("消息", mContent, callback); showConfirmModal("消息", mContent, callback);
}, }
// ( // (
showConfirmSuccessModal(mContent, callback) { const showConfirmSuccessModall = (mContent, callback) => {
this.showConfirmModal("成功", mContent, callback); showConfirmModal("成功", mContent, callback);
}, }
// ( // (
showConfirmWarningModal(mContent, callback) { const showConfirmWarningModal = (mContent, callback) => {
this.showConfirmModal("警告", mContent, callback); showConfirmModal("警告", mContent, callback);
}, }
// ( // (
showConfirmQuestionModal(mContent, callback) { const showConfirmQuestionModal = (mContent, callback) => {
this.showConfirmModal("疑问", mContent, callback); showConfirmModal("疑问", mContent, callback);
}, }
// ( // (
showNoButtonModal(mIconType, mContent, callback) { const showNoButtonModal = (mIconType, mContent, callback) => {
this.showModal({ showModal({
iconType: mIconType, iconType: mIconType,
content: mContent, content: mContent,
showConfirmButton: false, showConfirmButton: false,
@ -170,11 +165,11 @@
} }
}); });
}, }
// ( // (
showConfirmModal(mIconType, mContent, callback) { const showConfirmModal = (mIconType, mContent, callback) => {
this.showModal({ console.log(222)
showModal({
iconType: mIconType, iconType: mIconType,
content: mContent, content: mContent,
showCancelButton: false, showCancelButton: false,
@ -189,31 +184,31 @@
} }
}); });
}, }
// (+ // (+
showSelectMessageModal(mContent, callback) { const showSelectMessageModal = (mContent, callback) => {
this.showSelectModal("消息", mContent, callback); showSelectModal("消息", mContent, callback);
}, }
// (+ // (+
showSelectSuccessModal(mContent, callback) { const showSelectSuccessModal = (mContent, callback) => {
this.showSelectModal("成功", mContent, callback); showSelectModal("成功", mContent, callback);
}, }
// (+ // (+
showSelectFailModal(mContent, callback) { const showSelectFailModal = (mContent, callback) => {
this.showSelectModal("失败", mContent, callback); showSelectModal("失败", mContent, callback);
}, }
// (+ // (+
showSelectWarningModal(mContent, callback) { const showSelectWarningModal = (mContent, callback) => {
this.showSelectModal("警告", mContent, callback); showSelectModal("警告", mContent, callback);
}, }
// (+ // (+
showSelectModal(mIconType, mContent, callback) { const showSelectModal = (mIconType, mContent, callback) => {
this.showModal({ showModal({
iconType: mIconType, iconType: mIconType,
content: mContent, content: mContent,
success: function(res) { success: function(res) {
@ -229,16 +224,16 @@
} }
}); });
}, }
// (+) // (+)
showConfirmCountdownQuestionModal(mContent, callback) { const showConfirmCountdownQuestionModal = (mContent, callback) => {
this.showConfirmCountdownModal("疑问", mContent, callback); showConfirmCountdownModal("疑问", mContent, callback);
}, }
// (+) // (+)
showConfirmCountdownModal(mIconType, mContent, callback) { const showConfirmCountdownModal = (mIconType, mContent, callback) => {
this.showModal({ showModal({
iconType: mIconType, iconType: mIconType,
content: mContent, content: mContent,
showCancelButton: false, showCancelButton: false,
@ -253,36 +248,36 @@
} }
} }
}); });
}, }
// (++) // (++)
showSelectCountdownMessageModal(mContent, callback) { const showSelectCountdownMessageModal = (mContent, callback) => {
this.showSelectCountdownModal("消息", mContent, callback); showSelectCountdownModal("消息", mContent, callback);
}, }
// (++) // (++)
showSelectCountdownSuccessModal(mContent, callback) { const showSelectCountdownSuccessModal = (mContent, callback) => {
this.showSelectCountdownModal("成功", mContent, callback); showSelectCountdownModal("成功", mContent, callback);
}, }
// (++) // (++)
showSelectCountdownFailModal(mContent, callback) { const showSelectCountdownFailModal = (mContent, callback) => {
this.showSelectCountdownModal("失败", mContent, callback); showSelectCountdownModal("失败", mContent, callback);
}, }
// (++) // (++)
showSelectCountdownWarningModal(mContent, callback) { const showSelectCountdownWarningModal = (mContent, callback) => {
this.showSelectCountdownModal("警告", mContent, callback); showSelectCountdownModal("警告", mContent, callback);
}, }
// (++) // (++)
showSelectCountdownQuestionModal(mContent, callback) { const showSelectCountdownQuestionModal = (mContent, callback) => {
this.showSelectCountdownModal("疑问", mContent, callback); showSelectCountdownModal("疑问", mContent, callback);
}, }
// (++) // (++)
showSelectCountdownModal(mIconType, mContent, callback) { const showSelectCountdownModal = (mIconType, mContent, callback) => {
this.showModal({ showModal({
iconType: mIconType, iconType: mIconType,
content: mContent, content: mContent,
showConfirmCountdown: true, showConfirmCountdown: true,
@ -298,27 +293,27 @@
} }
} }
}); });
}, }
// //
showModal(data) { const showModal = (data) => {
if (data.iconType) { if (data.iconType) {
this.iconType = data.iconType iconType.value = data.iconType
switch (data.iconType) { switch (data.iconType) {
case '消息': case '消息':
this.icon = '/static/icons/error-circle.svg'; icon.value = '/static/icons/error-circle.svg';
break; break;
case '成功': case '成功':
this.icon = '/static/icons/checkmark-circle.svg'; icon.value = '/static/icons/checkmark-circle.svg';
break; break;
case '失败': case '失败':
this.icon = '/static/icons/close-circle.svg'; icon.value = '/static/icons/close-circle.svg';
break; break;
case '警告': case '警告':
this.icon = '/static/icons/warning.svg'; icon.value = '/static/icons/warning.svg';
break; break;
case '疑问': case '疑问':
this.icon = '/static/icons/question-circle.svg'; icon.value = '/static/icons/question-circle.svg';
break; break;
default: default:
break; break;
@ -326,98 +321,94 @@
} }
// image // image
if (data.title) { if (data.title) {
this.title = data.title title.value = data.title
} }
if (data.content) { if (data.content) {
this.content = data.content content.value = data.content
} else { } else {
this.content = '' content.value = ''
} }
if (data.cancelText) { if (data.cancelText) {
this.cancelText = data.cancelText cancelText.value = data.cancelText
} else { } else {
this.cancelText = '取消' cancelText.value = '取消'
} }
if (data.confirmText) { if (data.confirmText) {
this.confirmText = data.confirmText confirmText.value = data.confirmText
} else { } else {
this.confirmText = '确定' confirmText.value = '确定'
} }
if (data.showCancel === false || data.showCancel === true) { if (data.showCancel === false || data.showCancel === true) {
this.showCancel = data.showCancel showCancel.value = data.showCancel
} else { } else {
this.showCancel = true showCancel.value = true
} }
if (data.confirmColor) { if (data.confirmColor) {
this.confirmColor = data.confirmColor confirmColor.value = data.confirmColor
} else { } else {
this.confirmColor = '#007aff' confirmColor.value = '#007aff'
} }
if (data.cancelColor) { if (data.cancelColor) {
this.cancelColor = data.cancelColor cancelColor.value = data.cancelColor
} else { } else {
this.cancelColor = '#666F83' cancelColor.value = '#666F83'
} }
if (data.showConfirmButton === false || data.showConfirmButton === true) { if (data.showConfirmButton === false || data.showConfirmButton === true) {
this.showConfirmButton = data.showConfirmButton showConfirmButton.value = data.showConfirmButton
} else { } else {
this.showConfirmButton = true showConfirmButton.value = true
} }
if (data.showConfirmCountdown === false || data.showConfirmCountdown === true) { if (data.showConfirmCountdown === false || data.showConfirmCountdown === true) {
this.showConfirmCountdown = data.showConfirmCountdown showConfirmCountdown.value = data.showConfirmCountdown
} else { } else {
this.showConfirmCountdown = false showConfirmCountdown.value = false
} }
if (data.showCancelButton === false || data.showCancelButton === true) { if (data.showCancelButton === false || data.showCancelButton === true) {
this.showCancelButton = data.showCancelButton showCancelButton.value = data.showCancelButton
} else { } else {
this.showCancelButton = true showCancelButton.value = true
} }
if (data.success) { if (data.success) {
this.success = data.success success = data.success
} else { } else {
this.success = () => {} success = () => {}
} }
setTimeout(res => { setTimeout(res => {
this.open(); open();
}, 500) }, 500)
if (this.showConfirmCountdown) { if (showConfirmCountdown.value) {
this.startTimer(); startTimer();
} }
}, }
startTimer() { const startTimer = () => {
this.seconds = 3; seconds.value = 3;
clearInterval(this.timer) clearInterval(timer.value)
this.timer = setInterval(() => { timer.value = setInterval(() => {
this.seconds-- seconds.value--
// console.log("", this.seconds); // console.log("", this.seconds);
if (this.seconds <= 0) { if (seconds.value <= 0) {
this.timeUp() timeUp()
return return
} }
}, 1000) }, 1000)
}, }
timeUp() { const timeUp = () => {
// clearInterval(this.timer) // clearInterval(this.timer)
console.log('时间到') console.log('时间到')
this.confirmClose(); confirmClose();
},
},
} }
defineExpose({ showErrorMessage }) // open
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.slot-content { .slot-content {

8
src/pages.json

@ -49,7 +49,13 @@
{ {
"path": "pages/login/index", "path": "pages/login/index",
"style": { "style": {
"navigationBarTitleText": "登录" "navigationBarTitleText": "登录",
"navigationBarBackgroundColor": "#476df5",
"h5": {
"maxWidth": 1190,
"navigationBarTextStyle": "white",
"navigationBarBackgroundColor": "#476df5 !important"
}
} }
}, },

222
src/pages/login/index.vue

@ -1,6 +1,5 @@
<template> <template>
<view class="content"> <view class="content">
<!-- <image mode="widthFix" class="loginimg" src="../../static/login.png"></image> -->
<image mode="widthFix" class="loginimg" src="../../static/icons_ui/login_bg.png"></image> <image mode="widthFix" class="loginimg" src="../../static/icons_ui/login_bg.png"></image>
<view class="login_title"> <view class="login_title">
<text>您好欢迎使用</text><br> <text>您好欢迎使用</text><br>
@ -10,16 +9,8 @@
<view class="loginbox"> <view class="loginbox">
<form> <form>
<view class="mytab"> <view class="mytab">
<!-- <view class="mytabline" :class="tapstyle == 1?'active':''" @click="tapchenge(1)">扫码登录</view> -->
<view class="mytabline" :class="tapstyle == 2?'active_in':''" @click="tapchenge(2)">密码登录</view> <view class="mytabline" :class="tapstyle == 2?'active_in':''" @click="tapchenge(2)">密码登录</view>
</view> </view>
<!-- <view class="mybox" v-if="tapstyle == 1">
<view class="conone">
<uni-easyinput prefixIcon="scan" class="uni-input" type="password" v-model="smloginmsg"
name="nickname" placeholder="扫码登录"></uni-easyinput>
</view>
</view> -->
<view class="mybox" v-if="tapstyle == 2"> <view class="mybox" v-if="tapstyle == 2">
<view class="conone"> <view class="conone">
<view class="title uni-flex"> <view class="title uni-flex">
@ -36,7 +27,8 @@
用户名 用户名
</view> </view>
<view> <view>
<input class="uni-input" style="padding:25rpx" placeholder="请输入用户名" v-model="username" /> <input class="uni-input" style="padding:25rpx" placeholder="请输入用户名"
v-model="username" />
</view> </view>
</view> </view>
<view class="conone"> <view class="conone">
@ -45,27 +37,15 @@
密码 密码
</view> </view>
<view class="uni-input-wrapper"> <view class="uni-input-wrapper">
<input class="uni-input" style="padding:25rpx" placeholder="请输入密码" :password="showPassword" <input class="uni-input" style="padding:25rpx" placeholder="请输入密码"
v-model="password" /> :password="showPassword" v-model="password" />
<text class="uni-icon" :class="[!showPassword ? 'uni-eye-active' : '']" <text class="uni-icon" :class="[!showPassword ? 'uni-eye-active' : '']"
@click="changePassword">&#xe568;</text> @click="changePassword">&#xe568;</text>
</view> </view>
<!-- <view class="uni-input-wrapper">
<input class="uni-input" type="password" name="password"
:password="showPassword"
placeholder="请输入密码" v-model="password"></input>
<text class="uni-icon" :class="[!showPassword ? 'uni-eye-active' : '']" @click="changePassword">&#xe568;</text>
</view> -->
</view> </view>
</view> </view>
<view style="display: flex;flex-direction: row;"> <view style="display: flex;flex-direction: row;">
<!-- <view class="uni-input">
<input class="" placeholder="请输入验证码"
v-model="code"
style="background-color: lightgray;padding-top: 40rpx;padding-bottom: 40rpx;margin-right: 20rpx;" />
</view> -->
<view class="uni-input-wrapper"> <view class="uni-input-wrapper">
<input class="" style="height: 80rpx; background-color: #F7F9FF;margin-right: 20rpx;" <input class="" style="height: 80rpx; background-color: #F7F9FF;margin-right: 20rpx;"
placeholder="请输入验证码" type="number" v-model="code" /> placeholder="请输入验证码" type="number" v-model="code" />
@ -84,47 +64,58 @@
</form> </form>
</view> </view>
</view> </view>
<comMessage ref="comMessage"></comMessage> <com-message ref="comMessageRef" />
</view> </view>
</template> </template>
<script> <script setup lang="ts">
import {
onLoad,
onShow,
onNavigationBarButtonTap,
onReady
} from '@dcloudio/uni-app'
import {
ref,
getCurrentInstance
} from 'vue'
import { import {
getCaptchaImage getCaptchaImage
} from '@/api/request2.js'; } from '@/api/request2.js';
import {
mapState,
mapMutations
} from 'vuex'
import { import {
useCountStore useCountStore
} from '@/store' } from '@/store'
// store // store
const store = useCountStore() const store = useCountStore()
export default { const { proxy } = getCurrentInstance()
components: {}, const smloginmsg = ref('')
data() { const tenantName = ref('闻荫源码')
return { const username = ref('')
smloginmsg: "", const password = ref('')
tenantName: "闻荫源码", const tapstyle = ref(2)
username: "", const loading = ref(false)
password: "", const showPassword = ref(true)
tapstyle: 2, const imageSrc = ref('')
loading: false, const code = ref('')
showPassword: true, const uuid = ref('')
imageSrc: "", const comMessageRef = ref('')
code: "", //
uuid: "" onNavigationBarButtonTap((e) => {
if (e.index === 0) {
uni.navigateTo({
url: "/pages/config/config"
})
} }
}, })
// computed: mapState(['forcedLogin', 'hasLogin']), onReady(() => {
mounted() { console.log()
})
onLoad(() => {
uni.clearStorageSync() uni.clearStorageSync()
uni.clearStorage(); // uni.clearStorage(); //
if (process.env.NODE_ENV === 'development') { if (import.meta.env.VITE_USER_NODE_ENV === 'development') {
this.username = "admin" username.value = "admin"
this.password = "123456"; password.value = "123456";
} }
uni.setNavigationBarColor({ uni.setNavigationBarColor({
frontColor: '#ffffff', frontColor: '#ffffff',
@ -137,52 +128,15 @@
backgroundColor: "#476DF5" backgroundColor: "#476DF5"
}) })
// #endif // #endif
getCode()
},
//
onNavigationBarButtonTap(e) {
if (e.index === 0) {
uni.navigateTo({
url: "/pages/config/config"
})
}
},
onLoad() {
getCaptchaImage().then(res => {
if (res) {
var code = res.data.img;
let base64 = 'data:image/jpeg;base64,' + code
// console.log("", base64)
this.imageSrc = base64.replace(/[\r\n]/g, "")
this.uuid = res.data.uuid
}
}).catch(error => {
this.showErrorMessage(error);
})
},
methods: {
// ...mapMutations(['login']),
handelerlogin() {
if (this.username === '') {
uni.showToast({
title: '用户名不能为空',
icon: 'none',
mask: true
})
} else if (this.password === '') {
uni.showToast({
title: '密码不能为空',
icon: 'none',
mask: true
})
} else if (this.code === '') {
uni.showToast({
title: '验证码不能为空',
icon: 'none',
mask: true
}) })
const handelerlogin = () => {
if (username.value === '') {
proxy.$modal.showToast('用户名不能为空')
} else if (password.value === '') {
proxy.$modal.showToast('密码不能为空')
} else if (code.value === '') {
proxy.$modal.showToast('验证码不能为空')
} else { } else {
// console.log("", this.username, "", this.password, this.tapstyle, this.smloginmsg) // console.log("", this.username, "", this.password, this.tapstyle, this.smloginmsg)
let logininfo = { let logininfo = {
@ -191,69 +145,53 @@
code: "", code: "",
uuid: "" uuid: ""
} }
if (this.tapstyle == 2) // //
{ if (tapstyle.value == 2) {
logininfo.username = this.username; logininfo.username = username.value;
logininfo.password = this.password logininfo.password = password.value
logininfo.code = this.code; logininfo.code = code.value;
logininfo.uuid = this.uuid; logininfo.uuid = uuid.value;
} else if (this.tapstyle == 1) { } else if (tapstyle.value == 1) {
// let arr = Base64.decode(this.smloginmsg).split(':')
// logininfo.username = arr[0];
// logininfo.password = arr[1]
} }
let params = JSON.stringify(logininfo); let params = JSON.stringify(logininfo);
console.log('params', params); newLogin(logininfo)
this.newLogin(logininfo)
} }
}, }
const newLogin = async (logininfo) => {
async newLogin(logininfo) { proxy.$modal.loading('正在登录')
uni.showLoading({
title: "正在登录",
mask: true
})
await store.Login(logininfo) await store.Login(logininfo)
// await this.$store.dispatch('Login', logininfo); proxy.$modal.closeLoading()
// await this.$store.dispatch('GetTenantIdInfo', this.tenantName)
uni.hideLoading()
uni.setStorageSync('hasLogin', true) uni.setStorageSync('hasLogin', true)
uni.switchTab({ uni.switchTab({
url: '/pages/index/index' url: '/pages/index/index'
}); });
uni.setStorageSync('username', this.username); uni.setStorageSync('username', username.value);
}, }
const tapchenge = (e) => {
tapstyle.value = e
tapchenge(e) { }
this.tapstyle = e const onchange = (e) => {
},
onchange(e) {
const value = e.detail.value const value = e.detail.value
},
changePassword: function() {
this.showPassword = !this.showPassword;
},
showErrorMessage(message) {
this.$refs.comMessage.showErrorMessage(message, res => {
if (res) {
} }
}); const changePassword = () => {
}, showPassword.vlaue = !showPassword.vlaue;
getCode() { }
const showErrorMessage = (message) => {
console.log(comMessag1e.value)
comMessageRef.value.showErrorMessage(message, res => { });
}
const getCode = () => {
getCaptchaImage().then(res => { getCaptchaImage().then(res => {
if (res) { if (res) {
var code = res.data.img; var code = res.data.img;
let base64 = 'data:image/jpeg;base64,' + code let base64 = 'data:image/jpeg;base64,' + code
this.imageSrc = base64.replace(/[\r\n]/g, "") imageSrc.value = base64.replace(/[\r\n]/g, "")
this.uuid = res.data.uuid uuid.value = res.data.uuid
} }
}).catch(error => {
showErrorMessage(error)
}) })
} }
}
}
</script> </script>
<style> <style>

Loading…
Cancel
Save