123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- // 参考文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/permission.html
- const app = getApp()
- const sliderWidth = 96
- Page({
- onShareAppMessage() {
- return {
- title: '权限管理',
- path: 'packageCloud/pages/database/db-permission/db-permission'
- }
- },
- data: {
- theme: 'light',
- openid: '',
- permissions: ['仅创建者可写,所有人可读', '仅创建者可读写', '仅管理端可写,所有人可读', '仅管理端可读写'],
- currentPermissionIndex: 0,
- tabs: [
- ['我的个性签名', '阿白的个性签名'],
- ['我的邮箱', '阿绿的邮箱'],
- [],
- [],
- ],
- activeTabIndex: 0,
- sliderOffset: 0,
- sliderLeft: 0,
- querying: false,
- updating: false,
- hasMyWhatsUp: false,
- myWhatsUp: '',
- adminWhatsUp: '',
- myEmail: '',
- adminEmail: '',
- hasProduct: false,
- product: {},
- serverData: '',
- },
- onLoad() {
- this.setData({
- theme: wx.getSystemInfoSync().theme || 'light'
- })
- if (wx.onThemeChange) {
- wx.onThemeChange(({theme}) => {
- this.setData({theme})
- })
- }
- if (app.globalData.openid) {
- this.setData({
- openid: app.globalData.openid
- })
- } else {
- wx.showLoading({
- title: '正在初始化...'
- })
- app.getUserOpenIdViaCloud()
- .then(openid => {
- this.setData({
- openid
- })
- wx.hideLoading()
- return openid
- }).catch(err => {
- console.error(err)
- wx.hideLoading()
- wx.showModal({
- content: '初始化失败,请检查网络',
- showCancel: false
- })
- })
- }
- const {
- myWhatsUp, adminWhatsUp, myEmail, adminEmail
- } = app.globalData
- this.setData({
- hasMyWhatsUp: !!myWhatsUp,
- myWhatsUp: myWhatsUp || '',
- adminWhatsUp: adminWhatsUp || '',
- myEmail: myEmail || '',
- adminEmail: adminEmail || '',
- })
- this.initTabs()
- },
- initTabs() {
- const currentPermissionIndex = this.data.currentPermissionIndex
- const tabLength = this.data.tabs[currentPermissionIndex].length
- const that = this
- wx.getSystemInfo({
- success(res) {
- that.setData({
- sliderLeft: (res.windowWidth / tabLength - sliderWidth) / 2,
- sliderOffset: (res.windowWidth / tabLength) * that.data.activeTabIndex
- })
- }
- })
- },
- onTabClick(e) {
- this.setData({
- sliderOffset: e.currentTarget.offsetLeft,
- activeTabIndex: Number(e.currentTarget.id)
- })
- },
- onPermissionChange(e) {
- const oldIndex = this.data.currentPermissionIndex
- const newIndex = Number(e.detail.value)
- if (oldIndex !== newIndex) {
- this.setData({
- currentPermissionIndex: Number(newIndex),
- activeTabIndex: 0
- })
- this.initTabs()
- }
- },
- bindInput(e) {
- const {name} = e.currentTarget.dataset
- this.setData({
- [name]: e.detail.value
- })
- },
- showErrorModal(name, err) {
- let errMsg = `${name}失败`
- if (err.toString().indexOf('permission denied') >= 0) {
- errMsg += ':无权限操作'
- }
- wx.showModal({
- content: errMsg,
- showCancel: false
- })
- },
- // 根据 openid 获取第一条数据
- queryOneByOpenId(collection, openid, options = {
- showLoading: false,
- showError: false,
- success: null,
- fail: null
- }) {
- const {
- showLoading, showError, success: successCallback, fail: failCallback
- } = options
- if (showLoading) {
- this.setData({
- querying: true
- })
- }
- const db = wx.cloud.database()
- const _openid = openid || this.data.openid
- db.collection(collection).where({
- _openid
- }).get({
- success: res => {
- console.log('[数据库] [查询记录] 成功: ', res)
- const resFirstData = res.data[0] || {}
- // 返回的不是要查询用户的记录,是由于没有读权限,视为查询失败
- if (resFirstData._openid && resFirstData._openid !== _openid) {
- const err = new Error('database permission denied')
- if (showError) this.showErrorModal('获取', err)
- if (failCallback) failCallback.call(this, err)
- } else if (successCallback) {
- successCallback.call(this, res.data[0])
- }
- },
- fail: err => {
- if (showError) this.showErrorModal('获取', err)
- console.error('[数据库] [查询记录] 失败:', err)
- if (failCallback) failCallback.call(this, err)
- },
- complete: () => {
- if (showLoading) {
- this.setData({
- querying: false
- })
- }
- }
- })
- },
- // 根据 openid 更新数据
- updateOneByOpenId(collection, openid, data, options = {
- showLoading: false,
- showError: false,
- success: null,
- fail: null
- }) {
- const {
- showLoading, showError, success: successCallback, fail: failCallback
- } = options
- if (showLoading) {
- this.setData({
- updating: true
- })
- }
- const db = wx.cloud.database()
- // 限制每人仅存一条记录,先查询是否已存在记录
- this.queryOneByOpenId(collection, openid || '', {
- success: dbData => {
- if (dbData) { // 已有数据,进行更新操作
- db.collection(collection).doc(dbData._id).update({
- data,
- success: res => {
- console.log('[数据库] [更新记录] 成功: ', res)
- if (successCallback) successCallback.call(this, res.stats)
- },
- fail: err => {
- if (showError) this.showErrorModal('设置', err)
- console.error('[数据库] [更新记录] 失败:', err)
- if (failCallback) failCallback.call(this, err)
- },
- complete: () => {
- if (showLoading) {
- this.setData({
- updating: false
- })
- }
- }
- })
- } else if (!openid || openid === this.data.openid) { // 还没有插入过数据且要操作的是自己的数据,进行新增操作
- db.collection(collection).add({
- data,
- success: res => {
- console.log('[数据库] [新增记录] 成功:', res)
- if (successCallback) successCallback.call(this, {_id: res._id})
- },
- fail: err => {
- if (showError) this.showErrorModal('设置', err)
- console.error('[数据库] [新增记录] 失败:', err)
- if (failCallback) failCallback.call(this, err)
- },
- complete: () => {
- if (showLoading) {
- this.setData({
- updating: false
- })
- }
- }
- })
- } else {
- const err = new Error('database permission denied')
- if (showError) this.showErrorModal('设置', err)
- if (failCallback) failCallback.call(this, err)
- if (showLoading) {
- this.setData({
- updating: false
- })
- }
- }
- },
- fail: err => {
- if (showError) this.showErrorModal('设置', err)
- if (failCallback) failCallback.call(this, err)
- if (showLoading) {
- this.setData({
- updating: false
- })
- }
- }
- })
- },
- // perm1:仅创建者可写,所有人可读
- queryMyWhatsUp() {
- this.queryOneByOpenId('perm1', '', {
- showLoading: true,
- showError: true,
- success: data => {
- const content = (data && data.whatsUp) || ''
- wx.showModal({
- title: '获取成功',
- content: content ? `个性签名为:${content}` : '个性签名为空',
- showCancel: false
- })
- }
- })
- },
- updateMyWhatsUp() {
- const data = {
- whatsUp: this.data.myWhatsUp
- }
- this.updateOneByOpenId('perm1', '', data, {
- showLoading: true,
- showError: true,
- success: () => {
- app.globalData.myWhatsUp = this.data.myWhatsUp
- this.setData({
- hasMyWhatsUp: true
- })
- wx.showModal({
- content: '设置成功',
- showCancel: false
- })
- }
- })
- },
- queryAdminWhatsUp() {
- this.queryOneByOpenId('perm1', 'kiki', {
- showLoading: true,
- showError: true,
- success: data => {
- const content = (data && data.whatsUp) || ''
- wx.showModal({
- title: '获取成功',
- content: content ? `个性签名为:${content}` : '个性签名为空',
- showCancel: false
- })
- }
- })
- },
- updateAdminWhatsUp() {
- const data = {
- whatsUp: this.data.adminWhatsUp
- }
- this.updateOneByOpenId('perm1', 'kiki', data, {
- showLoading: true,
- showError: true,
- success: res => {
- if (res.updated === 0) {
- wx.showModal({
- content: '设置失败:无权限操作',
- showCancel: false
- })
- } else {
- app.globalData.adminWhatsUp = this.data.adminWhatsUp
- wx.showModal({
- content: '设置成功',
- showCancel: false
- })
- }
- }
- })
- },
- // perm2:仅创建者可读写
- queryMyEmail() {
- this.queryOneByOpenId('perm2', '', {
- showLoading: true,
- showError: true,
- success: data => {
- const content = (data && data.email) || ''
- wx.showModal({
- title: '获取成功',
- content: content ? `邮箱为:${content}` : '邮箱为空',
- showCancel: false
- })
- }
- })
- },
- updateMyEmail() {
- const data = {
- email: this.data.myEmail
- }
- this.updateOneByOpenId('perm2', '', data, {
- showLoading: true,
- showError: true,
- success: () => {
- app.globalData.myEmail = this.data.myEmail
- wx.showModal({
- content: '设置成功',
- showCancel: false
- })
- }
- })
- },
- queryAdminEmail() {
- this.queryOneByOpenId('perm2', 'popo', {
- showLoading: true,
- showError: true,
- success: data => {
- const content = (data && data.email) || ''
- wx.showModal({
- title: '获取成功',
- content: content ? `邮箱为:${content}` : '邮箱为空',
- showCancel: false
- })
- }
- })
- },
- updateAdminEmail() {
- const data = {
- email: this.data.adminEmail
- }
- this.updateOneByOpenId('perm2', 'popo', data, {
- showLoading: true,
- showError: true,
- success: () => {
- app.globalData.adminEmail = this.data.adminEmail
- wx.showModal({
- content: '设置成功',
- showCancel: false
- })
- }
- })
- },
- // perm3:仅管理端可写,所有人可读
- queryProduct() {
- this.queryOneByOpenId('perm3', 'admin', {
- showLoading: true,
- showError: true,
- success: data => {
- const price = (data && data.price) || null
- wx.showModal({
- title: '获取成功',
- content: price !== null ? `商品价格为:${price}` : '商品价格暂未设置',
- showCancel: false
- })
- }
- })
- },
- updateProductPrice() {
- const data = {
- price: parseInt(this.data.product.price, 10)
- }
- this.updateOneByOpenId('perm3', 'admin', data, {
- showLoading: true,
- showError: true,
- success: () => {
- wx.showModal({
- content: '设置成功',
- showCancel: false
- })
- }
- })
- },
- // perm4:仅管理端可读写
- queryServerData() {
- this.queryOneByOpenId('perm4', 'server', {
- showLoading: true,
- showError: true,
- success: data => {
- const content = (data && data.serverData) || ''
- wx.showModal({
- title: '获取成功',
- content: content ? `后台流水数据为:${content}` : '后台流水数据为空',
- showCancel: false
- })
- }
- })
- },
- updateServerData() {
- const data = {
- data: this.data.serverData
- }
- this.updateOneByOpenId('perm4', 'server', data, {
- showLoading: true,
- showError: true,
- success: () => {
- wx.showModal({
- content: '设置成功',
- showCancel: false
- })
- }
- })
- },
- })
|