提交 6e45d29d authored 作者: 曹末's avatar 曹末

增加用户管理和首页

上级 b1884769
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event) => {
const {
label,
password,
remark,
isAdmin
} = event.data
try {
const db = cloud.database();
const _ = db.command
const {
data
} = await db.collection('user').where({
username: _.eq(label)
}).get()
if (data.length !== 0) {
return {
success: false,
msg: "用户名重复"
}
}
await db.collection('user').add({
data: {
username: label,
password,
remark,
isAdmin,
createDate: new Date()
}
})
return {
success: true
}
} catch (err) {
return {
success: false,
msg: err.message
}
}
}
\ No newline at end of file
const cloud = require('wx-server-sdk') const cloud = require('wx-server-sdk')
const fs = require('fs')
const path = require('path')
const md5 = require('md5')
const https = require('http')
cloud.init({ cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV env: cloud.DYNAMIC_CURRENT_ENV
}) })
...@@ -14,17 +10,9 @@ exports.main = async (event) => { ...@@ -14,17 +10,9 @@ exports.main = async (event) => {
files, files,
username username
} = event.data } = event.data
try { try {
const db = cloud.database(); const db = cloud.database();
// const fileids = await Promise.all(files.map(async v => {
// const buffer = await downloadFile(v)
// return await cloud.uploadFile({
// cloudPath: `contract/${OPENID}/${md5(buffer)}.${path.extname(v)}`,
// fileContent: fileStream,
// })
// }))
await db.collection('contract').add({ await db.collection('contract').add({
data: { data: {
username, username,
...@@ -43,28 +31,4 @@ exports.main = async (event) => { ...@@ -43,28 +31,4 @@ exports.main = async (event) => {
msg: err.message msg: err.message
} }
} }
}
function downloadFile(url) {
return new Promise((resolve, reject) => {
https.get(url, (res) => {
let data = [];
// 分段接收数据
res.on('data', (chunk) => {
data.push(chunk);
});
// 下载完成后处理数据
res.on('end', () => {
const buffer = Buffer.concat(data);
resolve(buffer);
});
res.on('error', (err) => {
reject(err);
});
});
});
} }
\ No newline at end of file
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event) => {
const {
id
} = event.data
const db = cloud.database({
throwOnNotFound: false
});
try {
const doc = db.collection('contract').doc(id);
const {
data
} = await doc.get()
doc.remove()
cloud.deleteFile({
fileList: data.fileIds
})
return {
success: true,
}
} catch (err) {
return {
success: false,
msg: err.message
}
}
}
\ No newline at end of file
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event) => {
const {
id,
} = event.data
try {
const db = cloud.database({
throwOnNotFound: false
});
const _ = db.command
const doc = db.collection('user').doc(id)
const {
data
} = await doc.get()
const {
data: clist
} = await db.collection('contract').where({
username: _.eq(data.username)
}).get()
const deleteFileList = []
clist.forEach(item => {
item.fileIds.forEach(id => {
deleteFileList.push(id)
})
})
await doc.remove()
await db.collection('contract').where({
username: _.eq(data.username)
}).remove()
if (deleteFileList.length) {
await cloud.deleteFile({
fileList: deleteFileList
})
}
return {
success: true
}
} catch (err) {
return {
success: false,
msg: err.message
}
}
}
\ No newline at end of file
...@@ -13,7 +13,7 @@ exports.main = async (event) => { ...@@ -13,7 +13,7 @@ exports.main = async (event) => {
const isAdmin = await db.collection('user').where({ const isAdmin = await db.collection('user').where({
username: _.eq(username) username: _.eq(username)
}).get() }).get()
const result = isAdmin.data[0].isAdmin ? await db.collection('contract').get() : db.collection('contract').where({ const result = isAdmin.data[0].isAdmin ? await db.collection('contract').get() : await db.collection('contract').where({
username: _.eq(username) username: _.eq(username)
}).get() }).get()
......
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event) => {
const db = cloud.database();
const _ = db.command
try {
const {
data: users
} = await db.collection('user').get()
return {
success: true,
data: users
}
} catch (err) {
return {
success: false,
msg: err.message
}
}
}
\ No newline at end of file
const createContract = require('./createContract/index'); const createContract = require('./createContract/index');
const getContract = require('./getContract/index'); const getContract = require('./getContract/index');
const login = require('./login/index'); const login = require('./login/index');
const getUser = require('./getUser/index');
const updateContract = require('./updateContract/index');
const deleteContract = require('./deleteContract/index');
const addUser = require('./addUser/index');
const deleteUser = require('./deleteUser/index');
const updateUser = require('./updateUser/index');
// 云函数入口函数 // 云函数入口函数
exports.main = async (event, context) => { exports.main = async (event, context) => {
...@@ -9,7 +15,19 @@ exports.main = async (event, context) => { ...@@ -9,7 +15,19 @@ exports.main = async (event, context) => {
return await getContract.main(event, context); return await getContract.main(event, context);
case 'createContract': case 'createContract':
return await createContract.main(event, context); return await createContract.main(event, context);
case 'updateContract':
return await updateContract.main(event, context);
case 'deleteContract':
return await deleteContract.main(event, context);
case 'login': case 'login':
return await login.main(event, context); return await login.main(event, context);
case 'getUser':
return await getUser.main(event, context);
case 'addUser':
return await addUser.main(event, context);
case 'deleteUser':
return await deleteUser.main(event, context);
case 'updateUser':
return await updateUser.main(event, context);
} }
}; };
\ No newline at end of file
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"md5": "^2.3.0",
"wx-server-sdk": "~2.4.0" "wx-server-sdk": "~2.4.0"
} }
} }
\ No newline at end of file
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event) => {
const {
id,
name,
type,
files,
username
} = event.data
try {
const db = cloud.database({
throwOnNotFound: false
});
const doc = db.collection('contract').doc(id)
const {
data
} = await doc.get()
const fileList = []
data.fileIds.forEach(id => {
if (!files.includes(id)) {
fileList.push(id)
}
})
if (fileList.length > 0) {
cloud.deleteFile({
fileList
})
}
await doc.update({
data: {
username,
name,
type,
fileIds: files,
}
})
return {
success: true
}
} catch (err) {
return {
success: false,
msg: err.message
}
}
}
\ No newline at end of file
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event) => {
const {
id,
label,
remark,
isAdmin
} = event.data
try {
const db = cloud.database();
const _ = db.command
const {
data
} = await db.collection('user').where({
username: _.eq(label)
}).get()
if (data.length > 1) {
return {
success: false,
msg: "用户名重复"
}
}
await db.collection('user').doc(id).update({
data: {
username: label,
remark,
isAdmin,
}
})
return {
success: true
}
} catch (err) {
return {
success: false,
msg: err.message
}
}
}
\ No newline at end of file
...@@ -14,6 +14,8 @@ App({ ...@@ -14,6 +14,8 @@ App({
}); });
} }
this.globalData = { }; this.globalData = {
};
}, },
}); });
\ No newline at end of file
...@@ -3,10 +3,12 @@ ...@@ -3,10 +3,12 @@
"pages/index/index", "pages/index/index",
"pages/examples/index", "pages/examples/index",
"pages/user-center/index", "pages/user-center/index",
"pages/exampleDetail/index",
"pages/contract/index", "pages/contract/index",
"pages/addContract/index", "pages/addContract/index",
"pages/login/index" "pages/updateContract/index",
"pages/login/index",
"pages/userManage/index",
"pages/modifyUser/index"
], ],
"window": { "window": {
"backgroundColor": "#F6F6F6", "backgroundColor": "#F6F6F6",
......
// pages/addPontract/index.js // pages/addPontract/index.js
import {
request
} from "../../utils/request.js"
Page({ Page({
/** /**
...@@ -17,7 +20,39 @@ Page({ ...@@ -17,7 +20,39 @@ Page({
}, },
originFiles: [], originFiles: [],
tempFile: {}, tempFile: {},
name: "" name: "",
username: "",
users: [],
userVisible: false
},
onShow() {
request("getUser").then(res => {
this.setData({
users: res.data.map(v => ({
id: v._id,
label: v.username,
isAdmin: v.isAdmin,
value: v.username
}))
})
})
},
onUserPicker() {
this.setData({
userVisible: true
})
},
onUserPickerCancel() {
this.setData({
userVisible: false
})
},
onColumnChange(e) {
console.log(e)
this.setData({
userVisible: false,
username: e.detail.value[0],
})
}, },
onChange(e) { onChange(e) {
this.setData({ this.setData({
...@@ -76,42 +111,58 @@ Page({ ...@@ -76,42 +111,58 @@ Page({
wx.showLoading({ wx.showLoading({
title: '', title: '',
}); });
const username = getApp().globalData.userInfo.username
if (this.data.type === 0) { if (this.data.type === 0) {
wx.cloud.uploadFile({ promiseUpload({
cloudPath: `contract/${username}/${this.data.tempFile.name}`, cloudPath: `contract/${this.data.username}/${this.data.name}/${this.data.tempFile.name}`,
filePath: this.data.tempFile.path, // 文件路径 filePath: this.data.tempFile.path,
success: res => { }).then(res => {
wx.cloud request("createContract", {
.callFunction({ username: this.data.username,
name: 'test1',
data: {
type: 'createContract',
data: {
username,
name: this.data.name, name: this.data.name,
type: this.data.type, type: this.data.type,
files: [res.fileID] files: [res.fileID]
}).then(res => {
}
},
success(res) {
wx.navigateBack() wx.navigateBack()
}).finally(res => {
}, wx.hideLoading()
complete(res) { })
}).catch(() => {
wx.hideLoading()
})
} else {
Promise.all(this.data.originFiles.map(v => {
return promiseUpload({
cloudPath: `contract/${this.data.username}/${this.data.name}/${v.name}`,
filePath: v.url,
})
})).then(res => {
console.log(res) console.log(res)
request("createContract", {
username: this.data.username,
name: this.data.name,
type: this.data.type,
files: res.map(v => v.fileID)
}).then(res => {
wx.navigateBack()
}).finally(res => {
wx.hideLoading() wx.hideLoading()
}
}) })
}, }).catch(() => {
fail: err => { wx.hideLoading()
console.log(err)
}
}) })
} }
} }
}) })
const promiseUpload = (config = {}) => {
return new Promise((resolve, reject) => {
wx.cloud.uploadFile({
...config,
success: resolve,
fail: reject
})
})
}
\ No newline at end of file
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
"t-button": "tdesign-miniprogram/button/button", "t-button": "tdesign-miniprogram/button/button",
"t-radio-group": "tdesign-miniprogram/radio-group/radio-group", "t-radio-group": "tdesign-miniprogram/radio-group/radio-group",
"t-radio": "tdesign-miniprogram/radio/radio", "t-radio": "tdesign-miniprogram/radio/radio",
"t-cell": "tdesign-miniprogram/cell/cell" "t-cell": "tdesign-miniprogram/cell/cell",
"t-picker": "tdesign-miniprogram/picker/picker",
"t-picker-item": "tdesign-miniprogram/picker-item/picker-item"
} }
} }
\ No newline at end of file
<!--pages/addPontract/index.wxml--> <!--pages/addPontract/index.wxml-->
<view class="add-container"> <view class="add-container">
<view> <view>
<t-cell class="mb-16" arrow hover note="{{username}}" bind:click="onUserPicker">
<view slot="title" class="custom-label"> 选择用户 </view>
</t-cell>
<t-picker visible="{{userVisible}}" value="{{userId}}" data-key="id" title="选择用户" cancelBtn="取消" confirmBtn="确认" bindconfirm="onColumnChange" bindcancel="onUserPickerCancel">
<t-picker-item options="{{users}}"></t-picker-item>
</t-picker>
<t-input placeholder="请输入合同名称" model:value="{{name}}"> <t-input placeholder="请输入合同名称" model:value="{{name}}">
<view slot="label" class="custom-label"> 合同名称 </view> <view slot="label" class="custom-label"> 合同名称 </view>
</t-input> </t-input>
......
// pages/contract/index.js // pages/contract/index.js
import ActionSheet, {
ActionSheetTheme
} from 'tdesign-miniprogram/action-sheet/index';
import Dialog from 'tdesign-miniprogram/dialog/index';
import {
request
} from "../../utils/request.js"
const dayjs = require("dayjs"); const dayjs = require("dayjs");
let tempitem;
Page({ Page({
/** /**
...@@ -7,66 +15,79 @@ Page({ ...@@ -7,66 +15,79 @@ Page({
*/ */
data: { data: {
enable: false, enable: false,
list: [] list: [],
isAdmin: false
}, },
onShow() { onShow() {
const userInfo = getApp().globalData.userInfo
this.setData({
username: userInfo.username,
isAdmin: userInfo.isAdmin
})
this.onRefresh(); this.onRefresh();
}, },
onRefresh() { onRefresh() {
this.setData({ this.setData({
enable: true enable: true
}); });
wx.cloud.callFunction({ request("getContract", {}, {
name: "test1", loadingMask: false,
data: { needUsername: true
type: "getContract", }).then(result => {
data: { const list = result.result.data || []
username: getApp().globalData.userInfo.username
}
},
success: (res) => {
this.setData({ this.setData({
list: res.result.result.data.map(v => ({ list: list.map(v => ({
text: v.name, text: v.name,
createDate: dayjs(v.createDate).format('YYYY-MM-DD HH:mm:ss'), createDate: dayjs(v.createDate).format('YYYY-MM-DD HH:mm:ss'),
type: v.type === 0 ? "pdf" : "图片", type: v.type === 0 ? "pdf" : "图片",
id: v._id, id: v._id,
fileIds: v.fileIds fileIds: v.fileIds,
username:v.username
})), })),
enable: false
}); });
}, }).finally(() => {
error: (err) => {
this.setData({ this.setData({
enable: false enable: false
}) })
}
}) })
}, // wx.cloud.callFunction({
handleAction() { // name: "test1",
// ActionSheet.show({ // data: {
// theme: ActionSheetTheme.List, // type: "getContract",
// selector: '#t-action-sheet', // data: {
// context: this, // username: getApp().globalData.userInfo.username
// description: '选择类型', // }
// items: [{
// label: '图片',
// },
// {
// label: 'pdf',
// }, // },
// ], // success: (res) => {
// this.setData({
// list: res.result.result.data.map(v => ({
// text: v.name,
// createDate: dayjs(v.createDate).format('YYYY-MM-DD HH:mm:ss'),
// type: v.type === 0 ? "pdf" : "图片",
// id: v._id,
// fileIds: v.fileIds
// })),
// enable: false
// }); // });
// },
// error: (err) => {
// this.setData({
// enable: false
// })
// }
// })
},
handleAction() {
wx.navigateTo({ wx.navigateTo({
url: '/pages/addContract/index', url: '/pages/addContract/index',
}) })
}, },
openFile(e) { openFile(item) {
const { const {
type, type,
fileIds fileIds
} = e.target.dataset.item } = item
console.log(type) console.log(type)
if (type === "pdf") { if (type === "pdf") {
wx.cloud.downloadFile({ wx.cloud.downloadFile({
...@@ -80,9 +101,70 @@ Page({ ...@@ -80,9 +101,70 @@ Page({
} }
} }
}) })
} else {
wx.previewImage({
urls: fileIds // 需要预览的图片http链接列表
})
} }
}, },
// handleSelected(e){ openAction(e) {
if (this.data.isAdmin) {
tempitem = e.target.dataset.item;
ActionSheet.show(action)
} else {
this.openFile(e.target.dataset.item)
}
},
handleSelected(e) {
const {
index
} = e.detail
console.log(index)
if (index === 0) {
//查看
this.openFile(tempitem)
// } } else if (index === 1) {
//编辑
wx.navigateTo({
url: '/pages/updateContract/index?item=' + JSON.stringify(tempitem),
})
} else {
//删除
const dialogConfig = {
context: this,
closeOnOverlayClick: true,
content: '确定要删除' + tempitem.text + '吗?',
confirmBtn: '确定',
cancelBtn: '取消',
};
Dialog.confirm(dialogConfig)
.then(() => {
request("deleteContract", {
id: tempitem.id
}).then(() => {
this.onRefresh()
})
})
.catch(() => {});
}
}
}) })
const action = {
theme: ActionSheetTheme.List,
selector: '#t-action-sheet',
items: [{
label: '查看合同',
},
{
label: '编辑合同',
color: '#0052D9',
},
{
label: '删除合同',
color: '#e34d59',
},
],
}
\ No newline at end of file
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
"t-fab": "tdesign-miniprogram/fab/fab", "t-fab": "tdesign-miniprogram/fab/fab",
"t-cell": "tdesign-miniprogram/cell/cell", "t-cell": "tdesign-miniprogram/cell/cell",
"t-cell-group": "tdesign-miniprogram/cell-group/cell-group", "t-cell-group": "tdesign-miniprogram/cell-group/cell-group",
"t-tag": "tdesign-miniprogram/tag/tag" "t-tag": "tdesign-miniprogram/tag/tag",
"t-action-sheet": "tdesign-miniprogram/action-sheet/action-sheet",
"t-dialog": "tdesign-miniprogram/dialog/dialog"
}, },
"disableScroll": true, "disableScroll": true,
"navigationBarTitleText": "合同管理" "navigationBarTitleText": "合同管理"
......
<t-pull-down-refresh value="{{enable}}" bind:refresh="onRefresh"> <t-pull-down-refresh value="{{enable}}" bind:refresh="onRefresh">
<view class="pulldown-refresh"> <view class="pulldown-refresh">
<t-cell-group class="pulldown-refresh__content"> <t-cell-group class="pulldown-refresh__content">
<t-cell wx:for="{{list}}" wx:key="index" title="{{item.text}}" description="{{item.createDate}}" hover arrow data-item="{{item}}" bind:click="openFile"> <t-cell wx:for="{{list}}" wx:key="index" title="{{item.text}}" description="{{item.createDate}}" hover arrow data-item="{{item}}" bind:click="openAction">
<t-tag slot="note">{{item.type}}</t-tag> <t-tag slot="note">{{item.type}}</t-tag>
</t-cell> </t-cell>
</t-cell-group> </t-cell-group>
<t-fab icon="add" bind:click="handleAction" aria-label="增加"></t-fab>
<!-- <t-action-sheet id="t-action-sheet" bind:selected="handleSelected" /> -->
</view> </view>
</t-pull-down-refresh> </t-pull-down-refresh>
<t-fab wx:if="{{isAdmin}}" icon="add" bind:click="handleAction" aria-label="增加"></t-fab>
<t-action-sheet id="t-action-sheet" bind:selected="handleSelected" />
<t-dialog id="t-dialog" />
\ No newline at end of file
// pages/exampleDetail/index.js
Page({
data: {
type: '',
envId: '',
showTip: false,
title:"",
content:"",
haveGetOpenId: false,
openId: '',
haveGetCodeSrc: false,
codeSrc: '',
haveGetRecord: false,
record: '',
haveGetImgSrc: false,
imgSrc: '',
},
onLoad(options) {
this.setData({ type: options?.type, envId: options?.envId });
},
getOpenId() {
wx.showLoading({
title: '',
});
wx.cloud.callFunction({
name: 'quickstartFunctions',
data: {
type: 'getOpenId'
}
}).then((resp) => {
this.setData({
haveGetOpenId: true,
openId: resp.result.openid
});
wx.hideLoading();
}).catch((e) => {
wx.hideLoading();
const {errCode,errMsg}=e
if(errMsg.includes('Environment not found')){
this.setData({
showTip: true,
title:"云开发环境未找到",
content:"如果已经开通云开发,请检查环境ID与 `miniprogram/app.js` 中的 `env` 参数是否一致。"
});
return
}
if(errMsg.includes('FunctionName parameter could not be found')){
this.setData({
showTip: true,
title:"请上传云函数",
content:"在'cloudfunctions/quickstartFunctions'目录右键,选择【上传并部署-云端安装依赖】,等待云函数上传完成后重试。"
});
return
}
});
},
clearOpenId() {
this.setData({
haveGetOpenId: false,
openId: ''
});
},
getCodeSrc() {
wx.showLoading({
title: '',
});
wx.cloud.callFunction({
name: 'quickstartFunctions',
data: {
type: 'getMiniProgramCode'
}
}).then((resp) => {
this.setData({
haveGetCodeSrc: true,
codeSrc: resp.result
});
wx.hideLoading();
}).catch((e) => {
wx.hideLoading();
const {errCode,errMsg}=e
if(errMsg.includes('Environment not found')){
this.setData({
showTip: true,
title:"云开发环境未找到",
content:"如果已经开通云开发,请检查环境ID与 `miniprogram/app.js` 中的 `env` 参数是否一致。"
});
return
}
if(errMsg.includes('FunctionName parameter could not be found')){
this.setData({
showTip: true,
title:"请上传云函数",
content:"在'cloudfunctions/quickstartFunctions'目录右键,选择【上传并部署-云端安装依赖】,等待云函数上传完成后重试。"
});
return
}
});
},
clearCodeSrc() {
this.setData({
haveGetCodeSrc: false,
codeSrc: ''
});
},
getRecord() {
wx.showLoading({
title: '',
});
wx.cloud.callFunction({
name: 'quickstartFunctions',
data: {
type: 'selectRecord'
}
}).then((resp) => {
this.setData({
haveGetRecord: true,
record: resp.result.data
});
wx.hideLoading();
}).catch((e) => {
this.setData({
showTip: true
});
wx.hideLoading();
});
},
clearRecord() {
this.setData({
haveGetRecord: false,
record: ''
});
},
uploadImg() {
wx.showLoading({
title: '',
});
// 让用户选择一张图片
wx.chooseImage({
count: 1,
success: chooseResult => {
// 将图片上传至云存储空间
wx.cloud.uploadFile({
// 指定上传到的云路径
cloudPath: 'my-photo.png',
// 指定要上传的文件的小程序临时文件路径
filePath: chooseResult.tempFilePaths[0],
}).then(res => {
this.setData({
haveGetImgSrc: true,
imgSrc: res.fileID
});
wx.hideLoading();
}).catch((e) => {
wx.hideLoading();
});
},
});
},
clearImgSrc() {
this.setData({
haveGetImgSrc: false,
imgSrc: ''
});
},
goOfficialWebsite() {
const url = 'https://docs.cloudbase.net/toolbox/quick-start';
wx.navigateTo({
url: `../web/index?url=${url}`,
});
},
})
\ No newline at end of file
{
"usingComponents": {
"cloud-tip-modal": "/components/cloudTipModal/index"
}
}
\ No newline at end of file
<!--pages/exampleDetail/index.wxml-->
<block wx:if="{{ type === 'getOpenId' }}">
<view>
<view class="top_tip">无需维护鉴权机制及登录票据,仅一行代码即可获得。</view>
<view class="box_text">{{ openId ? openId : 'OpenID将展示在这里' }}</view>
<view class="button" bindtap="getOpenId" wx:if="{{!haveGetOpenId}}">获取OpenId</view>
<view class="button_clear" bindtap="clearOpenId" wx:if="{{haveGetOpenId}}">清空</view>
<view class="tip">在”资源管理器>cloudfunctions>quickstartFunctions>getOpenId>index.js“找到获取openId函数,体验该能力</view>
<cloud-tip-modal showTipProps="{{showTip}}" title="{{title}}" content="{{content}}"></cloud-tip-modal>
</view>
</block>
<block wx:if="{{ type === 'getMiniProgramCode' }}">
<view>
<view class="top_tip">可通过云函数免接口调用凭证,直接生成小程序码。</view>
<view class="box_text" wx:if="{{!codeSrc}}">小程序码将展示在这里</view>
<view wx:if="{{codeSrc}}" class="code_box">
<image class="code_img" src="{{codeSrc}}"></image>
</view>
<view class="button" bindtap="getCodeSrc" wx:if="{{!haveGetCodeSrc}}">生成小程序码</view>
<view class="button_clear" bindtap="clearCodeSrc" wx:if="{{haveGetCodeSrc}}">清空</view>
<view class="tip">在”资源管理器>cloudfunctions>quickstartFunctions>getMiniProgramCode>index.js“找到获取小程序码函数,体验该能力</view>
<cloud-tip-modal showTipProps="{{showTip}}" title="{{title}}" content="{{content}}"></cloud-tip-modal>
</view>
</block>
<block wx:if="{{ type === 'createCollection' }}">
<view class="page-container">
<view class="title">功能介绍</view>
<view class="info">集合为常用数据库中表的概念。云开发数据库支持自动备份、无损回档,并且QPS高达3千+。</view>
<view class="title">如何体验</view>
<view class="info">已自动创建名为“sales”的体验合集,可打开“云开发控制台>数据库>记录列表”中找到该集合。</view>
<image class="img" src="../../images/database.png"></image>
</view>
</block>
<block wx:if="{{ type === 'selectRecord' }}">
<view>
<view class="top_tip">体验查询记录能力,查询数据表中的销量数据。</view>
<view class="box_text" wx:if="{{!record}}">销量数据将展示在这里</view>
<view wx:if="{{record}}" class="code_box">
<view class="code_box_title">地区销量统计</view>
<view class="code_box_record">
<view class="code_box_record_title">地域</view>
<view class="code_box_record_title">城市</view>
<view class="code_box_record_title">销量</view>
</view>
<view class="line"></view>
<view class="code_box_record" wx:for="{{record}}" wx:key="_id">
<view class="code_box_record_detail">{{item.region}}</view>
<view class="code_box_record_detail">{{item.city}}</view>
<view class="code_box_record_detail">{{item.sales}}</view>
</view>
</view>
<view class="button" bindtap="getRecord" wx:if="{{!haveGetRecord}}">查询记录</view>
<view class="button_clear" bindtap="clearRecord" wx:if="{{haveGetRecord}}">清空</view>
<view class="tip">在”资源管理器>cloudfunctions>quickstartFunctions>selectRecord>index.js“找到查询记录函数,体验该能力</view>
<cloud-tip-modal showTipProps="{{showTip}}"></cloud-tip-modal>
</view>
</block>
<block wx:if="{{ type === 'uploadFile' }}">
<view>
<view class="top_tip">多存储类型,仅需一个云函数即可完成上传。</view>
<view class="box_text" wx:if="{{!imgSrc}}">上传的图片将展示在这里</view>
<view wx:if="{{imgSrc}}" class="code_box">
<image class="code_img" src="{{imgSrc}}"></image>
<view class="img_info">
<view class="img_info_title">文件路径</view>
<view class="img_info_detail">{{imgSrc}}</view>
</view>
</view>
<view class="button" bindtap="uploadImg" wx:if="{{!haveGetImgSrc}}">上传一张图片</view>
<view class="button_clear" bindtap="clearImgSrc" wx:if="{{haveGetImgSrc}}">清空</view>
<view class="tip">在“资源管理器>miniprogram>pages>uploadFile>index.js”找到相应代码,体验该能力</view>
<cloud-tip-modal showTipProps="{{showTip}}"></cloud-tip-modal>
</view>
</block>
<block wx:if="{{ type === 'singleTemplate' }}">
<!--pages/singleTemplate/index.wxml-->
<view class="page-container">
<view class="title">功能介绍</view>
<view class="info">云开发针对小程序中常见的页面,如抽奖、邀请函、用户中心等内嵌页面,提供了一套业务模板+定制修改工具。</view>
<image class="img" mode="widthFix" lazy-load="true" src="../../images/single_template_sample.png"></image>
<view class="info">您可以使用云模板快速搭建各类场景的小程序页面,例如抽奖、签到、邀请函、领红包等等。云模板支持通过可视化编辑工具,自定义页面内容和样式,实现个性化定制。</view>
<image class="img" mode="widthFix" lazy-load="true" src="../../images/single_template_info.png"></image>
<view class="title">如何使用</view>
<view class="info">在资源管理器内找到pages文件夹,右键单击后选择「使用云模板或AI配置页面」或「配置单页模板」。</view>
<image class="img" mode="widthFix" lazy-load="true" src="../../images/single_template.png"></image>
<view class="info">💡PS:如果您找不到此选项,请将微信开发者工具更新至最新Nightly版本。</view>
</view>
</block>
<block wx:if="{{ type === 'cloudBackend' }}">
<view class="page-container">
<view class="title">功能介绍</view>
<view class="info">云后台提供了开箱即用的运营管理系统,涵盖小程序后台管理、微信支付管理、公众号管理等场景。</view>
<view class="info">开通后的云后台支持从 Web 网页登录,支持分配运营人员账号和权限管理。</view>
<view class="info">开发者还可基于低代码工具开发运营系统内的应用,拖拽组件生成前端 UI,从而定制各类管理端应用。</view>
<image class="img" mode="widthFix" lazy-load="true" src="../../images/cloud_backend_login.png"></image>
<image class="img" mode="widthFix" lazy-load="true" src="../../images/cloud_backend_info.png"></image>
<view class="title">如何体验</view>
<view class="info">打开云开发控制台,在控制台顶部菜单里选择并打开「云后台」,点击「去使用」。</view>
<image class="img" mode="widthFix" lazy-load="true" src="../../images/cloud_backend.png"></image>
<view class="info">如果您是首次安装,将会进入到开通流程中。在开通流程里,选择您需要的应用,然后点击开通即可。</view>
<view class="info">
您也可以查看<view class="info-link" bindtap="goOfficialWebsite">云后台文档</view>获得更多使用说明。
</view>
</view>
</block>
\ No newline at end of file
page {
background-color: white;
padding-bottom: 50px;
font-family: PingFang SC;
}
.page-container {
padding: 20rpx 40rpx;
}
.tip {
font-size: 23rpx;
color: rgba(0, 0, 0, 0.5);
width: 90%;
text-align: center;
margin: 30rpx auto 0 auto;
}
.top_tip {
font-size: 28rpx;
color: rgba(0, 0, 0, 0.5);
width: 90%;
text-align: left;
margin-top: 30rpx;
margin-left: 20rpx;
}
.box_text {
background-color: white;
text-align: center;
padding: 300rpx 0;
margin-top: 30rpx;
color: rgba(0, 0, 0, 0.5);
}
.button {
width: 300rpx;
text-align: center;
margin: 250rpx auto 0 auto;
height: 80rpx;
color: white;
border-radius: 5px;
line-height: 80rpx;
background-color: #07c160;
}
.button_clear {
width: 300rpx;
text-align: center;
margin: 250rpx auto 0 auto;
height: 80rpx;
color: #07c160;
border-radius: 5px;
line-height: 80rpx;
background-color: rgba(0, 0, 0, 0.03);
}
.line {
height: 1rpx;
width: 100%;
background-color: rgba(0, 0, 0, 0.1);
}
.code_box {
text-align: center;
background-color: white;
margin-top: 30rpx;
padding: 17rpx;
}
.code_box_title {
color: rgba(0, 0, 0, 0.5);
font-size: 26rpx;
margin-bottom: 20rpx;
text-align: left;
}
.code_box_record {
display: flex;
}
.code_box_record_title {
width: 33%;
font-size: 26rpx;
color: rgba(0, 0, 0, 0.5);
padding: 20rpx 0;
}
.code_box_record_detail {
width: 33%;
font-size: 26rpx;
padding: 20rpx 0;
}
.title {
margin-top: 16px;
font-size: 36rpx;
font-weight: 500;
color: #000;
}
.info {
margin-top: 12px;
font-size: 28rpx;
font-weight: 400;
color: rgba(0, 0, 0, 0.6);
line-height: 52rpx;
}
.img {
margin-top: 16px;
width: 100%;
}
.code_img {
width: 360rpx;
height: 360rpx;
}
\ No newline at end of file
<image src="../../images/s.jpg" mode="widthFix" style="width:100%" /> <image src="../../images/s.png" mode="widthFix" style="width:100%" />
\ No newline at end of file \ No newline at end of file
/**index.wxss**/ /**index.wxss**/
page { page {
padding-top: 54rpx;
background-color: #f6f6f6; background-color: #f6f6f6;
padding-bottom: 60rpx; padding-bottom: 160rpx;
} }
.container { .container {
......
const swiperList = [{
const imageCdn = 'https://tdesign.gtimg.com/mobile/demos'; value: `/images/index1.png`,
const swiperList = [
{
value: `${imageCdn}/swiper1.png`,
ariaLabel: '图片1', ariaLabel: '图片1',
}, },
{ {
value: `${imageCdn}/swiper2.png`, value: `/images/index2.png`,
ariaLabel: '图片2', ariaLabel: '图片2',
}, },
];
const goods = [{
label: "乐美50法式非断桥复古窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/1.png"
},
{ {
value: `${imageCdn}/swiper1.png`, label: "乐家101漂移窗",
ariaLabel: '图片1', src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/2.png"
}, },
{ {
value: `${imageCdn}/swiper2.png`, label: "东方之珠85双内开窗",
ariaLabel: '图片2', src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/3.png"
}, },
]; {
label: "罗马岁月105平开窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/4.png"
},
{
label: "挪威森林115平开窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/5.png"
},
{
label: "罗马岁月105平开窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/6.png"
},
{
label: "乐想115平开窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/7.png"
},
{
label: "乐美120法式断桥复古窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/8.png"
},
{
label: "乐优120断桥测压窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/9.png"
},
{
label: "爱尔兰风光110平开窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/10.png"
},
{
label: "150电动升降窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/11.png"
},
{
label: "视界125平移提升窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/12.png"
},
{
label: "天域150断桥全景推拉门...",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/13.png"
},
{
label: "新天鹅堡126悬浮推拉窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/14.png"
},
{
label: "阳光110双内开窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/15.png"
},
{
label: "柏林之声断桥提升门",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/16.png"
},
{
label: "贝加尔湖48中窄推拉门",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/17.png"
},
{
label: "莱茵100-120阳光房",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/18.png"
},
{
label: "东风100双内开窗",
src: "cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/index/goods/19.png"
},
]
Page({ Page({
data: { data: {
...@@ -26,5 +92,9 @@ Page({ ...@@ -26,5 +92,9 @@ Page({
duration: 500, duration: 500,
interval: 5000, interval: 5000,
swiperList, swiperList,
goods,
imageProps: {
style: "width:100%;"
}
}, },
}); });
\ No newline at end of file
{ {
"usingComponents": { "usingComponents": {
"t-swiper": "tdesign-miniprogram/swiper/swiper" "t-swiper": "tdesign-miniprogram/swiper/swiper",
"t-search": "tdesign-miniprogram/search/search",
"t-image": "tdesign-miniprogram/image/image",
"t-grid": "tdesign-miniprogram/grid/grid",
"t-grid-item": "tdesign-miniprogram/grid-item/grid-item",
"t-row": "tdesign-miniprogram/row/row",
"t-col": "tdesign-miniprogram/col/col"
}, },
"navigationBarBackgroundColor": "#fff", "navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "首页" "navigationBarTitleText": "首页"
......
<!--index.wxml--> <!--index.wxml-->
<!-- <t-swiper <view class="search-container">
current="{{current}}" <t-search placeholder="请输入您想要输入的产品" shape="round" />
autoplay="{{autoplay}}" </view>
duration="{{duration}}" <t-swiper height="250" current="{{current}}" autoplay="{{autoplay}}" duration="{{duration}}" interval="{{interval}}" list="{{swiperList}}" />
interval="{{interval}}" <view style="padding:0 20rpx;padding-bottom: 190rpx;">
list="{{swiperList}}" <view class="icons-container">
navigation="{{ { type: 'dots-bar' } }}" <t-grid column="{{1}}" theme="card" align="left">
/> --> <t-grid-item t-class-image="image" text="十年" description="免订责任保" layout="horizontal" image="/images/icon_1.png" />
</t-grid>
<image src="../../images/index.jpg" mode="widthFix" style="width:100%" /> <t-grid column="{{1}}" theme="card" align="left">
\ No newline at end of file <t-grid-item t-class-image="image" text="一键拨号" description="在线咨询" layout="horizontal" image="/images/icon_2.png" />
</t-grid>
</view>
<view class="icons-container">
<t-grid column="{{1}}" theme="card" align="left">
<t-grid-item t-class-image="image" text="老旧门窗" description="免费维修预约" layout="horizontal" image="/images/icon_3.png" />
</t-grid>
<t-grid column="{{1}}" theme="card" align="left">
<t-grid-item t-class-image="image" text="全部产品" description="高奢定制" layout="horizontal" image="/images/icon_4.png" />
</t-grid>
</view>
<view class="video-container">
<span>
<t-image src="/images/icon_6.png" width="20" height="20" mode="" />
<text style="font-size: large;margin:0 10rpx">乐奇宣传片</text>
</span>
<video src="cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/51a0c41df4927ad7b01438c33ef2393f_20250125204928.mp4" poster="cloud://test-7gxagyb2e8df0dd9.7465-test-7gxagyb2e8df0dd9-1332997336/video_cover.png" controls style="width:100%"></video>
</view>
<view class="hot-goods-container">
<span>
<t-image src="/images/icon_5.png" width="20" height="20" mode="" />
<text style="font-size: large;margin:0 10rpx">热销商品</text>
<text style="font-size: small;color:#666;margin-right:0 5rpx;">/</text>
<text style="font-size: small;color:#666"> 爆款商品 为你呈现</text>
</span>
<t-row>
<t-col span="12" wx:for="{{goods}}" wx:key="index">
<view class="good-item">
<t-image src="{{item.src}}" mode="widthFix" shape="round" style="width:100%;"></t-image>
<text> {{item.label}}</text>
</view>
</t-col>
</t-row>
</view>
</view>
\ No newline at end of file
.poster swiper-item image { .poster swiper-item image {
height: 300rpx; height: 300rpx;
width: 100%; width: 100%;
} }
.search-container {
background-color: white;
position: sticky;
top: 0;
z-index: 99;
}
.t-search {
padding: 20rpx;
}
.t-search .t-search__input-box {
border: 1px solid #ccc;
}
page {
--td-swiper-radius: 0;
--td-swiper-nav-dot-active-color: var(--td-brand-color);
--td-swiper-nav-dot-color: white;
--td-swiper-nav-dot-size: 16rpx;
--td-search-icon-color: var(--td-brand-color);
--td-search-bg-color: white;
}
.icons-container {
display: flex;
gap: 20rpx;
flex-wrap: wrap;
margin-top: 20rpx;
}
.icons-container .t-grid {
flex: 1;
margin: 0;
}
.video-container {
margin-top: 20rpx;
background-color: #fff;
border-radius: 15rpx;
padding: 20rpx;
padding-top: 40rpx;
}
.video-container video {
margin-top: 40rpx;
}
.hot-goods-container {
margin-top: 20rpx;
background-color: #fff;
border-radius: 15rpx;
padding: 20rpx;
padding-top: 40rpx;
}
.hot-goods-container .t-row{
margin-top: 40rpx;
}
.good-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 20rpx;
gap: 20rpx;
}
.good-item text{
white-space: nowrap;
font-size: small;
}
\ No newline at end of file
// pages/login/login.js // pages/login/login.js
import Toast from 'tdesign-miniprogram/toast/index'; import {
request
} from "../../utils/request.js"
Page({ Page({
/** /**
...@@ -10,57 +12,19 @@ Page({ ...@@ -10,57 +12,19 @@ Page({
password: "" password: ""
}, },
login() { login() {
wx.showLoading({ request("login", {
title: '',
});
wx.cloud
.callFunction({
name: 'test1',
data: {
type: 'login',
data: {
username: this.data.username, username: this.data.username,
password: this.data.password password: this.data.password
} }).then(result => {
console.log()
}, getApp().globalData.userInfo = result.userInfo
success: (res) => { const pages=getCurrentPages()
if (res.result.success) { if(pages.length>1){
getApp().globalData.userInfo = res.result.userInfo wx.navigateBack()
}else{
wx.switchTab({ wx.switchTab({
url: "/pages/user-center/index" url: '/pages/user-center/index',
}) })
// wx.setStorage({
// key: "userInfo",
// data: res.result.userInfo,
// success() {
// wx.switchTab({
// url: "/pages/user-center/index"
// })
// }
// })
} else {
Toast({
context: this,
selector: '#t-toast',
message: res.result.msg || res.errMsg,
theme: 'error',
direction: 'column',
});
}
},
error: (res) => {
Toast({
context: this,
selector: '#t-toast',
message: res.message || res.errMsg,
theme: 'error',
direction: 'column',
});
},
complete(res) {
wx.hideLoading()
} }
}) })
}, },
......
{ {
"usingComponents": { "usingComponents": {
"t-input": "tdesign-miniprogram/input/input", "t-input": "tdesign-miniprogram/input/input",
"t-button": "tdesign-miniprogram/button/button", "t-button": "tdesign-miniprogram/button/button"
"t-toast": "tdesign-miniprogram/toast/toast"
}, },
"navigationBarTitleText": "登录" "navigationBarTitleText": "登录"
} }
\ No newline at end of file
<t-toast id="t-toast" />
<view> <view>
<t-input label="用户名" model:value="{{username}}" placeholder="请输入文字" /> <t-input label="用户名" model:value="{{username}}" placeholder="请输入文字" />
<t-input label="输入密码" type="password" model:value="{{password}}" suffixIcon="{{ { name: 'browse-off', ariaLabel: '密码' } }}" /> <t-input label="输入密码" type="password" model:value="{{password}}" suffixIcon="{{ { name: 'browse-off', ariaLabel: '密码' } }}" />
......
// pages/modifyUser/index.js
import {
request
} from "../../utils/request.js"
Page({
/**
* 页面的初始数据
*/
data: {
item: {},
label: "",
password: "",
remark: "",
isAdmin: false,
isModify: false
},
/**
* 生命周期函数--监听页面加载
*/
onLoad({
item
}) {
wx.setNavigationBarTitle({
title: item ? "编辑用户" : "新建用户"
})
if (item) {
const data1 = JSON.parse(item);
this.setData({
item: data1,
isModify: true,
label: data1.label,
remark: data1.remark,
isAdmin: data1.isAdmin,
})
} else {
this.setData({
item: {},
isModify: false,
label: "",
remark: "",
isAdmin: false,
password: "",
})
}
},
handleClick() {
request(this.data.isModify ? "updateUser" : "addUser", this.data.isModify ? {
label: this.data.label,
remark: this.data.remark,
isAdmin: this.data.isAdmin,
id: this.data.item.id,
} : {
label: this.data.label,
remark: this.data.remark,
isAdmin: this.data.isAdmin,
password: this.data.password,
}).then(res => {
wx.navigateBack()
})
}
})
\ No newline at end of file
{
"navigationBarTitleText": "用户",
"usingComponents": {
"t-input": "tdesign-miniprogram/input/input",
"t-button": "tdesign-miniprogram/button/button",
"t-switch": "tdesign-miniprogram/switch/switch",
"t-cell": "tdesign-miniprogram/cell/cell"
}
}
\ No newline at end of file
<view>
<t-input label="用户名" model:value="{{label}}"></t-input>
<t-input wx:if="{{!isModify}}" label="密码" model:value="{{password}}" type="password"></t-input>
<t-input label="备注" model:value="{{remark}}"></t-input>
<t-cell title="管理员" bordered="{{false}}">
<t-switch model:value="{{isAdmin}}" slot="note" />
</t-cell>
<t-button style="margin-top: 64rpx;" theme="primary" size="large" block t-class="external-class" bind:tap="handleClick">{{isModify?"更新":"新建"}}</t-button>
</view>
\ No newline at end of file
/* pages/modifyUser/index.wxss */
.external-class {
border-radius: 0 !important;
}
\ No newline at end of file
// pages/addPontract/index.js
import {
request
} from "../../utils/request.js"
Page({
/**
* 页面的初始数据
*/
data: {
test: {
size: 'large',
block: true
},
type: 0,
gridConfig: {
column: 4,
width: 160,
height: 160,
},
originFiles: [],
tempFile: {},
name: "",
username: "",
users: [],
userVisible: false,
item: {}
},
onLoad(e) {
const item = JSON.parse(e.item)
const type = item.type === "pdf" ? 0 : 1
const l = item.fileIds[0].split("/");
const pdfFileName = l[l.length - 1]
this.setData({
item,
name: item.text,
username: item.username,
type,
tempFile: type === 0 ? {
name: pdfFileName,
path: item.fileIds[0]
} : {},
originFiles: type === 1 ?
item.fileIds.map(v => ({
url: v
})) : []
})
},
onShow() {
request("getUser").then(res => {
this.setData({
users: res.data.map(v => ({
id: v._id,
label: v.username,
isAdmin: v.isAdmin,
value: v.username
}))
})
})
},
onUserPicker() {
this.setData({
userVisible: true
})
},
onUserPickerCancel() {
this.setData({
userVisible: false
})
},
onColumnChange(e) {
console.log(e)
this.setData({
userVisible: false,
username: e.detail.value[0],
})
},
onChange(e) {
this.setData({
originFiles: [],
tempFile: {},
type: e.detail.value
});
},
selectPdf() {
wx.chooseMessageFile({
count: 1,
type: 'file',
extension: ["pdf"],
success: (res) => {
this.setData({
tempFile: res.tempFiles[0]
})
}
})
},
openFile() {
wx.cloud.downloadFile({
fileID: this.data.tempFile.path,
success: function (res) {
const filePath = res.tempFilePath
wx.openDocument({
filePath,
fileType: "pdf"
})
},
fail: console.log
})
},
handleSuccess(e) {
const {
files
} = e.detail;
this.setData({
originFiles: files,
});
},
handleRemove(e) {
const {
index
} = e.detail;
const {
originFiles
} = this.data;
originFiles.splice(index, 1);
this.setData({
originFiles,
});
},
handleDrop(e) {
const {
files
} = e.detail;
this.setData({
originFiles: files,
});
},
async createContract() {
wx.showLoading({
title: '',
});
if (this.data.type === 0) {
try {
const file = this.data.item.fileIds[0]
if (this.data.tempFile.path !== this.data.item.fileIds[0]) {
const res = await promiseUpload({
cloudPath: `contract/${this.data.username}/${this.data.name}/${this.data.tempFile.name}`,
filePath: this.data.tempFile.path,
})
file = res.fileID
}
request("updateContract", {
id: this.data.item.id,
username: this.data.username,
name: this.data.name,
type: this.data.type,
files: [file]
}).then(res => {
wx.navigateBack()
}).finally(res => {
wx.hideLoading()
})
} catch (err) {
console.log(err)
wx.hideLoading()
}
} else {
try {
const res = await Promise.all(this.data.originFiles.map(v => {
return promiseUpload({
cloudPath: `contract/${this.data.username}/${this.data.name}/${v.name}`,
filePath: v.url,
})
}))
request("createContract", {
username: this.data.username,
name: this.data.name,
type: this.data.type,
files: res.map(v => v.fileID)
}).then(res => {
wx.navigateBack()
}).finally(res => {
wx.hideLoading()
})
} catch (err) {
console.log(err)
wx.hideLoading()
}
}
}
})
const promiseUpload = (config = {}) => {
return new Promise((resolve, reject) => {
wx.cloud.uploadFile({
...config,
success: resolve,
fail: reject
})
})
}
\ No newline at end of file
{
"navigationBarTitleText": "更新合同",
"usingComponents": {
"t-upload": "tdesign-miniprogram/upload/upload",
"t-input": "tdesign-miniprogram/input/input",
"t-button": "tdesign-miniprogram/button/button",
"t-radio-group": "tdesign-miniprogram/radio-group/radio-group",
"t-radio": "tdesign-miniprogram/radio/radio",
"t-cell": "tdesign-miniprogram/cell/cell",
"t-picker": "tdesign-miniprogram/picker/picker",
"t-picker-item": "tdesign-miniprogram/picker-item/picker-item"
}
}
\ No newline at end of file
<!--pages/addPontract/index.wxml-->
<view class="add-container">
<view>
<t-cell class="mb-16" arrow hover note="{{username}}" bind:click="onUserPicker">
<view slot="title" class="custom-label"> 选择用户 </view>
</t-cell>
<t-picker visible="{{userVisible}}" value="{{userId}}" data-key="id" title="选择用户" cancelBtn="取消" confirmBtn="确认" bindconfirm="onColumnChange" bindcancel="onUserPickerCancel">
<t-picker-item options="{{users}}"></t-picker-item>
</t-picker>
<t-input placeholder="请输入合同名称" model:value="{{name}}">
<view slot="label" class="custom-label"> 合同名称 </view>
</t-input>
<view class="card">
<view slot="text" class="custom-label">合同类型</view>
<t-radio-group slot="note" value="{{type}}" borderless t-class="box" bind:change="onChange">
<t-radio block="{{false}}" label="pdf" value="{{0}}" />
<t-radio block="{{false}}" label="图片" value="{{1}}" />
</t-radio-group>
</view>
<view wx:if="{{type}}" style="margin-top: 32rpx;padding: 0 32rpx;">
<t-upload draggable media-type="{{['image']}}" files="{{originFiles}}" gridConfig="{{gridConfig}}" bind:success="handleSuccess" bind:remove="handleRemove" bind:click="handleClick" bind:drop="handleDrop" />
</view>
<view wx:else style="display:flex;align-items: center;margin-top: 32rpx;padding: 0 32rpx;">
<text bind:tap="openFile">{{tempFile.name}}</text>
<t-button bind:tap="selectPdf">选择文件</t-button>
</view>
<t-button style="margin-top: 64rpx;" theme="primary" size="large" block t-class="external-class" bind:tap="createContract">更新</t-button>
</view>
</view>
\ No newline at end of file
/* pages/addPontract/index.wxss */
.custom-label {
display: inline-flex;
}
.custom-label::after {
content: '*';
color: red;
font-size: 32rpx;
margin-left: 4rpx;
}
.external-class {
border-radius: 0 !important;
}
.add-container {
height: 100vh;
display: flex;
flex-direction: column;
justify-content: space-between;
position: relative;
background-color: var(--td-bg-color-container, #fff);
}
.box {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
gap: 30rpx;
background-color: var(--td-bg-color-container, #fff);
}
.card {
display: flex;
align-items: center;
background-color: var(--td-bg-color-container, #fff);
padding: var(--td-input-vertical-padding, 32rpx);
gap: var(--td-spacer-2, 32rpx);
}
\ No newline at end of file
import ActionSheet, {
ActionSheetTheme
} from 'tdesign-miniprogram/action-sheet/index';
const { const {
envList envList
} = require('../../envList'); } = require('../../envList');
...@@ -16,7 +19,7 @@ Page({ ...@@ -16,7 +19,7 @@ Page({
avatarUrl: defaultAvatarUrl avatarUrl: defaultAvatarUrl
}, },
onShow() { onShow() {
const userInfo = getApp().globalData.userInfo const userInfo = getApp().globalData.userInfo || {}
this.setData({ this.setData({
username: userInfo.username, username: userInfo.username,
isAdmin: userInfo.isAdmin isAdmin: userInfo.isAdmin
...@@ -41,4 +44,25 @@ Page({ ...@@ -41,4 +44,25 @@ Page({
url: `/pages/exampleDetail/index?envId=${envList?.[0]?.envId}&type=getMiniProgramCode`, url: `/pages/exampleDetail/index?envId=${envList?.[0]?.envId}&type=getMiniProgramCode`,
}); });
}, },
handleSelected() {
getApp().globalData.userInfo = {}
this.setData({
username: '',
isAdmin: false,
})
wx.reLaunch({
url: '/pages/user-center/index',
})
},
logout() {
ActionSheet.show(basicListOption)
}
}); });
const basicListOption = {
theme: ActionSheetTheme.List,
selector: '#t-action-sheet',
items: [{
label: '退出登录',
}, ],
};
\ No newline at end of file
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
"cloud-tip-modal": "/components/cloudTipModal/index", "cloud-tip-modal": "/components/cloudTipModal/index",
"t-cell-group": "tdesign-miniprogram/cell-group/cell-group", "t-cell-group": "tdesign-miniprogram/cell-group/cell-group",
"t-cell": "tdesign-miniprogram/cell/cell", "t-cell": "tdesign-miniprogram/cell/cell",
"t-icon": "tdesign-miniprogram/icon/icon" "t-icon": "tdesign-miniprogram/icon/icon",
"t-action-sheet": "tdesign-miniprogram/action-sheet/action-sheet"
}, },
"navigationBarBackgroundColor": "#f5f5f5", "navigationBarBackgroundColor": "#f5f5f5",
"navigationBarTitleText": "我的" "navigationBarTitleText": "我的"
......
<!-- pages/me/index.wxml --> <!-- pages/me/index.wxml -->
<view class="page_container"> <view class="page_container">
<t-action-sheet id="t-action-sheet" usingCustomNavbar bind:selected="handleSelected" />
<view class="top_bg" /> <view class="top_bg" />
<view class="main_content"> <view class="main_content">
<view class="userinfo_container"> <view class="userinfo_container">
...@@ -8,13 +9,13 @@ ...@@ -8,13 +9,13 @@
<view class="username" bind:tap="toLogin">请点击登录</view> <view class="username" bind:tap="toLogin">请点击登录</view>
</block> </block>
<block wx:else> <block wx:else>
<view class="username">{{ username }}</view> <view class="username" bind:tap="logout">{{ username }}</view>
</block> </block>
</view> </view>
<view class="settings_container"> <view class="settings_container">
<t-cell-group theme="card"> <t-cell-group theme="card">
<t-cell title="合同管理" leftIcon="collage" hover arrow type="navigateTo" url="/pages/contract/index" /> <t-cell title="合同管理" leftIcon="collage" hover arrow type="navigateTo" url="/pages/contract/index" />
<t-cell wx:if="{{isAdmin}}" title="用户管理" leftIcon="usergroup" hover arrow /> <t-cell wx:if="{{isAdmin}}" title="用户管理" leftIcon="usergroup" hover arrow url="/pages/userManage/index" />
<t-cell title="联系客服" leftIcon="earphone" hover arrow /> <t-cell title="联系客服" leftIcon="earphone" hover arrow />
</t-cell-group> </t-cell-group>
</view> </view>
......
...@@ -96,3 +96,6 @@ ...@@ -96,3 +96,6 @@
width: 30rpx; width: 30rpx;
height: 30rpx; height: 30rpx;
} }
.t-overlay{
top:0 !important;
}
\ No newline at end of file
// pages/userManage/index.js
import ActionSheet, {
ActionSheetTheme
} from 'tdesign-miniprogram/action-sheet/index';
import Dialog from "tdesign-miniprogram/dialog/index"
import {
request
} from "../../utils/request.js"
let tempitem;
Page({
/**
* 页面的初始数据
*/
data: {
users: [],
enable: false
},
onShow() {
this.onRefresh()
},
onRefresh() {
this.setData({
enable: true
});
request("getUser", {}, {
loadingMask: false
}).then(res => {
this.setData({
users: res.data.filter(v => v.username !== getApp().globalData.userInfo.username).map(v => ({
id: v._id,
label: v.username,
isAdmin: v.isAdmin,
value: v.username,
remark: v.remark
}))
});
}).finally(() => {
this.setData({
enable: false
})
})
},
openAction(e) {
tempitem = e.target.dataset.item;
ActionSheet.show({
theme: ActionSheetTheme.List,
selector: '#t-action-sheet',
items: [{
label: '编辑用户',
color: '#0052D9',
},
{
label: '删除用户',
color: '#e34d59',
},
],
})
},
handleAdd() {
wx.navigateTo({
url: '/pages/modifyUser/index',
})
},
handleSelected(e) {
const {
index
} = e.detail
if (index === 0) {
wx.navigateTo({
url: '/pages/modifyUser/index?item=' + JSON.stringify(tempitem),
})
//编辑
} else {
//删除
const dialogConfig = {
context: this,
closeOnOverlayClick: true,
content: '确定要删除' + tempitem.label + '吗?',
confirmBtn: '确定',
cancelBtn: '取消',
};
Dialog.confirm(dialogConfig)
.then(() => {
request("deleteUser", {
id: tempitem.id
}).then(() => {
this.onRefresh()
})
})
.catch(() => {});
}
},
})
\ No newline at end of file
{
"navigationBarTitleText": "用户管理",
"usingComponents": {
"t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh",
"t-skeleton": "tdesign-miniprogram/skeleton/skeleton",
"t-fab": "tdesign-miniprogram/fab/fab",
"t-cell": "tdesign-miniprogram/cell/cell",
"t-cell-group": "tdesign-miniprogram/cell-group/cell-group",
"t-action-sheet": "tdesign-miniprogram/action-sheet/action-sheet",
"t-dialog": "tdesign-miniprogram/dialog/dialog",
"t-tag": "tdesign-miniprogram/tag/tag"
}
}
\ No newline at end of file
<t-pull-down-refresh value="{{enable}}" bind:refresh="onRefresh">
<view class="pulldown-refresh">
<t-cell-group class="pulldown-refresh__content">
<t-cell wx:for="{{users}}" wx:key="index" title="{{item.label}}" description="{{item.remark}}" hover arrow data-item="{{item}}" bind:click="openAction">
<t-tag wx:if="{{item.isAdmin}}" theme="primary" slot="note">管理员</t-tag>
</t-cell>
</t-cell-group>
</view>
</t-pull-down-refresh>
<t-action-sheet id="t-action-sheet" bind:selected="handleSelected" />
<t-fab icon="add" bind:click="handleAdd" aria-label="增加"></t-fab>
<t-dialog id="t-dialog" />
page {
height: 100%;
}
\ No newline at end of file
export const request = async (type, data = {}, config = {}) => {
const needUsername = config.needUsername || false
const loadMask = config.loadingMask === false ? false : true
if (loadMask) {
wx.showLoading()
}
let transData = {
...data
}
if (needUsername) {
const userInfo = getApp().globalData.userInfo || {}
if (!userInfo || !userInfo.username) {
return wx.navigateTo({
url: '/pages/login/index',
})
}
transData.username = userInfo.username
}
return new Promise((resolve, reject) => {
wx.cloud.callFunction({
name: 'test1',
data: {
type,
data: transData,
},
success: (res) => {
wx.hideLoading()
if (res.result.success) {
resolve(res.result)
} else {
reject(res)
wx.showToast({
title: res.result.msg || "错误",
icon: "none"
})
}
},
error: (res) => {
wx.hideLoading()
wx.showToast({
title: res.message || "错误",
icon: "none",
})
reject(res)
},
})
})
}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论