@ -0,0 +1,25 @@ |
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. |
||||||
|
|
||||||
|
# dependencies |
||||||
|
/node_modules |
||||||
|
/.pnp |
||||||
|
/unpackage |
||||||
|
.pnp.js |
||||||
|
|
||||||
|
# testing |
||||||
|
/coverage |
||||||
|
|
||||||
|
# production |
||||||
|
/build |
||||||
|
|
||||||
|
# misc |
||||||
|
.DS_Store |
||||||
|
.env.local |
||||||
|
.env.development.local |
||||||
|
.env.test.local |
||||||
|
.env.production.local |
||||||
|
|
||||||
|
npm-debug.log* |
||||||
|
yarn-debug.log* |
||||||
|
yarn-error.log* |
||||||
|
.hbuilderx |
||||||
@ -0,0 +1,90 @@ |
|||||||
|
<script> |
||||||
|
import helper from 'common/helper.js' |
||||||
|
export default { |
||||||
|
globalData: { |
||||||
|
map: null |
||||||
|
}, |
||||||
|
onLaunch: function() { |
||||||
|
/* #ifndef H5 */ |
||||||
|
const getInfo = (token) => { |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/user/getInfo`, |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${token}` |
||||||
|
}, |
||||||
|
success(resp) { |
||||||
|
console.log('success', resp); |
||||||
|
if (resp?.data?.code !== 200) { |
||||||
|
uni.reLaunch({ |
||||||
|
url: '/pages/login/login', |
||||||
|
success() { |
||||||
|
plus.navigator.closeSplashscreen(); |
||||||
|
}, |
||||||
|
fail(err) { |
||||||
|
console.log('reLaunch', err); |
||||||
|
} |
||||||
|
}) |
||||||
|
} else { |
||||||
|
uni.reLaunch({ |
||||||
|
url: '/pages/index/index', |
||||||
|
success() { |
||||||
|
plus.navigator.closeSplashscreen(); |
||||||
|
}, |
||||||
|
fail(err) { |
||||||
|
console.log('reLaunch', err); |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
fail(err) { |
||||||
|
console.log('error', err); |
||||||
|
uni.reLaunch({ |
||||||
|
url: '/pages/login/login', |
||||||
|
success() { |
||||||
|
plus.navigator.closeSplashscreen(); |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
} |
||||||
|
uni.getStorage({ |
||||||
|
key: 'token', |
||||||
|
success(token) { |
||||||
|
console.log('token', token) |
||||||
|
getInfo(token.data) |
||||||
|
}, |
||||||
|
fail(err) { |
||||||
|
console.log('err', err) |
||||||
|
getInfo() |
||||||
|
} |
||||||
|
}) |
||||||
|
/* #endif */ |
||||||
|
}, |
||||||
|
onShow: function() {}, |
||||||
|
onHide: function() { |
||||||
|
console.log('App Hide') |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss"> |
||||||
|
/*每个页面公共css */ |
||||||
|
@import '@/uni_modules/uni-scss/index.scss'; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
@import '@/static/customicons.css'; |
||||||
|
|
||||||
|
@import './common/uni.css'; |
||||||
|
|
||||||
|
// 设置整个项目的背景色 |
||||||
|
page { |
||||||
|
background-color: #f5f5f5; |
||||||
|
} |
||||||
|
|
||||||
|
/* #endif */ |
||||||
|
.example-info { |
||||||
|
font-size: 14px; |
||||||
|
color: #333; |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,119 @@ |
|||||||
|
import VectorLayer from "ol/layer/Vector"; |
||||||
|
import VectorSource from "ol/source/Vector"; |
||||||
|
import Draw from 'ol/interaction/Draw'; |
||||||
|
import { |
||||||
|
Fill, |
||||||
|
Stroke, |
||||||
|
Style, |
||||||
|
Text as TextStyle |
||||||
|
} from "ol/style"; |
||||||
|
import CircleStyle from "ol/style/Circle"; |
||||||
|
import { |
||||||
|
getArea, |
||||||
|
getLength |
||||||
|
} from 'ol/sphere.js'; |
||||||
|
|
||||||
|
const serverUrl = 'https://app.hycdyzt.com'; |
||||||
|
const geoserverUrl = 'http://47.109.60.82:8080'; |
||||||
|
const mgServerUrl = 'http://47.109.60.82:9989/openApi' |
||||||
|
const globalMap = { |
||||||
|
map: null |
||||||
|
} |
||||||
|
const formatArea = function(polygon) { |
||||||
|
const area = getArea(polygon, { |
||||||
|
projection: 'EPSG:4326' |
||||||
|
}); |
||||||
|
let output; |
||||||
|
if (area > 10000) { |
||||||
|
output = Math.round((area / 1000000) * 100) / 100 + ' ' + 'k㎡'; |
||||||
|
} else { |
||||||
|
output = Math.round(area * 100) / 100 + ' ' + '㎡'; |
||||||
|
} |
||||||
|
return output; |
||||||
|
}; |
||||||
|
|
||||||
|
const startMeasure = (map, callback) => { |
||||||
|
map.removeLayer(map.getAllLayers().find(l => l.get('id') === 'draw-layer')); |
||||||
|
const source = new VectorSource(); |
||||||
|
|
||||||
|
const vector = new VectorLayer({ |
||||||
|
id: 'draw-layer', |
||||||
|
source: source, |
||||||
|
style: feature => { |
||||||
|
const area = formatArea(feature.getGeometry()); |
||||||
|
return new Style({ |
||||||
|
fill: new Fill({ |
||||||
|
color: 'rgba(255, 255, 255, 0.4)', |
||||||
|
}), |
||||||
|
stroke: new Stroke({ |
||||||
|
color: '#ffcc33', |
||||||
|
width: 2, |
||||||
|
}), |
||||||
|
text: new TextStyle({ |
||||||
|
text: area, |
||||||
|
"textBaseline": "middle", |
||||||
|
"font": "bold 10px/1 Verdana", |
||||||
|
"offsetX": 0, |
||||||
|
"offsetY": 0, |
||||||
|
fill: new Fill({ |
||||||
|
color: 'rgba(0, 0, 0, 0.9)', |
||||||
|
}), |
||||||
|
"placement": "point", |
||||||
|
"maxAngle": 0.7853981633974483, |
||||||
|
"overflow": true, |
||||||
|
"rotation": 0 |
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
const draw = new Draw({ |
||||||
|
source: source, |
||||||
|
type: 'Polygon', |
||||||
|
stopClick: true, |
||||||
|
freehand: true, |
||||||
|
style: function(feature) { |
||||||
|
const area = formatArea(feature.getGeometry()); |
||||||
|
console.log(feature.getGeometry().getCoordinates()) |
||||||
|
return new Style({ |
||||||
|
fill: new Fill({ |
||||||
|
color: 'rgba(255, 255, 255, 0.2)', |
||||||
|
}), |
||||||
|
stroke: new Stroke({ |
||||||
|
color: 'rgba(0, 0, 0, 0.5)', |
||||||
|
lineDash: [10, 10], |
||||||
|
width: 2, |
||||||
|
}), |
||||||
|
text: new TextStyle({ |
||||||
|
text: area, |
||||||
|
"textBaseline": "middle", |
||||||
|
"font": "bold 10px/1 Verdana", |
||||||
|
"offsetX": 0, |
||||||
|
"offsetY": 0, |
||||||
|
fill: new Fill({ |
||||||
|
color: 'rgba(0, 0, 0, 0.9)', |
||||||
|
}), |
||||||
|
"placement": "point", |
||||||
|
"maxAngle": 0.7853981633974483, |
||||||
|
"overflow": true, |
||||||
|
"rotation": 0 |
||||||
|
}), |
||||||
|
});; |
||||||
|
}, |
||||||
|
}); |
||||||
|
map.addInteraction(draw); |
||||||
|
|
||||||
|
draw.on('drawend', function() { |
||||||
|
map.addLayer(vector) |
||||||
|
map.removeInteraction(draw); |
||||||
|
callback(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
export default { |
||||||
|
serverUrl, |
||||||
|
geoserverUrl, |
||||||
|
globalMap, |
||||||
|
mgServerUrl, |
||||||
|
startMeasure |
||||||
|
} |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-flex uni-row"> |
||||||
|
<view |
||||||
|
style="display: flex;align-items: center; width:30%;padding: 6px 4px;background-color: rgba(0, 0, 0, 0.02);border: 0.5px solid rgba(5, 5, 5, 0.1);"> |
||||||
|
<text style="color: #666;">{{label}}</text> |
||||||
|
</view> |
||||||
|
<view |
||||||
|
style="display: flex;align-items: center;width:70%;padding: 6px 8px;border: 0.5px solid rgba(5, 5, 5, 0.1);"> |
||||||
|
<text style="color: #222;">{{value}}</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
export default { |
||||||
|
name: "custom-attr", |
||||||
|
props: { |
||||||
|
label: String, |
||||||
|
value: String |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
|
||||||
|
}; |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
</style> |
||||||
@ -0,0 +1,47 @@ |
|||||||
|
<template> |
||||||
|
<button type="default" @click="btnClick" class="btn" :class="className"> |
||||||
|
<image :src="imgSrc" class="btn-img" /> |
||||||
|
</button> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
export default { |
||||||
|
name: "image-button", |
||||||
|
props: { |
||||||
|
click: Function, |
||||||
|
imgSrc: String, |
||||||
|
className: String |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
|
||||||
|
}; |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
btnClick(e) { |
||||||
|
this.$emit('click', e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
.map { |
||||||
|
height: 100vh; |
||||||
|
} |
||||||
|
|
||||||
|
.btn { |
||||||
|
width: 48px; |
||||||
|
height: 48px; |
||||||
|
border-radius: 10px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
padding: 0; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-img { |
||||||
|
width: 32px; |
||||||
|
height: 32px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,13 @@ |
|||||||
|
.abs-0 { |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
right: 0; |
||||||
|
bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
body, |
||||||
|
html { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
} |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en" class="abs-0"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8" /> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" /> |
||||||
|
<meta name="theme-color" content="#000000" /> |
||||||
|
<link href="css/index.css"/> |
||||||
|
<script src="js/ol.js"></script> |
||||||
|
<script src="js/map.js"></script> |
||||||
|
</head> |
||||||
|
<body class="abs-0"> |
||||||
|
<div id="map" class="abs-0" style="background-color: red;height: 100vh;">123</div> |
||||||
|
</body> |
||||||
|
</html> |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
setTimeout(() => { |
||||||
|
alert(JSON.stringify(ol.layer))
|
||||||
|
const globalLayer = new ol.layer.TileLayer({ |
||||||
|
source: new ol.source.XYZ({ |
||||||
|
url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', |
||||||
|
}), |
||||||
|
}); |
||||||
|
const map = new ol.Map({ |
||||||
|
view: new ol.View({ |
||||||
|
center: [104.7608, 28.5586], |
||||||
|
zoom: 8, |
||||||
|
projection: 'EPSG:4326', |
||||||
|
minZoom: 5 |
||||||
|
}), |
||||||
|
layers: [globalLayer], |
||||||
|
target: '#map', |
||||||
|
controls: [], |
||||||
|
|
||||||
|
}); |
||||||
|
}, 500) |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
<head> |
||||||
|
<meta charset="UTF-8" /> |
||||||
|
<script> |
||||||
|
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || |
||||||
|
CSS.supports('top: constant(a)')) |
||||||
|
document.write( |
||||||
|
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + |
||||||
|
(coverSupport ? ', viewport-fit=cover' : '') + '" />') |
||||||
|
</script> |
||||||
|
<title></title> |
||||||
|
<!--preload-links--> |
||||||
|
<!--app-context--> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<div id="app"><!--app-html--></div> |
||||||
|
<script type="module" src="/main.js"></script> |
||||||
|
</body> |
||||||
|
</html> |
||||||
@ -0,0 +1,196 @@ |
|||||||
|
function getLocalFilePath(path) { |
||||||
|
if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) { |
||||||
|
return path |
||||||
|
} |
||||||
|
if (path.indexOf('file://') === 0) { |
||||||
|
return path |
||||||
|
} |
||||||
|
if (path.indexOf('/storage/emulated/0/') === 0) { |
||||||
|
return path |
||||||
|
} |
||||||
|
if (path.indexOf('/') === 0) { |
||||||
|
var localFilePath = plus.io.convertAbsoluteFileSystem(path) |
||||||
|
if (localFilePath !== path) { |
||||||
|
return localFilePath |
||||||
|
} else { |
||||||
|
path = path.substr(1) |
||||||
|
} |
||||||
|
} |
||||||
|
return '_www/' + path |
||||||
|
} |
||||||
|
|
||||||
|
function dataUrlToBase64(str) { |
||||||
|
var array = str.split(',') |
||||||
|
return array[array.length - 1] |
||||||
|
} |
||||||
|
|
||||||
|
var index = 0 |
||||||
|
function getNewFileId() { |
||||||
|
return Date.now() + String(index++) |
||||||
|
} |
||||||
|
|
||||||
|
function biggerThan(v1, v2) { |
||||||
|
var v1Array = v1.split('.') |
||||||
|
var v2Array = v2.split('.') |
||||||
|
var update = false |
||||||
|
for (var index = 0; index < v2Array.length; index++) { |
||||||
|
var diff = v1Array[index] - v2Array[index] |
||||||
|
if (diff !== 0) { |
||||||
|
update = diff > 0 |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
return update |
||||||
|
} |
||||||
|
|
||||||
|
export function pathToBase64(path) { |
||||||
|
return new Promise(function(resolve, reject) { |
||||||
|
if (typeof window === 'object' && 'document' in window) { |
||||||
|
if (typeof FileReader === 'function') { |
||||||
|
var xhr = new XMLHttpRequest() |
||||||
|
xhr.open('GET', path, true) |
||||||
|
xhr.responseType = 'blob' |
||||||
|
xhr.onload = function() { |
||||||
|
if (this.status === 200) { |
||||||
|
let fileReader = new FileReader() |
||||||
|
fileReader.onload = function(e) { |
||||||
|
resolve(e.target.result) |
||||||
|
} |
||||||
|
fileReader.onerror = reject |
||||||
|
fileReader.readAsDataURL(this.response) |
||||||
|
} |
||||||
|
} |
||||||
|
xhr.onerror = reject |
||||||
|
xhr.send() |
||||||
|
return |
||||||
|
} |
||||||
|
var canvas = document.createElement('canvas') |
||||||
|
var c2x = canvas.getContext('2d') |
||||||
|
var img = new Image |
||||||
|
img.onload = function() { |
||||||
|
canvas.width = img.width |
||||||
|
canvas.height = img.height |
||||||
|
c2x.drawImage(img, 0, 0) |
||||||
|
resolve(canvas.toDataURL()) |
||||||
|
canvas.height = canvas.width = 0 |
||||||
|
} |
||||||
|
img.onerror = reject |
||||||
|
img.src = path |
||||||
|
return |
||||||
|
} |
||||||
|
if (typeof plus === 'object') { |
||||||
|
plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) { |
||||||
|
entry.file(function(file) { |
||||||
|
var fileReader = new plus.io.FileReader() |
||||||
|
fileReader.onload = function(data) { |
||||||
|
resolve(data.target.result) |
||||||
|
} |
||||||
|
fileReader.onerror = function(error) { |
||||||
|
reject(error) |
||||||
|
} |
||||||
|
fileReader.readAsDataURL(file) |
||||||
|
}, function(error) { |
||||||
|
reject(error) |
||||||
|
}) |
||||||
|
}, function(error) { |
||||||
|
reject(error) |
||||||
|
}) |
||||||
|
return |
||||||
|
} |
||||||
|
if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) { |
||||||
|
wx.getFileSystemManager().readFile({ |
||||||
|
filePath: path, |
||||||
|
encoding: 'base64', |
||||||
|
success: function(res) { |
||||||
|
resolve('data:image/png;base64,' + res.data) |
||||||
|
}, |
||||||
|
fail: function(error) { |
||||||
|
reject(error) |
||||||
|
} |
||||||
|
}) |
||||||
|
return |
||||||
|
} |
||||||
|
reject(new Error('not support')) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
export function base64ToPath(base64) { |
||||||
|
return new Promise(function(resolve, reject) { |
||||||
|
if (typeof window === 'object' && 'document' in window) { |
||||||
|
base64 = base64.split(',') |
||||||
|
var type = base64[0].match(/:(.*?);/)[1] |
||||||
|
var str = atob(base64[1]) |
||||||
|
var n = str.length |
||||||
|
var array = new Uint8Array(n) |
||||||
|
while (n--) { |
||||||
|
array[n] = str.charCodeAt(n) |
||||||
|
} |
||||||
|
return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], { type: type }))) |
||||||
|
} |
||||||
|
var extName = base64.split(',')[0].match(/data\:\S+\/(\S+);/) |
||||||
|
if (extName) { |
||||||
|
extName = extName[1] |
||||||
|
} else { |
||||||
|
reject(new Error('base64 error')) |
||||||
|
} |
||||||
|
var fileName = getNewFileId() + '.' + extName |
||||||
|
if (typeof plus === 'object') { |
||||||
|
var basePath = '_doc' |
||||||
|
var dirPath = 'uniapp_temp' |
||||||
|
var filePath = basePath + '/' + dirPath + '/' + fileName |
||||||
|
if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) { |
||||||
|
plus.io.resolveLocalFileSystemURL(basePath, function(entry) { |
||||||
|
entry.getDirectory(dirPath, { |
||||||
|
create: true, |
||||||
|
exclusive: false, |
||||||
|
}, function(entry) { |
||||||
|
entry.getFile(fileName, { |
||||||
|
create: true, |
||||||
|
exclusive: false, |
||||||
|
}, function(entry) { |
||||||
|
entry.createWriter(function(writer) { |
||||||
|
writer.onwrite = function() { |
||||||
|
resolve(filePath) |
||||||
|
} |
||||||
|
writer.onerror = reject |
||||||
|
writer.seek(0) |
||||||
|
writer.writeAsBinary(dataUrlToBase64(base64)) |
||||||
|
}, reject) |
||||||
|
}, reject) |
||||||
|
}, reject) |
||||||
|
}, reject) |
||||||
|
return |
||||||
|
} |
||||||
|
var bitmap = new plus.nativeObj.Bitmap(fileName) |
||||||
|
bitmap.loadBase64Data(base64, function() { |
||||||
|
bitmap.save(filePath, {}, function() { |
||||||
|
bitmap.clear() |
||||||
|
resolve(filePath) |
||||||
|
}, function(error) { |
||||||
|
bitmap.clear() |
||||||
|
reject(error) |
||||||
|
}) |
||||||
|
}, function(error) { |
||||||
|
bitmap.clear() |
||||||
|
reject(error) |
||||||
|
}) |
||||||
|
return |
||||||
|
} |
||||||
|
if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) { |
||||||
|
var filePath = wx.env.USER_DATA_PATH + '/' + fileName |
||||||
|
wx.getFileSystemManager().writeFile({ |
||||||
|
filePath: filePath, |
||||||
|
data: dataUrlToBase64(base64), |
||||||
|
encoding: 'base64', |
||||||
|
success: function() { |
||||||
|
resolve(filePath) |
||||||
|
}, |
||||||
|
fail: function(error) { |
||||||
|
reject(error) |
||||||
|
} |
||||||
|
}) |
||||||
|
return |
||||||
|
} |
||||||
|
reject(new Error('not support')) |
||||||
|
}) |
||||||
|
} |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
{ |
||||||
|
"id": "mmmm-image-tools", |
||||||
|
"name": "image-tools", |
||||||
|
"version": "1.4.0", |
||||||
|
"description": "图像转换工具,可用于图像和base64的转换", |
||||||
|
"keywords": [ |
||||||
|
"base64", |
||||||
|
"保存", |
||||||
|
"图像" |
||||||
|
] |
||||||
|
} |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
import Vue from 'vue' |
||||||
|
import App from './App' |
||||||
|
import imageButton from './components/image-button.vue' |
||||||
|
import customAttr from './components/custom-attr.vue' |
||||||
|
Vue.component('image-button', imageButton) |
||||||
|
Vue.component('custom-attr', customAttr) |
||||||
|
Vue.config.productionTip = false |
||||||
|
|
||||||
|
App.mpType = 'app' |
||||||
|
|
||||||
|
const app = new Vue({ |
||||||
|
...App |
||||||
|
}) |
||||||
|
app.$mount() |
||||||
@ -0,0 +1,74 @@ |
|||||||
|
{ |
||||||
|
"name" : "草原管理", |
||||||
|
"appid" : "__UNI__BBBC950", |
||||||
|
"description" : "", |
||||||
|
"versionName" : "1.0.0", |
||||||
|
"versionCode" : "100", |
||||||
|
"transformPx" : false, |
||||||
|
"app-plus" : { |
||||||
|
/* 5+App特有相关 */ |
||||||
|
"usingComponents" : true, |
||||||
|
"nvueCompiler" : "uni-app", |
||||||
|
"nvueStyleCompiler" : "uni-app", |
||||||
|
"splashscreen" : { |
||||||
|
"alwaysShowBeforeRender" : false, |
||||||
|
"waiting" : false, |
||||||
|
"autoclose" : false, |
||||||
|
"delay" : 0 |
||||||
|
}, |
||||||
|
"modules" : { |
||||||
|
"Geolocation" : {}, |
||||||
|
"Camera" : {} |
||||||
|
}, |
||||||
|
/* 模块配置 */ |
||||||
|
"distribute" : { |
||||||
|
/* 应用发布信息 */ |
||||||
|
"android" : { |
||||||
|
/* android打包配置 */ |
||||||
|
"permissions" : [ |
||||||
|
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.VIBRATE\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", |
||||||
|
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.CAMERA\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", |
||||||
|
"<uses-feature android:name=\"android.hardware.camera\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>", |
||||||
|
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />", |
||||||
|
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>" |
||||||
|
] |
||||||
|
}, |
||||||
|
"ios" : { |
||||||
|
"dSYMs" : false |
||||||
|
}, |
||||||
|
/* ios打包配置 */ |
||||||
|
"sdkConfigs" : { |
||||||
|
"geolocation" : { |
||||||
|
"system" : { |
||||||
|
"__platform__" : [ "ios", "android" ] |
||||||
|
} |
||||||
|
}, |
||||||
|
"ad" : {} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
/* SDK配置 */ |
||||||
|
"quickapp" : {}, |
||||||
|
/* 快应用特有相关 */ |
||||||
|
"mp-weixin" : { |
||||||
|
/* 小程序特有相关 */ |
||||||
|
"appid" : "", |
||||||
|
"setting" : { |
||||||
|
"urlCheck" : false |
||||||
|
}, |
||||||
|
"usingComponents" : true |
||||||
|
}, |
||||||
|
"vueVersion" : "2" |
||||||
|
} |
||||||
@ -0,0 +1,339 @@ |
|||||||
|
{ |
||||||
|
"name": "app-grassland", |
||||||
|
"version": "1.0.0", |
||||||
|
"lockfileVersion": 2, |
||||||
|
"requires": true, |
||||||
|
"packages": { |
||||||
|
"": { |
||||||
|
"name": "app-grassland", |
||||||
|
"version": "1.0.0", |
||||||
|
"license": "ISC", |
||||||
|
"dependencies": { |
||||||
|
"lodash": "^4.17.21", |
||||||
|
"ol": "^8.2.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/@petamoriken/float16": { |
||||||
|
"version": "3.8.4", |
||||||
|
"resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.4.tgz", |
||||||
|
"integrity": "sha512-kB+NJ5Br56ZhElKsf0pM7/PQfrDdDVMRz8f0JM6eVOGE+L89z9hwcst9QvWBBnazzuqGTGtPsJNZoQ1JdNiGSQ==" |
||||||
|
}, |
||||||
|
"node_modules/color-name": { |
||||||
|
"version": "1.1.4", |
||||||
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", |
||||||
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" |
||||||
|
}, |
||||||
|
"node_modules/color-parse": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz", |
||||||
|
"integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==", |
||||||
|
"dependencies": { |
||||||
|
"color-name": "^1.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/color-rgba": { |
||||||
|
"version": "3.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", |
||||||
|
"integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", |
||||||
|
"dependencies": { |
||||||
|
"color-parse": "^2.0.0", |
||||||
|
"color-space": "^2.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/color-space": { |
||||||
|
"version": "2.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz", |
||||||
|
"integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==" |
||||||
|
}, |
||||||
|
"node_modules/earcut": { |
||||||
|
"version": "2.2.4", |
||||||
|
"resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", |
||||||
|
"integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" |
||||||
|
}, |
||||||
|
"node_modules/geotiff": { |
||||||
|
"version": "2.1.3", |
||||||
|
"resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.3.tgz", |
||||||
|
"integrity": "sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==", |
||||||
|
"dependencies": { |
||||||
|
"@petamoriken/float16": "^3.4.7", |
||||||
|
"lerc": "^3.0.0", |
||||||
|
"pako": "^2.0.4", |
||||||
|
"parse-headers": "^2.0.2", |
||||||
|
"quick-lru": "^6.1.1", |
||||||
|
"web-worker": "^1.2.0", |
||||||
|
"xml-utils": "^1.0.2", |
||||||
|
"zstddec": "^0.1.0" |
||||||
|
}, |
||||||
|
"engines": { |
||||||
|
"node": ">=10.19" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/ieee754": { |
||||||
|
"version": "1.2.1", |
||||||
|
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", |
||||||
|
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", |
||||||
|
"funding": [ |
||||||
|
{ |
||||||
|
"type": "github", |
||||||
|
"url": "https://github.com/sponsors/feross" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "patreon", |
||||||
|
"url": "https://www.patreon.com/feross" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "consulting", |
||||||
|
"url": "https://feross.org/support" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"node_modules/lerc": { |
||||||
|
"version": "3.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz", |
||||||
|
"integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" |
||||||
|
}, |
||||||
|
"node_modules/lodash": { |
||||||
|
"version": "4.17.21", |
||||||
|
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", |
||||||
|
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" |
||||||
|
}, |
||||||
|
"node_modules/ol": { |
||||||
|
"version": "8.2.0", |
||||||
|
"resolved": "https://registry.npmjs.org/ol/-/ol-8.2.0.tgz", |
||||||
|
"integrity": "sha512-/m1ddd7Jsp4Kbg+l7+ozR5aKHAZNQOBAoNZ5pM9Jvh4Etkf0WGkXr9qXd7PnhmwiC1Hnc2Toz9XjCzBBvexfXw==", |
||||||
|
"dependencies": { |
||||||
|
"color-rgba": "^3.0.0", |
||||||
|
"color-space": "^2.0.1", |
||||||
|
"earcut": "^2.2.3", |
||||||
|
"geotiff": "^2.0.7", |
||||||
|
"pbf": "3.2.1", |
||||||
|
"rbush": "^3.0.1" |
||||||
|
}, |
||||||
|
"funding": { |
||||||
|
"type": "opencollective", |
||||||
|
"url": "https://opencollective.com/openlayers" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/pako": { |
||||||
|
"version": "2.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", |
||||||
|
"integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" |
||||||
|
}, |
||||||
|
"node_modules/parse-headers": { |
||||||
|
"version": "2.0.5", |
||||||
|
"resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", |
||||||
|
"integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" |
||||||
|
}, |
||||||
|
"node_modules/pbf": { |
||||||
|
"version": "3.2.1", |
||||||
|
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", |
||||||
|
"integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", |
||||||
|
"dependencies": { |
||||||
|
"ieee754": "^1.1.12", |
||||||
|
"resolve-protobuf-schema": "^2.1.0" |
||||||
|
}, |
||||||
|
"bin": { |
||||||
|
"pbf": "bin/pbf" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/protocol-buffers-schema": { |
||||||
|
"version": "3.6.0", |
||||||
|
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", |
||||||
|
"integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" |
||||||
|
}, |
||||||
|
"node_modules/quick-lru": { |
||||||
|
"version": "6.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", |
||||||
|
"integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", |
||||||
|
"engines": { |
||||||
|
"node": ">=12" |
||||||
|
}, |
||||||
|
"funding": { |
||||||
|
"url": "https://github.com/sponsors/sindresorhus" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/quickselect": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", |
||||||
|
"integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" |
||||||
|
}, |
||||||
|
"node_modules/rbush": { |
||||||
|
"version": "3.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", |
||||||
|
"integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", |
||||||
|
"dependencies": { |
||||||
|
"quickselect": "^2.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/resolve-protobuf-schema": { |
||||||
|
"version": "2.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", |
||||||
|
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", |
||||||
|
"dependencies": { |
||||||
|
"protocol-buffers-schema": "^3.3.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"node_modules/web-worker": { |
||||||
|
"version": "1.3.0", |
||||||
|
"resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", |
||||||
|
"integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" |
||||||
|
}, |
||||||
|
"node_modules/xml-utils": { |
||||||
|
"version": "1.7.0", |
||||||
|
"resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.7.0.tgz", |
||||||
|
"integrity": "sha512-bWB489+RQQclC7A9OW8e5BzbT8Tu//jtAOvkYwewFr+Q9T9KDGvfzC1lp0pYPEQPEoPQLDkmxkepSC/2gIAZGw==" |
||||||
|
}, |
||||||
|
"node_modules/zstddec": { |
||||||
|
"version": "0.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz", |
||||||
|
"integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==" |
||||||
|
} |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"@petamoriken/float16": { |
||||||
|
"version": "3.8.4", |
||||||
|
"resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.4.tgz", |
||||||
|
"integrity": "sha512-kB+NJ5Br56ZhElKsf0pM7/PQfrDdDVMRz8f0JM6eVOGE+L89z9hwcst9QvWBBnazzuqGTGtPsJNZoQ1JdNiGSQ==" |
||||||
|
}, |
||||||
|
"color-name": { |
||||||
|
"version": "1.1.4", |
||||||
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", |
||||||
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" |
||||||
|
}, |
||||||
|
"color-parse": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz", |
||||||
|
"integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==", |
||||||
|
"requires": { |
||||||
|
"color-name": "^1.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"color-rgba": { |
||||||
|
"version": "3.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", |
||||||
|
"integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", |
||||||
|
"requires": { |
||||||
|
"color-parse": "^2.0.0", |
||||||
|
"color-space": "^2.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"color-space": { |
||||||
|
"version": "2.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz", |
||||||
|
"integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==" |
||||||
|
}, |
||||||
|
"earcut": { |
||||||
|
"version": "2.2.4", |
||||||
|
"resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", |
||||||
|
"integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" |
||||||
|
}, |
||||||
|
"geotiff": { |
||||||
|
"version": "2.1.3", |
||||||
|
"resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.3.tgz", |
||||||
|
"integrity": "sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==", |
||||||
|
"requires": { |
||||||
|
"@petamoriken/float16": "^3.4.7", |
||||||
|
"lerc": "^3.0.0", |
||||||
|
"pako": "^2.0.4", |
||||||
|
"parse-headers": "^2.0.2", |
||||||
|
"quick-lru": "^6.1.1", |
||||||
|
"web-worker": "^1.2.0", |
||||||
|
"xml-utils": "^1.0.2", |
||||||
|
"zstddec": "^0.1.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"ieee754": { |
||||||
|
"version": "1.2.1", |
||||||
|
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", |
||||||
|
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" |
||||||
|
}, |
||||||
|
"lerc": { |
||||||
|
"version": "3.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz", |
||||||
|
"integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" |
||||||
|
}, |
||||||
|
"lodash": { |
||||||
|
"version": "4.17.21", |
||||||
|
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", |
||||||
|
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" |
||||||
|
}, |
||||||
|
"ol": { |
||||||
|
"version": "8.2.0", |
||||||
|
"resolved": "https://registry.npmjs.org/ol/-/ol-8.2.0.tgz", |
||||||
|
"integrity": "sha512-/m1ddd7Jsp4Kbg+l7+ozR5aKHAZNQOBAoNZ5pM9Jvh4Etkf0WGkXr9qXd7PnhmwiC1Hnc2Toz9XjCzBBvexfXw==", |
||||||
|
"requires": { |
||||||
|
"color-rgba": "^3.0.0", |
||||||
|
"color-space": "^2.0.1", |
||||||
|
"earcut": "^2.2.3", |
||||||
|
"geotiff": "^2.0.7", |
||||||
|
"pbf": "3.2.1", |
||||||
|
"rbush": "^3.0.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"pako": { |
||||||
|
"version": "2.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", |
||||||
|
"integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" |
||||||
|
}, |
||||||
|
"parse-headers": { |
||||||
|
"version": "2.0.5", |
||||||
|
"resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", |
||||||
|
"integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" |
||||||
|
}, |
||||||
|
"pbf": { |
||||||
|
"version": "3.2.1", |
||||||
|
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", |
||||||
|
"integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", |
||||||
|
"requires": { |
||||||
|
"ieee754": "^1.1.12", |
||||||
|
"resolve-protobuf-schema": "^2.1.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"protocol-buffers-schema": { |
||||||
|
"version": "3.6.0", |
||||||
|
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", |
||||||
|
"integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" |
||||||
|
}, |
||||||
|
"quick-lru": { |
||||||
|
"version": "6.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", |
||||||
|
"integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==" |
||||||
|
}, |
||||||
|
"quickselect": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", |
||||||
|
"integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" |
||||||
|
}, |
||||||
|
"rbush": { |
||||||
|
"version": "3.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", |
||||||
|
"integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", |
||||||
|
"requires": { |
||||||
|
"quickselect": "^2.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"resolve-protobuf-schema": { |
||||||
|
"version": "2.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", |
||||||
|
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", |
||||||
|
"requires": { |
||||||
|
"protocol-buffers-schema": "^3.3.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"web-worker": { |
||||||
|
"version": "1.3.0", |
||||||
|
"resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", |
||||||
|
"integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" |
||||||
|
}, |
||||||
|
"xml-utils": { |
||||||
|
"version": "1.7.0", |
||||||
|
"resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.7.0.tgz", |
||||||
|
"integrity": "sha512-bWB489+RQQclC7A9OW8e5BzbT8Tu//jtAOvkYwewFr+Q9T9KDGvfzC1lp0pYPEQPEoPQLDkmxkepSC/2gIAZGw==" |
||||||
|
}, |
||||||
|
"zstddec": { |
||||||
|
"version": "0.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz", |
||||||
|
"integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
{ |
||||||
|
"name": "app-grassland", |
||||||
|
"version": "1.0.0", |
||||||
|
"description": "", |
||||||
|
"main": "main.js", |
||||||
|
"scripts": { |
||||||
|
"test": "echo \"Error: no test specified\" && exit 1" |
||||||
|
}, |
||||||
|
"keywords": [], |
||||||
|
"author": "", |
||||||
|
"license": "ISC", |
||||||
|
"dependencies": { |
||||||
|
"lodash": "^4.17.21", |
||||||
|
"ol": "^8.2.0" |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,93 @@ |
|||||||
|
{ |
||||||
|
"pages": [{ |
||||||
|
"path": "pages/index/index", |
||||||
|
"style": { |
||||||
|
"navigationBarTitleText": "首页", |
||||||
|
"navigationStyle": "custom" |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"path": "pages/workbench/workbench", |
||||||
|
"style": { |
||||||
|
"navigationBarTitleText": "工作台", |
||||||
|
"enablePullDownRefresh": false, |
||||||
|
"navigationStyle": "custom", |
||||||
|
"navigationBarBackgroundColor": "rgba(0,0,0,0)" |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"path": "pages/sjsb/sjsb", |
||||||
|
"style": { |
||||||
|
"navigationBarTitleText": "草原核查数据上报", |
||||||
|
"enablePullDownRefresh": false, |
||||||
|
"navigationBarBackgroundColor": "#01D393", |
||||||
|
"navigationBarTextStyle": "white" |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"path": "pages/login/login", |
||||||
|
"style": { |
||||||
|
"navigationBarTitleText": "", |
||||||
|
"navigationStyle": "custom", |
||||||
|
"enablePullDownRefresh": false |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"path": "pages/sjgl/sjgl", |
||||||
|
"style": { |
||||||
|
"navigationBarTitleText": "草原核查数据管理", |
||||||
|
"enablePullDownRefresh": false, |
||||||
|
"navigationBarBackgroundColor": "#01D393", |
||||||
|
"navigationBarTextStyle": "white", |
||||||
|
"app-plus": { |
||||||
|
"titleNView": { |
||||||
|
"buttons": [{ |
||||||
|
"fontSrc": "/static/iconfont.ttf", |
||||||
|
"text": "\ue633", |
||||||
|
"width": "40px", |
||||||
|
"fontSize": "20px", |
||||||
|
"color": "#fff", |
||||||
|
"background": "rgba(0,0,0,0)", |
||||||
|
"float": "right" |
||||||
|
}] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"path": "pages/wdxx/wdxx", |
||||||
|
"style": { |
||||||
|
"navigationBarTitleText": "我的消息", |
||||||
|
"enablePullDownRefresh": false, |
||||||
|
"navigationBarBackgroundColor": "#01D393", |
||||||
|
"navigationBarTextStyle": "white", |
||||||
|
"app-plus": { |
||||||
|
"titleNView": { |
||||||
|
"buttons": [{ |
||||||
|
"color": "#fff", // 按钮上文字颜色,默认与标题文字颜色一致 |
||||||
|
"background": "#fff", // 按钮的背景颜色,仅在标题栏type=transparent时生效,默认值为灰色半透明 |
||||||
|
"colorPressed": "#fff", // 按下状态按钮文字颜色,默认值为 color 属性值自动调整透明度为 0.3 |
||||||
|
"float": "right", // 按钮在标题栏上的显示位置,可取值"left"、"right",默认值为 right |
||||||
|
"fontWeight": "normal", // 按钮上文字的粗细。可取值"normal"-标准字体、"bold"-加粗字体。默认值为 normal |
||||||
|
"fontSize": "20px", // 按钮上文字大小 |
||||||
|
"fontSrc": "/static/iconfont.ttf", // 按钮上文字使用的字体文件路径。不支持网络地址,请统一使用本地地址 |
||||||
|
"select": "false", // 是否显示选择指示图标(向下箭头),常用于城市选择,默认值为 false |
||||||
|
"text": "\ue6a0", // 按钮上显示的文字。使用字体图标时 unicode 字符表示必须 '\u' 开头,如 "\ue123"(注意不能写成"\e123")。 |
||||||
|
"width": "44px", // 按钮的宽度,可取值: "*px" - 逻辑像素值,如"10px"表示10逻辑像素值,不支持rpx。按钮的内容居中显示; "auto" - 自定计算宽度 |
||||||
|
"redDot": "false" // 是否显示红点,设置为true则显示红点,false则不显示红点。默认值为false。 注意:当设置了角标文本时红点不显示。 |
||||||
|
}] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
], |
||||||
|
"globalStyle": { |
||||||
|
"navigationBarTextStyle": "black", |
||||||
|
"navigationBarTitleText": "uni-app", |
||||||
|
"navigationBarBackgroundColor": "#F8F8F8", |
||||||
|
"backgroundColor": "#F8F8F8", |
||||||
|
"app-plus": { |
||||||
|
"background": "#efeff4" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
After Width: | Height: | Size: 1.9 KiB |
@ -0,0 +1,763 @@ |
|||||||
|
<template> |
||||||
|
<view class="container" @click="showSearch(false)"> |
||||||
|
<view id="map" class="map" :prop="mapData" :change:prop="mapModule.updateMapData"></view> |
||||||
|
<image-button @click="location" className="location" imgSrc="/static/dw.png"></image-button> |
||||||
|
|
||||||
|
<view class="south"> |
||||||
|
<image src="/static/south.png" class="south-img" /> |
||||||
|
<text class="south-text">南</text> |
||||||
|
</view> |
||||||
|
<view class="right-actions"> |
||||||
|
<view class="btn-tcdj right-btn" @click="showLayerModal"> |
||||||
|
<image src="/static/tcdj.png" class="btn-img"></image> |
||||||
|
</view> |
||||||
|
<view class="btn-mjcl right-btn" @click="toggleMeasure"> |
||||||
|
<image :src="measureStatus==='mjcl'?'/static/mjcl-sel.png':'/static/mjcl.png'" class="btn-img"></image> |
||||||
|
</view> |
||||||
|
<view class="btn-xzgj right-btn" @click="toggleXzgj"> |
||||||
|
<image :src="measureStatus==='xzgj'?'/static/xzgj-sel.png':'/static/xzgj.png'" class="btn-img"></image> |
||||||
|
</view> |
||||||
|
<view class="btn-logout right-btn" @click="mapModule.clear"> |
||||||
|
<image src="/static/clear.png" class="img-clear" /> |
||||||
|
</view> |
||||||
|
<view class="btn-logout right-btn" @click="logout"> |
||||||
|
<image src="/static/logout.png" class="img-logout" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<button class="btn-workbench" @click="toWorkBench"> |
||||||
|
<image src="/static/gzt.png" class="workbench-img" /> |
||||||
|
<div>工作台</div> |
||||||
|
</button> |
||||||
|
<view> |
||||||
|
<!-- 普通弹窗 --> |
||||||
|
<uni-popup ref="popup" background-color="#fff" @change="popupChange"> |
||||||
|
<view class="popup-title">图层叠加</view> |
||||||
|
<view class="popup-content"> |
||||||
|
<uni-data-checkbox mode="tag" v-model="currentLayer" :localdata="layerItems"></uni-data-checkbox> |
||||||
|
</view> |
||||||
|
</uni-popup> |
||||||
|
<!-- 普通弹窗 --> |
||||||
|
<uni-popup ref="popupDetail" background-color="#fff"> |
||||||
|
<view class="popup-detail-title"> |
||||||
|
<text style="flex:1;font-size: 18px; font-weight: bold;">详情</text> |
||||||
|
<text @click="closeDetail()" style="font-size: 16px;color: #555; padding-bottom: 4px;">关闭</text> |
||||||
|
</view> |
||||||
|
<view class="popup-content" style="padding: 12px;"> |
||||||
|
<view class="detail-tab"> |
||||||
|
<view v-if="detailGroups.length>1" v-for="groupItem in detailGroups"> |
||||||
|
<uni-tag :circle="true" @click="changeDetailTab(groupItem.tab)" :text="groupItem.tab" |
||||||
|
style="margin-right: 8px;" |
||||||
|
:type="currentGroupTab===groupItem.tab?'success':''"></uni-tag> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
|
||||||
|
<view v-if="!!currentGroupTab" style="border: 0.5px solid rgba(5, 5, 5, 0.1);"> |
||||||
|
<view v-for="item in detailGroups.find(g=>g.tab===currentGroupTab).children"> |
||||||
|
<view class="uni-flex uni-row"> |
||||||
|
<view |
||||||
|
style="display: flex;align-items: center; width:30%;padding: 2px 4px;background-color: rgba(0, 0, 0, 0.02);border: 0.5px solid rgba(5, 5, 5, 0.1);"> |
||||||
|
<text style="color: #666;">{{item.title}}</text> |
||||||
|
</view> |
||||||
|
<view |
||||||
|
style="display: flex;align-items: center;width:70%;padding: 2px 8px;border: 0.5px solid rgba(5, 5, 5, 0.1);"> |
||||||
|
<text |
||||||
|
v-if="!item.value.toString().endsWith('.png')&&!item.value.toString().endsWith('.jpg')" |
||||||
|
style="color: #222;">{{item.value}}{{item.unit}}</text> |
||||||
|
<view |
||||||
|
v-if="item.value.toString().endsWith('.png')||item.value.toString().endsWith('.jpg')"> |
||||||
|
<image v-for="(img,index) in item.value.split(',')" |
||||||
|
style="height: 36px; width: 36px;margin-right: 8px;" :src="img" |
||||||
|
@click="preview(index,item.value.split(','))"> |
||||||
|
</image> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</uni-popup> |
||||||
|
</view> |
||||||
|
<view class="top-right"> |
||||||
|
<view @click.stop="showSearch(true)" v-if="searchVisible" style="flex: 1;"> |
||||||
|
<uni-search-bar :focus="true" v-model="searchValue" @confirm="search" |
||||||
|
cancelButton="none"></uni-search-bar> |
||||||
|
</view> |
||||||
|
<!-- <view class="search" @click.stop="showSearch(true)" v-if="!searchVisible"> |
||||||
|
<image src="/static/search.png" class="img-search" /> |
||||||
|
</view> --> |
||||||
|
<view class="message" @click="toWdxx"> |
||||||
|
<image src="/static/message.png" class="img-message" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import helper from '../../common/helper'; |
||||||
|
import { |
||||||
|
GeoJSON |
||||||
|
} from 'ol/format' |
||||||
|
import _ from 'lodash' |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
searchVisible: false, |
||||||
|
searchValue: '', |
||||||
|
mapData: { |
||||||
|
center: [102.45438, 32.53223] |
||||||
|
}, |
||||||
|
currentLayer: null, |
||||||
|
layerItems: [{ |
||||||
|
text: '生态修复工程图层', |
||||||
|
value: 'stxfgc' |
||||||
|
}, { |
||||||
|
text: '征占用图层', |
||||||
|
value: 'cdzzy_view' |
||||||
|
}, { |
||||||
|
text: '非法占用图层', |
||||||
|
value: 'ffzy_layer' |
||||||
|
}, { |
||||||
|
text: '草地图层', |
||||||
|
value: 't_grassland_result' |
||||||
|
}], |
||||||
|
detailItems: [], |
||||||
|
detailGroups: [], |
||||||
|
currentGroupTab: null, |
||||||
|
token: '', |
||||||
|
measureStatus: '' |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
currentLayer(newVal, oldVal) { |
||||||
|
const map = this.$map; |
||||||
|
console.log(newVal, oldVal, map); |
||||||
|
this.$refs.popup.close() |
||||||
|
if (newVal) { |
||||||
|
this.mapData = { |
||||||
|
layerName: newVal |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
onLoad() { |
||||||
|
uni.getStorage({ |
||||||
|
key: 'token', |
||||||
|
success: (token) => { |
||||||
|
this.token = token.data; |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
closeMeasureStatus() { |
||||||
|
this.measureStatus = '' |
||||||
|
this.mapData = {} |
||||||
|
}, |
||||||
|
toggleXzgj() { |
||||||
|
if (this.measureStatus === 'xzgj') { |
||||||
|
this.measureStatus = '' |
||||||
|
this.mapData = {} |
||||||
|
} else { |
||||||
|
this.measureStatus = 'xzgj'; |
||||||
|
this.mapData = { |
||||||
|
xzgj: true |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
toggleMeasure() { |
||||||
|
if (this.measureStatus === 'mjcl') { |
||||||
|
this.measureStatus = '' |
||||||
|
this.mapData = {} |
||||||
|
} else { |
||||||
|
this.measureStatus = 'mjcl' |
||||||
|
this.mapData = { |
||||||
|
mjcl: true |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
showFfzy(id) { |
||||||
|
console.log(id) |
||||||
|
this.currentLayer = 'ffzy_layer' |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/ffzy/ffzy/${id}`, |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
success: (resp) => { |
||||||
|
console.log(resp) |
||||||
|
if (resp.data.data) { |
||||||
|
const item = resp.data.data; |
||||||
|
if (item.geom) { |
||||||
|
this.mapData = { |
||||||
|
ffzyWkt: item.geom |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
}) |
||||||
|
}, |
||||||
|
toWdxx() { |
||||||
|
uni.navigateTo({ |
||||||
|
url: "/pages/wdxx/wdxx" |
||||||
|
}) |
||||||
|
}, |
||||||
|
preview(index, imgs) { |
||||||
|
uni.previewImage({ |
||||||
|
urls: imgs, |
||||||
|
current: index |
||||||
|
}) |
||||||
|
}, |
||||||
|
changeDetailTab(tabName) { |
||||||
|
this.currentGroupTab = tabName; |
||||||
|
}, |
||||||
|
closeDetail() { |
||||||
|
this.$refs.popupDetail.close() |
||||||
|
}, |
||||||
|
logout() { |
||||||
|
const toLogin = (token) => { |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/user/logout`, |
||||||
|
method: 'POST', |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${token}` |
||||||
|
}, |
||||||
|
success() { |
||||||
|
uni.reLaunch({ |
||||||
|
url: '/pages/login/login' |
||||||
|
}) |
||||||
|
}, |
||||||
|
fail() { |
||||||
|
uni.reLaunch({ |
||||||
|
url: '/pages/login/login' |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
uni.showModal({ |
||||||
|
content: '是否退出当前用户?', |
||||||
|
title: '提示', |
||||||
|
success(res) { |
||||||
|
if (res.confirm) { |
||||||
|
uni.getStorage({ |
||||||
|
key: 'token', |
||||||
|
success(resp) { |
||||||
|
uni.removeStorage({ |
||||||
|
key: 'token' |
||||||
|
}) |
||||||
|
toLogin(resp.data); |
||||||
|
}, |
||||||
|
fail() { |
||||||
|
toLogin(); |
||||||
|
} |
||||||
|
}) |
||||||
|
} else if (res.cancel) {} |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
showSearch(visible) { |
||||||
|
this.searchVisible = visible; |
||||||
|
}, |
||||||
|
clear(res) { |
||||||
|
this.searchValue = ''; |
||||||
|
}, |
||||||
|
search(res) { |
||||||
|
console.log('查询值:' + res.value); |
||||||
|
}, |
||||||
|
location() { |
||||||
|
uni.getLocation({ |
||||||
|
type: 'wgs84', |
||||||
|
success: (res) => { |
||||||
|
console.log('当前位置的经度:' + res.longitude); |
||||||
|
console.log('当前位置的纬度:' + res.latitude); |
||||||
|
this.mapData = { |
||||||
|
center: [res.longitude, res.latitude, Math.random()] |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
toWorkBench() { |
||||||
|
uni.navigateTo({ |
||||||
|
url: '/pages/workbench/workbench', |
||||||
|
success(a) { |
||||||
|
debugger |
||||||
|
}, |
||||||
|
fail(a) { |
||||||
|
debugger |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
popupChange(e) { |
||||||
|
console.log('当前模式:' + e.type + ',状态:' + e.show); |
||||||
|
}, |
||||||
|
showLayerModal() { |
||||||
|
this.$refs.popup.open('bottom') |
||||||
|
}, |
||||||
|
requestDetail({ |
||||||
|
wkt, |
||||||
|
url |
||||||
|
}) { |
||||||
|
uni.request({ |
||||||
|
url, |
||||||
|
success: (resp) => { |
||||||
|
console.log(resp?.data?.features?.[0]) |
||||||
|
if (resp?.data?.features?.[0]) { |
||||||
|
this.mapData = { |
||||||
|
highLightData: resp?.data?.features?.[0] |
||||||
|
} |
||||||
|
let apiStr = ''; |
||||||
|
switch (this.currentLayer) { |
||||||
|
case 'stxfgc': |
||||||
|
apiStr = '/stxh/details'; |
||||||
|
break; |
||||||
|
case 't_grassland_result': |
||||||
|
apiStr = '/cdzy/cdDetails'; |
||||||
|
break; |
||||||
|
case 'cdzzy_view': |
||||||
|
apiStr = '/cdzhy/details'; |
||||||
|
break; |
||||||
|
case 'ffzy_layer': |
||||||
|
apiStr = '/cdzhy/ffzyDetails'; |
||||||
|
break; |
||||||
|
} |
||||||
|
if (apiStr) { |
||||||
|
uni.request({ |
||||||
|
url: `${helper.mgServerUrl}${apiStr}?wkt=${wkt}`, |
||||||
|
success: (resp2) => { |
||||||
|
console.log(resp2) |
||||||
|
const groups = _.groupBy(resp2?.data?.data |
||||||
|
.dyColumn, 'tab'); |
||||||
|
this.detailGroups = _.keys(groups).map(key => { |
||||||
|
return { |
||||||
|
tab: key, |
||||||
|
children: groups[key]?.map(item => { |
||||||
|
return { |
||||||
|
...item, |
||||||
|
value: item.value || '' |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}); |
||||||
|
this.currentGroupTab = this.detailGroups?.[0]?.tab; |
||||||
|
this.$refs.popupDetail.open('bottom'); |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
// const props = resp?.data?.features?.[0]?.properties; |
||||||
|
// if (helper.layerDetails[this.currentLayer]) { |
||||||
|
// this.detailItems = helper.layerDetails[this.currentLayer].map(item => { |
||||||
|
// return { |
||||||
|
// ...item, |
||||||
|
// value: props[item.field] |
||||||
|
// } |
||||||
|
// }); |
||||||
|
// this.$refs.popupDetail.open('bottom'); |
||||||
|
// } |
||||||
|
}, |
||||||
|
fail: (resp) => { |
||||||
|
console.log(resp) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<script module="mapModule" lang="renderjs"> |
||||||
|
import 'ol/ol.css' |
||||||
|
import { |
||||||
|
Map, |
||||||
|
View |
||||||
|
} from 'ol' |
||||||
|
import { |
||||||
|
get as getProjection |
||||||
|
} from 'ol/proj'; |
||||||
|
import { |
||||||
|
Tile as TileLayer, |
||||||
|
Vector as VectorLayer |
||||||
|
} from 'ol/layer' |
||||||
|
import { |
||||||
|
XYZ, |
||||||
|
Vector as VectorSource |
||||||
|
} from 'ol/source' |
||||||
|
import { |
||||||
|
Point, |
||||||
|
Polygon, |
||||||
|
Circle |
||||||
|
} from 'ol/geom' |
||||||
|
import { |
||||||
|
fromExtent, |
||||||
|
fromCircle |
||||||
|
} from 'ol/geom/Polygon'; |
||||||
|
import Feature from 'ol/Feature'; |
||||||
|
import { |
||||||
|
Style, |
||||||
|
Icon as IconStyle, |
||||||
|
Circle as CircleStyle, |
||||||
|
Fill, |
||||||
|
Stroke |
||||||
|
} from 'ol/style' |
||||||
|
import helper from '../../common/helper'; |
||||||
|
import { |
||||||
|
Image |
||||||
|
} from 'ol/layer'; |
||||||
|
import { |
||||||
|
ImageWMS |
||||||
|
} from 'ol/source'; |
||||||
|
import { |
||||||
|
GeoJSON, |
||||||
|
WKT |
||||||
|
} from 'ol/format' |
||||||
|
import { |
||||||
|
getForViewAndSize |
||||||
|
} from 'ol/extent' |
||||||
|
let map, vectorLayer; |
||||||
|
export default { |
||||||
|
name: 'c-ol-map', |
||||||
|
data() { |
||||||
|
return { |
||||||
|
ownerInstance: null |
||||||
|
} |
||||||
|
}, |
||||||
|
mounted(args) { |
||||||
|
console.log(args) |
||||||
|
this.initMap() |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
updateMapData(newValue, oldValue, ownerInstance, instance) { |
||||||
|
this.ownerInstance = ownerInstance; |
||||||
|
// 监听 service 层数据变更 |
||||||
|
if (map) { |
||||||
|
if (newValue.center) { |
||||||
|
const point = new Point([newValue.center[0], newValue.center[1]]); |
||||||
|
const pFeature = new Feature({ |
||||||
|
geometry: point |
||||||
|
}); |
||||||
|
pFeature.setStyle(new Style({ |
||||||
|
image: new IconStyle({ |
||||||
|
src: './static/wz.png', |
||||||
|
scale: 0.5, |
||||||
|
anchor: [0.5, 0] |
||||||
|
}) |
||||||
|
})) |
||||||
|
vectorLayer.getSource().clear(); |
||||||
|
vectorLayer.getSource().addFeature(pFeature); |
||||||
|
map.getView().fit(point, { |
||||||
|
maxZoom: 18 |
||||||
|
}); |
||||||
|
} |
||||||
|
if (newValue.layerName) { |
||||||
|
const layer = new Image({ |
||||||
|
id: 'business-layer', |
||||||
|
source: new ImageWMS({ |
||||||
|
ratio: 1, |
||||||
|
url: `${helper.geoserverUrl}/geoserver/yzt/wms`, |
||||||
|
params: { |
||||||
|
'FORMAT': 'image/png', |
||||||
|
'VERSION': '1.1.1', |
||||||
|
"STYLES": '', |
||||||
|
"LAYERS": `yzt:${newValue.layerName}`, |
||||||
|
"exceptions": 'application/vnd.ogc.se_inimage', |
||||||
|
} |
||||||
|
}) |
||||||
|
}); |
||||||
|
vectorLayer.getSource().clear(); |
||||||
|
map.removeLayer(map.getAllLayers().find(layer => { |
||||||
|
|
||||||
|
return layer.get('id') === 'business-layer' |
||||||
|
})) |
||||||
|
map.addLayer(layer); |
||||||
|
} |
||||||
|
if (newValue.highLightData) { |
||||||
|
const feature = new GeoJSON().readFeature(newValue.highLightData) |
||||||
|
feature.setStyle(new Style({ |
||||||
|
fill: new Fill({ |
||||||
|
color: 'rgba(0,0,0,0)', |
||||||
|
}), |
||||||
|
stroke: new Stroke({ |
||||||
|
width: 3, |
||||||
|
color: '#ff0000' |
||||||
|
}), |
||||||
|
image: new CircleStyle({ |
||||||
|
radius: 8, |
||||||
|
fill: new Fill({ |
||||||
|
color: 'rgba(0,0,0,0)', |
||||||
|
}), |
||||||
|
stroke: new Stroke({ |
||||||
|
width: 3, |
||||||
|
color: '#00ffff' |
||||||
|
}), |
||||||
|
}) |
||||||
|
})); |
||||||
|
vectorLayer.getSource().clear(); |
||||||
|
vectorLayer.getSource().addFeature(feature) |
||||||
|
} |
||||||
|
if (newValue.ffzyWkt) { |
||||||
|
const point = new WKT().readGeometry(newValue.ffzyWkt); |
||||||
|
const coordinate = point.getCoordinates(); |
||||||
|
map.getView().setCenter(coordinate) |
||||||
|
this.showByWkt(coordinate) |
||||||
|
} |
||||||
|
if (newValue.mjcl) { |
||||||
|
helper.startMeasure(map, () => { |
||||||
|
this.ownerInstance?.callMethod('closeMeasureStatus', false) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
clear() { |
||||||
|
if (map) { |
||||||
|
map.removeLayer(map.getAllLayers().find(l => l.get('id') === 'draw-layer')); |
||||||
|
vectorLayer.getSource().clear(); |
||||||
|
} |
||||||
|
}, |
||||||
|
// 初始化天地图 |
||||||
|
initMap() { |
||||||
|
let that = this |
||||||
|
//天地图影像 |
||||||
|
var tdt = new TileLayer({ |
||||||
|
source: new XYZ({ |
||||||
|
maxZoom: 18, |
||||||
|
url: 'http://t{0-5}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=cef191b507ff5cb698811cd8a9b11ca0', |
||||||
|
projection: 'EPSG:3857', |
||||||
|
crossOrigin: '*', |
||||||
|
}), |
||||||
|
}) |
||||||
|
//天地图标注 |
||||||
|
var tdtLabel = new TileLayer({ |
||||||
|
source: new XYZ({ |
||||||
|
maxZoom: 18, |
||||||
|
url: 'http://t{0-5}.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=cef191b507ff5cb698811cd8a9b11ca0', |
||||||
|
projection: 'EPSG:3857', |
||||||
|
}), |
||||||
|
}) |
||||||
|
map = new Map({ |
||||||
|
controls: [], |
||||||
|
target: 'map', |
||||||
|
layers: [tdt, tdtLabel], |
||||||
|
view: new View({ |
||||||
|
projection: 'EPSG:4326', |
||||||
|
center: [102.45438, 32.53223], |
||||||
|
// center: [102.712251, 25.040609], |
||||||
|
zoom: 12, |
||||||
|
|
||||||
|
enableRotation: false |
||||||
|
}), |
||||||
|
}) |
||||||
|
vectorLayer = new VectorLayer({ |
||||||
|
id: 'v-layer', |
||||||
|
source: new VectorSource(), |
||||||
|
zIndex: 99 |
||||||
|
}) |
||||||
|
map.addLayer(vectorLayer); |
||||||
|
map.on('singleclick', evt => { |
||||||
|
vectorLayer.getSource().clear(); |
||||||
|
console.log('evt', evt) |
||||||
|
this.showByWkt(evt.coordinate); |
||||||
|
}) |
||||||
|
}, |
||||||
|
showByWkt(coordinate) { |
||||||
|
const source = map.getAllLayers().find(l => l.get('id') === 'business-layer')?.getSource(); |
||||||
|
if (source) { |
||||||
|
const view = map.getView(); |
||||||
|
const viewResolution = view.getResolution(); |
||||||
|
const [x1] = map.getCoordinateFromPixel([0, 0]); |
||||||
|
const [x2] = map.getCoordinateFromPixel([10, 0]); |
||||||
|
const radius = x2 - x1; |
||||||
|
const circle = new Circle(coordinate, radius); |
||||||
|
const polygon = fromCircle(circle); |
||||||
|
const wkt = new WKT().writeGeometry(polygon); |
||||||
|
const url = source.getFeatureInfoUrl( |
||||||
|
coordinate, viewResolution, view.getProjection(), { |
||||||
|
'INFO_FORMAT': 'application/json', |
||||||
|
'FEATURE_COUNT': 50 |
||||||
|
}); |
||||||
|
if (url) { |
||||||
|
this.ownerInstance?.callMethod('requestDetail', { |
||||||
|
wkt: wkt, |
||||||
|
url |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
.detail-tab { |
||||||
|
display: flex; |
||||||
|
flex-direction: row; |
||||||
|
overflow-x: auto; |
||||||
|
/* margin-bottom: 12px; */ |
||||||
|
padding-bottom: 12px; |
||||||
|
} |
||||||
|
|
||||||
|
.popup-detail-title { |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
padding: 12px; |
||||||
|
border-bottom: 1px solid #ddd; |
||||||
|
} |
||||||
|
|
||||||
|
.logout {} |
||||||
|
|
||||||
|
.search { |
||||||
|
margin-right: 24px; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-logout { |
||||||
|
margin-top: 12px; |
||||||
|
border-radius: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.img-clear, |
||||||
|
.img-logout { |
||||||
|
opacity: 0.6; |
||||||
|
} |
||||||
|
|
||||||
|
.img-clear, |
||||||
|
.img-logout, |
||||||
|
.img-message, |
||||||
|
.img-search { |
||||||
|
width: 30px; |
||||||
|
height: 30px; |
||||||
|
} |
||||||
|
|
||||||
|
.top-right { |
||||||
|
position: absolute; |
||||||
|
top: 40px; |
||||||
|
right: 28px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
left: 10px; |
||||||
|
justify-content: end; |
||||||
|
height: 56px; |
||||||
|
} |
||||||
|
|
||||||
|
.popup-title { |
||||||
|
font-weight: bold; |
||||||
|
font-size: 22px; |
||||||
|
text-align: center; |
||||||
|
margin: 24px 0 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
.popup-content { |
||||||
|
padding: 24px; |
||||||
|
} |
||||||
|
|
||||||
|
.container>>>.checklist-box { |
||||||
|
margin-right: 0 !important; |
||||||
|
} |
||||||
|
|
||||||
|
.container>>>.checklist-group { |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
|
||||||
|
.container>>>.checklist-content { |
||||||
|
width: 70vw; |
||||||
|
height: 32px; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-img { |
||||||
|
width: 26px; |
||||||
|
height: 26px; |
||||||
|
} |
||||||
|
|
||||||
|
.right-btn { |
||||||
|
width: 48px; |
||||||
|
height: 48px; |
||||||
|
background-color: #fff; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
padding: 0; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-tcdj { |
||||||
|
border-top-left-radius: 10px; |
||||||
|
border-top-right-radius: 10px; |
||||||
|
border-bottom: 1px solid #ddd; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-mjcl { |
||||||
|
border-bottom: 1px solid #ddd; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
.btn-xzgj { |
||||||
|
border-bottom-left-radius: 10px; |
||||||
|
border-bottom-right-radius: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.right-actions { |
||||||
|
position: absolute; |
||||||
|
top: 100px; |
||||||
|
right: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.map { |
||||||
|
height: 100vh; |
||||||
|
} |
||||||
|
|
||||||
|
.location { |
||||||
|
position: absolute; |
||||||
|
top: 100px; |
||||||
|
left: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.south { |
||||||
|
position: absolute; |
||||||
|
top: 160px; |
||||||
|
left: 20px; |
||||||
|
width: 48px; |
||||||
|
height: 48px; |
||||||
|
border-radius: 50%; |
||||||
|
padding: 0; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
|
||||||
|
.south-img { |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
left: -5px; |
||||||
|
width: 60px; |
||||||
|
height: 60px; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.south-text { |
||||||
|
z-index: 1; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 17px; |
||||||
|
} |
||||||
|
|
||||||
|
.btn-workbench { |
||||||
|
width: 80px; |
||||||
|
height: 80px; |
||||||
|
border-radius: 80px; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
align-items: center; |
||||||
|
padding: 0; |
||||||
|
justify-content: center; |
||||||
|
position: absolute; |
||||||
|
bottom: 20px; |
||||||
|
right: 20px; |
||||||
|
background: linear-gradient(0deg, #02C3AF, #00D883); |
||||||
|
color: #fff; |
||||||
|
/* height: 24px; */ |
||||||
|
line-height: 24px; |
||||||
|
/* font-size: 16px; */ |
||||||
|
} |
||||||
|
|
||||||
|
.workbench-img { |
||||||
|
width: 30px; |
||||||
|
height: 30px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,149 @@ |
|||||||
|
<template> |
||||||
|
<view class="container"> |
||||||
|
<view class="content"> |
||||||
|
<image src="/static/login-logo.png" class="login-logo"></image> |
||||||
|
<view class="first-title">登录</view> |
||||||
|
<form @submit="login" class="login-form"> |
||||||
|
<view class="uni-form-item uni-column"> |
||||||
|
<view class="title">用户名</view> |
||||||
|
<view> |
||||||
|
<input class="uni-input" name="username" placeholder="请输入账号" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="uni-form-item uni-column"> |
||||||
|
<view class="title">密码</view> |
||||||
|
<view> |
||||||
|
<input class="uni-input" name="password" password type="text" placeholder="请输入密码" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="uni-form-item uni-column"> |
||||||
|
<view class="title"></view> |
||||||
|
<view> |
||||||
|
<label> |
||||||
|
<switch name="remember" />下次自动登录 |
||||||
|
</label> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="uni-btn-v " style="margin-top: 36px;"> |
||||||
|
<button :loading="loading" form-type="submit" class="login-bth">立即登录</button> |
||||||
|
</view> |
||||||
|
</form> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import helper from '../../common/helper' |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
loading: false |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
login(e) { |
||||||
|
console.log('form发生了submit事件,携带数据为:' + JSON.stringify(e.detail.value)) |
||||||
|
var formdata = e.detail.value |
||||||
|
// uni.showModal({ |
||||||
|
// content: '表单数据内容:' + JSON.stringify(formdata), |
||||||
|
// showCancel: false |
||||||
|
// }); |
||||||
|
this.loading = true; |
||||||
|
uni.request({ |
||||||
|
method: 'POST', |
||||||
|
url: `${helper.serverUrl}/user/login`, |
||||||
|
data: { |
||||||
|
...formdata |
||||||
|
}, |
||||||
|
success(resp) { |
||||||
|
console.log(resp) |
||||||
|
if (resp?.data?.code !== 200) { |
||||||
|
uni.showModal({ |
||||||
|
content: resp.data.msg || '登录失败', |
||||||
|
title: '登录失败' |
||||||
|
}) |
||||||
|
} else { |
||||||
|
uni.showToast({ |
||||||
|
icon: 'success', |
||||||
|
title: '登录成功' |
||||||
|
}); |
||||||
|
if (formdata.remember) { |
||||||
|
uni.setStorage({ |
||||||
|
key: 'token', |
||||||
|
data: resp.data.data.token, |
||||||
|
success() { |
||||||
|
uni.reLaunch({ |
||||||
|
url: '/pages/index/index' |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
} else { |
||||||
|
uni.reLaunch({ |
||||||
|
url: '/pages/index/index' |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
fail(err) { |
||||||
|
console.log(resp) |
||||||
|
}, |
||||||
|
complete() { |
||||||
|
this.loading = false |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
.login-bth { |
||||||
|
background: linear-gradient(-90deg, #01C4B4, #01DC7F); |
||||||
|
border-radius: 36px; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
.login-form { |
||||||
|
width: 80%; |
||||||
|
height: 100%; |
||||||
|
margin-bottom: 70px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-form-item .title { |
||||||
|
padding: 20rpx 0; |
||||||
|
color: #526967; |
||||||
|
} |
||||||
|
|
||||||
|
.first-title { |
||||||
|
font-size: 28px; |
||||||
|
} |
||||||
|
|
||||||
|
.login-logo { |
||||||
|
position: absolute; |
||||||
|
top: -50px; |
||||||
|
left: calc(50% - 50px); |
||||||
|
width: 100px; |
||||||
|
height: 100px; |
||||||
|
} |
||||||
|
|
||||||
|
.content { |
||||||
|
position: relative; |
||||||
|
/* height: 70vh; */ |
||||||
|
flex: 1; |
||||||
|
margin: 0 24px; |
||||||
|
background-color: #ffffffa3; |
||||||
|
border-radius: 20px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
flex-direction: column; |
||||||
|
padding-top: 70px; |
||||||
|
} |
||||||
|
|
||||||
|
.container { |
||||||
|
background: url(/static/login-bg.png); |
||||||
|
height: 100vh; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,185 @@ |
|||||||
|
<template> |
||||||
|
<view class="sjgl"> |
||||||
|
<view style="padding: 0 5px;border-bottom: 1px solid #ddd;"> |
||||||
|
<uni-search-bar v-if="searchVisible" bg-color="#fff" placeholder="请输入上报内容进行搜索" :focus="true" |
||||||
|
@cancel="searchVisible=false" @confirm="search" v-model="searchValue"></uni-search-bar> |
||||||
|
</view> |
||||||
|
<view v-for="item in datas"> |
||||||
|
<uni-card style="padding: 0;"> |
||||||
|
<view style="padding: 10px;"> |
||||||
|
<custom-attr label="上报人" :value="item.reportUser"></custom-attr> |
||||||
|
<custom-attr label="上报时间" :value="item.reportTime"></custom-attr> |
||||||
|
<custom-attr label="上报内容" :value="item.reason"></custom-attr> |
||||||
|
<custom-attr label="状态" :value="item.status"></custom-attr> |
||||||
|
</view> |
||||||
|
<view style="margin-top: 10px;"> |
||||||
|
<uni-row> |
||||||
|
<uni-col :span="12"> |
||||||
|
<button style="color: #e64340;" @click="delItem(item.id)"> |
||||||
|
<image class="img-btn" src="../../static/del-btn.png"></image> |
||||||
|
删除 |
||||||
|
</button> |
||||||
|
</uni-col> |
||||||
|
<uni-col :span="12"> |
||||||
|
<button type="primary" @click="toEdit(item.id)"> |
||||||
|
<image class="img-btn" src="../../static/edit-btn.png"></image> |
||||||
|
编辑 |
||||||
|
</button> |
||||||
|
</uni-col> |
||||||
|
</uni-row> |
||||||
|
</view> |
||||||
|
</uni-card> |
||||||
|
</view> |
||||||
|
<uni-load-more :status="loadStatus" @clickLoadMore="loadMore" :content-text="contentText" /> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import helper from '../../common/helper' |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
datas: [], |
||||||
|
token: '', |
||||||
|
loadStatus: 'loading', |
||||||
|
pageNum: 1, |
||||||
|
contentText: { |
||||||
|
contentdown: '查看更多', |
||||||
|
contentrefresh: '加载中', |
||||||
|
contentnomore: '没有更多了' |
||||||
|
}, |
||||||
|
searchVisible: false, |
||||||
|
searchValue: '' |
||||||
|
} |
||||||
|
}, |
||||||
|
onLoad() {}, |
||||||
|
onShow(e) { |
||||||
|
console.log('onshow', e) |
||||||
|
uni.getStorage({ |
||||||
|
key: 'token', |
||||||
|
success: (token) => { |
||||||
|
this.token = token.data; |
||||||
|
this.datas = []; |
||||||
|
this.requestData(this.pageNum); |
||||||
|
}, |
||||||
|
fail(err) {}, |
||||||
|
complete: () => {} |
||||||
|
}) |
||||||
|
}, |
||||||
|
onNavigationBarButtonTap(e) { |
||||||
|
this.searchVisible = true |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
search(value) { |
||||||
|
this.pageNum = 1; |
||||||
|
this.datas = [] |
||||||
|
this.requestData(); |
||||||
|
}, |
||||||
|
toEdit(id) { |
||||||
|
uni.navigateTo({ |
||||||
|
url: `/pages/sjsb/sjsb?id=${id}` |
||||||
|
}) |
||||||
|
}, |
||||||
|
delItem(id) { |
||||||
|
uni.showModal({ |
||||||
|
title: '提示', |
||||||
|
content: '确定删除该条数据?', |
||||||
|
success: (e) => { |
||||||
|
if (e.confirm) { |
||||||
|
uni.showToast({ |
||||||
|
duration: 20000, |
||||||
|
title: '删除中...', |
||||||
|
icon: "loading", |
||||||
|
mask: true |
||||||
|
}) |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/ffzy/ffzy/${id}`, |
||||||
|
method: 'DELETE', |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
success: (resp) => { |
||||||
|
if (resp.data.code === 200) { |
||||||
|
uni.showToast({ |
||||||
|
title: '删除成功', |
||||||
|
icon: "success" |
||||||
|
}) |
||||||
|
this.pageNum = 1; |
||||||
|
this.datas = []; |
||||||
|
this.requestData(); |
||||||
|
} else { |
||||||
|
uni.showToast({ |
||||||
|
title: '删除失败', |
||||||
|
icon: "fail" |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
fail: () => { |
||||||
|
uni.showToast({ |
||||||
|
title: '删除失败', |
||||||
|
icon: "fail" |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
loadMore(e) { |
||||||
|
if (e.detail.status !== 'no-more') { |
||||||
|
this.pageNum = this.pageNum + 1; |
||||||
|
this.requestData(); |
||||||
|
} |
||||||
|
}, |
||||||
|
requestData() { |
||||||
|
this.loadStatus = 'loading'; |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/ffzy/ffzy/list`, |
||||||
|
data: { |
||||||
|
pageNum: this.pageNum, |
||||||
|
pageSize: 10, |
||||||
|
searchValue: this.searchValue |
||||||
|
}, |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
success: (resp) => { |
||||||
|
console.log(resp) |
||||||
|
if (resp.data.rows) { |
||||||
|
this.datas = [...this.datas, ...resp.data.rows]; |
||||||
|
if (this.datas.length >= resp.data.totalCount) { |
||||||
|
this.loadStatus = 'no-more' |
||||||
|
} else { |
||||||
|
this.loadStatus = 'more' |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style> |
||||||
|
.img-btn { |
||||||
|
width: 16px; |
||||||
|
height: 16px; |
||||||
|
margin-right: 2px; |
||||||
|
} |
||||||
|
|
||||||
|
.sjgl>>>.uni-card__content { |
||||||
|
padding: 0 !important; |
||||||
|
} |
||||||
|
|
||||||
|
.sjgl>>>.uni-card { |
||||||
|
padding: 0 !important; |
||||||
|
} |
||||||
|
|
||||||
|
.sjgl>>>uni-button { |
||||||
|
border-radius: 0 !important; |
||||||
|
} |
||||||
|
|
||||||
|
.sjgl>>>uni-button::after { |
||||||
|
border-radius: 0 !important; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,339 @@ |
|||||||
|
<template> |
||||||
|
<view class="form-root"> |
||||||
|
<view class="form-group"> |
||||||
|
<view class="uni-form-item form-item uni-column"> |
||||||
|
<view class="form-control border-btm"> |
||||||
|
<text class="form-label">当前经度</text> |
||||||
|
<view class="form-input"> |
||||||
|
<input class="uni-input" name="jd" :disabled="true" :value="jd" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="uni-form-item form-item uni-column"> |
||||||
|
<view class="form-control"> |
||||||
|
<text class="form-label">当前纬度</text> |
||||||
|
<view class="form-input"> |
||||||
|
<input class="uni-input" name="wd" :disabled="true" :value="wd" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="form-group"> |
||||||
|
<view class="uni-form-item form-item uni-column" style="padding: 12px 24px;"> |
||||||
|
<view style="margin-bottom: 10px;"> |
||||||
|
<text class="form-label">上传图片 |
||||||
|
<text v-if="uploading" style="margin-left: 8px;color: aquamarine;">上传中...</text> |
||||||
|
</text> |
||||||
|
</view> |
||||||
|
<view class="form-input imgs"> |
||||||
|
<view v-for="(img,index) in imgStrs" style="position: relative;" @click="preview(index)"> |
||||||
|
<image :src="img" class="upload-img"></image> |
||||||
|
<image @click.stop="delImg(index)" src="../../static/remove.png" |
||||||
|
style="position: absolute;width:20px;height:20px;top: -10px;right: 0px;background-color: #fff;"> |
||||||
|
</image> |
||||||
|
</view> |
||||||
|
<view class="upload-img" @click="chooseImg"> |
||||||
|
<image src="/static/sctp.png" style="width: 48px;height: 48px;"></image> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="form-group"> |
||||||
|
<view class="uni-form-item form-item uni-column" style="padding: 12px 24px;"> |
||||||
|
<view class="form-input"> |
||||||
|
<textarea name="nr" v-model="reason" placeholder="请输入上报内容(非必填)"></textarea> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<button v-if="!!submitText" class="submit" @click="submit" :loading="submiting">{{submitText}}</button> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import helper from '../../common/helper'; |
||||||
|
import { |
||||||
|
pathToBase64 |
||||||
|
} from '../../js_sdk/mmmm-image-tools' |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
imgs: [], |
||||||
|
jd: null, |
||||||
|
wd: null, |
||||||
|
reason: '', |
||||||
|
uploading: false, |
||||||
|
imgStrs: [], |
||||||
|
submiting: false, |
||||||
|
token: '', |
||||||
|
id: null, |
||||||
|
submitText: '' |
||||||
|
} |
||||||
|
}, |
||||||
|
onLoad(e) { |
||||||
|
if (e.id) { |
||||||
|
this.submitText = '保存' |
||||||
|
} else { |
||||||
|
this.submitText = '上报' |
||||||
|
} |
||||||
|
uni.getStorage({ |
||||||
|
key: 'token', |
||||||
|
success: (token) => { |
||||||
|
this.token = token.data; |
||||||
|
|
||||||
|
if (!e.id) { |
||||||
|
uni.getLocation({ |
||||||
|
type: 'wgs84', |
||||||
|
success: (res) => { |
||||||
|
this.jd = res.longitude; |
||||||
|
this.wd = res.latitude; |
||||||
|
} |
||||||
|
}); |
||||||
|
} else { |
||||||
|
this.id = e.id |
||||||
|
this.requestItem(e.id); |
||||||
|
} |
||||||
|
}, |
||||||
|
fail(err) {}, |
||||||
|
complete: () => {} |
||||||
|
}) |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
delImg(index) { |
||||||
|
this.imgStrs.splice(index, 1); |
||||||
|
}, |
||||||
|
preview(index) { |
||||||
|
uni.previewImage({ |
||||||
|
urls: this.imgStrs, |
||||||
|
current: index |
||||||
|
}) |
||||||
|
}, |
||||||
|
requestItem(id) { |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/ffzy/ffzy/${id}`, |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
success: (resp) => { |
||||||
|
console.log(resp) |
||||||
|
if (resp.data.data) { |
||||||
|
const item = resp.data.data; |
||||||
|
const str = item.geom?.replace('POINT (', '').replace(')', ''); |
||||||
|
console.log(str) |
||||||
|
const strs = str.split(' '); |
||||||
|
this.jd = parseFloat(strs[0]); |
||||||
|
this.wd = parseFloat(strs[1]); |
||||||
|
this.reason = item.reason; |
||||||
|
this.imgStrs = item.img?.split(','); |
||||||
|
// this.imgs = item.img?.split(','); |
||||||
|
} |
||||||
|
}, |
||||||
|
}) |
||||||
|
}, |
||||||
|
submit() { |
||||||
|
if (!this.jd || !this.wd) { |
||||||
|
uni.showToast({ |
||||||
|
icon: 'error', |
||||||
|
title: '未获取到当前位置' |
||||||
|
}) |
||||||
|
return; |
||||||
|
} |
||||||
|
if (this.imgStrs?.length <= 0) { |
||||||
|
uni.showToast({ |
||||||
|
icon: 'error', |
||||||
|
title: '请上传现场照片' |
||||||
|
}) |
||||||
|
return; |
||||||
|
} |
||||||
|
this.submiting = true; |
||||||
|
if (this.id) { |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/ffzy/ffzy`, |
||||||
|
method: 'PUT', |
||||||
|
data: { |
||||||
|
id: this.id, |
||||||
|
geom: `POINT(${this.jd} ${this.wd})`, |
||||||
|
img: this.imgStrs.join(','), |
||||||
|
reason: this.reason |
||||||
|
}, |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
success: (resp) => { |
||||||
|
if (resp.data.code === 200) { |
||||||
|
uni.showToast({ |
||||||
|
mask: true, |
||||||
|
icon: 'success', |
||||||
|
title: '保存成功' |
||||||
|
}); |
||||||
|
setTimeout(() => { |
||||||
|
uni.navigateBack() |
||||||
|
}, 1500) |
||||||
|
} |
||||||
|
console.log(resp) |
||||||
|
}, |
||||||
|
fail: () => { |
||||||
|
console.log(resp) |
||||||
|
}, |
||||||
|
complete: () => { |
||||||
|
this.submiting = false; |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
} else { |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/ffzy/ffzy`, |
||||||
|
method: 'POST', |
||||||
|
data: { |
||||||
|
geom: `POINT(${this.jd} ${this.wd})`, |
||||||
|
img: this.imgStrs.join(','), |
||||||
|
reason: this.reason |
||||||
|
}, |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
success: (resp) => { |
||||||
|
if (resp.data.code === 200) { |
||||||
|
uni.showToast({ |
||||||
|
mask: true, |
||||||
|
icon: 'success', |
||||||
|
title: '上报成功' |
||||||
|
}); |
||||||
|
setTimeout(() => { |
||||||
|
uni.navigateBack() |
||||||
|
}, 1500) |
||||||
|
} |
||||||
|
console.log(resp) |
||||||
|
}, |
||||||
|
fail: () => { |
||||||
|
console.log(resp) |
||||||
|
}, |
||||||
|
complete: () => { |
||||||
|
this.submiting = false; |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
} |
||||||
|
}, |
||||||
|
chooseImg() { |
||||||
|
uni.chooseImage({ |
||||||
|
count: 1, |
||||||
|
success: ({ |
||||||
|
tempFilePaths, |
||||||
|
tempFiles |
||||||
|
}) => { |
||||||
|
console.log(tempFilePaths, tempFiles) |
||||||
|
const strs = []; |
||||||
|
// tempFilePaths.forEach(path => { |
||||||
|
// pathToBase64(path).then(r => { |
||||||
|
// this.imgs = this.imgs.concat(r); |
||||||
|
// }).catch(err => { |
||||||
|
// console.log(err) |
||||||
|
// }); |
||||||
|
// }) |
||||||
|
const file = tempFiles?.[0]; |
||||||
|
const filePath = tempFilePaths?.[0]; |
||||||
|
if (filePath) { |
||||||
|
// const formData = new FormData(); |
||||||
|
// formData.append('file', file); |
||||||
|
this.uploading = true |
||||||
|
uni.uploadFile({ |
||||||
|
url: `${helper.serverUrl}/system/oss/upload`, |
||||||
|
method: 'POST', |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
files: tempFilePaths.map(path => { |
||||||
|
return { |
||||||
|
uri: path |
||||||
|
} |
||||||
|
}), |
||||||
|
// name: 'file', |
||||||
|
success: (resp) => { |
||||||
|
console.log(resp.data) |
||||||
|
let data = resp.data; |
||||||
|
if (typeof(resp.data) === 'string') { |
||||||
|
data = JSON.parse(resp.data); |
||||||
|
} |
||||||
|
console.log(data.data.url) |
||||||
|
this.imgStrs = [...this.imgStrs, data.data |
||||||
|
.url |
||||||
|
] |
||||||
|
}, |
||||||
|
fail(resp) { |
||||||
|
console.log(resp) |
||||||
|
}, |
||||||
|
complete: () => { |
||||||
|
console.log(111) |
||||||
|
this.uploading = false |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
fail() { |
||||||
|
|
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style> |
||||||
|
.imgs { |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
flex-wrap: wrap; |
||||||
|
} |
||||||
|
|
||||||
|
.submit { |
||||||
|
height: 64px; |
||||||
|
background: linear-gradient(-90deg, #01C4B4, #01DC7F); |
||||||
|
border-radius: 47px; |
||||||
|
font-weight: 400; |
||||||
|
font-size: 30px; |
||||||
|
color: #FFFFFF; |
||||||
|
margin-top: 36px; |
||||||
|
line-height: 64px; |
||||||
|
} |
||||||
|
|
||||||
|
.upload-img { |
||||||
|
width: 100px; |
||||||
|
height: 100px; |
||||||
|
background: #F5F6F8; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
/* margin: 12px 0; */ |
||||||
|
margin-right: 8px; |
||||||
|
margin-bottom: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
.form-label { |
||||||
|
padding-right: 16px; |
||||||
|
} |
||||||
|
|
||||||
|
.form-item { |
||||||
|
padding: 0px 24px; |
||||||
|
} |
||||||
|
|
||||||
|
.border-btm { |
||||||
|
border-bottom: 1px solid #d9d9d985; |
||||||
|
} |
||||||
|
|
||||||
|
.form-root { |
||||||
|
padding: 16px; |
||||||
|
} |
||||||
|
|
||||||
|
.form-control { |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
flex: 1; |
||||||
|
padding: 12px 0px; |
||||||
|
} |
||||||
|
|
||||||
|
.form-group { |
||||||
|
background: #FFFFFF; |
||||||
|
border-radius: 12px; |
||||||
|
margin-bottom: 16px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,125 @@ |
|||||||
|
<template> |
||||||
|
<view> |
||||||
|
<view> |
||||||
|
<uni-card v-for="item in datas" @click="toDetail(item)"> |
||||||
|
<view class="uni-flex uni-row" style="align-items: center;"> |
||||||
|
<text style="flex: 1;">{{item.content}}</text> |
||||||
|
<text |
||||||
|
:style="'padding-left: 8px;'+(item.status==='未读'?'color:#01D393':'color:#999999')">{{item.status}}</text> |
||||||
|
</view> |
||||||
|
</uni-card> |
||||||
|
<uni-load-more :status="loadStatus" @clickLoadMore="loadMore" :content-text="contentText" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import helper from '../../common/helper'; |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
datas: [], |
||||||
|
token: '', |
||||||
|
loadStatus: 'loading', |
||||||
|
pageNum: 1, |
||||||
|
contentText: { |
||||||
|
contentdown: '查看更多', |
||||||
|
contentrefresh: '加载中', |
||||||
|
contentnomore: '没有更多了' |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
onNavigationBarButtonTap(e) { |
||||||
|
if (e.index === 0) { |
||||||
|
this.readAll(); |
||||||
|
} |
||||||
|
}, |
||||||
|
onShow(e) { |
||||||
|
uni.getStorage({ |
||||||
|
key: 'token', |
||||||
|
success: (token) => { |
||||||
|
this.token = token.data; |
||||||
|
this.datas = []; |
||||||
|
this.requestData(); |
||||||
|
}, |
||||||
|
fail(err) {}, |
||||||
|
complete: () => {} |
||||||
|
}) |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
readAll() { |
||||||
|
uni.showModal({ |
||||||
|
content: '确定将所有消息标记为已读?', |
||||||
|
title: '提示', |
||||||
|
success: (res) => { |
||||||
|
if (res.confirm) { |
||||||
|
uni.request({ |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
method: 'PUT', |
||||||
|
url: `${helper.serverUrl}/message/readAll`, |
||||||
|
success: (resp) => { |
||||||
|
console.log(resp) |
||||||
|
this.datas = []; |
||||||
|
this.pageNum = 1; |
||||||
|
this.requestData(); |
||||||
|
} |
||||||
|
}) |
||||||
|
} else if (res.cancel) {} |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
toDetail(item) { |
||||||
|
uni.request({ |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
method: 'PUT', |
||||||
|
url: `${helper.serverUrl}/message/read/${item.id}` |
||||||
|
}) |
||||||
|
const pages = getCurrentPages(); |
||||||
|
const prevPage = pages[pages.length - 2]; |
||||||
|
uni.navigateBack({ |
||||||
|
success: () => { |
||||||
|
prevPage.$vm.showFfzy(item.sourceId) |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
loadMore(e) { |
||||||
|
if (e.detail.status !== 'no-more') { |
||||||
|
this.pageNum = this.pageNum + 1; |
||||||
|
this.requestData(); |
||||||
|
} |
||||||
|
}, |
||||||
|
requestData() { |
||||||
|
this.loadStatus = 'loading'; |
||||||
|
uni.request({ |
||||||
|
url: `${helper.serverUrl}/message/list`, |
||||||
|
data: { |
||||||
|
pageNum: this.pageNum, |
||||||
|
pageSize: 10 |
||||||
|
}, |
||||||
|
header: { |
||||||
|
Authorization: `Bearer ${this.token}` |
||||||
|
}, |
||||||
|
success: (resp) => { |
||||||
|
console.log(resp) |
||||||
|
if (resp.data.rows) { |
||||||
|
this.datas = [...this.datas, ...resp.data.rows]; |
||||||
|
if (this.datas.length >= resp.data.totalCount) { |
||||||
|
this.loadStatus = 'no-more' |
||||||
|
} else { |
||||||
|
this.loadStatus = 'more' |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
</style> |
||||||
|
After Width: | Height: | Size: 401 B |
|
After Width: | Height: | Size: 470 B |
|
After Width: | Height: | Size: 511 B |
|
After Width: | Height: | Size: 476 B |
|
After Width: | Height: | Size: 472 B |
|
After Width: | Height: | Size: 545 B |
|
After Width: | Height: | Size: 365 B |
|
After Width: | Height: | Size: 587 B |
|
After Width: | Height: | Size: 565 B |
|
After Width: | Height: | Size: 543 B |
@ -0,0 +1,20 @@ |
|||||||
|
@font-face { |
||||||
|
font-family: "customicons"; /* Project id 2878519 */ |
||||||
|
src:url('/static/customicons.ttf') format('truetype'); |
||||||
|
} |
||||||
|
|
||||||
|
.customicons { |
||||||
|
font-family: "customicons" !important; |
||||||
|
} |
||||||
|
|
||||||
|
.youxi:before { |
||||||
|
content: "\e60e"; |
||||||
|
} |
||||||
|
|
||||||
|
.wenjian:before { |
||||||
|
content: "\e60f"; |
||||||
|
} |
||||||
|
|
||||||
|
.zhuanfa:before { |
||||||
|
content: "\e610"; |
||||||
|
} |
||||||
|
After Width: | Height: | Size: 1019 B |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 980 B |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 323 B |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 1000 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1007 B |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,33 @@ |
|||||||
|
## 1.2.2(2023-01-28) |
||||||
|
- 修复 运行/打包 控制台警告问题 |
||||||
|
## 1.2.1(2022-09-05) |
||||||
|
- 修复 当 text 超过 max-num 时,badge 的宽度计算是根据 text 的长度计算,更改为 css 计算实际展示宽度,详见:[https://ask.dcloud.net.cn/question/150473](https://ask.dcloud.net.cn/question/150473) |
||||||
|
## 1.2.0(2021-11-19) |
||||||
|
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) |
||||||
|
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-badge](https://uniapp.dcloud.io/component/uniui/uni-badge) |
||||||
|
## 1.1.7(2021-11-08) |
||||||
|
- 优化 升级ui |
||||||
|
- 修改 size 属性默认值调整为 small |
||||||
|
- 修改 type 属性,默认值调整为 error,info 替换 default |
||||||
|
## 1.1.6(2021-09-22) |
||||||
|
- 修复 在字节小程序上样式不生效的 bug |
||||||
|
## 1.1.5(2021-07-30) |
||||||
|
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
||||||
|
## 1.1.4(2021-07-29) |
||||||
|
- 修复 去掉 nvue 不支持css 的 align-self 属性,nvue 下不暂支持 absolute 属性 |
||||||
|
## 1.1.3(2021-06-24) |
||||||
|
- 优化 示例项目 |
||||||
|
## 1.1.1(2021-05-12) |
||||||
|
- 新增 组件示例地址 |
||||||
|
## 1.1.0(2021-05-12) |
||||||
|
- 新增 uni-badge 的 absolute 属性,支持定位 |
||||||
|
- 新增 uni-badge 的 offset 属性,支持定位偏移 |
||||||
|
- 新增 uni-badge 的 is-dot 属性,支持仅显示有一个小点 |
||||||
|
- 新增 uni-badge 的 max-num 属性,支持自定义封顶的数字值,超过 99 显示99+ |
||||||
|
- 优化 uni-badge 属性 custom-style, 支持以对象形式自定义样式 |
||||||
|
## 1.0.7(2021-05-07) |
||||||
|
- 修复 uni-badge 在 App 端,数字小于10时不是圆形的bug |
||||||
|
- 修复 uni-badge 在父元素不是 flex 布局时,宽度缩小的bug |
||||||
|
- 新增 uni-badge 属性 custom-style, 支持自定义样式 |
||||||
|
## 1.0.6(2021-02-04) |
||||||
|
- 调整为uni_modules目录规范 |
||||||
@ -0,0 +1,268 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-badge--x"> |
||||||
|
<slot /> |
||||||
|
<text v-if="text" :class="classNames" :style="[positionStyle, customStyle, dotStyle]" |
||||||
|
class="uni-badge" @click="onClick()">{{displayValue}}</text> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
/** |
||||||
|
* Badge 数字角标 |
||||||
|
* @description 数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景 |
||||||
|
* @tutorial https://ext.dcloud.net.cn/plugin?id=21 |
||||||
|
* @property {String} text 角标内容 |
||||||
|
* @property {String} size = [normal|small] 角标内容 |
||||||
|
* @property {String} type = [info|primary|success|warning|error] 颜色类型 |
||||||
|
* @value info 灰色 |
||||||
|
* @value primary 蓝色 |
||||||
|
* @value success 绿色 |
||||||
|
* @value warning 黄色 |
||||||
|
* @value error 红色 |
||||||
|
* @property {String} inverted = [true|false] 是否无需背景颜色 |
||||||
|
* @property {Number} maxNum 展示封顶的数字值,超过 99 显示 99+ |
||||||
|
* @property {String} absolute = [rightTop|rightBottom|leftBottom|leftTop] 开启绝对定位, 角标将定位到其包裹的标签的四角上 |
||||||
|
* @value rightTop 右上 |
||||||
|
* @value rightBottom 右下 |
||||||
|
* @value leftTop 左上 |
||||||
|
* @value leftBottom 左下 |
||||||
|
* @property {Array[number]} offset 距定位角中心点的偏移量,只有存在 absolute 属性时有效,例如:[-10, -10] 表示向外偏移 10px,[10, 10] 表示向 absolute 指定的内偏移 10px |
||||||
|
* @property {String} isDot = [true|false] 是否显示为一个小点 |
||||||
|
* @event {Function} click 点击 Badge 触发事件 |
||||||
|
* @example <uni-badge text="1"></uni-badge> |
||||||
|
*/ |
||||||
|
|
||||||
|
export default { |
||||||
|
name: 'UniBadge', |
||||||
|
emits: ['click'], |
||||||
|
props: { |
||||||
|
type: { |
||||||
|
type: String, |
||||||
|
default: 'error' |
||||||
|
}, |
||||||
|
inverted: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
isDot: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
maxNum: { |
||||||
|
type: Number, |
||||||
|
default: 99 |
||||||
|
}, |
||||||
|
absolute: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
offset: { |
||||||
|
type: Array, |
||||||
|
default () { |
||||||
|
return [0, 0] |
||||||
|
} |
||||||
|
}, |
||||||
|
text: { |
||||||
|
type: [String, Number], |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
size: { |
||||||
|
type: String, |
||||||
|
default: 'small' |
||||||
|
}, |
||||||
|
customStyle: { |
||||||
|
type: Object, |
||||||
|
default () { |
||||||
|
return {} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return {}; |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
width() { |
||||||
|
return String(this.text).length * 8 + 12 |
||||||
|
}, |
||||||
|
classNames() { |
||||||
|
const { |
||||||
|
inverted, |
||||||
|
type, |
||||||
|
size, |
||||||
|
absolute |
||||||
|
} = this |
||||||
|
return [ |
||||||
|
inverted ? 'uni-badge--' + type + '-inverted' : '', |
||||||
|
'uni-badge--' + type, |
||||||
|
'uni-badge--' + size, |
||||||
|
absolute ? 'uni-badge--absolute' : '' |
||||||
|
].join(' ') |
||||||
|
}, |
||||||
|
positionStyle() { |
||||||
|
if (!this.absolute) return {} |
||||||
|
let w = this.width / 2, |
||||||
|
h = 10 |
||||||
|
if (this.isDot) { |
||||||
|
w = 5 |
||||||
|
h = 5 |
||||||
|
} |
||||||
|
const x = `${- w + this.offset[0]}px` |
||||||
|
const y = `${- h + this.offset[1]}px` |
||||||
|
|
||||||
|
const whiteList = { |
||||||
|
rightTop: { |
||||||
|
right: x, |
||||||
|
top: y |
||||||
|
}, |
||||||
|
rightBottom: { |
||||||
|
right: x, |
||||||
|
bottom: y |
||||||
|
}, |
||||||
|
leftBottom: { |
||||||
|
left: x, |
||||||
|
bottom: y |
||||||
|
}, |
||||||
|
leftTop: { |
||||||
|
left: x, |
||||||
|
top: y |
||||||
|
} |
||||||
|
} |
||||||
|
const match = whiteList[this.absolute] |
||||||
|
return match ? match : whiteList['rightTop'] |
||||||
|
}, |
||||||
|
dotStyle() { |
||||||
|
if (!this.isDot) return {} |
||||||
|
return { |
||||||
|
width: '10px', |
||||||
|
minWidth: '0', |
||||||
|
height: '10px', |
||||||
|
padding: '0', |
||||||
|
borderRadius: '10px' |
||||||
|
} |
||||||
|
}, |
||||||
|
displayValue() { |
||||||
|
const { |
||||||
|
isDot, |
||||||
|
text, |
||||||
|
maxNum |
||||||
|
} = this |
||||||
|
return isDot ? '' : (Number(text) > maxNum ? `${maxNum}+` : text) |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
onClick() { |
||||||
|
this.$emit('click'); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" > |
||||||
|
$uni-primary: #2979ff !default; |
||||||
|
$uni-success: #4cd964 !default; |
||||||
|
$uni-warning: #f0ad4e !default; |
||||||
|
$uni-error: #dd524d !default; |
||||||
|
$uni-info: #909399 !default; |
||||||
|
|
||||||
|
|
||||||
|
$bage-size: 12px; |
||||||
|
$bage-small: scale(0.8); |
||||||
|
|
||||||
|
.uni-badge--x { |
||||||
|
/* #ifdef APP-NVUE */ |
||||||
|
// align-self: flex-start; |
||||||
|
/* #endif */ |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: inline-block; |
||||||
|
/* #endif */ |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-badge--absolute { |
||||||
|
position: absolute; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-badge--small { |
||||||
|
transform: $bage-small; |
||||||
|
transform-origin: center center; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-badge { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
overflow: hidden; |
||||||
|
box-sizing: border-box; |
||||||
|
font-feature-settings: "tnum"; |
||||||
|
min-width: 20px; |
||||||
|
/* #endif */ |
||||||
|
justify-content: center; |
||||||
|
flex-direction: row; |
||||||
|
height: 20px; |
||||||
|
padding: 0 4px; |
||||||
|
line-height: 18px; |
||||||
|
color: #fff; |
||||||
|
border-radius: 100px; |
||||||
|
background-color: $uni-info; |
||||||
|
background-color: transparent; |
||||||
|
border: 1px solid #fff; |
||||||
|
text-align: center; |
||||||
|
font-family: 'Helvetica Neue', Helvetica, sans-serif; |
||||||
|
font-size: $bage-size; |
||||||
|
/* #ifdef H5 */ |
||||||
|
z-index: 999; |
||||||
|
cursor: pointer; |
||||||
|
/* #endif */ |
||||||
|
|
||||||
|
&--info { |
||||||
|
color: #fff; |
||||||
|
background-color: $uni-info; |
||||||
|
} |
||||||
|
|
||||||
|
&--primary { |
||||||
|
background-color: $uni-primary; |
||||||
|
} |
||||||
|
|
||||||
|
&--success { |
||||||
|
background-color: $uni-success; |
||||||
|
} |
||||||
|
|
||||||
|
&--warning { |
||||||
|
background-color: $uni-warning; |
||||||
|
} |
||||||
|
|
||||||
|
&--error { |
||||||
|
background-color: $uni-error; |
||||||
|
} |
||||||
|
|
||||||
|
&--inverted { |
||||||
|
padding: 0 5px 0 0; |
||||||
|
color: $uni-info; |
||||||
|
} |
||||||
|
|
||||||
|
&--info-inverted { |
||||||
|
color: $uni-info; |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
&--primary-inverted { |
||||||
|
color: $uni-primary; |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
&--success-inverted { |
||||||
|
color: $uni-success; |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
&--warning-inverted { |
||||||
|
color: $uni-warning; |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
&--error-inverted { |
||||||
|
color: $uni-error; |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,85 @@ |
|||||||
|
{ |
||||||
|
"id": "uni-badge", |
||||||
|
"displayName": "uni-badge 数字角标", |
||||||
|
"version": "1.2.2", |
||||||
|
"description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。", |
||||||
|
"keywords": [ |
||||||
|
"", |
||||||
|
"badge", |
||||||
|
"uni-ui", |
||||||
|
"uniui", |
||||||
|
"数字角标", |
||||||
|
"徽章" |
||||||
|
], |
||||||
|
"repository": "https://github.com/dcloudio/uni-ui", |
||||||
|
"engines": { |
||||||
|
"HBuilderX": "" |
||||||
|
}, |
||||||
|
"directories": { |
||||||
|
"example": "../../temps/example_temps" |
||||||
|
}, |
||||||
|
"dcloudext": { |
||||||
|
"sale": { |
||||||
|
"regular": { |
||||||
|
"price": "0.00" |
||||||
|
}, |
||||||
|
"sourcecode": { |
||||||
|
"price": "0.00" |
||||||
|
} |
||||||
|
}, |
||||||
|
"contact": { |
||||||
|
"qq": "" |
||||||
|
}, |
||||||
|
"declaration": { |
||||||
|
"ads": "无", |
||||||
|
"data": "无", |
||||||
|
"permissions": "无" |
||||||
|
}, |
||||||
|
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", |
||||||
|
"type": "component-vue" |
||||||
|
}, |
||||||
|
"uni_modules": { |
||||||
|
"dependencies": ["uni-scss"], |
||||||
|
"encrypt": [], |
||||||
|
"platforms": { |
||||||
|
"cloud": { |
||||||
|
"tcb": "y", |
||||||
|
"aliyun": "y" |
||||||
|
}, |
||||||
|
"client": { |
||||||
|
"App": { |
||||||
|
"app-vue": "y", |
||||||
|
"app-nvue": "y" |
||||||
|
}, |
||||||
|
"H5-mobile": { |
||||||
|
"Safari": "y", |
||||||
|
"Android Browser": "y", |
||||||
|
"微信浏览器(Android)": "y", |
||||||
|
"QQ浏览器(Android)": "y" |
||||||
|
}, |
||||||
|
"H5-pc": { |
||||||
|
"Chrome": "y", |
||||||
|
"IE": "y", |
||||||
|
"Edge": "y", |
||||||
|
"Firefox": "y", |
||||||
|
"Safari": "y" |
||||||
|
}, |
||||||
|
"小程序": { |
||||||
|
"微信": "y", |
||||||
|
"阿里": "y", |
||||||
|
"百度": "y", |
||||||
|
"字节跳动": "y", |
||||||
|
"QQ": "y" |
||||||
|
}, |
||||||
|
"快应用": { |
||||||
|
"华为": "y", |
||||||
|
"联盟": "y" |
||||||
|
}, |
||||||
|
"Vue": { |
||||||
|
"vue2": "y", |
||||||
|
"vue3": "y" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,10 @@ |
|||||||
|
## Badge 数字角标 |
||||||
|
> **组件名:uni-badge** |
||||||
|
> 代码块: `uBadge` |
||||||
|
|
||||||
|
数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, |
||||||
|
|
||||||
|
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-badge) |
||||||
|
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,6 @@ |
|||||||
|
## 0.1.2(2022-06-08) |
||||||
|
- 修复 微信小程序 separator 不显示的Bug |
||||||
|
## 0.1.1(2022-06-02) |
||||||
|
- 新增 支持 uni.scss 修改颜色 |
||||||
|
## 0.1.0(2022-04-21) |
||||||
|
- 初始化 |
||||||
@ -0,0 +1,121 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-breadcrumb-item"> |
||||||
|
<view :class="{ |
||||||
|
'uni-breadcrumb-item--slot': true, |
||||||
|
'uni-breadcrumb-item--slot-link': to && currentPage !== to |
||||||
|
}" @click="navTo"> |
||||||
|
<slot /> |
||||||
|
</view> |
||||||
|
<i v-if="separatorClass" class="uni-breadcrumb-item--separator" :class="separatorClass" /> |
||||||
|
<text v-else class="uni-breadcrumb-item--separator">{{ separator }}</text> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
/** |
||||||
|
* BreadcrumbItem 面包屑导航子组件 |
||||||
|
* @property {String/Object} to 路由跳转页面路径/对象 |
||||||
|
* @property {Boolean} replace 在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录(仅 h5 支持) |
||||||
|
*/ |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
currentPage: "" |
||||||
|
} |
||||||
|
}, |
||||||
|
options: { |
||||||
|
virtualHost: true |
||||||
|
}, |
||||||
|
props: { |
||||||
|
to: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
replace:{ |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
} |
||||||
|
}, |
||||||
|
inject: { |
||||||
|
uniBreadcrumb: { |
||||||
|
from: "uniBreadcrumb", |
||||||
|
default: null |
||||||
|
} |
||||||
|
}, |
||||||
|
created(){ |
||||||
|
const pages = getCurrentPages() |
||||||
|
const page = pages[pages.length-1] |
||||||
|
|
||||||
|
if(page){ |
||||||
|
this.currentPage = `/${page.route}` |
||||||
|
} |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
separator() { |
||||||
|
return this.uniBreadcrumb.separator |
||||||
|
}, |
||||||
|
separatorClass() { |
||||||
|
return this.uniBreadcrumb.separatorClass |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
navTo() { |
||||||
|
const { to } = this |
||||||
|
|
||||||
|
if (!to || this.currentPage === to){ |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
if(this.replace){ |
||||||
|
uni.redirectTo({ |
||||||
|
url:to |
||||||
|
}) |
||||||
|
}else{ |
||||||
|
uni.navigateTo({ |
||||||
|
url:to |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss"> |
||||||
|
$uni-primary: #2979ff !default; |
||||||
|
$uni-base-color: #6a6a6a !default; |
||||||
|
$uni-main-color: #3a3a3a !default; |
||||||
|
.uni-breadcrumb-item { |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
white-space: nowrap; |
||||||
|
font-size: 14px; |
||||||
|
|
||||||
|
&--slot { |
||||||
|
color: $uni-base-color; |
||||||
|
padding: 0 10px; |
||||||
|
|
||||||
|
&-link { |
||||||
|
color: $uni-main-color; |
||||||
|
font-weight: bold; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
cursor: pointer; |
||||||
|
/* #endif */ |
||||||
|
|
||||||
|
&:hover { |
||||||
|
color: $uni-primary; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&--separator { |
||||||
|
font-size: 12px; |
||||||
|
color: $uni-base-color; |
||||||
|
} |
||||||
|
|
||||||
|
&:first-child &--slot { |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
&:last-child &--separator { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,41 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-breadcrumb"> |
||||||
|
<slot /> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
/** |
||||||
|
* Breadcrumb 面包屑导航父组件 |
||||||
|
* @description 显示当前页面的路径,快速返回之前的任意页面 |
||||||
|
* @tutorial https://ext.dcloud.net.cn/plugin?id=xxx |
||||||
|
* @property {String} separator 分隔符,默认为斜杠'/' |
||||||
|
* @property {String} separatorClass 图标分隔符 class |
||||||
|
*/ |
||||||
|
export default { |
||||||
|
options: { |
||||||
|
virtualHost: true |
||||||
|
}, |
||||||
|
props: { |
||||||
|
separator: { |
||||||
|
type: String, |
||||||
|
default: '/' |
||||||
|
}, |
||||||
|
separatorClass: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
provide() { |
||||||
|
return { |
||||||
|
uniBreadcrumb: this |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss"> |
||||||
|
.uni-breadcrumb { |
||||||
|
display: flex; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,88 @@ |
|||||||
|
{ |
||||||
|
"id": "uni-breadcrumb", |
||||||
|
"displayName": "uni-breadcrumb 面包屑", |
||||||
|
"version": "0.1.2", |
||||||
|
"description": "Breadcrumb 面包屑", |
||||||
|
"keywords": [ |
||||||
|
"uni-breadcrumb", |
||||||
|
"breadcrumb", |
||||||
|
"uni-ui", |
||||||
|
"面包屑导航", |
||||||
|
"面包屑" |
||||||
|
], |
||||||
|
"repository": "", |
||||||
|
"engines": { |
||||||
|
"HBuilderX": "^3.1.0" |
||||||
|
}, |
||||||
|
"directories": { |
||||||
|
"example": "../../temps/example_temps" |
||||||
|
}, |
||||||
|
"dcloudext": { |
||||||
|
"category": [ |
||||||
|
"前端组件", |
||||||
|
"通用组件" |
||||||
|
], |
||||||
|
"sale": { |
||||||
|
"regular": { |
||||||
|
"price": "0.00" |
||||||
|
}, |
||||||
|
"sourcecode": { |
||||||
|
"price": "0.00" |
||||||
|
} |
||||||
|
}, |
||||||
|
"contact": { |
||||||
|
"qq": "" |
||||||
|
}, |
||||||
|
"declaration": { |
||||||
|
"ads": "无", |
||||||
|
"data": "无", |
||||||
|
"permissions": "无" |
||||||
|
}, |
||||||
|
"npmurl": "" |
||||||
|
}, |
||||||
|
"uni_modules": { |
||||||
|
"dependencies": [], |
||||||
|
"encrypt": [], |
||||||
|
"platforms": { |
||||||
|
"cloud": { |
||||||
|
"tcb": "y", |
||||||
|
"aliyun": "y" |
||||||
|
}, |
||||||
|
"client": { |
||||||
|
"Vue": { |
||||||
|
"vue2": "y", |
||||||
|
"vue3": "y" |
||||||
|
}, |
||||||
|
"App": { |
||||||
|
"app-vue": "y", |
||||||
|
"app-nvue": "n" |
||||||
|
}, |
||||||
|
"H5-mobile": { |
||||||
|
"Safari": "y", |
||||||
|
"Android Browser": "y", |
||||||
|
"微信浏览器(Android)": "y", |
||||||
|
"QQ浏览器(Android)": "y" |
||||||
|
}, |
||||||
|
"H5-pc": { |
||||||
|
"Chrome": "y", |
||||||
|
"IE": "y", |
||||||
|
"Edge": "y", |
||||||
|
"Firefox": "y", |
||||||
|
"Safari": "y" |
||||||
|
}, |
||||||
|
"小程序": { |
||||||
|
"微信": "y", |
||||||
|
"阿里": "u", |
||||||
|
"百度": "u", |
||||||
|
"字节跳动": "u", |
||||||
|
"QQ": "u", |
||||||
|
"京东": "u" |
||||||
|
}, |
||||||
|
"快应用": { |
||||||
|
"华为": "u", |
||||||
|
"联盟": "u" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
|
||||||
|
## breadcrumb 面包屑导航 |
||||||
|
> **组件名:uni-breadcrumb** |
||||||
|
> 代码块: `ubreadcrumb` |
||||||
|
|
||||||
|
显示当前页面的路径,快速返回之前的任意页面。 |
||||||
|
|
||||||
|
### 安装方式 |
||||||
|
|
||||||
|
本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 |
||||||
|
|
||||||
|
如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) |
||||||
|
|
||||||
|
### 基本用法 |
||||||
|
|
||||||
|
在 ``template`` 中使用组件 |
||||||
|
|
||||||
|
```html |
||||||
|
<uni-breadcrumb separator="/"> |
||||||
|
<uni-breadcrumb-item v-for="(route,index) in routes" :key="index" :to="route.to">{{route.name}}</uni-breadcrumb-item> |
||||||
|
</uni-breadcrumb> |
||||||
|
``` |
||||||
|
|
||||||
|
```js |
||||||
|
export default { |
||||||
|
name: "uni-stat-breadcrumb", |
||||||
|
data() { |
||||||
|
return { |
||||||
|
routes: [{ |
||||||
|
to: '/A', |
||||||
|
name: 'A页面' |
||||||
|
}, { |
||||||
|
to: '/B', |
||||||
|
name: 'B页面' |
||||||
|
}, { |
||||||
|
to: '/C', |
||||||
|
name: 'C页面' |
||||||
|
}] |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
## API |
||||||
|
|
||||||
|
### Breadcrumb Props |
||||||
|
|
||||||
|
|属性名 |类型 |默认值 |说明 | |
||||||
|
|:-: |:-: |:-: |:-: | |
||||||
|
|separator |String |斜杠'/' |分隔符 | |
||||||
|
|separatorClass |String | |图标分隔符 class | |
||||||
|
|
||||||
|
### Breadcrumb Item Props |
||||||
|
|
||||||
|
|属性名 |类型 |默认值 |说明 | |
||||||
|
|:-: |:-: |:-: |:-: | |
||||||
|
|to |String | |路由跳转页面路径 | |
||||||
|
|replace|Boolean | |在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录(仅 h5 支持) | |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 组件示例 |
||||||
|
|
||||||
|
点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb](https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb) |
||||||
@ -0,0 +1,26 @@ |
|||||||
|
## 1.4.10(2023-04-10) |
||||||
|
- 修复 某些情况 monthSwitch 未触发的Bug |
||||||
|
## 1.4.9(2023-02-02) |
||||||
|
- 修复 某些情况切换月份错误的Bug |
||||||
|
## 1.4.8(2023-01-30) |
||||||
|
- 修复 某些情况切换月份错误的Bug [详情](https://ask.dcloud.net.cn/question/161964) |
||||||
|
## 1.4.7(2022-09-16) |
||||||
|
- 优化 支持使用 uni-scss 控制主题色 |
||||||
|
## 1.4.6(2022-09-08) |
||||||
|
- 修复 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件的Bug |
||||||
|
## 1.4.5(2022-02-25) |
||||||
|
- 修复 条件编译 nvue 不支持的 css 样式的Bug |
||||||
|
## 1.4.4(2022-02-25) |
||||||
|
- 修复 条件编译 nvue 不支持的 css 样式的Bug |
||||||
|
## 1.4.3(2021-09-22) |
||||||
|
- 修复 startDate、 endDate 属性失效的Bug |
||||||
|
## 1.4.2(2021-08-24) |
||||||
|
- 新增 支持国际化 |
||||||
|
## 1.4.1(2021-08-05) |
||||||
|
- 修复 弹出层被 tabbar 遮盖的Bug |
||||||
|
## 1.4.0(2021-07-30) |
||||||
|
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
||||||
|
## 1.3.16(2021-05-12) |
||||||
|
- 新增 组件示例地址 |
||||||
|
## 1.3.15(2021-02-04) |
||||||
|
- 调整为uni_modules目录规范 |
||||||
@ -0,0 +1,546 @@ |
|||||||
|
/** |
||||||
|
* @1900-2100区间内的公历、农历互转 |
||||||
|
* @charset UTF-8 |
||||||
|
* @github https://github.com/jjonline/calendar.js
|
||||||
|
* @Author Jea杨(JJonline@JJonline.Cn) |
||||||
|
* @Time 2014-7-21 |
||||||
|
* @Time 2016-8-13 Fixed 2033hex、Attribution Annals |
||||||
|
* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug |
||||||
|
* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year |
||||||
|
* @Version 1.0.3 |
||||||
|
* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
|
||||||
|
* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
|
||||||
|
*/ |
||||||
|
/* eslint-disable */ |
||||||
|
var calendar = { |
||||||
|
|
||||||
|
/** |
||||||
|
* 农历1900-2100的润大小信息表 |
||||||
|
* @Array Of Property |
||||||
|
* @return Hex |
||||||
|
*/ |
||||||
|
lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909
|
||||||
|
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
|
||||||
|
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
|
||||||
|
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
|
||||||
|
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
|
||||||
|
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
|
||||||
|
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
|
||||||
|
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
|
||||||
|
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
|
||||||
|
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
|
||||||
|
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
|
||||||
|
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
|
||||||
|
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
|
||||||
|
0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
|
||||||
|
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
|
||||||
|
/** Add By JJonline@JJonline.Cn**/ |
||||||
|
0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
|
||||||
|
0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
|
||||||
|
0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
|
||||||
|
0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
|
||||||
|
0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
|
||||||
|
0x0d520], // 2100
|
||||||
|
|
||||||
|
/** |
||||||
|
* 公历每个月份的天数普通表 |
||||||
|
* @Array Of Property |
||||||
|
* @return Number |
||||||
|
*/ |
||||||
|
solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], |
||||||
|
|
||||||
|
/** |
||||||
|
* 天干地支之天干速查表 |
||||||
|
* @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], |
||||||
|
|
||||||
|
/** |
||||||
|
* 天干地支之地支速查表 |
||||||
|
* @Array Of Property |
||||||
|
* @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'], |
||||||
|
|
||||||
|
/** |
||||||
|
* 天干地支之地支速查表<=>生肖 |
||||||
|
* @Array Of Property |
||||||
|
* @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], |
||||||
|
|
||||||
|
/** |
||||||
|
* 24节气速查表 |
||||||
|
* @Array Of Property |
||||||
|
* @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'], |
||||||
|
|
||||||
|
/** |
||||||
|
* 1900-2100各年的24节气日期速查表 |
||||||
|
* @Array Of Property |
||||||
|
* @return 0x string For splice |
||||||
|
*/ |
||||||
|
sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', |
||||||
|
'97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', |
||||||
|
'97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', |
||||||
|
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', |
||||||
|
'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', |
||||||
|
'97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', |
||||||
|
'97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', |
||||||
|
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', |
||||||
|
'97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', |
||||||
|
'97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', |
||||||
|
'97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', |
||||||
|
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', |
||||||
|
'97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', |
||||||
|
'97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', |
||||||
|
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', |
||||||
|
'9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', |
||||||
|
'97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', |
||||||
|
'97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', |
||||||
|
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', |
||||||
|
'7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', |
||||||
|
'97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', |
||||||
|
'97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', |
||||||
|
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', |
||||||
|
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', |
||||||
|
'97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', |
||||||
|
'97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', |
||||||
|
'9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', |
||||||
|
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', |
||||||
|
'97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', |
||||||
|
'9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', |
||||||
|
'7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', |
||||||
|
'7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', |
||||||
|
'97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', |
||||||
|
'9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', |
||||||
|
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', |
||||||
|
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', |
||||||
|
'97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', |
||||||
|
'9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', |
||||||
|
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', |
||||||
|
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', |
||||||
|
'977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', |
||||||
|
'7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', |
||||||
|
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', |
||||||
|
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', |
||||||
|
'977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', |
||||||
|
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', |
||||||
|
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', |
||||||
|
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', |
||||||
|
'977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', |
||||||
|
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', |
||||||
|
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', |
||||||
|
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', |
||||||
|
'7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', |
||||||
|
'7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', |
||||||
|
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', |
||||||
|
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', |
||||||
|
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', |
||||||
|
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', |
||||||
|
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', |
||||||
|
'7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', |
||||||
|
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', |
||||||
|
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', |
||||||
|
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', |
||||||
|
'665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', |
||||||
|
'7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', |
||||||
|
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', |
||||||
|
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], |
||||||
|
|
||||||
|
/** |
||||||
|
* 数字转中文速查表 |
||||||
|
* @Array Of Property |
||||||
|
* @trans ['日','一','二','三','四','五','六','七','八','九','十'] |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], |
||||||
|
|
||||||
|
/** |
||||||
|
* 日期转农历称呼速查表 |
||||||
|
* @Array Of Property |
||||||
|
* @trans ['初','十','廿','卅'] |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], |
||||||
|
|
||||||
|
/** |
||||||
|
* 月份转农历称呼速查表 |
||||||
|
* @Array Of Property |
||||||
|
* @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回农历y年一整年的总天数 |
||||||
|
* @param lunar Year |
||||||
|
* @return Number |
||||||
|
* @eg:var count = calendar.lYearDays(1987) ;//count=387
|
||||||
|
*/ |
||||||
|
lYearDays: function (y) { |
||||||
|
var i; var sum = 348 |
||||||
|
for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 } |
||||||
|
return (sum + this.leapDays(y)) |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 |
||||||
|
* @param lunar Year |
||||||
|
* @return Number (0-12) |
||||||
|
* @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
|
||||||
|
*/ |
||||||
|
leapMonth: function (y) { // 闰字编码 \u95f0
|
||||||
|
return (this.lunarInfo[y - 1900] & 0xf) |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回农历y年闰月的天数 若该年没有闰月则返回0 |
||||||
|
* @param lunar Year |
||||||
|
* @return Number (0、29、30) |
||||||
|
* @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
|
||||||
|
*/ |
||||||
|
leapDays: function (y) { |
||||||
|
if (this.leapMonth(y)) { |
||||||
|
return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) |
||||||
|
} |
||||||
|
return (0) |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 |
||||||
|
* @param lunar Year |
||||||
|
* @return Number (-1、29、30) |
||||||
|
* @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
|
||||||
|
*/ |
||||||
|
monthDays: function (y, m) { |
||||||
|
if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1
|
||||||
|
return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回公历(!)y年m月的天数 |
||||||
|
* @param solar Year |
||||||
|
* @return Number (-1、28、29、30、31) |
||||||
|
* @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
|
||||||
|
*/ |
||||||
|
solarDays: function (y, m) { |
||||||
|
if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
|
||||||
|
var ms = m - 1 |
||||||
|
if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
|
||||||
|
return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) |
||||||
|
} else { |
||||||
|
return (this.solarMonth[ms]) |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 农历年份转换为干支纪年 |
||||||
|
* @param lYear 农历年的年份数 |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
toGanZhiYear: function (lYear) { |
||||||
|
var ganKey = (lYear - 3) % 10 |
||||||
|
var zhiKey = (lYear - 3) % 12 |
||||||
|
if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干
|
||||||
|
if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支
|
||||||
|
return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 公历月、日判断所属星座 |
||||||
|
* @param cMonth [description] |
||||||
|
* @param cDay [description] |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
toAstro: function (cMonth, cDay) { |
||||||
|
var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' |
||||||
|
var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] |
||||||
|
return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座
|
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 传入offset偏移量返回干支 |
||||||
|
* @param offset 相对甲子的偏移量 |
||||||
|
* @return Cn string |
||||||
|
*/ |
||||||
|
toGanZhi: function (offset) { |
||||||
|
return this.Gan[offset % 10] + this.Zhi[offset % 12] |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 传入公历(!)y年获得该年第n个节气的公历日期 |
||||||
|
* @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 |
||||||
|
* @return day Number |
||||||
|
* @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
|
||||||
|
*/ |
||||||
|
getTerm: function (y, n) { |
||||||
|
if (y < 1900 || y > 2100) { return -1 } |
||||||
|
if (n < 1 || n > 24) { return -1 } |
||||||
|
var _table = this.sTermInfo[y - 1900] |
||||||
|
var _info = [ |
||||||
|
parseInt('0x' + _table.substr(0, 5)).toString(), |
||||||
|
parseInt('0x' + _table.substr(5, 5)).toString(), |
||||||
|
parseInt('0x' + _table.substr(10, 5)).toString(), |
||||||
|
parseInt('0x' + _table.substr(15, 5)).toString(), |
||||||
|
parseInt('0x' + _table.substr(20, 5)).toString(), |
||||||
|
parseInt('0x' + _table.substr(25, 5)).toString() |
||||||
|
] |
||||||
|
var _calday = [ |
||||||
|
_info[0].substr(0, 1), |
||||||
|
_info[0].substr(1, 2), |
||||||
|
_info[0].substr(3, 1), |
||||||
|
_info[0].substr(4, 2), |
||||||
|
|
||||||
|
_info[1].substr(0, 1), |
||||||
|
_info[1].substr(1, 2), |
||||||
|
_info[1].substr(3, 1), |
||||||
|
_info[1].substr(4, 2), |
||||||
|
|
||||||
|
_info[2].substr(0, 1), |
||||||
|
_info[2].substr(1, 2), |
||||||
|
_info[2].substr(3, 1), |
||||||
|
_info[2].substr(4, 2), |
||||||
|
|
||||||
|
_info[3].substr(0, 1), |
||||||
|
_info[3].substr(1, 2), |
||||||
|
_info[3].substr(3, 1), |
||||||
|
_info[3].substr(4, 2), |
||||||
|
|
||||||
|
_info[4].substr(0, 1), |
||||||
|
_info[4].substr(1, 2), |
||||||
|
_info[4].substr(3, 1), |
||||||
|
_info[4].substr(4, 2), |
||||||
|
|
||||||
|
_info[5].substr(0, 1), |
||||||
|
_info[5].substr(1, 2), |
||||||
|
_info[5].substr(3, 1), |
||||||
|
_info[5].substr(4, 2) |
||||||
|
] |
||||||
|
return parseInt(_calday[n - 1]) |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 传入农历数字月份返回汉语通俗表示法 |
||||||
|
* @param lunar month |
||||||
|
* @return Cn string |
||||||
|
* @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
|
||||||
|
*/ |
||||||
|
toChinaMonth: function (m) { // 月 => \u6708
|
||||||
|
if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
|
||||||
|
var s = this.nStr3[m - 1] |
||||||
|
s += '\u6708'// 加上月字
|
||||||
|
return s |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 传入农历日期数字返回汉字表示法 |
||||||
|
* @param lunar day |
||||||
|
* @return Cn string |
||||||
|
* @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
|
||||||
|
*/ |
||||||
|
toChinaDay: function (d) { // 日 => \u65e5
|
||||||
|
var s |
||||||
|
switch (d) { |
||||||
|
case 10: |
||||||
|
s = '\u521d\u5341'; break |
||||||
|
case 20: |
||||||
|
s = '\u4e8c\u5341'; break |
||||||
|
break |
||||||
|
case 30: |
||||||
|
s = '\u4e09\u5341'; break |
||||||
|
break |
||||||
|
default : |
||||||
|
s = this.nStr2[Math.floor(d / 10)] |
||||||
|
s += this.nStr1[d % 10] |
||||||
|
} |
||||||
|
return (s) |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” |
||||||
|
* @param y year |
||||||
|
* @return Cn string |
||||||
|
* @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
|
||||||
|
*/ |
||||||
|
getAnimal: function (y) { |
||||||
|
return this.Animals[(y - 4) % 12] |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 传入阳历年月日获得详细的公历、农历object信息 <=>JSON |
||||||
|
* @param y solar year |
||||||
|
* @param m solar month |
||||||
|
* @param d solar day |
||||||
|
* @return JSON object |
||||||
|
* @eg:console.log(calendar.solar2lunar(1987,11,01)); |
||||||
|
*/ |
||||||
|
solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
|
||||||
|
// 年份限定、上限
|
||||||
|
if (y < 1900 || y > 2100) { |
||||||
|
return -1// undefined转换为数字变为NaN
|
||||||
|
} |
||||||
|
// 公历传参最下限
|
||||||
|
if (y == 1900 && m == 1 && d < 31) { |
||||||
|
return -1 |
||||||
|
} |
||||||
|
// 未传参 获得当天
|
||||||
|
if (!y) { |
||||||
|
var objDate = new Date() |
||||||
|
} else { |
||||||
|
var objDate = new Date(y, parseInt(m) - 1, d) |
||||||
|
} |
||||||
|
var i; var leap = 0; var temp = 0 |
||||||
|
// 修正ymd参数
|
||||||
|
var y = objDate.getFullYear() |
||||||
|
var m = objDate.getMonth() + 1 |
||||||
|
var d = objDate.getDate() |
||||||
|
var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000 |
||||||
|
for (i = 1900; i < 2101 && offset > 0; i++) { |
||||||
|
temp = this.lYearDays(i) |
||||||
|
offset -= temp |
||||||
|
} |
||||||
|
if (offset < 0) { |
||||||
|
offset += temp; i-- |
||||||
|
} |
||||||
|
|
||||||
|
// 是否今天
|
||||||
|
var isTodayObj = new Date() |
||||||
|
var isToday = false |
||||||
|
if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { |
||||||
|
isToday = true |
||||||
|
} |
||||||
|
// 星期几
|
||||||
|
var nWeek = objDate.getDay() |
||||||
|
var cWeek = this.nStr1[nWeek] |
||||||
|
// 数字表示周几顺应天朝周一开始的惯例
|
||||||
|
if (nWeek == 0) { |
||||||
|
nWeek = 7 |
||||||
|
} |
||||||
|
// 农历年
|
||||||
|
var year = i |
||||||
|
var leap = this.leapMonth(i) // 闰哪个月
|
||||||
|
var isLeap = false |
||||||
|
|
||||||
|
// 效验闰月
|
||||||
|
for (i = 1; i < 13 && offset > 0; i++) { |
||||||
|
// 闰月
|
||||||
|
if (leap > 0 && i == (leap + 1) && isLeap == false) { |
||||||
|
--i |
||||||
|
isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数
|
||||||
|
} else { |
||||||
|
temp = this.monthDays(year, i)// 计算农历普通月天数
|
||||||
|
} |
||||||
|
// 解除闰月
|
||||||
|
if (isLeap == true && i == (leap + 1)) { isLeap = false } |
||||||
|
offset -= temp |
||||||
|
} |
||||||
|
// 闰月导致数组下标重叠取反
|
||||||
|
if (offset == 0 && leap > 0 && i == leap + 1) { |
||||||
|
if (isLeap) { |
||||||
|
isLeap = false |
||||||
|
} else { |
||||||
|
isLeap = true; --i |
||||||
|
} |
||||||
|
} |
||||||
|
if (offset < 0) { |
||||||
|
offset += temp; --i |
||||||
|
} |
||||||
|
// 农历月
|
||||||
|
var month = i |
||||||
|
// 农历日
|
||||||
|
var day = offset + 1 |
||||||
|
// 天干地支处理
|
||||||
|
var sm = m - 1 |
||||||
|
var gzY = this.toGanZhiYear(year) |
||||||
|
|
||||||
|
// 当月的两个节气
|
||||||
|
// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
|
||||||
|
var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
|
||||||
|
var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始
|
||||||
|
|
||||||
|
// 依据12节气修正干支月
|
||||||
|
var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) |
||||||
|
if (d >= firstNode) { |
||||||
|
gzM = this.toGanZhi((y - 1900) * 12 + m + 12) |
||||||
|
} |
||||||
|
|
||||||
|
// 传入的日期的节气与否
|
||||||
|
var isTerm = false |
||||||
|
var Term = null |
||||||
|
if (firstNode == d) { |
||||||
|
isTerm = true |
||||||
|
Term = this.solarTerm[m * 2 - 2] |
||||||
|
} |
||||||
|
if (secondNode == d) { |
||||||
|
isTerm = true |
||||||
|
Term = this.solarTerm[m * 2 - 1] |
||||||
|
} |
||||||
|
// 日柱 当月一日与 1900/1/1 相差天数
|
||||||
|
var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 |
||||||
|
var gzD = this.toGanZhi(dayCyclical + d - 1) |
||||||
|
// 该日期所属的星座
|
||||||
|
var astro = this.toAstro(m, d) |
||||||
|
|
||||||
|
return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro } |
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON |
||||||
|
* @param y lunar year |
||||||
|
* @param m lunar month |
||||||
|
* @param d lunar day |
||||||
|
* @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] |
||||||
|
* @return JSON object |
||||||
|
* @eg:console.log(calendar.lunar2solar(1987,9,10)); |
||||||
|
*/ |
||||||
|
lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
|
||||||
|
var isLeapMonth = !!isLeapMonth |
||||||
|
var leapOffset = 0 |
||||||
|
var leapMonth = this.leapMonth(y) |
||||||
|
var leapDay = this.leapDays(y) |
||||||
|
if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
|
||||||
|
if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值
|
||||||
|
var day = this.monthDays(y, m) |
||||||
|
var _day = day |
||||||
|
// bugFix 2016-9-25
|
||||||
|
// if month is leap, _day use leapDays method
|
||||||
|
if (isLeapMonth) { |
||||||
|
_day = this.leapDays(y, m) |
||||||
|
} |
||||||
|
if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验
|
||||||
|
|
||||||
|
// 计算农历的时间差
|
||||||
|
var offset = 0 |
||||||
|
for (var i = 1900; i < y; i++) { |
||||||
|
offset += this.lYearDays(i) |
||||||
|
} |
||||||
|
var leap = 0; var isAdd = false |
||||||
|
for (var i = 1; i < m; i++) { |
||||||
|
leap = this.leapMonth(y) |
||||||
|
if (!isAdd) { // 处理闰月
|
||||||
|
if (leap <= i && leap > 0) { |
||||||
|
offset += this.leapDays(y); isAdd = true |
||||||
|
} |
||||||
|
} |
||||||
|
offset += this.monthDays(y, i) |
||||||
|
} |
||||||
|
// 转换闰月农历 需补充该年闰月的前一个月的时差
|
||||||
|
if (isLeapMonth) { offset += day } |
||||||
|
// 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
|
||||||
|
var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) |
||||||
|
var calObj = new Date((offset + d - 31) * 86400000 + stmap) |
||||||
|
var cY = calObj.getUTCFullYear() |
||||||
|
var cM = calObj.getUTCMonth() + 1 |
||||||
|
var cD = calObj.getUTCDate() |
||||||
|
|
||||||
|
return this.solar2lunar(cY, cM, cD) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export default calendar |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
{ |
||||||
|
"uni-calender.ok": "ok", |
||||||
|
"uni-calender.cancel": "cancel", |
||||||
|
"uni-calender.today": "today", |
||||||
|
"uni-calender.MON": "MON", |
||||||
|
"uni-calender.TUE": "TUE", |
||||||
|
"uni-calender.WED": "WED", |
||||||
|
"uni-calender.THU": "THU", |
||||||
|
"uni-calender.FRI": "FRI", |
||||||
|
"uni-calender.SAT": "SAT", |
||||||
|
"uni-calender.SUN": "SUN" |
||||||
|
} |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
import en from './en.json' |
||||||
|
import zhHans from './zh-Hans.json' |
||||||
|
import zhHant from './zh-Hant.json' |
||||||
|
export default { |
||||||
|
en, |
||||||
|
'zh-Hans': zhHans, |
||||||
|
'zh-Hant': zhHant |
||||||
|
} |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
{ |
||||||
|
"uni-calender.ok": "确定", |
||||||
|
"uni-calender.cancel": "取消", |
||||||
|
"uni-calender.today": "今日", |
||||||
|
"uni-calender.SUN": "日", |
||||||
|
"uni-calender.MON": "一", |
||||||
|
"uni-calender.TUE": "二", |
||||||
|
"uni-calender.WED": "三", |
||||||
|
"uni-calender.THU": "四", |
||||||
|
"uni-calender.FRI": "五", |
||||||
|
"uni-calender.SAT": "六" |
||||||
|
} |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
{ |
||||||
|
"uni-calender.ok": "確定", |
||||||
|
"uni-calender.cancel": "取消", |
||||||
|
"uni-calender.today": "今日", |
||||||
|
"uni-calender.SUN": "日", |
||||||
|
"uni-calender.MON": "一", |
||||||
|
"uni-calender.TUE": "二", |
||||||
|
"uni-calender.WED": "三", |
||||||
|
"uni-calender.THU": "四", |
||||||
|
"uni-calender.FRI": "五", |
||||||
|
"uni-calender.SAT": "六" |
||||||
|
} |
||||||
@ -0,0 +1,187 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-calendar-item__weeks-box" :class="{ |
||||||
|
'uni-calendar-item--disable':weeks.disable, |
||||||
|
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay, |
||||||
|
'uni-calendar-item--checked':(calendar.fullDate === weeks.fullDate && !weeks.isDay) , |
||||||
|
'uni-calendar-item--before-checked':weeks.beforeMultiple, |
||||||
|
'uni-calendar-item--multiple': weeks.multiple, |
||||||
|
'uni-calendar-item--after-checked':weeks.afterMultiple, |
||||||
|
}" |
||||||
|
@click="choiceDate(weeks)"> |
||||||
|
<view class="uni-calendar-item__weeks-box-item"> |
||||||
|
<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text> |
||||||
|
<text class="uni-calendar-item__weeks-box-text" :class="{ |
||||||
|
'uni-calendar-item--isDay-text': weeks.isDay, |
||||||
|
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay, |
||||||
|
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay, |
||||||
|
'uni-calendar-item--before-checked':weeks.beforeMultiple, |
||||||
|
'uni-calendar-item--multiple': weeks.multiple, |
||||||
|
'uni-calendar-item--after-checked':weeks.afterMultiple, |
||||||
|
'uni-calendar-item--disable':weeks.disable, |
||||||
|
}">{{weeks.date}}</text> |
||||||
|
<text v-if="!lunar&&!weeks.extraInfo && weeks.isDay" class="uni-calendar-item__weeks-lunar-text" :class="{ |
||||||
|
'uni-calendar-item--isDay-text':weeks.isDay, |
||||||
|
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay, |
||||||
|
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay, |
||||||
|
'uni-calendar-item--before-checked':weeks.beforeMultiple, |
||||||
|
'uni-calendar-item--multiple': weeks.multiple, |
||||||
|
'uni-calendar-item--after-checked':weeks.afterMultiple, |
||||||
|
}">{{todayText}}</text> |
||||||
|
<text v-if="lunar&&!weeks.extraInfo" class="uni-calendar-item__weeks-lunar-text" :class="{ |
||||||
|
'uni-calendar-item--isDay-text':weeks.isDay, |
||||||
|
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay, |
||||||
|
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay, |
||||||
|
'uni-calendar-item--before-checked':weeks.beforeMultiple, |
||||||
|
'uni-calendar-item--multiple': weeks.multiple, |
||||||
|
'uni-calendar-item--after-checked':weeks.afterMultiple, |
||||||
|
'uni-calendar-item--disable':weeks.disable, |
||||||
|
}">{{weeks.isDay ? todayText : (weeks.lunar.IDayCn === '初一'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}</text> |
||||||
|
<text v-if="weeks.extraInfo&&weeks.extraInfo.info" class="uni-calendar-item__weeks-lunar-text" :class="{ |
||||||
|
'uni-calendar-item--extra':weeks.extraInfo.info, |
||||||
|
'uni-calendar-item--isDay-text':weeks.isDay, |
||||||
|
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay, |
||||||
|
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay, |
||||||
|
'uni-calendar-item--before-checked':weeks.beforeMultiple, |
||||||
|
'uni-calendar-item--multiple': weeks.multiple, |
||||||
|
'uni-calendar-item--after-checked':weeks.afterMultiple, |
||||||
|
'uni-calendar-item--disable':weeks.disable, |
||||||
|
}">{{weeks.extraInfo.info}}</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { initVueI18n } from '@dcloudio/uni-i18n' |
||||||
|
import i18nMessages from './i18n/index.js' |
||||||
|
const { t } = initVueI18n(i18nMessages) |
||||||
|
|
||||||
|
export default { |
||||||
|
emits:['change'], |
||||||
|
props: { |
||||||
|
weeks: { |
||||||
|
type: Object, |
||||||
|
default () { |
||||||
|
return {} |
||||||
|
} |
||||||
|
}, |
||||||
|
calendar: { |
||||||
|
type: Object, |
||||||
|
default: () => { |
||||||
|
return {} |
||||||
|
} |
||||||
|
}, |
||||||
|
selected: { |
||||||
|
type: Array, |
||||||
|
default: () => { |
||||||
|
return [] |
||||||
|
} |
||||||
|
}, |
||||||
|
lunar: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
} |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
todayText() { |
||||||
|
return t("uni-calender.today") |
||||||
|
}, |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
choiceDate(weeks) { |
||||||
|
this.$emit('change', weeks) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
$uni-font-size-base:14px; |
||||||
|
$uni-text-color:#333; |
||||||
|
$uni-font-size-sm:12px; |
||||||
|
$uni-color-error: #e43d33; |
||||||
|
$uni-opacity-disabled: 0.3; |
||||||
|
$uni-text-color-disable:#c0c0c0; |
||||||
|
$uni-primary: #2979ff !default; |
||||||
|
.uni-calendar-item__weeks-box { |
||||||
|
flex: 1; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: column; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item__weeks-box-text { |
||||||
|
font-size: $uni-font-size-base; |
||||||
|
color: $uni-text-color; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item__weeks-lunar-text { |
||||||
|
font-size: $uni-font-size-sm; |
||||||
|
color: $uni-text-color; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item__weeks-box-item { |
||||||
|
position: relative; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: column; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
width: 100rpx; |
||||||
|
height: 100rpx; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item__weeks-box-circle { |
||||||
|
position: absolute; |
||||||
|
top: 5px; |
||||||
|
right: 5px; |
||||||
|
width: 8px; |
||||||
|
height: 8px; |
||||||
|
border-radius: 8px; |
||||||
|
background-color: $uni-color-error; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item--disable { |
||||||
|
background-color: rgba(249, 249, 249, $uni-opacity-disabled); |
||||||
|
color: $uni-text-color-disable; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item--isDay-text { |
||||||
|
color: $uni-primary; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item--isDay { |
||||||
|
background-color: $uni-primary; |
||||||
|
opacity: 0.8; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item--extra { |
||||||
|
color: $uni-color-error; |
||||||
|
opacity: 0.8; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item--checked { |
||||||
|
background-color: $uni-primary; |
||||||
|
color: #fff; |
||||||
|
opacity: 0.8; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar-item--multiple { |
||||||
|
background-color: $uni-primary; |
||||||
|
color: #fff; |
||||||
|
opacity: 0.8; |
||||||
|
} |
||||||
|
.uni-calendar-item--before-checked { |
||||||
|
background-color: #ff5a5f; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
.uni-calendar-item--after-checked { |
||||||
|
background-color: #ff5a5f; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,566 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-calendar"> |
||||||
|
<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" @click="clean"></view> |
||||||
|
<view v-if="insert || show" class="uni-calendar__content" :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}"> |
||||||
|
<view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top"> |
||||||
|
<view class="uni-calendar__header-btn-box" @click="close"> |
||||||
|
<text class="uni-calendar__header-text uni-calendar--fixed-width">{{cancelText}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__header-btn-box" @click="confirm"> |
||||||
|
<text class="uni-calendar__header-text uni-calendar--fixed-width">{{okText}}</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__header"> |
||||||
|
<view class="uni-calendar__header-btn-box" @click.stop="pre"> |
||||||
|
<view class="uni-calendar__header-btn uni-calendar--left"></view> |
||||||
|
</view> |
||||||
|
<picker mode="date" :value="date" fields="month" @change="bindDateChange"> |
||||||
|
<text class="uni-calendar__header-text">{{ (nowDate.year||'') +' / '+( nowDate.month||'')}}</text> |
||||||
|
</picker> |
||||||
|
<view class="uni-calendar__header-btn-box" @click.stop="next"> |
||||||
|
<view class="uni-calendar__header-btn uni-calendar--right"></view> |
||||||
|
</view> |
||||||
|
<text class="uni-calendar__backtoday" @click="backToday">{{todayText}}</text> |
||||||
|
|
||||||
|
</view> |
||||||
|
<view class="uni-calendar__box"> |
||||||
|
<view v-if="showMonth" class="uni-calendar__box-bg"> |
||||||
|
<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__weeks"> |
||||||
|
<view class="uni-calendar__weeks-day"> |
||||||
|
<text class="uni-calendar__weeks-day-text">{{SUNText}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__weeks-day"> |
||||||
|
<text class="uni-calendar__weeks-day-text">{{monText}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__weeks-day"> |
||||||
|
<text class="uni-calendar__weeks-day-text">{{TUEText}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__weeks-day"> |
||||||
|
<text class="uni-calendar__weeks-day-text">{{WEDText}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__weeks-day"> |
||||||
|
<text class="uni-calendar__weeks-day-text">{{THUText}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__weeks-day"> |
||||||
|
<text class="uni-calendar__weeks-day-text">{{FRIText}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__weeks-day"> |
||||||
|
<text class="uni-calendar__weeks-day-text">{{SATText}}</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex"> |
||||||
|
<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex"> |
||||||
|
<calendar-item class="uni-calendar-item--hook" :weeks="weeks" :calendar="calendar" :selected="selected" :lunar="lunar" @change="choiceDate"></calendar-item> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import Calendar from './util.js'; |
||||||
|
import CalendarItem from './uni-calendar-item.vue' |
||||||
|
|
||||||
|
import { initVueI18n } from '@dcloudio/uni-i18n' |
||||||
|
import i18nMessages from './i18n/index.js' |
||||||
|
const { t } = initVueI18n(i18nMessages) |
||||||
|
|
||||||
|
/** |
||||||
|
* Calendar 日历 |
||||||
|
* @description 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等 |
||||||
|
* @tutorial https://ext.dcloud.net.cn/plugin?id=56 |
||||||
|
* @property {String} date 自定义当前时间,默认为今天 |
||||||
|
* @property {Boolean} lunar 显示农历 |
||||||
|
* @property {String} startDate 日期选择范围-开始日期 |
||||||
|
* @property {String} endDate 日期选择范围-结束日期 |
||||||
|
* @property {Boolean} range 范围选择 |
||||||
|
* @property {Boolean} insert = [true|false] 插入模式,默认为false |
||||||
|
* @value true 弹窗模式 |
||||||
|
* @value false 插入模式 |
||||||
|
* @property {Boolean} clearDate = [true|false] 弹窗模式是否清空上次选择内容 |
||||||
|
* @property {Array} selected 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}] |
||||||
|
* @property {Boolean} showMonth 是否选择月份为背景 |
||||||
|
* @event {Function} change 日期改变,`insert :ture` 时生效 |
||||||
|
* @event {Function} confirm 确认选择`insert :false` 时生效 |
||||||
|
* @event {Function} monthSwitch 切换月份时触发 |
||||||
|
* @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" /> |
||||||
|
*/ |
||||||
|
export default { |
||||||
|
components: { |
||||||
|
CalendarItem |
||||||
|
}, |
||||||
|
emits:['close','confirm','change','monthSwitch'], |
||||||
|
props: { |
||||||
|
date: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
selected: { |
||||||
|
type: Array, |
||||||
|
default () { |
||||||
|
return [] |
||||||
|
} |
||||||
|
}, |
||||||
|
lunar: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
startDate: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
endDate: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
range: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
insert: { |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
}, |
||||||
|
showMonth: { |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
}, |
||||||
|
clearDate: { |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
} |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
show: false, |
||||||
|
weeks: [], |
||||||
|
calendar: {}, |
||||||
|
nowDate: '', |
||||||
|
aniMaskShow: false |
||||||
|
} |
||||||
|
}, |
||||||
|
computed:{ |
||||||
|
/** |
||||||
|
* for i18n |
||||||
|
*/ |
||||||
|
|
||||||
|
okText() { |
||||||
|
return t("uni-calender.ok") |
||||||
|
}, |
||||||
|
cancelText() { |
||||||
|
return t("uni-calender.cancel") |
||||||
|
}, |
||||||
|
todayText() { |
||||||
|
return t("uni-calender.today") |
||||||
|
}, |
||||||
|
monText() { |
||||||
|
return t("uni-calender.MON") |
||||||
|
}, |
||||||
|
TUEText() { |
||||||
|
return t("uni-calender.TUE") |
||||||
|
}, |
||||||
|
WEDText() { |
||||||
|
return t("uni-calender.WED") |
||||||
|
}, |
||||||
|
THUText() { |
||||||
|
return t("uni-calender.THU") |
||||||
|
}, |
||||||
|
FRIText() { |
||||||
|
return t("uni-calender.FRI") |
||||||
|
}, |
||||||
|
SATText() { |
||||||
|
return t("uni-calender.SAT") |
||||||
|
}, |
||||||
|
SUNText() { |
||||||
|
return t("uni-calender.SUN") |
||||||
|
}, |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
date(newVal) { |
||||||
|
// this.cale.setDate(newVal) |
||||||
|
this.init(newVal) |
||||||
|
}, |
||||||
|
startDate(val){ |
||||||
|
this.cale.resetSatrtDate(val) |
||||||
|
this.cale.setDate(this.nowDate.fullDate) |
||||||
|
this.weeks = this.cale.weeks |
||||||
|
}, |
||||||
|
endDate(val){ |
||||||
|
this.cale.resetEndDate(val) |
||||||
|
this.cale.setDate(this.nowDate.fullDate) |
||||||
|
this.weeks = this.cale.weeks |
||||||
|
}, |
||||||
|
selected(newVal) { |
||||||
|
this.cale.setSelectInfo(this.nowDate.fullDate, newVal) |
||||||
|
this.weeks = this.cale.weeks |
||||||
|
} |
||||||
|
}, |
||||||
|
created() { |
||||||
|
this.cale = new Calendar({ |
||||||
|
selected: this.selected, |
||||||
|
startDate: this.startDate, |
||||||
|
endDate: this.endDate, |
||||||
|
range: this.range, |
||||||
|
}) |
||||||
|
this.init(this.date) |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
// 取消穿透 |
||||||
|
clean() {}, |
||||||
|
bindDateChange(e) { |
||||||
|
const value = e.detail.value + '-1' |
||||||
|
this.setDate(value) |
||||||
|
|
||||||
|
const { year,month } = this.cale.getDate(value) |
||||||
|
this.$emit('monthSwitch', { |
||||||
|
year, |
||||||
|
month |
||||||
|
}) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 初始化日期显示 |
||||||
|
* @param {Object} date |
||||||
|
*/ |
||||||
|
init(date) { |
||||||
|
this.cale.setDate(date) |
||||||
|
this.weeks = this.cale.weeks |
||||||
|
this.nowDate = this.calendar = this.cale.getInfo(date) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 打开日历弹窗 |
||||||
|
*/ |
||||||
|
open() { |
||||||
|
// 弹窗模式并且清理数据 |
||||||
|
if (this.clearDate && !this.insert) { |
||||||
|
this.cale.cleanMultipleStatus() |
||||||
|
// this.cale.setDate(this.date) |
||||||
|
this.init(this.date) |
||||||
|
} |
||||||
|
this.show = true |
||||||
|
this.$nextTick(() => { |
||||||
|
setTimeout(() => { |
||||||
|
this.aniMaskShow = true |
||||||
|
}, 50) |
||||||
|
}) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 关闭日历弹窗 |
||||||
|
*/ |
||||||
|
close() { |
||||||
|
this.aniMaskShow = false |
||||||
|
this.$nextTick(() => { |
||||||
|
setTimeout(() => { |
||||||
|
this.show = false |
||||||
|
this.$emit('close') |
||||||
|
}, 300) |
||||||
|
}) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 确认按钮 |
||||||
|
*/ |
||||||
|
confirm() { |
||||||
|
this.setEmit('confirm') |
||||||
|
this.close() |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 变化触发 |
||||||
|
*/ |
||||||
|
change() { |
||||||
|
if (!this.insert) return |
||||||
|
this.setEmit('change') |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 选择月份触发 |
||||||
|
*/ |
||||||
|
monthSwitch() { |
||||||
|
let { |
||||||
|
year, |
||||||
|
month |
||||||
|
} = this.nowDate |
||||||
|
this.$emit('monthSwitch', { |
||||||
|
year, |
||||||
|
month: Number(month) |
||||||
|
}) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 派发事件 |
||||||
|
* @param {Object} name |
||||||
|
*/ |
||||||
|
setEmit(name) { |
||||||
|
let { |
||||||
|
year, |
||||||
|
month, |
||||||
|
date, |
||||||
|
fullDate, |
||||||
|
lunar, |
||||||
|
extraInfo |
||||||
|
} = this.calendar |
||||||
|
this.$emit(name, { |
||||||
|
range: this.cale.multipleStatus, |
||||||
|
year, |
||||||
|
month, |
||||||
|
date, |
||||||
|
fulldate: fullDate, |
||||||
|
lunar, |
||||||
|
extraInfo: extraInfo || {} |
||||||
|
}) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 选择天触发 |
||||||
|
* @param {Object} weeks |
||||||
|
*/ |
||||||
|
choiceDate(weeks) { |
||||||
|
if (weeks.disable) return |
||||||
|
this.calendar = weeks |
||||||
|
// 设置多选 |
||||||
|
this.cale.setMultiple(this.calendar.fullDate) |
||||||
|
this.weeks = this.cale.weeks |
||||||
|
this.change() |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 回到今天 |
||||||
|
*/ |
||||||
|
backToday() { |
||||||
|
const nowYearMonth = `${this.nowDate.year}-${this.nowDate.month}` |
||||||
|
const date = this.cale.getDate(new Date()) |
||||||
|
const todayYearMonth = `${date.year}-${date.month}` |
||||||
|
|
||||||
|
if(nowYearMonth !== todayYearMonth) { |
||||||
|
this.monthSwitch() |
||||||
|
} |
||||||
|
|
||||||
|
this.init(date.fullDate) |
||||||
|
this.change() |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 上个月 |
||||||
|
*/ |
||||||
|
pre() { |
||||||
|
const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate |
||||||
|
this.setDate(preDate) |
||||||
|
this.monthSwitch() |
||||||
|
|
||||||
|
}, |
||||||
|
/** |
||||||
|
* 下个月 |
||||||
|
*/ |
||||||
|
next() { |
||||||
|
const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate |
||||||
|
this.setDate(nextDate) |
||||||
|
this.monthSwitch() |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 设置日期 |
||||||
|
* @param {Object} date |
||||||
|
*/ |
||||||
|
setDate(date) { |
||||||
|
this.cale.setDate(date) |
||||||
|
this.weeks = this.cale.weeks |
||||||
|
this.nowDate = this.cale.getInfo(date) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
$uni-bg-color-mask: rgba($color: #000000, $alpha: 0.4); |
||||||
|
$uni-border-color: #EDEDED; |
||||||
|
$uni-text-color: #333; |
||||||
|
$uni-bg-color-hover:#f1f1f1; |
||||||
|
$uni-font-size-base:14px; |
||||||
|
$uni-text-color-placeholder: #808080; |
||||||
|
$uni-color-subtitle: #555555; |
||||||
|
$uni-text-color-grey:#999; |
||||||
|
.uni-calendar { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: column; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__mask { |
||||||
|
position: fixed; |
||||||
|
bottom: 0; |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
right: 0; |
||||||
|
background-color: $uni-bg-color-mask; |
||||||
|
transition-property: opacity; |
||||||
|
transition-duration: 0.3s; |
||||||
|
opacity: 0; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
z-index: 99; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar--mask-show { |
||||||
|
opacity: 1 |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar--fixed { |
||||||
|
position: fixed; |
||||||
|
/* #ifdef APP-NVUE */ |
||||||
|
bottom: 0; |
||||||
|
/* #endif */ |
||||||
|
left: 0; |
||||||
|
right: 0; |
||||||
|
transition-property: transform; |
||||||
|
transition-duration: 0.3s; |
||||||
|
transform: translateY(460px); |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
bottom: calc(var(--window-bottom)); |
||||||
|
z-index: 99; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar--ani-show { |
||||||
|
transform: translateY(0); |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__content { |
||||||
|
background-color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__header { |
||||||
|
position: relative; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: row; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
height: 50px; |
||||||
|
border-bottom-color: $uni-border-color; |
||||||
|
border-bottom-style: solid; |
||||||
|
border-bottom-width: 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar--fixed-top { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: row; |
||||||
|
justify-content: space-between; |
||||||
|
border-top-color: $uni-border-color; |
||||||
|
border-top-style: solid; |
||||||
|
border-top-width: 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar--fixed-width { |
||||||
|
width: 50px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__backtoday { |
||||||
|
position: absolute; |
||||||
|
right: 0; |
||||||
|
top: 25rpx; |
||||||
|
padding: 0 5px; |
||||||
|
padding-left: 10px; |
||||||
|
height: 25px; |
||||||
|
line-height: 25px; |
||||||
|
font-size: 12px; |
||||||
|
border-top-left-radius: 25px; |
||||||
|
border-bottom-left-radius: 25px; |
||||||
|
color: $uni-text-color; |
||||||
|
background-color: $uni-bg-color-hover; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__header-text { |
||||||
|
text-align: center; |
||||||
|
width: 100px; |
||||||
|
font-size: $uni-font-size-base; |
||||||
|
color: $uni-text-color; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__header-btn-box { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
width: 50px; |
||||||
|
height: 50px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__header-btn { |
||||||
|
width: 10px; |
||||||
|
height: 10px; |
||||||
|
border-left-color: $uni-text-color-placeholder; |
||||||
|
border-left-style: solid; |
||||||
|
border-left-width: 2px; |
||||||
|
border-top-color: $uni-color-subtitle; |
||||||
|
border-top-style: solid; |
||||||
|
border-top-width: 2px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar--left { |
||||||
|
transform: rotate(-45deg); |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar--right { |
||||||
|
transform: rotate(135deg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
.uni-calendar__weeks { |
||||||
|
position: relative; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: row; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__weeks-item { |
||||||
|
flex: 1; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__weeks-day { |
||||||
|
flex: 1; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: column; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
height: 45px; |
||||||
|
border-bottom-color: #F5F5F5; |
||||||
|
border-bottom-style: solid; |
||||||
|
border-bottom-width: 1px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__weeks-day-text { |
||||||
|
font-size: 14px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__box { |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__box-bg { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
right: 0; |
||||||
|
bottom: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-calendar__box-bg-text { |
||||||
|
font-size: 200px; |
||||||
|
font-weight: bold; |
||||||
|
color: $uni-text-color-grey; |
||||||
|
opacity: 0.1; |
||||||
|
text-align: center; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
line-height: 1; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,360 @@ |
|||||||
|
import CALENDAR from './calendar.js' |
||||||
|
|
||||||
|
class Calendar { |
||||||
|
constructor({ |
||||||
|
date, |
||||||
|
selected, |
||||||
|
startDate, |
||||||
|
endDate, |
||||||
|
range |
||||||
|
} = {}) { |
||||||
|
// 当前日期
|
||||||
|
this.date = this.getDate(new Date()) // 当前初入日期
|
||||||
|
// 打点信息
|
||||||
|
this.selected = selected || []; |
||||||
|
// 范围开始
|
||||||
|
this.startDate = startDate |
||||||
|
// 范围结束
|
||||||
|
this.endDate = endDate |
||||||
|
this.range = range |
||||||
|
// 多选状态
|
||||||
|
this.cleanMultipleStatus() |
||||||
|
// 每周日期
|
||||||
|
this.weeks = {} |
||||||
|
// this._getWeek(this.date.fullDate)
|
||||||
|
} |
||||||
|
/** |
||||||
|
* 设置日期 |
||||||
|
* @param {Object} date |
||||||
|
*/ |
||||||
|
setDate(date) { |
||||||
|
this.selectDate = this.getDate(date) |
||||||
|
this._getWeek(this.selectDate.fullDate) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 清理多选状态 |
||||||
|
*/ |
||||||
|
cleanMultipleStatus() { |
||||||
|
this.multipleStatus = { |
||||||
|
before: '', |
||||||
|
after: '', |
||||||
|
data: [] |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 重置开始日期 |
||||||
|
*/ |
||||||
|
resetSatrtDate(startDate) { |
||||||
|
// 范围开始
|
||||||
|
this.startDate = startDate |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 重置结束日期 |
||||||
|
*/ |
||||||
|
resetEndDate(endDate) { |
||||||
|
// 范围结束
|
||||||
|
this.endDate = endDate |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取任意时间 |
||||||
|
*/ |
||||||
|
getDate(date, AddDayCount = 0, str = 'day') { |
||||||
|
if (!date) { |
||||||
|
date = new Date() |
||||||
|
} |
||||||
|
if (typeof date !== 'object') { |
||||||
|
date = date.replace(/-/g, '/') |
||||||
|
} |
||||||
|
const dd = new Date(date) |
||||||
|
switch (str) { |
||||||
|
case 'day': |
||||||
|
dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
|
||||||
|
break |
||||||
|
case 'month': |
||||||
|
if (dd.getDate() === 31 && AddDayCount>0) { |
||||||
|
dd.setDate(dd.getDate() + AddDayCount) |
||||||
|
} else { |
||||||
|
const preMonth = dd.getMonth() |
||||||
|
dd.setMonth(preMonth + AddDayCount) // 获取AddDayCount天后的日期
|
||||||
|
const nextMonth = dd.getMonth() |
||||||
|
// 处理 pre 切换月份目标月份为2月没有当前日(30 31) 切换错误问题
|
||||||
|
if(AddDayCount<0 && preMonth!==0 && nextMonth-preMonth>AddDayCount){ |
||||||
|
dd.setMonth(nextMonth+(nextMonth-preMonth+AddDayCount)) |
||||||
|
} |
||||||
|
// 处理 next 切换月份目标月份为2月没有当前日(30 31) 切换错误问题
|
||||||
|
if(AddDayCount>0 && nextMonth-preMonth>AddDayCount){ |
||||||
|
dd.setMonth(nextMonth-(nextMonth-preMonth-AddDayCount)) |
||||||
|
} |
||||||
|
} |
||||||
|
break |
||||||
|
case 'year': |
||||||
|
dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
|
||||||
|
break |
||||||
|
} |
||||||
|
const y = dd.getFullYear() |
||||||
|
const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
|
||||||
|
const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
|
||||||
|
return { |
||||||
|
fullDate: y + '-' + m + '-' + d, |
||||||
|
year: y, |
||||||
|
month: m, |
||||||
|
date: d, |
||||||
|
day: dd.getDay() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取上月剩余天数 |
||||||
|
*/ |
||||||
|
_getLastMonthDays(firstDay, full) { |
||||||
|
let dateArr = [] |
||||||
|
for (let i = firstDay; i > 0; i--) { |
||||||
|
const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() |
||||||
|
dateArr.push({ |
||||||
|
date: beforeDate, |
||||||
|
month: full.month - 1, |
||||||
|
lunar: this.getlunar(full.year, full.month - 1, beforeDate), |
||||||
|
disable: true |
||||||
|
}) |
||||||
|
} |
||||||
|
return dateArr |
||||||
|
} |
||||||
|
/** |
||||||
|
* 获取本月天数 |
||||||
|
*/ |
||||||
|
_currentMonthDys(dateData, full) { |
||||||
|
let dateArr = [] |
||||||
|
let fullDate = this.date.fullDate |
||||||
|
for (let i = 1; i <= dateData; i++) { |
||||||
|
let nowDate = full.year + '-' + (full.month < 10 ? |
||||||
|
full.month : full.month) + '-' + (i < 10 ? |
||||||
|
'0' + i : i) |
||||||
|
// 是否今天
|
||||||
|
let isDay = fullDate === nowDate |
||||||
|
// 获取打点信息
|
||||||
|
let info = this.selected && this.selected.find((item) => { |
||||||
|
if (this.dateEqual(nowDate, item.date)) { |
||||||
|
return item |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
// 日期禁用
|
||||||
|
let disableBefore = true |
||||||
|
let disableAfter = true |
||||||
|
if (this.startDate) { |
||||||
|
// let dateCompBefore = this.dateCompare(this.startDate, fullDate)
|
||||||
|
// disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
|
||||||
|
disableBefore = this.dateCompare(this.startDate, nowDate) |
||||||
|
} |
||||||
|
|
||||||
|
if (this.endDate) { |
||||||
|
// let dateCompAfter = this.dateCompare(fullDate, this.endDate)
|
||||||
|
// disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
|
||||||
|
disableAfter = this.dateCompare(nowDate, this.endDate) |
||||||
|
} |
||||||
|
let multiples = this.multipleStatus.data |
||||||
|
let checked = false |
||||||
|
let multiplesStatus = -1 |
||||||
|
if (this.range) { |
||||||
|
if (multiples) { |
||||||
|
multiplesStatus = multiples.findIndex((item) => { |
||||||
|
return this.dateEqual(item, nowDate) |
||||||
|
}) |
||||||
|
} |
||||||
|
if (multiplesStatus !== -1) { |
||||||
|
checked = true |
||||||
|
} |
||||||
|
} |
||||||
|
let data = { |
||||||
|
fullDate: nowDate, |
||||||
|
year: full.year, |
||||||
|
date: i, |
||||||
|
multiple: this.range ? checked : false, |
||||||
|
beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate), |
||||||
|
afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate), |
||||||
|
month: full.month, |
||||||
|
lunar: this.getlunar(full.year, full.month, i), |
||||||
|
disable: !(disableBefore && disableAfter), |
||||||
|
isDay |
||||||
|
} |
||||||
|
if (info) { |
||||||
|
data.extraInfo = info |
||||||
|
} |
||||||
|
|
||||||
|
dateArr.push(data) |
||||||
|
} |
||||||
|
return dateArr |
||||||
|
} |
||||||
|
/** |
||||||
|
* 获取下月天数 |
||||||
|
*/ |
||||||
|
_getNextMonthDays(surplus, full) { |
||||||
|
let dateArr = [] |
||||||
|
for (let i = 1; i < surplus + 1; i++) { |
||||||
|
dateArr.push({ |
||||||
|
date: i, |
||||||
|
month: Number(full.month) + 1, |
||||||
|
lunar: this.getlunar(full.year, Number(full.month) + 1, i), |
||||||
|
disable: true |
||||||
|
}) |
||||||
|
} |
||||||
|
return dateArr |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取当前日期详情 |
||||||
|
* @param {Object} date |
||||||
|
*/ |
||||||
|
getInfo(date) { |
||||||
|
if (!date) { |
||||||
|
date = new Date() |
||||||
|
} |
||||||
|
const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) |
||||||
|
return dateInfo |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 比较时间大小 |
||||||
|
*/ |
||||||
|
dateCompare(startDate, endDate) { |
||||||
|
// 计算截止时间
|
||||||
|
startDate = new Date(startDate.replace('-', '/').replace('-', '/')) |
||||||
|
// 计算详细项的截止时间
|
||||||
|
endDate = new Date(endDate.replace('-', '/').replace('-', '/')) |
||||||
|
if (startDate <= endDate) { |
||||||
|
return true |
||||||
|
} else { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 比较时间是否相等 |
||||||
|
*/ |
||||||
|
dateEqual(before, after) { |
||||||
|
// 计算截止时间
|
||||||
|
before = new Date(before.replace('-', '/').replace('-', '/')) |
||||||
|
// 计算详细项的截止时间
|
||||||
|
after = new Date(after.replace('-', '/').replace('-', '/')) |
||||||
|
if (before.getTime() - after.getTime() === 0) { |
||||||
|
return true |
||||||
|
} else { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取日期范围内所有日期 |
||||||
|
* @param {Object} begin |
||||||
|
* @param {Object} end |
||||||
|
*/ |
||||||
|
geDateAll(begin, end) { |
||||||
|
var arr = [] |
||||||
|
var ab = begin.split('-') |
||||||
|
var ae = end.split('-') |
||||||
|
var db = new Date() |
||||||
|
db.setFullYear(ab[0], ab[1] - 1, ab[2]) |
||||||
|
var de = new Date() |
||||||
|
de.setFullYear(ae[0], ae[1] - 1, ae[2]) |
||||||
|
var unixDb = db.getTime() - 24 * 60 * 60 * 1000 |
||||||
|
var unixDe = de.getTime() - 24 * 60 * 60 * 1000 |
||||||
|
for (var k = unixDb; k <= unixDe;) { |
||||||
|
k = k + 24 * 60 * 60 * 1000 |
||||||
|
arr.push(this.getDate(new Date(parseInt(k))).fullDate) |
||||||
|
} |
||||||
|
return arr |
||||||
|
} |
||||||
|
/** |
||||||
|
* 计算阴历日期显示 |
||||||
|
*/ |
||||||
|
getlunar(year, month, date) { |
||||||
|
return CALENDAR.solar2lunar(year, month, date) |
||||||
|
} |
||||||
|
/** |
||||||
|
* 设置打点 |
||||||
|
*/ |
||||||
|
setSelectInfo(data, value) { |
||||||
|
this.selected = value |
||||||
|
this._getWeek(data) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取多选状态 |
||||||
|
*/ |
||||||
|
setMultiple(fullDate) { |
||||||
|
let { |
||||||
|
before, |
||||||
|
after |
||||||
|
} = this.multipleStatus |
||||||
|
|
||||||
|
if (!this.range) return |
||||||
|
if (before && after) { |
||||||
|
this.multipleStatus.before = '' |
||||||
|
this.multipleStatus.after = '' |
||||||
|
this.multipleStatus.data = [] |
||||||
|
} else { |
||||||
|
if (!before) { |
||||||
|
this.multipleStatus.before = fullDate |
||||||
|
} else { |
||||||
|
this.multipleStatus.after = fullDate |
||||||
|
if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { |
||||||
|
this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); |
||||||
|
} else { |
||||||
|
this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
this._getWeek(fullDate) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取每周数据 |
||||||
|
* @param {Object} dateData |
||||||
|
*/ |
||||||
|
_getWeek(dateData) { |
||||||
|
const { |
||||||
|
year, |
||||||
|
month |
||||||
|
} = this.getDate(dateData) |
||||||
|
let firstDay = new Date(year, month - 1, 1).getDay() |
||||||
|
let currentDay = new Date(year, month, 0).getDate() |
||||||
|
let dates = { |
||||||
|
lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
|
||||||
|
currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
|
||||||
|
nextMonthDays: [], // 下个月开始几天
|
||||||
|
weeks: [] |
||||||
|
} |
||||||
|
let canlender = [] |
||||||
|
const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) |
||||||
|
dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) |
||||||
|
canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) |
||||||
|
let weeks = {} |
||||||
|
// 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天
|
||||||
|
for (let i = 0; i < canlender.length; i++) { |
||||||
|
if (i % 7 === 0) { |
||||||
|
weeks[parseInt(i / 7)] = new Array(7) |
||||||
|
} |
||||||
|
weeks[parseInt(i / 7)][i % 7] = canlender[i] |
||||||
|
} |
||||||
|
this.canlender = canlender |
||||||
|
this.weeks = weeks |
||||||
|
} |
||||||
|
|
||||||
|
//静态方法
|
||||||
|
// static init(date) {
|
||||||
|
// if (!this.instance) {
|
||||||
|
// this.instance = new Calendar(date);
|
||||||
|
// }
|
||||||
|
// return this.instance;
|
||||||
|
// }
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
export default Calendar |
||||||
@ -0,0 +1,85 @@ |
|||||||
|
{ |
||||||
|
"id": "uni-calendar", |
||||||
|
"displayName": "uni-calendar 日历", |
||||||
|
"version": "1.4.10", |
||||||
|
"description": "日历组件", |
||||||
|
"keywords": [ |
||||||
|
"uni-ui", |
||||||
|
"uniui", |
||||||
|
"日历", |
||||||
|
"", |
||||||
|
"打卡", |
||||||
|
"日历选择" |
||||||
|
], |
||||||
|
"repository": "https://github.com/dcloudio/uni-ui", |
||||||
|
"engines": { |
||||||
|
"HBuilderX": "" |
||||||
|
}, |
||||||
|
"directories": { |
||||||
|
"example": "../../temps/example_temps" |
||||||
|
}, |
||||||
|
"dcloudext": { |
||||||
|
"sale": { |
||||||
|
"regular": { |
||||||
|
"price": "0.00" |
||||||
|
}, |
||||||
|
"sourcecode": { |
||||||
|
"price": "0.00" |
||||||
|
} |
||||||
|
}, |
||||||
|
"contact": { |
||||||
|
"qq": "" |
||||||
|
}, |
||||||
|
"declaration": { |
||||||
|
"ads": "无", |
||||||
|
"data": "无", |
||||||
|
"permissions": "无" |
||||||
|
}, |
||||||
|
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", |
||||||
|
"type": "component-vue" |
||||||
|
}, |
||||||
|
"uni_modules": { |
||||||
|
"dependencies": [], |
||||||
|
"encrypt": [], |
||||||
|
"platforms": { |
||||||
|
"cloud": { |
||||||
|
"tcb": "y", |
||||||
|
"aliyun": "y" |
||||||
|
}, |
||||||
|
"client": { |
||||||
|
"App": { |
||||||
|
"app-vue": "y", |
||||||
|
"app-nvue": "y" |
||||||
|
}, |
||||||
|
"H5-mobile": { |
||||||
|
"Safari": "y", |
||||||
|
"Android Browser": "y", |
||||||
|
"微信浏览器(Android)": "y", |
||||||
|
"QQ浏览器(Android)": "y" |
||||||
|
}, |
||||||
|
"H5-pc": { |
||||||
|
"Chrome": "y", |
||||||
|
"IE": "y", |
||||||
|
"Edge": "y", |
||||||
|
"Firefox": "y", |
||||||
|
"Safari": "y" |
||||||
|
}, |
||||||
|
"小程序": { |
||||||
|
"微信": "y", |
||||||
|
"阿里": "y", |
||||||
|
"百度": "y", |
||||||
|
"字节跳动": "y", |
||||||
|
"QQ": "y" |
||||||
|
}, |
||||||
|
"快应用": { |
||||||
|
"华为": "u", |
||||||
|
"联盟": "u" |
||||||
|
}, |
||||||
|
"Vue": { |
||||||
|
"vue2": "y", |
||||||
|
"vue3": "y" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,103 @@ |
|||||||
|
|
||||||
|
|
||||||
|
## Calendar 日历 |
||||||
|
> **组件名:uni-calendar** |
||||||
|
> 代码块: `uCalendar` |
||||||
|
|
||||||
|
|
||||||
|
日历组件 |
||||||
|
|
||||||
|
> **注意事项** |
||||||
|
> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 |
||||||
|
> - 本组件农历转换使用的js是 [@1900-2100区间内的公历、农历互转](https://github.com/jjonline/calendar.js) |
||||||
|
> - 仅支持自定义组件模式 |
||||||
|
> - `date`属性传入的应该是一个 String ,如: 2019-06-27 ,而不是 new Date() |
||||||
|
> - 通过 `insert` 属性来确定当前的事件是 @change 还是 @confirm 。理应合并为一个事件,但是为了区分模式,现使用两个事件,这里需要注意 |
||||||
|
> - 弹窗模式下无法阻止后面的元素滚动,如有需要阻止,请在弹窗弹出后,手动设置滚动元素为不可滚动 |
||||||
|
|
||||||
|
|
||||||
|
### 安装方式 |
||||||
|
|
||||||
|
本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 |
||||||
|
|
||||||
|
如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) |
||||||
|
|
||||||
|
### 基本用法 |
||||||
|
|
||||||
|
在 ``template`` 中使用组件 |
||||||
|
|
||||||
|
```html |
||||||
|
<view> |
||||||
|
<uni-calendar |
||||||
|
:insert="true" |
||||||
|
:lunar="true" |
||||||
|
:start-date="'2019-3-2'" |
||||||
|
:end-date="'2019-5-20'" |
||||||
|
@change="change" |
||||||
|
/> |
||||||
|
</view> |
||||||
|
``` |
||||||
|
|
||||||
|
### 通过方法打开日历 |
||||||
|
|
||||||
|
需要设置 `insert` 为 `false` |
||||||
|
|
||||||
|
```html |
||||||
|
<view> |
||||||
|
<uni-calendar |
||||||
|
ref="calendar" |
||||||
|
:insert="false" |
||||||
|
@confirm="confirm" |
||||||
|
/> |
||||||
|
<button @click="open">打开日历</button> |
||||||
|
</view> |
||||||
|
``` |
||||||
|
|
||||||
|
```javascript |
||||||
|
|
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return {}; |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
open(){ |
||||||
|
this.$refs.calendar.open(); |
||||||
|
}, |
||||||
|
confirm(e) { |
||||||
|
console.log(e); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
## API |
||||||
|
|
||||||
|
### Calendar Props |
||||||
|
|
||||||
|
| 属性名 | 类型 | 默认值| 说明 | |
||||||
|
| - | - | - | - | |
||||||
|
| date | String |- | 自定义当前时间,默认为今天 | |
||||||
|
| lunar | Boolean | false | 显示农历 | |
||||||
|
| startDate | String |- | 日期选择范围-开始日期 | |
||||||
|
| endDate | String |- | 日期选择范围-结束日期 | |
||||||
|
| range | Boolean | false | 范围选择 | |
||||||
|
| insert | Boolean | false | 插入模式,可选值,ture:插入模式;false:弹窗模式;默认为插入模式 | |
||||||
|
|clearDate |Boolean |true |弹窗模式是否清空上次选择内容 | |
||||||
|
| selected | Array |- | 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}] | |
||||||
|
|showMonth | Boolean | true | 是否显示月份为背景 | |
||||||
|
|
||||||
|
### Calendar Events |
||||||
|
|
||||||
|
| 事件名 | 说明 |返回值| |
||||||
|
| - | - | - | |
||||||
|
| open | 弹出日历组件,`insert :false` 时生效|- | |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 组件示例 |
||||||
|
|
||||||
|
点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar](https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar) |
||||||
@ -0,0 +1,26 @@ |
|||||||
|
## 1.3.1(2021-12-20) |
||||||
|
- 修复 在vue页面下略缩图显示不正常的bug |
||||||
|
## 1.3.0(2021-11-19) |
||||||
|
- 重构插槽的用法 ,header 替换为 title |
||||||
|
- 新增 actions 插槽 |
||||||
|
- 新增 cover 封面图属性和插槽 |
||||||
|
- 新增 padding 内容默认内边距离 |
||||||
|
- 新增 margin 卡片默认外边距离 |
||||||
|
- 新增 spacing 卡片默认内边距 |
||||||
|
- 新增 shadow 卡片阴影属性 |
||||||
|
- 取消 mode 属性,可使用组合插槽代替 |
||||||
|
- 取消 note 属性 ,使用actions插槽代替 |
||||||
|
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) |
||||||
|
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-card](https://uniapp.dcloud.io/component/uniui/uni-card) |
||||||
|
## 1.2.1(2021-07-30) |
||||||
|
- 优化 vue3下事件警告的问题 |
||||||
|
## 1.2.0(2021-07-13) |
||||||
|
- 组件兼容 vue3,如何创建vue3项目详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
||||||
|
## 1.1.8(2021-07-01) |
||||||
|
- 优化 图文卡片无图片加载时,提供占位图标 |
||||||
|
- 新增 header 插槽,自定义卡片头部( 图文卡片 mode="style" 时,不支持) |
||||||
|
- 修复 thumbnail 不存在仍然占位的 bug |
||||||
|
## 1.1.7(2021-05-12) |
||||||
|
- 新增 组件示例地址 |
||||||
|
## 1.1.6(2021-02-04) |
||||||
|
- 调整为uni_modules目录规范 |
||||||
@ -0,0 +1,272 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-card" :class="{ 'uni-card--full': isFull, 'uni-card--shadow': isShadow,'uni-card--border':border}" |
||||||
|
:style="{'margin':isFull?0:margin,'padding':spacing,'box-shadow':isShadow?shadow:''}"> |
||||||
|
<!-- 封面 --> |
||||||
|
<slot name="cover"> |
||||||
|
<view v-if="cover" class="uni-card__cover"> |
||||||
|
<image class="uni-card__cover-image" mode="widthFix" @click="onClick('cover')" :src="cover"></image> |
||||||
|
</view> |
||||||
|
</slot> |
||||||
|
<slot name="title"> |
||||||
|
<view v-if="title || extra" class="uni-card__header"> |
||||||
|
<!-- 卡片标题 --> |
||||||
|
<view class="uni-card__header-box" @click="onClick('title')"> |
||||||
|
<view v-if="thumbnail" class="uni-card__header-avatar"> |
||||||
|
<image class="uni-card__header-avatar-image" :src="thumbnail" mode="aspectFit" /> |
||||||
|
</view> |
||||||
|
<view class="uni-card__header-content"> |
||||||
|
<text class="uni-card__header-content-title uni-ellipsis">{{ title }}</text> |
||||||
|
<text v-if="title&&subTitle" |
||||||
|
class="uni-card__header-content-subtitle uni-ellipsis">{{ subTitle }}</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="uni-card__header-extra" @click="onClick('extra')"> |
||||||
|
<slot name="extra"> |
||||||
|
<text class="uni-card__header-extra-text">{{ extra }}</text> |
||||||
|
</slot> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</slot> |
||||||
|
<!-- 卡片内容 --> |
||||||
|
<view class="uni-card__content" :style="{padding:padding}" @click="onClick('content')"> |
||||||
|
<slot></slot> |
||||||
|
</view> |
||||||
|
<view class="uni-card__actions" @click="onClick('actions')"> |
||||||
|
<slot name="actions"></slot> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
/** |
||||||
|
* Card 卡片 |
||||||
|
* @description 卡片视图组件 |
||||||
|
* @tutorial https://ext.dcloud.net.cn/plugin?id=22 |
||||||
|
* @property {String} title 标题文字 |
||||||
|
* @property {String} subTitle 副标题 |
||||||
|
* @property {Number} padding 内容内边距 |
||||||
|
* @property {Number} margin 卡片外边距 |
||||||
|
* @property {Number} spacing 卡片内边距 |
||||||
|
* @property {String} extra 标题额外信息 |
||||||
|
* @property {String} cover 封面图(本地路径需要引入) |
||||||
|
* @property {String} thumbnail 标题左侧缩略图 |
||||||
|
* @property {Boolean} is-full = [true | false] 卡片内容是否通栏,为 true 时将去除padding值 |
||||||
|
* @property {Boolean} is-shadow = [true | false] 卡片内容是否开启阴影 |
||||||
|
* @property {String} shadow 卡片阴影 |
||||||
|
* @property {Boolean} border 卡片边框 |
||||||
|
* @event {Function} click 点击 Card 触发事件 |
||||||
|
*/ |
||||||
|
export default { |
||||||
|
name: 'UniCard', |
||||||
|
emits: ['click'], |
||||||
|
props: { |
||||||
|
title: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
subTitle: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
padding: { |
||||||
|
type: String, |
||||||
|
default: '10px' |
||||||
|
}, |
||||||
|
margin: { |
||||||
|
type: String, |
||||||
|
default: '15px' |
||||||
|
}, |
||||||
|
spacing: { |
||||||
|
type: String, |
||||||
|
default: '0 10px' |
||||||
|
}, |
||||||
|
extra: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
cover: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
thumbnail: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
isFull: { |
||||||
|
// 内容区域是否通栏 |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
isShadow: { |
||||||
|
// 是否开启阴影 |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
}, |
||||||
|
shadow: { |
||||||
|
type: String, |
||||||
|
default: '0px 0px 3px 1px rgba(0, 0, 0, 0.08)' |
||||||
|
}, |
||||||
|
border: { |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
onClick(type) { |
||||||
|
this.$emit('click', type) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss"> |
||||||
|
$uni-border-3: #EBEEF5 !default; |
||||||
|
$uni-shadow-base:0 0px 6px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; |
||||||
|
$uni-main-color: #3a3a3a !default; |
||||||
|
$uni-base-color: #6a6a6a !default; |
||||||
|
$uni-secondary-color: #909399 !default; |
||||||
|
$uni-spacing-sm: 8px !default; |
||||||
|
$uni-border-color:$uni-border-3; |
||||||
|
$uni-shadow: $uni-shadow-base; |
||||||
|
$uni-card-title: 15px; |
||||||
|
$uni-cart-title-color:$uni-main-color; |
||||||
|
$uni-card-subtitle: 12px; |
||||||
|
$uni-cart-subtitle-color:$uni-secondary-color; |
||||||
|
$uni-card-spacing: 10px; |
||||||
|
$uni-card-content-color: $uni-base-color; |
||||||
|
|
||||||
|
.uni-card { |
||||||
|
margin: $uni-card-spacing; |
||||||
|
padding: 0 $uni-spacing-sm; |
||||||
|
border-radius: 4px; |
||||||
|
overflow: hidden; |
||||||
|
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif; |
||||||
|
background-color: #fff; |
||||||
|
flex: 1; |
||||||
|
|
||||||
|
.uni-card__cover { |
||||||
|
position: relative; |
||||||
|
margin-top: $uni-card-spacing; |
||||||
|
flex-direction: row; |
||||||
|
overflow: hidden; |
||||||
|
border-radius: 4px; |
||||||
|
.uni-card__cover-image { |
||||||
|
flex: 1; |
||||||
|
// width: 100%; |
||||||
|
/* #ifndef APP-PLUS */ |
||||||
|
vertical-align: middle; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card__header { |
||||||
|
display: flex; |
||||||
|
border-bottom: 1px $uni-border-color solid; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
padding: $uni-card-spacing; |
||||||
|
overflow: hidden; |
||||||
|
|
||||||
|
.uni-card__header-box { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex: 1; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card__header-avatar { |
||||||
|
width: 40px; |
||||||
|
height: 40px; |
||||||
|
overflow: hidden; |
||||||
|
border-radius: 5px; |
||||||
|
margin-right: $uni-card-spacing; |
||||||
|
.uni-card__header-avatar-image { |
||||||
|
flex: 1; |
||||||
|
width: 40px; |
||||||
|
height: 40px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card__header-content { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: column; |
||||||
|
justify-content: center; |
||||||
|
flex: 1; |
||||||
|
// height: 40px; |
||||||
|
overflow: hidden; |
||||||
|
|
||||||
|
.uni-card__header-content-title { |
||||||
|
font-size: $uni-card-title; |
||||||
|
color: $uni-cart-title-color; |
||||||
|
// line-height: 22px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card__header-content-subtitle { |
||||||
|
font-size: $uni-card-subtitle; |
||||||
|
margin-top: 5px; |
||||||
|
color: $uni-cart-subtitle-color; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card__header-extra { |
||||||
|
line-height: 12px; |
||||||
|
|
||||||
|
.uni-card__header-extra-text { |
||||||
|
font-size: 12px; |
||||||
|
color: $uni-cart-subtitle-color; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card__content { |
||||||
|
padding: $uni-card-spacing; |
||||||
|
font-size: 14px; |
||||||
|
color: $uni-card-content-color; |
||||||
|
line-height: 22px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card__actions { |
||||||
|
font-size: 12px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card--border { |
||||||
|
border: 1px solid $uni-border-color; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card--shadow { |
||||||
|
position: relative; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
box-shadow: $uni-shadow; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
|
||||||
|
.uni-card--full { |
||||||
|
margin: 0; |
||||||
|
border-left-width: 0; |
||||||
|
border-left-width: 0; |
||||||
|
border-radius: 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
.uni-card--full:after { |
||||||
|
border-radius: 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* #endif */ |
||||||
|
.uni-ellipsis { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
overflow: hidden; |
||||||
|
white-space: nowrap; |
||||||
|
text-overflow: ellipsis; |
||||||
|
/* #endif */ |
||||||
|
/* #ifdef APP-NVUE */ |
||||||
|
lines: 1; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,90 @@ |
|||||||
|
{ |
||||||
|
"id": "uni-card", |
||||||
|
"displayName": "uni-card 卡片", |
||||||
|
"version": "1.3.1", |
||||||
|
"description": "Card 组件,提供常见的卡片样式。", |
||||||
|
"keywords": [ |
||||||
|
"uni-ui", |
||||||
|
"uniui", |
||||||
|
"card", |
||||||
|
"", |
||||||
|
"卡片" |
||||||
|
], |
||||||
|
"repository": "https://github.com/dcloudio/uni-ui", |
||||||
|
"engines": { |
||||||
|
"HBuilderX": "" |
||||||
|
}, |
||||||
|
"directories": { |
||||||
|
"example": "../../temps/example_temps" |
||||||
|
}, |
||||||
|
"dcloudext": { |
||||||
|
"category": [ |
||||||
|
"前端组件", |
||||||
|
"通用组件" |
||||||
|
], |
||||||
|
"sale": { |
||||||
|
"regular": { |
||||||
|
"price": "0.00" |
||||||
|
}, |
||||||
|
"sourcecode": { |
||||||
|
"price": "0.00" |
||||||
|
} |
||||||
|
}, |
||||||
|
"contact": { |
||||||
|
"qq": "" |
||||||
|
}, |
||||||
|
"declaration": { |
||||||
|
"ads": "无", |
||||||
|
"data": "无", |
||||||
|
"permissions": "无" |
||||||
|
}, |
||||||
|
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" |
||||||
|
}, |
||||||
|
"uni_modules": { |
||||||
|
"dependencies": [ |
||||||
|
"uni-icons", |
||||||
|
"uni-scss" |
||||||
|
], |
||||||
|
"encrypt": [], |
||||||
|
"platforms": { |
||||||
|
"cloud": { |
||||||
|
"tcb": "y", |
||||||
|
"aliyun": "y" |
||||||
|
}, |
||||||
|
"client": { |
||||||
|
"App": { |
||||||
|
"app-vue": "y", |
||||||
|
"app-nvue": "y" |
||||||
|
}, |
||||||
|
"H5-mobile": { |
||||||
|
"Safari": "y", |
||||||
|
"Android Browser": "y", |
||||||
|
"微信浏览器(Android)": "y", |
||||||
|
"QQ浏览器(Android)": "y" |
||||||
|
}, |
||||||
|
"H5-pc": { |
||||||
|
"Chrome": "y", |
||||||
|
"IE": "y", |
||||||
|
"Edge": "y", |
||||||
|
"Firefox": "y", |
||||||
|
"Safari": "y" |
||||||
|
}, |
||||||
|
"小程序": { |
||||||
|
"微信": "y", |
||||||
|
"阿里": "y", |
||||||
|
"百度": "y", |
||||||
|
"字节跳动": "y", |
||||||
|
"QQ": "y" |
||||||
|
}, |
||||||
|
"快应用": { |
||||||
|
"华为": "u", |
||||||
|
"联盟": "u" |
||||||
|
}, |
||||||
|
"Vue": { |
||||||
|
"vue2": "y", |
||||||
|
"vue3": "y" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
|
||||||
|
|
||||||
|
## Card 卡片 |
||||||
|
> **组件名:uni-card** |
||||||
|
> 代码块: `uCard` |
||||||
|
|
||||||
|
卡片视图组件。 |
||||||
|
|
||||||
|
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-card) |
||||||
|
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,36 @@ |
|||||||
|
## 1.4.3(2022-01-25) |
||||||
|
- 修复 初始化的时候 ,open 属性失效的bug |
||||||
|
## 1.4.2(2022-01-21) |
||||||
|
- 修复 微信小程序resize后组件收起的bug |
||||||
|
## 1.4.1(2021-11-22) |
||||||
|
- 修复 vue3中个别scss变量无法找到的问题 |
||||||
|
## 1.4.0(2021-11-19) |
||||||
|
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) |
||||||
|
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-collapse](https://uniapp.dcloud.io/component/uniui/uni-collapse) |
||||||
|
## 1.3.3(2021-08-17) |
||||||
|
- 优化 show-arrow 属性默认为true |
||||||
|
## 1.3.2(2021-08-17) |
||||||
|
- 新增 show-arrow 属性,控制是否显示右侧箭头 |
||||||
|
## 1.3.1(2021-07-30) |
||||||
|
- 优化 vue3下小程序事件警告的问题 |
||||||
|
## 1.3.0(2021-07-30) |
||||||
|
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
||||||
|
## 1.2.2(2021-07-21) |
||||||
|
- 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug |
||||||
|
## 1.2.1(2021-07-21) |
||||||
|
- 优化 组件示例 |
||||||
|
## 1.2.0(2021-07-21) |
||||||
|
- 新增 组件折叠动画 |
||||||
|
- 新增 value\v-model 属性 ,动态修改面板折叠状态 |
||||||
|
- 新增 title 插槽 ,可定义面板标题 |
||||||
|
- 新增 border 属性 ,显示隐藏面板内容分隔线 |
||||||
|
- 新增 title-border 属性 ,显示隐藏面板标题分隔线 |
||||||
|
- 修复 resize 方法失效的Bug |
||||||
|
- 修复 change 事件返回参数不正确的Bug |
||||||
|
- 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法 |
||||||
|
## 1.1.7(2021-05-12) |
||||||
|
- 新增 组件示例地址 |
||||||
|
## 1.1.6(2021-02-05) |
||||||
|
- 优化 组件引用关系,通过uni_modules引用组件 |
||||||
|
## 1.1.5(2021-02-05) |
||||||
|
- 调整为uni_modules目录规范 |
||||||
@ -0,0 +1,402 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-collapse-item"> |
||||||
|
<!-- onClick(!isOpen) --> |
||||||
|
<view @click="onClick(!isOpen)" class="uni-collapse-item__title" |
||||||
|
:class="{'is-open':isOpen &&titleBorder === 'auto' ,'uni-collapse-item-border':titleBorder !== 'none'}"> |
||||||
|
<view class="uni-collapse-item__title-wrap"> |
||||||
|
<slot name="title"> |
||||||
|
<view class="uni-collapse-item__title-box" :class="{'is-disabled':disabled}"> |
||||||
|
<image v-if="thumb" :src="thumb" class="uni-collapse-item__title-img" /> |
||||||
|
<text class="uni-collapse-item__title-text">{{ title }}</text> |
||||||
|
</view> |
||||||
|
</slot> |
||||||
|
</view> |
||||||
|
<view v-if="showArrow" |
||||||
|
:class="{ 'uni-collapse-item__title-arrow-active': isOpen, 'uni-collapse-item--animation': showAnimation === true }" |
||||||
|
class="uni-collapse-item__title-arrow"> |
||||||
|
<uni-icons :color="disabled?'#ddd':'#bbb'" size="14" type="bottom" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="uni-collapse-item__wrap" :class="{'is--transition':showAnimation}" |
||||||
|
:style="{height: (isOpen?height:0) +'px'}"> |
||||||
|
<view :id="elId" ref="collapse--hook" class="uni-collapse-item__wrap-content" |
||||||
|
:class="{open:isheight,'uni-collapse-item--border':border&&isOpen}"> |
||||||
|
<slot></slot> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
|
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
// #ifdef APP-NVUE |
||||||
|
const dom = weex.requireModule('dom') |
||||||
|
// #endif |
||||||
|
/** |
||||||
|
* CollapseItem 折叠面板子组件 |
||||||
|
* @description 折叠面板子组件 |
||||||
|
* @property {String} title 标题文字 |
||||||
|
* @property {String} thumb 标题左侧缩略图 |
||||||
|
* @property {String} name 唯一标志符 |
||||||
|
* @property {Boolean} open = [true|false] 是否展开组件 |
||||||
|
* @property {Boolean} titleBorder = [true|false] 是否显示标题分隔线 |
||||||
|
* @property {Boolean} border = [true|false] 是否显示分隔线 |
||||||
|
* @property {Boolean} disabled = [true|false] 是否展开面板 |
||||||
|
* @property {Boolean} showAnimation = [true|false] 开启动画 |
||||||
|
* @property {Boolean} showArrow = [true|false] 是否显示右侧箭头 |
||||||
|
*/ |
||||||
|
export default { |
||||||
|
name: 'uniCollapseItem', |
||||||
|
props: { |
||||||
|
// 列表标题 |
||||||
|
title: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
name: { |
||||||
|
type: [Number, String], |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
// 是否禁用 |
||||||
|
disabled: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
// #ifdef APP-PLUS |
||||||
|
// 是否显示动画,app 端默认不开启动画,卡顿严重 |
||||||
|
showAnimation: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
// #endif |
||||||
|
// #ifndef APP-PLUS |
||||||
|
// 是否显示动画 |
||||||
|
showAnimation: { |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
}, |
||||||
|
// #endif |
||||||
|
// 是否展开 |
||||||
|
open: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
// 缩略图 |
||||||
|
thumb: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
// 标题分隔线显示类型 |
||||||
|
titleBorder: { |
||||||
|
type: String, |
||||||
|
default: 'auto' |
||||||
|
}, |
||||||
|
border: { |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
}, |
||||||
|
showArrow: { |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
} |
||||||
|
}, |
||||||
|
data() { |
||||||
|
// TODO 随机生生元素ID,解决百度小程序获取同一个元素位置信息的bug |
||||||
|
const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}` |
||||||
|
return { |
||||||
|
isOpen: false, |
||||||
|
isheight: null, |
||||||
|
height: 0, |
||||||
|
elId, |
||||||
|
nameSync: 0 |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
open(val) { |
||||||
|
this.isOpen = val |
||||||
|
this.onClick(val, 'init') |
||||||
|
} |
||||||
|
}, |
||||||
|
updated(e) { |
||||||
|
this.$nextTick(() => { |
||||||
|
this.init(true) |
||||||
|
}) |
||||||
|
}, |
||||||
|
created() { |
||||||
|
this.collapse = this.getCollapse() |
||||||
|
this.oldHeight = 0 |
||||||
|
this.onClick(this.open, 'init') |
||||||
|
}, |
||||||
|
// #ifndef VUE3 |
||||||
|
// TODO vue2 |
||||||
|
destroyed() { |
||||||
|
if (this.__isUnmounted) return |
||||||
|
this.uninstall() |
||||||
|
}, |
||||||
|
// #endif |
||||||
|
// #ifdef VUE3 |
||||||
|
// TODO vue3 |
||||||
|
unmounted() { |
||||||
|
this.__isUnmounted = true |
||||||
|
this.uninstall() |
||||||
|
}, |
||||||
|
// #endif |
||||||
|
mounted() { |
||||||
|
if (!this.collapse) return |
||||||
|
if (this.name !== '') { |
||||||
|
this.nameSync = this.name |
||||||
|
} else { |
||||||
|
this.nameSync = this.collapse.childrens.length + '' |
||||||
|
} |
||||||
|
if (this.collapse.names.indexOf(this.nameSync) === -1) { |
||||||
|
this.collapse.names.push(this.nameSync) |
||||||
|
} else { |
||||||
|
console.warn(`name 值 ${this.nameSync} 重复`); |
||||||
|
} |
||||||
|
if (this.collapse.childrens.indexOf(this) === -1) { |
||||||
|
this.collapse.childrens.push(this) |
||||||
|
} |
||||||
|
this.init() |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
init(type) { |
||||||
|
// #ifndef APP-NVUE |
||||||
|
this.getCollapseHeight(type) |
||||||
|
// #endif |
||||||
|
// #ifdef APP-NVUE |
||||||
|
this.getNvueHwight(type) |
||||||
|
// #endif |
||||||
|
}, |
||||||
|
uninstall() { |
||||||
|
if (this.collapse) { |
||||||
|
this.collapse.childrens.forEach((item, index) => { |
||||||
|
if (item === this) { |
||||||
|
this.collapse.childrens.splice(index, 1) |
||||||
|
} |
||||||
|
}) |
||||||
|
this.collapse.names.forEach((item, index) => { |
||||||
|
if (item === this.nameSync) { |
||||||
|
this.collapse.names.splice(index, 1) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
onClick(isOpen, type) { |
||||||
|
if (this.disabled) return |
||||||
|
this.isOpen = isOpen |
||||||
|
if (this.isOpen && this.collapse) { |
||||||
|
this.collapse.setAccordion(this) |
||||||
|
} |
||||||
|
if (type !== 'init') { |
||||||
|
this.collapse.onChange(isOpen, this) |
||||||
|
} |
||||||
|
}, |
||||||
|
getCollapseHeight(type, index = 0) { |
||||||
|
const views = uni.createSelectorQuery().in(this) |
||||||
|
views |
||||||
|
.select(`#${this.elId}`) |
||||||
|
.fields({ |
||||||
|
size: true |
||||||
|
}, data => { |
||||||
|
// TODO 百度中可能获取不到节点信息 ,需要循环获取 |
||||||
|
if (index >= 10) return |
||||||
|
if (!data) { |
||||||
|
index++ |
||||||
|
this.getCollapseHeight(false, index) |
||||||
|
return |
||||||
|
} |
||||||
|
// #ifdef APP-NVUE |
||||||
|
this.height = data.height + 1 |
||||||
|
// #endif |
||||||
|
// #ifndef APP-NVUE |
||||||
|
this.height = data.height |
||||||
|
// #endif |
||||||
|
this.isheight = true |
||||||
|
if (type) return |
||||||
|
this.onClick(this.isOpen, 'init') |
||||||
|
}) |
||||||
|
.exec() |
||||||
|
}, |
||||||
|
getNvueHwight(type) { |
||||||
|
const result = dom.getComponentRect(this.$refs['collapse--hook'], option => { |
||||||
|
if (option && option.result && option.size) { |
||||||
|
// #ifdef APP-NVUE |
||||||
|
this.height = option.size.height + 1 |
||||||
|
// #endif |
||||||
|
// #ifndef APP-NVUE |
||||||
|
this.height = option.size.height |
||||||
|
// #endif |
||||||
|
this.isheight = true |
||||||
|
if (type) return |
||||||
|
this.onClick(this.open, 'init') |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 获取父元素实例 |
||||||
|
*/ |
||||||
|
getCollapse(name = 'uniCollapse') { |
||||||
|
let parent = this.$parent; |
||||||
|
let parentName = parent.$options.name; |
||||||
|
while (parentName !== name) { |
||||||
|
parent = parent.$parent; |
||||||
|
if (!parent) return false; |
||||||
|
parentName = parent.$options.name; |
||||||
|
} |
||||||
|
return parent; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss"> |
||||||
|
.uni-collapse-item { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
box-sizing: border-box; |
||||||
|
|
||||||
|
/* #endif */ |
||||||
|
&__title { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
width: 100%; |
||||||
|
box-sizing: border-box; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
transition: border-bottom-color .3s; |
||||||
|
|
||||||
|
// transition-property: border-bottom-color; |
||||||
|
// transition-duration: 5s; |
||||||
|
&-wrap { |
||||||
|
width: 100%; |
||||||
|
flex: 1; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
&-box { |
||||||
|
padding: 0 15px; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
width: 100%; |
||||||
|
box-sizing: border-box; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: row; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
height: 48px; |
||||||
|
line-height: 48px; |
||||||
|
background-color: #fff; |
||||||
|
color: #303133; |
||||||
|
font-size: 13px; |
||||||
|
font-weight: 500; |
||||||
|
/* #ifdef H5 */ |
||||||
|
cursor: pointer; |
||||||
|
outline: none; |
||||||
|
|
||||||
|
/* #endif */ |
||||||
|
&.is-disabled { |
||||||
|
.uni-collapse-item__title-text { |
||||||
|
color: #999; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
&.uni-collapse-item-border { |
||||||
|
border-bottom: 1px solid #ebeef5; |
||||||
|
} |
||||||
|
|
||||||
|
&.is-open { |
||||||
|
border-bottom-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
&-img { |
||||||
|
height: 22px; |
||||||
|
width: 22px; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
&-text { |
||||||
|
flex: 1; |
||||||
|
font-size: 14px; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
white-space: nowrap; |
||||||
|
color: inherit; |
||||||
|
/* #endif */ |
||||||
|
/* #ifdef APP-NVUE */ |
||||||
|
lines: 1; |
||||||
|
/* #endif */ |
||||||
|
overflow: hidden; |
||||||
|
text-overflow: ellipsis; |
||||||
|
} |
||||||
|
|
||||||
|
&-arrow { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
box-sizing: border-box; |
||||||
|
/* #endif */ |
||||||
|
align-items: center; |
||||||
|
justify-content: center; |
||||||
|
width: 20px; |
||||||
|
height: 20px; |
||||||
|
margin-right: 10px; |
||||||
|
transform: rotate(0deg); |
||||||
|
|
||||||
|
&-active { |
||||||
|
transform: rotate(-180deg); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
&__wrap { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
will-change: height; |
||||||
|
box-sizing: border-box; |
||||||
|
/* #endif */ |
||||||
|
background-color: #fff; |
||||||
|
overflow: hidden; |
||||||
|
position: relative; |
||||||
|
height: 0; |
||||||
|
|
||||||
|
&.is--transition { |
||||||
|
// transition: all 0.3s; |
||||||
|
transition-property: height, border-bottom-width; |
||||||
|
transition-duration: 0.3s; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
will-change: height; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
&-content { |
||||||
|
position: absolute; |
||||||
|
font-size: 13px; |
||||||
|
color: #303133; |
||||||
|
// transition: height 0.3s; |
||||||
|
border-bottom-color: transparent; |
||||||
|
border-bottom-style: solid; |
||||||
|
border-bottom-width: 0; |
||||||
|
|
||||||
|
&.uni-collapse-item--border { |
||||||
|
border-bottom-width: 1px; |
||||||
|
border-bottom-color: red; |
||||||
|
border-bottom-color: #ebeef5; |
||||||
|
} |
||||||
|
|
||||||
|
&.open { |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&--animation { |
||||||
|
transition-property: transform; |
||||||
|
transition-duration: 0.3s; |
||||||
|
transition-timing-function: ease; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,147 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-collapse"> |
||||||
|
<slot /> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
/** |
||||||
|
* Collapse 折叠面板 |
||||||
|
* @description 展示可以折叠 / 展开的内容区域 |
||||||
|
* @tutorial https://ext.dcloud.net.cn/plugin?id=23 |
||||||
|
* @property {String|Array} value 当前激活面板改变时触发(如果是手风琴模式,参数类型为string,否则为array) |
||||||
|
* @property {Boolean} accordion = [true|false] 是否开启手风琴效果是否开启手风琴效果 |
||||||
|
* @event {Function} change 切换面板时触发,如果是手风琴模式,返回类型为string,否则为array |
||||||
|
*/ |
||||||
|
export default { |
||||||
|
name: 'uniCollapse', |
||||||
|
emits:['change','activeItem','input','update:modelValue'], |
||||||
|
props: { |
||||||
|
value: { |
||||||
|
type: [String, Array], |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
modelValue: { |
||||||
|
type: [String, Array], |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
accordion: { |
||||||
|
// 是否开启手风琴效果 |
||||||
|
type: [Boolean, String], |
||||||
|
default: false |
||||||
|
}, |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return {} |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
// TODO 兼容 vue2 和 vue3 |
||||||
|
dataValue() { |
||||||
|
let value = (typeof this.value === 'string' && this.value === '') || |
||||||
|
(Array.isArray(this.value) && this.value.length === 0) |
||||||
|
let modelValue = (typeof this.modelValue === 'string' && this.modelValue === '') || |
||||||
|
(Array.isArray(this.modelValue) && this.modelValue.length === 0) |
||||||
|
if (value) { |
||||||
|
return this.modelValue |
||||||
|
} |
||||||
|
if (modelValue) { |
||||||
|
return this.value |
||||||
|
} |
||||||
|
|
||||||
|
return this.value |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
dataValue(val) { |
||||||
|
this.setOpen(val) |
||||||
|
} |
||||||
|
}, |
||||||
|
created() { |
||||||
|
this.childrens = [] |
||||||
|
this.names = [] |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.$nextTick(()=>{ |
||||||
|
this.setOpen(this.dataValue) |
||||||
|
}) |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
setOpen(val) { |
||||||
|
let str = typeof val === 'string' |
||||||
|
let arr = Array.isArray(val) |
||||||
|
this.childrens.forEach((vm, index) => { |
||||||
|
if (str) { |
||||||
|
if (val === vm.nameSync) { |
||||||
|
if (!this.accordion) { |
||||||
|
console.warn('accordion 属性为 false ,v-model 类型应该为 array') |
||||||
|
return |
||||||
|
} |
||||||
|
vm.isOpen = true |
||||||
|
} |
||||||
|
} |
||||||
|
if (arr) { |
||||||
|
val.forEach(v => { |
||||||
|
if (v === vm.nameSync) { |
||||||
|
if (this.accordion) { |
||||||
|
console.warn('accordion 属性为 true ,v-model 类型应该为 string') |
||||||
|
return |
||||||
|
} |
||||||
|
vm.isOpen = true |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
this.emit(val) |
||||||
|
}, |
||||||
|
setAccordion(self) { |
||||||
|
if (!this.accordion) return |
||||||
|
this.childrens.forEach((vm, index) => { |
||||||
|
if (self !== vm) { |
||||||
|
vm.isOpen = false |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
resize() { |
||||||
|
this.childrens.forEach((vm, index) => { |
||||||
|
// #ifndef APP-NVUE |
||||||
|
vm.getCollapseHeight() |
||||||
|
// #endif |
||||||
|
// #ifdef APP-NVUE |
||||||
|
vm.getNvueHwight() |
||||||
|
// #endif |
||||||
|
}) |
||||||
|
}, |
||||||
|
onChange(isOpen, self) { |
||||||
|
let activeItem = [] |
||||||
|
|
||||||
|
if (this.accordion) { |
||||||
|
activeItem = isOpen ? self.nameSync : '' |
||||||
|
} else { |
||||||
|
this.childrens.forEach((vm, index) => { |
||||||
|
if (vm.isOpen) { |
||||||
|
activeItem.push(vm.nameSync) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
this.$emit('change', activeItem) |
||||||
|
this.emit(activeItem) |
||||||
|
}, |
||||||
|
emit(val){ |
||||||
|
this.$emit('input', val) |
||||||
|
this.$emit('update:modelValue', val) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss" > |
||||||
|
.uni-collapse { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
width: 100%; |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
/* #ifdef APP-NVUE */ |
||||||
|
flex: 1; |
||||||
|
/* #endif */ |
||||||
|
flex-direction: column; |
||||||
|
background-color: #fff; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,89 @@ |
|||||||
|
{ |
||||||
|
"id": "uni-collapse", |
||||||
|
"displayName": "uni-collapse 折叠面板", |
||||||
|
"version": "1.4.3", |
||||||
|
"description": "Collapse 组件,可以折叠 / 展开的内容区域。", |
||||||
|
"keywords": [ |
||||||
|
"uni-ui", |
||||||
|
"折叠", |
||||||
|
"折叠面板", |
||||||
|
"手风琴" |
||||||
|
], |
||||||
|
"repository": "https://github.com/dcloudio/uni-ui", |
||||||
|
"engines": { |
||||||
|
"HBuilderX": "" |
||||||
|
}, |
||||||
|
"directories": { |
||||||
|
"example": "../../temps/example_temps" |
||||||
|
}, |
||||||
|
"dcloudext": { |
||||||
|
"category": [ |
||||||
|
"前端组件", |
||||||
|
"通用组件" |
||||||
|
], |
||||||
|
"sale": { |
||||||
|
"regular": { |
||||||
|
"price": "0.00" |
||||||
|
}, |
||||||
|
"sourcecode": { |
||||||
|
"price": "0.00" |
||||||
|
} |
||||||
|
}, |
||||||
|
"contact": { |
||||||
|
"qq": "" |
||||||
|
}, |
||||||
|
"declaration": { |
||||||
|
"ads": "无", |
||||||
|
"data": "无", |
||||||
|
"permissions": "无" |
||||||
|
}, |
||||||
|
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" |
||||||
|
}, |
||||||
|
"uni_modules": { |
||||||
|
"dependencies": [ |
||||||
|
"uni-scss", |
||||||
|
"uni-icons" |
||||||
|
], |
||||||
|
"encrypt": [], |
||||||
|
"platforms": { |
||||||
|
"cloud": { |
||||||
|
"tcb": "y", |
||||||
|
"aliyun": "y" |
||||||
|
}, |
||||||
|
"client": { |
||||||
|
"App": { |
||||||
|
"app-vue": "y", |
||||||
|
"app-nvue": "y" |
||||||
|
}, |
||||||
|
"H5-mobile": { |
||||||
|
"Safari": "y", |
||||||
|
"Android Browser": "y", |
||||||
|
"微信浏览器(Android)": "y", |
||||||
|
"QQ浏览器(Android)": "y" |
||||||
|
}, |
||||||
|
"H5-pc": { |
||||||
|
"Chrome": "y", |
||||||
|
"IE": "y", |
||||||
|
"Edge": "y", |
||||||
|
"Firefox": "y", |
||||||
|
"Safari": "y" |
||||||
|
}, |
||||||
|
"小程序": { |
||||||
|
"微信": "y", |
||||||
|
"阿里": "y", |
||||||
|
"百度": "y", |
||||||
|
"字节跳动": "y", |
||||||
|
"QQ": "y" |
||||||
|
}, |
||||||
|
"快应用": { |
||||||
|
"华为": "u", |
||||||
|
"联盟": "u" |
||||||
|
}, |
||||||
|
"Vue": { |
||||||
|
"vue2": "y", |
||||||
|
"vue3": "y" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
|
||||||
|
|
||||||
|
## Collapse 折叠面板 |
||||||
|
> **组件名:uni-collapse** |
||||||
|
> 代码块: `uCollapse` |
||||||
|
> 关联组件:`uni-collapse-item`、`uni-icons`。 |
||||||
|
|
||||||
|
|
||||||
|
折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。 |
||||||
|
|
||||||
|
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-collapse) |
||||||
|
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
||||||
@ -0,0 +1,15 @@ |
|||||||
|
## 1.0.1(2021-11-23) |
||||||
|
- 优化 label、label-width 属性 |
||||||
|
## 1.0.0(2021-11-19) |
||||||
|
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) |
||||||
|
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-combox](https://uniapp.dcloud.io/component/uniui/uni-combox) |
||||||
|
## 0.1.0(2021-07-30) |
||||||
|
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
||||||
|
## 0.0.6(2021-05-12) |
||||||
|
- 新增 组件示例地址 |
||||||
|
## 0.0.5(2021-04-21) |
||||||
|
- 优化 添加依赖 uni-icons, 导入后自动下载依赖 |
||||||
|
## 0.0.4(2021-02-05) |
||||||
|
- 优化 组件引用关系,通过uni_modules引用组件 |
||||||
|
## 0.0.3(2021-02-04) |
||||||
|
- 调整为uni_modules目录规范 |
||||||
@ -0,0 +1,294 @@ |
|||||||
|
<template> |
||||||
|
<view class="uni-combox" :class="border ? '' : 'uni-combox__no-border'"> |
||||||
|
<view v-if="label" class="uni-combox__label" :style="labelStyle"> |
||||||
|
<text>{{label}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-combox__input-box"> |
||||||
|
<input class="uni-combox__input" type="text" :placeholder="placeholder" |
||||||
|
placeholder-class="uni-combox__input-plac" v-model="inputVal" @input="onInput" @focus="onFocus" @blur="onBlur" /> |
||||||
|
<uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" @click="toggleSelector"> |
||||||
|
</uni-icons> |
||||||
|
</view> |
||||||
|
<view class="uni-combox__selector" v-if="showSelector"> |
||||||
|
<view class="uni-popper__arrow"></view> |
||||||
|
<scroll-view scroll-y="true" class="uni-combox__selector-scroll" @scroll="onScroll"> |
||||||
|
<view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0"> |
||||||
|
<text>{{emptyTips}}</text> |
||||||
|
</view> |
||||||
|
<view class="uni-combox__selector-item" v-for="(item,index) in filterCandidates" :key="index" @click="onSelectorClick(index)"> |
||||||
|
<text>{{item}}</text> |
||||||
|
</view> |
||||||
|
</scroll-view> |
||||||
|
</view> |
||||||
|
<!-- 新增蒙层,点击蒙层时关闭选项显示 --> |
||||||
|
<view class="uni-combox__mask" v-show="showSelector" @click="showSelector = false"></view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
/** |
||||||
|
* Combox 组合输入框 |
||||||
|
* @description 组合输入框一般用于既可以输入也可以选择的场景 |
||||||
|
* @tutorial https://ext.dcloud.net.cn/plugin?id=1261 |
||||||
|
* @property {String} label 左侧文字 |
||||||
|
* @property {String} labelWidth 左侧内容宽度 |
||||||
|
* @property {String} placeholder 输入框占位符 |
||||||
|
* @property {Array} candidates 候选项列表 |
||||||
|
* @property {String} emptyTips 筛选结果为空时显示的文字 |
||||||
|
* @property {String} value 组合框的值 |
||||||
|
*/ |
||||||
|
export default { |
||||||
|
name: 'uniCombox', |
||||||
|
emits: ['input', 'update:modelValue'], |
||||||
|
props: { |
||||||
|
border: { |
||||||
|
type: Boolean, |
||||||
|
default: true |
||||||
|
}, |
||||||
|
label: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
labelWidth: { |
||||||
|
type: String, |
||||||
|
default: 'auto' |
||||||
|
}, |
||||||
|
placeholder: { |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
candidates: { |
||||||
|
type: Array, |
||||||
|
default () { |
||||||
|
return [] |
||||||
|
} |
||||||
|
}, |
||||||
|
emptyTips: { |
||||||
|
type: String, |
||||||
|
default: '无匹配项' |
||||||
|
}, |
||||||
|
// #ifndef VUE3 |
||||||
|
value: { |
||||||
|
type: [String, Number], |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
// #endif |
||||||
|
// #ifdef VUE3 |
||||||
|
modelValue: { |
||||||
|
type: [String, Number], |
||||||
|
default: '' |
||||||
|
}, |
||||||
|
// #endif |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
showSelector: false, |
||||||
|
inputVal: '', |
||||||
|
blurTimer:null, |
||||||
|
} |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
labelStyle() { |
||||||
|
if (this.labelWidth === 'auto') { |
||||||
|
return "" |
||||||
|
} |
||||||
|
return `width: ${this.labelWidth}` |
||||||
|
}, |
||||||
|
filterCandidates() { |
||||||
|
if (this.inputVal !== 0 && !this.inputVal) { |
||||||
|
return this.candidates |
||||||
|
} |
||||||
|
return this.candidates.filter((item) => { |
||||||
|
return item.toString().indexOf(this.inputVal) > -1 |
||||||
|
}) |
||||||
|
}, |
||||||
|
filterCandidatesLength() { |
||||||
|
return this.filterCandidates.length |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
// #ifndef VUE3 |
||||||
|
value: { |
||||||
|
handler(newVal) { |
||||||
|
this.inputVal = newVal |
||||||
|
}, |
||||||
|
immediate: true |
||||||
|
}, |
||||||
|
// #endif |
||||||
|
// #ifdef VUE3 |
||||||
|
modelValue: { |
||||||
|
handler(newVal) { |
||||||
|
this.inputVal = newVal |
||||||
|
}, |
||||||
|
immediate: true |
||||||
|
}, |
||||||
|
// #endif |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
toggleSelector() { |
||||||
|
this.showSelector = !this.showSelector |
||||||
|
}, |
||||||
|
onFocus() { |
||||||
|
this.showSelector = true |
||||||
|
}, |
||||||
|
onBlur() { |
||||||
|
this.blurTimer = setTimeout(() => { |
||||||
|
this.showSelector = false |
||||||
|
}, 153) |
||||||
|
}, |
||||||
|
onScroll(){ // 滚动时将blur的定时器关掉 |
||||||
|
if(this.blurTimer) { |
||||||
|
clearTimeout(this.blurTimer) |
||||||
|
this.blurTimer = null |
||||||
|
} |
||||||
|
}, |
||||||
|
onSelectorClick(index) { |
||||||
|
this.inputVal = this.filterCandidates[index] |
||||||
|
this.showSelector = false |
||||||
|
this.$emit('input', this.inputVal) |
||||||
|
this.$emit('update:modelValue', this.inputVal) |
||||||
|
}, |
||||||
|
onInput() { |
||||||
|
setTimeout(() => { |
||||||
|
this.$emit('input', this.inputVal) |
||||||
|
this.$emit('update:modelValue', this.inputVal) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss"> |
||||||
|
.uni-combox { |
||||||
|
font-size: 14px; |
||||||
|
border: 1px solid #DCDFE6; |
||||||
|
border-radius: 4px; |
||||||
|
padding: 6px 10px; |
||||||
|
position: relative; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
// height: 40px; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
// border-bottom: solid 1px #DDDDDD; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__label { |
||||||
|
font-size: 16px; |
||||||
|
line-height: 22px; |
||||||
|
padding-right: 10px; |
||||||
|
color: #999999; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__input-box { |
||||||
|
position: relative; |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
/* #endif */ |
||||||
|
flex: 1; |
||||||
|
flex-direction: row; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__input { |
||||||
|
flex: 1; |
||||||
|
font-size: 14px; |
||||||
|
height: 22px; |
||||||
|
line-height: 22px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__input-plac { |
||||||
|
font-size: 14px; |
||||||
|
color: #999; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__selector { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
box-sizing: border-box; |
||||||
|
/* #endif */ |
||||||
|
position: absolute; |
||||||
|
top: calc(100% + 12px); |
||||||
|
left: 0; |
||||||
|
width: 100%; |
||||||
|
background-color: #FFFFFF; |
||||||
|
border: 1px solid #EBEEF5; |
||||||
|
border-radius: 6px; |
||||||
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
||||||
|
z-index: 3; |
||||||
|
padding: 4px 0; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__selector-scroll { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
max-height: 200px; |
||||||
|
box-sizing: border-box; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__selector-empty, |
||||||
|
.uni-combox__selector-item { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
display: flex; |
||||||
|
cursor: pointer; |
||||||
|
/* #endif */ |
||||||
|
line-height: 36px; |
||||||
|
font-size: 14px; |
||||||
|
text-align: center; |
||||||
|
// border-bottom: solid 1px #DDDDDD; |
||||||
|
padding: 0px 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__selector-item:hover { |
||||||
|
background-color: #f9f9f9; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__selector-empty:last-child, |
||||||
|
.uni-combox__selector-item:last-child { |
||||||
|
/* #ifndef APP-NVUE */ |
||||||
|
border-bottom: none; |
||||||
|
/* #endif */ |
||||||
|
} |
||||||
|
|
||||||
|
// picker 弹出层通用的指示小三角 |
||||||
|
.uni-popper__arrow, |
||||||
|
.uni-popper__arrow::after { |
||||||
|
position: absolute; |
||||||
|
display: block; |
||||||
|
width: 0; |
||||||
|
height: 0; |
||||||
|
border-color: transparent; |
||||||
|
border-style: solid; |
||||||
|
border-width: 6px; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-popper__arrow { |
||||||
|
filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); |
||||||
|
top: -6px; |
||||||
|
left: 10%; |
||||||
|
margin-right: 3px; |
||||||
|
border-top-width: 0; |
||||||
|
border-bottom-color: #EBEEF5; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-popper__arrow::after { |
||||||
|
content: " "; |
||||||
|
top: 1px; |
||||||
|
margin-left: -6px; |
||||||
|
border-top-width: 0; |
||||||
|
border-bottom-color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__no-border { |
||||||
|
border: none; |
||||||
|
} |
||||||
|
|
||||||
|
.uni-combox__mask { |
||||||
|
width:100%; |
||||||
|
height:100%; |
||||||
|
position: fixed; |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
z-index: 1; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,90 @@ |
|||||||
|
{ |
||||||
|
"id": "uni-combox", |
||||||
|
"displayName": "uni-combox 组合框", |
||||||
|
"version": "1.0.1", |
||||||
|
"description": "可以选择也可以输入的表单项 ", |
||||||
|
"keywords": [ |
||||||
|
"uni-ui", |
||||||
|
"uniui", |
||||||
|
"combox", |
||||||
|
"组合框", |
||||||
|
"select" |
||||||
|
], |
||||||
|
"repository": "https://github.com/dcloudio/uni-ui", |
||||||
|
"engines": { |
||||||
|
"HBuilderX": "" |
||||||
|
}, |
||||||
|
"directories": { |
||||||
|
"example": "../../temps/example_temps" |
||||||
|
}, |
||||||
|
"dcloudext": { |
||||||
|
"category": [ |
||||||
|
"前端组件", |
||||||
|
"通用组件" |
||||||
|
], |
||||||
|
"sale": { |
||||||
|
"regular": { |
||||||
|
"price": "0.00" |
||||||
|
}, |
||||||
|
"sourcecode": { |
||||||
|
"price": "0.00" |
||||||
|
} |
||||||
|
}, |
||||||
|
"contact": { |
||||||
|
"qq": "" |
||||||
|
}, |
||||||
|
"declaration": { |
||||||
|
"ads": "无", |
||||||
|
"data": "无", |
||||||
|
"permissions": "无" |
||||||
|
}, |
||||||
|
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" |
||||||
|
}, |
||||||
|
"uni_modules": { |
||||||
|
"dependencies": [ |
||||||
|
"uni-scss", |
||||||
|
"uni-icons" |
||||||
|
], |
||||||
|
"encrypt": [], |
||||||
|
"platforms": { |
||||||
|
"cloud": { |
||||||
|
"tcb": "y", |
||||||
|
"aliyun": "y" |
||||||
|
}, |
||||||
|
"client": { |
||||||
|
"App": { |
||||||
|
"app-vue": "y", |
||||||
|
"app-nvue": "n" |
||||||
|
}, |
||||||
|
"H5-mobile": { |
||||||
|
"Safari": "y", |
||||||
|
"Android Browser": "y", |
||||||
|
"微信浏览器(Android)": "y", |
||||||
|
"QQ浏览器(Android)": "y" |
||||||
|
}, |
||||||
|
"H5-pc": { |
||||||
|
"Chrome": "y", |
||||||
|
"IE": "y", |
||||||
|
"Edge": "y", |
||||||
|
"Firefox": "y", |
||||||
|
"Safari": "y" |
||||||
|
}, |
||||||
|
"小程序": { |
||||||
|
"微信": "y", |
||||||
|
"阿里": "y", |
||||||
|
"百度": "y", |
||||||
|
"字节跳动": "y", |
||||||
|
"QQ": "y" |
||||||
|
}, |
||||||
|
"快应用": { |
||||||
|
"华为": "u", |
||||||
|
"联盟": "u" |
||||||
|
}, |
||||||
|
"Vue": { |
||||||
|
"vue2": "y", |
||||||
|
"vue3": "y" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
|
||||||
|
|
||||||
|
## Combox 组合框 |
||||||
|
> **组件名:uni-combox** |
||||||
|
> 代码块: `uCombox` |
||||||
|
|
||||||
|
|
||||||
|
组合框组件。 |
||||||
|
|
||||||
|
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-combox) |
||||||
|
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
## 1.2.2(2022-01-19) |
||||||
|
- 修复 在微信小程序中样式不生效的bug |
||||||
|
## 1.2.1(2022-01-18) |
||||||
|
- 新增 update 方法 ,在动态更新时间后,刷新组件 |
||||||
|
## 1.2.0(2021-11-19) |
||||||
|
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) |
||||||
|
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-countdown](https://uniapp.dcloud.io/component/uniui/uni-countdown) |
||||||
|
## 1.1.3(2021-10-18) |
||||||
|
- 重构 |
||||||
|
- 新增 font-size 支持自定义字体大小 |
||||||
|
## 1.1.2(2021-08-24) |
||||||
|
- 新增 支持国际化 |
||||||
|
## 1.1.1(2021-07-30) |
||||||
|
- 优化 vue3下小程序事件警告的问题 |
||||||
|
## 1.1.0(2021-07-30) |
||||||
|
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
||||||
|
## 1.0.5(2021-06-18) |
||||||
|
- 修复 uni-countdown 重复赋值跳两秒的 bug |
||||||
|
## 1.0.4(2021-05-12) |
||||||
|
- 新增 组件示例地址 |
||||||
|
## 1.0.3(2021-05-08) |
||||||
|
- 修复 uni-countdown 不能控制倒计时的 bug |
||||||
|
## 1.0.2(2021-02-04) |
||||||
|
- 调整为uni_modules目录规范 |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
{ |
||||||
|
"uni-countdown.day": "day", |
||||||
|
"uni-countdown.h": "h", |
||||||
|
"uni-countdown.m": "m", |
||||||
|
"uni-countdown.s": "s" |
||||||
|
} |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
import en from './en.json' |
||||||
|
import zhHans from './zh-Hans.json' |
||||||
|
import zhHant from './zh-Hant.json' |
||||||
|
export default { |
||||||
|
en, |
||||||
|
'zh-Hans': zhHans, |
||||||
|
'zh-Hant': zhHant |
||||||
|
} |
||||||