uni-starter是uniapp的得意之作,与uni-admin一起组成了uni程序的根骨。学习和应用uniapp,当先了解uni-starter。然而uni-starter的版本太多,更新又太快,所以我们只能以当前(2023-8-16)的最新版V2.1.4为例,说明之。
1、生成一个新项目,比如 LoginDemo,具体操作如下:
注意:一定要选uni-starter,因为它是实用项目的基础前台
2、新建的项目,并不能成功运行,还须要配置一点东西。在项目自动生成完成之后,点开这个项目(以后称之为LoginDemo),点中一个件夹,点右键:
选择“打开uniCloud Web控制台”菜单,进入这个控制台
点开“帐号管理"
点开”应用管理"
iOS看起来相当简单,但是我们暂时不处理
先记下一键登录的 AppKey和AppSecret,一会要用
这个要审批,但是通常会过。
这个短信的smskey和smsSecret也要记下来,后面有用
4、修改 LoginDemo 的后台程序:
这里的sms就是短信配置,univerify就是一键登录,把前面取得的参数,填写到上面,就可以运行了。当然微信、QQ、支付宝登录等,还是不能用的。这些需要第三方的支持,不是我们短时间可以的!
其实这个版本还有问题的,就是不断的闪!
这个工程,理论上第一个要执行的文件就是main.js。
main.js
是 uni-app 的入口文件,主要作用是初始化 vue
实例、定义全局组件、使用需要的插件如 vuex。首先引入了 Vue
库和 App.vue
,创建了一个 vue
实例,并且挂载 vue
实例。
import App from './App'
import i18n from './lang/i18n'
// #ifndef VUE3
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
i18n,
...App
})
app.$mount() //挂载 Vue 实例
// #endif
// #ifdef VUE3
import {createSSRApp} from 'vue'
export function createApp() {
const app = createSSRApp(App)
app.use(i18n)
return {app}
}
// #endif
App.vue
是uni-app的主组件,所有页面都是在 App.vue
下进行切换的,是页面入口文件。但 App.vue
本身不是页面,这里不能编写视图元素,也就是没有 。这个文件的作用包括:调用应用生命周期函数、配置全局样式、配置全局的存储globalData。应用生命周期仅可在
App.vue
中监听,在页面监听无效。
<script>
import initApp from '@/common/appInit.js';
import openApp from '@/common/openApp.js';
// #ifdef H5
openApp() //创建在h5端全局悬浮引导用户下载app的功能
// #endif
import checkIsAgree from '@/pages/uni-agree/utils/uni-agree.js';
import uniIdPageInit from '@/uni_modules/uni-id-pages/init.js';
export default {
globalData: { //整体变量
searchText: '', //字符串
appVersion: {}, //对像
config: {},
$i18n: {}, //函数
$t: {} //函数
},
onLaunch: function() {
console.log('App Launch')
this.globalData.$i18n = this.$i18n
this.globalData.$t = str => this.$t(str) //从来没有用过 globalData.$t
initApp();
uniIdPageInit();
// #ifdef APP-PLUS
//checkIsAgree(); APP端暂时先用原生默认生成的。目前,自定义方式启动vue界面时,原生层已经请求了部分权限这并不符合国家的法规
// #endif
// #ifdef H5
// checkIsAgree(); // 默认不开启。目前全球,仅欧盟国家有网页端同意隐私权限的需要。如果需要可以自己去掉注视后生效
// #endif
// #ifdef APP-PLUS
//idfa有需要的用户在应用首次启动时自己获取存储到storage中
/*var idfa = '';
var manager = plus.ios.invoke('ASIdentifierManager', 'sharedManager');
if(plus.ios.invoke(manager, 'isAdvertisingTrackingEnabled')){
var identifier = plus.ios.invoke(manager, 'advertisingIdentifier');
idfa = plus.ios.invoke(identifier, 'UUIDString');
plus.ios.deleteObject(identifier);
}
plus.ios.deleteObject(manager);
console.log('idfa = '+idfa);*/
// #endif
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style>
/*每个页面公共css */
</style>
知识点:
- 如何定义整体变量,函数?
- 如何进行多语言设置? this.$t用法?
import uniStarterConfig from '@/uni-starter.config.js';
//应用初始化页
// #ifdef APP-PLUS
import checkUpdate from '@/uni_modules/uni-upgrade-center-app/utils/check-update';
import callCheckVersion from '@/uni_modules/uni-upgrade-center-app/utils/call-check-version';
// 实现,路由拦截。当应用无访问摄像头/相册权限,引导跳到设置界面 https://ext.dcloud.net.cn/plugin?id=5095
import interceptorChooseImage from '@/uni_modules/json-interceptor-chooseImage/js_sdk/main.js';
interceptorChooseImage()
// #endif
const db = uniCloud.database()
export default async function() {
const debug = uniStarterConfig.debug;
// uniStarterConfig挂载到getApp().globalData.config
setTimeout(() => {
getApp({allowDefault: true}).globalData.config = uniStarterConfig;
//getApp 函数用于获取当前应用实例,一般用于获取globalData。
}, 1)
// 初始化appVersion(仅app生效)
initAppVersion();
//clientDB的错误提示
// 错误码详见https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=returnvalue code
function onDBError({code, message}) {
console.log('onDBError', {code,message});
console.error(code, message);
}
// 绑定clientDB错误事件
db.on('error', onDBError)
//拦截云对象请求 objectName:云对象名称,methodName:云对象的方法名称,params:参数列表
uniCloud.interceptObject({
async invoke({objectName, methodName, params})
{
console.log('interceptObject',{
objectName, // 云对象名称
methodName, // 云对象的方法名称
params // 参数列表
});
if(objectName == "uni-id-co" && (methodName.includes('loginBy') || ['login','registerUser'].includes(methodName) )){
console.log('执行登录相关云对象');
params[0].inviteCode = await new Promise((callBack) => {
uni.getClipboardData({
success: function(res) {
console.log('剪切板内容:'+res.data);
if (res.data.slice(0, 18) == 'uniInvitationCode:') {
let uniInvitationCode = res.data.slice(18, 38)
console.log('当前用户是其他用户推荐下载的,推荐者的code是:' + uniInvitationCode);
// uni.showModal({
// content: '当前用户是其他用户推荐下载的,推荐者的code是:'+uniInvitationCode,
// showCancel: false
// });
callBack(uniInvitationCode)
//当前用户是其他用户推荐下载的。这里登记他的推荐者id 为当前用户的myInviteCode。判断如果是注册
} else {
callBack()
}
},
fail() {
console.log('error--');
callBack()
},
complete() {
// #ifdef MP-WEIXIN
uni.hideToast()
// #endif
}
});
})
// console.log(params);
}
// console.log(params);
},
success(e) {
console.log(e);
},
complete() {
},
fail(e){
console.error(e);
// if (debug) {
// uni.showModal({
// content: JSON.stringify(e),
// showCancel: false
// });
// }else{
// uni.showToast({
// title: '系统错误请稍后再试',
// icon:'error'
// });
// }
}
})
// #ifdef APP-PLUS
// 监听并提示设备网络状态变化
uni.onNetworkStatusChange(res => {
console.log(res.isConnected);
console.log(res.networkType);
if (res.networkType != 'none') {
uni.showToast({
title: '当前网络类型:' + res.networkType,
icon: 'none',
duration: 3000
})
} else {
uni.showToast({
title: '网络类型:' + res.networkType,
icon: 'none',
duration: 3000
})
}
});
// #endif
}
/**
* // 初始化appVersion
*/
function initAppVersion() {
// #ifdef APP-PLUS
let appid = plus.runtime.appid;
plus.runtime.getProperty(appid, (wgtInfo) => {
let appVersion = plus.runtime;
let currentVersion = appVersion.versionCode > wgtInfo.versionCode ? appVersion : wgtInfo;
getApp({allowDefault: true}).appVersion = {
...currentVersion,
appid,
hasNew: false
}
// 检查更新小红点
callCheckVersion().then(res => {
// console.log('检查是否有可以更新的版本', res);
if (res.result.code > 0) {
// 有新版本
getApp({allowDefault: true}).appVersion.hasNew = true;
console.log(checkUpdate());
}
})
});
// 检查更新
// #endif
}
知识点:
- 初始数据库 const db = uniCloud.database()
- 获取当前应用实例 getApp({allowDefault: true})
- 绑定clientDB错误事件 db.on(‘error’, onDBError)
- 拦截云对象请求 uniCloud.interceptObject
- 监听并提示设备网络状态变化 uni.onNetworkStatusChange
- 如何取得工程appid appid = plus.runtime.appid;
- 如何取得工程的版本号 plus.runtime.getProperty
//这是应用的配置页面,App.vue挂载到getApp().globalData.config
export default {
"h5": {
"url": "https://uni-starter.dcloud.net.cn", // 前端网页托管的域名
// 在h5端全局悬浮引导用户下载app的功能 更多自定义要求在/common/openApp.js中修改
"openApp": { //如不需要本功能直接移除本节点即可
// //点击悬浮下载栏后打开的网页链接
// "openUrl": '/#/pages/ucenter/invite/invite',
// //左侧显示的应用名称
// "appname": 'uni-starter',
// //应用的图标
// "logo": './static/logo.png',
}
},
"mp": {
"weixin": {
//微信小程序原始id,微信小程序分享时
"id": ""
}
},
//关于应用
"about": {
//应用名称
"appName": "uni-starter",
//应用logo
"logo": "/static/logo.png",
//公司名称
"company": "数字天堂(北京)网络技术有限公司",
//口号
"slogan": "为开发而生",
//应用的链接,用于分享到第三方平台和生成关于我们页的二维码
"download": "https://itunes.apple.com/cn/app/hello-uni-app/id1417078253?mt=8",
//version
"version":"1.0.0" //用于非app端显示,app端自动获取
},
"download":{ //用于生成二合一下载页面
"ios":"https://itunes.apple.com/cn/app/hello-uni-app/id1417078253?mt=8",
"android":"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-97fca9f2-41f6-449f-a35e-3f135d4c3875/6d754387-a6c3-48ed-8ad2-e8f39b40fc01.apk"
},
//用于打开应用市场评分界面
"marketId":{
"ios":"",
"android":""
},
//配置多语言国际化。i18n为英文单词 internationalization的首末字符i和n,18为中间的字符数 是“国际化”的简称
"i18n":{
"enable":false //默认关闭,国际化。如果你想使用国际化相关功能,请改为true
}
}
看起来,这是一个配置文件