提交 f6d66a54 编写于 作者: DCloud_JSON's avatar DCloud_JSON

完善文档的配置说明,修复账号登录限制11位了。注册的时候好像没限制的问题

上级 e09da5ed
......@@ -2,6 +2,7 @@ unpackage/
.hbuilderx
node_modules
.DS_Store
uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json
pages/grid/banner.json
pages/list/list.json
manifest.json
\ No newline at end of file
> baseapp目前还处于内测阶段,内测QQ群号:869926521,欢迎大家加入!内测期间享受有疑问实时解答的福利。
> 内测群反馈的已知问题,正在修复中
- [ ] 账号登录限制11位了。注册的时候好像没限制
- [ ] 缺了小程序授权登陆
- [ ] 服务端,应当加个空的config配置方便二开使用
- [ ] 密码注册把pwd2也存在本地了,暴露了密码
> base app目前还处于内测阶段,内测QQ群号:869926521,欢迎大家加入!内测期间享受有疑问实时解答的福利。
### 介绍
base app,是一个云端一体的、集成了商用项目开发常见功能的项目模板。
`base app`,是一个云端一体的、集成了商用项目开发常见功能的项目模板。
如果说uniCloud admin是管理端项目的基础模板,那么base app则是用户端、尤其是移动端的基础模板。
在HBuilderX新建项目时选择base app项目模板,在这个模板基础之上快速填充自己的业务,即可很快完成一个应用。
地址:[https://gitee.com/dcloud/base-app](https://gitee.com/dcloud/base-app)
#### 项目背景
我们一直想出一个结合uni-app、uniCloud和openDB以及uni-id和uniCloud admin等,uni全家桶的项目模板;
为了照顾各类应用的开发者,我们取交最终集罗列了如下功能,发现这些就是除业务逻辑外的项目基本功能并把它命名为baseapp
为了照顾各类应用的开发者,我们取交最终集罗列了如下功能,发现这些就是除业务逻辑外的项目基本功能并把它命名为`base app`
### base app集成的功能包括:
1. 个人中心:登录注册(含用户名密码登录、手机号验证码登录、app一键登陆、微信登录、Apple登录、支付宝小程序登录)、修改密码、忘记密码、头像更换、昵称修改、积分查看、指纹绑定、退出
......@@ -33,31 +28,39 @@ base app将节省开发者大量的时间,让开发者集中精力在自己的
有了base app,再加上schema2code生成前端页面,一个简单应用就可以快速完成。
base app + uniCloud admin,应用开发从未如此简单快捷!
#### 时序介绍
初始化应用执行appInit
读取baseapp.config并挂载到globalData的config下
读取应用版本号,检查是否有可更新的版本。并存到globalData下
使用[拦截器](https://uniapp.dcloud.io/api/interceptor?id=addinterceptor)
实现了,1、路由拦截。2、摄像头/相册权限,引导跳到设置界面
监听网络的变化与toast方式提醒
预登陆一键登录功能
全局监听clientDB的err事件,判断是否为token过期失效等需要重新登陆的问题。自动跳转到登陆页面
判断入口页是否为强制登陆页面,Y.检测本地的token是否有效(存在且并未过期)否则跳转到登陆页面
### 应用配置
cloudfunctions
└─────common 公共模块
│ └─uni-config-center // baseapp的服务端配置中心,项目所有云函数的配置在这里填写
│ ├─index.js // config-center入口文件
│ └─uni-id // 插件uni-id对应的目录
│ ├─config.json // uni-id对应的配置文件
│ └─file.cert // uni-id依赖的其他文件,假如你使用微信发红包功能,需要的证书文件就是放到这里
├─ baseconfig // baseapp的前端的配置文件,项目所有模块的配置在这里填写。详见该文件的代码注释。
└─ manifest.json // 配置应用名称、appid、logo、版本等打包信息,[详情](https://uniapp.dcloud.io/collocation/manifest)
完整的uni-app目录结构[详情](https://uniapp.dcloud.io/frame?id=%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84)
#### 1. manifest.json配置
#### 应用配置
| |_cloudfunctions
| |_common
| |_uni-config-center
| |_uni-id
| |_config.json
|- baseconfig
|- manifest.json
### 界面如下:
完成如下配置:
- App模块配置 --> OAuth(登录鉴权)--> 勾选微信登录 --> 填写`appid``appsecret``ios平台通用链接`
- App模块配置 --> OAuth(登录鉴权)勾选`苹果登录`[IOS苹果授权登录参考文档](https://ask.dcloud.net.cn/article/36651)。如不发布到Appstore,不需要配置此项
- App模块配置 --> Share(分享)--> 微信分享 --> 填写`appid``ios平台通用链接`
- App常用其他设置 --> 填写关联域Associated Domains [参考教程](https://ask.dcloud.net.cn/article/36393)。如不发布到Appstore,不需要配置此项
#### 2. uni-id配置
在项目目录`uniCloud`--> `cloudfunctions`--> `common`--> `uni-config-center`--> `uni-id`--> `config.json`文件里:
- 微信登录填写`appid``appsecret`,在微信开放平台查看,[微信开放平台](https://open.weixin.qq.com/)
- 苹果登录需要配置,`app-plus`--> `oauth`--> `apple`,填写包名`bundleId`
### 界面如下:
## 项目构成
#### baseapp中的主要模块介绍
1. uni-id用户体系 [uni-id](https://uniapp.dcloud.io/uniCloud/uni-id)
2. uniCloud 配置中心 [uni-config-center](https://ext.dcloud.net.cn/plugin?id=4425)
2. 分享功能插件 [uni-share](https://ext.dcloud.net.cn/plugin?id=4860)
3. 升级中心 [uni-upgrade-center](https://ext.dcloud.net.cn/plugin?id=4542)
4. 云端一体搜索模板 [uni-search-template](https://ext.dcloud.net.cn/plugin?id=3851)
......@@ -66,11 +69,22 @@ base app + uniCloud admin,应用开发从未如此简单快捷!
1. [limeClipper](https://ext.dcloud.net.cn/plugin?id=3594) @作者: 陌上华年
2. [Sansnn-uQRCode](https://ext.dcloud.net.cn/plugin?id=1287) @作者: 3snn
#### 时序介绍
初始化应用执行appInit
读取baseapp.config并挂载到globalData的config下
读取应用版本号,检查是否有可更新的版本。并存到globalData下
使用[拦截器](https://uniapp.dcloud.io/api/interceptor?id=addinterceptor)
实现了,1、路由拦截。2、摄像头/相册权限,引导跳到设置界面
监听网络的变化与toast方式提醒
预登陆一键登录功能
全局监听clientDB的err事件,判断是否为token过期失效等需要重新登陆的问题。自动跳转到登陆页面
判断入口页是否为强制登陆页面,Y.检测本地的token是否有效(存在且并未过期)否则跳转到登陆页面
## 真机体验快速部署流程
#### 1. 开通uniCloud
- 开通uniCloud:本项目是云端一体的,它的云端代码需要部署在uniCloud云服务空间里,需要开通uniCloud。在[https://unicloud.dcloud.net.cn/](https://unicloud.dcloud.net.cn/)登录,按云厂商要求进行实名认证。
- 开通`uniCloud`:本项目是云端一体的,它的云端代码需要部署在uniCloud云服务空间里,需要开通uniCloud。在[https://unicloud.dcloud.net.cn/](https://unicloud.dcloud.net.cn/)登录,按云厂商要求进行实名认证。
- 在uniCloud认证通过后,创建一个服务空间给本项目使用。选择阿里云或腾讯云均可。[参考](https://uniapp.dcloud.net.cn/uniCloud/price)
- 使用HBuilderX 3.1以上版本(最好是最新版),把本项目导入到HBuilderX中,在项目根目录uniCloud上点右键菜单,关联服务空间 -> 选择之前创建的服务空间
......@@ -136,56 +150,8 @@ base app + uniCloud admin,应用开发从未如此简单快捷!
以上业务都有审核周期,请提前处理。
### 配置参数
#### 1. manifest.json配置
完成如下配置:
- App模块配置 --> OAuth(登录鉴权)--> 勾选微信登录 --> 填写`appid``appsecret``ios平台通用链接`(如不发布到Appstore,不需要填通用链接)
- App模块配置 --> OAuth(登录鉴权)勾选`苹果登录`[IOS苹果授权登录参考文档](https://ask.dcloud.net.cn/article/36651)。如不发布到Appstore,不需要配置此项
- App模块配置 --> Share(分享)--> 微信分享 --> 填写`appid``ios平台通用链接`(如不发布到Appstore,不需要填通用链接。)
- App常用其他设置 --> 填写关联域Associated Domains [参考教程](https://ask.dcloud.net.cn/article/36393)。如不发布到Appstore,不需要配置此项
#### 2. uni-id配置
在项目目录`uniCloud`--> `cloudfunctions`--> `common`--> `uni-config-center`--> `uni-id`--> `config.json`文件里:
- 微信登录填写`appid``appsecret`,在微信开放平台查看,[微信开放平台](https://open.weixin.qq.com/)
- 苹果登录需要配置,`app-plus`--> `oauth`--> `apple`,填写包名`bundleId`
#### 3. 申请接入微信商户支付
在项目目录`uniCloud`--> `cloudfunctions`目录
- `minectrl`--> `controller`--> `mine.js`配置如下:
- `uni-admin`--> `controller`--> `admin.js`配置如下:
```js
appid: 'wxxxxxxxxxxxxxxx', //公众号id
mchid: '00000000000', //商户id
partnerKey: 'xxxxxxxxxxxxxxxxxxxxx', //安全密钥
```
教程参考,[微信App支付功能申请](https://uniapp.dcloud.net.cn/api/plugins/payment?id=app%e5%b9%b3%e5%8f%b0%e6%94%af%e4%bb%98%e6%b5%81%e7%a8%8b)
`uniCloud`--> `cloudfunctions`目录点右键,上传所有云函数及公共模块。
#### 5. 配置分享下载链接
裂变拉新是必要的传播手段,本项目集成了DCloud的[应用发行平台](https://www.dcloud.io/dportal.html)服务,直接提供了分享下载的功能。
1. 申请开通m3w服务:加入qq群645630288,向管理员提供appid,管理员审核
2. 在HBuilderX中选择好本项目,点菜单发行 -> 生成统一发布页面,在新界面上传图文介绍,就会得到一个短网址
3. 在项目根目录`common`--> `globalunit.js`里面修改`downloadurl`下载地址为上一步得到的短网址
#### 7. APP云打包
IOS和Android云打包,配置正确的包名,勾选广告,打包。
IOS和Android云打包,配置正确的包名,打包。
注意:打包安卓或者苹果时,需要在开发者中心后台一键登录中配置相应平台的Android 包名或IOS BundleId 。
......
......@@ -35,20 +35,27 @@ module.exports = {
如果你需要在不同平台有不同的配置,直接用条件编译即可
*/
},
//关于应用
"about": {
//应用名称
"appName": "base-app",
//应用logo
"logo": "/static/logo.png",
//公司名称
"company": "数字天堂(北京)网络技术有限公司",
//口号
"slogan": "为开发而生",
//政策协议
"agreements": [{
"title": "用户服务协议",
"url": "https://ask.dcloud.net.cn/protocol.html"
"title": "用户服务协议", //协议名称
"url": "https://ask.dcloud.net.cn/protocol.html" //对应的网络链接
},
{
"title": "隐私政策",
"url": "https://ask.dcloud.net.cn/protocol.html"
}
],
//应用的链接,用于分享到第三方平台和生成关于我们页的二维码
"download": "https://m3w.cn/uniapp"
},
//用于打开应用市场评分界面
......
......@@ -91,10 +91,10 @@
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
"appid" : "",
"appid" : "wx81dbb061d2258234",
"setting" : {
"urlCheck" : false,
"es6" : true
"es6" : false
},
"usingComponents" : true,
"betterScopedSlots" : true
......
......@@ -19,7 +19,7 @@
<template v-else>
<uni-list-item class="get-data-state" v-if="data.length===0&&pagination.current===1">
<view slot="body">
<view class="f1" slot="body">
<!-- 数据为空 当前页码为1,且正在加载中;这里为了演示,更加直观的表达内部逻辑。商用项目建议将这部分封装为组件,更好的让业务逻辑与功能分离-->
<uni-load-more v-if="loading" status="loading"></uni-load-more>
<template v-else>
......@@ -210,5 +210,8 @@
width: 750rpx;
text-align: center;
}
.uni-list {}
.uni-list {}
.f1{
flex: 1;
}
</style>
......@@ -3,7 +3,7 @@
<!-- 顶部文字 -->
<text class="title">用户名密码登录</text>
<uni-agreements></uni-agreements>
<input type="number" class="input-box" :inputBorder="false" v-model="username" maxlength="11" placeholder="请输入手机号/用户名"></input>
<input type="number" class="input-box" :inputBorder="false" v-model="username" placeholder="请输入手机号/用户名"></input>
<input type="password" class="input-box" :inputBorder="false" v-model="password" placeholder="请输入密码"></input>
<button class="send-btn" :disabled="!canLogin" :type="canLogin?'primary':'default'" @click="pwdLogin">登录</button>
<!-- 忘记密码 -->
......
<template>
<view class="content">
<!-- 功能列表 -->
<uni-list class="mt10">
<uni-list class="mt10">
<uni-list-item title="个人资料" to="/pages/ucenter/userinfo/userinfo" link="navigateTo"></uni-list-item>
<uni-list-item v-if="userInfo.phone" title="修改密码" :to="'/pages/ucenter/login-page/pwd-retrieve/pwd-retrieve?phoneNumber='+ userInfo.phone" link="navigateTo"></uni-list-item>
</uni-list>
<uni-list-item v-if="userInfo.mobile" title="修改密码" :to="'/pages/ucenter/login-page/pwd-retrieve/pwd-retrieve?phoneNumber='+ userInfo.mobile" link="navigateTo"></uni-list-item>
</uni-list>
<!-- #ifndef H5 -->
<uni-list class="mt10">
<!-- #ifdef APP-PLUS -->
<!-- 检查push过程未结束不显示,push设置项 -->
......@@ -13,7 +14,8 @@
<!-- #endif -->
<uni-list-item v-if="supportMode.includes('fingerPrint')" title="指纹解锁" @click="startSoterAuthentication('fingerPrint')" link></uni-list-item>
<uni-list-item v-if="supportMode.includes('facial')" title="人脸解锁" @click="startSoterAuthentication('facial')" link></uni-list-item>
</uni-list>
</uni-list>
<!-- #endif -->
<!-- 退出/登陆 按钮 -->
<view class="bottom-back" @click="clickLogout">
......@@ -53,7 +55,7 @@
this.supportMode = res.supportMode
},
fail: (err) => {
reject(err);
console.log(err);
}
})
// #endif
......@@ -78,7 +80,7 @@
changePwd() {
uni.navigateTo({
url: '/pages/ucenter/login-page/pwd-retrieve/pwd-retrieve?phoneNumber='
+ (this.userInfo && this.userInfo.phone ? this.userInfo.phone : ''),
+ (this.userInfo && this.userInfo.mobile ? this.userInfo.mobile : ''),
fail: err => {
console.log(err);
}
......@@ -116,7 +118,8 @@
icon: 'none'
});
},
fail: (err) => {
fail: (err) => {
console.log(err);
console.log(`认证失败:${err.errCode}`);
uni.showToast({
title: `认证失败`,
......@@ -129,7 +132,7 @@
checkIsSoterEnrolledInDevice({checkAuthMode,title}) {
return new Promise((resolve, reject) => {
uni.checkIsSoterEnrolledInDevice({
checkAuthMode: checkAuthMode,
checkAuthMode,
success: (res) => {
if (res.isEnrolled) {
return resolve(res);
......@@ -140,7 +143,8 @@
});
reject(res);
},
fail: (err) => {
fail: (err) => {
console.log(err);
uni.showToast({
title: `${title}失败`,
icon: 'none'
......
......@@ -124,14 +124,6 @@ exports.main = async (event, context) => {
mobile: params.mobile,
code: params.code
});
// let verifyCode = await uniID.verifyCode({
// mobile: params.mobile,
// code: params.code
// })
// if (verifyCode.code === 0) {
// } else {
// res = verifyCode
// }
res = await uniID.bindMobile({
uid: params.uid,
mobile: params.mobile,
......@@ -159,8 +151,7 @@ exports.main = async (event, context) => {
username,
password,
gender,
nickname,
password
nickname
});
if (res.code === 0) {
await registerSuccess(res.uid)
......
......@@ -12,19 +12,19 @@
"tokenExpiresIn": 2592000,
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
"appid": "wxffdd8fa6ec4ef2a0",
"appsecret": "6c9119430d7be0a147bcbbb73ef33acf"
},
"apple": {
"bundleId": ""
"bundleId": "io.dcloud.hellouniapp"
}
}
},
"mp-weixin": {
"oauth": {
"weixin": {
"appid": "",
"appsecret": ""
"appid": "wx999bf02c8e05dfc9",
"appsecret": "b5f608afd332b2c0ded7e6b98ca4ccd3"
}
}
},
......@@ -38,15 +38,15 @@
},
"service": {
"sms": {
"name": "",
"name": "DCloud",
"codeExpiresIn": 300,
"smsKey": "",
"smsSecret": ""
"smsKey": "71a19f38c954f7d768d68a050486bf15",
"smsSecret": "d6c424b702d73baa3b6e1a1452469213"
},
"univerify": {
"appid": "",
"apiKey": "",
"apiSecret": ""
"appid": "__UNI__03B096E",
"apiKey": "3fc28519d90d74173bcecf2daf4ffcc4",
"apiSecret": "dd793e5bc4b372ce932f35bbb4c5d61b"
}
}
}
\ No newline at end of file
......@@ -9,7 +9,6 @@
</uni-collapse-item>
</uni-collapse>
</view>
<uni-nodata v-else :isLoading="isLoading" @retry="refreshData"></uni-nodata>
</unicloud-db>
<uni-fab ref="fab" horizontal="right" vertical="bottom" :pop-menu="false" @fabClick="fabClick" />
</view>
......
......@@ -14,7 +14,6 @@
</uni-list-item>
</uni-list>
</view>
<uni-nodata v-else :isLoading="isLoading" @retry="refreshData"></uni-nodata>
<uni-load-more v-if="data.length>10" :status="loading?'loading':(hasMore ? 'more' : 'noMore')"></uni-load-more>
</unicloud-db>
</view>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册