完成微信登录对接,及其他界面上的修正

This commit is contained in:
7YHong 2022-02-22 00:53:59 +08:00
parent b68dc9abcd
commit 37021ea19b
10 changed files with 619 additions and 442 deletions

View File

@ -19,7 +19,9 @@
}, },
"dependencies": { "dependencies": {
"apex-ui": "^1.9.2", "apex-ui": "^1.9.2",
"dayjs": "^1.10.7" "dayjs": "^1.10.7",
"markdown-it": "^12.3.2",
"punycode": "^2.1.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/runtime": "^7.12.5", "@babel/runtime": "^7.12.5",

View File

@ -5,17 +5,13 @@
const $utils = require('./helper/utils').default const $utils = require('./helper/utils').default
const $apis = require('./helper/apis').default const $apis = require('./helper/apis').default
const $storage = require('@system.storage')
console.log('app: create channel');
const appInitC = new BroadcastChannel('init');
/* @desc: 注入方法至全局 global,以便页面调用 */ /* @desc: 注入方法至全局 global,以便页面调用 */
const hook2global = Object.getPrototypeOf(global) || global; const hook2global = Object.getPrototypeOf(global) || global;
hook2global.$utils = $utils hook2global.$utils = $utils
hook2global.API = $apis hook2global.API = $apis
const _promiseFactory = (pointer, params = {}) => { hook2global.promiseFactory = (pointer, params = {}) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
params = Object.assign({ params = Object.assign({
success: (data) => { resolve(data); }, success: (data) => { resolve(data); },
@ -24,38 +20,9 @@
pointer(params); pointer(params);
}); });
} }
hook2global.promiseFactory = _promiseFactory;
const userinfoFromToken = async (token) => {
$apis.setToken(token)
let userinfo = await $apis.userInfo()
userinfo.token = token
hook2global.$userinfo = userinfo
_promiseFactory($storage.set, { key: 'token', value: token })
appInitC.postMessage(1)
appInitC.close()
}
export default { export default {
onCreate() { onCreate() {
console.log('app: init oncreate');
appInitC.onmessage = ({ data: token }) => {
console.log('app: login success, data=', JSON.stringify(token));
userinfoFromToken(token)
}
(async () => {
let token = await _promiseFactory($storage.get, { key: 'token' })
.catch((data, code) => {
console.warn(`get token from storage fail, code = ${code}`)
})
console.log(`app: get token = ${token} from storage success`)
if (token.length === 0) {
console.log('app: init token.length==0, send init message');
appInitC.postMessage(0)
return
}
userinfoFromToken(token)
})()
} }
} }

View File

@ -8,7 +8,7 @@ import $ajax from './ajax'
* *
* 备注如果您不需要发起请求删除 apis 目录以及 app.ux 中引用即可 * 备注如果您不需要发起请求删除 apis 目录以及 app.ux 中引用即可
*/ */
const baseUrl = 'https://pushdeer.qiyanghong.cn:5443/' const baseUrl = 'YOUR_API_ADDRESS'
let token = "" let token = ""
@ -24,23 +24,26 @@ export default {
login() { login() {
return to($ajax.get(`${baseUrl}login/fake`).then(res => res.token)) return to($ajax.get(`${baseUrl}login/fake`).then(res => res.token))
}, },
wxLogin(code) {
return $ajax.post(`${baseUrl}login/wecode`, { code }).then(res => res.token)
},
userInfo() { userInfo() {
return to($ajax.post(`${baseUrl}user/info`, { token })) return $ajax.post(`${baseUrl}user/info`, { token })
}, },
// device // device
deviceReg(name, device_id) { deviceReg(name, device_id) {
return to($ajax.post(`${baseUrl}device/reg`, { token, is_clip: 1, name, device_id })) return $ajax.post(`${baseUrl}device/reg`, { token, is_clip: 1, name, device_id })
.then(res => res.devices) .then(res => res.devices)
}, },
deviceList() { deviceList() {
return to($ajax.post(`${baseUrl}device/list`, { token })) return $ajax.post(`${baseUrl}device/list`, { token })
.then(res => res.devices) .then(res => res.devices)
}, },
deviceRename(id, name) { deviceRename(id, name) {
return to($ajax.post(`${baseUrl}device/rename`, { token, id, name })) return $ajax.post(`${baseUrl}device/rename`, { token, id, name })
}, },
deviceRemove(id) { deviceRemove(id) {
return to($ajax.post(`${baseUrl}device/remove`, { token, id })) return $ajax.post(`${baseUrl}device/remove`, { token, id })
}, },
// key // key
keyGen() { keyGen() {

View File

@ -1,66 +1,75 @@
{ {
"package": "dev.pushdeer.app", "package": "dev.pushdeer.app",
"name": "pushdeer", "name": "pushdeer",
"versionName": "1.0.0", "versionName": "1.0.0",
"versionCode": 1, "versionCode": 1,
"minPlatformVersion": 1070, "minPlatformVersion": 1090,
"icon": "/assets/images/logo.svg", "icon": "/assets/images/logo.png",
"features": [ "features": [
{ {
"name": "system.prompt" "name": "system.prompt"
},
{
"name": "system.router"
},
{
"name": "system.clipboard"
},
{
"name": "system.fetch"
},
{
"name": "system.storage"
},
{
"name": "system.device"
},
{
"name": "service.push"
},
{
"name": "service.wxaccount",
"params": {
"appId": "YOUR_APPID"
}
}
],
"permissions": [
{
"origin": "*"
}
],
"config": {
"logLevel": "debug"
}, },
{ "router": {
"name": "system.router" "entry": "pages",
"pages": {
"pages": {
"component": "index"
},
"pages/Home": {
"component": "index",
"launchMode": "singleTask"
},
"pages/component": {
"component": "devpage"
},
"pages/swipe": {
"component": "index"
}
}
}, },
{ "display": {
"name": "system.clipboard" "titleBarBackgroundColor": "#f2f2f2",
}, "titleBarTextColor": "#414141",
{ "pages": {
"name": "system.fetch" "pages": {
}, "titleBar": false
{ },
"name": "system.storage" "pages/Home": {
}, "titleBar": false
{ }
"name": "system.device" }
} }
],
"permissions": [
{
"origin": "*"
}
],
"config": {
"logLevel": "debug"
},
"router": {
"entry": "pages",
"pages": {
"pages": {
"component": "index"
},
"pages/Home": {
"component": "index",
"launchMode": "singleTask"
},
"pages/component": {
"component": "devpage"
},
"pages/swipe":{
"component": "index"
}
}
},
"display": {
"titleBarBackgroundColor": "#f2f2f2",
"titleBarTextColor": "#414141",
"pages": {
"pages": {
"titleBar": false
},
"pages/Home": {
"titleBar": false
}
}
}
} }

View File

@ -1,5 +1,4 @@
<import name="dev-card" src="./card"></import> <import name="dev-card" src="./card"></import>
<import name="swipe-item" src="../swipeItem"></import>
<template> <template>
<div class="wrapper"> <div class="wrapper">
<!-- <text class="title">device</text> <!-- <text class="title">device</text>
@ -10,99 +9,114 @@
</div> </div>
<list style="width: 80%"> <list style="width: 80%">
<list-item type="devitem" for="{{ dev in devs}}"> <list-item type="devitem" for="{{ dev in devs}}">
<swipe-item> <slide-view
<dev-card id="sv{{$idx}}"
slot="content" style="width: 100%"
dev-obj="{{ dev }}" buttons="{{slideButton}}"
idx="{{ $idx }}" layer="same"
></dev-card> isopen="false"
<div edge="right"
slot="right" enableslide="true"
style="height: 60px;width: 100px;padding: 0 20px;justify-content: center;" @ButtonClick="handleDeleteClick($idx)"
@click="handleDeleteClick($idx)" >
> <dev-card dev-obj="{{ dev }}" idx="{{ $idx }}"></dev-card>
<image src="/assets/images/trash.png"></image> </slide-view>
</div>
</swipe-item>
</list-item> </list-item>
</list> </list>
</div> </div>
</template> </template>
<script> <script>
import device from '@system.device' import device from '@system.device'
const devIcon = { const devIcon = {
"ios": "/assets/images/device-iphone.png", "ios": "/assets/images/device-iphone.png",
"default": "/assets/images/device-iphone.png", "default": "/assets/images/device-iphone.png",
}
const handleDevResult = (data) => data.map((item) => {
return {
id: item.id,
name: item.name,
icon: item.type in devIcon ? devIcon[item.type] : devIcon["default"],
} }
})
const handleDevResult = (data) => data.map((item) => { export default {
return { data: {
id: item.id, devs: [],
name: item.name, slideButton: [
icon: item.type in devIcon ? devIcon[item.type] : devIcon["default"], {
} id: "delBtn",
}) buttonWidth: '100px',
iconWidth: '38px',
export default { iconHeight: '47px',
data: { icon: '/assets/images/trash.png',
devs: [], backgroundColor: "transparent",
},
async onPlusBtnClick() {
try {
let devId = await promiseFactory(device.getDeviceId, {})
.then(res => res.deviceId)
let devList = await API.deviceReg($userinfo.name + '的手机', devId)
// console.log('devList: ', JSON.stringify(devList));
this.devs = handleDevResult(devList)
} catch (e) {
$utils.showToast(e.name + ':' + e.message)
} }
}, ]
},
async handleDeleteClick(idx) { async onPlusBtnClick() {
try {
let devId = await promiseFactory(device.getDeviceId, {})
.then(res => res.deviceId)
let devList = await API.deviceReg(this.$app.$def.userinfo.name + '的手机', devId)
console.log('devList: ', JSON.stringify(devList));
this.devs = handleDevResult(devList)
} catch (e) {
$utils.showToast(e.name + ':' + e.message)
}
},
async handleDeleteClick(idx) {
this.$element('sv'+idx).close({animation:false})
try {
const id = this.devs[idx].id const id = this.devs[idx].id
console.log(`device: del item: idx=${idx}, id=${id}`); console.log(`device: del item: idx=${idx}, id=${id}`);
this.devs.splice(idx) console.log('devList: ', JSON.stringify(this.devs));
this.devs.splice(idx, 1)
API.deviceRemove(id) API.deviceRemove(id)
}, } catch (e) {
$utils.showToast(e.name + ':' + e.message)
}
},
onInit() { onInit() {
console.log('device', 'init'); console.log('device', 'init');
(async () => { console.log('device: regId=', this.$app.$def.pushRegId);
let devList = await API.deviceList() (async () => {
// console.log('devList: ', JSON.stringify(devList)); let devList = await API.deviceList()
this.devs = handleDevResult(devList) console.log('devList: ', JSON.stringify(devList));
// console.log('devs: ', JSON.stringify(this.devs)); this.devs = handleDevResult(devList)
// [{"uid":"1","is_clip":0,"device_id":"f787bbf3-fffd-a2d7-fef9-716ff1bf1809","name":"新设备","id":1,"type":"ios"},{"uid":"1","is_clip":1,"device_id":"f787bbf3-fffd-a2d7-fef9-716ff1bf1809","name":"easychen+new","id":2,"type":"ios"}] // console.log('devs: ', JSON.stringify(this.devs));
})() // [{"uid":"1","is_clip":0,"device_id":"f787bbf3-fffd-a2d7-fef9-716ff1bf1809","name":"新设备","id":1,"type":"ios"},{"uid":"1","is_clip":1,"device_id":"f787bbf3-fffd-a2d7-fef9-716ff1bf1809","name":"easychen+new","id":2,"type":"ios"}]
}, })()
onReady() { },
console.log('device', 'onready') onReady() {
}, console.log('device', 'onready')
} },
}
</script> </script>
<style lang="less"> <style lang="less">
@import '../../../assets/styles/style.less'; @import '../../../assets/styles/style.less';
.wrapper { .wrapper {
.flex-box-mixins(column, flex-start, center); .flex-box-mixins(column, flex-start, center);
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-top: 84px; padding-top: 84px;
.header { .header {
margin-bottom: 24px; margin-bottom: 24px;
width: 80%; width: 80%;
justify-content: space-between; justify-content: space-between;
text { text {
font-size: 48px; font-size: 48px;
color: #000000; color: #000000;
}
} }
} }
}
</style> </style>

View File

@ -1,5 +1,4 @@
<import name="key-card" src="./card"></import> <import name="key-card" src="./card"></import>
<import name="swipe-item" src="../swipeItem"></import>
<template> <template>
<div class="wrapper"> <div class="wrapper">
<!-- <text class="title">device</text> <!-- <text class="title">device</text>
@ -10,107 +9,119 @@
</div> </div>
<list style="width: 80%"> <list style="width: 80%">
<list-item type="keyitem" for="{{ key in keys}}"> <list-item type="keyitem" for="{{ key in keys}}">
<swipe-item> <slide-view
id="sv{{$idx}}"
style="width: 100%"
buttons="{{slideButton}}"
layer="same"
isopen="false"
edge="right"
enableslide="true"
@ButtonClick="onDelBtnClick($idx)"
>
<key-card <key-card
slot="content"
key="{{ key }}" key="{{ key }}"
idx="{{ $idx }}" idx="{{ $idx }}"
@key-reset="onKeyReset" @key-reset="onKeyReset"
@key-rename="onKeyRename" @key-rename="onKeyRename"
></key-card> ></key-card>
<div </slide-view>
slot="right"
style="height: 60px;width: 100px;justify-content: center;"
@click="onDelBtnClick($idx)"
>
<image src="/assets/images/trash.png"></image>
</div>
</swipe-item>
</list-item> </list-item>
</list> </list>
</div> </div>
</template> </template>
<script> <script>
import dayjs from 'dayjs' import dayjs from 'dayjs'
const handleKeyResult = (data) => data.map((item) => { const handleKeyResult = (data) => data.map((item) => {
return { return {
id: item.id, id: item.id,
name: item.name, name: item.name,
value: item.key, value: item.key,
date: dayjs(item.created_at).format('YYYY/MM/DD'), date: dayjs(item.created_at).format('YYYY/MM/DD'),
}
})
export default {
data: {
keys: [],
},
async onPlusBtnClick() {
let keyList = await API.keyGen()
this.keys = handleKeyResult(keyList)
},
async handleRename(e) {
console.log(JSON.stringify(e));
},
async onDelBtnClick(idx) {
const id = this.keys[idx].id
console.log(`key: del item: idx=${idx}, id=${id}`);
this.keys.splice(idx)
API.keyRemove(id)
},
async onKeyReset({ detail: { idx } }) {
console.log(`key: onKeyReset: idx=${idx}`);
const id = this.keys[idx].id
let result = await API.keyRegen(id)
if (!result) { return }
let keyList = await API.keyList()
this.keys = handleKeyResult(keyList)
},
async onKeyRename({ detail: { idx, newname } }) {
const id = this.keys[idx].id
console.log(`key: onKeyRename: idx=${idx}, newname=${newname}`);
let result = await API.keyRename(id, newname)
if (result) {
this.keys[idx].name = newname
}
},
onInit() {
(async () => {
let keyList = await API.keyList()
// console.log('devList: ', JSON.stringify(devList));
this.keys = handleKeyResult(keyList)
console.log('keys: ', JSON.stringify(this.keys));
})().catch(e => {
console.log(e);
})
}
} }
})
export default {
data: {
keys: [],
slideButton: [
{
id: "delBtn",
buttonWidth: '100px',
iconWidth: '38px',
iconHeight: '47px',
icon: '/assets/images/trash.png',
backgroundColor: "transparent",
}
]
},
async onPlusBtnClick() {
let keyList = await API.keyGen()
this.keys = handleKeyResult(keyList)
},
async handleRename(e) {
console.log(JSON.stringify(e));
},
async onDelBtnClick(idx) {
this.$element('sv' + idx).close({ animation: false })
const id = this.keys[idx].id
console.log(`key: del item: idx=${idx}, id=${id}`);
this.keys.splice(idx,1)
API.keyRemove(id)
},
async onKeyReset({ detail: { idx } }) {
console.log(`key: onKeyReset: idx=${idx}`);
const id = this.keys[idx].id
let result = await API.keyRegen(id)
if (!result) { return }
let keyList = await API.keyList()
this.keys = handleKeyResult(keyList)
},
async onKeyRename({ detail: { idx, newname } }) {
const id = this.keys[idx].id
console.log(`key: onKeyRename: idx=${idx}, newname=${newname}`);
let result = await API.keyRename(id, newname)
if (result) {
this.keys[idx].name = newname
}
},
onInit() {
(async () => {
let keyList = await API.keyList()
// console.log('devList: ', JSON.stringify(devList));
this.keys = handleKeyResult(keyList)
console.log('keys: ', JSON.stringify(this.keys));
})().catch(e => {
console.log(e);
})
}
}
</script> </script>
<style lang="less"> <style lang="less">
@import '../../../assets/styles/style.less'; @import '../../../assets/styles/style.less';
.wrapper { .wrapper {
.flex-box-mixins(column, flex-start, center); .flex-box-mixins(column, flex-start, center);
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-top: 84px; padding-top: 84px;
.header { .header {
margin-bottom: 24px; margin-bottom: 24px;
width: 80%; width: 80%;
justify-content: space-between; justify-content: space-between;
text { text {
font-size: 48px; font-size: 48px;
color: #000000; color: #000000;
}
} }
} }
}
</style> </style>

View File

@ -9,7 +9,9 @@
/> />
</div> </div>
<div if="{{!collapsed}}" class="pushmsg-region"> <div if="{{!collapsed}}" class="pushmsg-region">
<textarea class="textarea" @change="onTextAreaChange">{{input}}</textarea> <textarea class="textarea" @change="onTextAreaChange">{{
input
}}</textarea>
<text class="pushbtn" @click="onPushBtnClick">推送测试</text> <text class="pushbtn" @click="onPushBtnClick">推送测试</text>
</div> </div>
<list> <list>
@ -19,115 +21,127 @@
for="{{ msg in msgs}}" for="{{ msg in msgs}}"
> >
<msg-card msg="{{ msg}}"></msg-card> <msg-card msg="{{ msg}}"></msg-card>
</list-item> </list-item>
</list> </list>
</div> </div>
</template> </template>
<script> <script>
import dayjs from 'dayjs' import dayjs from 'dayjs'
var md = require('markdown-it')(); var md = require('markdown-it')();
const handleMessageResult = (data) => data.map((item) => { const handleMessageResult = (data) => data.reverse().map((item, idx) => {
const created_at = dayjs(item.created_at) const created_at = dayjs(item.created_at)
const diffMinute = dayjs().diff(created_at, 'm') const diffMinute = dayjs().diff(created_at, 'm')
return { return {
id: item.id, idx,
name: item.pushkey_name, id: item.id,
type: item.type, name: item.pushkey_name,
text: item.type === 'markdown' ? md.render(item.text) : item.text, type: item.type,
desp: item.desp, text: item.type === 'markdown' ? md.render(item.text) : item.text,
created_at: diffMinute >= 0 && diffMinute <= 10 ? `${diffMinute}分钟前` : created_at.format('YYYY/MM/DD hh:mm:ss'), desp: item.desp,
} created_at: diffMinute >= 0 && diffMinute <= 10 ? `${diffMinute}分钟前` : created_at.format('YYYY/MM/DD hh:mm:ss'),
}).reverse()
export default {
data: {
collapsed: false,
supportType: ['text', 'image', 'markdown'],
input: '',
msgs: [],
},
onArrowBtnClick() {
this.collapsed = !this.collapsed
},
onTextAreaChange(e) {
// 只能在change事件里取值不知道作者怎么想的。。。
this.input = e.text
},
onPushBtnClick() {
if (this.input.length == 0) {
$utils.showToast("消息内容为空")
return
}
console.log('message', 'onPushBtnClick', this.input)
this.msgs.unshift({ name: "本设备", created_at: "刚刚", type: "text", text: this.input })
this.input = ""
},
onInit() {
console.log('message', 'init');
(async () => {
let messageList = await API.messageList()
console.log('messageList: ', JSON.stringify(messageList));
this.msgs = handleMessageResult(messageList)
console.log('msgs: ', JSON.stringify(this.msgs));
})().catch(e => {
console.log(e);
})
}
} }
})
export default {
data: {
collapsed: false,
supportType: ['text', 'image', 'markdown'],
input: '',
msgs: [],
},
onArrowBtnClick() {
this.collapsed = !this.collapsed
},
onTextAreaChange(e) {
// 只能在change事件里取值不知道作者怎么想的。。。
this.input = e.text
},
async onPushBtnClick() {
if (this.input.length == 0) {
$utils.showToast("消息内容为空")
return
}
console.log('message', 'onPushBtnClick', this.input)
await API.messagePush(this.input, '', 'text')
this.msgs.unshift({ name: "本设备", created_at: "刚刚", type: "text", text: this.input })
this.input = ""
},
onInit() {
console.log('message', 'init');
(async () => {
let messageList = await API.messageList()
// console.log('messageList: ', JSON.stringify(messageList));
this.msgs = handleMessageResult(messageList)
// console.log('msgs: ', JSON.stringify(this.msgs));
})().catch(e => {
console.log(e);
})
this.$on('msgDel', async (evt) => {
evt.stop()
const idx = evt.detail
console.log('msg" on msgDel idx=' + idx);
await API.messageRemove(this.msgs[idx].id)
.then((res) => {
console.log(res);
})
this.msgs.splice(idx, 1)
})
}
}
</script> </script>
<style lang="less"> <style lang="less">
@import '../../../assets/styles/style.less'; @import '../../../assets/styles/style.less';
.wrapper { .wrapper {
.flex-box-mixins(column, flex-start, center); .flex-box-mixins(column, flex-start, center);
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-top: 84px; padding-top: 84px;
.header { .header {
margin-bottom: 24px; margin-bottom: 24px;
width: 80%; width: 80%;
justify-content: space-between; justify-content: space-between;
flex-shrink: 0; flex-shrink: 0;
text { text {
font-size: 48px; font-size: 48px;
color: #000000; color: #000000;
}
}
.pushmsg-region {
margin: 24px 0;
width: 80%;
height: 30%;
flex-direction: column;
/* justify-content: space-between; */
align-items: flex-start;
.textarea {
width: 100%;
flex-grow: 1;
padding: 24px;
font-size: 32px;
border-color: @primary-color;
border-width: 3px;
border-radius: 8px;
background-color: #ffffff;
}
.pushbtn {
color: #ffffff;
font-size: 30px;
margin-top: 48px;
padding: 24px;
border-radius: 16px;
background-color: @primary-color;
}
} }
} }
.pushmsg-region {
margin: 24px 0;
width: 80%;
height: 30%;
flex-direction: column;
/* justify-content: space-between; */
align-items: flex-start;
.textarea {
width: 100%;
flex-grow: 1;
padding: 24px;
font-size: 32px;
border-color: @primary-color;
border-width: 3px;
border-radius: 8px;
background-color: #ffffff;
}
.pushbtn {
color: #ffffff;
font-size: 30px;
margin-top: 48px;
padding: 24px;
border-radius: 16px;
background-color: @primary-color;
}
}
}
</style> </style>

View File

@ -3,56 +3,131 @@
<template> <template>
<div class="card"> <div class="card">
<msg-header title="{{msg.name +' · '+ msg.created_at}}"></msg-header> <msg-header title="{{msg.name +' · '+ msg.created_at}}"></msg-header>
<div style="{{slideStyle}}">
<slide-view
buttons="{{slideButton}}"
style="width:100%;height:100%;"
layer="same"
isopen="false"
edge="right"
enableslide="true"
@ButtonClick="handleDeleteClick"
>
<div id="rt">
<!-- <text if="{{msg.type === 'text'}}" class="text">{{ msg.text }}</text> -->
<text if="{{msg.type === 'text'}}" class="text">{{ msg.text }}</text> <div if="{{msg.type !=='image'}}" class="text">
<richtext type="html" @complete="richtextComplete">{{
msg.text
}}</richtext>
</div>
<div if="{{msg.type ==='markdown'}}" class="text"> <image
<richtext type="html">{{msg.text}}</richtext> if="{{msg.type ==='image'}}"
class="image"
src="{{msg.text}}"
></image>
</div>
</slide-view>
</div> </div>
<image if="{{msg.type ==='image'}}" class="image" src="{{msg.text}}"></image>
</div> </div>
</template> </template>
<script> <script>
import clipboard from '@system.clipboard' import clipboard from '@system.clipboard'
export default { export default {
props: ['msg'], props: ['msg'],
onInit() { data: {
// console.log('msg-text',this.msg) contentHeight: '400px',
if (this.msg.type !== 'image' && this.msg.desp.length > 0) { slideButton: [
this.msg.text += "\n" + this.msg.desp {
id: "delBtn",
buttonWidth: '100px',
iconWidth: '38px',
iconHeight: '47px',
icon: '/assets/images/trash.png',
backgroundColor: "transparent",
} }
]
},
computed: {
slideStyle() {
let width = this.msg.type === 'image' ? '100%' : '80%'
return `width: ${width};height:${this.contentHeight}`
} }
} },
imgComplete({ height }) {
console.log('success', this.msg.type, height)
this.contentHeight = height + 'px'
},
handleDeleteClick(){
console.log('delete:',this.msg.idx);
this.$dispatch('msgDel',this.msg.idx)
},
richtextComplete() {
let that = this
setTimeout(() => {
that.$element('rt').getBoundingClientRect({
success: ({ height }) => {
console.log('success', this.msg.type, height)
this.contentHeight = height + 'px'
},
fail: (errorData, errorCode) => {
console.log('fail', errorData, errorCode)
},
complete: () => {
console.log('complete')
}
})
}, 100)
// this.
},
onInit() {
// console.log('msg-text',this.msg)
if (this.msg.type !== 'image' && this.msg.desp.length > 0) {
this.msg.text += "\n" + this.msg.desp
}
},
onReady() {
console.log('onready', this.msg.type);
},
}
</script> </script>
<style lang="less"> <style lang="less">
@import '../../../assets/styles/style.less'; @import '../../../assets/styles/style.less';
.card { .card {
.flex-box-mixins(column, flex-start, center); .flex-box-mixins(column, flex-start, center);
margin: 24px 0; margin: 24px 0;
width: 100%; width: 100%;
.text { .text {
width: 80%; /* width: 80%; */
margin-top: 32px; margin-top: 32px;
color: #535353; color: #535353;
font-size: 24px; font-size: 24px;
line-height: 48px; line-height: 48px;
padding: 24px; padding: 24px;
border-width: 2px; border-width: 2px;
border-radius: 8px; border-radius: 8px;
border-color: @primary-color; border-color: @primary-color;
background-color: #ffffff; background-color: #ffffff;
}
.image {
width: 100%;
margin-top: 32px;
}
} }
.image {
/* width: 100%; */
margin-top: 32px;
}
}
</style> </style>

View File

@ -19,13 +19,25 @@
</template> </template>
<script> <script>
import storage from '@system.storage'
import router from '@system.router'
export default { export default {
data: { data: {
settings: [ settings: [
{ label: "登录为 Easy", optName: "退出", handler: () => { $utils.showToast('点击了退出按钮') } }, { label: "", optName: "退出", handler: () => {
{ label: "自定义服务器", optName: "扫码", handler: () => { $utils.showToast('点击了扫码按钮') } }, promiseFactory(storage.clear)
.then(() => {
router.replace({
uri: 'pages'
})
})
.catch(e => {
$utils.showToast(e)
})
} },
// { label: "自定义服务器", optName: "扫码", handler: () => { $utils.showToast('点击了扫码按钮') } },
{ label: "喜欢PushDeer", optName: "评分", handler: () => { $utils.showToast('点击了评分按钮') } } { label: "喜欢PushDeer", optName: "评分", handler: () => { $utils.showToast('点击了评分按钮') } }
] ],
}, },
onLogoutBtnClick() { onLogoutBtnClick() {
@ -38,6 +50,7 @@ export default {
evt.stop() evt.stop()
this.settings[evt.detail].handler(); this.settings[evt.detail].handler();
}) })
this.settings[0].label = "登录为 " + this.$app.$def.userinfo.name
} }
} }
</script> </script>

View File

@ -16,66 +16,135 @@
</template> </template>
<script> <script>
import router from '@system.router' import storage from '@system.storage'
import router from '@system.router'
// import push from '@service.push'
import wxaccount from '@service.wxaccount'
const appInitC = new BroadcastChannel('init') export default {
appInitC.onmessage = ({ data }) => { // 页面级组件的数据模型影响传入数据的覆盖机制private内定义的属性不允许被覆盖
console.log(`index: received app init message:${data}`); private: {
if (data === 1) { },
appInitC.close()
router.replace({ onWxSignBtnClick() {
uri: 'pages/Home' var type = wxaccount.getType();
}) console.log('index:wxtype:' + type)
if (type == 'APP') {
const that = this
wxaccount.authorize({
scope: 'snsapi_userinfo',
state: 'randomString',
success: function (data) {
console.log("wxaccount authorize success:" + JSON.stringify(data));
that.onWxLoginSuccess(data).catch(e => {
$utils.showToast(e)
})
},
fail: function (data, code) {
console.log("wxaccount authorize fail:" + data + ", code:" + code);
},
cancel: function () {
console.log("wxaccount authorize cancelled.");
}
});
} else {
console.log("wxaccount not available.");
} }
} },
export default { async onWxLoginSuccess(data) {
// 页面级组件的数据模型影响传入数据的覆盖机制private内定义的属性不允许被覆盖 let token = await API.wxLogin(data.code)
private: { console.log('wxaccount login success token=' + token);
}, await this.loginSuccess(token)
},
async onWxSignBtnClick() { async loginSuccess(token) {
API.login() let that = this
.then(token => { console.log('index: loginsuccess');
appInitC.postMessage(token) promiseFactory(storage.set, { key: 'token', value: token })
}) let regIdFromStorage = await promiseFactory(storage.get, { key: 'regId' })
}, API.setToken(token)
let userinfo = await API.userInfo()
userinfo.token = token
this.$app.$def.userinfo = userinfo
onInit() { // push.subscribe({
}, // success: function ({ regId }) {
} // console.log(`push.subscribe succeeded, regIdFromStorage=${regIdFromStorage}, regId=${regId}`);
// // console.log('todo: 若regId发生改变需要上报服务器');
// that.$app.$def.pushRegId = regId
// if (regIdFromStorage !== regId) {
// // TODO 上报新的推送ID
// promiseFactory(storage.set, { key: 'regId', value: regId })
// }
// },
// fail: function (data, code) {
// console.log("push.subscribe failed, result data=" + JSON.stringify(data) + ", code=" + code);
// },
// complete: function () {
// console.log("push.subscribe completed");
// }
// })
// push.on({
// callback: function (ret) {
// console.log('received pass through message, ret = ' + JSON.stringify(ret));
// }
// })
router.replace({
uri: 'pages/Home'
})
},
onInit() {
(async () => {
let token = await promiseFactory(storage.get, { key: 'token' })
console.log(`index: get token = ${token} from storage success`)
if (token.length !== 0) {
await this.loginSuccess(token)
}
})()
.catch(e => {
console.log('catch:' + e);
$utils.showToast(e);
})
.finally(() => {
console.log('index: init complete');
})
},
}
</script> </script>
<style lang="less"> <style lang="less">
.wrapper { .wrapper {
flex-direction: column;
align-items: center;
height: 100%;
.logo {
flex-direction: column; flex-direction: column;
align-items: center; justify-content: center;
height: 100%; height: 60%;
width: 50%;
}
.logo { .btn-group {
flex-direction: column; flex-direction: column;
justify-content: center; width: 50%;
height: 60%; /* margin: 0 auto; */
width: 50%;
text {
margin: 16px 0;
padding: 24px;
border-width: 3px;
border-radius: 8px;
text-align: center;
font-size: 32px;
} }
.btn-wx {
.btn-group { color: #296c05;
flex-direction: column; border-color: #296c05;
width: 50%;
/* margin: 0 auto; */
text {
margin: 16px 0;
padding: 24px;
border-width: 3px;
border-radius: 8px;
text-align: center;
font-size: 32px;
}
.btn-wx {
color: #296c05;
border-color: #296c05;
}
} }
} }
}
</style> </style>