第二章 宠物预约医疗项目实战-注册实现
文章目录 【微信小程序开发】宠物预约医疗项目实战-注册实现前言一、打开项目文件二、编写wxss代码2.1 什么是wxss2.2 配置主程序全局样式 三. 在sign文件下的wxml文件中编写如下代码并保存四 .sign.js文件代码编写如下4.1 js函数使用4.2 全局变量与局部变量使用4.3 request方法请求接口的使用4.4 在sign.ts中引入全局配置4.5. 代码编写4.6. 运行 总结注册是指向某个平台、网站或应用程序提供您的个人信息以获取账户的过程。注册对于现代社会的人们来说非常重要,以下是几个原因:
方便性:注册后,您可以随时登录到您的账户,使您能够方便地管理和使用平台的服务和功能。
个性化服务:许多网站和应用程序需要您提供个人信息以提供个性化的服务,例如推荐商品或根据您的兴趣推送内容。
安全性:通过注册,您可以创建一个账户和密码,使您的个人信息更安全。此外,许多网站和应用程序要求您使用多种安全措施,例如启用两步验证(2FA)等。
沟通:注册后,您可以参与交流、评论或定期接收电子邮件通知,这有助于您跟进相关信息和最新动态。
授权:某些平台需要您注册才能提供访问内容或服务的授权,例如社交媒体平台或在线购物网站。
总之,注册是连接您和平台、网站和应用程序的重要步骤,可以为您提供许多方便、个性化的服务,并加强您的个人安全。`
1.在pages里新建注册页面然后ctrl+s保存
"pages/sign/sign", 1
2.确认登录页面被新建出来
wxss文件是微信小程序中的样式文件,用于定义小程序页面的样式和布局。与CSS类似,wXss文件支持选择器、属性和值等基本语法,但是它有着自己的特点和限制。例如,wXss不支持外部链接和@import语句,需要直接在文件中定义所有样式。此外,wXss还支持一些微信小程序特有的样式属性,例如rpx(响应式像素)用于适配不同屏幕大小的移动设备。 大家可以理解为是css
/**app.wxss**/ .container { display: flex; flex-direction: column; align-items: center; box-sizing: border-box; } button { background: initial; } button:focus{ outline: 0; } button::after{ border: none; } page { background: #f6f6f6; display: flex; flex-direction: column; justify-content: flex-start; } .userinfo, .uploader, .tunnel { margin-top: 40rpx; height: 140rpx; width: 100%; background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); border-left: none; border-right: none; display: flex; flex-direction: row; align-items: center; transition: all 300ms ease; } .userinfo-avatar { width: 100rpx; height: 100rpx; margin: 20rpx; border-radius: 50%; background-size: cover; background-color: white; } .userinfo-avatar:after { border: none; } .userinfo-nickname { font-size: 32rpx; color: #007aff; background-color: white; background-size: cover; } .userinfo-nickname::after { border: none; } .uploader, .tunnel { height: auto; padding: 0 0 0 40rpx; flex-direction: column; align-items: flex-start; box-sizing: border-box; } .uploader-text, .tunnel-text { width: 100%; line-height: 52px; font-size: 34rpx; color: #007aff; } .uploader-container { width: 100%; height: 400rpx; padding: 20rpx 20rpx 20rpx 0; display: flex; align-content: center; justify-content: center; box-sizing: border-box; border-top: 1px solid rgba(0, 0, 0, 0.1); } .uploader-image { width: 100%; height: 360rpx; } .tunnel { padding: 0 0 0 40rpx; } .tunnel-text { position: relative; color: #222; display: flex; flex-direction: row; align-content: center; justify-content: space-between; box-sizing: border-box; border-top: 1px solid rgba(0, 0, 0, 0.1); } .tunnel-text:first-child { border-top: none; } .tunnel-switch { position: absolute; right: 20rpx; top: -2rpx; } .disable { color: #888; } .service { position: fixed; right: 40rpx; bottom: 40rpx; width: 140rpx; height: 140rpx; border-radius: 50%; background: linear-gradient(#007aff, #0063ce); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); display: flex; align-content: center; justify-content: center; transition: all 300ms ease; } .service-button { position: absolute; top: 40rpx; } .service:active { box-shadow: none; } .request-text { padding: 20rpx 0; font-size: 24rpx; line-height: 36rpx; word-break: break-all; }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156=<view class="container"> <image src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F201502%2F24%2F20150224235124_vda4m.thumb.1000_0.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1677326688&t=b461a24be6ba1e8736e3bb9c525f925f"></image> </view> <view class="login_box"> <view class="section"> <input placeholder="请输入用户名" placeholder-class="color" bindblur='username' /> </view> <view class="section"> <input type='number' maxlength='11' placeholder="请输入手机号" placeholder-class="color" bindblur='mobile' /> <image src=""></image> </view> <view class="section"> <input password="true" placeholder="请输入密码" placeholder-class="color" bindblur='pass1' /> <image src=""></image> </view> <view class="section"> <input password="true" placeholder="确认密码" placeholder-class="color" bindblur='pass2' /> <image src=""></image> </view> <button class="login1" type="primary" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">用户注册</button> <button class="register" type="warn" open-type="getUserInfo" bindgetuserinfo="okzhuche">已有账号/登录</button> <!--底部确认--> <view class="shen_title"> <image class="about" src="" />使用申明 </view> <view class="des">1. 在未经您同意及确认之前,本程序不会将您的注册信息用于任何其它商业目的。</view> <view class="des">2. 本程序将对您的信息进行严格的保护</view> <view class="des">3. 请您放心使用!</view> </view>
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152此时保存后编译,你可以看见展示的效果,但是注册点击时没有效果的。原因在于,没有编写sign.js文件接入数据
涉及知识点:
js函数调用使用全局变量与局部变量使用request方法请求接口的使用下面我们一个一个来:
函数的定义与java不同:
函数名称+函数输入参数+花括号
比如下段:
onReady: function(a) { //函数体 }, 123
其中onReady为函数名称,function(a)为函数定义参数。多个参数通过,区分,如function(a,b)
代码亦可以简化为:
onReady(a) { //函数体 }, 123
页面的全局变量定义在data中,当需要获取data中的数据时,通常写法如下:
onReady: function(a) { //函数体 var a = this.data.username; }, 1234
我们将data中的username的值传给了var a局部变量
设置全局变量data的写法如下:
username(e) { this.setData({ username: e.detail.value }) }, 123456789
通过 this.setData({ ---- })的方式将传入函数中的值赋值给data中的username
注册的接口见先导篇中我提供的接口文档,下面带大家使用使用
1.登录接口文档地址:
点击进入文档地址
2. 找到用户增加接口
3.在app.ts和index.d.ts中引入域名接口并保存
mydata: { // ip:"http://127.0.0.1:9004/", ip:"http://122.51.174.157:9004/" }, 1234
在定义一个时间生成函数
time() { var date = new Date(); const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); const second = date.getSeconds(); var time = year + '-' + month + '-' + day + ' ' + hour + '时' + minute +'分'+ second+'秒'; return time; }, 1234567891011
整体代码编写为:
// app.ts App({ globalData: {}, mydata: { // ip:"http://127.0.0.1:9004/", ip:"http://122.51.174.157:9004/" }, time() { var date = new Date(); const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); const second = date.getSeconds(); var time = year + '-' + month + '-' + day + ' ' + hour + '时' + minute +'分'+ second+'秒'; return time; }, onLaunch() { // 展示本地存储能力 const logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorageSync('logs', logs) // 登录 wx.login({ success: res => { console.log(res.code) // 发送 res.code 到后台换取 openId, sessionKey, unionId }, }) }, })
12345678910111213141516171819202122232425262728293031323334// 获取应用实例 const app = getApp<IAppOption>() 12
如果你版本较低,文件为sign.js则引入
var app = getApp(); 1
// 获取应用实例 const app = getApp<IAppOption>() Page({ /** * 页面的初始数据 */ data: { username: '', //用户名 mobile: '', //手机号 pass1: '', //密码 pass2: '', //确认密码 }, // 用户名失去焦点 username(e) { this.setData({ username: e.detail.value }) }, // 手机号失去焦点 mobile(e) { this.setData({ mobile: e.detail.value }) }, // 密码失去焦点 pass1(e) { var pattern = /^[w_]{0,6}$/; //密码正则 if (!pattern.test(e.detail.value)) { this.setData({ pass1: '' }) wx.showToast({ title: '密码长度必须为0-6位,并且由字母,数字或下划线组成', icon: 'none', duration: 3000 }) } else { this.setData({ pass1: e.detail.value }) } }, // 确认密码失去焦点 pass2(e) { this.setData({ pass2: e.detail.value }) }, // 接种用户点击注册按钮 bindGetUserInfo: function(e){ if (e.detail.userInfo) { //用户按了允许授权按钮 wx.showLoading({ title: '正在注册...', }) if (this.data.username == '') { wx.showToast({ title: '用户名不能为空', icon: 'none', duration: 2000 }) } else if (this.data.mobile == '') { wx.showToast({ title: '手机号不能为空', icon: 'none', duration: 2000 }) } else if (!(/^1[3456789]d{9}$/.test(this.data.mobile))) { wx.showToast({ title: '手机号码格式有误,请重新输入!', icon: 'none', duration: 2000 }) } else if (this.data.pass1 == '') { wx.showToast({ title: '密码不能为空', icon: 'none', duration: 2000 }) } else if (this.data.pass2 == '') { wx.showToast({ title: '请再次输入密码', icon: 'none', duration: 2000 }) } else if (this.data.pass1 != this.data.pass2) { wx.showToast({ title: '两次密码输入不一致,请重新输入!', icon: 'none', duration: 2000 }) } else { var that = this // 注册这个账户之前,我们首先要做的就是查询一下这个集合表中是否已经存在过这个用户了 wx.request({ url: app.mydata.ip+'api/user/checkname', data: { username:this.data.username, }, header: { // 'content-type': 'application/json' 'content-type': 'application/x-www-form-urlencoded' }, method: 'POST', success: function(res) { console.log(res) if (res.data=='no') { //判断用户名是否被注册过,等于空说明没被查询到,就是没有注册过, //我写的数用户名和手机号都可以登录,所以同一个手机号和用户名只能算一个账号,也要验证一下手机号是否被注册过 wx.request({ url: app.mydata.ip+'api/user/checkphone', data: { phone:that.data.mobile, }, header: { // 'content-type': 'application/json' 'content-type': 'application/x-www-form-urlencoded' }, method: 'POST', success: function(res) { if (res.data == 'no') { //判断手机号是否被注册过,等于空说明没被查询到,就是没有注册过, wx.request({ url: app.mydata.ip+'api/user/register', data: { id:1, username:that.data.username, password:that.data.pass2, phone:that.data.mobile, root:1, sex:"男", birthTime:app.time() }, header: { 'content-type': 'application/json' }, method: 'GET', success: function(res) { if (res.data.code == 1) { //接口调取成功,也就是注册成功 // 这里面你可以加一下注册成功之后的逻辑,是直接登录也好,或者是跳到登录页面页面 wx.hideLoading(); wx.showToast({ title: '注册成功', icon: 'none' }) setTimeout(function() { wx.showLoading({ title: '正在跳转', }) setTimeout(function() { wx.hideLoading(); wx.navigateTo({ url: '../login/login', }) }, 300) }, 100) } } }) } else { wx.showToast({ title: '此手机号已被别人注册,换一个试试!', icon: 'none', duration: 2000 }) } } }) } else { wx.showToast({ title: '此用户名已被别人注册,换一个试试!', icon: 'none', duration: 2000 }) } } }) } } else { //用户按了拒绝按钮 wx.showModal({ title: '警告', content: '您点击了拒绝授权,将无法进行账号注册,请授权之后再注册!!!', showCancel: false, confirmText: '返回授权', success: function(res) {} }) } }, okzhuche: function() { setTimeout(function() { wx.showLoading({ title: '正在跳转', }) setTimeout(function() { wx.hideLoading(); app.globalData.register=true; }, 300) }, 100) wx.navigateTo({ url: "../login/login" }) }, /** * 生命周期函数--监听页面加载 */ onLoad: function(options) { }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function() { }, /** * 生命周期函数--监听页面显示 */ onShow: function() { }, /** * 生命周期函数--监听页面隐藏 */ onHide: function() { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function() { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function() { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function() { }, /** * 用户点击右上角分享 */ onShareAppMessage: function() { } })
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
1.打开改属性设置,原因是域名接口不是小程序授权接口
2.输入注册信息
3.确认注册
4.重新注册使用同账号或者同电话号码会被拦截
学习如逆水行舟,不进则退。视频教程于周内于哔哩哔哩更新,同学需提前熟悉代码与操作。
相关知识
基于Java+Vue+uniapp微信小程序宠物店商城系统设计和实现
基于Java+Vue+uniapp微信小程序宠物寄养平台设计和实现
基于微信小程序的宠物医院宠物健康管理系统(开题报告+源码)
宠物医院预约系统小程序开发
制作库存表小程序(教你微信小程序制作的流程)
宠物小程序开发功能与解决方案
java计算机毕业设计基于微信小程序的宠物小管家【附源码+远程部署+程序+mysql】
基于springboot+微信小程序实现宠物寄养交流平台演示【附项目源码+论文说明】分享
宠物医疗预约小程序开发
python+flask计算机毕业设计基于微信小程序的宠物商城(程序+开题+论文)
网址: 【微信小程序开发】宠物预约医疗项目实战 https://m.mcbbbk.com/newsview74121.html
上一篇: 河南专升本宠物医疗技术专业可报考 |
下一篇: 兽医在线问诊,氧宠博士小程序助你 |