Commit 131ebdff by xuyanyang

初始化提交

parents
# Windows
[Dd]esktop.ini
Thumbs.db
$RECYCLE.BIN/
# macOS
.DS_Store
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
# Node.js
node_modules/
# 云开发 quickstart
这是云开发的快速启动指引,其中演示了如何上手使用云开发的三大基础能力:
- 数据库:一个既可在小程序前端操作,也能在云函数中读写的 JSON 文档型数据库
- 文件存储:在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理
- 云函数:在云端运行的代码,微信私有协议天然鉴权,开发者只需编写业务逻辑代码
## 参考文档
- [云开发文档](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html)
{
"permissions": {
"openapi": [
"customerServiceMessage.send"
]
}
}
\ No newline at end of file
const cloud = require('wx-server-sdk')
cloud.init({
// API 调用都保持和云函数当前所在环境一致
env: cloud.DYNAMIC_CURRENT_ENV
})
// 云函数入口函数
exports.main = async (event, context) => {
console.log(event)
const { OPENID } = cloud.getWXContext()
const result = await cloud.openapi.customerServiceMessage.send({
touser: OPENID,
msgtype: 'text',
text: {
content: '收到:' + event.Content,
}
})
console.log(result)
return result
}
{
"name": "callback",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"wx-server-sdk": "~1.5.5"
}
}
\ No newline at end of file
{
"permissions": {
"openapi": []
}
}
const cloud = require('wx-server-sdk')
exports.main = async (event, context) => {
// event.userInfo 是已废弃的保留字段,在此不做展示
// 获取 OPENID 等微信上下文请使用 cloud.getWXContext()
delete event.userInfo
return event
}
{
"name": "echo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"wx-server-sdk": "~1.5.5"
}
}
\ No newline at end of file
{
"permissions": {
"openapi": []
}
}
// 云函数模板
// 部署:在 cloud-functions/login 文件夹右击选择 “上传并部署”
const cloud = require('wx-server-sdk')
// 初始化 cloud
cloud.init({
// API 调用都保持和云函数当前所在环境一致
env: cloud.DYNAMIC_CURRENT_ENV
})
/**
* 这个示例将经自动鉴权过的小程序用户 openid 返回给小程序端
*
* event 参数包含小程序端调用传入的 data
*
*/
exports.main = (event, context) => {
console.log(event)
console.log(context)
// 可执行其他自定义逻辑
// console.log 的内容可以在云开发云函数调用日志查看
// 获取 WX Context (微信调用上下文),包括 OPENID、APPID、及 UNIONID(需满足 UNIONID 获取条件)等信息
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
env: wxContext.ENV,
}
}
{
"name": "login",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"wx-server-sdk": "~1.5.5"
}
}
{
"permissions": {
"openapi": [
"wxacode.get",
"templateMessage.send",
"templateMessage.addTemplate",
"templateMessage.deleteTemplate",
"templateMessage.getTemplateList",
"templateMessage.getTemplateLibraryById",
"templateMessage.getTemplateLibraryList"
]
}
}
\ No newline at end of file
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({
// API 调用都保持和云函数当前所在环境一致
env: cloud.DYNAMIC_CURRENT_ENV
})
// 云函数入口函数
exports.main = async (event, context) => {
console.log(event)
switch (event.action) {
case 'sendTemplateMessage': {
return sendTemplateMessage(event)
}
case 'getWXACode': {
return getWXACode(event)
}
case 'getOpenData': {
return getOpenData(event)
}
default: {
return
}
}
}
async function sendTemplateMessage(event) {
const { OPENID } = cloud.getWXContext()
// 接下来将新增模板、发送模板消息、然后删除模板
// 注意:新增模板然后再删除并不是建议的做法,此处只是为了演示,模板 ID 应在添加后保存起来后续使用
const addResult = await cloud.openapi.templateMessage.addTemplate({
id: 'AT0002',
keywordIdList: [3, 4, 5]
})
const templateId = addResult.templateId
const sendResult = await cloud.openapi.templateMessage.send({
touser: OPENID,
templateId,
formId: event.formId,
page: 'pages/openapi/openapi',
data: {
keyword1: {
value: '未名咖啡屋',
},
keyword2: {
value: '2019 年 1 月 1 日',
},
keyword3: {
value: '拿铁',
},
}
})
await cloud.openapi.templateMessage.deleteTemplate({
templateId,
})
return sendResult
}
async function getWXACode(event) {
// 此处将获取永久有效的小程序码,并将其保存在云文件存储中,最后返回云文件 ID 给前端使用
const wxacodeResult = await cloud.openapi.wxacode.get({
path: 'pages/openapi/openapi',
})
const fileExtensionMatches = wxacodeResult.contentType.match(/\/([^\/]+)/)
const fileExtension = (fileExtensionMatches && fileExtensionMatches[1]) || 'jpg'
const uploadResult = await cloud.uploadFile({
// 云文件路径,此处为演示采用一个固定名称
cloudPath: `wxacode_default_openapi_page.${fileExtension}`,
// 要上传的文件内容可直接传入图片 Buffer
fileContent: wxacodeResult.buffer,
})
if (!uploadResult.fileID) {
throw new Error(`upload failed with empty fileID and storage server status code ${uploadResult.statusCode}`)
}
return uploadResult.fileID
}
async function getOpenData(event) {
// 需 wx-server-sdk >= 0.5.0
return cloud.getOpenData({
list: event.openData.list,
})
}
{
"name": "openapi",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"wx-server-sdk": "~1.5.5"
}
}
//app.js
App({
onLaunch: function () {
if (!wx.cloud) {
console.error('请使用 2.2.3 或以上的基础库以使用云能力')
} else {
wx.cloud.init({
// env 参数说明:
// env 参数决定接下来小程序发起的云开发调用(wx.cloud.xxx)会默认请求到哪个云环境的资源
// 此处请填入环境 ID, 环境 ID 可打开云控制台查看
// 如不填则使用默认环境(第一个创建的环境)
// env: 'my-env-id',
traceUser: true,
})
}
this.globalData = {}
globalData: ({
userInfo: null,
navHeight: 0
})
// 获取手机系统信息
wx.getSystemInfo({
success: res => {
//导航高度
this.globalData.navHeight = res.statusBarHeight + 42;
}, fail(err) {
console.log(err);
}
})
var that = this
wx.getSystemInfo({
success: function (res) {
that.globalData.platform = res.platform
let totalTopHeight = 68
if (res.model.indexOf('iPhone X') !== -1) {
totalTopHeight = 88
} else if (res.model.indexOf('iPhone') !== -1) {
totalTopHeight = 64
}
that.globalData.statusBarHeight = res.statusBarHeight
that.globalData.titleBarHeight = totalTopHeight - res.statusBarHeight
},
failure() {
that.globalData.statusBarHeight = 0
that.globalData.titleBarHeight = 0
}
})
}
})
{
"pages": [
"pages/user/user",
"pages/index/index",
"pages/login/login",
"pages/header/header",
"pages/helper/helper",
"pages/summary/summary"
],
"window": {
"backgroundColor": "#F6F6F6",
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#F6F6F6",
"navigationBarTitleText": "111",
"navigationBarTextStyle": "black",
"navigationStyle": "custom"
},
"tabBar": {
"color": "#a9b7b7",
"selectedColor": "#11cd6e",
"borderStyle": "black",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页"
},
{
"pagePath": "pages/index/index",
"text": "首页"
},
{
"pagePath": "pages/helper/helper",
"text": "小地助手"
},
{
"pagePath": "pages/index/index",
"text": "首页"
},
{
"pagePath": "pages/user/user",
"text": "我的"
}
]
},
"sitemapLocation": "sitemap.json",
"style": "v2"
}
\ No newline at end of file
/**app.wxss**/
page{
height: 100%;
background: #fff;
color: #333;
display: flex;
flex-direction: column;
font: normal 30rpx/1.68 -apple-system-font, 'Helvetica Neue', Helvetica, 'Microsoft YaHei', sans-serif;
}
.container {
flex: 1;
display: flex;
flex-direction: column;
box-sizing: border-box;
}
/**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;
}
/* 头部公用的样式*/
.nav{
width: 100%;
overflow: hidden;
position: relative;
top: 0;
left: 0;
z-index: 10;
}
.nav-title{
width: 100%;
height: 45px;
line-height: 45px;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
z-index: 10;
font-family:PingFang-SC-Medium;
font-size:36rpx;
letter-spacing:2px;
}
.nav .back{
width: 22px;
height: 22px;
position: absolute;
bottom: 0;
left: 0;
padding: 10px 15px;
}
.bg-white{
background-color: #ffffff;
}
.bg-gray{
background-color: #f7f7f7;
}
.overflow{
overflow: auto;
}
.hidden{
overflow: hidden;
}
.custom_nav {
width: 100%;
background: #fff;
}
.custom_nav_box {
position: fixed;
width: 100%;
background: #fff;
}
.custom_nav_bar{
position: relative;
}
.custom_nav_box .nav_title {
font-size: 34rpx;
color: #000;
text-align: center;
position: absolute;
max-width: 360rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
font-weight: 600;
}
.custom_nav_box .custom_nav_icon {
position: absolute;
border: .5rpx solid rgba(0, 0, 0, .1);
border-radius: 50%;
display: flex;
padding: 0 10rpx
}
.custom_nav_icon .gobank {
background: url('https://www.easyicon.net/api/resizeApi.php?id=1225467&size=128') no-repeat center center;
background-size: 60%;
padding:0 5px;
margin: 4px 0;
}
.custom_nav_icon .home {
background: url('https://www.easyicon.net/api/resizeApi.php?id=1223065&size=128') no-repeat center center;
background-size: 60%;
padding:0 5px;
margin: 4px 0;
border-left: 1px solid rgba(0, 0, 0, .1)
}
.nav{
width: 100%;
overflow: hidden;
position: relative;
top: 0;
left: 0;
z-index: 10;
}
.nav-title{
width: 100%;
height: 45px;
line-height: 45px;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
z-index: 10;
font-family:PingFang-SC-Medium;
font-size:36rpx;
letter-spacing:2px;
}
.nav .back{
width: 22px;
height: 22px;
position: absolute;
bottom: 0;
left: 0;
padding: 10px 15px;
}
.bg-white{
background-color: #ffffff;
}
.bg-gray{
background-color: #f7f7f7;
}
.overflow{
overflow: auto;
}
.hidden{
overflow: hidden;
}
/* end */
\ No newline at end of file
const FATAL_REBUILD_TOLERANCE = 10
const SETDATA_SCROLL_TO_BOTTOM = {
scrollTop: 100000,
scrollWithAnimation: true,
}
Component({
properties: {
envId: String,
collection: String,
groupId: String,
groupName: String,
userInfo: Object,
onGetUserInfo: {
type: Function,
},
getOpenID: {
type: Function,
},
},
data: {
chats: [],
textInputValue: '',
openId: '',
scrollTop: 0,
scrollToMessage: '',
hasKeyboard: false,
},
methods: {
onGetUserInfo(e) {
this.properties.onGetUserInfo(e)
},
getOpenID() {
return this.properties.getOpenID()
},
mergeCommonCriteria(criteria) {
return {
groupId: this.data.groupId,
...criteria,
}
},
async initRoom() {
this.try(async () => {
await this.initOpenID()
const { envId, collection } = this.properties
const db = this.db = wx.cloud.database({
env: envId,
})
const _ = db.command
const { data: initList } = await db.collection(collection).where(this.mergeCommonCriteria()).orderBy('sendTimeTS', 'desc').get()
console.log('init query chats', initList)
this.setData({
chats: initList.reverse(),
scrollTop: 10000,
})
this.initWatch(initList.length ? {
sendTimeTS: _.gt(initList[initList.length - 1].sendTimeTS),
} : {})
}, '初始化失败')
},
async initOpenID() {
return this.try(async () => {
const openId = await this.getOpenID()
this.setData({
openId,
})
}, '初始化 openId 失败')
},
async initWatch(criteria) {
this.try(() => {
const { collection } = this.properties
const db = this.db
const _ = db.command
console.warn(`开始监听`, criteria)
this.messageListener = db.collection(collection).where(this.mergeCommonCriteria(criteria)).watch({
onChange: this.onRealtimeMessageSnapshot.bind(this),
onError: e => {
if (!this.inited || this.fatalRebuildCount >= FATAL_REBUILD_TOLERANCE) {
this.showError(this.inited ? '监听错误,已断开' : '初始化监听失败', e, '重连', () => {
this.initWatch(this.data.chats.length ? {
sendTimeTS: _.gt(this.data.chats[this.data.chats.length - 1].sendTimeTS),
} : {})
})
} else {
this.initWatch(this.data.chats.length ? {
sendTimeTS: _.gt(this.data.chats[this.data.chats.length - 1].sendTimeTS),
} : {})
}
},
})
}, '初始化监听失败')
},
onRealtimeMessageSnapshot(snapshot) {
console.warn(`收到消息`, snapshot)
if (snapshot.type === 'init') {
this.setData({
chats: [
...this.data.chats,
...[...snapshot.docs].sort((x, y) => x.sendTimeTS - y.sendTimeTS),
],
})
this.scrollToBottom()
this.inited = true
} else {
let hasNewMessage = false
let hasOthersMessage = false
const chats = [...this.data.chats]
for (const docChange of snapshot.docChanges) {
switch (docChange.queueType) {
case 'enqueue': {
hasOthersMessage = docChange.doc._openid !== this.data.openId
const ind = chats.findIndex(chat => chat._id === docChange.doc._id)
if (ind > -1) {
if (chats[ind].msgType === 'image' && chats[ind].tempFilePath) {
chats.splice(ind, 1, {
...docChange.doc,
tempFilePath: chats[ind].tempFilePath,
})
} else chats.splice(ind, 1, docChange.doc)
} else {
hasNewMessage = true
chats.push(docChange.doc)
}
break
}
}
}
this.setData({
chats: chats.sort((x, y) => x.sendTimeTS - y.sendTimeTS),
})
if (hasOthersMessage || hasNewMessage) {
this.scrollToBottom()
}
}
},
async onConfirmSendText(e) {
this.try(async () => {
if (!e.detail.value) {
return
}
const { collection } = this.properties
const db = this.db
const _ = db.command
const doc = {
_id: `${Math.random()}_${Date.now()}`,
groupId: this.data.groupId,
avatar: this.data.userInfo.avatarUrl,
nickName: this.data.userInfo.nickName,
msgType: 'text',
textContent: e.detail.value,
sendTime: new Date(),
sendTimeTS: Date.now(), // fallback
}
this.setData({
textInputValue: '',
chats: [
...this.data.chats,
{
...doc,
_openid: this.data.openId,
writeStatus: 'pending',
},
],
})
this.scrollToBottom(true)
await db.collection(collection).add({
data: doc,
})
this.setData({
chats: this.data.chats.map(chat => {
if (chat._id === doc._id) {
return {
...chat,
writeStatus: 'written',
}
} else return chat
}),
})
}, '发送文字失败')
},
async onChooseImage(e) {
wx.chooseImage({
count: 1,
sourceType: ['album', 'camera'],
success: async res => {
const { envId, collection } = this.properties
const doc = {
_id: `${Math.random()}_${Date.now()}`,
groupId: this.data.groupId,
avatar: this.data.userInfo.avatarUrl,
nickName: this.data.userInfo.nickName,
msgType: 'image',
sendTime: new Date(),
sendTimeTS: Date.now(), // fallback
}
this.setData({
chats: [
...this.data.chats,
{
...doc,
_openid: this.data.openId,
tempFilePath: res.tempFilePaths[0],
writeStatus: 0,
},
]
})
this.scrollToBottom(true)
const uploadTask = wx.cloud.uploadFile({
cloudPath: `${this.data.openId}/${Math.random()}_${Date.now()}.${res.tempFilePaths[0].match(/\.(\w+)$/)[1]}`,
filePath: res.tempFilePaths[0],
config: {
env: envId,
},
success: res => {
this.try(async () => {
await this.db.collection(collection).add({
data: {
...doc,
imgFileID: res.fileID,
},
})
}, '发送图片失败')
},
fail: e => {
this.showError('发送图片失败', e)
},
})
uploadTask.onProgressUpdate(({ progress }) => {
this.setData({
chats: this.data.chats.map(chat => {
if (chat._id === doc._id) {
return {
...chat,
writeStatus: progress,
}
} else return chat
})
})
})
},
})
},
onMessageImageTap(e) {
wx.previewImage({
urls: [e.target.dataset.fileid],
})
},
scrollToBottom(force) {
if (force) {
console.log('force scroll to bottom')
this.setData(SETDATA_SCROLL_TO_BOTTOM)
return
}
this.createSelectorQuery().select('.body').boundingClientRect(bodyRect => {
this.createSelectorQuery().select(`.body`).scrollOffset(scroll => {
if (scroll.scrollTop + bodyRect.height * 3 > scroll.scrollHeight) {
console.log('should scroll to bottom')
this.setData(SETDATA_SCROLL_TO_BOTTOM)
}
}).exec()
}).exec()
},
async onScrollToUpper() {
if (this.db && this.data.chats.length) {
const { collection } = this.properties
const _ = this.db.command
const { data } = await this.db.collection(collection).where(this.mergeCommonCriteria({
sendTimeTS: _.lt(this.data.chats[0].sendTimeTS),
})).orderBy('sendTimeTS', 'desc').get()
this.data.chats.unshift(...data.reverse())
this.setData({
chats: this.data.chats,
scrollToMessage: `item-${data.length}`,
scrollWithAnimation: false,
})
}
},
async try(fn, title) {
try {
await fn()
} catch (e) {
this.showError(title, e)
}
},
showError(title, content, confirmText, confirmCallback) {
console.error(title, content)
wx.showModal({
title,
content: content.toString(),
showCancel: confirmText ? true : false,
confirmText,
success: res => {
res.confirm && confirmCallback()
},
})
},
},
ready() {
global.chatroom = this
this.initRoom()
this.fatalRebuildCount = 0
},
})
{
"component": true,
"usingComponents": {}
}
\ No newline at end of file
<view class="chatroom">
<view class="header">
<!-- display number of people in the room -->
<view class="left"></view>
<!-- room name -->
<view class="middle">{{groupName}}</view>
<!-- reserved -->
<view class="right"></view>
</view>
<!-- chats -->
<scroll-view
class="body"
scroll-y
scroll-with-animation="{{scrollWithAnimation}}"
scroll-top="{{scrollTop}}"
scroll-into-view="{{scrollToMessage}}"
bindscrolltoupper="onScrollToUpper"
>
<view
wx:for="{{chats}}"
wx:key="{{item._id}}"
id="item-{{index}}"
class="message {{openId == item._openid ? 'message__self' : ''}}"
>
<image
class="avatar"
src="{{item.avatar}}"
mode="scaleToFill"
></image>
<view class="main">
<view class="nickname">{{item.nickName}}</view>
<block wx:if="{{item.msgType === 'image'}}">
<view class="image-wrapper">
<view class="loading" wx:if="{{item.writeStatus > -1}}">{{item.writeStatus}}%</view>
<image
src="{{item.tempFilePath || item.imgFileID}}"
data-fileid="{{item.tempFilePath || item.imgFileID}}"
class="image-content"
style="{{item.imgStyle}}"
mode="scallToFill"
bindtap="onMessageImageTap"></image>
</view>
</block>
<block wx:else>
<view class="text-wrapper">
<view class="loading" wx:if="{{item.writeStatus === 'pending'}}">···</view>
<view class="text-content">{{item.textContent}}</view>
</view>
</block>
</view>
</view>
</scroll-view>
<!-- message sender -->
<view class="footer">
<view class="message-sender" wx:if="{{userInfo}}">
<input
class="text-input"
type="text"
confirm-type="send"
bindconfirm="onConfirmSendText"
cursor-spacing="20"
value="{{textInputValue}}"
></input>
<image
src="./photo.png"
class="btn-send-image"
mode="scaleToFill"
bindtap="onChooseImage"
></image>
</view>
<view class="message-sender" wx:if="{{!userInfo}}">
<button
open-type="getUserInfo"
bindgetuserinfo="onGetUserInfo"
class="userinfo"
>请先登录后参与聊天</button>
</view>
</view>
</view>
.chatroom {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.chatroom .header {
flex-basis: fit-content;
display: flex;
flex-direction: row;
border-bottom: 1px solid #ddd;
padding: 20rpx 0 30rpx;
font-size: 30rpx;
/* background: rgb(34, 187, 47);
color: rgba(255, 255, 255, 1) */
/* font-family: 'Microsoft YaHei' */
}
.chatroom .header .left {
flex: 1;
}
.chatroom .header .middle {
flex: 2;
text-align: center;
}
.chatroom .header .right {
flex: 1;
}
.chatroom .body {
flex: 2;
display: flex;
flex-direction: column;
background: rgb(237,237,237);
padding-bottom: 16rpx;
}
.body .message {
display: flex;
flex-direction: row;
position: relative;
margin: 12rpx 0;
}
.body .message.message__self {
flex-direction: row-reverse;
}
.body .message .avatar {
position: relative;
top: 5rpx;
width: 60rpx;
height: 60rpx;
border-radius: 5rpx;
margin: 15rpx;
}
.body .message .main {
flex: 1;
display: flex;
flex-direction: column;
align-items: flex-start;
}
.body .message.message__self .main {
align-items: flex-end;
}
.body .message .nickname {
font-size: 24rpx;
color: #444;
}
.body .message .text-content {
border: 1px solid transparent;
border-radius: 3px;
background-color: #fff;
margin: 2px 0 0 0;
padding: 4px 10px;
font-size: 30rpx;
display: inline-block;
}
.body .message.message__self .text-content {
background-color: paleturquoise;
}
.body .message .text-wrapper {
display: flex;
flex-direction: row;
align-items: center;
max-width: 80%;
}
.body .message.message__self .text-wrapper .loading{
font-size: 16rpx;
margin-right: 18rpx;
}
.body .message .image-wrapper {
display: flex;
flex-direction: row;
align-items: center;
}
.body .message .image-content {
max-width: 240rpx;
max-height: 240rpx;
}
.body .message.message__self .image-wrapper .loading {
font-size: 20rpx;
margin-right: 18rpx;
}
.chatroom .footer {
flex-basis: fit-content;
display: flex;
flex-direction: row;
border-top: 1px solid #ddd;
font-size: 10rpx;
padding: 20rpx 30rpx;
background: rgb(246,246,246);
}
.chatroom .footer .message-sender {
flex: 1;
display: flex;
flex-direction: row;
}
.message-sender .text-input {
flex: 1;
font-size: 16px;
border: 1px solid transparent;
border-radius: 5px;
padding: 3px 6px;
margin: 0 10px 0 5px;
background: #fff;
}
.message-sender .btn-send-image {
width: 50rpx;
height: 50rpx;
align-self: center;
}
button {
font-size: 30rpx;
}
button.userinfo {
background: darkturquoise;
color: aliceblue;
padding: 0 100rpx;
border: 1px solid #ddd;
border-radius: 20px;
}
const app = getApp()
Component({
properties: {
// 这里定义了innerText属性,属性值可以在组件使用时指定
innerTitle: {
type: String,
value: '头部标题'
},
isShowBack: {
type: String,
value: "true"
},
isShowPop:{
type: String,
value: "true"
}
},
data: {
// 这里是一些组件内部数据
someData: {
statusBarHeight: app.globalData.statusBarHeight,
titleBarHeight: app.globalData.titleBarHeight
}
},
onLoad: function (options) {
this.setData({
navH: App.globalData.navHeight
})
},
methods: {
// 这里是一个自定义方法
goback: function () {
wx.navigateBack({
delta: 1,
})
},
goUser:function(){
wx.navigateBack({
delta: 1,
})
}
}
})
\ No newline at end of file
{
"component": true
}
\ No newline at end of file
<!--template.wxml-->
<!-- 这是自定义组件的内部WXML结构 -->
<view style="padding-top:{{someData.statusBarHeight+someData.titleBarHeight}}px">
<view class="hh-header">
<view class="status-bar" style="height:{{someData.statusBarHeight}}px"></view>
<view class="title-bar" style="height:{{someData.titleBarHeight}}px">
<view wx:if="{{isShowBack=='true'}}" class='hh-nav-back'>
<view wx:if="{{isShowPop=='true'}}" class='back ico-back' bindtap='goback'></view>
<view wx:if="{{isShowPop=='false'}}" class='back ico-pop ' bindtap='goback'>
<!-- <image src='../../images/user.png' mode='aspectFit' class=''></image> -->
</view>
</view>
<view wx:if="{{isShowBack=='false'}}" class='hh-nav-back'></view>
<view class="hh-title">{{innerTitle}}</view>
<view class="hh-nav-right"></view>
</view>
</view>
</view>
<slot></slot>
\ No newline at end of file
.ico-back{
width: 44rpx;
height: 36rpx;
background-size: contain;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjAwRjFBMThDOEU1NDExRThCQUMxRTFBRUNDRDNCMkJEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjAwRjFBMThEOEU1NDExRThCQUMxRTFBRUNDRDNCMkJEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDBGMUExOEE4RTU0MTFFOEJBQzFFMUFFQ0NEM0IyQkQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDBGMUExOEI4RTU0MTFFOEJBQzFFMUFFQ0NEM0IyQkQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7a0EjNAAAA80lEQVR42sTYOw7DIAwGYNxuPXHnTtygvUAuWalyE6WRMlBj7N/GEkOiCD4B4eHCzEUq3ljruPMe9fcstxcJOmGOqNNADcwR+SABs6SDOphrKqiHSZ3UGkwaSItJAY1gwkGjmFCQBRMGsmJCQB4MHOTFQEEIDAyEwkBASIwGRIrFr/XBZy03InpbQFJcFHW8Gu+2nnmUiFAM2daLzz/DVtHtaSc1DIX87SEo9MLoRkVsHS5U1OZqRkUeP0yo6APaMCrjCDuEyjrkq1GZ1yAVKvui2EXNuEqLqFnJBgk1LR3TQi08OWF1RqmyH8SAtB0yvgIMAGA41d9Fo4AZAAAAAElFTkSuQmCC);
background-repeat: no-repeat;
background-position-x: 20rpx;
}
.ico-pop{width: 36rpx;
height: 36rpx;
margin-left: 22rpx; background-image: url(data:image/png;base64,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);
background-size: 100%;
}
.hh-header {
position: fixed;
top: 0;
width: 100%;
background-color: #6cb6f8;
z-index: 99;
}
.hh-title{
font-size: 38rpx;
text-align: center;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.title-bar {
display: flex;
justify-content: space-between;
align-items: center;
}
.hh-nav-right{
width: 116px;
}
.hh-nav-back{
width: 116px;
}
\ No newline at end of file
// miniprogram/pages/helper/helper.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--miniprogram/pages/helper/helper.wxml-->
<text>miniprogram/pages/helper/helper.wxml</text>
/* miniprogram/pages/helper/helper.wxss */
\ No newline at end of file
// miniprogram/pages/index/index.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {}
}
\ No newline at end of file
<!--miniprogram/pages/index/index.wxml-->
<text>miniprogram/pages/index/index.wxml</text>
/* miniprogram/pages/index/index.wxss */
\ No newline at end of file
// miniprogram/pages/login/login.js
const App = getApp();
Page({
onLoad: function (options) { //全部 减去 头部
this.setData({
navH: App.globalData.navHeight
})
},
data: {
title: '登录',
// 验证手机号
loginPhone: false,
loginPwd: false,
loveChange: true,
hongyzphone: '',
// 验证码是否正确
zhengLove: true,
huoLove: '',
getText2: '获取验证码',
},
// 手机验证
lovePhone: function (e) {
let phone = e.detail.value;
this.setData({ hongyzphone: phone })
if (!(/^1[34578]\d{9}$/.test(phone))) {
this.setData({
lovePhone: false
})
console.log(phone.length)
if (phone.length >= 11) {
wx.showToast({
title: '手机号有误',
icon: 'none',
duration: 1000
})
}
} else {
this.setData({
lovePhone: true
})
}
},
// 验证码输入
yanLoveInput: function (e) {
let that = this;
let yanLove = e.detail.value;
let huoLove = this.data.huoLove;
that.setData({
yanLove: yanLove,
zhengLove: false,
})
if (yanLove.length >= 4) {
if (yanLove == huoLove) {
that.setData({
zhengLove: true,
})
} else {
that.setData({
zhengLove: false,
})
wx.showModal({
content: '输入验证码有误',
showCancel: false,
success: function (res) { }
})
}
}
},
// 验证码按钮
yanLoveBtn: function () {
let loveChange = this.data.loveChange;
console.log(loveChange)
let lovePhone = this.data.lovePhone;
console.log(lovePhone)
let phone = this.data.hongyzphone;
console.log(phone)
let n = 59;
let that = this;
if (!lovePhone) {
wx.showToast({
title: '手机号有误',
icon: 'success',
duration: 1000
})
} else {
if (loveChange) {
this.setData({
loveChange: false
})
let lovetime = setInterval(function () {
let str = '(' + n + ')' + '重新获取'
that.setData({
getText2: str
})
if (n <= 0) {
that.setData({
loveChange: true,
getText2: '重新获取'
})
clearInterval(lovetime);
}
n--;
}, 1000);
//获取验证码接口写在这里
//例子 并非真实接口
app.agriknow.sendMsg(phone).then(res => {
console.log('请求获取验证码.res =>', res)
}).catch(err => {
console.log(err)
})
}
}
},
//form表单提交
formSubmit(e) {
let val = e.detail.value
console.log('val', val)
var phone = val.phone //电话
var phoneCode = val.phoneCode //验证码
wx.navigateTo({
url: '../user/user',
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
\ No newline at end of file
{
"usingComponents": {
"component-topnav": "/pages/header/header"
}
}
\ No newline at end of file
<view class="login-wrap">
<component-topnav inner-title="{{title}}" inner-icon="{{icon}}" is-show-back="true" is-show-pop="true"></component-topnav> <!--//显示返回按钮 -->
<!-- 中间 -->
<scroll-view class=' overflow' style='height:calc(100vh - {{navH}}px)' scroll-y >
<!-- 绑定手机号 -->
<view class='content'>
<form bindsubmit="formSubmit">
<view class='phone-box'>
<text class='phone'>手机号</text>
<input name="phone" type='number' placeholder="请输入手机号" maxlength='11' name="phone" class='number' bindinput='lovePhone' />
</view>
<view class='phone-box'>
<text class='phone'>验证码</text>
<input name="phoneCode" placeholder="请输入验证码" class='number' placeholder-style='color:#bbb' bindinput="yanLoveInput" />
<view bindtap='yanLoveBtn' class='getNum'>{{getText2}}</view>
</view>
<button formType="submit" class='submit'>绑定</button>
</form>
</view>
<image src='/images/login-bj_02.jpg' class="login-btm"></image>
</scroll-view>
</view>
\ No newline at end of file
/* miniprogram/pages/login/login.wxss */
.content {
width: 100%;
height: auto;
padding: 0 50rpx;
box-sizing: border-box;
}
.phone-box {
width: 100%;
height: 89rpx;
border-bottom: 1rpx solid #efefef;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.phone {
color: #333;
margin-right: 60rpx;
font-size: 28rpx;
}
.number {
color: #333;
font-size: 28rpx;
width: 200rpx;
}
.getNum {
width:210rpx;
height:48rpx;
background:#2995fa;
border-radius:8rpx;
font-size:28rpx;
font-family:PingFang-SC-Medium;
color:rgba(255, 255, 255, 1);
line-height:48rpx;
margin-right:36rpx;
text-align:center;
}
.submit {
padding: 10px 24px;
width: 480rpx;
height: 80rpx;
background: #2995fa;
border-radius: 8rpx;
margin-top: 80rpx;
color: #fff;
font-size: 32rpx;
}
.login-wrap{background: #fff}
.login-btm{position: absolute;background-size:100%;bottom: 0;height: 30%;width: 100%;
}
\ No newline at end of file
const App = getApp();
{
}
Page({
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) { //全部 减去 头部
this.setData({
navH: App.globalData.navHeight
})
},
data: {
motto: 'Hello World',
userInfo: {},
title: '年度总结',
scrollindex: 0, //当前页面的索引值
totalnum: 4, //总共页面数
starty: 0, //开始的位置x
endy: 0, //结束的位置y
critical: 100, //触发翻页的临界值
margintop: 0, //滑动下拉距离
},
scrollTouchstart: function (e) {
let py = e.touches[0].pageY;
this.setData({
starty: py
})
},
scrollTouchmove: function (e) {
let py = e.touches[0].pageY;
let d = this.data;
this.setData({
endy: py,
})
if (py - d.starty < 100 && py - d.starty > -100) {
this.setData({
margintop: py - d.starty
})
}
},
scrollTouchend: function (e) {
let d = this.data;
if (d.endy - d.starty > 100 && d.scrollindex > 0) {
this.setData({
scrollindex: d.scrollindex - 1
})
} else if (d.endy - d.starty < -100 && d.scrollindex < this.data.totalnum - 1) {
this.setData({
scrollindex: d.scrollindex + 1
})
}
this.setData({
starty: 0,
endy: 0,
margintop: 0
})
},
})
\ No newline at end of file
{
"usingComponents": {
"component-topnav": "/pages/header/header"
}
}
\ No newline at end of file
<view>
<component-topnav inner-title="{{title}}" inner-icon="{{icon}}" is-show-back="true" is-show-pop="false"></component-topnav> <!--//显示返回按钮 -->
<!-- 中间 -->
<scroll-view class='bg-gray overflow' style='height:calc(100vh - {{navH}}px)' scroll-y >
<view class="container1 container-fill">
<view class="scroll-fullpage" bindtouchstart="scrollTouchstart" bindtouchmove="scrollTouchmove" bindtouchend="scrollTouchend" style="transform:translateY(-{{scrollindex*100}}%);margin-top: {{margintop}}px">
<view class="section section01 {{scrollindex==0?'active':''}}" style="background: #3399FF;">
<image src="/images/ndzj_01.jpg"></image>
</view>
<view class="section section02 {{scrollindex==1?'active':''}}" style="background: #00CC66;">
<image src="/images/ndzj_02.jpg"></image>
</view>
<view class="section section03 {{scrollindex==2?'active':''}}" style="background: #33CCCC;">
<image src="/images/ndzj_03.jpg"></image>
</view>
<view class="section section04 {{scrollindex==3?'active':''}}" style="background: #6699FF;">
<image src="/images/ndzj_04.jpg"></image>
</view>
<!-- <view class="section section05 {{scrollindex==4?'active':''}}" style="background: #9966FF;">
<text class="section-maintitle">测试测试测试5</text>
<text class="section-subtitle">cinoLiu--5</text>
</view> -->
</view>
</view>
</scroll-view>
</view>
\ No newline at end of file
.section image{height: 100%; width: 100%}
.container-fill{
height: 100%;
overflow: hidden;
}
.scroll-fullpage{
height: 100%;
transition: all 0.3s;
}
.section{
height: 100%;
}
.section-maintitle{
display: block;
text-align: center;
font-size: 50rpx;
color: #fff;
font-weight: bold;
letter-spacing: 10rpx;
padding-top: 140rpx;
}
.section-subtitle{
display: block;
text-align: center;
font-size: 40rpx;
color: #fff;
font-weight: bold;
letter-spacing: 10rpx;
}
.active .section-maintitle,
.active .section-subtitle{
animation: mymove 0.8s;
}
@keyframes mymove{
from {
transform: translateY(-400rpx) scale(0.5) rotateY(90deg);
}
to {
transform: translateY(0) scale(1) rotateY(0);
}
}
\ No newline at end of file
// miniprogram/pages/user/user.js
const App = getApp();
Page({
data: {
title: '个人中心',
},
joinVip: function () { //加入VIP
wx.navigateTo({
url: '../summary/summary',
})
},
shezhi:function(){
wx.navigateTo({
url: '../login/login',
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
navH: App.globalData.navHeight
})
}
})
{
"usingComponents": {
"component-topnav": "/pages/header/header"
}
}
\ No newline at end of file
<view>
<component-topnav inner-title="{{title}}" inner-icon="{{icon}}" is-show-back="false"></component-topnav> <!--//显示返回按钮 -->
<!-- 中间 -->
<scroll-view class='bg-gray overflow' style='height:calc(100vh - {{navH}}px)' scroll-y >
<!-- 开始 -->
<!--pages/my/my.wxml-->
<form reportSubmit bindsubmit="submitFormId">
<view class="header">
<view class="user" hoverClass="none">
<view class="user_box">
<view catchtap="previewImage" class="logo">
<image src="{{userInfo.avatarUrl}}"></image>
<view class="cu-tag badge {{male==1?'icon-male bg-blue':'icon-female bg-pink'}}"></view>
</view>
<block wx:if="{{vip}}">
<view class="user_info">
<view class="user_name">
<text>{{userInfo.nickName}}</text>
<image src="/images/main/vip.png"></image>
</view>
<view class="vip_expires">vip到期时间:{{vip_time}},<button class="joinVip" bindtap='joinVip'>马上续费</button></view>
</view>
</block>
<block wx:else>
<view class="user_info">
<view class="user_name">
<text>{{userInfo.nickName}}</text>
</view>
<view class="vip_expires" >小珊珊
</view>
<view class="vip_iphone"> 183****2312</view>
</view>
</block>
</view>
</view>
<view class="vip_shezhi">
<image src='/images/icon_03.png' class="img" bindtap='shezhi'></image></view>
<view class="vip_title" bindtap='joinVip'>
<button class=" item item-buttom">
<image src='/images/icon_15.png' style="width:35rpx; height:35rpx;padding-right:8rpx;"></image>
<text>年度总结</text>
</button>
</view>
</view>
<!-- 功能列表 -->
<view class="nav">
<view bindtap="openPage" class="item" data-url="/pages/my_course/my_course" formType="submit" hoverClass="none">
<view class='wallet'>
<!-- <text class='icon-news icon'></text> -->
<image src='/images/icon_19.png' class="img" bindtap='shezhi'></image>
<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
<text>单位名称</text>
<text></text>
</view>
<view class="icon">
<text class='icon-right'></text>
</view>
</view>
<view bindtap="openPage" class="item" data-url="/pages/collect/collect" formType="submit" hoverClass="none">
<view class='wallet'>
<!-- <text class='icon-favor icon'></text> -->
<image src='/images/icon_22.png' class="img" bindtap='shezhi'></image>
<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
<text>所处级别</text>
</view>
<view class="icon">
<text class='icon-right'></text>
</view>
</view>
<view bindtap="openPage" class="item" data-url="/pages/purchase_history/purchase_history" formType="submit" hoverClass="none">
<view class='wallet'>
<!-- <text class='icon-form icon'></text> -->
<image src='/images/icon_24.png' class="img" bindtap='shezhi'></image>
<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
<text>技术级别</text>
</view>
<view class="icon">
<text class='icon-right'></text>
</view>
</view>
<view bindtap="chooseGeren" class="item">
<view class='wallet'>
<!-- <text class='icon-location icon'></text> -->
<image src='/images/icon_26.png' class="img" bindtap='shezhi'></image>
<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
<text>任职日期</text>
</view>
<view class="icon">
<text class='icon-right'></text>
</view>
</view>
<view bindtap="openPage" class="item" data-url="/pages/about/about" formType="submit" hoverClass="none">
<view class='wallet'>
<!-- <text class='icon-info icon'></text> -->
<image src='/images/icon_28.png' class="img" bindtap='shezhi'></image>
<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
<text>技术职位</text>
</view>
<view class="icon">
<text class='icon-right'></text>
</view>
</view>
<view class="item" bindtap='changeView'>
<view class='wallet'>
<!-- <text class='icon-settings icon'></text> -->
<image src='/images/icon_30.png' class="img" bindtap='shezhi'></image>
<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
<text>政治面貌</text>
</view>
<view class="icon">
<text class='icon-right'></text>
</view>
</view>
<view class="item" formType="submit" hoverClass="none" openType="contact">
<view class='wallet'>
<image src='/images/icon_32.png' class="img" bindtap='shezhi'></image>
<!-- <text class='icon-service icon'></text> -->
<text decode="{{true}}" space="{{true}}">&nbsp;&nbsp;</text>
<text>邮箱</text>
</view>
<view class="icon">
<text class='icon-right'></text>
</view>
</view>
</view>
</form>
<!-- end-->
</scroll-view>
</view>
\ No newline at end of file
.header {
padding: 40rpx 25rpx 40rpx 0rpx;
width: 100%;
background-image:url(data:image/jpeg;base64,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);
background-size:100%;
position:relative;
background-repeat:no-repeat;
}
.vip_title .item{background: #fff;
width: 100%;
padding: 0;
border-radius: 60rpx;
font-size: 34rpx;
padding-top: 20rpx;
box-shadow: 1px 2px 12px #0073cb;
}
.vip_title{position: relative;
width: 280rpx;
height: 60rpx;
top: 35rpx;
left: 50%;
margin-left: -140rpx;z-index: 11;
}
.user {
display: flex;
justify-content: space-between;
align-items: center;padding-left: 30rpx;
}
.header .gif-wave{
position: absolute;
width: 100%;
bottom: 0;
left: 0;
z-index: 99;
mix-blend-mode: screen;
height: 100rpx;
}
.user_box {
display: flex;
align-items: center;
}
.edit {
display: flex;
width: 70rpx;
height: 70rpx;
padding: 18rpx;
box-sizing: border-box;
}
.edit image {
width: 100%;
height: 100%;
transform: rotate(180deg);
}
.logo {
width: 150rpx;
height: 150rpx;
border-radius: 50%;
background: #fff;
will-change: transform;
position:relative;
}
.logo image {
width: 100%;
height: 100%;
}
.logo image {
width: 100%;
height: 100%;
border-radius: 100%;
will-change: transform;
}
.user_info {
padding-left: 32rpx;
}
.user_name {
display: flex;
align-items: center;
font-size: 36rpx;
font-weight: bold;
color: #fff;
}
.user_name image {
margin-left: 16rpx;
width: 84rpx;
height: 31rpx;
}
.vip_expires {
margin-top: 12rpx;
font-size: 27rpx;
color: #fff;
}
.info {
display: flex;
margin-top: 62rpx;
width: 100%;
height: 110rpx;
}
.info .item {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
line-height: 1.5;
border-right: 1px solid #fff;
}
.info .item:last-child {
border-right: none;
}
.info .item .count {
font-size: 46rpx;
color: #fff;
}
.info .item .title {
font-size: 24rpx;
color: #fff;
}
.card {
display: flex;
justify-content: space-between;
padding: 25rpx;
background: #fff;
}
.card .item {
display: flex;
justify-content: center;
align-items: center;
width: 340rpx;
height: 200rpx;
font-size: 34rpx;
color: #fff;
border-radius: 16rpx;
background: #d2d2d2;
overflow: hidden;
will-change: transform;
}
.card .item image {
width: 100%;
height: 100%;
}
.vip_shezhi{position: absolute;right: 60rpx;
top: 34rpx; z-index: 111}
.vip_shezhi .img{width: 40rpx;height: 40rpx;}
.vip_iphone{padding: 4rpx 12rpx; color: #fff;background-color: #3678ea;border-radius: 36rpx;
}
.nav {
padding: 50rpx 25rpx 0;
font-size: 34rpx;
background: #fff;
}
.nav .item {width: 100%;
display: flex;
justify-content: space-between;
border-bottom: 1px solid #e5e5e5;
padding: 30rpx 0;
}
.nav button.item {
margin: 0;
line-height: inherit;
font-size: inherit;
font-weight: normal;
}
.nav button.item .new_tips {
position: relative;
}
.nav button.item .new_tips:before {
content: '';
position: absolute;
top: -2rpx;
right: -14rpx;
width: 20rpx;
height: 20rpx;
background-color: #f43530;
border-radius: 100%;
}
.nav .icon {
display: flex;
align-items: center;
font-size: 40rpx;
color:#333;
}
.nav .wallet{
display: flex;
width: 100%;
}
.nav .wallet .icon {
color: #c21327;
}
.nav .discount_coupon .icon {
color: #bd9445;
}
.nav image {
margin-left: 20rpx;
width: 40rpx;
height: 40rpx;
}
.joinVip{
font-size:27rpx;
line-height:27rpx;
display:inline-block;
color:#dab643;
text-decoration:underline;
}
.right-text{float: right}
\ No newline at end of file
{
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
"rules": [{
"action": "allow",
"page": "*"
}]
}
\ No newline at end of file
page {
background: #f6f6f6;
display: flex;
flex-direction: column;
justify-content: flex-start;
}
.list {
margin-top: 40rpx;
height: auto;
width: 100%;
background: #fff;
padding: 0 40rpx;
border: 1px solid rgba(0, 0, 0, 0.1);
border-left: none;
border-right: none;
transition: all 300ms ease;
display: flex;
flex-direction: column;
align-items: stretch;
box-sizing: border-box;
}
.list-item {
width: 100%;
padding: 0;
line-height: 104rpx;
font-size: 34rpx;
color: #007aff;
border-top: 1px solid rgba(0, 0, 0, 0.1);
display: flex;
flex-direction: row;
align-content: center;
justify-content: space-between;
box-sizing: border-box;
}
.list-item:first-child {
border-top: none;
}
.list-item image {
max-width: 100%;
max-height: 20vh;
margin: 20rpx 0;
}
.request-text {
color: #222;
padding: 20rpx 0;
font-size: 24rpx;
line-height: 36rpx;
word-break: break-all;
}
.guide {
width: 100%;
padding: 40rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
}
.guide .headline {
font-size: 34rpx;
font-weight: bold;
color: #555;
line-height: 40rpx;
}
.guide .p {
margin-top: 20rpx;
font-size: 28rpx;
line-height: 36rpx;
color: #666;
}
.guide .code {
margin-top: 20rpx;
font-size: 28rpx;
line-height: 36rpx;
color: #666;
background: white;
white-space: pre;
}
.guide .code-dark {
margin-top: 20rpx;
background: rgba(0, 0, 0, 0.8);
padding: 20rpx;
font-size: 28rpx;
line-height: 36rpx;
border-radius: 6rpx;
color: #fff;
white-space: pre
}
.guide image {
max-width: 100%;
}
.guide .image1 {
margin-top: 20rpx;
max-width: 100%;
width: 356px;
height: 47px;
}
.guide .image2 {
margin-top: 20rpx;
width: 264px;
height: 100px;
}
.guide .flat-image {
height: 100px;
}
.guide .code-image {
max-width: 100%;
}
.guide .copyBtn {
width: 180rpx;
font-size: 20rpx;
margin-top: 16rpx;
margin-left: 0;
}
.guide .nav {
margin-top: 50rpx;
display: flex;
flex-direction: row;
align-content: space-between;
}
.guide .nav .prev {
margin-left: unset;
}
.guide .nav .next {
margin-right: unset;
}
{
"miniprogramRoot": "miniprogram/",
"cloudfunctionRoot": "cloudfunctions/",
"setting": {
"urlCheck": true,
"es6": true,
"postcss": true,
"minified": true,
"newFeature": true,
"enhance": true
},
"appid": "wxf63104bcd784e195",
"projectname": "weixinDemo",
"libVersion": "2.8.1",
"simulatorType": "wechat",
"simulatorPluginLibVersion": {},
"compileType": "miniprogram",
"condition": {
"search": {
"current": -1,
"list": []
},
"conversation": {
"current": -1,
"list": []
},
"plugin": {
"current": -1,
"list": []
},
"game": {
"list": []
},
"miniprogram": {
"current": 0,
"list": [
{
"id": -1,
"name": "db guide",
"pathName": "pages/databaseGuide/databaseGuide"
}
]
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment