
uniapp 离线打包的 android 端 权限 动态申请无效
- uniapp的 代码 运行在 真机上 ,模拟器都没有·问题
- 但是 离线打包后 进入软件 就没有权限 拍照 定位 录像 的权限都 动态申请了 也没有
- 关键的
这时候注意了 得在 android studio的 项目里面的 AndroidManifest.xml 文件里面 吧
对应的权限都加上 这样打包后才可以
代码 如下 我 添加了常用的权限 拍照 录像 定位
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.uniapp">
<!-- tools:replace="android:name"-->
<application。。。> //我把application收缩了
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <!-- 获取sd卡写的权限,用于文件上传和下载 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 录像的权限 -->
<uses-permission android:name="android.permission.RECORD_VIDEO" /> <!-- 声音权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.Camera" /> <!-- 添加读写SD卡的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEM" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 硬件支持 -->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
</manifest>
- uniapp的 代码 运行在 真机上 ,模拟器都没有·问题
- 但是 离线打包后 进入软件 就没有权限 拍照 定位 录像 的权限都 动态申请了 也没有
- 关键的
这时候注意了 得在 android studio的 项目里面的 AndroidManifest.xml 文件里面 吧
对应的权限都加上 这样打包后才可以
代码 如下 我 添加了常用的权限 拍照 录像 定位
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.uniapp">
<!-- tools:replace="android:name"-->
<application。。。> //我把application收缩了
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <!-- 获取sd卡写的权限,用于文件上传和下载 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 录像的权限 -->
<uses-permission android:name="android.permission.RECORD_VIDEO" /> <!-- 声音权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.Camera" /> <!-- 添加读写SD卡的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEM" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 硬件支持 -->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
</manifest>
收起阅读 »
基于 china-area-data 的 uniapp H5 地址选择器,使用 uniapp 官方组件 uni-data-picker
查看 原文
china-area-data 数据来源(最新同步可在仓库中查看)
uni-data-picker 使用说明
-
从 china-area-data 获取最新的地址数据,保存到项目目录
/static/h5/data.json
中。 -
在项目中创建
/static/h5/area.js
文件,提供获取地址信息的操作便捷性。内容如下:
const defaultCode = 86
const PCAA = require('./data.json')
export const uniappInitRegionData = (code) => {
if (typeof PCAA[code] === 'undefined') {
return []
}
const data = [];
for (let [k, v] of Object.entries(PCAA[code])) {
const item = {
text: v,
value: v,
children: uniappInitRegionData(k),
}
data.push(item)
}
return data
}
const createRegionFromString = (address, separator = ',') => {
return address.split(separator).map(item => {
return {
text: item,
value: item,
}
})
}
const createRegionTextDataFromString = (address, separator = ',') => {
if (typeof address !== 'string') {
console.info('area.toRegion', address)
throw new TypeError('except string address, get type ' + (typeof address))
}
return address.split(separator)
}
const getRegionTextDataFromUser = (event, field = 'text') => {
return event.detail.value.map(item => item[field])
}
const getRegionTextStringFromUser = (event, field = 'text', separator = ',') => {
return event.detail.value.map(item => item[field]).join(separator)
}
const onRegionChange = (event, field = 'text', separator = ',') => {
console.log('area.onRegionChange', event)
const data = getRegionTextDataFromUser(event, field)
const text = getRegionTextStringFromUser(event, field)
uni.$emit('region.update', {
data,
text,
})
return data
}
const onNodeClick = (event) => {
console.log('area.onNodeClick', event)
}
const replaceSeparator = (address, old, current) => {
return address.replace(new RegExp(`${old}`, "g"), '/')
}
export default {
defaultCode,
regionData: uniappInitRegionData(defaultCode),
uniappInitRegionData,
createRegionFromString,
createRegionTextDataFromString,
getRegionTextDataFromUser,
getRegionTextStringFromUser,
replaceSeparator,
onRegionChange,
onNodeClick,
}
- 在需要使用地址的地方按照如下示例进行使用。
<template>
<!-- #ifdef H5 -->
<!-- TODO: 需要获取省市区的数据 -->
<uni-data-picker style="flex: 1; margin-left: 30px;" v-model="region" placeholder="请选择地址" popup-title="请选择城市" :localdata="regionData"
@change="regionChange" @nodeclick="nodeclick">
</uni-data-picker>
<!-- #endif -->
</template>
<script>
// #ifdef H5
import area from '@/static/h5/area.js'
// #endif
export default {
data() {
return {
// #ifdef H5
regionData: area.regionData, // 初始化的所有省市区数据
onRegionChange: area.onRegionChange, // 需要先注册,才可以直接在页面调用
onNodeClick: area.onNodeClick, // 节点点击事件
region: [], // v-model 绑定的数据。格式为 [{text: 'xxx', value: 'xxx'}, {text: 'xxx', value: 'xxx'}]
regionTextData: [], // 地址信息数组 ['北京市', '市辖区', '东城区']
regionText: '', // 地址文字信息,默认分隔符为 ","。示例:'北京市,市辖区,东城区'
// #endif
}
},
onLoad() {
// #ifdef H5
// 用户选择了地址 data: { data: ['北京市', '市辖区', '东城区'], text: '北京市,市辖区,东城区' }
uni.$on('region.update', (data) => {
this.regionTextData = data.data
this.regionText = data.text
})
// 获取到了用户过去选择的地址信息 data: { address: '北京市,市辖区,东城区', separator: ',' }
// 触发更新:uni.$emit('address.update', { address: res.data.address, separator: ',' })
uni.$on('address.update', (data) => {
const address = data.address || ''
const separator = data.separator || ','
this.regionText = address
this.regionTextData = area.createRegionTextDataFromString(address)
this.region = area.createRegionFromString(address, separator)
})
// #endif
},
}
</script>
查看 原文
china-area-data 数据来源(最新同步可在仓库中查看)
uni-data-picker 使用说明
-
从 china-area-data 获取最新的地址数据,保存到项目目录
/static/h5/data.json
中。 -
在项目中创建
/static/h5/area.js
文件,提供获取地址信息的操作便捷性。内容如下:
const defaultCode = 86
const PCAA = require('./data.json')
export const uniappInitRegionData = (code) => {
if (typeof PCAA[code] === 'undefined') {
return []
}
const data = [];
for (let [k, v] of Object.entries(PCAA[code])) {
const item = {
text: v,
value: v,
children: uniappInitRegionData(k),
}
data.push(item)
}
return data
}
const createRegionFromString = (address, separator = ',') => {
return address.split(separator).map(item => {
return {
text: item,
value: item,
}
})
}
const createRegionTextDataFromString = (address, separator = ',') => {
if (typeof address !== 'string') {
console.info('area.toRegion', address)
throw new TypeError('except string address, get type ' + (typeof address))
}
return address.split(separator)
}
const getRegionTextDataFromUser = (event, field = 'text') => {
return event.detail.value.map(item => item[field])
}
const getRegionTextStringFromUser = (event, field = 'text', separator = ',') => {
return event.detail.value.map(item => item[field]).join(separator)
}
const onRegionChange = (event, field = 'text', separator = ',') => {
console.log('area.onRegionChange', event)
const data = getRegionTextDataFromUser(event, field)
const text = getRegionTextStringFromUser(event, field)
uni.$emit('region.update', {
data,
text,
})
return data
}
const onNodeClick = (event) => {
console.log('area.onNodeClick', event)
}
const replaceSeparator = (address, old, current) => {
return address.replace(new RegExp(`${old}`, "g"), '/')
}
export default {
defaultCode,
regionData: uniappInitRegionData(defaultCode),
uniappInitRegionData,
createRegionFromString,
createRegionTextDataFromString,
getRegionTextDataFromUser,
getRegionTextStringFromUser,
replaceSeparator,
onRegionChange,
onNodeClick,
}
- 在需要使用地址的地方按照如下示例进行使用。
<template>
<!-- #ifdef H5 -->
<!-- TODO: 需要获取省市区的数据 -->
<uni-data-picker style="flex: 1; margin-left: 30px;" v-model="region" placeholder="请选择地址" popup-title="请选择城市" :localdata="regionData"
@change="regionChange" @nodeclick="nodeclick">
</uni-data-picker>
<!-- #endif -->
</template>
<script>
// #ifdef H5
import area from '@/static/h5/area.js'
// #endif
export default {
data() {
return {
// #ifdef H5
regionData: area.regionData, // 初始化的所有省市区数据
onRegionChange: area.onRegionChange, // 需要先注册,才可以直接在页面调用
onNodeClick: area.onNodeClick, // 节点点击事件
region: [], // v-model 绑定的数据。格式为 [{text: 'xxx', value: 'xxx'}, {text: 'xxx', value: 'xxx'}]
regionTextData: [], // 地址信息数组 ['北京市', '市辖区', '东城区']
regionText: '', // 地址文字信息,默认分隔符为 ","。示例:'北京市,市辖区,东城区'
// #endif
}
},
onLoad() {
// #ifdef H5
// 用户选择了地址 data: { data: ['北京市', '市辖区', '东城区'], text: '北京市,市辖区,东城区' }
uni.$on('region.update', (data) => {
this.regionTextData = data.data
this.regionText = data.text
})
// 获取到了用户过去选择的地址信息 data: { address: '北京市,市辖区,东城区', separator: ',' }
// 触发更新:uni.$emit('address.update', { address: res.data.address, separator: ',' })
uni.$on('address.update', (data) => {
const address = data.address || ''
const separator = data.separator || ','
this.regionText = address
this.regionTextData = area.createRegionTextDataFromString(address)
this.region = area.createRegionFromString(address, separator)
})
// #endif
},
}
</script>
收起阅读 »

uniapp开发微信小程序,动态排列组件的解决方案!
微信小程序开发里面,虽然不支持<component is=""/> is not supported,但是微信小程序提供了WXML提供模板(template),<template is="msgItem" data="{{...item}}"/>
,对于uniapp并不管用,编译后,所以解决方案,只有目前(截止2022-04-15)只有两个:
1.使用 v-if,遍历组件,判断位置,来显示组件,达到排列要求
2.第二种没那么麻烦,比较神奇,使用flex布局的order属性,外层设置
display: flex;
flex-direction: column;
里面组件的div,就设置order,越小越在前。所以我只要操控,每个组件的order值就好了
微信小程序开发里面,虽然不支持<component is=""/> is not supported,但是微信小程序提供了WXML提供模板(template),<template is="msgItem" data="{{...item}}"/>
,对于uniapp并不管用,编译后,所以解决方案,只有目前(截止2022-04-15)只有两个:
1.使用 v-if,遍历组件,判断位置,来显示组件,达到排列要求
2.第二种没那么麻烦,比较神奇,使用flex布局的order属性,外层设置
display: flex;
flex-direction: column;
里面组件的div,就设置order,越小越在前。所以我只要操控,每个组件的order值就好了
收起阅读 »
uni-app webview 天地图的使用
作为一个uni-app初始小白,给大家分享一个天地图的使用
1. 在天地图官网申请key [天地图官网](https://www.tianditu.gov.cn/)
申请浏览器端key,白名单暂时不填
2. uni-app使用web-view方式引入H5
3. (目前测试直接在hybrid文件下本地引入,天地图api报403错误,如果有大神了解这个原因欢迎指导!)
4. 注意点: nvue需要定义宽高,地图才能显示
5. uni-app代码如下:
<template>
<view :style="{width:width, height:height}">
<web-view :style="{width:width, height:height}" :src="webUrl" @onPostMessage="handleMessage"></web-view>
</view>
</template>
<script>
export default {
data() {
return {
webUrl: '',
width: 0,
height: 0,
markers: [],
}
},
onLoad(options) {
uni.showLoading({
title: '加载中',
mask: true
})
uni.getSystemInfo({ // 获取当前设备的具体信息
success: (sysinfo) => {
this.width = sysinfo.windowWidth + 'px'
this.height = sysinfo.windowHeight - sysinfo.statusBarHeight + 'px'
this.markers = [{
id: '1',
name: '站点一',
info: '这是第一个标记点',
position: [112.280637, 24.125178],
status: '正常'
},
{
id: '2',
name: '站点二',
info: '这是第二个标记点',
position: [112.280637, 24.125178],
status: '正常'
},
{
id: '3',
name: '站点三',
info: '这是第三个标记点',
position: [112.280637, 24.125178],
status: '异常'
},
];
var markersInfo = encodeURIComponent(JSON.stringify(this.markers))
// http://127.0.0.1:8848/app/hybrid/map/map.html 可换成自己部署的h5网址
this.webUrl =
`http://127.0.0.1:8848/app/hybrid/map/map.html?markers=${markersInfo}#1`
setTimeout(function() {
uni.hideLoading();
}, 2000);
}
});
},
methods: {
handleMessage(evt) {
console.log('接收到的消息:', evt.detail.data[0].action);
console.log('接收到的消息:', evt.detail);
}
}
}
</script>
h5代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>HELLO WORLD</title>
<!-- favicon.ico 404 -->
<link rel="shortcut icon" href="#" />
</head>
<body onLoad="onLoad()">
<div id="mapDiv"></div>
</body>
<!-- uni 的 SDK 注意uni sdk放到body下面 -->
<script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.1/index.js"></script>
<!-- 天地图 api -->
<script type="text/javascript" src="http://api.tianditu.gov.cn/api?v=4.0&tk=7db9f33de2e1c4c484682aed6a0764ac">
</script>
<script type="text/javascript">
// 此处是处理url传过来的参数 来自一篇博客 https://blog.csdn.net/qq_42961150/article/details/119890887
var getUrlData = {
callback: null,
_t: 0,
init(fn) {
this.callback = fn;
this.bind();
this.change.call(this);
},
bind() {
let that = this;
if (("onhashchange" in window) && ((typeof document.documentMode === "undefined") || document
.documentMode == 8)) {
window.onhashchange = () => {
that.change.call(that);
};
} else {
clearInterval(this._t);
this._t = setInterval(() => {
that.change.call(that);
}, 150);
}
},
change() {
let that = this,
_hash = window.location.hash,
_data = null;
try {
_data = JSON.parse(decodeURIComponent(_hash.split('#')[1]));
} catch (e) {
_data = decodeURIComponent(_hash.split('#')[1]);
}
if (that.callback) that.callback({
type: that.getQuery('markers'),
data: _data
});
},
getQuery(name) {
let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
let r = decodeURIComponent(window.location.search).substr(1).match(reg);
if (r != null) {
// 对参数值进行解码
return decodeURIComponent(r[2]);
}
return null;
}
}
</script>
<script type="text/javascript">
var map;
var zoom = 13;
// 标注点信息
var markers = [{
id: '1',
name: '站点一',
info: '这是第一个标记点',
position: [112.280637, 24.125178],
status: '正常'
},
{
id: '2',
name: '站点二',
info: '这是第二个标记点',
position: [112.280637, 24.125178],
status: '正常'
},
{
id: '3',
name: '站点三',
info: '这是第三个标记点',
position: [112.280637, 24.125178],
status: '异常'
},
];
// 定义uni
var _uni;
// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
document.addEventListener('UniAppJSBridgeReady', function() {
console.log("111")
_uni = uni
uni.getEnv(function(res) {
console.log('当前环境:' + JSON.stringify(res));
});
});
// 从uni-app拿信息
getUrlData.init(function(res) {
console.log(res); //返回的格式例如 {type: {}, data: 1}
// markers = JSON.parse(res.type)
})
function onLoad() {
map = new T.Map('mapDiv');
map.centerAndZoom(new T.LngLat(113.280637, 23.125178), zoom);
//创建缩放平移控件对象
control = new T.Control.Zoom();
//添加缩放平移控件
map.addControl(control);
// 添加标注点
addOverLay(markers);
}
// 添加标注点
function addOverLay(markers) {
for (let content of markers) {
//创建一个默认的标注点
//创建图片对象 img/uni@2x.png 修改成同一文件下图片
var icon = new T.Icon({
iconUrl: "img/uni@2x.png",
iconSize: new T.Point(19, 27),
iconAnchor: new T.Point(10, 25)
});
//向地图上添加自定义标注 创建标注对象,实例化Marker类
var marker
if (content.status === '正常') {
marker = new T.Marker(new T.LngLat(content.position[0], content.position[1]));
} else {
marker = new T.Marker(new T.LngLat(content.position[0], content.position[1]), {
icon: icon
});
}
//向地图上添加标注。其中addOverLay(overlay:OverLay)方法将覆盖物添加到地图中,一个覆盖物实例只能向地图中添加一次。
map.addOverLay(marker);
//添加坐标点的监听事件,当鼠标触碰该点时打开信息窗口
addMouseoverHandler(content, marker);
//
label = new T.Label({
text: `<b>${content.name}<b>`,
position: marker.getLngLat(),
offset: new T.Point(-35, 20)
});
map.addOverLay(label);
}
}
//鼠标在覆盖物上的监听事件
function addMouseoverHandler(content, marker) {
marker.addEventListener("click", function(e) {
openInfo(content, e)
});
}
//窗口信息
function openInfo(content, e) {
var point = e.lnglat;
// 创建信息窗口对象
var markerInfoWin = new T.InfoWindow()
var sContent =
`
<div id="win_box" style="height: auto; ">
<table style=" width:300px;border-collapse: separate;font-size:14px;border-spacing:0 6px;table-layout:fixed;">
<caption style="font-weight:bold;font-size:15px;">${content.info}区域</caption>
<tr><td style=" font-weight:bold;text-align:left;"><input type="button"value="详情" style="cursor: pointer;outline: none;border:none;float: right;height: 25px;width: 50px;background-color:#dddddd;color: #57606f" onclick="getDetail(` +
JSON.stringify(content).replace(/"/g, '"') + `)"></td></tr>
</table>
</div>
`;
//设置信息窗口要显示的内容
markerInfoWin.setContent(sContent);
//setOffset设置信息浮窗显示时向右下角偏移量(像素)。-30则代表向上偏移
markerInfoWin.setOffset(new T.Point(0, -30))
//开启信息窗口
map.openInfoWindow(markerInfoWin, point);
}
// 跳转详情 -- 通信uni-app
function getDetail(content) {
console.log(content)
_uni.postMessage({
data: {
action: content,
type: 'getDetail',
}
});
}
</script>
<style type="text/css">
/* 隐藏天地图图标等相关信息 */
#mapDiv .tdt-control-copyright.tdt-control>div:not(.tdt-control-copyright) {
display: none;
}
#mapDiv {
position: absolute;
width: 100%;
height: 100%
}
</style>
</html>
作为一个uni-app初始小白,给大家分享一个天地图的使用
1. 在天地图官网申请key [天地图官网](https://www.tianditu.gov.cn/)
申请浏览器端key,白名单暂时不填
2. uni-app使用web-view方式引入H5
3. (目前测试直接在hybrid文件下本地引入,天地图api报403错误,如果有大神了解这个原因欢迎指导!)
4. 注意点: nvue需要定义宽高,地图才能显示
5. uni-app代码如下:
<template>
<view :style="{width:width, height:height}">
<web-view :style="{width:width, height:height}" :src="webUrl" @onPostMessage="handleMessage"></web-view>
</view>
</template>
<script>
export default {
data() {
return {
webUrl: '',
width: 0,
height: 0,
markers: [],
}
},
onLoad(options) {
uni.showLoading({
title: '加载中',
mask: true
})
uni.getSystemInfo({ // 获取当前设备的具体信息
success: (sysinfo) => {
this.width = sysinfo.windowWidth + 'px'
this.height = sysinfo.windowHeight - sysinfo.statusBarHeight + 'px'
this.markers = [{
id: '1',
name: '站点一',
info: '这是第一个标记点',
position: [112.280637, 24.125178],
status: '正常'
},
{
id: '2',
name: '站点二',
info: '这是第二个标记点',
position: [112.280637, 24.125178],
status: '正常'
},
{
id: '3',
name: '站点三',
info: '这是第三个标记点',
position: [112.280637, 24.125178],
status: '异常'
},
];
var markersInfo = encodeURIComponent(JSON.stringify(this.markers))
// http://127.0.0.1:8848/app/hybrid/map/map.html 可换成自己部署的h5网址
this.webUrl =
`http://127.0.0.1:8848/app/hybrid/map/map.html?markers=${markersInfo}#1`
setTimeout(function() {
uni.hideLoading();
}, 2000);
}
});
},
methods: {
handleMessage(evt) {
console.log('接收到的消息:', evt.detail.data[0].action);
console.log('接收到的消息:', evt.detail);
}
}
}
</script>
h5代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>HELLO WORLD</title>
<!-- favicon.ico 404 -->
<link rel="shortcut icon" href="#" />
</head>
<body onLoad="onLoad()">
<div id="mapDiv"></div>
</body>
<!-- uni 的 SDK 注意uni sdk放到body下面 -->
<script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.1/index.js"></script>
<!-- 天地图 api -->
<script type="text/javascript" src="http://api.tianditu.gov.cn/api?v=4.0&tk=7db9f33de2e1c4c484682aed6a0764ac">
</script>
<script type="text/javascript">
// 此处是处理url传过来的参数 来自一篇博客 https://blog.csdn.net/qq_42961150/article/details/119890887
var getUrlData = {
callback: null,
_t: 0,
init(fn) {
this.callback = fn;
this.bind();
this.change.call(this);
},
bind() {
let that = this;
if (("onhashchange" in window) && ((typeof document.documentMode === "undefined") || document
.documentMode == 8)) {
window.onhashchange = () => {
that.change.call(that);
};
} else {
clearInterval(this._t);
this._t = setInterval(() => {
that.change.call(that);
}, 150);
}
},
change() {
let that = this,
_hash = window.location.hash,
_data = null;
try {
_data = JSON.parse(decodeURIComponent(_hash.split('#')[1]));
} catch (e) {
_data = decodeURIComponent(_hash.split('#')[1]);
}
if (that.callback) that.callback({
type: that.getQuery('markers'),
data: _data
});
},
getQuery(name) {
let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
let r = decodeURIComponent(window.location.search).substr(1).match(reg);
if (r != null) {
// 对参数值进行解码
return decodeURIComponent(r[2]);
}
return null;
}
}
</script>
<script type="text/javascript">
var map;
var zoom = 13;
// 标注点信息
var markers = [{
id: '1',
name: '站点一',
info: '这是第一个标记点',
position: [112.280637, 24.125178],
status: '正常'
},
{
id: '2',
name: '站点二',
info: '这是第二个标记点',
position: [112.280637, 24.125178],
status: '正常'
},
{
id: '3',
name: '站点三',
info: '这是第三个标记点',
position: [112.280637, 24.125178],
status: '异常'
},
];
// 定义uni
var _uni;
// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
document.addEventListener('UniAppJSBridgeReady', function() {
console.log("111")
_uni = uni
uni.getEnv(function(res) {
console.log('当前环境:' + JSON.stringify(res));
});
});
// 从uni-app拿信息
getUrlData.init(function(res) {
console.log(res); //返回的格式例如 {type: {}, data: 1}
// markers = JSON.parse(res.type)
})
function onLoad() {
map = new T.Map('mapDiv');
map.centerAndZoom(new T.LngLat(113.280637, 23.125178), zoom);
//创建缩放平移控件对象
control = new T.Control.Zoom();
//添加缩放平移控件
map.addControl(control);
// 添加标注点
addOverLay(markers);
}
// 添加标注点
function addOverLay(markers) {
for (let content of markers) {
//创建一个默认的标注点
//创建图片对象 img/uni@2x.png 修改成同一文件下图片
var icon = new T.Icon({
iconUrl: "img/uni@2x.png",
iconSize: new T.Point(19, 27),
iconAnchor: new T.Point(10, 25)
});
//向地图上添加自定义标注 创建标注对象,实例化Marker类
var marker
if (content.status === '正常') {
marker = new T.Marker(new T.LngLat(content.position[0], content.position[1]));
} else {
marker = new T.Marker(new T.LngLat(content.position[0], content.position[1]), {
icon: icon
});
}
//向地图上添加标注。其中addOverLay(overlay:OverLay)方法将覆盖物添加到地图中,一个覆盖物实例只能向地图中添加一次。
map.addOverLay(marker);
//添加坐标点的监听事件,当鼠标触碰该点时打开信息窗口
addMouseoverHandler(content, marker);
//
label = new T.Label({
text: `<b>${content.name}<b>`,
position: marker.getLngLat(),
offset: new T.Point(-35, 20)
});
map.addOverLay(label);
}
}
//鼠标在覆盖物上的监听事件
function addMouseoverHandler(content, marker) {
marker.addEventListener("click", function(e) {
openInfo(content, e)
});
}
//窗口信息
function openInfo(content, e) {
var point = e.lnglat;
// 创建信息窗口对象
var markerInfoWin = new T.InfoWindow()
var sContent =
`
<div id="win_box" style="height: auto; ">
<table style=" width:300px;border-collapse: separate;font-size:14px;border-spacing:0 6px;table-layout:fixed;">
<caption style="font-weight:bold;font-size:15px;">${content.info}区域</caption>
<tr><td style=" font-weight:bold;text-align:left;"><input type="button"value="详情" style="cursor: pointer;outline: none;border:none;float: right;height: 25px;width: 50px;background-color:#dddddd;color: #57606f" onclick="getDetail(` +
JSON.stringify(content).replace(/"/g, '"') + `)"></td></tr>
</table>
</div>
`;
//设置信息窗口要显示的内容
markerInfoWin.setContent(sContent);
//setOffset设置信息浮窗显示时向右下角偏移量(像素)。-30则代表向上偏移
markerInfoWin.setOffset(new T.Point(0, -30))
//开启信息窗口
map.openInfoWindow(markerInfoWin, point);
}
// 跳转详情 -- 通信uni-app
function getDetail(content) {
console.log(content)
_uni.postMessage({
data: {
action: content,
type: 'getDetail',
}
});
}
</script>
<style type="text/css">
/* 隐藏天地图图标等相关信息 */
#mapDiv .tdt-control-copyright.tdt-control>div:not(.tdt-control-copyright) {
display: none;
}
#mapDiv {
position: absolute;
width: 100%;
height: 100%
}
</style>
</html>
收起阅读 »

高德地图的恶心事,集成前不明确告诉你收费,等有请求量了,高德会打电话敲诈勒索你5万起步
公司集成高德地图SDK,是先没有哪里能够明文告诉你要收5万/年的接口调用费,等你集成好了,上线了,OK,电话一个接一个的打过来,实施敲诈勒索。所以建议清理高德地图接口,集成有不集成高德,那么多的地图SDK,百度,腾讯等,为啥接受他们的勒索呢,无语!
公司集成高德地图SDK,是先没有哪里能够明文告诉你要收5万/年的接口调用费,等你集成好了,上线了,OK,电话一个接一个的打过来,实施敲诈勒索。所以建议清理高德地图接口,集成有不集成高德,那么多的地图SDK,百度,腾讯等,为啥接受他们的勒索呢,无语!

uniapp的vue.js中文文档网址
https://staging-cn.vuejs.org/guide/quick-start.html#with-build-tools
https://staging-cn.vuejs.org/guide/quick-start.html#with-build-tools

iOS 上传 ipa报 ERROR ITMS-90165: "Invalid Provisioning Profile Signature 解决方法
4月12日晚开始,如果您发现上传 ipa 时报 ERROR ITMS-90165: "Invalid Provisioning Profile Signature ...
的错误,请按下面的方法解决
解决方法
登录开发者后台 Certificates, Identifiers & Profiles,选择对应的 profiles 文件,单击 edit ,然后单击 save,然后下载新的 profiles 文件,在重新提交打包即可;

问题产生原因:猜测可能是因为苹果更新了官方验证机制,需要重新生成配置文件应用新的文件;
另外:4月13日苹果将进行例行维护,建议晚点在上传更新 ipa
4月12日晚开始,如果您发现上传 ipa 时报 ERROR ITMS-90165: "Invalid Provisioning Profile Signature ...
的错误,请按下面的方法解决
解决方法
登录开发者后台 Certificates, Identifiers & Profiles,选择对应的 profiles 文件,单击 edit ,然后单击 save,然后下载新的 profiles 文件,在重新提交打包即可;
问题产生原因:猜测可能是因为苹果更新了官方验证机制,需要重新生成配置文件应用新的文件;
另外:4月13日苹果将进行例行维护,建议晚点在上传更新 ipa

vivo应用的审核部门穷的vivo手机都不用,上架他们应用他不用自己品牌的手机测,真的有毛病啊
本来请求地址权限判断了是否在vivo手机上,结果他审核不用vivo手机,靠,那这些判断手机品牌的API有个xx用啊
本来请求地址权限判断了是否在vivo手机上,结果他审核不用vivo手机,靠,那这些判断手机品牌的API有个xx用啊

uniapp h5发布到linux的简单脚本
做了一个uniapp h5发布到linux的简单脚本就不需要 单独打包然后 复制到服务器了。
有问题的可以联系我。。1324207805
做了一个uniapp h5发布到linux的简单脚本就不需要 单独打包然后 复制到服务器了。
有问题的可以联系我。。1324207805

进销存源码下载-简单好用的进销存管理系统
进销存源码是一种数据管理工具,它允许查看和共享数据,以优化和自动化基本业务操作,是一种简单好用的管理系统。进销存源码可以帮助您组织、自动化和改进您的业务。定制的进销存源码解决方案可以提高效率,保持持续增长。
进销存源码下载及演示站示例:x.csymzs.top
由于组织结构、部门间复杂的联系等问题,可能难以收集和分析数据。进销存源码是一个可以收集、组织和解释各种业务交易数据的工具,包括:客户关系、供应链、库存、采购、人力资源、金融、销售、制造业、工程。
如果不经过处理,这些信息就没有上下文和视角。除此之外,您无法看到数据不同部分之间的连接。定制的进销存源码解决方案允许提取、自动化和组织这些数据,这有助于开发智能业务行动所需的洞察力。进销存源码使组织通过基于数据的决策变得更加灵活和高效。
为了更好地匹配特定公司的需求,进销存源码解决方案可以在两个层面上工作:
进销存源码作为一个系统或单一的解决方案从零开始。如果您不使用任何进销存源码应用程序,并计划申请软件开发公司的服务,则此选项是可取的。业务分析师将进行一系列的访谈,以定义您的业务问题,并开发适当的软件解决方案来解决这些问题。
进销存源码作为现有系统的集成模块。此选项允许改进使用的业务流程,而无需在开发和部署新软件解决方案上花费资源。相反,您可以向已经在使用的应用程序中添加新模块,并在需要时执行伴随的定制。在可能的选项中,有报告模块、客户和订单管理工具、工作量管理工具、时间跟踪系统、项目指示板等。这种解决方案可以帮助提高分析的效率,改进报告,并允许在不中断任何业务流程的情况下做出更好的业务决策。
选择进销存源码时常见的错误
当你在寻找一个新的进销存源码系统时,你的首要任务之一就是明确你的业务需求。你应该对你的战略和主要业务目标有一个清晰的愿景。你应该定义你的公司需要什么样的进销存源码解决方案。可能的替代方案包括从零开始开发的系统和一个单独的模块(财务、制造、人力资源、销售、CRM、项目管理)。
记住,没有必要急着选择一个特定的进销存源码系统。在这么做之前,你必须花足够的时间来了解你的业务需要什么以及成本会有多高。明确进销存源码系统或模块将带来的好处是至关重要的。原因是所选择的解决方案将在您的业务前景中发挥关键作用。
在选择进销存源码解决方案时,很多公司都需要非常具体的模块来实现。以从官方网站下载一些法律信息到系统的模块为例。不要试图提供未来可能需要或不需要的所有功能,而是应该专注于能够保证市场竞争优势的功能。例如,信息收集的自动化,在一次单击中生成报告,等等。
使用演示版本来评估系统软件供应商将很乐意向您演示他们的进销存源码根据您的需求的解释设计的可能性。不同的公司有不同的开发方法和使用的技术。因此,比较他们的工作结果可能相当困难。
一个可能的解决方案是要求一个结构化的演示,允许比较“两个苹果”。目标是为每个潜在的软件供应商提供相同的测试计划。这样的计划应该描述您想要测试的所有场景。您应该关注开发的解决方案在多大程度上满足您的需求。这个测试必须确认在进销存源码解决方案中实现的功能可以改进您的业务流程。
关注成本而不是收益每个客户都希望自己的进销存源码解决方案能够在可用的预算范围内按时交付。达到这些目标通常被认为是一个成功的结果。确保软件开发和部署的成本保持在最初的预期之内是一件很自然的事情。但不幸的是,这种方法没有考虑到潜在的前景。
记住,长期利益应高于最初的发展成本。与其关注某一特定的进销存源码应用程序将花费你的公司多少钱,不如试着评估长期的前景。最糟糕的事情之一就是仅仅因为成本原因而选择一个进销存源码解决方案。你应该考虑在进销存源码上多花10%或15%的钱,这些软件是根据你的业务特点设计的,最终会使你的财务收益成倍增加。
自定义进销存源码的优点和实例
定制的进销存源码可以为任何公司提供业务优势,因为它是按照客户制定的确切要求设计的。即用即用的解决方案有一定的优势,但这类软件并不适合所有人,因为每种业务都是独特的。一些公司在开始使用现成的解决方案后遇到了不同的麻烦,因为需要根据此类软件的具体情况相应地调整工作流。
定制进销存源码解决方案的主要优势是,软件公司完全按照您的需求从头开始创建这样的应用程序。软件供应商做出足够的努力来理解您业务的每个独特方面,例如您工作的行业、您使用的数据的性质和当地立法的特殊性。这种方法可以保证最终的软件产品将实现您的业务问题的解决方案。
提高系统性能和可用性
通常,定制的进销存源码解决方案比其他解决方案提供更好的性能。在这种情况下,软件体系结构从头开始设计,以实现高性能和更好的应用程序可用性。定制的进销存源码是可扩展的,所以您可以重新配置它,并集成更多的模块,以适应您的业务增长。
企业工作流应用程序旨在帮助员工处理与业务合作伙伴、供应商、客户和其他参与者相关的大量信息:
该解决方案允许用户立即获得有关当前业务事件的最相关信息。可视化和数字报告模块以易于解释的形式表示复杂的业务数据,这有助于更快地做出重要的业务决策。此外,用户可以获得即时访问库存可用性、客户档案和订单历史记录。
改进的用户界面
当你处理一项需要分析大量数据的复杂任务时,最重要的是设计一个合理的用户界面。用户必须能够轻松理解屏幕上显示的数据以及所有控件的目的。由于定制的进销存源码解决方案是为满足特定公司的需求而设计的,所以可以放心,软件供应商的业务分析师和开发人员将做出必要的努力,以达到最佳的用户体验。
自动化、统一的报表系统
定制的进销存源码解决方案提供了您公司不同部门的操作流程的完整信息,如财务、人力资源管理、制造、营销、供应链、仓库管理等。进销存源码可以自动化从一个部门或职能到另一个部门或职能的工作流。它有助于确保该部的所有活动都由一个简化统计分析的单一报告系统进行监测。
作为一个进销存源码应用程序的例子,它被设计用来管理公司在不同阶段的工作流程,你可以查看劳动力和设施管理套件:
这个解决方案可以简化对公司工作流的监控,从创建合同开始,到报告结束。该应用程序允许即时访问联系人、订单、轮班计划和主要kpi。
结语
为中小型企业选择进销存源码解决方案可能是一个相当具有挑战性的问题。比起定制的软件,您更喜欢现成的解决方案,所以里为大家提供了进销存源码下载资源,让更多的中小型企业从中获益。
进销存源码是一种数据管理工具,它允许查看和共享数据,以优化和自动化基本业务操作,是一种简单好用的管理系统。进销存源码可以帮助您组织、自动化和改进您的业务。定制的进销存源码解决方案可以提高效率,保持持续增长。
进销存源码下载及演示站示例:x.csymzs.top
由于组织结构、部门间复杂的联系等问题,可能难以收集和分析数据。进销存源码是一个可以收集、组织和解释各种业务交易数据的工具,包括:客户关系、供应链、库存、采购、人力资源、金融、销售、制造业、工程。
如果不经过处理,这些信息就没有上下文和视角。除此之外,您无法看到数据不同部分之间的连接。定制的进销存源码解决方案允许提取、自动化和组织这些数据,这有助于开发智能业务行动所需的洞察力。进销存源码使组织通过基于数据的决策变得更加灵活和高效。
为了更好地匹配特定公司的需求,进销存源码解决方案可以在两个层面上工作:
进销存源码作为一个系统或单一的解决方案从零开始。如果您不使用任何进销存源码应用程序,并计划申请软件开发公司的服务,则此选项是可取的。业务分析师将进行一系列的访谈,以定义您的业务问题,并开发适当的软件解决方案来解决这些问题。
进销存源码作为现有系统的集成模块。此选项允许改进使用的业务流程,而无需在开发和部署新软件解决方案上花费资源。相反,您可以向已经在使用的应用程序中添加新模块,并在需要时执行伴随的定制。在可能的选项中,有报告模块、客户和订单管理工具、工作量管理工具、时间跟踪系统、项目指示板等。这种解决方案可以帮助提高分析的效率,改进报告,并允许在不中断任何业务流程的情况下做出更好的业务决策。
选择进销存源码时常见的错误
当你在寻找一个新的进销存源码系统时,你的首要任务之一就是明确你的业务需求。你应该对你的战略和主要业务目标有一个清晰的愿景。你应该定义你的公司需要什么样的进销存源码解决方案。可能的替代方案包括从零开始开发的系统和一个单独的模块(财务、制造、人力资源、销售、CRM、项目管理)。
记住,没有必要急着选择一个特定的进销存源码系统。在这么做之前,你必须花足够的时间来了解你的业务需要什么以及成本会有多高。明确进销存源码系统或模块将带来的好处是至关重要的。原因是所选择的解决方案将在您的业务前景中发挥关键作用。
在选择进销存源码解决方案时,很多公司都需要非常具体的模块来实现。以从官方网站下载一些法律信息到系统的模块为例。不要试图提供未来可能需要或不需要的所有功能,而是应该专注于能够保证市场竞争优势的功能。例如,信息收集的自动化,在一次单击中生成报告,等等。
使用演示版本来评估系统软件供应商将很乐意向您演示他们的进销存源码根据您的需求的解释设计的可能性。不同的公司有不同的开发方法和使用的技术。因此,比较他们的工作结果可能相当困难。
一个可能的解决方案是要求一个结构化的演示,允许比较“两个苹果”。目标是为每个潜在的软件供应商提供相同的测试计划。这样的计划应该描述您想要测试的所有场景。您应该关注开发的解决方案在多大程度上满足您的需求。这个测试必须确认在进销存源码解决方案中实现的功能可以改进您的业务流程。
关注成本而不是收益每个客户都希望自己的进销存源码解决方案能够在可用的预算范围内按时交付。达到这些目标通常被认为是一个成功的结果。确保软件开发和部署的成本保持在最初的预期之内是一件很自然的事情。但不幸的是,这种方法没有考虑到潜在的前景。
记住,长期利益应高于最初的发展成本。与其关注某一特定的进销存源码应用程序将花费你的公司多少钱,不如试着评估长期的前景。最糟糕的事情之一就是仅仅因为成本原因而选择一个进销存源码解决方案。你应该考虑在进销存源码上多花10%或15%的钱,这些软件是根据你的业务特点设计的,最终会使你的财务收益成倍增加。
自定义进销存源码的优点和实例
定制的进销存源码可以为任何公司提供业务优势,因为它是按照客户制定的确切要求设计的。即用即用的解决方案有一定的优势,但这类软件并不适合所有人,因为每种业务都是独特的。一些公司在开始使用现成的解决方案后遇到了不同的麻烦,因为需要根据此类软件的具体情况相应地调整工作流。
定制进销存源码解决方案的主要优势是,软件公司完全按照您的需求从头开始创建这样的应用程序。软件供应商做出足够的努力来理解您业务的每个独特方面,例如您工作的行业、您使用的数据的性质和当地立法的特殊性。这种方法可以保证最终的软件产品将实现您的业务问题的解决方案。
提高系统性能和可用性
通常,定制的进销存源码解决方案比其他解决方案提供更好的性能。在这种情况下,软件体系结构从头开始设计,以实现高性能和更好的应用程序可用性。定制的进销存源码是可扩展的,所以您可以重新配置它,并集成更多的模块,以适应您的业务增长。
企业工作流应用程序旨在帮助员工处理与业务合作伙伴、供应商、客户和其他参与者相关的大量信息:
该解决方案允许用户立即获得有关当前业务事件的最相关信息。可视化和数字报告模块以易于解释的形式表示复杂的业务数据,这有助于更快地做出重要的业务决策。此外,用户可以获得即时访问库存可用性、客户档案和订单历史记录。
改进的用户界面
当你处理一项需要分析大量数据的复杂任务时,最重要的是设计一个合理的用户界面。用户必须能够轻松理解屏幕上显示的数据以及所有控件的目的。由于定制的进销存源码解决方案是为满足特定公司的需求而设计的,所以可以放心,软件供应商的业务分析师和开发人员将做出必要的努力,以达到最佳的用户体验。
自动化、统一的报表系统
定制的进销存源码解决方案提供了您公司不同部门的操作流程的完整信息,如财务、人力资源管理、制造、营销、供应链、仓库管理等。进销存源码可以自动化从一个部门或职能到另一个部门或职能的工作流。它有助于确保该部的所有活动都由一个简化统计分析的单一报告系统进行监测。
作为一个进销存源码应用程序的例子,它被设计用来管理公司在不同阶段的工作流程,你可以查看劳动力和设施管理套件:
这个解决方案可以简化对公司工作流的监控,从创建合同开始,到报告结束。该应用程序允许即时访问联系人、订单、轮班计划和主要kpi。
结语
为中小型企业选择进销存源码解决方案可能是一个相当具有挑战性的问题。比起定制的软件,您更喜欢现成的解决方案,所以里为大家提供了进销存源码下载资源,让更多的中小型企业从中获益。

【报Bug】uni.saveVideoToPhotosAlbum()在app中下载视频到本地相册无效(解决办法)
使用uni.saveImageToPhotosAlbum方法,容量小的视频保存到了相册中, 容量大的就会保存到真机调试的文件夹下:资源管理/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/uniapp_save
使用uni.saveVideoToPhotosAlbum方法压根到不了相册中
所以我试了一下先用uni.downloadFile,
然后用uni.saveFile,
最后用uni.saveImageToPhotosAlbum(用它是为了用它成功返回的存储路径,给用户提示用的)或者uni.saveVideoToPhotosAlbum(这个成功了只返回ok没有存放路径)就好使了
希望可以帮到大家
具体代码:
uni.downloadFile({
url: ‘http://vt1.doubanio.com/201910131716/ff3b54448cd1c56470bfb9ff1451922c/view/movie/M/402300311.mp4’,
success: res => {
const { statusCode, tempFilePath } = res
if (statusCode === 200) { // saveImageToPhotosAlbum saveVideoToPhotosAlbum
uni.saveFile({
tempFilePath: tempFilePath,
success: data => {
uni.saveImageToPhotosAlbum({
filePath: data.savedFilePath,
success: data => {
console.log('data----------------->', data)
that.showToast('下载成功,文件已保存到' + data.path);
}
});
},
fail:(errMsg)=>{
uni.showToast({
mask: true,
title: '保存失败'
});
},
complete:(errMsg)=>{
}
});
} else {
that.showToast('下载失败');
}
},
complete:()=>{
}
})
使用uni.saveImageToPhotosAlbum方法,容量小的视频保存到了相册中, 容量大的就会保存到真机调试的文件夹下:资源管理/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/uniapp_save
使用uni.saveVideoToPhotosAlbum方法压根到不了相册中
所以我试了一下先用uni.downloadFile,
然后用uni.saveFile,
最后用uni.saveImageToPhotosAlbum(用它是为了用它成功返回的存储路径,给用户提示用的)或者uni.saveVideoToPhotosAlbum(这个成功了只返回ok没有存放路径)就好使了
希望可以帮到大家
具体代码:
uni.downloadFile({
url: ‘http://vt1.doubanio.com/201910131716/ff3b54448cd1c56470bfb9ff1451922c/view/movie/M/402300311.mp4’,
success: res => {
const { statusCode, tempFilePath } = res
if (statusCode === 200) { // saveImageToPhotosAlbum saveVideoToPhotosAlbum
uni.saveFile({
tempFilePath: tempFilePath,
success: data => {
uni.saveImageToPhotosAlbum({
filePath: data.savedFilePath,
success: data => {
console.log('data----------------->', data)
that.showToast('下载成功,文件已保存到' + data.path);
}
});
},
fail:(errMsg)=>{
uni.showToast({
mask: true,
title: '保存失败'
});
},
complete:(errMsg)=>{
}
});
} else {
that.showToast('下载失败');
}
},
complete:()=>{
}
})
收起阅读 »

uni-swipe-action虚拟机测试,真机测试可以,打包后无反应
我测试机、模拟器测试都可以,打包后滑动无反应是什么情况?组件已更新,数据正常显示。hb3.3.1,安卓10.
我测试机、模拟器测试都可以,打包后滑动无反应是什么情况?组件已更新,数据正常显示。hb3.3.1,安卓10.