
88 changed files with 21990 additions and 23 deletions
@ -0,0 +1,11 @@ |
|||
**/.idea/ |
|||
**/target/ |
|||
*.iml |
|||
*.ipr |
|||
*.iws |
|||
*.log |
|||
|
|||
### VS Code ### |
|||
.vscode/ |
|||
.hbuilderx/ |
|||
unpackage/ |
@ -0,0 +1,27 @@ |
|||
<script> |
|||
export default { |
|||
onLaunch: function() { |
|||
// console.log('App Launch', option) |
|||
// wx.showToast({ |
|||
// title: '成功>>>>>' + option, |
|||
// icon: 'none', |
|||
// duration: 5000 //持续的时间 |
|||
// }) |
|||
// setTimeout(function() { |
|||
// uni.navigateTo({ |
|||
// url: 'pages/index/enterpriseRisk' |
|||
// }); |
|||
// }, 1500); |
|||
}, |
|||
onShow: function() { |
|||
console.log('App Show') |
|||
}, |
|||
onHide: function() { |
|||
console.log('App Hide') |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
/*每个页面公共css */ |
|||
</style> |
@ -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,21 @@ |
|||
import App from './App' |
|||
|
|||
// #ifndef VUE3
|
|||
import Vue from 'vue' |
|||
Vue.config.productionTip = false |
|||
App.mpType = 'app' |
|||
const app = new Vue({ |
|||
...App |
|||
}) |
|||
app.$mount() |
|||
// #endif
|
|||
|
|||
// #ifdef VUE3
|
|||
import { createSSRApp } from 'vue' |
|||
export function createApp() { |
|||
const app = createSSRApp(App) |
|||
return { |
|||
app |
|||
} |
|||
} |
|||
// #endif
|
@ -0,0 +1,73 @@ |
|||
{ |
|||
"name" : "bankSperivse", |
|||
"appid" : "__UNI__AA09EE8", |
|||
"description" : "", |
|||
"versionName" : "1.0.1", |
|||
"versionCode" : 101, |
|||
"transformPx" : false, |
|||
/* 5+App特有相关 */ |
|||
"app-plus" : { |
|||
"usingComponents" : true, |
|||
"nvueStyleCompiler" : "uni-app", |
|||
"compilerVersion" : 3, |
|||
"splashscreen" : { |
|||
"alwaysShowBeforeRender" : true, |
|||
"waiting" : true, |
|||
"autoclose" : true, |
|||
"delay" : 0 |
|||
}, |
|||
/* 模块配置 */ |
|||
"modules" : {}, |
|||
/* 应用发布信息 */ |
|||
"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\"/>" |
|||
] |
|||
}, |
|||
/* ios打包配置 */ |
|||
"ios" : {}, |
|||
/* SDK配置 */ |
|||
"sdkConfigs" : {} |
|||
} |
|||
}, |
|||
/* 快应用特有相关 */ |
|||
"quickapp" : {}, |
|||
/* 小程序特有相关 */ |
|||
"mp-weixin" : { |
|||
"appid" : "wx11565021714ba796", |
|||
"setting" : { |
|||
"urlCheck" : false |
|||
}, |
|||
"usingComponents" : true, |
|||
"lazyCodeLoading" : "requiredComponents" |
|||
}, |
|||
"mp-alipay" : { |
|||
"usingComponents" : true |
|||
}, |
|||
"mp-baidu" : { |
|||
"usingComponents" : true |
|||
}, |
|||
"mp-toutiao" : { |
|||
"usingComponents" : true |
|||
}, |
|||
"uniStatistics" : { |
|||
"enable" : false |
|||
}, |
|||
"vueVersion" : "2" |
|||
} |
@ -0,0 +1,37 @@ |
|||
{ |
|||
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages |
|||
|
|||
{ |
|||
"path": "pages/index/enterpriseRisk", |
|||
"style": { |
|||
"navigationBarTitleText": "uni-app" |
|||
} |
|||
}, |
|||
{ |
|||
"path": "pages/index/index", |
|||
"style": { |
|||
"navigationBarTitleText": "uni-app" |
|||
} |
|||
}, |
|||
|
|||
{ |
|||
"path": "pages/index/index2", |
|||
"style": { |
|||
"navigationBarTitleText": "uni-app" |
|||
} |
|||
}, |
|||
{ |
|||
"path": "pages/index/index3", |
|||
"style": { |
|||
"navigationBarTitleText": "uni-app" |
|||
} |
|||
} |
|||
], |
|||
"globalStyle": { |
|||
"navigationBarTextStyle": "black", |
|||
"navigationBarTitleText": "uni-app", |
|||
"navigationBarBackgroundColor": "#F8F8F8", |
|||
"backgroundColor": "#F8F8F8" |
|||
}, |
|||
"uniIdRouter": {} |
|||
} |
@ -0,0 +1,279 @@ |
|||
<template> |
|||
<view class="charts-box"> |
|||
|
|||
<view style="display: flex;justify-content: center; width: 100%; "> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(1)">1</text> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(2)">2</text> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(3)">3</text> |
|||
</view> |
|||
|
|||
<view style="margin-top: 20px;margin-left: 20px;"> |
|||
<text>企业数据异常信息{{title}}</text> |
|||
<text style="margin-left: 10px;">{{newDate}}</text> |
|||
|
|||
</view> |
|||
|
|||
<view style="margin-top: 20px;margin-left: 20px;"> |
|||
<text>>>>>>>{{title}}</text> |
|||
|
|||
</view> |
|||
|
|||
<view style="margin-top: 15px;margin-left: 10px;"> |
|||
<qiun-data-charts type="mix" :opts="opts" :chartData="chartData" /> |
|||
</view> |
|||
|
|||
|
|||
<view style="margin-top: 25px;margin-left: 15px;margin-right: 15px;"> |
|||
|
|||
<uni-table ref="table" :border="true" stripe type="" emptyText="暂无更多数据"> |
|||
<uni-tr> |
|||
<uni-th align="center">现金流量-经营活动产生的现金流量(元)</uni-th> |
|||
<uni-th align="center">总额</uni-th> |
|||
</uni-tr> |
|||
<uni-tr v-for="(item, index) in tableData" :key="index"> |
|||
<uni-td align="center">{{ item.name }}</uni-td> |
|||
<uni-td align="center">{{ item.price }}</uni-td> |
|||
</uni-tr> |
|||
</uni-table> |
|||
|
|||
</view> |
|||
|
|||
<view style="margin-top: 25px;margin-left: 15px;margin-right: 15px;"> |
|||
|
|||
<uni-table ref="table" :border="true" stripe type="" emptyText="暂无更多数据"> |
|||
<uni-tr> |
|||
<uni-th width="200" align="center">销售渠道类别</uni-th> |
|||
<uni-th align="center">总额</uni-th> |
|||
<uni-th align="center">应收帐款</uni-th> |
|||
<uni-th align="center">扣除应收</uni-th> |
|||
</uni-tr> |
|||
<uni-tr v-for="(item, index) in tableData2" :key="index"> |
|||
<uni-td align="center">{{ item.name }}</uni-td> |
|||
<uni-td align="center">{{ item.totalAmount }}</uni-td> |
|||
<uni-td align="center">{{ item.accountsReceivable }}</uni-td> |
|||
<uni-td align="center">{{ item.deductionAccountsReceivable }}</uni-td> |
|||
</uni-tr> |
|||
</uni-table> |
|||
|
|||
|
|||
</view> |
|||
|
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
title: "", |
|||
newDate: new Date().getFullYear() + "-" + (new Date().getMonth() + 1) + "-" + new Date().getDate(), |
|||
tableData: [{ |
|||
name: "销售商品收到的现金(元)", |
|||
price: "2000000", |
|||
}, |
|||
{ |
|||
name: "收到其他与经营活动有关的现金(元)", |
|||
price: "28700", |
|||
}, |
|||
{ |
|||
name: "本项合计", |
|||
price: "123456", |
|||
}, |
|||
], |
|||
tableData2: [{ |
|||
name: "销售商品收到的现金(元)", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793" |
|||
}, |
|||
{ |
|||
name: "连锁内加盟", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793" |
|||
}, |
|||
{ |
|||
name: "配送中心", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793", |
|||
}, { |
|||
name: "连锁外加盟", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793", |
|||
} |
|||
], |
|||
chartData: {}, |
|||
opts: { |
|||
color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", |
|||
"#ea7ccc" |
|||
], |
|||
padding: [15, 15, 0, 15], |
|||
enableScroll: false, |
|||
legend: {}, |
|||
xAxis: { |
|||
disableGrid: true, |
|||
title: "" |
|||
}, |
|||
yAxis: { |
|||
disabled: false, |
|||
disableGrid: false, |
|||
splitNumber: 5, |
|||
gridType: "dash", |
|||
dashLength: 4, |
|||
gridColor: "#CCCCCC", |
|||
padding: 10, |
|||
showTitle: true, |
|||
data: [{ |
|||
position: "left", |
|||
title: "折线" |
|||
}, |
|||
{ |
|||
position: "right", |
|||
min: 0, |
|||
max: 200, |
|||
title: "柱状图", |
|||
textAlign: "left" |
|||
}, |
|||
] |
|||
}, |
|||
extra: { |
|||
mix: { |
|||
column: { |
|||
width: 20 |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
}, |
|||
onLoad(option) { |
|||
this.getServerData(); |
|||
console.log('App onLoad',JSON.stringify(option)) |
|||
this.title = JSON.stringify(option) |
|||
wx.showToast({ |
|||
title: 'onLoad成功>>>>>' + JSON.stringify(option), |
|||
icon: 'none', |
|||
duration: 5000 //持续的时间 |
|||
}) |
|||
|
|||
}, |
|||
// onShow(option) { |
|||
// console.log('App onShow',JSON.stringify(option)) |
|||
// this.title = JSON.stringify(option) |
|||
// wx.showToast({ |
|||
// title: 'onShow成功>>>>>' + JSON.stringify(option), |
|||
// icon: 'none', |
|||
// duration: 5000 //持续的时间 |
|||
// }) |
|||
|
|||
// }, |
|||
// created(option) { |
|||
// console.log('App created',JSON.stringify(option)) |
|||
// this.title = JSON.stringify(option) |
|||
// wx.showToast({ |
|||
// title: 'created成功>>>>>' + JSON.stringify(option), |
|||
// icon: 'none', |
|||
// duration: 5000 //持续的时间 |
|||
// }) |
|||
|
|||
// }, |
|||
// onError(option) { |
|||
// console.log('App onError',JSON.stringify(option)) |
|||
// this.title =JSON.stringify(option) |
|||
// wx.showToast({ |
|||
// title: 'onError成功>>>>>' + JSON.stringify(option), |
|||
// icon: 'none', |
|||
// duration: 5000 //持续的时间 |
|||
// }) |
|||
// }, |
|||
methods: { |
|||
getServerData() { |
|||
//模拟从服务器获取数据时的延时 |
|||
setTimeout(() => { |
|||
//模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接 |
|||
let res = { |
|||
categories: ["2018", "2019", "2020", "2021", "2022", "2023"], |
|||
series: [{ |
|||
name: "仓库货值", |
|||
index: 1, |
|||
type: "column", |
|||
data: [40, { |
|||
"value": 30, |
|||
"color": "#f04864" |
|||
}, 55, 110, 24, 58] |
|||
}, |
|||
{ |
|||
name: "在途货值", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, { |
|||
name: "门店货值", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, { |
|||
name: "账户余额", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, { |
|||
name: "应收账款", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, { |
|||
name: "借款金额", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, |
|||
{ |
|||
name: "折线", |
|||
type: "line", |
|||
color: "#D33682", |
|||
data: [120, 140, 105, 170, 95, 160] |
|||
}, |
|||
] |
|||
}; |
|||
this.chartData = JSON.parse(JSON.stringify(res)); |
|||
}, 500); |
|||
}, |
|||
jump(index) { |
|||
console.log("index>>3", index) |
|||
switch (index) { |
|||
case 1: |
|||
uni.navigateTo({ |
|||
url: 'index' |
|||
}); |
|||
break; |
|||
|
|||
case 2: |
|||
uni.navigateTo({ |
|||
url: 'index2' |
|||
}); |
|||
|
|||
break; |
|||
|
|||
case 3: |
|||
|
|||
break; |
|||
} |
|||
} |
|||
}, |
|||
|
|||
}; |
|||
</script> |
|||
|
|||
<style scoped> |
|||
/* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */ |
|||
.charts-box { |
|||
width: 100%; |
|||
height: 300px; |
|||
} |
|||
</style> |
@ -0,0 +1,177 @@ |
|||
<template> |
|||
<view class="charts-box"> |
|||
|
|||
<view style="display: flex;justify-content: center; width: 100%; "> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(1)">1</text> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(2)">2</text> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(3)">3</text> |
|||
</view> |
|||
|
|||
<view style="margin-top: 20px;margin-left: 20px;"> |
|||
<text>当日数据</text> |
|||
<text style="margin-left: 10px;">{{newDate}}</text> |
|||
|
|||
</view> |
|||
|
|||
<view style="margin-top: 15px;margin-left: 10px;margin-right: 10px;"> |
|||
<qiun-data-charts type="column" :opts="opts" :chartData="chartData" /> |
|||
</view> |
|||
|
|||
|
|||
<view style="margin-top: 25px;margin-left: 15px;margin-right: 15px;"> |
|||
|
|||
<uni-table ref="table" :border="true" stripe type="" emptyText="暂无更多数据"> |
|||
<uni-tr> |
|||
<uni-th align="center">现金流量-经营活动产生的现金流量(元)</uni-th> |
|||
<uni-th align="center">总额</uni-th> |
|||
</uni-tr> |
|||
<uni-tr v-for="(item, index) in tableData" :key="index"> |
|||
<uni-td align="center">{{ item.name }}</uni-td> |
|||
<uni-td align="center">{{ item.price }}</uni-td> |
|||
</uni-tr> |
|||
</uni-table> |
|||
|
|||
</view> |
|||
|
|||
<view style="margin-top: 25px;margin-left: 15px;margin-right: 15px;"> |
|||
|
|||
<uni-table ref="table" :border="true" stripe type="" emptyText="暂无更多数据"> |
|||
<uni-tr> |
|||
<uni-th width="200" align="center">销售渠道类别</uni-th> |
|||
<uni-th align="center">总额</uni-th> |
|||
<uni-th align="center">应收帐款</uni-th> |
|||
<uni-th align="center">扣除应收</uni-th> |
|||
</uni-tr> |
|||
<uni-tr v-for="(item, index) in tableData2" :key="index"> |
|||
<uni-td align="center">{{ item.name }}</uni-td> |
|||
<uni-td align="center">{{ item.totalAmount }}</uni-td> |
|||
<uni-td align="center">{{ item.accountsReceivable }}</uni-td> |
|||
<uni-td align="center">{{ item.deductionAccountsReceivable }}</uni-td> |
|||
</uni-tr> |
|||
</uni-table> |
|||
|
|||
|
|||
</view> |
|||
|
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
newDate: new Date().getFullYear() + "-" + (new Date().getMonth() + 1) + "-" + new Date().getDate(), |
|||
tableData: [{ |
|||
name: "销售商品收到的现金(元)", |
|||
price: "2000000", |
|||
}, |
|||
{ |
|||
name: "收到其他与经营活动有关的现金(元)", |
|||
price: "28700", |
|||
}, |
|||
{ |
|||
name: "本项合计", |
|||
price: "123456", |
|||
}, |
|||
], |
|||
tableData2: [{ |
|||
name: "销售商品收到的现金(元)", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793" |
|||
}, |
|||
{ |
|||
name: "连锁内加盟", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793" |
|||
}, |
|||
{ |
|||
name: "配送中心", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793", |
|||
}, { |
|||
name: "连锁外加盟", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793", |
|||
} |
|||
], |
|||
chartData: {}, |
|||
opts: { |
|||
xAxis: { |
|||
disableGrid: true |
|||
}, |
|||
yAxis: { |
|||
data: [{ |
|||
min: 0 |
|||
}] |
|||
}, |
|||
extra: { |
|||
column: { |
|||
type: "group" |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
}, |
|||
onLoad() { |
|||
this.getServerData(); |
|||
|
|||
}, |
|||
methods: { |
|||
getServerData() { |
|||
setTimeout(() => { |
|||
//模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接 |
|||
let res = { |
|||
categories: ["2016", "2017", "2018", "2019", "2020", "2021"], |
|||
series: [{ |
|||
name: "分销商进货额", |
|||
data: [35, 36, 31, 33, 13, 34] |
|||
}, |
|||
{ |
|||
name: "实际发货额", |
|||
data: [18, 27, 21, 24, 6, 28] |
|||
} |
|||
] |
|||
}; |
|||
this.chartData = JSON.parse(JSON.stringify(res)); |
|||
}, 100); |
|||
}, |
|||
jump(index) { |
|||
console.log("index>>",index) |
|||
switch (index) { |
|||
case 1: |
|||
|
|||
break; |
|||
|
|||
case 2: |
|||
uni.navigateTo({ |
|||
url: 'index2' |
|||
}); |
|||
|
|||
break; |
|||
|
|||
case 3: |
|||
uni.navigateTo({ |
|||
url: 'index3' |
|||
}); |
|||
|
|||
break; |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
|
|||
<style scoped> |
|||
/* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */ |
|||
.charts-box { |
|||
width: 100%; |
|||
height: 300px; |
|||
} |
|||
</style> |
@ -0,0 +1,179 @@ |
|||
<template> |
|||
<view class="charts-box"> |
|||
|
|||
<view style="display: flex;justify-content: center; width: 100%; "> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(1)">1</text> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(2)">2</text> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(3)">3</text> |
|||
</view> |
|||
|
|||
<view style="margin-top: 20px;margin-left: 20px;"> |
|||
<text>2当日数据</text> |
|||
<text style="margin-left: 10px;">{{newDate}}</text> |
|||
|
|||
</view> |
|||
|
|||
<view style="margin-top: 15px;margin-left: 10px;margin-right: 10px;"> |
|||
<qiun-data-charts type="pie" :opts="opts" :chartData="chartData" /> |
|||
</view> |
|||
|
|||
|
|||
<view style="margin-top: 25px;margin-left: 15px;margin-right: 15px;"> |
|||
<text>到货时间预警表</text> |
|||
</view> |
|||
|
|||
<view style="margin-top: 20px;margin-left: 15px;margin-right: 15px;"> |
|||
|
|||
<uni-table ref="table" :border="true" stripe type="" emptyText="暂无更多数据"> |
|||
<uni-tr> |
|||
<uni-th width="50" align="center">序号</uni-th> |
|||
<uni-th width="280" align="center">供应商名称</uni-th> |
|||
<uni-th align="center">到货日期</uni-th> |
|||
<uni-th align="center">是否延期</uni-th> |
|||
</uni-tr> |
|||
<uni-tr v-for="(item, index) in tableData2" :key="index"> |
|||
<uni-td align="center">{{ index+1 }}</uni-td> |
|||
<uni-td align="center">{{ item.supplierName }}</uni-td> |
|||
<uni-td align="center">{{ item.allArrivedDate }}</uni-td> |
|||
<uni-td align="center">{{ item.isDelay }}</uni-td> |
|||
</uni-tr> |
|||
</uni-table> |
|||
|
|||
|
|||
</view> |
|||
|
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
newDate: new Date().getFullYear() + "-" + (new Date().getMonth() + 1) + "-" + new Date().getDate(), |
|||
|
|||
tableData2: [{ |
|||
supplierName: "中粮可口可乐饮料(河北)有限公司", |
|||
allArrivedDate: "2022.12.29", |
|||
isDelay: "是", |
|||
}, |
|||
{ |
|||
supplierName: "中顺洁柔纸业股份有限公司", |
|||
allArrivedDate: "2022.12.29", |
|||
isDelay: "是", |
|||
}, |
|||
{ |
|||
supplierName: "今麦郎食品股份有限公司石家庄分公司", |
|||
allArrivedDate: "2022.12.29", |
|||
isDelay: "是", |
|||
}, { |
|||
supplierName: "农夫山泉股份有限公司", |
|||
allArrivedDate: "2022.12.29", |
|||
isDelay: "是", |
|||
}, { |
|||
supplierName: "北京百事可乐饮料有限公司", |
|||
allArrivedDate: "2022.12.29", |
|||
isDelay: "是", |
|||
}, { |
|||
supplierName: "今麦郎食品股份有限公司石家庄分公司", |
|||
allArrivedDate: "2022.12.29", |
|||
isDelay: "是", |
|||
}, { |
|||
supplierName: "农夫山泉股份有限公司", |
|||
allArrivedDate: "2022.12.29", |
|||
isDelay: "是", |
|||
}, { |
|||
supplierName: "北京百事可乐饮料有限公司", |
|||
allArrivedDate: "2022.12.29", |
|||
isDelay: "是", |
|||
} |
|||
], |
|||
chartData: {}, |
|||
opts: { |
|||
color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", |
|||
"#ea7ccc" |
|||
], |
|||
padding: [5, 5, 5, 5], |
|||
enableScroll: false, |
|||
extra: { |
|||
pie: { |
|||
activeOpacity: 0.5, |
|||
activeRadius: 10, |
|||
offsetAngle: 0, |
|||
labelWidth: 15, |
|||
border: true, |
|||
borderWidth: 3, |
|||
borderColor: "#FFFFFF", |
|||
linearType: "custom" |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
}, |
|||
onLoad() { |
|||
this.getServerData(); |
|||
}, |
|||
methods: { |
|||
getServerData() { |
|||
//模拟从服务器获取数据时的延时 |
|||
setTimeout(() => { |
|||
//模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接 |
|||
let res = { |
|||
series: [{ |
|||
data: [{ |
|||
"name": "一班", |
|||
"value": 50 |
|||
}, { |
|||
"name": "二班", |
|||
"value": 30 |
|||
}, { |
|||
"name": "三班", |
|||
"value": 20 |
|||
}, { |
|||
"name": "四班", |
|||
"value": 18 |
|||
}, { |
|||
"name": "五班", |
|||
"value": 8 |
|||
}] |
|||
}] |
|||
}; |
|||
this.chartData = JSON.parse(JSON.stringify(res)); |
|||
}, 500); |
|||
}, |
|||
jump(index) { |
|||
console.log("index>>2",index) |
|||
switch (index) { |
|||
case 1: |
|||
uni.navigateTo({ |
|||
url: 'index' |
|||
}); |
|||
|
|||
break; |
|||
|
|||
case 2: |
|||
|
|||
break; |
|||
|
|||
case 3: |
|||
uni.navigateTo({ |
|||
url: 'index3' |
|||
}); |
|||
|
|||
break; |
|||
} |
|||
} |
|||
}, |
|||
|
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
/* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */ |
|||
.charts-box { |
|||
width: 100%; |
|||
height: 300px; |
|||
} |
|||
</style> |
@ -0,0 +1,236 @@ |
|||
<template> |
|||
<view class="charts-box"> |
|||
|
|||
<view style="display: flex;justify-content: center; width: 100%; "> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(1)">1</text> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(2)">2</text> |
|||
<text style="padding-top: 10px;padding-bottom: 10px;color: blue;margin-left: 20px;" |
|||
@click="jump(3)">3</text> |
|||
</view> |
|||
|
|||
<view style="margin-top: 20px;margin-left: 20px;"> |
|||
<text>3当日数据</text> |
|||
<text style="margin-left: 10px;">{{newDate}}</text> |
|||
|
|||
</view> |
|||
|
|||
<view style="margin-top: 15px;margin-left: 10px;"> |
|||
<qiun-data-charts type="mix" :opts="opts" :chartData="chartData" /> |
|||
</view> |
|||
|
|||
|
|||
<view style="margin-top: 25px;margin-left: 15px;margin-right: 15px;"> |
|||
|
|||
<uni-table ref="table" :border="true" stripe type="" emptyText="暂无更多数据"> |
|||
<uni-tr> |
|||
<uni-th align="center">现金流量-经营活动产生的现金流量(元)</uni-th> |
|||
<uni-th align="center">总额</uni-th> |
|||
</uni-tr> |
|||
<uni-tr v-for="(item, index) in tableData" :key="index"> |
|||
<uni-td align="center">{{ item.name }}</uni-td> |
|||
<uni-td align="center">{{ item.price }}</uni-td> |
|||
</uni-tr> |
|||
</uni-table> |
|||
|
|||
</view> |
|||
|
|||
<view style="margin-top: 25px;margin-left: 15px;margin-right: 15px;"> |
|||
|
|||
<uni-table ref="table" :border="true" stripe type="" emptyText="暂无更多数据"> |
|||
<uni-tr> |
|||
<uni-th width="200" align="center">销售渠道类别</uni-th> |
|||
<uni-th align="center">总额</uni-th> |
|||
<uni-th align="center">应收帐款</uni-th> |
|||
<uni-th align="center">扣除应收</uni-th> |
|||
</uni-tr> |
|||
<uni-tr v-for="(item, index) in tableData2" :key="index"> |
|||
<uni-td align="center">{{ item.name }}</uni-td> |
|||
<uni-td align="center">{{ item.totalAmount }}</uni-td> |
|||
<uni-td align="center">{{ item.accountsReceivable }}</uni-td> |
|||
<uni-td align="center">{{ item.deductionAccountsReceivable }}</uni-td> |
|||
</uni-tr> |
|||
</uni-table> |
|||
|
|||
|
|||
</view> |
|||
|
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
newDate: new Date().getFullYear() + "-" + (new Date().getMonth() + 1) + "-" + new Date().getDate(), |
|||
tableData: [{ |
|||
name: "销售商品收到的现金(元)", |
|||
price: "2000000", |
|||
}, |
|||
{ |
|||
name: "收到其他与经营活动有关的现金(元)", |
|||
price: "28700", |
|||
}, |
|||
{ |
|||
name: "本项合计", |
|||
price: "123456", |
|||
}, |
|||
], |
|||
tableData2: [{ |
|||
name: "销售商品收到的现金(元)", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793" |
|||
}, |
|||
{ |
|||
name: "连锁内加盟", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793" |
|||
}, |
|||
{ |
|||
name: "配送中心", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793", |
|||
}, { |
|||
name: "连锁外加盟", |
|||
totalAmount: "2000000", |
|||
accountsReceivable: "31914", |
|||
deductionAccountsReceivable: "35793", |
|||
} |
|||
], |
|||
chartData: {}, |
|||
opts: { |
|||
color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", |
|||
"#ea7ccc" |
|||
], |
|||
padding: [15, 15, 0, 15], |
|||
enableScroll: false, |
|||
legend: {}, |
|||
xAxis: { |
|||
disableGrid: true, |
|||
title: "" |
|||
}, |
|||
yAxis: { |
|||
disabled: false, |
|||
disableGrid: false, |
|||
splitNumber: 5, |
|||
gridType: "dash", |
|||
dashLength: 4, |
|||
gridColor: "#CCCCCC", |
|||
padding: 10, |
|||
showTitle: true, |
|||
data: [{ |
|||
position: "left", |
|||
title: "折线" |
|||
}, |
|||
{ |
|||
position: "right", |
|||
min: 0, |
|||
max: 200, |
|||
title: "柱状图", |
|||
textAlign: "left" |
|||
}, |
|||
] |
|||
}, |
|||
extra: { |
|||
mix: { |
|||
column: { |
|||
width: 20 |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
}, |
|||
onLoad() { |
|||
this.getServerData(); |
|||
}, |
|||
methods: { |
|||
getServerData() { |
|||
//模拟从服务器获取数据时的延时 |
|||
setTimeout(() => { |
|||
//模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接 |
|||
let res = { |
|||
categories: ["2018", "2019", "2020", "2021", "2022", "2023"], |
|||
series: [{ |
|||
name: "仓库货值", |
|||
index: 1, |
|||
type: "column", |
|||
data: [40, { |
|||
"value": 30, |
|||
"color": "#f04864" |
|||
}, 55, 110, 24, 58] |
|||
}, |
|||
{ |
|||
name: "在途货值", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, { |
|||
name: "门店货值", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, { |
|||
name: "账户余额", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, { |
|||
name: "应收账款", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, { |
|||
name: "借款金额", |
|||
index: 1, |
|||
type: "column", |
|||
data: [50, 20, 75, 60, 34, 38] |
|||
}, |
|||
{ |
|||
name: "折线", |
|||
type: "line", |
|||
color: "#D33682", |
|||
data: [120, 140, 105, 170, 95, 160] |
|||
}, |
|||
] |
|||
}; |
|||
this.chartData = JSON.parse(JSON.stringify(res)); |
|||
}, 500); |
|||
}, |
|||
jump(index) { |
|||
console.log("index>>3", index) |
|||
switch (index) { |
|||
case 1: |
|||
uni.navigateTo({ |
|||
url: 'index' |
|||
}); |
|||
break; |
|||
|
|||
case 2: |
|||
uni.navigateTo({ |
|||
url: 'index2' |
|||
}); |
|||
|
|||
break; |
|||
|
|||
case 3: |
|||
|
|||
break; |
|||
} |
|||
} |
|||
}, |
|||
|
|||
}; |
|||
</script> |
|||
|
|||
<style scoped> |
|||
/* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */ |
|||
.charts-box { |
|||
width: 100%; |
|||
height: 300px; |
|||
} |
|||
</style> |
After Width: | Height: | Size: 3.9 KiB |
@ -0,0 +1,76 @@ |
|||
/** |
|||
* 这里是uni-app内置的常用样式变量 |
|||
* |
|||
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 |
|||
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App |
|||
* |
|||
*/ |
|||
|
|||
/** |
|||
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 |
|||
* |
|||
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 |
|||
*/ |
|||
|
|||
/* 颜色变量 */ |
|||
|
|||
/* 行为相关颜色 */ |
|||
$uni-color-primary: #007aff; |
|||
$uni-color-success: #4cd964; |
|||
$uni-color-warning: #f0ad4e; |
|||
$uni-color-error: #dd524d; |
|||
|
|||
/* 文字基本颜色 */ |
|||
$uni-text-color:#333;//基本色 |
|||
$uni-text-color-inverse:#fff;//反色 |
|||
$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 |
|||
$uni-text-color-placeholder: #808080; |
|||
$uni-text-color-disable:#c0c0c0; |
|||
|
|||
/* 背景颜色 */ |
|||
$uni-bg-color:#ffffff; |
|||
$uni-bg-color-grey:#f8f8f8; |
|||
$uni-bg-color-hover:#f1f1f1;//点击状态颜色 |
|||
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 |
|||
|
|||
/* 边框颜色 */ |
|||
$uni-border-color:#c8c7cc; |
|||
|
|||
/* 尺寸变量 */ |
|||
|
|||
/* 文字尺寸 */ |
|||
$uni-font-size-sm:12px; |
|||
$uni-font-size-base:14px; |
|||
$uni-font-size-lg:16; |
|||
|
|||
/* 图片尺寸 */ |
|||
$uni-img-size-sm:20px; |
|||
$uni-img-size-base:26px; |
|||
$uni-img-size-lg:40px; |
|||
|
|||
/* Border Radius */ |
|||
$uni-border-radius-sm: 2px; |
|||
$uni-border-radius-base: 3px; |
|||
$uni-border-radius-lg: 6px; |
|||
$uni-border-radius-circle: 50%; |
|||
|
|||
/* 水平间距 */ |
|||
$uni-spacing-row-sm: 5px; |
|||
$uni-spacing-row-base: 10px; |
|||
$uni-spacing-row-lg: 15px; |
|||
|
|||
/* 垂直间距 */ |
|||
$uni-spacing-col-sm: 4px; |
|||
$uni-spacing-col-base: 8px; |
|||
$uni-spacing-col-lg: 12px; |
|||
|
|||
/* 透明度 */ |
|||
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 |
|||
|
|||
/* 文章场景相关 */ |
|||
$uni-color-title: #2C405A; // 文章标题颜色 |
|||
$uni-font-size-title:20px; |
|||
$uni-color-subtitle: #555555; // 二级标题颜色 |
|||
$uni-font-size-subtitle:26px; |
|||
$uni-color-paragraph: #3F536E; // 文章段落颜色 |
|||
$uni-font-size-paragraph:15px; |
@ -0,0 +1,320 @@ |
|||
## 2.5.0-20230101(2023-01-01) |
|||
- 秋云图表组件 修改条件编译顺序,确保uniapp的cli方式的项目依赖不完整时可以正常显示 |
|||
- 秋云图表组件 恢复props属性directory的使用,以修复vue3项目中,开启echarts后,echarts目录识别错误的bug |
|||
- uCharts.js 修复区域图、混合图只有一个数据时图表显示不正确的bug |
|||
- uCharts.js 修复折线图、区域图中时间轴类别图表tooltip指示点显示不正确的bug |
|||
- uCharts.js 修复x轴使用labelCount时,并且boundaryGap = 'justify' 并且关闭Y轴显示的时候,最后一个坐标值不显示的bug |
|||
- uCharts.js 修复折线图只有一组数据时 ios16 渲染颜色不正确的bug |
|||
- uCharts.js 修复玫瑰图半径显示不正确的bug |
|||
- uCharts.js 柱状图、山峰图增加正负图功能,y轴网格如果需要显示0轴则由 min max 及 splitNumber 确定,后续版本优化自动显示0轴 |
|||
- uCharts.js 柱状图column增加 opts.extra.column.labelPosition,数据标签位置,有效值为 outside外部, insideTop内顶部, center内中间, bottom内底部 |
|||
- uCharts.js 雷达图radar增加 opts.extra.radar.labelShow,否显示各项标识文案是,默认true |
|||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.boxPadding,提示窗边框填充距离,默认3px |
|||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.fontSize,提示窗字体大小配置,默认13px |
|||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.lineHeight,提示窗文字行高,默认20px |
|||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.legendShow,是否显示左侧图例,默认true |
|||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.legendShape,图例形状,图例标识样式,有效值为 auto自动跟随图例, diamond◆, circle●, triangle▲, square■, rect▬, line- |
|||
- uCharts.js 标记线markLine增加 opts.extra.markLine.labelFontSize,字体大小配置,默认13px |
|||
- uCharts.js 标记线markLine增加 opts.extra.markLine.labelPadding,标签边框内填充距离,默认6px |
|||
- uCharts.js 折线图line增加 opts.extra.line.linearType,渐变色类型,可选值 none关闭渐变色,custom 自定义渐变色。使用自定义渐变色时请赋值serie.linearColor作为颜色值 |
|||
- uCharts.js 折线图line增加 serie.linearColor,渐变色数组,格式为2维数组[起始位置,颜色值],例如[[0,'#0EE2F8'],[0.3,'#2BDCA8'],[0.6,'#1890FF'],[1,'#9A60B4']] |
|||
- uCharts.js 折线图line增加 opts.extra.line.onShadow,是否开启折线阴影,开启后请赋值serie.setShadow阴影设置 |
|||
- uCharts.js 折线图line增加 serie.setShadow,阴影配置,格式为4位数组:[offsetX,offsetY,blur,color] |
|||
- uCharts.js 折线图line增加 opts.extra.line.animation,动画效果方向,可选值为vertical 垂直动画效果,horizontal 水平动画效果 |
|||
- uCharts.js X轴xAxis增加 opts.xAxis.lineHeight,X轴字体行高,默认20px |
|||
- uCharts.js X轴xAxis增加 opts.xAxis.marginTop,X轴文字距离轴线的距离,默认0px |
|||
- uCharts.js X轴xAxis增加 opts.xAxis.title,当前X轴标题 |
|||
- uCharts.js X轴xAxis增加 opts.xAxis.titleFontSize,标题字体大小,默认13px |
|||
- uCharts.js X轴xAxis增加 opts.xAxis.titleOffsetY,标题纵向偏移距离,负数为向上偏移,正数向下偏移 |
|||
- uCharts.js X轴xAxis增加 opts.xAxis.titleOffsetX,标题横向偏移距离,负数为向左偏移,正数向右偏移 |
|||
- uCharts.js X轴xAxis增加 opts.xAxis.titleFontColor,标题字体颜色,默认#666666 |
|||
|
|||
## 报错TypeError: Cannot read properties of undefined (reading 'length') |
|||
- 如果是uni-modules版本组件,请先登录HBuilderX账号; |
|||
- 在HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行; |
|||
- 如果是cli项目请使用码云上的非uniCloud版本组件; |
|||
- 或者添加uniCloud的依赖; |
|||
- 或者使用原生uCharts; |
|||
## 2.4.5-20221130(2022-11-30) |
|||
- uCharts.js 优化tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画 |
|||
- uCharts.js 折线图修复特殊情况下只有单点数据,并改变线宽后点变为圆形的bug |
|||
- uCharts.js 修复Y轴disabled启用后无效并报错的bug |
|||
- uCharts.js 修复仪表盘起始结束角度特殊情况下显示不正确的bug |
|||
- uCharts.js 雷达图新增参数 opts.extra.radar.radius , 自定义雷达图半径 |
|||
- uCharts.js 折线图、区域图增加tooltip指示点,opts.extra.line.activeType/opts.extra.area.activeType,可选值"none"不启用激活指示点,"hollow"空心点模式,"solid"实心点模式 |
|||
## 2.4.4-20221102(2022-11-02) |
|||
- 秋云图表组件 修复使用echarts时reload、reshow无法调用重新渲染的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/40) |
|||
- 秋云图表组件 修复使用echarts时,初始化时宽高不正确的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/42) |
|||
- 秋云图表组件 修复uniapp的h5使用history模式时,无法加载echarts的bug |
|||
- 秋云图表组件 小程序端@complete、@scrollLeft、@scrollRight、@getTouchStart、@getTouchMove、@getTouchEnd事件增加opts参数传出,方便一些特殊需求的交互获取数据。 |
|||
|
|||
- uCharts.js 修复calTooltipYAxisData方法内formatter格式化方法未与y轴方法同步的问题,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/43) |
|||
- uCharts.js 地图新增参数opts.series[i].fillOpacity,以透明度方式来设置颜色过度效果,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/38) |
|||
- uCharts.js 地图新增参数opts.extra.map.active,是否启用点击激活变色 |
|||
- uCharts.js 地图新增参数opts.extra.map.activeTextColor,是否启用点击激活变色 |
|||
- uCharts.js 地图新增渲染完成事件renderComplete |
|||
- uCharts.js 漏斗图修复当部分数据相同时tooltip提示窗点击错误的bug |
|||
- uCharts.js 漏斗图新增参数series.data[i].centerText 居中标签文案 |
|||
- uCharts.js 漏斗图新增参数series.data[i].centerTextSize 居中标签文案字体大小,默认opts.fontSize |
|||
- uCharts.js 漏斗图新增参数series.data[i].centerTextColor 居中标签文案字体颜色,默认#FFFFFF |
|||
- uCharts.js 漏斗图新增参数opts.extra.funnel.minSize 最小值的最小宽度,默认0 |
|||
- uCharts.js 进度条新增参数opts.extra.arcbar.direction,动画方向,可选值为cw顺时针、ccw逆时针 |
|||
- uCharts.js 混合图新增参数opts.extra.mix.line.width,折线的宽度,默认2 |
|||
- uCharts.js 修复tooltip开启horizentalLine水平横线标注时,图表显示错位的bug |
|||
- uCharts.js 优化tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画 |
|||
- uCharts.js 修复开启滚动条后X轴文字超出绘图区域后的隐藏逻辑 |
|||
- uCharts.js 柱状图、条状图修复堆叠模式不能通过{value,color}赋值单个柱子颜色的问题 |
|||
- uCharts.js 气泡图修复不识别series.textSize和series.textColor的bug |
|||
|
|||
## 报错TypeError: Cannot read properties of undefined (reading 'length') |
|||
1. 如果是uni-modules版本组件,请先登录HBuilderX账号; |
|||
2. 在HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行; |
|||
3. 如果是cli项目请使用码云上的非uniCloud版本组件; |
|||
4. 或者添加uniCloud的依赖; |
|||
5. 或者使用原生uCharts; |
|||
## 2.4.3-20220505(2022-05-05) |
|||
- 秋云图表组件 修复开启canvas2d后将series赋值为空数组显示加载图标时,再次赋值后画布闪动的bug |
|||
- 秋云图表组件 修复升级hbx最新版后ECharts的highlight方法报错的bug |
|||
- uCharts.js 雷达图新增参数opts.extra.radar.gridEval,数据点位网格抽希,默认1 |
|||
- uCharts.js 雷达图新增参数opts.extra.radar.axisLabel, 是否显示刻度点值,默认false |
|||
- uCharts.js 雷达图新增参数opts.extra.radar.axisLabelTofix,刻度点值小数位数,默认0 |
|||
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointShow,是否显示末端刻度圆点,默认false |
|||
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointRadius,刻度圆点的半径,默认3 |
|||
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointColor,刻度圆点的颜色,默认#cccccc |
|||
- uCharts.js 雷达图新增参数opts.extra.radar.linearType,渐变色类型,可选值"none"关闭渐变,"custom"开启渐变 |
|||
- uCharts.js 雷达图新增参数opts.extra.radar.customColor,自定义渐变颜色,数组类型对应series的数组长度以匹配不同series颜色的不同配色方案,例如["#FA7D8D", "#EB88E2"] |
|||
- uCharts.js 雷达图优化支持series.textColor、series.textSize属性 |
|||
- uCharts.js 柱状图中温度计式图标,优化支持全圆角类型,修复边框有缝隙的bug,详见官网【演示】中的温度计图表 |
|||
- uCharts.js 柱状图新增参数opts.extra.column.activeWidth,当前点击柱状图的背景宽度,默认一个单元格单位 |
|||
- uCharts.js 混合图增加opts.extra.mix.area.gradient 区域图是否开启渐变色 |
|||
- uCharts.js 混合图增加opts.extra.mix.area.opacity 区域图透明度,默认0.2 |
|||
- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelText,自定义标签文字,避免formatter格式化的繁琐,详见官网【演示】中的饼图 |
|||
- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelShow,自定义是否显示某一个指示标签,避免因饼图类别太多导致标签重复或者居多导致图形变形的问题,详见官网【演示】中的饼图 |
|||
- uCharts.js 增加opts.series[i].legendText/opts.series[0].data[i].legendText(与series.name同级)自定义图例显示文字的方法 |
|||
- uCharts.js 优化X轴、Y轴formatter格式化方法增加形参,统一为fromatter:function(value,index,opts){} |
|||
- uCharts.js 修复横屏模式下无法使用双指缩放方法的bug |
|||
- uCharts.js 修复当只有一条数据或者多条数据值相等的时候Y轴自动计算的最大值错误的bug |
|||
- 【官网模板】增加外部自定义图例与图表交互的例子,[点击跳转](https://www.ucharts.cn/v2/#/layout/info?id=2) |
|||
|
|||
## 注意:非unimodules 版本如因更新 hbx 至 3.4.7 导致报错如下,请到码云更新非 unimodules 版本组件,[点击跳转](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6) |
|||
> Error in callback for immediate watcher "uchartsOpts": "SyntaxError: Unexpected token u in JSON at position 0" |
|||
## 2.4.2-20220421(2022-04-21) |
|||
- 秋云图表组件 修复HBX升级3.4.6.20220420版本后echarts报错的问题 |
|||
## 2.4.2-20220420(2022-04-20) |
|||
## 重要!此版本uCharts新增了很多功能,修复了诸多已知问题 |
|||
- 秋云图表组件 新增onzoom开启双指缩放功能(仅uCharts),前提需要直角坐标系类图表类型,并且ontouch为true、opts.enableScroll为true,详见实例项目K线图 |
|||
- 秋云图表组件 新增optsWatch是否监听opts变化,关闭optsWatch后,动态修改opts不会触发图表重绘 |
|||
- 秋云图表组件 修复开启canvas2d功能后,动态更新数据后画布闪动的bug |
|||
- 秋云图表组件 去除directory属性,改为自动获取echarts.min.js路径(升级不受影响) |
|||
- 秋云图表组件 增加getImage()方法及@getImage事件,通过ref调用getImage()方法获,触发@getImage事件获取当前画布的base64图片文件流。 |
|||
- 秋云图表组件 支付宝、字节跳动、飞书、快手小程序支持开启canvas2d同层渲染设置。 |
|||
- 秋云图表组件 新增加【非uniCloud】版本组件,避免有些不需要uniCloud的使用组件发布至小程序需要提交隐私声明问题,请到码云[【非uniCloud版本】](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6),或npm[【非uniCloud版本】](https://www.npmjs.com/package/@qiun/uni-ucharts)下载使用。 |
|||
- uCharts.js 新增dobuleZoom双指缩放功能 |
|||
- uCharts.js 新增山峰图type="mount",数据格式为饼图类格式,不需要传入categories,具体详见新版官网在线演示 |
|||
- uCharts.js 修复折线图当数据中存在null时tooltip报错的bug |
|||
- uCharts.js 修复饼图类当画布比较小时自动计算的半径是负数报错的bug |
|||
- uCharts.js 统一各图表类型的series.formatter格式化方法的形参为(val, index, series, opts),方便格式化时有更多参数可用 |
|||
- uCharts.js 标记线功能增加labelText自定义显示文字,增加labelAlign标签显示位置(左侧或右侧),增加标签显示位置微调labelOffsetX、labelOffsetY |
|||
- uCharts.js 修复条状图当数值很小时开启圆角后样式错误的bug |
|||
- uCharts.js 修复X轴开启disabled后,X轴仍占用空间的bug |
|||
- uCharts.js 修复X轴开启滚动条并且开启rotateLabel后,X轴文字与滚动条重叠的bug |
|||
- uCharts.js 增加X轴rotateAngle文字旋转自定义角度,取值范围(-90至90) |
|||
- uCharts.js 修复地图文字标签层级显示不正确的bug |
|||
- uCharts.js 修复饼图、圆环图、玫瑰图当数据全部为0的时候不显示数据标签的bug |
|||
- uCharts.js 修复当opts.padding上边距为0时,Y轴顶部刻度标签位置不正确的bug |
|||
|
|||
## 另外我们还开发了各大原生小程序组件,已发布至码云和npm |
|||
[https://gitee.com/uCharts/uCharts](https://gitee.com/uCharts/uCharts) |
|||
[https://www.npmjs.com/~qiun](https://www.npmjs.com/~qiun) |
|||
|
|||
## 对于原生uCharts文档我们已上线新版官方网站,详情点击下面链接进入官网 |
|||
[https://www.uCharts.cn/v2/](https://www.ucharts.cn/v2/) |
|||
## 2.3.7-20220122(2022-01-22) |
|||
## 重要!使用vue3编译,请使用cli模式并升级至最新依赖,HbuilderX编译需要使用3.3.8以上版本 |
|||
- uCharts.js 修复uni-app平台组件模式使用vue3编译到小程序报错的bug。 |
|||
## 2.3.7-20220118(2022-01-18) |
|||
## 注意,使用vue3的前提是需要3.3.8.20220114-alpha版本的HBuilder! |
|||
## 2.3.67-20220118(2022-01-18) |
|||
- 秋云图表组件 组件初步支持vue3,全端编译会有些问题,具体详见下面修改: |
|||
1. 小程序端运行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new uni_modules_qiunDataCharts_js_sdk_uCharts_uCharts.uCharts,将.uCharts去掉。 |
|||
2. 小程序端发行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new e.uCharts,将.uCharts去掉,变为 new e。 |
|||
3. 如果觉得上述步骤比较麻烦,如果您的项目只编译到小程序端,可以修改u-charts.js最后一行导出方式,将 export default uCharts;变更为 export default { uCharts: uCharts }; 这样变更后,H5和App端的renderjs会有问题,请开发者自行选择。(此问题非组件问题,请等待DC官方修复Vue3的小程序端) |
|||
## 2.3.6-20220111(2022-01-11) |
|||
- 秋云图表组件 修改组件 props 属性中的 background 默认值为 rgba(0,0,0,0) |
|||
## 2.3.6-20211201(2021-12-01) |
|||
- uCharts.js 修复bar条状图开启圆角模式时,值很小时圆角渲染错误的bug |
|||
## 2.3.5-20211014(2021-10-15) |
|||
- uCharts.js 增加vue3的编译支持(仅原生uCharts,qiun-data-charts组件后续会支持,请关注更新) |
|||
## 2.3.4-20211012(2021-10-12) |
|||
- 秋云图表组件 修复 mac os x 系统 mouseover 事件丢失的 bug |
|||
## 2.3.3-20210706(2021-07-06) |
|||
- uCharts.js 增加雷达图开启数据点值(opts.dataLabel)的显示 |
|||
## 2.3.2-20210627(2021-06-27) |
|||
- 秋云图表组件 修复tooltipCustom个别情况下传值不正确报错TypeError: Cannot read property 'name' of undefined的bug |
|||
## 2.3.1-20210616(2021-06-16) |
|||
- uCharts.js 修复圆角柱状图使用4角圆角时,当数值过大时不正确的bug |
|||
## 2.3.0-20210612(2021-06-12) |
|||
- uCharts.js 【重要】uCharts增加nvue兼容,可在nvue项目中使用gcanvas组件渲染uCharts,[详见码云uCharts-demo-nvue](https://gitee.com/uCharts/uCharts) |
|||
- 秋云图表组件 增加tapLegend属性,是否开启图例点击交互事件 |
|||
- 秋云图表组件 getIndex事件中增加返回uCharts实例中的opts参数,以便在页面中调用参数 |
|||
- 示例项目 pages/other/other.vue增加app端自定义tooltip的方法,详见showOptsTooltip方法 |
|||
## 2.2.1-20210603(2021-06-03) |
|||
- uCharts.js 修复饼图、圆环图、玫瑰图,当起始角度不为0时,tooltip位置不准确的bug |
|||
- uCharts.js 增加温度计式柱状图开启顶部半圆形的配置 |
|||
## 2.2.0-20210529(2021-05-29) |
|||
- uCharts.js 增加条状图type="bar" |
|||
- 示例项目 pages/ucharts/ucharts.vue增加条状图的demo |
|||
## 2.1.7-20210524(2021-05-24) |
|||
- uCharts.js 修复大数据量模式下曲线图不平滑的bug |
|||
## 2.1.6-20210523(2021-05-23) |
|||
- 秋云图表组件 修复小程序端开启滚动条更新数据后滚动条位置不符合预期的bug |
|||
## 2.1.5-2021051702(2021-05-17) |
|||
- uCharts.js 修复自定义Y轴min和max值为0时不能正确显示的bug |
|||
## 2.1.5-20210517(2021-05-17) |
|||
- uCharts.js 修复Y轴自定义min和max时,未按指定的最大值最小值显示坐标轴刻度的bug |
|||
## 2.1.4-20210516(2021-05-16) |
|||
- 秋云图表组件 优化onWindowResize防抖方法 |
|||
- 秋云图表组件 修复APP端uCharts更新数据时,清空series显示loading图标后再显示图表,图表抖动的bug |
|||
- uCharts.js 修复开启canvas2d后,x轴、y轴、series自定义字体大小未按比例缩放的bug |
|||
- 示例项目 修复format-e.vue拼写错误导致app端使用uCharts渲染图表 |
|||
## 2.1.3-20210513(2021-05-13) |
|||
- 秋云图表组件 修改uCharts变更chartData数据为updateData方法,支持带滚动条的数据动态打点 |
|||
- 秋云图表组件 增加onWindowResize防抖方法 fix by ど誓言,如尘般染指流年づ |
|||
- 秋云图表组件 H5或者APP变更chartData数据显示loading图表时,原数据闪现的bug |
|||
- 秋云图表组件 props增加errorReload禁用错误点击重新加载的方法 |
|||
- uCharts.js 增加tooltip显示category(x轴对应点位)标题的功能,opts.extra.tooltip.showCategory,默认为false |
|||
- uCharts.js 修复mix混合图只有柱状图时,tooltip的分割线显示位置不正确的bug |
|||
- uCharts.js 修复开启滚动条,图表在拖动中动态打点,滚动条位置不正确的bug |
|||
- uCharts.js 修复饼图类数据格式为echarts数据格式,series为空数组报错的bug |
|||
- 示例项目 修改uCharts.js更新到v2.1.2版本后,@getIndex方法获取索引值变更为e.currentIndex.index |
|||
- 示例项目 pages/updata/updata.vue增加滚动条拖动更新(数据动态打点)的demo |
|||
- 示例项目 pages/other/other.vue增加errorReload禁用错误点击重新加载的demo |
|||
## 2.1.2-20210509(2021-05-09) |
|||
秋云图表组件 修复APP端初始化时就传入chartData或lacaldata不显示图表的bug |
|||
## 2.1.1-20210509(2021-05-09) |
|||
- 秋云图表组件 变更ECharts的eopts配置在renderjs内执行,支持在config-echarts.js配置文件内写function配置。 |
|||
- 秋云图表组件 修复APP端报错Prop being mutated: "onmouse"错误的bug。 |
|||
- 秋云图表组件 修复APP端报错Error: Not Found:Page[6][-1,27] at view.umd.min.js:1的bug。 |
|||
## 2.1.0-20210507(2021-05-07) |
|||
- 秋云图表组件 修复初始化时就有数据或者数据更新的时候loading加载动画闪动的bug |
|||
- uCharts.js 修复x轴format方法categories为字符串类型时返回NaN的bug |
|||
- uCharts.js 修复series.textColor、legend.fontColor未执行全局默认颜色的bug |
|||
## 2.1.0-20210506(2021-05-06) |
|||
- 秋云图表组件 修复极个别情况下报错item.properties undefined的bug |
|||
- 秋云图表组件 修复极个别情况下关闭加载动画reshow不起作用,无法显示图表的bug |
|||
- 示例项目 pages/ucharts/ucharts.vue 增加时间轴折线图(type="tline")、时间轴区域图(type="tarea")、散点图(type="scatter")、气泡图demo(type="bubble")、倒三角形漏斗图(opts.extra.funnel.type="triangle")、金字塔形漏斗图(opts.extra.funnel.type="pyramid") |
|||
- 示例项目 pages/format-u/format-u.vue 增加X轴format格式化示例 |
|||
- uCharts.js 升级至v2.1.0版本 |
|||
- uCharts.js 修复 玫瑰图面积模式点击tooltip位置不正确的bug |
|||
- uCharts.js 修复 玫瑰图点击图例,只剩一个类别显示空白的bug |
|||
- uCharts.js 修复 饼图类图点击图例,其他图表tooltip位置某些情况下不准的bug |
|||
- uCharts.js 修复 x轴为矢量轴(时间轴)情况下,点击tooltip位置不正确的bug |
|||
- uCharts.js 修复 词云图获取点击索引偶尔不准的bug |
|||
- uCharts.js 增加 直角坐标系图表X轴format格式化方法(原生uCharts.js用法请使用formatter) |
|||
- uCharts.js 增加 漏斗图扩展配置,倒三角形(opts.extra.funnel.type="triangle"),金字塔形(opts.extra.funnel.type="pyramid") |
|||
- uCharts.js 增加 散点图(opts.type="scatter")、气泡图(opts.type="bubble") |
|||
- 后期计划 完善散点图、气泡图,增加markPoints标记点,增加横向条状图。 |
|||
## 2.0.0-20210502(2021-05-02) |
|||
- uCharts.js 修复词云图获取点击索引不正确的bug |
|||
## 2.0.0-20210501(2021-05-01) |
|||
- 秋云图表组件 修复QQ小程序、百度小程序在关闭动画效果情况下,v-for循环使用图表,显示不正确的bug |
|||
## 2.0.0-20210426(2021-04-26) |
|||
- 秋云图表组件 修复QQ小程序不支持canvas2d的bug |
|||
- 秋云图表组件 修复钉钉小程序某些情况点击坐标计算错误的bug |
|||
- uCharts.js 增加 extra.column.categoryGap 参数,柱状图类每个category点位(X轴点)柱子组之间的间距 |
|||
- uCharts.js 增加 yAxis.data[i].titleOffsetY 参数,标题纵向偏移距离,负数为向上偏移,正数向下偏移 |
|||
- uCharts.js 增加 yAxis.data[i].titleOffsetX 参数,标题横向偏移距离,负数为向左偏移,正数向右偏移 |
|||
- uCharts.js 增加 extra.gauge.labelOffset 参数,仪表盘标签文字径向便宜距离,默认13px |
|||
## 2.0.0-20210422-2(2021-04-22) |
|||
秋云图表组件 修复 formatterAssign 未判断 args[key] == null 的情况导致栈溢出的 bug |
|||
## 2.0.0-20210422(2021-04-22) |
|||
- 秋云图表组件 修复H5、APP、支付宝小程序、微信小程序canvas2d模式下横屏模式的bug |
|||
## 2.0.0-20210421(2021-04-21) |
|||
- uCharts.js 修复多行图例的情况下,图例在上方或者下方时,图例float为左侧或者右侧时,第二行及以后的图例对齐方式不正确的bug |
|||
## 2.0.0-20210420(2021-04-20) |
|||
- 秋云图表组件 修复微信小程序开启canvas2d模式后,windows版微信小程序不支持canvas2d模式的bug |
|||
- 秋云图表组件 修改非uni_modules版本为v2.0版本qiun-data-charts组件 |
|||
## 2.0.0-20210419(2021-04-19) |
|||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
|||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
|||
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
|||
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
|||
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
|||
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
|||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
|||
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
|||
- uCharts.js 修复混合图中柱状图单独设置颜色不生效的bug |
|||
- uCharts.js 修复多Y轴单独设置fontSize时,开启canvas2d后,未对应放大字体的bug |
|||
## 2.0.0-20210418(2021-04-18) |
|||
- 秋云图表组件 增加directory配置,修复H5端history模式下如果发布到二级目录无法正确加载echarts.min.js的bug |
|||
## 2.0.0-20210416(2021-04-16) |
|||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
|||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
|||
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
|||
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
|||
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
|||
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
|||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
|||
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
|||
- 秋云图表组件 修复APP端某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员 |
|||
- 示例项目 修复APP端v-for循环某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员 |
|||
- uCharts.js 修复非直角坐标系tooltip提示窗右侧超出未变换方向显示的bug |
|||
## 2.0.0-20210415(2021-04-15) |
|||
- 秋云图表组件 修复H5端发布到二级目录下echarts无法加载的bug |
|||
- 秋云图表组件 修复某些情况下echarts.off('finished')移除监听事件报错的bug |
|||
## 2.0.0-20210414(2021-04-14) |
|||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
|||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
|||
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
|||
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
|||
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
|||
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
|||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
|||
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
|||
- 秋云图表组件 修复H5端在cli项目下ECharts引用地址错误的bug |
|||
- 示例项目 增加ECharts的formatter用法的示例(详见示例项目format-e.vue) |
|||
- uCharts.js 增加圆环图中心背景色的配置extra.ring.centerColor |
|||
- uCharts.js 修复微信小程序安卓端柱状图开启透明色后显示不正确的bug |
|||
## 2.0.0-20210413(2021-04-13) |
|||
- 秋云图表组件 修复百度小程序多个图表真机未能正确获取根元素dom尺寸的bug |
|||
- 秋云图表组件 修复百度小程序横屏模式方向不正确的bug |
|||
- 秋云图表组件 修改ontouch时,@getTouchStart@getTouchMove@getTouchEnd的触发条件 |
|||
- uCharts.js 修复饼图类数据格式series属性不生效的bug |
|||
- uCharts.js 增加时序区域图 详见示例项目中ucharts.vue |
|||
## 2.0.0-20210412-2(2021-04-12) |
|||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
|||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX。如仍不好用,请重启电脑,此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
|||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
|||
## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
|||
- 秋云图表组件 修复uCharts在APP端横屏模式下不能正确渲染的bug |
|||
- 示例项目 增加ECharts柱状图渐变色、圆角柱状图、横向柱状图(条状图)的示例 |
|||
## 2.0.0-20210412(2021-04-12) |
|||
- 秋云图表组件 修复created中判断echarts导致APP端无法识别,改回mounted中判断echarts初始化 |
|||
- uCharts.js 修复2d模式下series.textOffset未乘像素比的bug |
|||
## 2.0.0-20210411(2021-04-11) |
|||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
|||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,并清空小程序开发者工具缓存。 |
|||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
|||
## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
|||
- uCharts.js 折线图区域图增加connectNulls断点续连的功能,详见示例项目中ucharts.vue |
|||
- 秋云图表组件 变更初始化方法为created,变更type2d默认值为true,优化2d模式下组件初始化后dom获取不到的bug |
|||
- 秋云图表组件 修复左右布局时,右侧图表点击坐标错误的bug,修复tooltip柱状图自定义颜色显示object的bug |
|||
## 2.0.0-20210410(2021-04-10) |
|||
- 修复左右布局时,右侧图表点击坐标错误的bug,修复柱状图自定义颜色tooltip显示object的bug |
|||
- 增加标记线及柱状图自定义颜色的demo |
|||
## 2.0.0-20210409(2021-04-08) |
|||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn) |
|||
## 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
|||
- uCharts.js 修复钉钉小程序百度小程序measureText不准确的bug,修复2d模式下饼图类activeRadius为按比例放大的bug |
|||
- 修复组件在支付宝小程序端点击位置不准确的bug |
|||
## 2.0.0-20210408(2021-04-07) |
|||
- 修复组件在支付宝小程序端不能显示的bug(目前支付宝小程不能点击交互,后续修复) |
|||
- uCharts.js 修复高分屏下柱状图类,圆弧进度条 自定义宽度不能按比例放大的bug |
|||
## 2.0.0-20210407(2021-04-06) |
|||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn) |
|||
## 增加 通过tofix和unit快速格式化y轴的demo add by `howcode` |
|||
## 增加 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
|||
## 2.0.0-20210406(2021-04-05) |
|||
# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页 |
|||
## 2.0.0(2021-04-05) |
|||
# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页 |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
@ -0,0 +1,162 @@ |
|||
<template> |
|||
<view class="container loading1"> |
|||
<view class="shape shape1"></view> |
|||
<view class="shape shape2"></view> |
|||
<view class="shape shape3"></view> |
|||
<view class="shape shape4"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'loading1', |
|||
data() { |
|||
return { |
|||
|
|||
}; |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped="true"> |
|||
.container { |
|||
width: 30px; |
|||
height: 30px; |
|||
position: relative; |
|||
} |
|||
.container.loading1 { |
|||
-webkit-transform: rotate(45deg); |
|||
transform: rotate(45deg); |
|||
} |
|||
|
|||
.container .shape { |
|||
position: absolute; |
|||
width: 10px; |
|||
height: 10px; |
|||
border-radius: 1px; |
|||
} |
|||
.container .shape.shape1 { |
|||
left: 0; |
|||
background-color: #1890FF; |
|||
} |
|||
.container .shape.shape2 { |
|||
right: 0; |
|||
background-color: #91CB74; |
|||
} |
|||
.container .shape.shape3 { |
|||
bottom: 0; |
|||
background-color: #FAC858; |
|||
} |
|||
.container .shape.shape4 { |
|||
bottom: 0; |
|||
right: 0; |
|||
background-color: #EE6666; |
|||
} |
|||
|
|||
.loading1 .shape1 { |
|||
-webkit-animation: animation1shape1 0.5s ease 0s infinite alternate; |
|||
animation: animation1shape1 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation1shape1 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(16px, 16px); |
|||
transform: translate(16px, 16px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation1shape1 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(16px, 16px); |
|||
transform: translate(16px, 16px); |
|||
} |
|||
} |
|||
.loading1 .shape2 { |
|||
-webkit-animation: animation1shape2 0.5s ease 0s infinite alternate; |
|||
animation: animation1shape2 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation1shape2 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-16px, 16px); |
|||
transform: translate(-16px, 16px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation1shape2 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-16px, 16px); |
|||
transform: translate(-16px, 16px); |
|||
} |
|||
} |
|||
.loading1 .shape3 { |
|||
-webkit-animation: animation1shape3 0.5s ease 0s infinite alternate; |
|||
animation: animation1shape3 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation1shape3 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(16px, -16px); |
|||
transform: translate(16px, -16px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation1shape3 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(16px, -16px); |
|||
transform: translate(16px, -16px); |
|||
} |
|||
} |
|||
.loading1 .shape4 { |
|||
-webkit-animation: animation1shape4 0.5s ease 0s infinite alternate; |
|||
animation: animation1shape4 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation1shape4 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-16px, -16px); |
|||
transform: translate(-16px, -16px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation1shape4 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-16px, -16px); |
|||
transform: translate(-16px, -16px); |
|||
} |
|||
} |
|||
|
|||
|
|||
</style> |
@ -0,0 +1,170 @@ |
|||
<template> |
|||
<view class="container loading2"> |
|||
<view class="shape shape1"></view> |
|||
<view class="shape shape2"></view> |
|||
<view class="shape shape3"></view> |
|||
<view class="shape shape4"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'loading2', |
|||
data() { |
|||
return { |
|||
|
|||
}; |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped="true"> |
|||
.container { |
|||
width: 30px; |
|||
height: 30px; |
|||
position: relative; |
|||
} |
|||
|
|||
.container.loading2 { |
|||
-webkit-transform: rotate(10deg); |
|||
transform: rotate(10deg); |
|||
} |
|||
.container.loading2 .shape { |
|||
border-radius: 5px; |
|||
} |
|||
.container.loading2{ |
|||
-webkit-animation: rotation 1s infinite; |
|||
animation: rotation 1s infinite; |
|||
} |
|||
|
|||
.container .shape { |
|||
position: absolute; |
|||
width: 10px; |
|||
height: 10px; |
|||
border-radius: 1px; |
|||
} |
|||
.container .shape.shape1 { |
|||
left: 0; |
|||
background-color: #1890FF; |
|||
} |
|||
.container .shape.shape2 { |
|||
right: 0; |
|||
background-color: #91CB74; |
|||
} |
|||
.container .shape.shape3 { |
|||
bottom: 0; |
|||
background-color: #FAC858; |
|||
} |
|||
.container .shape.shape4 { |
|||
bottom: 0; |
|||
right: 0; |
|||
background-color: #EE6666; |
|||
} |
|||
|
|||
|
|||
.loading2 .shape1 { |
|||
-webkit-animation: animation2shape1 0.5s ease 0s infinite alternate; |
|||
animation: animation2shape1 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation2shape1 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(20px, 20px); |
|||
transform: translate(20px, 20px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation2shape1 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(20px, 20px); |
|||
transform: translate(20px, 20px); |
|||
} |
|||
} |
|||
.loading2 .shape2 { |
|||
-webkit-animation: animation2shape2 0.5s ease 0s infinite alternate; |
|||
animation: animation2shape2 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation2shape2 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-20px, 20px); |
|||
transform: translate(-20px, 20px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation2shape2 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-20px, 20px); |
|||
transform: translate(-20px, 20px); |
|||
} |
|||
} |
|||
.loading2 .shape3 { |
|||
-webkit-animation: animation2shape3 0.5s ease 0s infinite alternate; |
|||
animation: animation2shape3 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation2shape3 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(20px, -20px); |
|||
transform: translate(20px, -20px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation2shape3 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(20px, -20px); |
|||
transform: translate(20px, -20px); |
|||
} |
|||
} |
|||
.loading2 .shape4 { |
|||
-webkit-animation: animation2shape4 0.5s ease 0s infinite alternate; |
|||
animation: animation2shape4 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation2shape4 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-20px, -20px); |
|||
transform: translate(-20px, -20px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation2shape4 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-20px, -20px); |
|||
transform: translate(-20px, -20px); |
|||
} |
|||
} |
|||
|
|||
</style> |
@ -0,0 +1,173 @@ |
|||
<template> |
|||
<view class="container loading3"> |
|||
<view class="shape shape1"></view> |
|||
<view class="shape shape2"></view> |
|||
<view class="shape shape3"></view> |
|||
<view class="shape shape4"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'loading3', |
|||
data() { |
|||
return { |
|||
|
|||
}; |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped="true"> |
|||
.container { |
|||
width: 30px; |
|||
height: 30px; |
|||
position: relative; |
|||
} |
|||
|
|||
.container.loading3 { |
|||
-webkit-animation: rotation 1s infinite; |
|||
animation: rotation 1s infinite; |
|||
} |
|||
.container.loading3 .shape1 { |
|||
border-top-left-radius: 10px; |
|||
} |
|||
.container.loading3 .shape2 { |
|||
border-top-right-radius: 10px; |
|||
} |
|||
.container.loading3 .shape3 { |
|||
border-bottom-left-radius: 10px; |
|||
} |
|||
.container.loading3 .shape4 { |
|||
border-bottom-right-radius: 10px; |
|||
} |
|||
|
|||
.container .shape { |
|||
position: absolute; |
|||
width: 10px; |
|||
height: 10px; |
|||
border-radius: 1px; |
|||
} |
|||
.container .shape.shape1 { |
|||
left: 0; |
|||
background-color: #1890FF; |
|||
} |
|||
.container .shape.shape2 { |
|||
right: 0; |
|||
background-color: #91CB74; |
|||
} |
|||
.container .shape.shape3 { |
|||
bottom: 0; |
|||
background-color: #FAC858; |
|||
} |
|||
.container .shape.shape4 { |
|||
bottom: 0; |
|||
right: 0; |
|||
background-color: #EE6666; |
|||
} |
|||
|
|||
.loading3 .shape1 { |
|||
-webkit-animation: animation3shape1 0.5s ease 0s infinite alternate; |
|||
animation: animation3shape1 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation3shape1 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(5px, 5px); |
|||
transform: translate(5px, 5px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation3shape1 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(5px, 5px); |
|||
transform: translate(5px, 5px); |
|||
} |
|||
} |
|||
.loading3 .shape2 { |
|||
-webkit-animation: animation3shape2 0.5s ease 0s infinite alternate; |
|||
animation: animation3shape2 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation3shape2 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-5px, 5px); |
|||
transform: translate(-5px, 5px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation3shape2 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-5px, 5px); |
|||
transform: translate(-5px, 5px); |
|||
} |
|||
} |
|||
.loading3 .shape3 { |
|||
-webkit-animation: animation3shape3 0.5s ease 0s infinite alternate; |
|||
animation: animation3shape3 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation3shape3 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(5px, -5px); |
|||
transform: translate(5px, -5px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation3shape3 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(5px, -5px); |
|||
transform: translate(5px, -5px); |
|||
} |
|||
} |
|||
.loading3 .shape4 { |
|||
-webkit-animation: animation3shape4 0.5s ease 0s infinite alternate; |
|||
animation: animation3shape4 0.5s ease 0s infinite alternate; |
|||
} |
|||
|
|||
@-webkit-keyframes animation3shape4 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-5px, -5px); |
|||
transform: translate(-5px, -5px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation3shape4 { |
|||
from { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
to { |
|||
-webkit-transform: translate(-5px, -5px); |
|||
transform: translate(-5px, -5px); |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,222 @@ |
|||
<template> |
|||
<view class="container loading5"> |
|||
<view class="shape shape1"></view> |
|||
<view class="shape shape2"></view> |
|||
<view class="shape shape3"></view> |
|||
<view class="shape shape4"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'loading5', |
|||
data() { |
|||
return { |
|||
|
|||
}; |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped="true"> |
|||
.container { |
|||
width: 30px; |
|||
height: 30px; |
|||
position: relative; |
|||
} |
|||
|
|||
.container.loading5 .shape { |
|||
width: 15px; |
|||
height: 15px; |
|||
} |
|||
|
|||
.container .shape { |
|||
position: absolute; |
|||
width: 10px; |
|||
height: 10px; |
|||
border-radius: 1px; |
|||
} |
|||
.container .shape.shape1 { |
|||
left: 0; |
|||
background-color: #1890FF; |
|||
} |
|||
.container .shape.shape2 { |
|||
right: 0; |
|||
background-color: #91CB74; |
|||
} |
|||
.container .shape.shape3 { |
|||
bottom: 0; |
|||
background-color: #FAC858; |
|||
} |
|||
.container .shape.shape4 { |
|||
bottom: 0; |
|||
right: 0; |
|||
background-color: #EE6666; |
|||
} |
|||
|
|||
.loading5 .shape1 { |
|||
animation: animation5shape1 2s ease 0s infinite reverse; |
|||
} |
|||
|
|||
@-webkit-keyframes animation5shape1 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(0, 15px); |
|||
transform: translate(0, 15px); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(15px, 15px); |
|||
transform: translate(15px, 15px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(15px, 0); |
|||
transform: translate(15px, 0); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation5shape1 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(0, 15px); |
|||
transform: translate(0, 15px); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(15px, 15px); |
|||
transform: translate(15px, 15px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(15px, 0); |
|||
transform: translate(15px, 0); |
|||
} |
|||
} |
|||
.loading5 .shape2 { |
|||
animation: animation5shape2 2s ease 0s infinite reverse; |
|||
} |
|||
|
|||
@-webkit-keyframes animation5shape2 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(-15px, 0); |
|||
transform: translate(-15px, 0); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(-15px, 15px); |
|||
transform: translate(-15px, 15px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(0, 15px); |
|||
transform: translate(0, 15px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation5shape2 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(-15px, 0); |
|||
transform: translate(-15px, 0); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(-15px, 15px); |
|||
transform: translate(-15px, 15px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(0, 15px); |
|||
transform: translate(0, 15px); |
|||
} |
|||
} |
|||
.loading5 .shape3 { |
|||
animation: animation5shape3 2s ease 0s infinite reverse; |
|||
} |
|||
|
|||
@-webkit-keyframes animation5shape3 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(15px, 0); |
|||
transform: translate(15px, 0); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(15px, -15px); |
|||
transform: translate(15px, -15px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(0, -15px); |
|||
transform: translate(0, -15px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation5shape3 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(15px, 0); |
|||
transform: translate(15px, 0); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(15px, -15px); |
|||
transform: translate(15px, -15px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(0, -15px); |
|||
transform: translate(0, -15px); |
|||
} |
|||
} |
|||
.loading5 .shape4 { |
|||
animation: animation5shape4 2s ease 0s infinite reverse; |
|||
} |
|||
|
|||
@-webkit-keyframes animation5shape4 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(0, -15px); |
|||
transform: translate(0, -15px); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(-15px, -15px); |
|||
transform: translate(-15px, -15px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(-15px, 0); |
|||
transform: translate(-15px, 0); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation5shape4 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(0, -15px); |
|||
transform: translate(0, -15px); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(-15px, -15px); |
|||
transform: translate(-15px, -15px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(-15px, 0); |
|||
transform: translate(-15px, 0); |
|||
} |
|||
} |
|||
|
|||
</style> |
@ -0,0 +1,229 @@ |
|||
<template> |
|||
<view class="container loading6"> |
|||
<view class="shape shape1"></view> |
|||
<view class="shape shape2"></view> |
|||
<view class="shape shape3"></view> |
|||
<view class="shape shape4"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'loading6', |
|||
data() { |
|||
return { |
|||
|
|||
}; |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped="true"> |
|||
.container { |
|||
width: 30px; |
|||
height: 30px; |
|||
position: relative; |
|||
} |
|||
|
|||
.container.loading6 { |
|||
-webkit-animation: rotation 1s infinite; |
|||
animation: rotation 1s infinite; |
|||
} |
|||
.container.loading6 .shape { |
|||
width: 12px; |
|||
height: 12px; |
|||
border-radius: 2px; |
|||
} |
|||
.container .shape { |
|||
position: absolute; |
|||
width: 10px; |
|||
height: 10px; |
|||
border-radius: 1px; |
|||
} |
|||
.container .shape.shape1 { |
|||
left: 0; |
|||
background-color: #1890FF; |
|||
} |
|||
.container .shape.shape2 { |
|||
right: 0; |
|||
background-color: #91CB74; |
|||
} |
|||
.container .shape.shape3 { |
|||
bottom: 0; |
|||
background-color: #FAC858; |
|||
} |
|||
.container .shape.shape4 { |
|||
bottom: 0; |
|||
right: 0; |
|||
background-color: #EE6666; |
|||
} |
|||
|
|||
|
|||
.loading6 .shape1 { |
|||
-webkit-animation: animation6shape1 2s linear 0s infinite normal; |
|||
animation: animation6shape1 2s linear 0s infinite normal; |
|||
} |
|||
|
|||
@-webkit-keyframes animation6shape1 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(0, 18px); |
|||
transform: translate(0, 18px); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(18px, 18px); |
|||
transform: translate(18px, 18px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(18px, 0); |
|||
transform: translate(18px, 0); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation6shape1 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(0, 18px); |
|||
transform: translate(0, 18px); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(18px, 18px); |
|||
transform: translate(18px, 18px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(18px, 0); |
|||
transform: translate(18px, 0); |
|||
} |
|||
} |
|||
.loading6 .shape2 { |
|||
-webkit-animation: animation6shape2 2s linear 0s infinite normal; |
|||
animation: animation6shape2 2s linear 0s infinite normal; |
|||
} |
|||
|
|||
@-webkit-keyframes animation6shape2 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(-18px, 0); |
|||
transform: translate(-18px, 0); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(-18px, 18px); |
|||
transform: translate(-18px, 18px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(0, 18px); |
|||
transform: translate(0, 18px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation6shape2 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(-18px, 0); |
|||
transform: translate(-18px, 0); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(-18px, 18px); |
|||
transform: translate(-18px, 18px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(0, 18px); |
|||
transform: translate(0, 18px); |
|||
} |
|||
} |
|||
.loading6 .shape3 { |
|||
-webkit-animation: animation6shape3 2s linear 0s infinite normal; |
|||
animation: animation6shape3 2s linear 0s infinite normal; |
|||
} |
|||
|
|||
@-webkit-keyframes animation6shape3 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(18px, 0); |
|||
transform: translate(18px, 0); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(18px, -18px); |
|||
transform: translate(18px, -18px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(0, -18px); |
|||
transform: translate(0, -18px); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation6shape3 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(18px, 0); |
|||
transform: translate(18px, 0); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(18px, -18px); |
|||
transform: translate(18px, -18px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(0, -18px); |
|||
transform: translate(0, -18px); |
|||
} |
|||
} |
|||
.loading6 .shape4 { |
|||
-webkit-animation: animation6shape4 2s linear 0s infinite normal; |
|||
animation: animation6shape4 2s linear 0s infinite normal; |
|||
} |
|||
|
|||
@-webkit-keyframes animation6shape4 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(0, -18px); |
|||
transform: translate(0, -18px); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(-18px, -18px); |
|||
transform: translate(-18px, -18px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(-18px, 0); |
|||
transform: translate(-18px, 0); |
|||
} |
|||
} |
|||
|
|||
@keyframes animation6shape4 { |
|||
0% { |
|||
-webkit-transform: translate(0, 0); |
|||
transform: translate(0, 0); |
|||
} |
|||
25% { |
|||
-webkit-transform: translate(0, -18px); |
|||
transform: translate(0, -18px); |
|||
} |
|||
50% { |
|||
-webkit-transform: translate(-18px, -18px); |
|||
transform: translate(-18px, -18px); |
|||
} |
|||
75% { |
|||
-webkit-transform: translate(-18px, 0); |
|||
transform: translate(-18px, 0); |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,36 @@ |
|||
<template> |
|||
<view> |
|||
<Loading1 v-if="loadingType==1"/> |
|||
<Loading2 v-if="loadingType==2"/> |
|||
<Loading3 v-if="loadingType==3"/> |
|||
<Loading4 v-if="loadingType==4"/> |
|||
<Loading5 v-if="loadingType==5"/> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import Loading1 from "./loading1.vue"; |
|||
import Loading2 from "./loading2.vue"; |
|||
import Loading3 from "./loading3.vue"; |
|||
import Loading4 from "./loading4.vue"; |
|||
import Loading5 from "./loading5.vue"; |
|||
export default { |
|||
components:{Loading1,Loading2,Loading3,Loading4,Loading5}, |
|||
name: 'qiun-loading', |
|||
props: { |
|||
loadingType: { |
|||
type: Number, |
|||
default: 2 |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
|
|||
}; |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
|
|||
</style> |
@ -0,0 +1,422 @@ |
|||
/* |
|||
* uCharts® |
|||
* 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台 |
|||
* Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
|
|||
* Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
|||
* 复制使用请保留本段注释,感谢支持开源! |
|||
* |
|||
* uCharts®官方网站 |
|||
* https://www.uCharts.cn
|
|||
* |
|||
* 开源地址: |
|||
* https://gitee.com/uCharts/uCharts
|
|||
* |
|||
* uni-app插件市场地址: |
|||
* http://ext.dcloud.net.cn/plugin?id=271
|
|||
* |
|||
*/ |
|||
|
|||
// 通用配置项
|
|||
|
|||
// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
|
|||
const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc']; |
|||
|
|||
const cfe = { |
|||
//demotype为自定义图表类型
|
|||
"type": ["pie", "ring", "rose", "funnel", "line", "column", "area", "radar", "gauge","candle","demotype"], |
|||
//增加自定义图表类型,如果需要categories,请在这里加入您的图表类型例如最后的"demotype"
|
|||
"categories": ["line", "column", "area", "radar", "gauge", "candle","demotype"], |
|||
//instance为实例变量承载属性,option为eopts承载属性,不要删除
|
|||
"instance": {}, |
|||
"option": {}, |
|||
//下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
|
|||
"formatter":{ |
|||
"tooltipDemo1":function(res){ |
|||
let result = '' |
|||
for (let i in res) { |
|||
if (i == 0) { |
|||
result += res[i].axisValueLabel + '年销售额' |
|||
} |
|||
let value = '--' |
|||
if (res[i].data !== null) { |
|||
value = res[i].data |
|||
} |
|||
// #ifdef H5
|
|||
result += '\n' + res[i].seriesName + ':' + value + ' 万元' |
|||
// #endif
|
|||
|
|||
// #ifdef APP-PLUS
|
|||
result += '<br/>' + res[i].marker + res[i].seriesName + ':' + value + ' 万元' |
|||
// #endif
|
|||
} |
|||
return result; |
|||
}, |
|||
legendFormat:function(name){ |
|||
return "自定义图例+"+name; |
|||
}, |
|||
yAxisFormatDemo:function (value, index) { |
|||
return value + '元'; |
|||
}, |
|||
seriesFormatDemo:function(res){ |
|||
return res.name + '年' + res.value + '元'; |
|||
} |
|||
}, |
|||
//这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在eopts参数,会将demotype与eopts中option合并后渲染图表。
|
|||
"demotype":{ |
|||
"color": color, |
|||
//在这里填写echarts的option即可
|
|||
|
|||
}, |
|||
//下面是自定义配置,请添加项目所需的通用配置
|
|||
"column": { |
|||
"color": color, |
|||
"title": { |
|||
"text": '' |
|||
}, |
|||
"tooltip": { |
|||
"trigger": 'axis' |
|||
}, |
|||
"grid": { |
|||
"top": 30, |
|||
"bottom": 50, |
|||
"right": 15, |
|||
"left": 40 |
|||
}, |
|||
"legend": { |
|||
"bottom": 'left', |
|||
}, |
|||
"toolbox": { |
|||
"show": false, |
|||
}, |
|||
"xAxis": { |
|||
"type": 'category', |
|||
"axisLabel": { |
|||
"color": '#666666' |
|||
}, |
|||
"axisLine": { |
|||
"lineStyle": { |
|||
"color": '#CCCCCC' |
|||
} |
|||
}, |
|||
"boundaryGap": true, |
|||
"data": [] |
|||
}, |
|||
"yAxis": { |
|||
"type": 'value', |
|||
"axisTick": { |
|||
"show": false, |
|||
}, |
|||
"axisLabel": { |
|||
"color": '#666666' |
|||
}, |
|||
"axisLine": { |
|||
"lineStyle": { |
|||
"color": '#CCCCCC' |
|||
} |
|||
}, |
|||
}, |
|||
"seriesTemplate": { |
|||
"name": '', |
|||
"type": 'bar', |
|||
"data": [], |
|||
"barwidth": 20, |
|||
"label": { |
|||
"show": true, |
|||
"color": "#666666", |
|||
"position": 'top', |
|||
}, |
|||
}, |
|||
}, |
|||
"line": { |
|||
"color": color, |
|||
"title": { |
|||
"text": '' |
|||
}, |
|||
"tooltip": { |
|||
"trigger": 'axis' |
|||
}, |
|||
"grid": { |
|||
"top": 30, |
|||
"bottom": 50, |
|||
"right": 15, |
|||
"left": 40 |
|||
}, |
|||
"legend": { |
|||
"bottom": 'left', |
|||
}, |
|||
"toolbox": { |
|||
"show": false, |
|||
}, |
|||
"xAxis": { |
|||
"type": 'category', |
|||
"axisLabel": { |
|||
"color": '#666666' |
|||
}, |
|||
"axisLine": { |
|||
"lineStyle": { |
|||
"color": '#CCCCCC' |
|||
} |
|||
}, |
|||
"boundaryGap": true, |
|||
"data": [] |
|||
}, |
|||
"yAxis": { |
|||
"type": 'value', |
|||
"axisTick": { |
|||
"show": false, |
|||
}, |
|||
"axisLabel": { |
|||
"color": '#666666' |
|||
}, |
|||
"axisLine": { |
|||
"lineStyle": { |
|||
"color": '#CCCCCC' |
|||
} |
|||
}, |
|||
}, |
|||
"seriesTemplate": { |
|||
"name": '', |
|||
"type": 'line', |
|||
"data": [], |
|||
"barwidth": 20, |
|||
"label": { |
|||
"show": true, |
|||
"color": "#666666", |
|||
"position": 'top', |
|||
}, |
|||
}, |
|||
}, |
|||
"area": { |
|||
"color": color, |
|||
"title": { |
|||
"text": '' |
|||
}, |
|||
"tooltip": { |
|||
"trigger": 'axis' |
|||
}, |
|||
"grid": { |
|||
"top": 30, |
|||
"bottom": 50, |
|||
"right": 15, |
|||
"left": 40 |
|||
}, |
|||
"legend": { |
|||
"bottom": 'left', |
|||
}, |
|||
"toolbox": { |
|||
"show": false, |
|||
}, |
|||
"xAxis": { |
|||
"type": 'category', |
|||
"axisLabel": { |
|||
"color": '#666666' |
|||
}, |
|||
"axisLine": { |
|||
"lineStyle": { |
|||
"color": '#CCCCCC' |
|||
} |
|||
}, |
|||
"boundaryGap": true, |
|||
"data": [] |
|||
}, |
|||
"yAxis": { |
|||
"type": 'value', |
|||
"axisTick": { |
|||
"show": false, |
|||
}, |
|||
"axisLabel": { |
|||
"color": '#666666' |
|||
}, |
|||
"axisLine": { |
|||
"lineStyle": { |
|||
"color": '#CCCCCC' |
|||
} |
|||
}, |
|||
}, |
|||
"seriesTemplate": { |
|||
"name": '', |
|||
"type": 'line', |
|||
"data": [], |
|||
"areaStyle": {}, |
|||
"label": { |
|||
"show": true, |
|||
"color": "#666666", |
|||
"position": 'top', |
|||
}, |
|||
}, |
|||
}, |
|||
"pie": { |
|||
"color": color, |
|||
"title": { |
|||
"text": '' |
|||
}, |
|||
"tooltip": { |
|||
"trigger": 'item' |
|||
}, |
|||
"grid": { |
|||
"top": 40, |
|||
"bottom": 30, |
|||
"right": 15, |
|||
"left": 15 |
|||
}, |
|||
"legend": { |
|||
"bottom": 'left', |
|||
}, |
|||
"seriesTemplate": { |
|||
"name": '', |
|||
"type": 'pie', |
|||
"data": [], |
|||
"radius": '50%', |
|||
"label": { |
|||
"show": true, |
|||
"color": "#666666", |
|||
"position": 'top', |
|||
}, |
|||
}, |
|||
}, |
|||
"ring": { |
|||
"color": color, |
|||
"title": { |
|||
"text": '' |
|||
}, |
|||
"tooltip": { |
|||
"trigger": 'item' |
|||
}, |
|||
"grid": { |
|||
"top": 40, |
|||
"bottom": 30, |
|||
"right": 15, |
|||
"left": 15 |
|||
}, |
|||
"legend": { |
|||
"bottom": 'left', |
|||
}, |
|||
"seriesTemplate": { |
|||
"name": '', |
|||
"type": 'pie', |
|||
"data": [], |
|||
"radius": ['40%', '70%'], |
|||
"avoidLabelOverlap": false, |
|||
"label": { |
|||
"show": true, |
|||
"color": "#666666", |
|||
"position": 'top', |
|||
}, |
|||
"labelLine": { |
|||
"show": true |
|||
}, |
|||
}, |
|||
}, |
|||
"rose": { |
|||
"color": color, |
|||
"title": { |
|||
"text": '' |
|||
}, |
|||
"tooltip": { |
|||
"trigger": 'item' |
|||
}, |
|||
"legend": { |
|||
"top": 'bottom' |
|||
}, |
|||
"seriesTemplate": { |
|||
"name": '', |
|||
"type": 'pie', |
|||
"data": [], |
|||
"radius": "55%", |
|||
"center": ['50%', '50%'], |
|||
"roseType": 'area', |
|||
}, |
|||
}, |
|||
"funnel": { |
|||
"color": color, |
|||
"title": { |
|||
"text": '' |
|||
}, |
|||
"tooltip": { |
|||
"trigger": 'item', |
|||
"formatter": "{b} : {c}%" |
|||
}, |
|||
"legend": { |
|||
"top": 'bottom' |
|||
}, |
|||
"seriesTemplate": { |
|||
"name": '', |
|||
"type": 'funnel', |
|||
"left": '10%', |
|||
"top": 60, |
|||
"bottom": 60, |
|||
"width": '80%', |
|||
"min": 0, |
|||
"max": 100, |
|||
"minSize": '0%', |
|||
"maxSize": '100%', |
|||
"sort": 'descending', |
|||
"gap": 2, |
|||
"label": { |
|||
"show": true, |
|||
"position": 'inside' |
|||
}, |
|||
"labelLine": { |
|||
"length": 10, |
|||
"lineStyle": { |
|||
"width": 1, |
|||
"type": 'solid' |
|||
} |
|||
}, |
|||
"itemStyle": { |
|||
"bordercolor": '#fff', |
|||
"borderwidth": 1 |
|||
}, |
|||
"emphasis": { |
|||
"label": { |
|||
"fontSize": 20 |
|||
} |
|||
}, |
|||
"data": [], |
|||
}, |
|||
}, |
|||
"gauge": { |
|||
"color": color, |
|||
"tooltip": { |
|||
"formatter": '{a} <br/>{b} : {c}%' |
|||
}, |
|||
"seriesTemplate": { |
|||
"name": '业务指标', |
|||
"type": 'gauge', |
|||
"detail": {"formatter": '{value}%'}, |
|||
"data": [{"value": 50, "name": '完成率'}] |
|||
}, |
|||
}, |
|||
"candle": { |
|||
"xAxis": { |
|||
"data": [] |
|||
}, |
|||
"yAxis": {}, |
|||
"color": color, |
|||
"title": { |
|||
"text": '' |
|||
}, |
|||
"dataZoom": [{ |
|||
"type": 'inside', |
|||
"xAxisIndex": [0, 1], |
|||
"start": 10, |
|||
"end": 100 |
|||
}, |
|||
{ |
|||
"show": true, |
|||
"xAxisIndex": [0, 1], |
|||
"type": 'slider', |
|||
"bottom": 10, |
|||
"start": 10, |
|||
"end": 100 |
|||
} |
|||
], |
|||
"seriesTemplate": { |
|||
"name": '', |
|||
"type": 'k', |
|||
"data": [], |
|||
}, |
|||
} |
|||
} |
|||
|
|||
export default cfe; |
@ -0,0 +1,606 @@ |
|||
/* |
|||
* uCharts® |
|||
* 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台 |
|||
* Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
|
|||
* Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
|||
* 复制使用请保留本段注释,感谢支持开源! |
|||
* |
|||
* uCharts®官方网站 |
|||
* https://www.uCharts.cn
|
|||
* |
|||
* 开源地址: |
|||
* https://gitee.com/uCharts/uCharts
|
|||
* |
|||
* uni-app插件市场地址: |
|||
* http://ext.dcloud.net.cn/plugin?id=271
|
|||
* |
|||
*/ |
|||
|
|||
// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
|
|||
const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc']; |
|||
|
|||
//事件转换函数,主要用作格式化x轴为时间轴,根据需求自行修改
|
|||
const formatDateTime = (timeStamp, returnType)=>{ |
|||
var date = new Date(); |
|||
date.setTime(timeStamp * 1000); |
|||
var y = date.getFullYear(); |
|||
var m = date.getMonth() + 1; |
|||
m = m < 10 ? ('0' + m) : m; |
|||
var d = date.getDate(); |
|||
d = d < 10 ? ('0' + d) : d; |
|||
var h = date.getHours(); |
|||
h = h < 10 ? ('0' + h) : h; |
|||
var minute = date.getMinutes(); |
|||
var second = date.getSeconds(); |
|||
minute = minute < 10 ? ('0' + minute) : minute; |
|||
second = second < 10 ? ('0' + second) : second; |
|||
if(returnType == 'full'){return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;} |
|||
if(returnType == 'y-m-d'){return y + '-' + m + '-' + d;} |
|||
if(returnType == 'h:m'){return h +':' + minute;} |
|||
if(returnType == 'h:m:s'){return h +':' + minute +':' + second;} |
|||
return [y, m, d, h, minute, second]; |
|||
} |
|||
|
|||
const cfu = { |
|||
//demotype为自定义图表类型,一般不需要自定义图表类型,只需要改根节点上对应的类型即可
|
|||
"type":["pie","ring","rose","word","funnel","map","arcbar","line","column","mount","bar","area","radar","gauge","candle","mix","tline","tarea","scatter","bubble","demotype"], |
|||
"range":["饼状图","圆环图","玫瑰图","词云图","漏斗图","地图","圆弧进度条","折线图","柱状图","山峰图","条状图","区域图","雷达图","仪表盘","K线图","混合图","时间轴折线","时间轴区域","散点图","气泡图","自定义类型"], |
|||
//增加自定义图表类型,如果需要categories,请在这里加入您的图表类型,例如最后的"demotype"
|
|||
//自定义类型时需要注意"tline","tarea","scatter","bubble"等时间轴(矢量x轴)类图表,没有categories,不需要加入categories
|
|||
"categories":["line","column","mount","bar","area","radar","gauge","candle","mix","demotype"], |
|||
//instance为实例变量承载属性,不要删除
|
|||
"instance":{}, |
|||
//option为opts及eopts承载属性,不要删除
|
|||
"option":{}, |
|||
//下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
|
|||
"formatter":{ |
|||
"yAxisDemo1":function(val, index, opts){return val+'元'}, |
|||
"yAxisDemo2":function(val, index, opts){return val.toFixed(2)}, |
|||
"xAxisDemo1":function(val, index, opts){return val+'年';}, |
|||
"xAxisDemo2":function(val, index, opts){return formatDateTime(val,'h:m')}, |
|||
"seriesDemo1":function(val, index, series, opts){return val+'元'}, |
|||
"tooltipDemo1":function(item, category, index, opts){ |
|||
if(index==0){ |
|||
return '随便用'+item.data+'年' |
|||
}else{ |
|||
return '其他我没改'+item.data+'天' |
|||
} |
|||
}, |
|||
"pieDemo":function(val, index, series, opts){ |
|||
if(index !== undefined){ |
|||
return series[index].name+':'+series[index].data+'元' |
|||
} |
|||
}, |
|||
}, |
|||
//这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在opts参数,会将demotype与opts中option合并后渲染图表。
|
|||
"demotype":{ |
|||
//我这里把曲线图当做了自定义图表类型,您可以根据需要随意指定类型或配置
|
|||
"type": "line", |
|||
"color": color, |
|||
"padding": [15,10,0,15], |
|||
"xAxis": { |
|||
"disableGrid": true, |
|||
}, |
|||
"yAxis": { |
|||
"gridType": "dash", |
|||
"dashLength": 2, |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"line": { |
|||
"type": "curve", |
|||
"width": 2 |
|||
}, |
|||
} |
|||
}, |
|||
//下面是自定义配置,请添加项目所需的通用配置
|
|||
"pie":{ |
|||
"type": "pie", |
|||
"color": color, |
|||
"padding": [5,5,5,5], |
|||
"extra": { |
|||
"pie": { |
|||
"activeOpacity": 0.5, |
|||
"activeRadius": 10, |
|||
"offsetAngle": 0, |
|||
"labelWidth": 15, |
|||
"border": true, |
|||
"borderWidth": 3, |
|||
"borderColor": "#FFFFFF" |
|||
}, |
|||
} |
|||
}, |
|||
"ring":{ |
|||
"type": "ring", |
|||
"color": color, |
|||
"padding": [5,5,5,5], |
|||
"rotate": false, |
|||
"dataLabel": true, |
|||
"legend": { |
|||
"show": true, |
|||
"position": "right", |
|||
"lineHeight": 25, |
|||
}, |
|||
"title": { |
|||
"name": "收益率", |
|||
"fontSize": 15, |
|||
"color": "#666666" |
|||
}, |
|||
"subtitle": { |
|||
"name": "70%", |
|||
"fontSize": 25, |
|||
"color": "#7cb5ec" |
|||
}, |
|||
"extra": { |
|||
"ring": { |
|||
"ringWidth":30, |
|||
"activeOpacity": 0.5, |
|||
"activeRadius": 10, |
|||
"offsetAngle": 0, |
|||
"labelWidth": 15, |
|||
"border": true, |
|||
"borderWidth": 3, |
|||
"borderColor": "#FFFFFF" |
|||
}, |
|||
}, |
|||
}, |
|||
"rose":{ |
|||
"type": "rose", |
|||
"color": color, |
|||
"padding": [5,5,5,5], |
|||
"legend": { |
|||
"show": true, |
|||
"position": "left", |
|||
"lineHeight": 25, |
|||
}, |
|||
"extra": { |
|||
"rose": { |
|||
"type": "area", |
|||
"minRadius": 50, |
|||
"activeOpacity": 0.5, |
|||
"activeRadius": 10, |
|||
"offsetAngle": 0, |
|||
"labelWidth": 15, |
|||
"border": false, |
|||
"borderWidth": 2, |
|||
"borderColor": "#FFFFFF" |
|||
}, |
|||
} |
|||
}, |
|||
"word":{ |
|||
"type": "word", |
|||
"color": color, |
|||
"extra": { |
|||
"word": { |
|||
"type": "normal", |
|||
"autoColors": false |
|||
} |
|||
} |
|||
}, |
|||
"funnel":{ |
|||
"type": "funnel", |
|||
"color": color, |
|||
"padding": [15,15,0,15], |
|||
"extra": { |
|||
"funnel": { |
|||
"activeOpacity": 0.3, |
|||
"activeWidth": 10, |
|||
"border": true, |
|||
"borderWidth": 2, |
|||
"borderColor": "#FFFFFF", |
|||
"fillOpacity": 1, |
|||
"labelAlign": "right" |
|||
}, |
|||
} |
|||
}, |
|||
"map":{ |
|||
"type": "map", |
|||
"color": color, |
|||
"padding": [0,0,0,0], |
|||
"dataLabel": true, |
|||
"extra": { |
|||
"map": { |
|||
"border": true, |
|||
"borderWidth": 1, |
|||
"borderColor": "#666666", |
|||
"fillOpacity": 0.6, |
|||
"activeBorderColor": "#F04864", |
|||
"activeFillColor": "#FACC14", |
|||
"activeFillOpacity": 1 |
|||
}, |
|||
} |
|||
}, |
|||
"arcbar":{ |
|||
"type": "arcbar", |
|||
"color": color, |
|||
"title": { |
|||
"name": "百分比", |
|||
"fontSize": 25, |
|||
"color": "#00FF00" |
|||
}, |
|||
"subtitle": { |
|||
"name": "默认标题", |
|||
"fontSize": 15, |
|||
"color": "#666666" |
|||
}, |
|||
"extra": { |
|||
"arcbar": { |
|||
"type": "default", |
|||
"width": 12, |
|||
"backgroundColor": "#E9E9E9", |
|||
"startAngle": 0.75, |
|||
"endAngle": 0.25, |
|||
"gap": 2 |
|||
} |
|||
} |
|||
}, |
|||
"line":{ |
|||
"type": "line", |
|||
"color": color, |
|||
"padding": [15,10,0,15], |
|||
"xAxis": { |
|||
"disableGrid": true, |
|||
}, |
|||
"yAxis": { |
|||
"gridType": "dash", |
|||
"dashLength": 2, |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"line": { |
|||
"type": "straight", |
|||
"width": 2, |
|||
"activeType": "hollow" |
|||
}, |
|||
} |
|||
}, |
|||
"tline":{ |
|||
"type": "line", |
|||
"color": color, |
|||
"padding": [15,10,0,15], |
|||
"xAxis": { |
|||
"disableGrid": false, |
|||
"boundaryGap":"justify", |
|||
}, |
|||
"yAxis": { |
|||
"gridType": "dash", |
|||
"dashLength": 2, |
|||
"data":[ |
|||
{ |
|||
"min":0, |
|||
"max":80 |
|||
} |
|||
] |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"line": { |
|||
"type": "curve", |
|||
"width": 2, |
|||
"activeType": "hollow" |
|||
}, |
|||
} |
|||
}, |
|||
"tarea":{ |
|||
"type": "area", |
|||
"color": color, |
|||
"padding": [15,10,0,15], |
|||
"xAxis": { |
|||
"disableGrid": true, |
|||
"boundaryGap":"justify", |
|||
}, |
|||
"yAxis": { |
|||
"gridType": "dash", |
|||
"dashLength": 2, |
|||
"data":[ |
|||
{ |
|||
"min":0, |
|||
"max":80 |
|||
} |
|||
] |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"area": { |
|||
"type": "curve", |
|||
"opacity": 0.2, |
|||
"addLine": true, |
|||
"width": 2, |
|||
"gradient": true, |
|||
"activeType": "hollow" |
|||
}, |
|||
} |
|||
}, |
|||
"column":{ |
|||
"type": "column", |
|||
"color": color, |
|||
"padding": [15,15,0,5], |
|||
"xAxis": { |
|||
"disableGrid": true, |
|||
}, |
|||
"yAxis": { |
|||
"data":[{"min":0}] |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"column": { |
|||
"type": "group", |
|||
"width": 30, |
|||
"activeBgColor": "#000000", |
|||
"activeBgOpacity": 0.08 |
|||
}, |
|||
} |
|||
}, |
|||
"mount":{ |
|||
"type": "mount", |
|||
"color": color, |
|||
"padding": [15,15,0,5], |
|||
"xAxis": { |
|||
"disableGrid": true, |
|||
}, |
|||
"yAxis": { |
|||
"data":[{"min":0}] |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"mount": { |
|||
"type": "mount", |
|||
"widthRatio": 1.5, |
|||
}, |
|||
} |
|||
}, |
|||
"bar":{ |
|||
"type": "bar", |
|||
"color": color, |
|||
"padding": [15,30,0,5], |
|||
"xAxis": { |
|||
"boundaryGap":"justify", |
|||
"disableGrid":false, |
|||
"min":0, |
|||
"axisLine":false |
|||
}, |
|||
"yAxis": { |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"bar": { |
|||
"type": "group", |
|||
"width": 30, |
|||
"meterBorde": 1, |
|||
"meterFillColor": "#FFFFFF", |
|||
"activeBgColor": "#000000", |
|||
"activeBgOpacity": 0.08 |
|||
}, |
|||
} |
|||
}, |
|||
"area":{ |
|||
"type": "area", |
|||
"color": color, |
|||
"padding": [15,15,0,15], |
|||
"xAxis": { |
|||
"disableGrid": true, |
|||
}, |
|||
"yAxis": { |
|||
"gridType": "dash", |
|||
"dashLength": 2, |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"area": { |
|||
"type": "straight", |
|||
"opacity": 0.2, |
|||
"addLine": true, |
|||
"width": 2, |
|||
"gradient": false, |
|||
"activeType": "hollow" |
|||
}, |
|||
} |
|||
}, |
|||
"radar":{ |
|||
"type": "radar", |
|||
"color": color, |
|||
"padding": [5,5,5,5], |
|||
"dataLabel": false, |
|||
"legend": { |
|||
"show": true, |
|||
"position": "right", |
|||
"lineHeight": 25, |
|||
}, |
|||
"extra": { |
|||
"radar": { |
|||
"gridType": "radar", |
|||
"gridColor": "#CCCCCC", |
|||
"gridCount": 3, |
|||
"opacity": 0.2, |
|||
"max": 200, |
|||
"labelShow": true |
|||
}, |
|||
} |
|||
}, |
|||
"gauge":{ |
|||
"type": "gauge", |
|||
"color": color, |
|||
"title": { |
|||
"name": "66Km/H", |
|||
"fontSize": 25, |
|||
"color": "#2fc25b", |
|||
"offsetY": 50 |
|||
}, |
|||
"subtitle": { |
|||
"name": "实时速度", |
|||
"fontSize": 15, |
|||
"color": "#1890ff", |
|||
"offsetY": -50 |
|||
}, |
|||
"extra": { |
|||
"gauge": { |
|||
"type": "default", |
|||
"width": 30, |
|||
"labelColor": "#666666", |
|||
"startAngle": 0.75, |
|||
"endAngle": 0.25, |
|||
"startNumber": 0, |
|||
"endNumber": 100, |
|||
"labelFormat": "", |
|||
"splitLine": { |
|||
"fixRadius": 0, |
|||
"splitNumber": 10, |
|||
"width": 30, |
|||
"color": "#FFFFFF", |
|||
"childNumber": 5, |
|||
"childWidth": 12 |
|||
}, |
|||
"pointer": { |
|||
"width": 24, |
|||
"color": "auto" |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
"candle":{ |
|||
"type": "candle", |
|||
"color": color, |
|||
"padding": [15,15,0,15], |
|||
"enableScroll": true, |
|||
"enableMarkLine": true, |
|||
"dataLabel": false, |
|||
"xAxis": { |
|||
"labelCount": 4, |
|||
"itemCount": 40, |
|||
"disableGrid": true, |
|||
"gridColor": "#CCCCCC", |
|||
"gridType": "solid", |
|||
"dashLength": 4, |
|||
"scrollShow": true, |
|||
"scrollAlign": "left", |
|||
"scrollColor": "#A6A6A6", |
|||
"scrollBackgroundColor": "#EFEBEF" |
|||
}, |
|||
"yAxis": { |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"candle": { |
|||
"color": { |
|||
"upLine": "#f04864", |
|||
"upFill": "#f04864", |
|||
"downLine": "#2fc25b", |
|||
"downFill": "#2fc25b" |
|||
}, |
|||
"average": { |
|||
"show": true, |
|||
"name": ["MA5","MA10","MA30"], |
|||
"day": [5,10,20], |
|||
"color": ["#1890ff","#2fc25b","#facc14"] |
|||
} |
|||
}, |
|||
"markLine": { |
|||
"type": "dash", |
|||
"dashLength": 5, |
|||
"data": [ |
|||
{ |
|||
"value": 2150, |
|||
"lineColor": "#f04864", |
|||
"showLabel": true |
|||
}, |
|||
{ |
|||
"value": 2350, |
|||
"lineColor": "#f04864", |
|||
"showLabel": true |
|||
} |
|||
] |
|||
} |
|||
} |
|||
}, |
|||
"mix":{ |
|||
"type": "mix", |
|||
"color": color, |
|||
"padding": [15,15,0,15], |
|||
"xAxis": { |
|||
"disableGrid": true, |
|||
}, |
|||
"yAxis": { |
|||
"disabled": false, |
|||
"disableGrid": false, |
|||
"splitNumber": 5, |
|||
"gridType": "dash", |
|||
"dashLength": 4, |
|||
"gridColor": "#CCCCCC", |
|||
"padding": 10, |
|||
"showTitle": true, |
|||
"data": [] |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"mix": { |
|||
"column": { |
|||
"width": 20 |
|||
} |
|||
}, |
|||
} |
|||
}, |
|||
"scatter":{ |
|||
"type": "scatter", |
|||
"color":color, |
|||
"padding":[15,15,0,15], |
|||
"dataLabel":false, |
|||
"xAxis": { |
|||
"disableGrid": false, |
|||
"gridType":"dash", |
|||
"splitNumber":5, |
|||
"boundaryGap":"justify", |
|||
"min":0 |
|||
}, |
|||
"yAxis": { |
|||
"disableGrid": false, |
|||
"gridType":"dash", |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"scatter": { |
|||
}, |
|||
} |
|||
}, |
|||
"bubble":{ |
|||
"type": "bubble", |
|||
"color":color, |
|||
"padding":[15,15,0,15], |
|||
"xAxis": { |
|||
"disableGrid": false, |
|||
"gridType":"dash", |
|||
"splitNumber":5, |
|||
"boundaryGap":"justify", |
|||
"min":0, |
|||
"max":250 |
|||
}, |
|||
"yAxis": { |
|||
"disableGrid": false, |
|||
"gridType":"dash", |
|||
"data":[{ |
|||
"min":0, |
|||
"max":150 |
|||
}] |
|||
}, |
|||
"legend": { |
|||
}, |
|||
"extra": { |
|||
"bubble": { |
|||
"border":2, |
|||
"opacity": 0.5, |
|||
}, |
|||
} |
|||
} |
|||
} |
|||
|
|||
export default cfu; |
@ -0,0 +1,5 @@ |
|||
# uCharts JSSDK说明 |
|||
1、如不使用uCharts组件,可直接引用u-charts.js,打包编译后会`自动压缩`,压缩后体积约为`120kb`。 |
|||
2、如果120kb的体积仍需压缩,请手到uCharts官网通过在线定制选择您需要的图表。 |
|||
3、config-ucharts.js为uCharts组件的用户配置文件,升级前请`自行备份config-ucharts.js`文件,以免被强制覆盖。 |
|||
4、config-echarts.js为ECharts组件的用户配置文件,升级前请`自行备份config-echarts.js`文件,以免被强制覆盖。 |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
@ -0,0 +1,201 @@ |
|||
Apache License |
|||
Version 2.0, January 2004 |
|||
http://www.apache.org/licenses/ |
|||
|
|||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
|||
|
|||
1. Definitions. |
|||
|
|||
"License" shall mean the terms and conditions for use, reproduction, |
|||
and distribution as defined by Sections 1 through 9 of this document. |
|||
|
|||
"Licensor" shall mean the copyright owner or entity authorized by |
|||
the copyright owner that is granting the License. |
|||
|
|||
"Legal Entity" shall mean the union of the acting entity and all |
|||
other entities that control, are controlled by, or are under common |
|||
control with that entity. For the purposes of this definition, |
|||
"control" means (i) the power, direct or indirect, to cause the |
|||
direction or management of such entity, whether by contract or |
|||
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
|||
outstanding shares, or (iii) beneficial ownership of such entity. |
|||
|
|||
"You" (or "Your") shall mean an individual or Legal Entity |
|||
exercising permissions granted by this License. |
|||
|
|||
"Source" form shall mean the preferred form for making modifications, |
|||
including but not limited to software source code, documentation |
|||
source, and configuration files. |
|||
|
|||
"Object" form shall mean any form resulting from mechanical |
|||
transformation or translation of a Source form, including but |
|||
not limited to compiled object code, generated documentation, |
|||
and conversions to other media types. |
|||
|
|||
"Work" shall mean the work of authorship, whether in Source or |
|||
Object form, made available under the License, as indicated by a |
|||
copyright notice that is included in or attached to the work |
|||
(an example is provided in the Appendix below). |
|||
|
|||
"Derivative Works" shall mean any work, whether in Source or Object |
|||
form, that is based on (or derived from) the Work and for which the |
|||
editorial revisions, annotations, elaborations, or other modifications |
|||
represent, as a whole, an original work of authorship. For the purposes |
|||
of this License, Derivative Works shall not include works that remain |
|||
separable from, or merely link (or bind by name) to the interfaces of, |
|||
the Work and Derivative Works thereof. |
|||
|
|||
"Contribution" shall mean any work of authorship, including |
|||
the original version of the Work and any modifications or additions |
|||
to that Work or Derivative Works thereof, that is intentionally |
|||
submitted to Licensor for inclusion in the Work by the copyright owner |
|||
or by an individual or Legal Entity authorized to submit on behalf of |
|||
the copyright owner. For the purposes of this definition, "submitted" |
|||
means any form of electronic, verbal, or written communication sent |
|||
to the Licensor or its representatives, including but not limited to |
|||
communication on electronic mailing lists, source code control systems, |
|||
and issue tracking systems that are managed by, or on behalf of, the |
|||
Licensor for the purpose of discussing and improving the Work, but |
|||
excluding communication that is conspicuously marked or otherwise |
|||
designated in writing by the copyright owner as "Not a Contribution." |
|||
|
|||
"Contributor" shall mean Licensor and any individual or Legal Entity |
|||
on behalf of whom a Contribution has been received by Licensor and |
|||
subsequently incorporated within the Work. |
|||
|
|||
2. Grant of Copyright License. Subject to the terms and conditions of |
|||
this License, each Contributor hereby grants to You a perpetual, |
|||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|||
copyright license to reproduce, prepare Derivative Works of, |
|||
publicly display, publicly perform, sublicense, and distribute the |
|||
Work and such Derivative Works in Source or Object form. |
|||
|
|||
3. Grant of Patent License. Subject to the terms and conditions of |
|||
this License, each Contributor hereby grants to You a perpetual, |
|||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|||
(except as stated in this section) patent license to make, have made, |
|||
use, offer to sell, sell, import, and otherwise transfer the Work, |
|||
where such license applies only to those patent claims licensable |
|||
by such Contributor that are necessarily infringed by their |
|||
Contribution(s) alone or by combination of their Contribution(s) |
|||
with the Work to which such Contribution(s) was submitted. If You |
|||
institute patent litigation against any entity (including a |
|||
cross-claim or counterclaim in a lawsuit) alleging that the Work |
|||
or a Contribution incorporated within the Work constitutes direct |
|||
or contributory patent infringement, then any patent licenses |
|||
granted to You under this License for that Work shall terminate |
|||
as of the date such litigation is filed. |
|||
|
|||
4. Redistribution. You may reproduce and distribute copies of the |
|||
Work or Derivative Works thereof in any medium, with or without |
|||
modifications, and in Source or Object form, provided that You |
|||
meet the following conditions: |
|||
|
|||
(a) You must give any other recipients of the Work or |
|||
Derivative Works a copy of this License; and |
|||
|
|||
(b) You must cause any modified files to carry prominent notices |
|||
stating that You changed the files; and |
|||
|
|||
(c) You must retain, in the Source form of any Derivative Works |
|||
that You distribute, all copyright, patent, trademark, and |
|||
attribution notices from the Source form of the Work, |
|||
excluding those notices that do not pertain to any part of |
|||
the Derivative Works; and |
|||
|
|||
(d) If the Work includes a "NOTICE" text file as part of its |
|||
distribution, then any Derivative Works that You distribute must |
|||
include a readable copy of the attribution notices contained |
|||
within such NOTICE file, excluding those notices that do not |
|||
pertain to any part of the Derivative Works, in at least one |
|||
of the following places: within a NOTICE text file distributed |
|||
as part of the Derivative Works; within the Source form or |
|||
documentation, if provided along with the Derivative Works; or, |
|||
within a display generated by the Derivative Works, if and |
|||
wherever such third-party notices normally appear. The contents |
|||
of the NOTICE file are for informational purposes only and |
|||
do not modify the License. You may add Your own attribution |
|||
notices within Derivative Works that You distribute, alongside |
|||
or as an addendum to the NOTICE text from the Work, provided |
|||
that such additional attribution notices cannot be construed |
|||
as modifying the License. |
|||
|
|||
You may add Your own copyright statement to Your modifications and |
|||
may provide additional or different license terms and conditions |
|||
for use, reproduction, or distribution of Your modifications, or |
|||
for any such Derivative Works as a whole, provided Your use, |
|||
reproduction, and distribution of the Work otherwise complies with |
|||
the conditions stated in this License. |
|||
|
|||
5. Submission of Contributions. Unless You explicitly state otherwise, |
|||
any Contribution intentionally submitted for inclusion in the Work |
|||
by You to the Licensor shall be under the terms and conditions of |
|||
this License, without any additional terms or conditions. |
|||
Notwithstanding the above, nothing herein shall supersede or modify |
|||
the terms of any separate license agreement you may have executed |
|||
with Licensor regarding such Contributions. |
|||
|
|||
6. Trademarks. This License does not grant permission to use the trade |
|||
names, trademarks, service marks, or product names of the Licensor, |
|||
except as required for reasonable and customary use in describing the |
|||
origin of the Work and reproducing the content of the NOTICE file. |
|||
|
|||
7. Disclaimer of Warranty. Unless required by applicable law or |
|||
agreed to in writing, Licensor provides the Work (and each |
|||
Contributor provides its Contributions) on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
|||
implied, including, without limitation, any warranties or conditions |
|||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
|||
PARTICULAR PURPOSE. You are solely responsible for determining the |
|||
appropriateness of using or redistributing the Work and assume any |
|||
risks associated with Your exercise of permissions under this License. |
|||
|
|||
8. Limitation of Liability. In no event and under no legal theory, |
|||
whether in tort (including negligence), contract, or otherwise, |
|||
unless required by applicable law (such as deliberate and grossly |
|||
negligent acts) or agreed to in writing, shall any Contributor be |
|||
liable to You for damages, including any direct, indirect, special, |
|||
incidental, or consequential damages of any character arising as a |
|||
result of this License or out of the use or inability to use the |
|||
Work (including but not limited to damages for loss of goodwill, |
|||
work stoppage, computer failure or malfunction, or any and all |
|||
other commercial damages or losses), even if such Contributor |
|||
has been advised of the possibility of such damages. |
|||
|
|||
9. Accepting Warranty or Additional Liability. While redistributing |
|||
the Work or Derivative Works thereof, You may choose to offer, |
|||
and charge a fee for, acceptance of support, warranty, indemnity, |
|||
or other liability obligations and/or rights consistent with this |
|||
License. However, in accepting such obligations, You may act only |
|||
on Your own behalf and on Your sole responsibility, not on behalf |
|||
of any other Contributor, and only if You agree to indemnify, |
|||
defend, and hold each Contributor harmless for any liability |
|||
incurred by, or claims asserted against, such Contributor by reason |
|||
of your accepting any such warranty or additional liability. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
APPENDIX: How to apply the Apache License to your work. |
|||
|
|||
To apply the Apache License to your work, attach the following |
|||
boilerplate notice, with the fields enclosed by brackets "[]" |
|||
replaced with your own identifying information. (Don't include |
|||
the brackets!) The text should be enclosed in the appropriate |
|||
comment syntax for the file format. We also recommend that a |
|||
file or class name and description of purpose be included on the |
|||
same "printed page" as the copyright notice for easier |
|||
identification within third-party archives. |
|||
|
|||
Copyright [yyyy] [name of copyright owner] |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
@ -0,0 +1,81 @@ |
|||
{ |
|||
"id": "qiun-data-charts", |
|||
"displayName": "秋云 ucharts echarts 高性能跨全端图表组件", |
|||
"version": "2.5.0-20230101", |
|||
"description": "uCharts 新增正负柱状图!支持H5及APP用 ucharts echarts 渲染图表,uniapp可视化首选组件", |
|||
"keywords": [ |
|||
"ucharts", |
|||
"echarts", |
|||
"f2", |
|||
"图表", |
|||
"可视化" |
|||
], |
|||
"repository": "https://gitee.com/uCharts/uCharts", |
|||
"engines": { |
|||
"HBuilderX": "^3.3.8" |
|||
}, |
|||
"dcloudext": { |
|||
"sale": { |
|||
"regular": { |
|||
"price": "0.00" |
|||
}, |
|||
"sourcecode": { |
|||
"price": "0.00" |
|||
} |
|||
}, |
|||
"contact": { |
|||
"qq": "474119" |
|||
}, |
|||
"declaration": { |
|||
"ads": "无", |
|||
"data": "插件不采集任何数据", |
|||
"permissions": "无" |
|||
}, |
|||
"npmurl": "https://www.npmjs.com/~qiun", |
|||
"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" |
|||
}, |
|||
"快应用": { |
|||
"华为": "y", |
|||
"联盟": "y" |
|||
}, |
|||
"Vue": { |
|||
"vue2": "y", |
|||
"vue3": "y" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,84 @@ |
|||
 |
|||
|
|||
|
|||
[](https://gitee.com/uCharts/uCharts/stargazers) |
|||
[](https://gitee.com/uCharts/uCharts/members) |
|||
[](https://www.apache.org/licenses/LICENSE-2.0.html) |
|||
[](https://www.npmjs.com/~qiun) |
|||
|
|||
|
|||
## uCharts简介 |
|||
|
|||
`uCharts`是一款基于`canvas API`开发的适用于所有前端应用的图表库,开发者编写一套代码,可运行到 Web、iOS、Android(基于 uni-app / taro )、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等更多支持 canvas API 的平台。 |
|||
|
|||
## 官方网站 |
|||
|
|||
## [https://www.ucharts.cn](https://www.ucharts.cn) |
|||
|
|||
## 快速体验 |
|||
|
|||
一套代码编到多个平台,依次扫描二维码,亲自体验uCharts图表跨平台效果!其他平台请自行编译。 |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
## 致开发者 |
|||
|
|||
感谢各位开发者`五年`来对秋云及uCharts的支持,uCharts的进步离不开各位开发者的鼓励与贡献。为更好的帮助各位开发者使用图表工具,我们推出了新版官网,增加了在线定制、问答社区、在线配置等一些增值服务,为确保您能更好的应用图表组件,建议您先`仔细阅读官网指南`以及`常见问题`,而不是下载下来`直接使用`。如仍然不能解决,请到`官网社区`或开通会员后加入`专属VIP会员群`提问将会很快得到回答。 |
|||
|
|||
## 视频教程 |
|||
|
|||
## [uCharts新手入门教程](https://www.bilibili.com/video/BV1qA411Q7se/?share_source=copy_web&vd_source=42a1242f9aaade6427736af69eb2e1d9) |
|||
|
|||
|
|||
## 社群支持 |
|||
|
|||
uCharts官方拥有5个2000人的QQ群及专属VIP会员群支持,庞大的用户量证明我们一直在努力,请各位放心使用!uCharts的开源图表组件的开发,团队付出了大量的时间与精力,经过四来的考验,不会有比较明显的bug,请各位放心使用。如果您有更好的想法,可以在`码云提交Pull Requests`以帮助更多开发者完成需求,再次感谢各位对uCharts的鼓励与支持! |
|||
|
|||
#### 官方交流群 |
|||
- 交流群1:371774600(已满) |
|||
- 交流群2:619841586(已满) |
|||
- 交流群3:955340127(已满) |
|||
- 交流群4:641669795(已满) |
|||
- 交流群5:236294809(只能扫码加入) |
|||
|
|||
 |
|||
|
|||
- 口令`uniapp` |
|||
|
|||
#### 专属VIP会员群 |
|||
- 开通会员后详见【账号详情】页面中顶部的滚动通知 |
|||
- 口令`您的用户ID` |
|||
|
|||
## 版权信息 |
|||
|
|||
uCharts始终坚持开源,遵循 [Apache Licence 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) 开源协议,意味着您无需支付任何费用,即可将uCharts应用到您的产品中。 |
|||
|
|||
注意:这并不意味着您可以将uCharts应用到非法的领域,比如涉及赌博,暴力等方面。如因此产生纠纷或法律问题,uCharts相关方及秋云科技不承担任何责任。 |
|||
|
|||
## 合作伙伴 |
|||
|
|||
[](https://www.diygw.com/) |
|||
[](https://gitee.com/howcode/has-chat) |
|||
[](https://www.uviewui.com/) |
|||
[](https://ext.dcloud.net.cn/plugin?id=7088) |
|||
[](https://ext.dcloud.net.cn/publisher?id=202) |
|||
[](https://www.firstui.cn/) |
|||
[](https://ext.dcloud.net.cn/plugin?id=5169) |
|||
[](https://www.graceui.com/) |
|||
|
|||
|
|||
## 更新记录 |
|||
|
|||
详见官网指南中说明,[点击此处查看](https://www.ucharts.cn/v2/#/guide/index?id=100) |
|||
|
|||
|
|||
## 相关链接 |
|||
- [uCharts官网](https://www.ucharts.cn) |
|||
- [DCloud插件市场地址](https://ext.dcloud.net.cn/plugin?id=271) |
|||
- [uCharts码云开源托管地址](https://gitee.com/uCharts/uCharts) [](https://gitee.com/uCharts/uCharts/stargazers) |
|||
- [uCharts npm开源地址](https://www.ucharts.cn) |
|||
- [ECharts官网](https://echarts.apache.org/zh/index.html) |
|||
- [ECharts配置手册](https://echarts.apache.org/zh/option.html) |
|||
- [图表组件在项目中的应用 ReportPlus数据报表](https://www.ucharts.cn/v2/#/layout/info?id=1) |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,107 @@ |
|||
## 2.2.13(2023-01-10) |
|||
- 修复 多次加载组件造成内存占用的 bug |
|||
## 2.2.12(2022-12-01) |
|||
- 修复 vue3 下 i18n 国际化初始值不正确的 bug |
|||
## 2.2.11(2022-09-19) |
|||
- 修复,支付宝小程序样式错乱,[详情](https://github.com/dcloudio/uni-app/issues/3861) |
|||
## 2.2.10(2022-09-19) |
|||
- 修复,反向选择日期范围,日期显示异常,[详情](https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false) |
|||
## 2.2.9(2022-09-16) |
|||
- 可以使用 uni-scss 控制主题色 |
|||
## 2.2.8(2022-09-08) |
|||
- 修复 close事件无效的 bug |
|||
## 2.2.7(2022-09-05) |
|||
- 修复 移动端 maskClick 无效的 bug,详见:[https://ask.dcloud.net.cn/question/140824?item_id=209458&rf=false](https://ask.dcloud.net.cn/question/140824?item_id=209458&rf=false) |
|||
## 2.2.6(2022-06-30) |
|||
- 优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致 |
|||
## 2.2.5(2022-06-24) |
|||
- 修复 日历顶部年月及底部确认未国际化 bug |
|||
## 2.2.4(2022-03-31) |
|||
- 修复 Vue3 下动态赋值,单选类型未响应的 bug |
|||
## 2.2.3(2022-03-28) |
|||
- 修复 Vue3 下动态赋值未响应的 bug |
|||
## 2.2.2(2021-12-10) |
|||
- 修复 clear-icon 属性在小程序平台不生效的 bug |
|||
## 2.2.1(2021-12-10) |
|||
- 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的 bug |
|||
## 2.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-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) |
|||
## 2.1.5(2021-11-09) |
|||
- 新增 提供组件设计资源,组件样式调整 |
|||
## 2.1.4(2021-09-10) |
|||
- 修复 hide-second 在移动端的 bug |
|||
- 修复 单选赋默认值时,赋值日期未高亮的 bug |
|||
- 修复 赋默认值时,移动端未正确显示时间的 bug |
|||
## 2.1.3(2021-09-09) |
|||
- 新增 hide-second 属性,支持只使用时分,隐藏秒 |
|||
## 2.1.2(2021-09-03) |
|||
- 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次 |
|||
- 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法 |
|||
- 优化 调整字号大小,美化日历界面 |
|||
- 修复 因国际化导致的 placeholder 失效的 bug |
|||
## 2.1.1(2021-08-24) |
|||
- 新增 支持国际化 |
|||
- 优化 范围选择器在 pc 端过宽的问题 |
|||
## 2.1.0(2021-08-09) |
|||
- 新增 适配 vue3 |
|||
## 2.0.19(2021-08-09) |
|||
- 新增 支持作为 uni-forms 子组件相关功能 |
|||
- 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug |
|||
## 2.0.18(2021-08-05) |
|||
- 修复 type 属性动态赋值无效的 bug |
|||
- 修复 ‘确认’按钮被 tabbar 遮盖 bug |
|||
- 修复 组件未赋值时范围选左、右日历相同的 bug |
|||
## 2.0.17(2021-08-04) |
|||
- 修复 范围选未正确显示当前值的 bug |
|||
- 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug |
|||
## 2.0.16(2021-07-21) |
|||
- 新增 return-type 属性支持返回 date 日期对象 |
|||
## 2.0.15(2021-07-14) |
|||
- 修复 单选日期类型,初始赋值后不在当前日历的 bug |
|||
- 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效) |
|||
- 优化 移动端移除显示框的清空按钮,无实际用途 |
|||
## 2.0.14(2021-07-14) |
|||
- 修复 组件赋值为空,界面未更新的 bug |
|||
- 修复 start 和 end 不能动态赋值的 bug |
|||
- 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的 bug |
|||
## 2.0.13(2021-07-08) |
|||
- 修复 范围选择不能动态赋值的 bug |
|||
## 2.0.12(2021-07-08) |
|||
- 修复 范围选择的初始时间在一个月内时,造成无法选择的bug |
|||
## 2.0.11(2021-07-08) |
|||
- 优化 弹出层在超出视窗边缘定位不准确的问题 |
|||
## 2.0.10(2021-07-08) |
|||
- 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的 bug |
|||
- 优化 弹出层在超出视窗边缘被遮盖的问题 |
|||
## 2.0.9(2021-07-07) |
|||
- 新增 maskClick 事件 |
|||
- 修复 特殊情况日历 rpx 布局错误的 bug,rpx -> px |
|||
- 修复 范围选择时清空返回值不合理的bug,['', ''] -> [] |
|||
## 2.0.8(2021-07-07) |
|||
- 新增 日期时间显示框支持插槽 |
|||
## 2.0.7(2021-07-01) |
|||
- 优化 添加 uni-icons 依赖 |
|||
## 2.0.6(2021-05-22) |
|||
- 修复 图标在小程序上不显示的 bug |
|||
- 优化 重命名引用组件,避免潜在组件命名冲突 |
|||
## 2.0.5(2021-05-20) |
|||
- 优化 代码目录扁平化 |
|||
## 2.0.4(2021-05-12) |
|||
- 新增 组件示例地址 |
|||
## 2.0.3(2021-05-10) |
|||
- 修复 ios 下不识别 '-' 日期格式的 bug |
|||
- 优化 pc 下弹出层添加边框和阴影 |
|||
## 2.0.2(2021-05-08) |
|||
- 修复 在 admin 中获取弹出层定位错误的bug |
|||
## 2.0.1(2021-05-08) |
|||
- 修复 type 属性向下兼容,默认值从 date 变更为 datetime |
|||
## 2.0.0(2021-04-30) |
|||
- 支持日历形式的日期+时间的范围选择 |
|||
> 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker) |
|||
## 1.0.6(2021-03-18) |
|||
- 新增 hide-second 属性,时间支持仅选择时、分 |
|||
- 修复 选择跟显示的日期不一样的 bug |
|||
- 修复 chang事件触发2次的 bug |
|||
- 修复 分、秒 end 范围错误的 bug |
|||
- 优化 更好的 nvue 适配 |
@ -0,0 +1,187 @@ |
|||
<template> |
|||
<view class="uni-calendar-item__weeks-box" :class="{ |
|||
'uni-calendar-item--disable':weeks.disable, |
|||
'uni-calendar-item--before-checked-x':weeks.beforeMultiple, |
|||
'uni-calendar-item--multiple': weeks.multiple, |
|||
'uni-calendar-item--after-checked-x':weeks.afterMultiple, |
|||
}" @click="choiceDate(weeks)" @mouseenter="handleMousemove(weeks)"> |
|||
<view class="uni-calendar-item__weeks-box-item" :class="{ |
|||
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && (calendar.userChecked || !checkHover), |
|||
'uni-calendar-item--checked-range-text': checkHover, |
|||
'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, |
|||
}"> |
|||
<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text> |
|||
<text class="uni-calendar-item__weeks-box-text uni-calendar-item__weeks-box-text-disable uni-calendar-item--checked-text">{{weeks.date}}</text> |
|||
</view> |
|||
<view :class="{'uni-calendar-item--isDay': weeks.isDay}"></view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
props: { |
|||
weeks: { |
|||
type: Object, |
|||
default () { |
|||
return {} |
|||
} |
|||
}, |
|||
calendar: { |
|||
type: Object, |
|||
default: () => { |
|||
return {} |
|||
} |
|||
}, |
|||
selected: { |
|||
type: Array, |
|||
default: () => { |
|||
return [] |
|||
} |
|||
}, |
|||
lunar: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
checkHover: { |
|||
type: Boolean, |
|||
default: false |
|||
} |
|||
}, |
|||
methods: { |
|||
choiceDate(weeks) { |
|||
this.$emit('change', weeks) |
|||
}, |
|||
handleMousemove(weeks) { |
|||
this.$emit('handleMouse', weeks) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" > |
|||
$uni-primary: #007aff !default; |
|||
|
|||
.uni-calendar-item__weeks-box { |
|||
flex: 1; |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
align-items: center; |
|||
margin: 1px 0; |
|||
position: relative; |
|||
} |
|||
|
|||
.uni-calendar-item__weeks-box-text { |
|||
font-size: 14px; |
|||
// font-family: Lato-Bold, Lato; |
|||
font-weight: bold; |
|||
color: darken($color: $uni-primary, $amount: 40%); |
|||
} |
|||
|
|||
.uni-calendar-item__weeks-lunar-text { |
|||
font-size: 12px; |
|||
color: #333; |
|||
} |
|||
|
|||
.uni-calendar-item__weeks-box-item { |
|||
position: relative; |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
align-items: center; |
|||
width: 40px; |
|||
height: 40px; |
|||
/* #ifdef H5 */ |
|||
cursor: pointer; |
|||
/* #endif */ |
|||
} |
|||
|
|||
|
|||
.uni-calendar-item__weeks-box-circle { |
|||
position: absolute; |
|||
top: 5px; |
|||
right: 5px; |
|||
width: 8px; |
|||
height: 8px; |
|||
border-radius: 8px; |
|||
background-color: #dd524d; |
|||
|
|||
} |
|||
|
|||
.uni-calendar-item__weeks-box .uni-calendar-item--disable { |
|||
// background-color: rgba(249, 249, 249, $uni-opacity-disabled); |
|||
cursor: default; |
|||
} |
|||
|
|||
.uni-calendar-item--disable .uni-calendar-item__weeks-box-text-disable { |
|||
color: #D1D1D1; |
|||
} |
|||
|
|||
.uni-calendar-item--isDay { |
|||
position: absolute; |
|||
top: 10px; |
|||
right: 17%; |
|||
background-color: #dd524d; |
|||
width:6px; |
|||
height: 6px; |
|||
border-radius: 50%; |
|||
} |
|||
|
|||
.uni-calendar-item--extra { |
|||
color: #dd524d; |
|||
opacity: 0.8; |
|||
} |
|||
|
|||
.uni-calendar-item__weeks-box .uni-calendar-item--checked { |
|||
background-color: $uni-primary; |
|||
border-radius: 50%; |
|||
box-sizing: border-box; |
|||
border: 3px solid #fff; |
|||
} |
|||
|
|||
.uni-calendar-item--checked .uni-calendar-item--checked-text { |
|||
color: #fff; |
|||
} |
|||
|
|||
.uni-calendar-item--multiple .uni-calendar-item--checked-range-text { |
|||
color: #333; |
|||
} |
|||
|
|||
.uni-calendar-item--multiple { |
|||
background-color: #F6F7FC; |
|||
// color: #fff; |
|||
} |
|||
|
|||
.uni-calendar-item--multiple .uni-calendar-item--before-checked, |
|||
.uni-calendar-item--multiple .uni-calendar-item--after-checked { |
|||
background-color: $uni-primary; |
|||
border-radius: 50%; |
|||
box-sizing: border-box; |
|||
border: 3px solid #F6F7FC; |
|||
} |
|||
|
|||
.uni-calendar-item--before-checked .uni-calendar-item--checked-text, |
|||
.uni-calendar-item--after-checked .uni-calendar-item--checked-text { |
|||
color: #fff; |
|||
} |
|||
|
|||
.uni-calendar-item--before-checked-x { |
|||
border-top-left-radius: 50px; |
|||
border-bottom-left-radius: 50px; |
|||
box-sizing: border-box; |
|||
background-color: #F6F7FC; |
|||
} |
|||
|
|||
.uni-calendar-item--after-checked-x { |
|||
border-top-right-radius: 50px; |
|||
border-bottom-right-radius: 50px; |
|||
background-color: #F6F7FC; |
|||
} |
|||
</style> |
@ -0,0 +1,924 @@ |
|||
<template> |
|||
<view class="uni-calendar" @mouseleave="leaveCale"> |
|||
<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" |
|||
@click="clean();maskClick()"></view> |
|||
<view v-if="insert || show" class="uni-calendar__content" |
|||
:class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow, 'uni-calendar__content-mobile': aniMaskShow}"> |
|||
<view class="uni-calendar__header" :class="{'uni-calendar__header-mobile' :!insert}"> |
|||
<view v-if="left" 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||'') + yearText + ( nowDate.month||'') + monthText}}</text> |
|||
</picker> |
|||
<view v-if="right" class="uni-calendar__header-btn-box" @click.stop="next"> |
|||
<view class="uni-calendar__header-btn uni-calendar--right"></view> |
|||
</view> |
|||
<view v-if="!insert" class="dialog-close" @click="clean"> |
|||
<view class="dialog-close-plus" data-id="close"></view> |
|||
<view class="dialog-close-plus dialog-close-rotate" data-id="close"></view> |
|||
</view> |
|||
|
|||
<!-- <text class="uni-calendar__backtoday" @click="backtoday">回到今天</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" style="padding-bottom: 7px;"> |
|||
<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" :checkHover="range" @change="choiceDate" |
|||
@handleMouse="handleMouse"> |
|||
</calendar-item> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view v-if="!insert && !range && typeHasTime" class="uni-date-changed uni-calendar--fixed-top" |
|||
style="padding: 0 80px;"> |
|||
<view class="uni-date-changed--time-date">{{tempSingleDate ? tempSingleDate : selectDateText}}</view> |
|||
<time-picker type="time" :start="reactStartTime" :end="reactEndTime" v-model="time" |
|||
:disabled="!tempSingleDate" :border="false" :hide-second="hideSecond" class="time-picker-style"> |
|||
</time-picker> |
|||
</view> |
|||
|
|||
<view v-if="!insert && range && typeHasTime" class="uni-date-changed uni-calendar--fixed-top"> |
|||
<view class="uni-date-changed--time-start"> |
|||
<view class="uni-date-changed--time-date">{{tempRange.before ? tempRange.before : startDateText}} |
|||
</view> |
|||
<time-picker type="time" :start="reactStartTime" v-model="timeRange.startTime" :border="false" |
|||
:hide-second="hideSecond" :disabled="!tempRange.before" class="time-picker-style"> |
|||
</time-picker> |
|||
</view> |
|||
<view style="line-height: 50px;"> |
|||
<uni-icons type="arrowthinright" color="#999"></uni-icons> |
|||
</view> |
|||
<view class="uni-date-changed--time-end"> |
|||
<view class="uni-date-changed--time-date">{{tempRange.after ? tempRange.after : endDateText}}</view> |
|||
<time-picker type="time" :end="reactEndTime" v-model="timeRange.endTime" :border="false" |
|||
:hide-second="hideSecond" :disabled="!tempRange.after" class="time-picker-style"> |
|||
</time-picker> |
|||
</view> |
|||
</view> |
|||
<view v-if="!insert" class="uni-date-changed uni-date-btn--ok"> |
|||
<!-- <view class="uni-calendar__header-btn-box"> |
|||
<text class="uni-calendar__button-text uni-calendar--fixed-width">{{okText}}</text> |
|||
</view> --> |
|||
<view class="uni-datetime-picker--btn" @click="confirm">{{confirmText}}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import Calendar from './util.js'; |
|||
import calendarItem from './calendar-item.vue' |
|||
import timePicker from './time-picker.vue' |
|||
import { |
|||
initVueI18n |
|||
} from '@dcloudio/uni-i18n' |
|||
import messages from './i18n/index.js' |
|||
const { |
|||
t |
|||
} = initVueI18n(messages) |
|||
/** |
|||
* 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, |
|||
timePicker |
|||
}, |
|||
props: { |
|||
date: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
defTime: { |
|||
type: [String, Object], |
|||
default: '' |
|||
}, |
|||
selectableTimes: { |
|||
type: [Object], |
|||
default () { |
|||
return {} |
|||
} |
|||
}, |
|||
selected: { |
|||
type: Array, |
|||
default () { |
|||
return [] |
|||
} |
|||
}, |
|||
lunar: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
startDate: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
endDate: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
range: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
typeHasTime: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
insert: { |
|||
type: Boolean, |
|||
default: true |
|||
}, |
|||
showMonth: { |
|||
type: Boolean, |
|||
default: true |
|||
}, |
|||
clearDate: { |
|||
type: Boolean, |
|||
default: true |
|||
}, |
|||
left: { |
|||
type: Boolean, |
|||
default: true |
|||
}, |
|||
right: { |
|||
type: Boolean, |
|||
default: true |
|||
}, |
|||
checkHover: { |
|||
type: Boolean, |
|||
default: true |
|||
}, |
|||
hideSecond: { |
|||
type: [Boolean], |
|||
default: false |
|||
}, |
|||
pleStatus: { |
|||
type: Object, |
|||
default () { |
|||
return { |
|||
before: '', |
|||
after: '', |
|||
data: [], |
|||
fulldate: '' |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
show: false, |
|||
weeks: [], |
|||
calendar: {}, |
|||
nowDate: '', |
|||
aniMaskShow: false, |
|||
firstEnter: true, |
|||
time: '', |
|||
timeRange: { |
|||
startTime: '', |
|||
endTime: '' |
|||
}, |
|||
tempSingleDate: '', |
|||
tempRange: { |
|||
before: '', |
|||
after: '' |
|||
} |
|||
} |
|||
}, |
|||
watch: { |
|||
date: { |
|||
immediate: true, |
|||
handler(newVal, oldVal) { |
|||
if (!this.range) { |
|||
this.tempSingleDate = newVal |
|||
setTimeout(() => { |
|||
this.init(newVal) |
|||
}, 100) |
|||
} |
|||
} |
|||
}, |
|||
defTime: { |
|||
immediate: true, |
|||
handler(newVal, oldVal) { |
|||
if (!this.range) { |
|||
this.time = newVal |
|||
} else { |
|||
// console.log('-----', newVal); |
|||
this.timeRange.startTime = newVal.start |
|||
this.timeRange.endTime = newVal.end |
|||
} |
|||
} |
|||
}, |
|||
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 |
|||
}, |
|||
pleStatus: { |
|||
immediate: true, |
|||
handler(newVal, oldVal) { |
|||
const { |
|||
before, |
|||
after, |
|||
fulldate, |
|||
which |
|||
} = newVal |
|||
this.tempRange.before = before |
|||
this.tempRange.after = after |
|||
setTimeout(() => { |
|||
if (fulldate) { |
|||
this.cale.setHoverMultiple(fulldate) |
|||
if (before && after) { |
|||
this.cale.lastHover = true |
|||
if (this.rangeWithinMonth(after, before)) return |
|||
this.setDate(before) |
|||
} else { |
|||
this.cale.setMultiple(fulldate) |
|||
this.setDate(this.nowDate.fullDate) |
|||
this.calendar.fullDate = '' |
|||
this.cale.lastHover = false |
|||
} |
|||
} else { |
|||
this.cale.setDefaultMultiple(before, after) |
|||
if (which === 'left') { |
|||
this.setDate(before) |
|||
this.weeks = this.cale.weeks |
|||
} else { |
|||
this.setDate(after) |
|||
this.weeks = this.cale.weeks |
|||
} |
|||
this.cale.lastHover = true |
|||
} |
|||
}, 16) |
|||
} |
|||
} |
|||
}, |
|||
computed: { |
|||
reactStartTime() { |
|||
const activeDate = this.range ? this.tempRange.before : this.calendar.fullDate |
|||
const res = activeDate === this.startDate ? this.selectableTimes.start : '' |
|||
return res |
|||
}, |
|||
reactEndTime() { |
|||
const activeDate = this.range ? this.tempRange.after : this.calendar.fullDate |
|||
const res = activeDate === this.endDate ? this.selectableTimes.end : '' |
|||
return res |
|||
}, |
|||
/** |
|||
* for i18n |
|||
*/ |
|||
selectDateText() { |
|||
return t("uni-datetime-picker.selectDate") |
|||
}, |
|||
startDateText() { |
|||
return this.startPlaceholder || t("uni-datetime-picker.startDate") |
|||
}, |
|||
endDateText() { |
|||
return this.endPlaceholder || t("uni-datetime-picker.endDate") |
|||
}, |
|||
okText() { |
|||
return t("uni-datetime-picker.ok") |
|||
}, |
|||
yearText() { |
|||
return t("uni-datetime-picker.year") |
|||
}, |
|||
monthText() { |
|||
return t("uni-datetime-picker.month") |
|||
}, |
|||
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") |
|||
}, |
|||
confirmText() { |
|||
return t("uni-calender.confirm") |
|||
}, |
|||
}, |
|||
created() { |
|||
// 获取日历方法实例 |
|||
this.cale = new Calendar({ |
|||
// date: new Date(), |
|||
selected: this.selected, |
|||
startDate: this.startDate, |
|||
endDate: this.endDate, |
|||
range: this.range, |
|||
// multipleStatus: this.pleStatus |
|||
}) |
|||
// 选中某一天 |
|||
// this.cale.setDate(this.date) |
|||
this.init(this.date) |
|||
// this.setDay |
|||
}, |
|||
methods: { |
|||
leaveCale() { |
|||
this.firstEnter = true |
|||
}, |
|||
handleMouse(weeks) { |
|||
if (weeks.disable) return |
|||
if (this.cale.lastHover) return |
|||
let { |
|||
before, |
|||
after |
|||
} = this.cale.multipleStatus |
|||
if (!before) return |
|||
this.calendar = weeks |
|||
// 设置范围选 |
|||
this.cale.setHoverMultiple(this.calendar.fullDate) |
|||
this.weeks = this.cale.weeks |
|||
// hover时,进入一个日历,更新另一个 |
|||
if (this.firstEnter) { |
|||
this.$emit('firstEnterCale', this.cale.multipleStatus) |
|||
this.firstEnter = false |
|||
} |
|||
}, |
|||
rangeWithinMonth(A, B) { |
|||
const [yearA, monthA] = A.split('-') |
|||
const [yearB, monthB] = B.split('-') |
|||
return yearA === yearB && monthA === monthB |
|||
}, |
|||
|
|||
// 取消穿透 |
|||
clean() { |
|||
this.close() |
|||
}, |
|||
|
|||
// 蒙版点击事件 |
|||
maskClick() { |
|||
this.$emit('maskClose') |
|||
}, |
|||
|
|||
clearCalender() { |
|||
if (this.range) { |
|||
this.timeRange.startTime = '' |
|||
this.timeRange.endTime = '' |
|||
this.tempRange.before = '' |
|||
this.tempRange.after = '' |
|||
this.cale.multipleStatus.before = '' |
|||
this.cale.multipleStatus.after = '' |
|||
this.cale.multipleStatus.data = [] |
|||
this.cale.lastHover = false |
|||
} else { |
|||
this.time = '' |
|||
this.tempSingleDate = '' |
|||
} |
|||
this.calendar.fullDate = '' |
|||
this.setDate() |
|||
}, |
|||
|
|||
bindDateChange(e) { |
|||
const value = e.detail.value + '-1' |
|||
this.init(value) |
|||
}, |
|||
/** |
|||
* 初始化日期显示 |
|||
* @param {Object} date |
|||
*/ |
|||
init(date) { |
|||
this.cale.setDate(date) |
|||
this.weeks = this.cale.weeks |
|||
this.nowDate = this.calendar = this.cale.getInfo(date) |
|||
}, |
|||
// choiceDate(weeks) { |
|||
// if (weeks.disable) return |
|||
// this.calendar = weeks |
|||
// // 设置多选 |
|||
// this.cale.setMultiple(this.calendar.fullDate, true) |
|||
// this.weeks = this.cale.weeks |
|||
// this.tempSingleDate = this.calendar.fullDate |
|||
// this.tempRange.before = this.cale.multipleStatus.before |
|||
// this.tempRange.after = this.cale.multipleStatus.after |
|||
// this.change() |
|||
// }, |
|||
/** |
|||
* 打开日历弹窗 |
|||
*/ |
|||
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, |
|||
time: this.time, |
|||
timeRange: this.timeRange, |
|||
fulldate: fullDate, |
|||
lunar, |
|||
extraInfo: extraInfo || {} |
|||
}) |
|||
}, |
|||
/** |
|||
* 选择天触发 |
|||
* @param {Object} weeks |
|||
*/ |
|||
choiceDate(weeks) { |
|||
if (weeks.disable) return |
|||
this.calendar = weeks |
|||
this.calendar.userChecked = true |
|||
// 设置多选 |
|||
this.cale.setMultiple(this.calendar.fullDate, true) |
|||
this.weeks = this.cale.weeks |
|||
this.tempSingleDate = this.calendar.fullDate |
|||
const beforeStatus = this.cale.multipleStatus.before |
|||
const beforeDate = new Date(this.cale.multipleStatus.before).getTime() |
|||
const afterDate = new Date(this.cale.multipleStatus.after).getTime() |
|||
if (beforeDate > afterDate && afterDate) { |
|||
this.tempRange.before = this.cale.multipleStatus.after |
|||
this.tempRange.after = this.cale.multipleStatus.before |
|||
} else { |
|||
this.tempRange.before = this.cale.multipleStatus.before |
|||
this.tempRange.after = this.cale.multipleStatus.after |
|||
} |
|||
this.change() |
|||
}, |
|||
/** |
|||
* 回到今天 |
|||
*/ |
|||
backtoday() { |
|||
let date = this.cale.getDate(new Date()).fullDate |
|||
// this.cale.setDate(date) |
|||
this.init(date) |
|||
this.change() |
|||
}, |
|||
/** |
|||
* 比较时间大小 |
|||
*/ |
|||
dateCompare(startDate, endDate) { |
|||
// 计算截止时间 |
|||
startDate = new Date(startDate.replace('-', '/').replace('-', '/')) |
|||
// 计算详细项的截止时间 |
|||
endDate = new Date(endDate.replace('-', '/').replace('-', '/')) |
|||
if (startDate <= endDate) { |
|||
return true |
|||
} else { |
|||
return false |
|||
} |
|||
}, |
|||
/** |
|||
* 上个月 |
|||
*/ |
|||
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" > |
|||
$uni-primary: #007aff !default; |
|||
|
|||
.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: rgba(0, 0, 0, 0.4); |
|||
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; |
|||
bottom: calc(var(--window-bottom)); |
|||
left: 0; |
|||
right: 0; |
|||
transition-property: transform; |
|||
transition-duration: 0.3s; |
|||
transform: translateY(460px); |
|||
/* #ifndef APP-NVUE */ |
|||
z-index: 99; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.uni-calendar--ani-show { |
|||
transform: translateY(0); |
|||
} |
|||
|
|||
.uni-calendar__content { |
|||
background-color: #fff; |
|||
} |
|||
|
|||
.uni-calendar__content-mobile { |
|||
border-top-left-radius: 10px; |
|||
border-top-right-radius: 10px; |
|||
box-shadow: 0px 0px 5px 3px rgba(0, 0, 0, 0.1); |
|||
} |
|||
|
|||
.uni-calendar__header { |
|||
position: relative; |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
flex-direction: row; |
|||
justify-content: center; |
|||
align-items: center; |
|||
height: 50px; |
|||
} |
|||
|
|||
.uni-calendar__header-mobile { |
|||
padding: 10px; |
|||
padding-bottom: 0; |
|||
} |
|||
|
|||
.uni-calendar--fixed-top { |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
flex-direction: row; |
|||
justify-content: space-between; |
|||
border-top-color: rgba(0, 0, 0, 0.4); |
|||
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: #fff; |
|||
background-color: #f1f1f1; |
|||
} |
|||
|
|||
.uni-calendar__header-text { |
|||
text-align: center; |
|||
width: 100px; |
|||
font-size: 15px; |
|||
color: #666; |
|||
} |
|||
|
|||
.uni-calendar__button-text { |
|||
text-align: center; |
|||
width: 100px; |
|||
font-size: 14px; |
|||
color: $uni-primary; |
|||
/* #ifndef APP-NVUE */ |
|||
letter-spacing: 3px; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.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: 9px; |
|||
height: 9px; |
|||
border-left-color: #808080; |
|||
border-left-style: solid; |
|||
border-left-width: 1px; |
|||
border-top-color: #555555; |
|||
border-top-style: solid; |
|||
border-top-width: 1px; |
|||
} |
|||
|
|||
.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: 40px; |
|||
border-bottom-color: #F5F5F5; |
|||
border-bottom-style: solid; |
|||
border-bottom-width: 1px; |
|||
} |
|||
|
|||
.uni-calendar__weeks-day-text { |
|||
font-size: 12px; |
|||
color: #B2B2B2; |
|||
} |
|||
|
|||
.uni-calendar__box { |
|||
position: relative; |
|||
// padding: 0 10px; |
|||
padding-bottom: 7px; |
|||
} |
|||
|
|||
.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: #999; |
|||
opacity: 0.1; |
|||
text-align: center; |
|||
/* #ifndef APP-NVUE */ |
|||
line-height: 1; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.uni-date-changed { |
|||
padding: 0 10px; |
|||
// line-height: 50px; |
|||
text-align: center; |
|||
color: #333; |
|||
border-top-color: #DCDCDC; |
|||
; |
|||
border-top-style: solid; |
|||
border-top-width: 1px; |
|||
flex: 1; |
|||
} |
|||
|
|||
.uni-date-btn--ok { |
|||
padding: 20px 15px; |
|||
} |
|||
|
|||
.uni-date-changed--time-start { |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
align-items: center; |
|||
} |
|||
|
|||
.uni-date-changed--time-end { |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
align-items: center; |
|||
} |
|||
|
|||
.uni-date-changed--time-date { |
|||
color: #999; |
|||
line-height: 50px; |
|||
margin-right: 5px; |
|||
// opacity: 0.6; |
|||
} |
|||
|
|||
.time-picker-style { |
|||
// width: 62px; |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
justify-content: center; |
|||
align-items: center |
|||
} |
|||
|
|||
.mr-10 { |
|||
margin-right: 10px; |
|||
} |
|||
|
|||
.dialog-close { |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
flex-direction: row; |
|||
align-items: center; |
|||
padding: 0 25px; |
|||
margin-top: 10px; |
|||
} |
|||
|
|||
.dialog-close-plus { |
|||
width: 16px; |
|||
height: 2px; |
|||
background-color: #737987; |
|||
border-radius: 2px; |
|||
transform: rotate(45deg); |
|||
} |
|||
|
|||
.dialog-close-rotate { |
|||
position: absolute; |
|||
transform: rotate(-45deg); |
|||
} |
|||
|
|||
.uni-datetime-picker--btn { |
|||
border-radius: 100px; |
|||
height: 40px; |
|||
line-height: 40px; |
|||
background-color: $uni-primary; |
|||
color: #fff; |
|||
font-size: 16px; |
|||
letter-spacing: 2px; |
|||
} |
|||
|
|||
/* #ifndef APP-NVUE */ |
|||
.uni-datetime-picker--btn:active { |
|||
opacity: 0.7; |
|||
} |
|||
/* #endif */ |
|||
</style> |
@ -0,0 +1,22 @@ |
|||
{ |
|||
"uni-datetime-picker.selectDate": "select date", |
|||
"uni-datetime-picker.selectTime": "select time", |
|||
"uni-datetime-picker.selectDateTime": "select datetime", |
|||
"uni-datetime-picker.startDate": "start date", |
|||
"uni-datetime-picker.endDate": "end date", |
|||
"uni-datetime-picker.startTime": "start time", |
|||
"uni-datetime-picker.endTime": "end time", |
|||
"uni-datetime-picker.ok": "ok", |
|||
"uni-datetime-picker.clear": "clear", |
|||
"uni-datetime-picker.cancel": "cancel", |
|||
"uni-datetime-picker.year": "-", |
|||
"uni-datetime-picker.month": "", |
|||
"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", |
|||
"uni-calender.confirm": "confirm" |
|||
} |
@ -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,22 @@ |
|||
{ |
|||
"uni-datetime-picker.selectDate": "选择日期", |
|||
"uni-datetime-picker.selectTime": "选择时间", |
|||
"uni-datetime-picker.selectDateTime": "选择日期时间", |
|||
"uni-datetime-picker.startDate": "开始日期", |
|||
"uni-datetime-picker.endDate": "结束日期", |
|||
"uni-datetime-picker.startTime": "开始时间", |
|||
"uni-datetime-picker.endTime": "结束时间", |
|||
"uni-datetime-picker.ok": "确定", |
|||
"uni-datetime-picker.clear": "清除", |
|||
"uni-datetime-picker.cancel": "取消", |
|||
"uni-datetime-picker.year": "年", |
|||
"uni-datetime-picker.month": "月", |
|||
"uni-calender.SUN": "日", |
|||
"uni-calender.MON": "一", |
|||
"uni-calender.TUE": "二", |
|||
"uni-calender.WED": "三", |
|||
"uni-calender.THU": "四", |
|||
"uni-calender.FRI": "五", |
|||
"uni-calender.SAT": "六", |
|||
"uni-calender.confirm": "确认" |
|||
} |
@ -0,0 +1,22 @@ |
|||
{ |
|||
"uni-datetime-picker.selectDate": "選擇日期", |
|||
"uni-datetime-picker.selectTime": "選擇時間", |
|||
"uni-datetime-picker.selectDateTime": "選擇日期時間", |
|||
"uni-datetime-picker.startDate": "開始日期", |
|||
"uni-datetime-picker.endDate": "結束日期", |
|||
"uni-datetime-picker.startTime": "開始时间", |
|||
"uni-datetime-picker.endTime": "結束时间", |
|||
"uni-datetime-picker.ok": "確定", |
|||
"uni-datetime-picker.clear": "清除", |
|||
"uni-datetime-picker.cancel": "取消", |
|||
"uni-datetime-picker.year": "年", |
|||
"uni-datetime-picker.month": "月", |
|||
"uni-calender.SUN": "日", |
|||
"uni-calender.MON": "一", |
|||
"uni-calender.TUE": "二", |
|||
"uni-calender.WED": "三", |
|||
"uni-calender.THU": "四", |
|||
"uni-calender.FRI": "五", |
|||
"uni-calender.SAT": "六", |
|||
"uni-calender.confirm": "確認" |
|||
} |
@ -0,0 +1,45 @@ |
|||
// #ifdef H5
|
|||
export default { |
|||
name: 'Keypress', |
|||
props: { |
|||
disable: { |
|||
type: Boolean, |
|||
default: false |
|||
} |
|||
}, |
|||
mounted () { |
|||
const keyNames = { |
|||
esc: ['Esc', 'Escape'], |
|||
tab: 'Tab', |
|||
enter: 'Enter', |
|||
space: [' ', 'Spacebar'], |
|||
up: ['Up', 'ArrowUp'], |
|||
left: ['Left', 'ArrowLeft'], |
|||
right: ['Right', 'ArrowRight'], |
|||
down: ['Down', 'ArrowDown'], |
|||
delete: ['Backspace', 'Delete', 'Del'] |
|||
} |
|||
const listener = ($event) => { |
|||
if (this.disable) { |
|||
return |
|||
} |
|||
const keyName = Object.keys(keyNames).find(key => { |
|||
const keyName = $event.key |
|||
const value = keyNames[key] |
|||
return value === keyName || (Array.isArray(value) && value.includes(keyName)) |
|||
}) |
|||
if (keyName) { |
|||
// 避免和其他按键事件冲突
|
|||
setTimeout(() => { |
|||
this.$emit(keyName, {}) |
|||
}, 0) |
|||
} |
|||
} |
|||
document.addEventListener('keyup', listener) |
|||
this.$once('hook:beforeDestroy', () => { |
|||
document.removeEventListener('keyup', listener) |
|||
}) |
|||
}, |
|||
render: () => {} |
|||
} |
|||
// #endif
|
@ -0,0 +1,946 @@ |
|||
<template> |
|||
<view class="uni-datetime-picker"> |
|||
<view @click="initTimePicker"> |
|||
<slot> |
|||
<view class="uni-datetime-picker-timebox-pointer" |
|||
:class="{'uni-datetime-picker-disabled': disabled, 'uni-datetime-picker-timebox': border}"> |
|||
<text class="uni-datetime-picker-text">{{time}}</text> |
|||
<view v-if="!time" class="uni-datetime-picker-time"> |
|||
<text class="uni-datetime-picker-text">{{selectTimeText}}</text> |
|||
</view> |
|||
</view> |
|||
</slot> |
|||
</view> |
|||
<view v-if="visible" id="mask" class="uni-datetime-picker-mask" @click="tiggerTimePicker"></view> |
|||
<view v-if="visible" class="uni-datetime-picker-popup" :class="[dateShow && timeShow ? '' : 'fix-nvue-height']" |
|||
:style="fixNvueBug"> |
|||
<view class="uni-title"> |
|||
<text class="uni-datetime-picker-text">{{selectTimeText}}</text> |
|||
</view> |
|||
<view v-if="dateShow" class="uni-datetime-picker__container-box"> |
|||
<picker-view class="uni-datetime-picker-view" :indicator-style="indicatorStyle" :value="ymd" |
|||
@change="bindDateChange"> |
|||
<picker-view-column> |
|||
<view class="uni-datetime-picker-item" v-for="(item,index) in years" :key="index"> |
|||
<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> |
|||
</view> |
|||
</picker-view-column> |
|||
<picker-view-column> |
|||
<view class="uni-datetime-picker-item" v-for="(item,index) in months" :key="index"> |
|||
<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> |
|||
</view> |
|||
</picker-view-column> |
|||
<picker-view-column> |
|||
<view class="uni-datetime-picker-item" v-for="(item,index) in days" :key="index"> |
|||
<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> |
|||
</view> |
|||
</picker-view-column> |
|||
</picker-view> |
|||
<!-- 兼容 nvue 不支持伪类 --> |
|||
<text class="uni-datetime-picker-sign sign-left">-</text> |
|||
<text class="uni-datetime-picker-sign sign-right">-</text> |
|||
</view> |
|||
<view v-if="timeShow" class="uni-datetime-picker__container-box"> |
|||
<picker-view class="uni-datetime-picker-view" :class="[hideSecond ? 'time-hide-second' : '']" |
|||
:indicator-style="indicatorStyle" :value="hms" @change="bindTimeChange"> |
|||
<picker-view-column> |
|||
<view class="uni-datetime-picker-item" v-for="(item,index) in hours" :key="index"> |
|||
<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> |
|||
</view> |
|||
</picker-view-column> |
|||
<picker-view-column> |
|||
<view class="uni-datetime-picker-item" v-for="(item,index) in minutes" :key="index"> |
|||
<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> |
|||
</view> |
|||
</picker-view-column> |
|||
<picker-view-column v-if="!hideSecond"> |
|||
<view class="uni-datetime-picker-item" v-for="(item,index) in seconds" :key="index"> |
|||
<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text> |
|||
</view> |
|||
</picker-view-column> |
|||
</picker-view> |
|||
<!-- 兼容 nvue 不支持伪类 --> |
|||
<text class="uni-datetime-picker-sign" :class="[hideSecond ? 'sign-center' : 'sign-left']">:</text> |
|||
<text v-if="!hideSecond" class="uni-datetime-picker-sign sign-right">:</text> |
|||
</view> |
|||
<view class="uni-datetime-picker-btn"> |
|||
<view @click="clearTime"> |
|||
<text class="uni-datetime-picker-btn-text">{{clearText}}</text> |
|||
</view> |
|||
<view class="uni-datetime-picker-btn-group"> |
|||
<view class="uni-datetime-picker-cancel" @click="tiggerTimePicker"> |
|||
<text class="uni-datetime-picker-btn-text">{{cancelText}}</text> |
|||
</view> |
|||
<view @click="setTime"> |
|||
<text class="uni-datetime-picker-btn-text">{{okText}}</text> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<!-- #ifdef H5 --> |
|||
<!-- <keypress v-if="visible" @esc="tiggerTimePicker" @enter="setTime" /> --> |
|||
<!-- #endif --> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
// #ifdef H5 |
|||
import keypress from './keypress' |
|||
// #endif |
|||
import { |
|||
initVueI18n |
|||
} from '@dcloudio/uni-i18n' |
|||
import messages from './i18n/index.js' |
|||
const { t } = initVueI18n(messages) |
|||
|
|||
/** |
|||
* DatetimePicker 时间选择器 |
|||
* @description 可以同时选择日期和时间的选择器 |
|||
* @tutorial https://ext.dcloud.net.cn/plugin?id=xxx |
|||
* @property {String} type = [datetime | date | time] 显示模式 |
|||
* @property {Boolean} multiple = [true|false] 是否多选 |
|||
* @property {String|Number} value 默认值 |
|||
* @property {String|Number} start 起始日期或时间 |
|||
* @property {String|Number} end 起始日期或时间 |
|||
* @property {String} return-type = [timestamp | string] |
|||
* @event {Function} change 选中发生变化触发 |
|||
*/ |
|||
|
|||
export default { |
|||
name: 'UniDatetimePicker', |
|||
components: { |
|||
// #ifdef H5 |
|||
keypress |
|||
// #endif |
|||
}, |
|||
data() { |
|||
return { |
|||
indicatorStyle: `height: 50px;`, |
|||
visible: false, |
|||
fixNvueBug: {}, |
|||
dateShow: true, |
|||
timeShow: true, |
|||
title: '日期和时间', |
|||
// 输入框当前时间 |
|||
time: '', |
|||
// 当前的年月日时分秒 |
|||
year: 1920, |
|||
month: 0, |
|||
day: 0, |
|||
hour: 0, |
|||
minute: 0, |
|||
second: 0, |
|||
// 起始时间 |
|||
startYear: 1920, |
|||
startMonth: 1, |
|||
startDay: 1, |
|||
startHour: 0, |
|||
startMinute: 0, |
|||
startSecond: 0, |
|||
// 结束时间 |
|||
endYear: 2120, |
|||
endMonth: 12, |
|||
endDay: 31, |
|||
endHour: 23, |
|||
endMinute: 59, |
|||
endSecond: 59, |
|||
} |
|||
}, |
|||
props: { |
|||
type: { |
|||
type: String, |
|||
default: 'datetime' |
|||
}, |
|||
value: { |
|||
type: [String, Number], |
|||
default: '' |
|||
}, |
|||
modelValue: { |
|||
type: [String, Number], |
|||
default: '' |
|||
}, |
|||
start: { |
|||
type: [Number, String], |
|||
default: '' |
|||
}, |
|||
end: { |
|||
type: [Number, String], |
|||
default: '' |
|||
}, |
|||
returnType: { |
|||
type: String, |
|||
default: 'string' |
|||
}, |
|||
disabled: { |
|||
type: [Boolean, String], |
|||
default: false |
|||
}, |
|||
border: { |
|||
type: [Boolean, String], |
|||
default: true |
|||
}, |
|||
hideSecond: { |
|||
type: [Boolean, String], |
|||
default: false |
|||
} |
|||
}, |
|||
watch: { |
|||
// #ifndef VUE3 |
|||
value: { |
|||
handler(newVal, oldVal) { |
|||
if (newVal) { |
|||
this.parseValue(this.fixIosDateFormat(newVal)) //兼容 iOS、safari 日期格式 |
|||
this.initTime(false) |
|||
} else { |
|||
this.time = '' |
|||
this.parseValue(Date.now()) |
|||
} |
|||
}, |
|||
immediate: true |
|||
}, |
|||
// #endif |
|||
// #ifdef VUE3 |
|||
modelValue: { |
|||
handler(newVal, oldVal) { |
|||
if (newVal) { |
|||
this.parseValue(this.fixIosDateFormat(newVal)) //兼容 iOS、safari 日期格式 |
|||
this.initTime(false) |
|||
} else { |
|||
this.time = '' |
|||
this.parseValue(Date.now()) |
|||
} |
|||
}, |
|||
immediate: true |
|||
}, |
|||
// #endif |
|||
type: { |
|||
handler(newValue) { |
|||
if (newValue === 'date') { |
|||
this.dateShow = true |
|||
this.timeShow = false |
|||
this.title = '日期' |
|||
} else if (newValue === 'time') { |
|||
this.dateShow = false |
|||
this.timeShow = true |
|||
this.title = '时间' |
|||
} else { |
|||
this.dateShow = true |
|||
this.timeShow = true |
|||
this.title = '日期和时间' |
|||
} |
|||
}, |
|||
immediate: true |
|||
}, |
|||
start: { |
|||
handler(newVal) { |
|||
this.parseDatetimeRange(this.fixIosDateFormat(newVal), 'start') //兼容 iOS、safari 日期格式 |
|||
}, |
|||
immediate: true |
|||
}, |
|||
end: { |
|||
handler(newVal) { |
|||
this.parseDatetimeRange(this.fixIosDateFormat(newVal), 'end') //兼容 iOS、safari 日期格式 |
|||
}, |
|||
immediate: true |
|||
}, |
|||
|
|||
// 月、日、时、分、秒可选范围变化后,检查当前值是否在范围内,不在则当前值重置为可选范围第一项 |
|||
months(newVal) { |
|||
this.checkValue('month', this.month, newVal) |
|||
}, |
|||
days(newVal) { |
|||
this.checkValue('day', this.day, newVal) |
|||
}, |
|||
hours(newVal) { |
|||
this.checkValue('hour', this.hour, newVal) |
|||
}, |
|||
minutes(newVal) { |
|||
this.checkValue('minute', this.minute, newVal) |
|||
}, |
|||
seconds(newVal) { |
|||
this.checkValue('second', this.second, newVal) |
|||
} |
|||
}, |
|||
computed: { |
|||
// 当前年、月、日、时、分、秒选择范围 |
|||
years() { |
|||
return this.getCurrentRange('year') |
|||
}, |
|||
|
|||
months() { |
|||
return this.getCurrentRange('month') |
|||
}, |
|||
|
|||
days() { |
|||
return this.getCurrentRange('day') |
|||
}, |
|||
|
|||
hours() { |
|||
return this.getCurrentRange('hour') |
|||
}, |
|||
|
|||
minutes() { |
|||
return this.getCurrentRange('minute') |
|||
}, |
|||
|
|||
seconds() { |
|||
return this.getCurrentRange('second') |
|||
}, |
|||
|
|||
// picker 当前值数组 |
|||
ymd() { |
|||
return [this.year - this.minYear, this.month - this.minMonth, this.day - this.minDay] |
|||
}, |
|||
hms() { |
|||
return [this.hour - this.minHour, this.minute - this.minMinute, this.second - this.minSecond] |
|||
}, |
|||
|
|||
// 当前 date 是 start |
|||
currentDateIsStart() { |
|||
return this.year === this.startYear && this.month === this.startMonth && this.day === this.startDay |
|||
}, |
|||
|
|||
// 当前 date 是 end |
|||
currentDateIsEnd() { |
|||
return this.year === this.endYear && this.month === this.endMonth && this.day === this.endDay |
|||
}, |
|||
|
|||
// 当前年、月、日、时、分、秒的最小值和最大值 |
|||
minYear() { |
|||
return this.startYear |
|||
}, |
|||
maxYear() { |
|||
return this.endYear |
|||
}, |
|||
minMonth() { |
|||
if (this.year === this.startYear) { |
|||
return this.startMonth |
|||
} else { |
|||
return 1 |
|||
} |
|||
}, |
|||
maxMonth() { |
|||
if (this.year === this.endYear) { |
|||
return this.endMonth |
|||
} else { |
|||
return 12 |
|||
} |
|||
}, |
|||
minDay() { |
|||
if (this.year === this.startYear && this.month === this.startMonth) { |
|||
return this.startDay |
|||
} else { |
|||
return 1 |
|||
} |
|||
}, |
|||
maxDay() { |
|||
if (this.year === this.endYear && this.month === this.endMonth) { |
|||
return this.endDay |
|||
} else { |
|||
return this.daysInMonth(this.year, this.month) |
|||
} |
|||
}, |
|||
minHour() { |
|||
if (this.type === 'datetime') { |
|||
if (this.currentDateIsStart) { |
|||
return this.startHour |
|||
} else { |
|||
return 0 |
|||
} |
|||
} |
|||
if (this.type === 'time') { |
|||
return this.startHour |
|||
} |
|||
}, |
|||
maxHour() { |
|||
if (this.type === 'datetime') { |
|||
if (this.currentDateIsEnd) { |
|||
return this.endHour |
|||
} else { |
|||
return 23 |
|||
} |
|||
} |
|||
if (this.type === 'time') { |
|||
return this.endHour |
|||
} |
|||
}, |
|||
minMinute() { |
|||
if (this.type === 'datetime') { |
|||
if (this.currentDateIsStart && this.hour === this.startHour) { |
|||
return this.startMinute |
|||
} else { |
|||
return 0 |
|||
} |
|||
} |
|||
if (this.type === 'time') { |
|||
if (this.hour === this.startHour) { |
|||
return this.startMinute |
|||
} else { |
|||
return 0 |
|||
} |
|||
} |
|||
}, |
|||
maxMinute() { |
|||
if (this.type === 'datetime') { |
|||
if (this.currentDateIsEnd && this.hour === this.endHour) { |
|||
return this.endMinute |
|||
} else { |
|||
return 59 |
|||
} |
|||
} |
|||
if (this.type === 'time') { |
|||
if (this.hour === this.endHour) { |
|||
return this.endMinute |
|||
} else { |
|||
return 59 |
|||
} |
|||
} |
|||
}, |
|||
minSecond() { |
|||
if (this.type === 'datetime') { |
|||
if (this.currentDateIsStart && this.hour === this.startHour && this.minute === this.startMinute) { |
|||
return this.startSecond |
|||
} else { |
|||
return 0 |
|||
} |
|||
} |
|||
if (this.type === 'time') { |
|||
if (this.hour === this.startHour && this.minute === this.startMinute) { |
|||
return this.startSecond |
|||
} else { |
|||
return 0 |
|||
} |
|||
} |
|||
}, |
|||
maxSecond() { |
|||
if (this.type === 'datetime') { |
|||
if (this.currentDateIsEnd && this.hour === this.endHour && this.minute === this.endMinute) { |
|||
return this.endSecond |
|||
} else { |
|||
return 59 |
|||
} |
|||
} |
|||
if (this.type === 'time') { |
|||
if (this.hour === this.endHour && this.minute === this.endMinute) { |
|||
return this.endSecond |
|||
} else { |
|||
return 59 |
|||
} |
|||
} |
|||
}, |
|||
|
|||
/** |
|||
* for i18n |
|||
*/ |
|||
selectTimeText() { |
|||
return t("uni-datetime-picker.selectTime") |
|||
}, |
|||
okText() { |
|||
return t("uni-datetime-picker.ok") |
|||
}, |
|||
clearText() { |
|||
return t("uni-datetime-picker.clear") |
|||
}, |
|||
cancelText() { |
|||
return t("uni-datetime-picker.cancel") |
|||
} |
|||
}, |
|||
|
|||
mounted() { |
|||
// #ifdef APP-NVUE |
|||
const res = uni.getSystemInfoSync(); |
|||
this.fixNvueBug = { |
|||
top: res.windowHeight / 2, |
|||
left: res.windowWidth / 2 |
|||
} |
|||
// #endif |
|||
}, |
|||
|
|||
methods: { |
|||
/** |
|||
* @param {Object} item |
|||
* 小于 10 在前面加个 0 |
|||
*/ |
|||
|
|||
lessThanTen(item) { |
|||
return item < 10 ? '0' + item : item |
|||
}, |
|||
|
|||
/** |
|||
* 解析时分秒字符串,例如:00:00:00 |
|||
* @param {String} timeString |
|||
*/ |
|||
parseTimeType(timeString) { |
|||
if (timeString) { |
|||
let timeArr = timeString.split(':') |
|||
this.hour = Number(timeArr[0]) |
|||
this.minute = Number(timeArr[1]) |
|||
this.second = Number(timeArr[2]) |
|||
} |
|||
}, |
|||
|
|||
/** |
|||
* 解析选择器初始值,类型可以是字符串、时间戳,例如:2000-10-02、'08:30:00'、 1610695109000 |
|||
* @param {String | Number} datetime |
|||
*/ |
|||
initPickerValue(datetime) { |
|||
let defaultValue = null |
|||
if (datetime) { |
|||
defaultValue = this.compareValueWithStartAndEnd(datetime, this.start, this.end) |
|||
} else { |
|||
defaultValue = Date.now() |
|||
defaultValue = this.compareValueWithStartAndEnd(defaultValue, this.start, this.end) |
|||
} |
|||
this.parseValue(defaultValue) |
|||
}, |
|||
|
|||
/** |
|||
* 初始值规则: |
|||
* - 用户设置初始值 value |
|||
* - 设置了起始时间 start、终止时间 end,并 start < value < end,初始值为 value, 否则初始值为 start |
|||
* - 只设置了起始时间 start,并 start < value,初始值为 value,否则初始值为 start |
|||
* - 只设置了终止时间 end,并 value < end,初始值为 value,否则初始值为 end |
|||
* - 无起始终止时间,则初始值为 value |
|||
* - 无初始值 value,则初始值为当前本地时间 Date.now() |
|||
* @param {Object} value |
|||
* @param {Object} dateBase |
|||
*/ |
|||
compareValueWithStartAndEnd(value, start, end) { |
|||
let winner = null |
|||
value = this.superTimeStamp(value) |
|||
start = this.superTimeStamp(start) |
|||
end = this.superTimeStamp(end) |
|||
|
|||
if (start && end) { |
|||
if (value < start) { |
|||
winner = new Date(start) |
|||
} else if (value > end) { |
|||
winner = new Date(end) |
|||
} else { |
|||
winner = new Date(value) |
|||
} |
|||
} else if (start && !end) { |
|||
winner = start <= value ? new Date(value) : new Date(start) |
|||
} else if (!start && end) { |
|||
winner = value <= end ? new Date(value) : new Date(end) |
|||
} else { |
|||
winner = new Date(value) |
|||
} |
|||
|
|||
return winner |
|||
}, |
|||
|
|||
/** |
|||
* 转换为可比较的时间戳,接受日期、时分秒、时间戳 |
|||
* @param {Object} value |
|||
*/ |
|||
superTimeStamp(value) { |
|||
let dateBase = '' |
|||
if (this.type === 'time' && value && typeof value === 'string') { |
|||
const now = new Date() |
|||
const year = now.getFullYear() |
|||
const month = now.getMonth() + 1 |
|||
const day = now.getDate() |
|||
dateBase = year + '/' + month + '/' + day + ' ' |
|||
} |
|||
if (Number(value) && typeof value !== NaN) { |
|||
value = parseInt(value) |
|||
dateBase = 0 |
|||
} |
|||
return this.createTimeStamp(dateBase + value) |
|||
}, |
|||
|
|||
/** |
|||
* 解析默认值 value,字符串、时间戳 |
|||
* @param {Object} defaultTime |
|||
*/ |
|||
parseValue(value) { |
|||
if (!value) { |
|||
return |
|||
} |
|||
if (this.type === 'time' && typeof value === "string") { |
|||
this.parseTimeType(value) |
|||
} else { |
|||
let defaultDate = null |
|||
defaultDate = new Date(value) |
|||
if (this.type !== 'time') { |
|||
this.year = defaultDate.getFullYear() |
|||
this.month = defaultDate.getMonth() + 1 |
|||
this.day = defaultDate.getDate() |
|||
} |
|||
if (this.type !== 'date') { |
|||
this.hour = defaultDate.getHours() |
|||
this.minute = defaultDate.getMinutes() |
|||
this.second = defaultDate.getSeconds() |
|||
} |
|||
} |
|||
if (this.hideSecond) { |
|||
this.second = 0 |
|||
} |
|||
}, |
|||
|
|||
/** |
|||
* 解析可选择时间范围 start、end,年月日字符串、时间戳 |
|||
* @param {Object} defaultTime |
|||
*/ |
|||
parseDatetimeRange(point, pointType) { |
|||
// 时间为空,则重置为初始值 |
|||
if (!point) { |
|||
if (pointType === 'start') { |
|||
this.startYear = 1920 |
|||
this.startMonth = 1 |
|||
this.startDay = 1 |
|||
this.startHour = 0 |
|||
this.startMinute = 0 |
|||
this.startSecond = 0 |
|||
} |
|||
if (pointType === 'end') { |
|||
this.endYear = 2120 |
|||
this.endMonth = 12 |
|||
this.endDay = 31 |
|||
this.endHour = 23 |
|||
this.endMinute = 59 |
|||
this.endSecond = 59 |
|||
} |
|||
return |
|||
} |
|||
if (this.type === 'time') { |
|||
const pointArr = point.split(':') |
|||
this[pointType + 'Hour'] = Number(pointArr[0]) |
|||
this[pointType + 'Minute'] = Number(pointArr[1]) |
|||
this[pointType + 'Second'] = Number(pointArr[2]) |
|||
} else { |
|||
if (!point) { |
|||
pointType === 'start' ? this.startYear = this.year - 60 : this.endYear = this.year + 60 |
|||
return |
|||
} |
|||
if (Number(point) && Number(point) !== NaN) { |
|||
point = parseInt(point) |
|||
} |
|||
// datetime 的 end 没有时分秒, 则不限制 |
|||
const hasTime = /[0-9]:[0-9]/ |
|||
if (this.type === 'datetime' && pointType === 'end' && typeof point === 'string' && !hasTime.test( |
|||
point)) { |
|||
point = point + ' 23:59:59' |
|||
} |
|||
const pointDate = new Date(point) |
|||
this[pointType + 'Year'] = pointDate.getFullYear() |
|||
this[pointType + 'Month'] = pointDate.getMonth() + 1 |
|||
this[pointType + 'Day'] = pointDate.getDate() |
|||
if (this.type === 'datetime') { |
|||
this[pointType + 'Hour'] = pointDate.getHours() |
|||
this[pointType + 'Minute'] = pointDate.getMinutes() |
|||
this[pointType + 'Second'] = pointDate.getSeconds() |
|||
} |
|||
} |
|||
}, |
|||
|
|||
// 获取 年、月、日、时、分、秒 当前可选范围 |
|||
getCurrentRange(value) { |
|||
const range = [] |
|||
for (let i = this['min' + this.capitalize(value)]; i <= this['max' + this.capitalize(value)]; i++) { |
|||
range.push(i) |
|||
} |
|||
return range |
|||
}, |
|||
|
|||
// 字符串首字母大写 |
|||
capitalize(str) { |
|||
return str.charAt(0).toUpperCase() + str.slice(1) |
|||
}, |
|||
|
|||
// 检查当前值是否在范围内,不在则当前值重置为可选范围第一项 |
|||
checkValue(name, value, values) { |
|||
if (values.indexOf(value) === -1) { |
|||
this[name] = values[0] |
|||
} |
|||
}, |
|||
|
|||
// 每个月的实际天数 |
|||
daysInMonth(year, month) { // Use 1 for January, 2 for February, etc. |
|||
return new Date(year, month, 0).getDate(); |
|||
}, |
|||
|
|||
//兼容 iOS、safari 日期格式 |
|||
fixIosDateFormat(value) { |
|||
if (typeof value === 'string') { |
|||
value = value.replace(/-/g, '/') |
|||
} |
|||
return value |
|||
}, |
|||
|
|||
/** |
|||
* 生成时间戳 |
|||
* @param {Object} time |
|||
*/ |
|||
createTimeStamp(time) { |
|||
if (!time) return |
|||
if (typeof time === "number") { |
|||
return time |
|||
} else { |
|||
time = time.replace(/-/g, '/') |
|||
if (this.type === 'date') { |
|||
time = time + ' ' + '00:00:00' |
|||
} |
|||
return Date.parse(time) |
|||
} |
|||
}, |
|||
|
|||
/** |
|||
* 生成日期或时间的字符串 |
|||
*/ |
|||
createDomSting() { |
|||
const yymmdd = this.year + |
|||
'-' + |
|||
this.lessThanTen(this.month) + |
|||
'-' + |
|||
this.lessThanTen(this.day) |
|||
|
|||
let hhmmss = this.lessThanTen(this.hour) + |
|||
':' + |
|||
this.lessThanTen(this.minute) |
|||
|
|||
if (!this.hideSecond) { |
|||
hhmmss = hhmmss + ':' + this.lessThanTen(this.second) |
|||
} |
|||
|
|||
if (this.type === 'date') { |
|||
return yymmdd |
|||
} else if (this.type === 'time') { |
|||
return hhmmss |
|||
} else { |
|||
return yymmdd + ' ' + hhmmss |
|||
} |
|||
}, |
|||
|
|||
/** |
|||
* 初始化返回值,并抛出 change 事件 |
|||
*/ |
|||
initTime(emit = true) { |
|||
this.time = this.createDomSting() |
|||
if (!emit) return |
|||
if (this.returnType === 'timestamp' && this.type !== 'time') { |
|||
this.$emit('change', this.createTimeStamp(this.time)) |
|||
this.$emit('input', this.createTimeStamp(this.time)) |
|||
this.$emit('update:modelValue', this.createTimeStamp(this.time)) |
|||
} else { |
|||
this.$emit('change', this.time) |
|||
this.$emit('input', this.time) |
|||
this.$emit('update:modelValue', this.time) |
|||
} |
|||
}, |
|||
|
|||
/** |
|||
* 用户选择日期或时间更新 data |
|||
* @param {Object} e |
|||
*/ |
|||
bindDateChange(e) { |
|||
const val = e.detail.value |
|||
this.year = this.years[val[0]] |
|||
this.month = this.months[val[1]] |
|||
this.day = this.days[val[2]] |
|||
}, |
|||
bindTimeChange(e) { |
|||
const val = e.detail.value |
|||
this.hour = this.hours[val[0]] |
|||
this.minute = this.minutes[val[1]] |
|||
this.second = this.seconds[val[2]] |
|||
}, |
|||
|
|||
/** |
|||
* 初始化弹出层 |
|||
*/ |
|||
initTimePicker() { |
|||
if (this.disabled) return |
|||
const value = this.fixIosDateFormat(this.value) |
|||
this.initPickerValue(value) |
|||
this.visible = !this.visible |
|||
}, |
|||
|
|||
/** |
|||
* 触发或关闭弹框 |
|||
*/ |
|||
tiggerTimePicker(e) { |
|||
this.visible = !this.visible |
|||
}, |
|||
|
|||
/** |
|||
* 用户点击“清空”按钮,清空当前值 |
|||
*/ |
|||
clearTime() { |
|||
this.time = '' |
|||
this.$emit('change', this.time) |
|||
this.$emit('input', this.time) |
|||
this.$emit('update:modelValue', this.time) |
|||
this.tiggerTimePicker() |
|||
}, |
|||
|
|||
/** |
|||
* 用户点击“确定”按钮 |
|||
*/ |
|||
setTime() { |
|||
this.initTime() |
|||
this.tiggerTimePicker() |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
$uni-primary: #007aff !default; |
|||
|
|||
.uni-datetime-picker { |
|||
/* #ifndef APP-NVUE */ |
|||
/* width: 100%; */ |
|||
/* #endif */ |
|||
} |
|||
|
|||
.uni-datetime-picker-view { |
|||
height: 130px; |
|||
width: 270px; |
|||
/* #ifndef APP-NVUE */ |
|||
cursor: pointer; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.uni-datetime-picker-item { |
|||
height: 50px; |
|||
line-height: 50px; |
|||
text-align: center; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.uni-datetime-picker-btn { |
|||
margin-top: 60px; |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
cursor: pointer; |
|||
/* #endif */ |
|||
flex-direction: row; |
|||
justify-content: space-between; |
|||
} |
|||
|
|||
.uni-datetime-picker-btn-text { |
|||
font-size: 14px; |
|||
color: $uni-primary; |
|||
} |
|||
|
|||
.uni-datetime-picker-btn-group { |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
flex-direction: row; |
|||
} |
|||
|
|||
.uni-datetime-picker-cancel { |
|||
margin-right: 30px; |
|||
} |
|||
|
|||
.uni-datetime-picker-mask { |
|||
position: fixed; |
|||
bottom: 0px; |
|||
top: 0px; |
|||
left: 0px; |
|||
right: 0px; |
|||
background-color: rgba(0, 0, 0, 0.4); |
|||
transition-duration: 0.3s; |
|||
z-index: 998; |
|||
} |
|||
|
|||
.uni-datetime-picker-popup { |
|||
border-radius: 8px; |
|||
padding: 30px; |
|||
width: 270px; |
|||
/* #ifdef APP-NVUE */ |
|||
height: 500px; |
|||
/* #endif */ |
|||
/* #ifdef APP-NVUE */ |
|||
width: 330px; |
|||
/* #endif */ |
|||
background-color: #fff; |
|||
position: fixed; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
transition-duration: 0.3s; |
|||
z-index: 999; |
|||
} |
|||
|
|||
.fix-nvue-height { |
|||
/* #ifdef APP-NVUE */ |
|||
height: 330px; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.uni-datetime-picker-time { |
|||
color: grey; |
|||
} |
|||
|
|||
.uni-datetime-picker-column { |
|||
height: 50px; |
|||
} |
|||
|
|||
.uni-datetime-picker-timebox { |
|||
|
|||
border: 1px solid #E5E5E5; |
|||
border-radius: 5px; |
|||
padding: 7px 10px; |
|||
/* #ifndef APP-NVUE */ |
|||
box-sizing: border-box; |
|||
cursor: pointer; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.uni-datetime-picker-timebox-pointer { |
|||
/* #ifndef APP-NVUE */ |
|||
cursor: pointer; |
|||
/* #endif */ |
|||
} |
|||
|
|||
|
|||
.uni-datetime-picker-disabled { |
|||
opacity: 0.4; |
|||
/* #ifdef H5 */ |
|||
cursor: not-allowed !important; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.uni-datetime-picker-text { |
|||
font-size: 14px; |
|||
line-height: 50px |
|||
} |
|||
|
|||
.uni-datetime-picker-sign { |
|||
position: absolute; |
|||
top: 53px; |
|||
/* 减掉 10px 的元素高度,兼容nvue */ |
|||
color: #999; |
|||
/* #ifdef APP-NVUE */ |
|||
font-size: 16px; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.sign-left { |
|||
left: 86px; |
|||
} |
|||
|
|||
.sign-right { |
|||
right: 86px; |
|||
} |
|||
|
|||
.sign-center { |
|||
left: 135px; |
|||
} |
|||
|
|||
.uni-datetime-picker__container-box { |
|||
position: relative; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
margin-top: 40px; |
|||
} |
|||
|
|||
.time-hide-second { |
|||
width: 180px; |
|||
} |
|||
</style> |
File diff suppressed because it is too large
@ -0,0 +1,410 @@ |
|||
class Calendar { |
|||
constructor({ |
|||
date, |
|||
selected, |
|||
startDate, |
|||
endDate, |
|||
range, |
|||
// multipleStatus
|
|||
} = {}) { |
|||
// 当前日期
|
|||
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)
|
|||
// this.multipleStatus = multipleStatus
|
|||
this.lastHover = false |
|||
} |
|||
/** |
|||
* 设置日期 |
|||
* @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) { |
|||
dd.setDate(dd.getDate() + AddDayCount) |
|||
} else { |
|||
dd.setMonth(dd.getMonth() + AddDayCount) // 获取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, |
|||
disable: true |
|||
}) |
|||
} |
|||
return dateArr |
|||
} |
|||
/** |
|||
* 获取本月天数 |
|||
*/ |
|||
_currentMonthDys(dateData, full) { |
|||
let dateArr = [] |
|||
let fullDate = this.date.fullDate |
|||
for (let i = 1; i <= dateData; i++) { |
|||
let isinfo = false |
|||
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.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after), |
|||
afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after), |
|||
month: full.month, |
|||
disable: !(disableBefore && disableAfter), |
|||
isDay, |
|||
userChecked: false |
|||
} |
|||
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, |
|||
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 |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 比较真实起始日期 |
|||
*/ |
|||
|
|||
isLogicBefore(currentDay, before, after) { |
|||
let logicBefore = before |
|||
if (before && after) { |
|||
logicBefore = this.dateCompare(before, after) ? before : after |
|||
} |
|||
return this.dateEqual(logicBefore, currentDay) |
|||
} |
|||
|
|||
isLogicAfter(currentDay, before, after) { |
|||
let logicAfter = after |
|||
if (before && after) { |
|||
logicAfter = this.dateCompare(before, after) ? after : before |
|||
} |
|||
return this.dateEqual(logicAfter, currentDay) |
|||
} |
|||
|
|||
/** |
|||
* 获取日期范围内所有日期 |
|||
* @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 |
|||
} |
|||
|
|||
/** |
|||
* 获取多选状态 |
|||
*/ |
|||
setMultiple(fullDate) { |
|||
let { |
|||
before, |
|||
after |
|||
} = this.multipleStatus |
|||
if (!this.range) return |
|||
if (before && after) { |
|||
if (!this.lastHover) { |
|||
this.lastHover = true |
|||
return |
|||
} |
|||
this.multipleStatus.before = fullDate |
|||
this.multipleStatus.after = '' |
|||
this.multipleStatus.data = [] |
|||
this.multipleStatus.fulldate = '' |
|||
this.lastHover = false |
|||
} else { |
|||
if (!before) { |
|||
this.multipleStatus.before = fullDate |
|||
this.lastHover = false |
|||
} 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.lastHover = true |
|||
} |
|||
} |
|||
this._getWeek(fullDate) |
|||
} |
|||
|
|||
/** |
|||
* 鼠标 hover 更新多选状态 |
|||
*/ |
|||
setHoverMultiple(fullDate) { |
|||
let { |
|||
before, |
|||
after |
|||
} = this.multipleStatus |
|||
|
|||
if (!this.range) return |
|||
if (this.lastHover) return |
|||
|
|||
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) |
|||
} |
|||
|
|||
/** |
|||
* 更新默认值多选状态 |
|||
*/ |
|||
setDefaultMultiple(before, after) { |
|||
this.multipleStatus.before = before |
|||
this.multipleStatus.after = after |
|||
if (before && after) { |
|||
if (this.dateCompare(before, after)) { |
|||
this.multipleStatus.data = this.geDateAll(before, after); |
|||
this._getWeek(after) |
|||
} else { |
|||
this.multipleStatus.data = this.geDateAll(after, before); |
|||
this._getWeek(before) |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 获取每周数据 |
|||
* @param {Object} dateData |
|||
*/ |
|||
_getWeek(dateData) { |
|||
const { |
|||
fullDate, |
|||
year, |
|||
month, |
|||
date, |
|||
day |
|||
} = 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,87 @@ |
|||
{ |
|||
"id": "uni-datetime-picker", |
|||
"displayName": "uni-datetime-picker 日期选择器", |
|||
"version": "2.2.13", |
|||
"description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", |
|||
"keywords": [ |
|||
"uni-datetime-picker", |
|||
"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", |
|||
"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,21 @@ |
|||
|
|||
|
|||
> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` |
|||
|
|||
## DatetimePicker 时间选择器 |
|||
|
|||
> **组件名:uni-datetime-picker** |
|||
> 代码块: `uDatetimePicker` |
|||
|
|||
|
|||
该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 |
|||
|
|||
若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 |
|||
|
|||
**_点击 picker 默认值规则:_** |
|||
|
|||
- 若设置初始值 value, 会显示在 picker 显示框中 |
|||
- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 |
|||
|
|||
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) |
|||
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
@ -0,0 +1,22 @@ |
|||
## 1.3.5(2022-01-24) |
|||
- 优化 size 属性可以传入不带单位的字符串数值 |
|||
## 1.3.4(2022-01-24) |
|||
- 优化 size 支持其他单位 |
|||
## 1.3.3(2022-01-17) |
|||
- 修复 nvue 有些图标不显示的bug,兼容老版本图标 |
|||
## 1.3.2(2021-12-01) |
|||
- 优化 示例可复制图标名称 |
|||
## 1.3.1(2021-11-23) |
|||
- 优化 兼容旧组件 type 值 |
|||
## 1.3.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-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) |
|||
## 1.1.7(2021-11-08) |
|||
## 1.2.0(2021-07-30) |
|||
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
|||
## 1.1.5(2021-05-12) |
|||
- 新增 组件示例地址 |
|||
## 1.1.4(2021-02-05) |
|||
- 调整为uni_modules目录规范 |
File diff suppressed because it is too large
@ -0,0 +1,96 @@ |
|||
<template> |
|||
<!-- #ifdef APP-NVUE --> |
|||
<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text> |
|||
<!-- #endif --> |
|||
<!-- #ifndef APP-NVUE --> |
|||
<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text> |
|||
<!-- #endif --> |
|||
</template> |
|||
|
|||
<script> |
|||
import icons from './icons.js'; |
|||
const getVal = (val) => { |
|||
const reg = /^[0-9]*$/g |
|||
return (typeof val === 'number' || reg.test(val) )? val + 'px' : val; |
|||
} |
|||
// #ifdef APP-NVUE |
|||
var domModule = weex.requireModule('dom'); |
|||
import iconUrl from './uniicons.ttf' |
|||
domModule.addRule('fontFace', { |
|||
'fontFamily': "uniicons", |
|||
'src': "url('"+iconUrl+"')" |
|||
}); |
|||
// #endif |
|||
|
|||
/** |
|||
* Icons 图标 |
|||
* @description 用于展示 icons 图标 |
|||
* @tutorial https://ext.dcloud.net.cn/plugin?id=28 |
|||
* @property {Number} size 图标大小 |
|||
* @property {String} type 图标图案,参考示例 |
|||
* @property {String} color 图标颜色 |
|||
* @property {String} customPrefix 自定义图标 |
|||
* @event {Function} click 点击 Icon 触发事件 |
|||
*/ |
|||
export default { |
|||
name: 'UniIcons', |
|||
emits:['click'], |
|||
props: { |
|||
type: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
color: { |
|||
type: String, |
|||
default: '#333333' |
|||
}, |
|||
size: { |
|||
type: [Number, String], |
|||
default: 16 |
|||
}, |
|||
customPrefix:{ |
|||
type: String, |
|||
default: '' |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
icons: icons.glyphs |
|||
} |
|||
}, |
|||
computed:{ |
|||
unicode(){ |
|||
let code = this.icons.find(v=>v.font_class === this.type) |
|||
if(code){ |
|||
return unescape(`%u${code.unicode}`) |
|||
} |
|||
return '' |
|||
}, |
|||
iconSize(){ |
|||
return getVal(this.size) |
|||
} |
|||
}, |
|||
methods: { |
|||
_onClick() { |
|||
this.$emit('click') |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
/* #ifndef APP-NVUE */ |
|||
@import './uniicons.css'; |
|||
@font-face { |
|||
font-family: uniicons; |
|||
src: url('./uniicons.ttf') format('truetype'); |
|||
} |
|||
|
|||
/* #endif */ |
|||
.uni-icons { |
|||
font-family: uniicons; |
|||
text-decoration: none; |
|||
text-align: center; |
|||
} |
|||
|
|||
</style> |
@ -0,0 +1,663 @@ |
|||
.uniui-color:before { |
|||
content: "\e6cf"; |
|||
} |
|||
|
|||
.uniui-wallet:before { |
|||
content: "\e6b1"; |
|||
} |
|||
|
|||
.uniui-settings-filled:before { |
|||
content: "\e6ce"; |
|||
} |
|||
|
|||
.uniui-auth-filled:before { |
|||
content: "\e6cc"; |
|||
} |
|||
|
|||
.uniui-shop-filled:before { |
|||
content: "\e6cd"; |
|||
} |
|||
|
|||
.uniui-staff-filled:before { |
|||
content: "\e6cb"; |
|||
} |
|||
|
|||
.uniui-vip-filled:before { |
|||
content: "\e6c6"; |
|||
} |
|||
|
|||
.uniui-plus-filled:before { |
|||
content: "\e6c7"; |
|||
} |
|||
|
|||
.uniui-folder-add-filled:before { |
|||
content: "\e6c8"; |
|||
} |
|||
|
|||
.uniui-color-filled:before { |
|||
content: "\e6c9"; |
|||
} |
|||
|
|||
.uniui-tune-filled:before { |
|||
content: "\e6ca"; |
|||
} |
|||
|
|||
.uniui-calendar-filled:before { |
|||
content: "\e6c0"; |
|||
} |
|||
|
|||
.uniui-notification-filled:before { |
|||
content: "\e6c1"; |
|||
} |
|||
|
|||
.uniui-wallet-filled:before { |
|||
content: "\e6c2"; |
|||
} |
|||
|
|||
.uniui-medal-filled:before { |
|||
content: "\e6c3"; |
|||
} |
|||
|
|||
.uniui-gift-filled:before { |
|||
content: "\e6c4"; |
|||
} |
|||
|
|||
.uniui-fire-filled:before { |
|||
content: "\e6c5"; |
|||
} |
|||
|
|||
.uniui-refreshempty:before { |
|||
content: "\e6bf"; |
|||
} |
|||
|
|||
.uniui-location-filled:before { |
|||
content: "\e6af"; |
|||
} |
|||
|
|||
.uniui-person-filled:before { |
|||
content: "\e69d"; |
|||
} |
|||
|
|||
.uniui-personadd-filled:before { |
|||
content: "\e698"; |
|||
} |
|||
|
|||
.uniui-back:before { |
|||
content: "\e6b9"; |
|||
} |
|||
|
|||
.uniui-forward:before { |
|||
content: "\e6ba"; |
|||
} |
|||
|
|||
.uniui-arrow-right:before { |
|||
content: "\e6bb"; |
|||
} |
|||
|
|||
.uniui-arrowthinright:before { |
|||
content: "\e6bb"; |
|||
} |
|||
|
|||
.uniui-arrow-left:before { |
|||
content: "\e6bc"; |
|||
} |
|||
|
|||
.uniui-arrowthinleft:before { |
|||
content: "\e6bc"; |
|||
} |
|||
|
|||
.uniui-arrow-up:before { |
|||
content: "\e6bd"; |
|||
} |
|||
|
|||
.uniui-arrowthinup:before { |
|||
content: "\e6bd"; |
|||
} |
|||
|
|||
.uniui-arrow-down:before { |
|||
content: "\e6be"; |
|||
} |
|||
|
|||
.uniui-arrowthindown:before { |
|||
content: "\e6be"; |
|||
} |
|||
|
|||
.uniui-bottom:before { |
|||
content: "\e6b8"; |
|||
} |
|||
|
|||
.uniui-arrowdown:before { |
|||
content: "\e6b8"; |
|||
} |
|||
|
|||
.uniui-right:before { |
|||
content: "\e6b5"; |
|||
} |
|||
|
|||
.uniui-arrowright:before { |
|||
content: "\e6b5"; |
|||
} |
|||
|
|||
.uniui-top:before { |
|||
content: "\e6b6"; |
|||
} |
|||
|
|||
.uniui-arrowup:before { |
|||
content: "\e6b6"; |
|||
} |
|||
|
|||
.uniui-left:before { |
|||
content: "\e6b7"; |
|||
} |
|||
|
|||
.uniui-arrowleft:before { |
|||
content: "\e6b7"; |
|||
} |
|||
|
|||
.uniui-eye:before { |
|||
content: "\e651"; |
|||
} |
|||
|
|||
.uniui-eye-filled:before { |
|||
content: "\e66a"; |
|||
} |
|||
|
|||
.uniui-eye-slash:before { |
|||
content: "\e6b3"; |
|||
} |
|||
|
|||
.uniui-eye-slash-filled:before { |
|||
content: "\e6b4"; |
|||
} |
|||
|
|||
.uniui-info-filled:before { |
|||
content: "\e649"; |
|||
} |
|||
|
|||
.uniui-reload:before { |
|||
content: "\e6b2"; |
|||
} |
|||
|
|||
.uniui-micoff-filled:before { |
|||
content: "\e6b0"; |
|||
} |
|||
|
|||
.uniui-map-pin-ellipse:before { |
|||
content: "\e6ac"; |
|||
} |
|||
|
|||
.uniui-map-pin:before { |
|||
content: "\e6ad"; |
|||
} |
|||
|
|||
.uniui-location:before { |
|||
content: "\e6ae"; |
|||
} |
|||
|
|||
.uniui-starhalf:before { |
|||
content: "\e683"; |
|||
} |
|||
|
|||
.uniui-star:before { |
|||
content: "\e688"; |
|||
} |
|||
|
|||
.uniui-star-filled:before { |
|||
content: "\e68f"; |
|||
} |
|||
|
|||
.uniui-calendar:before { |
|||
content: "\e6a0"; |
|||
} |
|||
|
|||
.uniui-fire:before { |
|||
content: "\e6a1"; |
|||
} |
|||
|
|||
.uniui-medal:before { |
|||
content: "\e6a2"; |
|||
} |
|||
|
|||
.uniui-font:before { |
|||
content: "\e6a3"; |
|||
} |
|||
|
|||
.uniui-gift:before { |
|||
content: "\e6a4"; |
|||
} |
|||
|
|||
.uniui-link:before { |
|||
content: "\e6a5"; |
|||
} |
|||
|
|||
.uniui-notification:before { |
|||
content: "\e6a6"; |
|||
} |
|||
|
|||
.uniui-staff:before { |
|||
content: "\e6a7"; |
|||
} |
|||
|
|||
.uniui-vip:before { |
|||
content: "\e6a8"; |
|||
} |
|||
|
|||
.uniui-folder-add:before { |
|||
content: "\e6a9"; |
|||
} |
|||
|
|||
.uniui-tune:before { |
|||
content: "\e6aa"; |
|||
} |
|||
|
|||
.uniui-auth:before { |
|||
content: "\e6ab"; |
|||
} |
|||
|
|||
.uniui-person:before { |
|||
content: "\e699"; |
|||
} |
|||
|
|||
.uniui-email-filled:before { |
|||
content: "\e69a"; |
|||
} |
|||
|
|||
.uniui-phone-filled:before { |
|||
content: "\e69b"; |
|||
} |
|||
|
|||
.uniui-phone:before { |
|||
content: "\e69c"; |
|||
} |
|||
|
|||
.uniui-email:before { |
|||
content: "\e69e"; |
|||
} |
|||
|
|||
.uniui-personadd:before { |
|||
content: "\e69f"; |
|||
} |
|||
|
|||
.uniui-chatboxes-filled:before { |
|||
content: "\e692"; |
|||
} |
|||
|
|||
.uniui-contact:before { |
|||
content: "\e693"; |
|||
} |
|||
|
|||
.uniui-chatbubble-filled:before { |
|||
content: "\e694"; |
|||
} |
|||
|
|||
.uniui-contact-filled:before { |
|||
content: "\e695"; |
|||
} |
|||
|
|||
.uniui-chatboxes:before { |
|||
content: "\e696"; |
|||
} |
|||
|
|||
.uniui-chatbubble:before { |
|||
content: "\e697"; |
|||
} |
|||
|
|||
.uniui-upload-filled:before { |
|||
content: "\e68e"; |
|||
} |
|||
|
|||
.uniui-upload:before { |
|||
content: "\e690"; |
|||
} |
|||
|
|||
.uniui-weixin:before { |
|||
content: "\e691"; |
|||
} |
|||
|
|||
.uniui-compose:before { |
|||
content: "\e67f"; |
|||
} |
|||
|
|||
.uniui-qq:before { |
|||
content: "\e680"; |
|||
} |
|||
|
|||
.uniui-download-filled:before { |
|||
content: "\e681"; |
|||
} |
|||
|
|||
.uniui-pyq:before { |
|||
content: "\e682"; |
|||
} |
|||
|
|||
.uniui-sound:before { |
|||
content: "\e684"; |
|||
} |
|||
|
|||
.uniui-trash-filled:before { |
|||
content: "\e685"; |
|||
} |
|||
|
|||
.uniui-sound-filled:before { |
|||
content: "\e686"; |
|||
} |
|||
|
|||
.uniui-trash:before { |
|||
content: "\e687"; |
|||
} |
|||
|
|||
.uniui-videocam-filled:before { |
|||
content: "\e689"; |
|||
} |
|||
|
|||
.uniui-spinner-cycle:before { |
|||
content: "\e68a"; |
|||
} |
|||
|
|||
.uniui-weibo:before { |
|||
content: "\e68b"; |
|||
} |
|||
|
|||
.uniui-videocam:before { |
|||
content: "\e68c"; |
|||
} |
|||
|
|||
.uniui-download:before { |
|||
content: "\e68d"; |
|||
} |
|||
|
|||
.uniui-help:before { |
|||
content: "\e679"; |
|||
} |
|||
|
|||
.uniui-navigate-filled:before { |
|||
content: "\e67a"; |
|||
} |
|||
|
|||
.uniui-plusempty:before { |
|||
content: "\e67b"; |
|||
} |
|||
|
|||
.uniui-smallcircle:before { |
|||
content: "\e67c"; |
|||
} |
|||
|
|||
.uniui-minus-filled:before { |
|||
content: "\e67d"; |
|||
} |
|||
|
|||
.uniui-micoff:before { |
|||
content: "\e67e"; |
|||
} |
|||
|
|||
.uniui-closeempty:before { |
|||
content: "\e66c"; |
|||
} |
|||
|
|||
.uniui-clear:before { |
|||
content: "\e66d"; |
|||
} |
|||
|
|||
.uniui-navigate:before { |
|||
content: "\e66e"; |
|||
} |
|||
|
|||
.uniui-minus:before { |
|||
content: "\e66f"; |
|||
} |
|||
|
|||
.uniui-image:before { |
|||
content: "\e670"; |
|||
} |
|||
|
|||
.uniui-mic:before { |
|||
content: "\e671"; |
|||
} |
|||
|
|||
.uniui-paperplane:before { |
|||
content: "\e672"; |
|||
} |
|||
|
|||
.uniui-close:before { |
|||
content: "\e673"; |
|||
} |
|||
|
|||
.uniui-help-filled:before { |
|||
content: "\e674"; |
|||
} |
|||
|
|||
.uniui-paperplane-filled:before { |
|||
content: "\e675"; |
|||
} |
|||
|
|||
.uniui-plus:before { |
|||
content: "\e676"; |
|||
} |
|||
|
|||
.uniui-mic-filled:before { |
|||
content: "\e677"; |
|||
} |
|||
|
|||
.uniui-image-filled:before { |
|||
content: "\e678"; |
|||
} |
|||
|
|||
.uniui-locked-filled:before { |
|||
content: "\e668"; |
|||
} |
|||
|
|||
.uniui-info:before { |
|||
content: "\e669"; |
|||
} |
|||
|
|||
.uniui-locked:before { |
|||
content: "\e66b"; |
|||
} |
|||
|
|||
.uniui-camera-filled:before { |
|||
content: "\e658"; |
|||
} |
|||
|
|||
.uniui-chat-filled:before { |
|||
content: "\e659"; |
|||
} |
|||
|
|||
.uniui-camera:before { |
|||
content: "\e65a"; |
|||
} |
|||
|
|||
.uniui-circle:before { |
|||
content: "\e65b"; |
|||
} |
|||
|
|||
.uniui-checkmarkempty:before { |
|||
content: "\e65c"; |
|||
} |
|||
|
|||
.uniui-chat:before { |
|||
content: "\e65d"; |
|||
} |
|||
|
|||
.uniui-circle-filled:before { |
|||
content: "\e65e"; |
|||
} |
|||
|
|||
.uniui-flag:before { |
|||
content: "\e65f"; |
|||
} |
|||
|
|||
.uniui-flag-filled:before { |
|||
content: "\e660"; |
|||
} |
|||
|
|||
.uniui-gear-filled:before { |
|||
content: "\e661"; |
|||
} |
|||
|
|||
.uniui-home:before { |
|||
content: "\e662"; |
|||
} |
|||
|
|||
.uniui-home-filled:before { |
|||
content: "\e663"; |
|||
} |
|||
|
|||
.uniui-gear:before { |
|||
content: "\e664"; |
|||
} |
|||
|
|||
.uniui-smallcircle-filled:before { |
|||
content: "\e665"; |
|||
} |
|||
|
|||
.uniui-map-filled:before { |
|||
content: "\e666"; |
|||
} |
|||
|
|||
.uniui-map:before { |
|||
content: "\e667"; |
|||
} |
|||
|
|||
.uniui-refresh-filled:before { |
|||
content: "\e656"; |
|||
} |
|||
|
|||
.uniui-refresh:before { |
|||
content: "\e657"; |
|||
} |
|||
|
|||
.uniui-cloud-upload:before { |
|||
content: "\e645"; |
|||
} |
|||
|
|||
.uniui-cloud-download-filled:before { |
|||
content: "\e646"; |
|||
} |
|||
|
|||
.uniui-cloud-download:before { |
|||
content: "\e647"; |
|||
} |
|||
|
|||
.uniui-cloud-upload-filled:before { |
|||
content: "\e648"; |
|||
} |
|||
|
|||
.uniui-redo:before { |
|||
content: "\e64a"; |
|||
} |
|||
|
|||
.uniui-images-filled:before { |
|||
content: "\e64b"; |
|||
} |
|||
|
|||
.uniui-undo-filled:before { |
|||
content: "\e64c"; |
|||
} |
|||
|
|||
.uniui-more:before { |
|||
content: "\e64d"; |
|||
} |
|||
|
|||
.uniui-more-filled:before { |
|||
content: "\e64e"; |
|||
} |
|||
|
|||
.uniui-undo:before { |
|||
content: "\e64f"; |
|||
} |
|||
|
|||
.uniui-images:before { |
|||
content: "\e650"; |
|||
} |
|||
|
|||
.uniui-paperclip:before { |
|||
content: "\e652"; |
|||
} |
|||
|
|||
.uniui-settings:before { |
|||
content: "\e653"; |
|||
} |
|||
|
|||
.uniui-search:before { |
|||
content: "\e654"; |
|||
} |
|||
|
|||
.uniui-redo-filled:before { |
|||
content: "\e655"; |
|||
} |
|||
|
|||
.uniui-list:before { |
|||
content: "\e644"; |
|||
} |
|||
|
|||
.uniui-mail-open-filled:before { |
|||
content: "\e63a"; |
|||
} |
|||
|
|||
.uniui-hand-down-filled:before { |
|||
content: "\e63c"; |
|||
} |
|||
|
|||
.uniui-hand-down:before { |
|||
content: "\e63d"; |
|||
} |
|||
|
|||
.uniui-hand-up-filled:before { |
|||
content: "\e63e"; |
|||
} |
|||
|
|||
.uniui-hand-up:before { |
|||
content: "\e63f"; |
|||
} |
|||
|
|||
.uniui-heart-filled:before { |
|||
content: "\e641"; |
|||
} |
|||
|
|||
.uniui-mail-open:before { |
|||
content: "\e643"; |
|||
} |
|||
|
|||
.uniui-heart:before { |
|||
content: "\e639"; |
|||
} |
|||
|
|||
.uniui-loop:before { |
|||
content: "\e633"; |
|||
} |
|||
|
|||
.uniui-pulldown:before { |
|||
content: "\e632"; |
|||
} |
|||
|
|||
.uniui-scan:before { |
|||
content: "\e62a"; |
|||
} |
|||
|
|||
.uniui-bars:before { |
|||
content: "\e627"; |
|||
} |
|||
|
|||
.uniui-cart-filled:before { |
|||
content: "\e629"; |
|||
} |
|||
|
|||
.uniui-checkbox:before { |
|||
content: "\e62b"; |
|||
} |
|||
|
|||
.uniui-checkbox-filled:before { |
|||
content: "\e62c"; |
|||
} |
|||
|
|||
.uniui-shop:before { |
|||
content: "\e62f"; |
|||
} |
|||
|
|||
.uniui-headphones:before { |
|||
content: "\e630"; |
|||
} |
|||
|
|||
.uniui-cart:before { |
|||
content: "\e631"; |
|||
} |
Binary file not shown.
@ -0,0 +1,86 @@ |
|||
{ |
|||
"id": "uni-icons", |
|||
"displayName": "uni-icons 图标", |
|||
"version": "1.3.5", |
|||
"description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", |
|||
"keywords": [ |
|||
"uni-ui", |
|||
"uniui", |
|||
"icon", |
|||
"图标" |
|||
], |
|||
"repository": "https://github.com/dcloudio/uni-ui", |
|||
"engines": { |
|||
"HBuilderX": "^3.2.14" |
|||
}, |
|||
"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"], |
|||
"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,8 @@ |
|||
## Icons 图标 |
|||
> **组件名:uni-icons** |
|||
> 代码块: `uIcons` |
|||
|
|||
用于展示 icons 图标 。 |
|||
|
|||
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) |
|||
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
@ -0,0 +1,8 @@ |
|||
## 1.0.3(2022-01-21) |
|||
- 优化 组件示例 |
|||
## 1.0.2(2021-11-22) |
|||
- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 |
|||
## 1.0.1(2021-11-22) |
|||
- 修复 vue3中scss语法兼容问题 |
|||
## 1.0.0(2021-11-18) |
|||
- init |
@ -0,0 +1 @@ |
|||
@import './styles/index.scss'; |
@ -0,0 +1,82 @@ |
|||
{ |
|||
"id": "uni-scss", |
|||
"displayName": "uni-scss 辅助样式", |
|||
"version": "1.0.3", |
|||
"description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", |
|||
"keywords": [ |
|||
"uni-scss", |
|||
"uni-ui", |
|||
"辅助样式" |
|||
], |
|||
"repository": "https://github.com/dcloudio/uni-ui", |
|||
"engines": { |
|||
"HBuilderX": "^3.1.0" |
|||
}, |
|||
"dcloudext": { |
|||
"category": [ |
|||
"JS SDK", |
|||
"通用 SDK" |
|||
], |
|||
"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": [], |
|||
"encrypt": [], |
|||
"platforms": { |
|||
"cloud": { |
|||
"tcb": "y", |
|||
"aliyun": "y" |
|||
}, |
|||
"client": { |
|||
"App": { |
|||
"app-vue": "y", |
|||
"app-nvue": "u" |
|||
}, |
|||
"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" |
|||
}, |
|||
"快应用": { |
|||
"华为": "n", |
|||
"联盟": "n" |
|||
}, |
|||
"Vue": { |
|||
"vue2": "y", |
|||
"vue3": "y" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,4 @@ |
|||
`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 |
|||
|
|||
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) |
|||
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
@ -0,0 +1,7 @@ |
|||
@import './setting/_variables.scss'; |
|||
@import './setting/_border.scss'; |
|||
@import './setting/_color.scss'; |
|||
@import './setting/_space.scss'; |
|||
@import './setting/_radius.scss'; |
|||
@import './setting/_text.scss'; |
|||
@import './setting/_styles.scss'; |
@ -0,0 +1,3 @@ |
|||
.uni-border { |
|||
border: 1px $uni-border-1 solid; |
|||
} |
@ -0,0 +1,66 @@ |
|||
|
|||
// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 |
|||
// @mixin get-styles($k,$c) { |
|||
// @if $k == size or $k == weight{ |
|||
// font-#{$k}:#{$c} |
|||
// }@else{ |
|||
// #{$k}:#{$c} |
|||
// } |
|||
// } |
|||
$uni-ui-color:( |
|||
// 主色 |
|||
primary: $uni-primary, |
|||
primary-disable: $uni-primary-disable, |
|||
primary-light: $uni-primary-light, |
|||
// 辅助色 |
|||
success: $uni-success, |
|||
success-disable: $uni-success-disable, |
|||
success-light: $uni-success-light, |
|||
warning: $uni-warning, |
|||
warning-disable: $uni-warning-disable, |
|||
warning-light: $uni-warning-light, |
|||
error: $uni-error, |
|||
error-disable: $uni-error-disable, |
|||
error-light: $uni-error-light, |
|||
info: $uni-info, |
|||
info-disable: $uni-info-disable, |
|||
info-light: $uni-info-light, |
|||
// 中性色 |
|||
main-color: $uni-main-color, |
|||
base-color: $uni-base-color, |
|||
secondary-color: $uni-secondary-color, |
|||
extra-color: $uni-extra-color, |
|||
// 背景色 |
|||
bg-color: $uni-bg-color, |
|||
// 边框颜色 |
|||
border-1: $uni-border-1, |
|||
border-2: $uni-border-2, |
|||
border-3: $uni-border-3, |
|||
border-4: $uni-border-4, |
|||
// 黑色 |
|||
black:$uni-black, |
|||
// 白色 |
|||
white:$uni-white, |
|||
// 透明 |
|||
transparent:$uni-transparent |
|||
) !default; |
|||
@each $key, $child in $uni-ui-color { |
|||
.uni-#{"" + $key} { |
|||
color: $child; |
|||
} |
|||
.uni-#{"" + $key}-bg { |
|||
background-color: $child; |
|||
} |
|||
} |
|||
.uni-shadow-sm { |
|||
box-shadow: $uni-shadow-sm; |
|||
} |
|||
.uni-shadow-base { |
|||
box-shadow: $uni-shadow-base; |
|||
} |
|||
.uni-shadow-lg { |
|||
box-shadow: $uni-shadow-lg; |
|||
} |
|||
.uni-mask { |
|||
background-color:$uni-mask; |
|||
} |
@ -0,0 +1,55 @@ |
|||
@mixin radius($r,$d:null ,$important: false){ |
|||
$radius-value:map-get($uni-radius, $r) if($important, !important, null); |
|||
// Key exists within the $uni-radius variable |
|||
@if (map-has-key($uni-radius, $r) and $d){ |
|||
@if $d == t { |
|||
border-top-left-radius:$radius-value; |
|||
border-top-right-radius:$radius-value; |
|||
}@else if $d == r { |
|||
border-top-right-radius:$radius-value; |
|||
border-bottom-right-radius:$radius-value; |
|||
}@else if $d == b { |
|||
border-bottom-left-radius:$radius-value; |
|||
border-bottom-right-radius:$radius-value; |
|||
}@else if $d == l { |
|||
border-top-left-radius:$radius-value; |
|||
border-bottom-left-radius:$radius-value; |
|||
}@else if $d == tl { |
|||
border-top-left-radius:$radius-value; |
|||
}@else if $d == tr { |
|||
border-top-right-radius:$radius-value; |
|||
}@else if $d == br { |
|||
border-bottom-right-radius:$radius-value; |
|||
}@else if $d == bl { |
|||
border-bottom-left-radius:$radius-value; |
|||
} |
|||
}@else{ |
|||
border-radius:$radius-value; |
|||
} |
|||
} |
|||
|
|||
@each $key, $child in $uni-radius { |
|||
@if($key){ |
|||
.uni-radius-#{"" + $key} { |
|||
@include radius($key) |
|||
} |
|||
}@else{ |
|||
.uni-radius { |
|||
@include radius($key) |
|||
} |
|||
} |
|||
} |
|||
|
|||
@each $direction in t, r, b, l,tl, tr, br, bl { |
|||
@each $key, $child in $uni-radius { |
|||
@if($key){ |
|||
.uni-radius-#{"" + $direction}-#{"" + $key} { |
|||
@include radius($key,$direction,false) |
|||
} |
|||
}@else{ |
|||
.uni-radius-#{$direction} { |
|||
@include radius($key,$direction,false) |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,56 @@ |
|||
|
|||
@mixin fn($space,$direction,$size,$n) { |
|||
@if $n { |
|||
#{$space}-#{$direction}: #{$size*$uni-space-root}px |
|||
} @else { |
|||
#{$space}-#{$direction}: #{-$size*$uni-space-root}px |
|||
} |
|||
} |
|||
@mixin get-styles($direction,$i,$space,$n){ |
|||
@if $direction == t { |
|||
@include fn($space, top,$i,$n); |
|||
} |
|||
@if $direction == r { |
|||
@include fn($space, right,$i,$n); |
|||
} |
|||
@if $direction == b { |
|||
@include fn($space, bottom,$i,$n); |
|||
} |
|||
@if $direction == l { |
|||
@include fn($space, left,$i,$n); |
|||
} |
|||
@if $direction == x { |
|||
@include fn($space, left,$i,$n); |
|||
@include fn($space, right,$i,$n); |
|||
} |
|||
@if $direction == y { |
|||
@include fn($space, top,$i,$n); |
|||
@include fn($space, bottom,$i,$n); |
|||
} |
|||
@if $direction == a { |
|||
@if $n { |
|||
#{$space}:#{$i*$uni-space-root}px; |
|||
} @else { |
|||
#{$space}:#{-$i*$uni-space-root}px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@each $orientation in m,p { |
|||
$space: margin; |
|||
@if $orientation == m { |
|||
$space: margin; |
|||
} @else { |
|||
$space: padding; |
|||
} |
|||
@for $i from 0 through 16 { |
|||
@each $direction in t, r, b, l, x, y, a { |
|||
.uni-#{$orientation}#{$direction}-#{$i} { |
|||
@include get-styles($direction,$i,$space,true); |
|||
} |
|||
.uni-#{$orientation}#{$direction}-n#{$i} { |
|||
@include get-styles($direction,$i,$space,false); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,167 @@ |
|||
/* #ifndef APP-NVUE */ |
|||
|
|||
$-color-white:#fff; |
|||
$-color-black:#000; |
|||
@mixin base-style($color) { |
|||
color: #fff; |
|||
background-color: $color; |
|||
border-color: mix($-color-black, $color, 8%); |
|||
&:not([hover-class]):active { |
|||
background: mix($-color-black, $color, 10%); |
|||
border-color: mix($-color-black, $color, 20%); |
|||
color: $-color-white; |
|||
outline: none; |
|||
} |
|||
} |
|||
@mixin is-color($color) { |
|||
@include base-style($color); |
|||
&[loading] { |
|||
@include base-style($color); |
|||
&::before { |
|||
margin-right:5px; |
|||
} |
|||
} |
|||
&[disabled] { |
|||
&, |
|||
&[loading], |
|||
&:not([hover-class]):active { |
|||
color: $-color-white; |
|||
border-color: mix(darken($color,10%), $-color-white); |
|||
background-color: mix($color, $-color-white); |
|||
} |
|||
} |
|||
|
|||
} |
|||
@mixin base-plain-style($color) { |
|||
color:$color; |
|||
background-color: mix($-color-white, $color, 90%); |
|||
border-color: mix($-color-white, $color, 70%); |
|||
&:not([hover-class]):active { |
|||
background: mix($-color-white, $color, 80%); |
|||
color: $color; |
|||
outline: none; |
|||
border-color: mix($-color-white, $color, 50%); |
|||
} |
|||
} |
|||
@mixin is-plain($color){ |
|||
&[plain] { |
|||
@include base-plain-style($color); |
|||
&[loading] { |
|||
@include base-plain-style($color); |
|||
&::before { |
|||
margin-right:5px; |
|||
} |
|||
} |
|||
&[disabled] { |
|||
&, |
|||
&:active { |
|||
color: mix($-color-white, $color, 40%); |
|||
background-color: mix($-color-white, $color, 90%); |
|||
border-color: mix($-color-white, $color, 80%); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
.uni-btn { |
|||
margin: 5px; |
|||
color: #393939; |
|||
border:1px solid #ccc; |
|||
font-size: 16px; |
|||
font-weight: 200; |
|||
background-color: #F9F9F9; |
|||
// TODO 暂时处理边框隐藏一边的问题 |
|||
overflow: visible; |
|||
&::after{ |
|||
border: none; |
|||
} |
|||
|
|||
&:not([type]),&[type=default] { |
|||
color: #999; |
|||
&[loading] { |
|||
background: none; |
|||
&::before { |
|||
margin-right:5px; |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
&[disabled]{ |
|||
color: mix($-color-white, #999, 60%); |
|||
&, |
|||
&[loading], |
|||
&:active { |
|||
color: mix($-color-white, #999, 60%); |
|||
background-color: mix($-color-white,$-color-black , 98%); |
|||
border-color: mix($-color-white, #999, 85%); |
|||
} |
|||
} |
|||
|
|||
&[plain] { |
|||
color: #999; |
|||
background: none; |
|||
border-color: $uni-border-1; |
|||
&:not([hover-class]):active { |
|||
background: none; |
|||
color: mix($-color-white, $-color-black, 80%); |
|||
border-color: mix($-color-white, $-color-black, 90%); |
|||
outline: none; |
|||
} |
|||
&[disabled]{ |
|||
&, |
|||
&[loading], |
|||
&:active { |
|||
background: none; |
|||
color: mix($-color-white, #999, 60%); |
|||
border-color: mix($-color-white, #999, 85%); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
&:not([hover-class]):active { |
|||
color: mix($-color-white, $-color-black, 50%); |
|||
} |
|||
|
|||
&[size=mini] { |
|||
font-size: 16px; |
|||
font-weight: 200; |
|||
border-radius: 8px; |
|||
} |
|||
|
|||
|
|||
|
|||
&.uni-btn-small { |
|||
font-size: 14px; |
|||
} |
|||
&.uni-btn-mini { |
|||
font-size: 12px; |
|||
} |
|||
|
|||
&.uni-btn-radius { |
|||
border-radius: 999px; |
|||
} |
|||
&[type=primary] { |
|||
@include is-color($uni-primary); |
|||
@include is-plain($uni-primary) |
|||
} |
|||
&[type=success] { |
|||
@include is-color($uni-success); |
|||
@include is-plain($uni-success) |
|||
} |
|||
&[type=error] { |
|||
@include is-color($uni-error); |
|||
@include is-plain($uni-error) |
|||
} |
|||
&[type=warning] { |
|||
@include is-color($uni-warning); |
|||
@include is-plain($uni-warning) |
|||
} |
|||
&[type=info] { |
|||
@include is-color($uni-info); |
|||
@include is-plain($uni-info) |
|||
} |
|||
} |
|||
/* #endif */ |
@ -0,0 +1,24 @@ |
|||
@mixin get-styles($k,$c) { |
|||
@if $k == size or $k == weight{ |
|||
font-#{$k}:#{$c} |
|||
}@else{ |
|||
#{$k}:#{$c} |
|||
} |
|||
} |
|||
|
|||
@each $key, $child in $uni-headings { |
|||
/* #ifndef APP-NVUE */ |
|||
.uni-#{$key} { |
|||
@each $k, $c in $child { |
|||
@include get-styles($k,$c) |
|||
} |
|||
} |
|||
/* #endif */ |
|||
/* #ifdef APP-NVUE */ |
|||
.container .uni-#{$key} { |
|||
@each $k, $c in $child { |
|||
@include get-styles($k,$c) |
|||
} |
|||
} |
|||
/* #endif */ |
|||
} |
@ -0,0 +1,146 @@ |
|||
// @use "sass:math"; |
|||
@import '../tools/functions.scss'; |
|||
// 间距基础倍数 |
|||
$uni-space-root: 2 !default; |
|||
// 边框半径默认值 |
|||
$uni-radius-root:5px !default; |
|||
$uni-radius: () !default; |
|||
// 边框半径断点 |
|||
$uni-radius: map-deep-merge( |
|||
( |
|||
0: 0, |
|||
// TODO 当前版本暂时不支持 sm 属性 |
|||
// 'sm': math.div($uni-radius-root, 2), |
|||
null: $uni-radius-root, |
|||
'lg': $uni-radius-root * 2, |
|||
'xl': $uni-radius-root * 6, |
|||
'pill': 9999px, |
|||
'circle': 50% |
|||
), |
|||
$uni-radius |
|||
); |
|||
// 字体家族 |
|||
$body-font-family: 'Roboto', sans-serif !default; |
|||
// 文本 |
|||
$heading-font-family: $body-font-family !default; |
|||
$uni-headings: () !default; |
|||
$letterSpacing: -0.01562em; |
|||
$uni-headings: map-deep-merge( |
|||
( |
|||
'h1': ( |
|||
size: 32px, |
|||
weight: 300, |
|||
line-height: 50px, |
|||
// letter-spacing:-0.01562em |
|||
), |
|||
'h2': ( |
|||
size: 28px, |
|||
weight: 300, |
|||
line-height: 40px, |
|||
// letter-spacing: -0.00833em |
|||
), |
|||
'h3': ( |
|||
size: 24px, |
|||
weight: 400, |
|||
line-height: 32px, |
|||
// letter-spacing: normal |
|||
), |
|||
'h4': ( |
|||
size: 20px, |
|||
weight: 400, |
|||
line-height: 30px, |
|||
// letter-spacing: 0.00735em |
|||
), |
|||
'h5': ( |
|||
size: 16px, |
|||
weight: 400, |
|||
line-height: 24px, |
|||
// letter-spacing: normal |
|||
), |
|||
'h6': ( |
|||
size: 14px, |
|||
weight: 500, |
|||
line-height: 18px, |
|||
// letter-spacing: 0.0125em |
|||
), |
|||
'subtitle': ( |
|||
size: 12px, |
|||
weight: 400, |
|||
line-height: 20px, |
|||
// letter-spacing: 0.00937em |
|||
), |
|||
'body': ( |
|||
font-size: 14px, |
|||
font-weight: 400, |
|||
line-height: 22px, |
|||
// letter-spacing: 0.03125em |
|||
), |
|||
'caption': ( |
|||
'size': 12px, |
|||
'weight': 400, |
|||
'line-height': 20px, |
|||
// 'letter-spacing': 0.03333em, |
|||
// 'text-transform': false |
|||
) |
|||
), |
|||
$uni-headings |
|||
); |
|||
|
|||
|
|||
|
|||
// 主色 |
|||
$uni-primary: #2979ff !default; |
|||
$uni-primary-disable:lighten($uni-primary,20%) !default; |
|||
$uni-primary-light: lighten($uni-primary,25%) !default; |
|||
|
|||
// 辅助色 |
|||
// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 |
|||
$uni-success: #18bc37 !default; |
|||
$uni-success-disable:lighten($uni-success,20%) !default; |
|||
$uni-success-light: lighten($uni-success,25%) !default; |
|||
|
|||
$uni-warning: #f3a73f !default; |
|||
$uni-warning-disable:lighten($uni-warning,20%) !default; |
|||
$uni-warning-light: lighten($uni-warning,25%) !default; |
|||
|
|||
$uni-error: #e43d33 !default; |
|||
$uni-error-disable:lighten($uni-error,20%) !default; |
|||
$uni-error-light: lighten($uni-error,25%) !default; |
|||
|
|||
$uni-info: #8f939c !default; |
|||
$uni-info-disable:lighten($uni-info,20%) !default; |
|||
$uni-info-light: lighten($uni-info,25%) !default; |
|||
|
|||
// 中性色 |
|||
// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 |
|||
$uni-main-color: #3a3a3a !default; // 主要文字 |
|||
$uni-base-color: #6a6a6a !default; // 常规文字 |
|||
$uni-secondary-color: #909399 !default; // 次要文字 |
|||
$uni-extra-color: #c7c7c7 !default; // 辅助说明 |
|||
|
|||
// 边框颜色 |
|||
$uni-border-1: #F0F0F0 !default; |
|||
$uni-border-2: #EDEDED !default; |
|||
$uni-border-3: #DCDCDC !default; |
|||
$uni-border-4: #B9B9B9 !default; |
|||
|
|||
// 常规色 |
|||
$uni-black: #000000 !default; |
|||
$uni-white: #ffffff !default; |
|||
$uni-transparent: rgba($color: #000000, $alpha: 0) !default; |
|||
|
|||
// 背景色 |
|||
$uni-bg-color: #f7f7f7 !default; |
|||
|
|||
/* 水平间距 */ |
|||
$uni-spacing-sm: 8px !default; |
|||
$uni-spacing-base: 15px !default; |
|||
$uni-spacing-lg: 30px !default; |
|||
|
|||
// 阴影 |
|||
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; |
|||
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; |
|||
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; |
|||
|
|||
// 蒙版 |
|||
$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; |
@ -0,0 +1,19 @@ |
|||
// 合并 map |
|||
@function map-deep-merge($parent-map, $child-map){ |
|||
$result: $parent-map; |
|||
@each $key, $child in $child-map { |
|||
$parent-has-key: map-has-key($result, $key); |
|||
$parent-value: map-get($result, $key); |
|||
$parent-type: type-of($parent-value); |
|||
$child-type: type-of($child); |
|||
$parent-is-map: $parent-type == map; |
|||
$child-is-map: $child-type == map; |
|||
|
|||
@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ |
|||
$result: map-merge($result, ( $key: $child )); |
|||
}@else { |
|||
$result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); |
|||
} |
|||
} |
|||
@return $result; |
|||
}; |
@ -0,0 +1,31 @@ |
|||
// 间距基础倍数 |
|||
$uni-space-root: 2; |
|||
// 边框半径默认值 |
|||
$uni-radius-root:5px; |
|||
// 主色 |
|||
$uni-primary: #2979ff; |
|||
// 辅助色 |
|||
$uni-success: #4cd964; |
|||
// 警告色 |
|||
$uni-warning: #f0ad4e; |
|||
// 错误色 |
|||
$uni-error: #dd524d; |
|||
// 描述色 |
|||
$uni-info: #909399; |
|||
// 中性色 |
|||
$uni-main-color: #303133; |
|||
$uni-base-color: #606266; |
|||
$uni-secondary-color: #909399; |
|||
$uni-extra-color: #C0C4CC; |
|||
// 背景色 |
|||
$uni-bg-color: #f5f5f5; |
|||
// 边框颜色 |
|||
$uni-border-1: #DCDFE6; |
|||
$uni-border-2: #E4E7ED; |
|||
$uni-border-3: #EBEEF5; |
|||
$uni-border-4: #F2F6FC; |
|||
|
|||
// 常规色 |
|||
$uni-black: #000000; |
|||
$uni-white: #ffffff; |
|||
$uni-transparent: rgba($color: #000000, $alpha: 0); |
@ -0,0 +1,62 @@ |
|||
@import './styles/setting/_variables.scss'; |
|||
// 间距基础倍数 |
|||
$uni-space-root: 2; |
|||
// 边框半径默认值 |
|||
$uni-radius-root:5px; |
|||
|
|||
// 主色 |
|||
$uni-primary: #2979ff; |
|||
$uni-primary-disable:mix(#fff,$uni-primary,50%); |
|||
$uni-primary-light: mix(#fff,$uni-primary,80%); |
|||
|
|||
// 辅助色 |
|||
// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 |
|||
$uni-success: #18bc37; |
|||
$uni-success-disable:mix(#fff,$uni-success,50%); |
|||
$uni-success-light: mix(#fff,$uni-success,80%); |
|||
|
|||
$uni-warning: #f3a73f; |
|||
$uni-warning-disable:mix(#fff,$uni-warning,50%); |
|||
$uni-warning-light: mix(#fff,$uni-warning,80%); |
|||
|
|||
$uni-error: #e43d33; |
|||
$uni-error-disable:mix(#fff,$uni-error,50%); |
|||
$uni-error-light: mix(#fff,$uni-error,80%); |
|||
|
|||
$uni-info: #8f939c; |
|||
$uni-info-disable:mix(#fff,$uni-info,50%); |
|||
$uni-info-light: mix(#fff,$uni-info,80%); |
|||
|
|||
// 中性色 |
|||
// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 |
|||
$uni-main-color: #3a3a3a; // 主要文字 |
|||
$uni-base-color: #6a6a6a; // 常规文字 |
|||
$uni-secondary-color: #909399; // 次要文字 |
|||
$uni-extra-color: #c7c7c7; // 辅助说明 |
|||
|
|||
// 边框颜色 |
|||
$uni-border-1: #F0F0F0; |
|||
$uni-border-2: #EDEDED; |
|||
$uni-border-3: #DCDCDC; |
|||
$uni-border-4: #B9B9B9; |
|||
|
|||
// 常规色 |
|||
$uni-black: #000000; |
|||
$uni-white: #ffffff; |
|||
$uni-transparent: rgba($color: #000000, $alpha: 0); |
|||
|
|||
// 背景色 |
|||
$uni-bg-color: #f7f7f7; |
|||
|
|||
/* 水平间距 */ |
|||
$uni-spacing-sm: 8px; |
|||
$uni-spacing-base: 15px; |
|||
$uni-spacing-lg: 30px; |
|||
|
|||
// 阴影 |
|||
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); |
|||
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); |
|||
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); |
|||
|
|||
// 蒙版 |
|||
$uni-mask: rgba($color: #000000, $alpha: 0.4); |
@ -0,0 +1,25 @@ |
|||
## 1.2.2(2022-11-29) |
|||
- 优化 主题样式 |
|||
## 1.2.1(2022-06-06) |
|||
- 修复 微信小程序存在无使用组件的问题 |
|||
## 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-table](https://uniapp.dcloud.io/component/uniui/uni-table) |
|||
## 1.1.0(2021-07-30) |
|||
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
|||
## 1.0.7(2021-07-08) |
|||
- 新增 uni-th 支持 date 日期筛选范围 |
|||
## 1.0.6(2021-07-05) |
|||
- 新增 uni-th 支持 range 筛选范围 |
|||
## 1.0.5(2021-06-28) |
|||
- 新增 uni-th 筛选功能 |
|||
## 1.0.4(2021-05-12) |
|||
- 新增 示例地址 |
|||
- 修复 示例项目缺少组件的Bug |
|||
## 1.0.3(2021-04-16) |
|||
- 新增 sortable 属性,是否开启单列排序 |
|||
- 优化 表格多选逻辑 |
|||
## 1.0.2(2021-03-22) |
|||
- uni-tr 添加 disabled 属性,用于 type=selection 时,设置某行是否可由全选按钮控制 |
|||
## 1.0.1(2021-02-05) |
|||
- 调整为uni_modules目录规范 |
@ -0,0 +1,455 @@ |
|||
<template> |
|||
<view class="uni-table-scroll" :class="{ 'table--border': border, 'border-none': !noData }"> |
|||
<!-- #ifdef H5 --> |
|||
<table class="uni-table" border="0" cellpadding="0" cellspacing="0" :class="{ 'table--stripe': stripe }" :style="{ 'min-width': minWidth + 'px' }"> |
|||
<slot></slot> |
|||
<view v-if="noData" class="uni-table-loading"> |
|||
<view class="uni-table-text" :class="{ 'empty-border': border }">{{ emptyText }}</view> |
|||
</view> |
|||
<view v-if="loading" class="uni-table-mask" :class="{ 'empty-border': border }"><div class="uni-table--loader"></div></view> |
|||
</table> |
|||
<!-- #endif --> |
|||
<!-- #ifndef H5 --> |
|||
<view class="uni-table" :style="{ 'min-width': minWidth + 'px' }" :class="{ 'table--stripe': stripe }"> |
|||
<slot></slot> |
|||
<view v-if="noData" class="uni-table-loading"> |
|||
<view class="uni-table-text" :class="{ 'empty-border': border }">{{ emptyText }}</view> |
|||
</view> |
|||
<view v-if="loading" class="uni-table-mask" :class="{ 'empty-border': border }"><div class="uni-table--loader"></div></view> |
|||
</view> |
|||
<!-- #endif --> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
/** |
|||
* Table 表格 |
|||
* @description 用于展示多条结构类似的数据 |
|||
* @tutorial https://ext.dcloud.net.cn/plugin?id=3270 |
|||
* @property {Boolean} border 是否带有纵向边框 |
|||
* @property {Boolean} stripe 是否显示斑马线 |
|||
* @property {Boolean} type 是否开启多选 |
|||
* @property {String} emptyText 空数据时显示的文本内容 |
|||
* @property {Boolean} loading 显示加载中 |
|||
* @event {Function} selection-change 开启多选时,当选择项发生变化时会触发该事件 |
|||
*/ |
|||
export default { |
|||
name: 'uniTable', |
|||
options: { |
|||
virtualHost: true |
|||
}, |
|||
emits:['selection-change'], |
|||
props: { |
|||
data: { |
|||
type: Array, |
|||
default() { |
|||
return [] |
|||
} |
|||
}, |
|||
// 是否有竖线 |
|||
border: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
// 是否显示斑马线 |
|||
stripe: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
// 多选 |
|||
type: { |
|||
type: String, |
|||
default: '' |
|||
}, |
|||
// 没有更多数据 |
|||
emptyText: { |
|||
type: String, |
|||
default: '没有更多数据' |
|||
}, |
|||
loading: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
rowKey: { |
|||
type: String, |
|||
default: '' |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
noData: true, |
|||
minWidth: 0, |
|||
multiTableHeads: [] |
|||
} |
|||
}, |
|||
watch: { |
|||
loading(val) {}, |
|||
data(newVal) { |
|||
let theadChildren = this.theadChildren |
|||
let rowspan = 1 |
|||
if (this.theadChildren) { |
|||
rowspan = this.theadChildren.rowspan |
|||
} |
|||
|
|||
// this.trChildren.length - rowspan |
|||
this.noData = false |
|||
// this.noData = newVal.length === 0 |
|||
} |
|||
}, |
|||
created() { |
|||
// 定义tr的实例数组 |
|||
this.trChildren = [] |
|||
this.thChildren = [] |
|||
this.theadChildren = null |
|||
this.backData = [] |
|||
this.backIndexData = [] |
|||
}, |
|||
|
|||
methods: { |
|||
isNodata() { |
|||
let theadChildren = this.theadChildren |
|||
let rowspan = 1 |
|||
if (this.theadChildren) { |
|||
rowspan = this.theadChildren.rowspan |
|||
} |
|||
this.noData = this.trChildren.length - rowspan <= 0 |
|||
}, |
|||
/** |
|||
* 选中所有 |
|||
*/ |
|||
selectionAll() { |
|||
let startIndex = 1 |
|||
let theadChildren = this.theadChildren |
|||
if (!this.theadChildren) { |
|||
theadChildren = this.trChildren[0] |
|||
} else { |
|||
startIndex = theadChildren.rowspan - 1 |
|||
} |
|||
let isHaveData = this.data && this.data.length > 0 |
|||
theadChildren.checked = true |
|||
theadChildren.indeterminate = false |
|||
this.trChildren.forEach((item, index) => { |
|||
if (!item.disabled) { |
|||
item.checked = true |
|||
if (isHaveData && item.keyValue) { |
|||
const row = this.data.find(v => v[this.rowKey] === item.keyValue) |
|||
if (!this.backData.find(v => v[this.rowKey] === row[this.rowKey])) { |
|||
this.backData.push(row) |
|||
} |
|||
} |
|||
if (index > (startIndex - 1) && this.backIndexData.indexOf(index - startIndex) === -1) { |
|||
this.backIndexData.push(index - startIndex) |
|||
} |
|||
} |
|||
}) |
|||
// this.backData = JSON.parse(JSON.stringify(this.data)) |
|||
this.$emit('selection-change', { |
|||
detail: { |
|||
value: this.backData, |
|||
index: this.backIndexData |
|||
} |
|||
}) |
|||
}, |
|||
/** |
|||
* 用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中) |
|||
*/ |
|||
toggleRowSelection(row, selected) { |
|||
// if (!this.theadChildren) return |
|||
row = [].concat(row) |
|||
|
|||
this.trChildren.forEach((item, index) => { |
|||
// if (item.keyValue) { |
|||
|
|||
const select = row.findIndex(v => { |
|||
// |
|||
if (typeof v === 'number') { |
|||
return v === index - 1 |
|||
} else { |
|||
return v[this.rowKey] === item.keyValue |
|||
} |
|||
}) |
|||
let ischeck = item.checked |
|||
if (select !== -1) { |
|||
if (typeof selected === 'boolean') { |
|||
item.checked = selected |
|||
} else { |
|||
item.checked = !item.checked |
|||
} |
|||
if (ischeck !== item.checked) { |
|||
this.check(item.rowData||item, item.checked, item.rowData?item.keyValue:null, true) |
|||
} |
|||
} |
|||
// } |
|||
}) |
|||
this.$emit('selection-change', { |
|||
detail: { |
|||
value: this.backData, |
|||
index:this.backIndexData |
|||
} |
|||
}) |
|||
}, |
|||
|
|||
/** |
|||
* 用于多选表格,清空用户的选择 |
|||
*/ |
|||
clearSelection() { |
|||
let theadChildren = this.theadChildren |
|||
if (!this.theadChildren) { |
|||
theadChildren = this.trChildren[0] |
|||
} |
|||
// if (!this.theadChildren) return |
|||
theadChildren.checked = false |
|||
theadChildren.indeterminate = false |
|||
this.trChildren.forEach(item => { |
|||
// if (item.keyValue) { |
|||
item.checked = false |
|||
// } |
|||
}) |
|||
this.backData = [] |
|||
this.backIndexData = [] |
|||
this.$emit('selection-change', { |
|||
detail: { |
|||
value: [], |
|||
index: [] |
|||
} |
|||
}) |
|||
}, |
|||
/** |
|||
* 用于多选表格,切换所有行的选中状态 |
|||
*/ |
|||
toggleAllSelection() { |
|||
let list = [] |
|||
let startIndex = 1 |
|||
let theadChildren = this.theadChildren |
|||
if (!this.theadChildren) { |
|||
theadChildren = this.trChildren[0] |
|||
} else { |
|||
startIndex = theadChildren.rowspan - 1 |
|||
} |
|||
this.trChildren.forEach((item, index) => { |
|||
if (!item.disabled) { |
|||
if (index > (startIndex - 1) ) { |
|||
list.push(index-startIndex) |
|||
} |
|||
} |
|||
}) |
|||
this.toggleRowSelection(list) |
|||
}, |
|||
|
|||
/** |
|||
* 选中\取消选中 |
|||
* @param {Object} child |
|||
* @param {Object} check |
|||
* @param {Object} rowValue |
|||
*/ |
|||
check(child, check, keyValue, emit) { |
|||
let theadChildren = this.theadChildren |
|||
if (!this.theadChildren) { |
|||
theadChildren = this.trChildren[0] |
|||
} |
|||
|
|||
|
|||
|
|||
let childDomIndex = this.trChildren.findIndex((item, index) => child === item) |
|||
if(childDomIndex < 0){ |
|||
childDomIndex = this.data.findIndex(v=>v[this.rowKey] === keyValue) + 1 |
|||
} |
|||
const dataLen = this.trChildren.filter(v => !v.disabled && v.keyValue).length |
|||
if (childDomIndex === 0) { |
|||
check ? this.selectionAll() : this.clearSelection() |
|||
return |
|||
} |
|||
|
|||
if (check) { |
|||
if (keyValue) { |
|||
this.backData.push(child) |
|||
} |
|||
this.backIndexData.push(childDomIndex - 1) |
|||
} else { |
|||
const index = this.backData.findIndex(v => v[this.rowKey] === keyValue) |
|||
const idx = this.backIndexData.findIndex(item => item === childDomIndex - 1) |
|||
if (keyValue) { |
|||
this.backData.splice(index, 1) |
|||
} |
|||
this.backIndexData.splice(idx, 1) |
|||
} |
|||
|
|||
const domCheckAll = this.trChildren.find((item, index) => index > 0 && !item.checked && !item.disabled) |
|||
if (!domCheckAll) { |
|||
theadChildren.indeterminate = false |
|||
theadChildren.checked = true |
|||
} else { |
|||
theadChildren.indeterminate = true |
|||
theadChildren.checked = false |
|||
} |
|||
|
|||
if (this.backIndexData.length === 0) { |
|||
theadChildren.indeterminate = false |
|||
} |
|||
|
|||
if (!emit) { |
|||
this.$emit('selection-change', { |
|||
detail: { |
|||
value: this.backData, |
|||
index: this.backIndexData |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
$border-color: #ebeef5; |
|||
|
|||
.uni-table-scroll { |
|||
width: 100%; |
|||
/* #ifndef APP-NVUE */ |
|||
overflow-x: auto; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.uni-table { |
|||
position: relative; |
|||
width: 100%; |
|||
border-radius: 5px; |
|||
// box-shadow: 0px 0px 3px 1px rgba(0, 0, 0, 0.1); |
|||
background-color: #fff; |
|||
/* #ifndef APP-NVUE */ |
|||
box-sizing: border-box; |
|||
display: table; |
|||
overflow-x: auto; |
|||
::v-deep .uni-table-tr:nth-child(n + 2) { |
|||
&:hover { |
|||
background-color: #f5f7fa; |
|||
} |
|||
} |
|||
::v-deep .uni-table-thead { |
|||
.uni-table-tr { |
|||
// background-color: #f5f7fa; |
|||
&:hover { |
|||
background-color:#fafafa; |
|||
} |
|||
} |
|||
} |
|||
/* #endif */ |
|||
} |
|||
|
|||
.table--border { |
|||
border: 1px $border-color solid; |
|||
border-right: none; |
|||
} |
|||
|
|||
.border-none { |
|||
/* #ifndef APP-NVUE */ |
|||
border-bottom: none; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.table--stripe { |
|||
/* #ifndef APP-NVUE */ |
|||
::v-deep .uni-table-tr:nth-child(2n + 3) { |
|||
background-color: #fafafa; |
|||
} |
|||
/* #endif */ |
|||
} |
|||
|
|||
/* 表格加载、无数据样式 */ |
|||
.uni-table-loading { |
|||
position: relative; |
|||
/* #ifndef APP-NVUE */ |
|||
display: table-row; |
|||
/* #endif */ |
|||
height: 50px; |
|||
line-height: 50px; |
|||
overflow: hidden; |
|||
box-sizing: border-box; |
|||
} |
|||
.empty-border { |
|||
border-right: 1px $border-color solid; |
|||
} |
|||
.uni-table-text { |
|||
position: absolute; |
|||
right: 0; |
|||
left: 0; |
|||
text-align: center; |
|||
font-size: 14px; |
|||
color: #999; |
|||
} |
|||
|
|||
.uni-table-mask { |
|||
position: absolute; |
|||
top: 0; |
|||
bottom: 0; |
|||
left: 0; |
|||
right: 0; |
|||
background-color: rgba(255, 255, 255, 0.8); |
|||
z-index: 99; |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
margin: auto; |
|||
transition: all 0.5s; |
|||
/* #endif */ |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
|
|||
.uni-table--loader { |
|||
width: 30px; |
|||
height: 30px; |
|||
border: 2px solid #aaa; |
|||
// border-bottom-color: transparent; |
|||
border-radius: 50%; |
|||
/* #ifndef APP-NVUE */ |
|||
animation: 2s uni-table--loader linear infinite; |
|||
/* #endif */ |
|||
position: relative; |
|||
} |
|||
|
|||
@keyframes uni-table--loader { |
|||
0% { |
|||
transform: rotate(360deg); |
|||
} |
|||
|
|||
10% { |
|||
border-left-color: transparent; |
|||
} |
|||
|
|||
20% { |
|||
border-bottom-color: transparent; |
|||
} |
|||
|
|||
30% { |
|||
border-right-color: transparent; |
|||
} |
|||
|
|||
40% { |
|||
border-top-color: transparent; |
|||
} |
|||
|
|||
50% { |
|||
transform: rotate(0deg); |
|||
} |
|||
|
|||
60% { |
|||
border-top-color: transparent; |
|||
} |
|||
|
|||
70% { |
|||
border-left-color: transparent; |
|||
} |
|||
|
|||
80% { |
|||
border-bottom-color: transparent; |
|||
} |
|||
|
|||
90% { |
|||
border-right-color: transparent; |
|||
} |
|||
|
|||
100% { |
|||
transform: rotate(-360deg); |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,29 @@ |
|||
<template> |
|||
<!-- #ifdef H5 --> |
|||
<tbody> |
|||
<slot></slot> |
|||
</tbody> |
|||
<!-- #endif --> |
|||
<!-- #ifndef H5 --> |
|||
<view><slot></slot></view> |
|||
<!-- #endif --> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'uniBody', |
|||
options: { |
|||
virtualHost: true |
|||
}, |
|||
data() { |
|||
return { |
|||
|
|||
} |
|||
}, |
|||
created() {}, |
|||
methods: {} |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
</style> |
@ -0,0 +1,90 @@ |
|||
<template> |
|||
<!-- #ifdef H5 --> |
|||
<td class="uni-table-td" :rowspan="rowspan" :colspan="colspan" :class="{'table--border':border}" :style="{width:width + 'px','text-align':align}"> |
|||
<slot></slot> |
|||
</td> |
|||
<!-- #endif --> |
|||
<!-- #ifndef H5 --> |
|||
<!-- :class="{'table--border':border}" --> |
|||
<view class="uni-table-td" :class="{'table--border':border}" :style="{width:width + 'px','text-align':align}"> |
|||
<slot></slot> |
|||
</view> |
|||
<!-- #endif --> |
|||
|
|||
</template> |
|||
|
|||
<script> |
|||
/** |
|||
* Td 单元格 |
|||
* @description 表格中的标准单元格组件 |
|||
* @tutorial https://ext.dcloud.net.cn/plugin?id=3270 |
|||
* @property {Number} align = [left|center|right] 单元格对齐方式 |
|||
*/ |
|||
export default { |
|||
name: 'uniTd', |
|||
options: { |
|||
virtualHost: true |
|||
}, |
|||
props: { |
|||
width: { |
|||
type: [String, Number], |
|||
default: '' |
|||
}, |
|||
align: { |
|||
type: String, |
|||
default: 'left' |
|||
}, |
|||
rowspan: { |
|||
type: [Number,String], |
|||
default: 1 |
|||
}, |
|||
colspan: { |
|||
type: [Number,String], |
|||
default: 1 |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
border: false |
|||
}; |
|||
}, |
|||
created() { |
|||
this.root = this.getTable() |
|||
this.border = this.root.border |
|||
}, |
|||
methods: { |
|||
/** |
|||
* 获取父元素实例 |
|||
*/ |
|||
getTable() { |
|||
let parent = this.$parent; |
|||
let parentName = parent.$options.name; |
|||
while (parentName !== 'uniTable') { |
|||
parent = parent.$parent; |
|||
if (!parent) return false; |
|||
parentName = parent.$options.name; |
|||
} |
|||
return parent; |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
$border-color:#EBEEF5; |
|||
|
|||
.uni-table-td { |
|||
display: table-cell; |
|||
padding: 8px 10px; |
|||
font-size: 14px; |
|||
border-bottom: 1px $border-color solid; |
|||
font-weight: 400; |
|||
color: #606266; |
|||
line-height: 23px; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
.table--border { |
|||
border-right: 1px $border-color solid; |
|||
} |
|||
</style> |
@ -0,0 +1,511 @@ |
|||
<template> |
|||
<view class="uni-filter-dropdown"> |
|||
<view class="dropdown-btn" @click="onDropdown"> |
|||
<view class="icon-select" :class="{active: canReset}" v-if="isSelect || isRange"></view> |
|||
<view class="icon-search" :class="{active: canReset}" v-if="isSearch"> |
|||
<view class="icon-search-0"></view> |
|||
<view class="icon-search-1"></view> |
|||
</view> |
|||
<view class="icon-calendar" :class="{active: canReset}" v-if="isDate"> |
|||
<view class="icon-calendar-0"></view> |
|||
<view class="icon-calendar-1"></view> |
|||
</view> |
|||
</view> |
|||
<view class="uni-dropdown-cover" v-if="isOpened" @click="handleClose"></view> |
|||
<view class="dropdown-popup dropdown-popup-right" v-if="isOpened" @click.stop> |
|||
<!-- select--> |
|||
<view v-if="isSelect" class="list"> |
|||
<label class="flex-r a-i-c list-item" v-for="(item,index) in dataList" :key="index" |
|||
@click="onItemClick($event, index)"> |
|||
<check-box class="check" :checked="item.checked" /> |
|||
<view class="checklist-content"> |
|||
<text class="checklist-text" :style="item.styleIconText">{{item[map.text]}}</text> |
|||
</view> |
|||
</label> |
|||
</view> |
|||
<view v-if="isSelect" class="flex-r opera-area"> |
|||
<view class="flex-f btn btn-default" :class="{disable: !canReset}" @click="handleSelectReset"> |
|||
{{resource.reset}}</view> |
|||
<view class="flex-f btn btn-submit" @click="handleSelectSubmit">{{resource.submit}}</view> |
|||
</view> |
|||
<!-- search --> |
|||
<view v-if="isSearch" class="search-area"> |
|||
<input class="search-input" v-model="filterValue" /> |
|||
</view> |
|||
<view v-if="isSearch" class="flex-r opera-area"> |
|||
<view class="flex-f btn btn-submit" @click="handleSearchSubmit">{{resource.search}}</view> |
|||
<view class="flex-f btn btn-default" :class="{disable: !canReset}" @click="handleSearchReset"> |
|||
{{resource.reset}}</view> |
|||
</view> |
|||
<!-- range --> |
|||
<view v-if="isRange"> |
|||
<view class="input-label">{{resource.gt}}</view> |
|||
<input class="input" v-model="gtValue" /> |
|||
<view class="input-label">{{resource.lt}}</view> |
|||
<input class="input" v-model="ltValue" /> |
|||
</view> |
|||
<view v-if="isRange" class="flex-r opera-area"> |
|||
<view class="flex-f btn btn-default" :class="{disable: !canReset}" @click="handleRangeReset"> |
|||
{{resource.reset}}</view> |
|||
<view class="flex-f btn btn-submit" @click="handleRangeSubmit">{{resource.submit}}</view> |
|||
</view> |
|||
<!-- date --> |
|||
<view v-if="isDate"> |
|||
<uni-datetime-picker ref="datetimepicker" :value="dateRange" type="datetimerange" return-type="timestamp" @change="datetimechange" @maskClick="timepickerclose"> |
|||
<view></view> |
|||
</uni-datetime-picker> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import checkBox from '../uni-tr/table-checkbox.vue' |
|||
|
|||
const resource = { |
|||
"reset": "重置", |
|||
"search": "搜索", |
|||
"submit": "确定", |
|||
"filter": "筛选", |
|||
"gt": "大于等于", |
|||
"lt": "小于等于", |
|||
"date": "日期范围" |
|||
} |
|||
|
|||
const DropdownType = { |
|||
Select: "select", |
|||
Search: "search", |
|||
Range: "range", |
|||
Date: "date", |
|||
Timestamp: "timestamp" |
|||
} |
|||
|
|||
export default { |
|||
name: 'FilterDropdown', |
|||
emits:['change'], |
|||
components: { |
|||
checkBox |
|||
}, |
|||
options: { |
|||
virtualHost: true |
|||
}, |
|||
props: { |
|||
filterType: { |
|||
type: String, |
|||
default: DropdownType.Select |
|||
}, |
|||
filterData: { |
|||
type: Array, |
|||
default () { |
|||
return [] |
|||
} |
|||
}, |
|||
mode: { |
|||
type: String, |
|||
default: 'default' |
|||
}, |
|||
map: { |
|||
type: Object, |
|||
default () { |
|||
return { |
|||
text: 'text', |
|||
value: 'value' |
|||
} |
|||
} |
|||
}, |
|||
filterDefaultValue: { |
|||
type: [Array,String], |
|||
default () { |
|||
return "" |
|||
} |
|||
} |
|||
}, |
|||
computed: { |
|||
canReset() { |
|||
if (this.isSearch) { |
|||
return this.filterValue.length > 0 |
|||
} |
|||
if (this.isSelect) { |
|||
return this.checkedValues.length > 0 |
|||
} |
|||
if (this.isRange) { |
|||
return (this.gtValue.length > 0 && this.ltValue.length > 0) |
|||
} |
|||
if (this.isDate) { |
|||
return this.dateSelect.length > 0 |
|||
} |
|||
return false |
|||
}, |
|||
isSelect() { |
|||
return this.filterType === DropdownType.Select |
|||
}, |
|||
isSearch() { |
|||
return this.filterType === DropdownType.Search |
|||
}, |
|||
isRange() { |
|||
return this.filterType === DropdownType.Range |
|||
}, |
|||
isDate() { |
|||
return (this.filterType === DropdownType.Date || this.filterType === DropdownType.Timestamp) |
|||
} |
|||
}, |
|||
watch: { |
|||
filterData(newVal) { |
|||
this._copyFilters() |
|||
}, |
|||
indeterminate(newVal) { |
|||
this.isIndeterminate = newVal |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
resource, |
|||
enabled: true, |
|||
isOpened: false, |
|||
dataList: [], |
|||
filterValue: this.filterDefaultValue, |
|||
checkedValues: [], |
|||
gtValue: '', |
|||
ltValue: '', |
|||
dateRange: [], |
|||
dateSelect: [] |
|||
}; |
|||
}, |
|||
created() { |
|||
this._copyFilters() |
|||
}, |
|||
methods: { |
|||
_copyFilters() { |
|||
let dl = JSON.parse(JSON.stringify(this.filterData)) |
|||
for (let i = 0; i < dl.length; i++) { |
|||
if (dl[i].checked === undefined) { |
|||
dl[i].checked = false |
|||
} |
|||
} |
|||
this.dataList = dl |
|||
}, |
|||
openPopup() { |
|||
this.isOpened = true |
|||
if (this.isDate) { |
|||
this.$nextTick(() => { |
|||
if (!this.dateRange.length) { |
|||
this.resetDate() |
|||
} |
|||
this.$refs.datetimepicker.show() |
|||
}) |
|||
} |
|||
}, |
|||
closePopup() { |
|||
this.isOpened = false |
|||
}, |
|||
handleClose(e) { |
|||
this.closePopup() |
|||
}, |
|||
resetDate() { |
|||
let date = new Date() |
|||
let dateText = date.toISOString().split('T')[0] |
|||
this.dateRange = [dateText + ' 0:00:00', dateText + ' 23:59:59'] |
|||
}, |
|||
onDropdown(e) { |
|||
this.openPopup() |
|||
}, |
|||
onItemClick(e, index) { |
|||
let items = this.dataList |
|||
let listItem = items[index] |
|||
if (listItem.checked === undefined) { |
|||
items[index].checked = true |
|||
} else { |
|||
items[index].checked = !listItem.checked |
|||
} |
|||
|
|||
let checkvalues = [] |
|||
for (let i = 0; i < items.length; i++) { |
|||
const item = items[i] |
|||
if (item.checked) { |
|||
checkvalues.push(item.value) |
|||
} |
|||
} |
|||
this.checkedValues = checkvalues |
|||
}, |
|||
datetimechange(e) { |
|||
this.closePopup() |
|||
this.dateRange = e |
|||
this.dateSelect = e |
|||
this.$emit('change', { |
|||
filterType: this.filterType, |
|||
filter: e |
|||
}) |
|||
}, |
|||
timepickerclose(e) { |
|||
this.closePopup() |
|||
}, |
|||
handleSelectSubmit() { |
|||
this.closePopup() |
|||
this.$emit('change', { |
|||
filterType: this.filterType, |
|||
filter: this.checkedValues |
|||
}) |
|||
}, |
|||
handleSelectReset() { |
|||
if (!this.canReset) { |
|||
return; |
|||
} |
|||
var items = this.dataList |
|||
for (let i = 0; i < items.length; i++) { |
|||
let item = items[i] |
|||
this.$set(item, 'checked', false) |
|||
} |
|||
this.checkedValues = [] |
|||
this.handleSelectSubmit() |
|||
}, |
|||
handleSearchSubmit() { |
|||
this.closePopup() |
|||
this.$emit('change', { |
|||
filterType: this.filterType, |
|||
filter: this.filterValue |
|||
}) |
|||
}, |
|||
handleSearchReset() { |
|||
if (!this.canReset) { |
|||
return; |
|||
} |
|||
this.filterValue = '' |
|||
this.handleSearchSubmit() |
|||
}, |
|||
handleRangeSubmit(isReset) { |
|||
this.closePopup() |
|||
this.$emit('change', { |
|||
filterType: this.filterType, |
|||
filter: isReset === true ? [] : [parseInt(this.gtValue), parseInt(this.ltValue)] |
|||
}) |
|||
}, |
|||
handleRangeReset() { |
|||
if (!this.canReset) { |
|||
return; |
|||
} |
|||
this.gtValue = '' |
|||
this.ltValue = '' |
|||
this.handleRangeSubmit(true) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
$uni-primary: #1890ff !default; |
|||
|
|||
.flex-r { |
|||
display: flex; |
|||
flex-direction: row; |
|||
} |
|||
|
|||
.flex-f { |
|||
flex: 1; |
|||
} |
|||
|
|||
.a-i-c { |
|||
align-items: center; |
|||
} |
|||
|
|||
.j-c-c { |
|||
justify-content: center; |
|||
} |
|||
|
|||
.icon-select { |
|||
width: 14px; |
|||
height: 16px; |
|||
border: solid 6px transparent; |
|||
border-top: solid 6px #ddd; |
|||
border-bottom: none; |
|||
background-color: #ddd; |
|||
background-clip: content-box; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
.icon-select.active { |
|||
background-color: $uni-primary; |
|||
border-top-color: $uni-primary; |
|||
} |
|||
|
|||
.icon-search { |
|||
width: 12px; |
|||
height: 16px; |
|||
position: relative; |
|||
} |
|||
|
|||
.icon-search-0 { |
|||
border: 2px solid #ddd; |
|||
border-radius: 8px; |
|||
width: 7px; |
|||
height: 7px; |
|||
} |
|||
|
|||
.icon-search-1 { |
|||
position: absolute; |
|||
top: 8px; |
|||
right: 0; |
|||
width: 1px; |
|||
height: 7px; |
|||
background-color: #ddd; |
|||
transform: rotate(-45deg); |
|||
} |
|||
|
|||
.icon-search.active .icon-search-0 { |
|||
border-color: $uni-primary; |
|||
} |
|||
|
|||
.icon-search.active .icon-search-1 { |
|||
background-color: $uni-primary; |
|||
} |
|||
|
|||
.icon-calendar { |
|||
color: #ddd; |
|||
width: 14px; |
|||
height: 16px; |
|||
} |
|||
|
|||
.icon-calendar-0 { |
|||
height: 4px; |
|||
margin-top: 3px; |
|||
margin-bottom: 1px; |
|||
background-color: #ddd; |
|||
border-radius: 2px 2px 1px 1px; |
|||
position: relative; |
|||
} |
|||
.icon-calendar-0:before, .icon-calendar-0:after { |
|||
content: ''; |
|||
position: absolute; |
|||
top: -3px; |
|||
width: 4px; |
|||
height: 3px; |
|||
border-radius: 1px; |
|||
background-color: #ddd; |
|||
} |
|||
.icon-calendar-0:before { |
|||
left: 2px; |
|||
} |
|||
.icon-calendar-0:after { |
|||
right: 2px; |
|||
} |
|||
|
|||
.icon-calendar-1 { |
|||
height: 9px; |
|||
background-color: #ddd; |
|||
border-radius: 1px 1px 2px 2px; |
|||
} |
|||
|
|||
.icon-calendar.active { |
|||
color: $uni-primary; |
|||
} |
|||
|
|||
.icon-calendar.active .icon-calendar-0, |
|||
.icon-calendar.active .icon-calendar-1, |
|||
.icon-calendar.active .icon-calendar-0:before, |
|||
.icon-calendar.active .icon-calendar-0:after { |
|||
background-color: $uni-primary; |
|||
} |
|||
|
|||
.uni-filter-dropdown { |
|||
position: relative; |
|||
font-weight: normal; |
|||
} |
|||
|
|||
.dropdown-popup { |
|||
position: absolute; |
|||
top: 100%; |
|||
background-color: #fff; |
|||
box-shadow: 0 3px 6px -4px #0000001f, 0 6px 16px #00000014, 0 9px 28px 8px #0000000d; |
|||
min-width: 150px; |
|||
z-index: 1000; |
|||
} |
|||
|
|||
.dropdown-popup-left { |
|||
left: 0; |
|||
} |
|||
|
|||
.dropdown-popup-right { |
|||
right: 0; |
|||
} |
|||
|
|||
.uni-dropdown-cover { |
|||
position: fixed; |
|||
left: 0; |
|||
top: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
background-color: transparent; |
|||
z-index: 100; |
|||
} |
|||
|
|||
.list { |
|||
margin-top: 5px; |
|||
margin-bottom: 5px; |
|||
} |
|||
|
|||
.list-item { |
|||
padding: 5px 10px; |
|||
text-align: left; |
|||
} |
|||
|
|||
.list-item:hover { |
|||
background-color: #f0f0f0; |
|||
} |
|||
|
|||
.check { |
|||
margin-right: 5px; |
|||
} |
|||
|
|||
.search-area { |
|||
padding: 10px; |
|||
} |
|||
|
|||
.search-input { |
|||
font-size: 12px; |
|||
border: 1px solid #f0f0f0; |
|||
border-radius: 3px; |
|||
padding: 2px 5px; |
|||
min-width: 150px; |
|||
text-align: left; |
|||
} |
|||
|
|||
.input-label { |
|||
margin: 10px 10px 5px 10px; |
|||
text-align: left; |
|||
} |
|||
|
|||
.input { |
|||
font-size: 12px; |
|||
border: 1px solid #f0f0f0; |
|||
border-radius: 3px; |
|||
margin: 10px; |
|||
padding: 2px 5px; |
|||
min-width: 150px; |
|||
text-align: left; |
|||
} |
|||
|
|||
.opera-area { |
|||
cursor: default; |
|||
border-top: 1px solid #ddd; |
|||
padding: 5px; |
|||
} |
|||
|
|||
.opera-area .btn { |
|||
font-size: 12px; |
|||
border-radius: 3px; |
|||
margin: 5px; |
|||
padding: 4px 4px; |
|||
} |
|||
|
|||
.btn-default { |
|||
border: 1px solid #ddd; |
|||
} |
|||
|
|||
.btn-default.disable { |
|||
border-color: transparent; |
|||
} |
|||
|
|||
.btn-submit { |
|||
background-color: $uni-primary; |
|||
color: #ffffff; |
|||
} |
|||
</style> |
@ -0,0 +1,285 @@ |
|||
<template> |
|||
<!-- #ifdef H5 --> |
|||
<th :rowspan="rowspan" :colspan="colspan" class="uni-table-th" :class="{ 'table--border': border }" :style="{ width: customWidth + 'px', 'text-align': align }"> |
|||
<view class="uni-table-th-row"> |
|||
<view class="uni-table-th-content" :style="{ 'justify-content': contentAlign }" @click="sort"> |
|||
<slot></slot> |
|||
<view v-if="sortable" class="arrow-box"> |
|||
<text class="arrow up" :class="{ active: ascending }" @click.stop="ascendingFn"></text> |
|||
<text class="arrow down" :class="{ active: descending }" @click.stop="descendingFn"></text> |
|||
</view> |
|||
</view> |
|||
<dropdown v-if="filterType || filterData.length" :filterDefaultValue="filterDefaultValue" :filterData="filterData" :filterType="filterType" @change="ondropdown"></dropdown> |
|||
</view> |
|||
</th> |
|||
<!-- #endif --> |
|||
<!-- #ifndef H5 --> |
|||
<view class="uni-table-th" :class="{ 'table--border': border }" :style="{ width: customWidth + 'px', 'text-align': align }"><slot></slot></view> |
|||
<!-- #endif --> |
|||
</template> |
|||
|
|||
<script> |
|||
// #ifdef H5 |
|||
import dropdown from './filter-dropdown.vue' |
|||
// #endif |
|||
/** |
|||
* Th 表头 |
|||
* @description 表格内的表头单元格组件 |
|||
* @tutorial https://ext.dcloud.net.cn/plugin?id=3270 |
|||
* @property {Number | String} width 单元格宽度(支持纯数字、携带单位px或rpx) |
|||
* @property {Boolean} sortable 是否启用排序 |
|||
* @property {Number} align = [left|center|right] 单元格对齐方式 |
|||
* @value left 单元格文字左侧对齐 |
|||
* @value center 单元格文字居中 |
|||
* @value right 单元格文字右侧对齐 |
|||
* @property {Array} filterData 筛选数据 |
|||
* @property {String} filterType [search|select] 筛选类型 |
|||
* @value search 关键字搜素 |
|||
* @value select 条件选择 |
|||
* @event {Function} sort-change 排序触发事件 |
|||
*/ |
|||
export default { |
|||
name: 'uniTh', |
|||
options: { |
|||
virtualHost: true |
|||
}, |
|||
components: { |
|||
// #ifdef H5 |
|||
dropdown |
|||
// #endif |
|||
}, |
|||
emits:['sort-change','filter-change'], |
|||
props: { |
|||
width: { |
|||
type: [String, Number], |
|||
default: '' |
|||
}, |
|||
align: { |
|||
type: String, |
|||
default: 'left' |
|||
}, |
|||
rowspan: { |
|||
type: [Number, String], |
|||
default: 1 |
|||
}, |
|||
colspan: { |
|||
type: [Number, String], |
|||
default: 1 |
|||
}, |
|||
sortable: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
filterType: { |
|||
type: String, |
|||
default: "" |
|||
}, |
|||
filterData: { |
|||
type: Array, |
|||
default () { |
|||
return [] |
|||
} |
|||
}, |
|||
filterDefaultValue: { |
|||
type: [Array,String], |
|||
default () { |
|||
return "" |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
border: false, |
|||
ascending: false, |
|||
descending: false |
|||
} |
|||
}, |
|||
computed: { |
|||
// 根据props中的width属性 自动匹配当前th的宽度(px) |
|||
customWidth(){ |
|||
if(typeof this.width === 'number'){ |
|||
return this.width |
|||
} else if(typeof this.width === 'string') { |
|||
let regexHaveUnitPx = new RegExp(/^[1-9][0-9]*px$/g) |
|||
let regexHaveUnitRpx = new RegExp(/^[1-9][0-9]*rpx$/g) |
|||
let regexHaveNotUnit = new RegExp(/^[1-9][0-9]*$/g) |
|||
if (this.width.match(regexHaveUnitPx) !== null) { // 携带了 px |
|||
return this.width.replace('px', '') |
|||
} else if (this.width.match(regexHaveUnitRpx) !== null) { // 携带了 rpx |
|||
let numberRpx = Number(this.width.replace('rpx', '')) |
|||
let widthCoe = uni.getSystemInfoSync().screenWidth / 750 |
|||
return Math.round(numberRpx * widthCoe) |
|||
} else if (this.width.match(regexHaveNotUnit) !== null) { // 未携带 rpx或px 的纯数字 String |
|||
return this.width |
|||
} else { // 不符合格式 |
|||
return '' |
|||
} |
|||
} else { |
|||
return '' |
|||
} |
|||
}, |
|||
contentAlign() { |
|||
let align = 'left' |
|||
switch (this.align) { |
|||
case 'left': |
|||
align = 'flex-start' |
|||
break |
|||
case 'center': |
|||
align = 'center' |
|||
break |
|||
case 'right': |
|||
align = 'flex-end' |
|||
break |
|||
} |
|||
return align |
|||
} |
|||
}, |
|||
created() { |
|||
this.root = this.getTable('uniTable') |
|||
this.rootTr = this.getTable('uniTr') |
|||
this.rootTr.minWidthUpdate(this.customWidth ? this.customWidth : 140) |
|||
this.border = this.root.border |
|||
this.root.thChildren.push(this) |
|||
}, |
|||
methods: { |
|||
sort() { |
|||
if (!this.sortable) return |
|||
this.clearOther() |
|||
if (!this.ascending && !this.descending) { |
|||
this.ascending = true |
|||
this.$emit('sort-change', { order: 'ascending' }) |
|||
return |
|||
} |
|||
if (this.ascending && !this.descending) { |
|||
this.ascending = false |
|||
this.descending = true |
|||
this.$emit('sort-change', { order: 'descending' }) |
|||
return |
|||
} |
|||
|
|||
if (!this.ascending && this.descending) { |
|||
this.ascending = false |
|||
this.descending = false |
|||
this.$emit('sort-change', { order: null }) |
|||
} |
|||
}, |
|||
ascendingFn() { |
|||
this.clearOther() |
|||
this.ascending = !this.ascending |
|||
this.descending = false |
|||
this.$emit('sort-change', { order: this.ascending ? 'ascending' : null }) |
|||
}, |
|||
descendingFn() { |
|||
this.clearOther() |
|||
this.descending = !this.descending |
|||
this.ascending = false |
|||
this.$emit('sort-change', { order: this.descending ? 'descending' : null }) |
|||
}, |
|||
clearOther() { |
|||
this.root.thChildren.map(item => { |
|||
if (item !== this) { |
|||
item.ascending = false |
|||
item.descending = false |
|||
} |
|||
return item |
|||
}) |
|||
}, |
|||
ondropdown(e) { |
|||
this.$emit("filter-change", e) |
|||
}, |
|||
/** |
|||
* 获取父元素实例 |
|||
*/ |
|||
getTable(name) { |
|||
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"> |
|||
$border-color: #ebeef5; |
|||
$uni-primary: #007aff !default; |
|||
|
|||
.uni-table-th { |
|||
padding: 12px 10px; |
|||
/* #ifndef APP-NVUE */ |
|||
display: table-cell; |
|||
box-sizing: border-box; |
|||
/* #endif */ |
|||
font-size: 14px; |
|||
font-weight: bold; |
|||
color: #909399; |
|||
border-bottom: 1px $border-color solid; |
|||
} |
|||
|
|||
.uni-table-th-row { |
|||
/* #ifndef APP-NVUE */ |
|||
display: flex; |
|||
/* #endif */ |
|||
flex-direction: row; |
|||
} |
|||
|
|||
.table--border { |
|||
border-right: 1px $border-color solid; |
|||
} |
|||
.uni-table-th-content { |
|||
display: flex; |
|||
align-items: center; |
|||
flex: 1; |
|||
} |
|||
.arrow-box { |
|||
} |
|||
.arrow { |
|||
display: block; |
|||
position: relative; |
|||
width: 10px; |
|||
height: 8px; |
|||
// border: 1px red solid; |
|||
left: 5px; |
|||
overflow: hidden; |
|||
cursor: pointer; |
|||
} |
|||
.down { |
|||
top: 3px; |
|||
::after { |
|||
content: ''; |
|||
width: 8px; |
|||
height: 8px; |
|||
position: absolute; |
|||
left: 2px; |
|||
top: -5px; |
|||
transform: rotate(45deg); |
|||
background-color: #ccc; |
|||
} |
|||
&.active { |
|||
::after { |
|||
background-color: $uni-primary; |
|||
} |
|||
} |
|||
} |
|||
.up { |
|||
::after { |
|||
content: ''; |
|||
width: 8px; |
|||
height: 8px; |
|||
position: absolute; |
|||
left: 2px; |
|||
top: 5px; |
|||
transform: rotate(45deg); |
|||
background-color: #ccc; |
|||
} |
|||
&.active { |
|||
::after { |
|||
background-color: $uni-primary; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,129 @@ |
|||
<template> |
|||
<!-- #ifdef H5 --> |
|||
<thead class="uni-table-thead"> |
|||
<tr class="uni-table-tr"> |
|||
<th :rowspan="rowspan" colspan="1" class="checkbox" :class="{ 'tr-table--border': border }"> |
|||
<table-checkbox :indeterminate="indeterminate" :checked="checked" @checkboxSelected="checkboxSelected"></table-checkbox> |
|||
</th> |
|||
</tr> |
|||
<slot></slot> |
|||
</thead> |
|||
<!-- #endif --> |
|||
<!-- #ifndef H5 --> |
|||
<view class="uni-table-thead"><slot></slot></view> |
|||
<!-- #endif --> |
|||
</template> |
|||
|
|||
<script> |
|||
import tableCheckbox from '../uni-tr/table-checkbox.vue' |
|||
export default { |
|||
name: 'uniThead', |
|||
components: { |
|||
tableCheckbox |
|||
}, |
|||
options: { |
|||
virtualHost: true |
|||
}, |
|||
data() { |
|||
return { |
|||
border: false, |
|||
selection: false, |
|||
rowspan: 1, |
|||
indeterminate: false, |
|||
checked: false |
|||
} |
|||
}, |
|||
created() { |
|||
this.root = this.getTable() |
|||
// #ifdef H5 |
|||
this.root.theadChildren = this |
|||
// #endif |
|||
this.border = this.root.border |
|||
this.selection = this.root.type |
|||
}, |
|||
methods: { |
|||
init(self) { |
|||
this.rowspan++ |
|||
}, |
|||
checkboxSelected(e) { |
|||
this.indeterminate = false |
|||
const backIndexData = this.root.backIndexData |
|||
const data = this.root.trChildren.filter(v => !v.disabled && v.keyValue) |
|||
if (backIndexData.length === data.length) { |
|||
this.checked = false |
|||
this.root.clearSelection() |
|||
} else { |
|||
this.checked = true |
|||
this.root.selectionAll() |
|||
} |
|||
}, |
|||
/** |
|||
* 获取父元素实例 |
|||
*/ |
|||
getTable(name = 'uniTable') { |
|||
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"> |
|||
$border-color: #ebeef5; |
|||
|
|||
.uni-table-thead { |
|||
display: table-header-group; |
|||
} |
|||
|
|||
.uni-table-tr { |
|||
/* #ifndef APP-NVUE */ |
|||
display: table-row; |
|||
transition: all 0.3s; |
|||
box-sizing: border-box; |
|||
/* #endif */ |
|||
border: 1px red solid; |
|||
background-color: #fafafa; |
|||
} |
|||
|
|||
.checkbox { |
|||
padding: 0 8px; |
|||
width: 26px; |
|||
padding-left: 12px; |
|||
/* #ifndef APP-NVUE */ |
|||
display: table-cell; |
|||
vertical-align: middle; |
|||
/* #endif */ |
|||
color: #333; |
|||
font-weight: 500; |
|||
border-bottom: 1px $border-color solid; |
|||
font-size: 14px; |
|||
// text-align: center; |
|||
} |
|||
|
|||
.tr-table--border { |
|||
border-right: 1px $border-color solid; |
|||
} |
|||
|
|||
/* #ifndef APP-NVUE */ |
|||
.uni-table-tr { |
|||
::v-deep .uni-table-th { |
|||
&.table--border:last-child { |
|||
// border-right: none; |
|||
} |
|||
} |
|||
|
|||
::v-deep .uni-table-td { |
|||
&.table--border:last-child { |
|||
// border-right: none; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* #endif */ |
|||
</style> |
@ -0,0 +1,179 @@ |
|||
<template> |
|||
<view class="uni-table-checkbox" @click="selected"> |
|||
<view v-if="!indeterminate" class="checkbox__inner" :class="{'is-checked':isChecked,'is-disable':isDisabled}"> |
|||
<view class="checkbox__inner-icon"></view> |
|||
</view> |
|||
<view v-else class="checkbox__inner checkbox--indeterminate"> |
|||
<view class="checkbox__inner-icon"></view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'TableCheckbox', |
|||
emits:['checkboxSelected'], |
|||
props: { |
|||
indeterminate: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
checked: { |
|||
type: [Boolean,String], |
|||
default: false |
|||
}, |
|||
disabled: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
index: { |
|||
type: Number, |
|||
default: -1 |
|||
}, |
|||
cellData: { |
|||
type: Object, |
|||
default () { |
|||
return {} |
|||
} |
|||
} |
|||
}, |
|||
watch:{ |
|||
checked(newVal){ |
|||
if(typeof this.checked === 'boolean'){ |
|||
this.isChecked = newVal |
|||
}else{ |
|||
this.isChecked = true |
|||
} |
|||
}, |
|||
indeterminate(newVal){ |
|||
this.isIndeterminate = newVal |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
isChecked: false, |
|||
isDisabled: false, |
|||
isIndeterminate:false |
|||
} |
|||
}, |
|||
created() { |
|||
if(typeof this.checked === 'boolean'){ |
|||
this.isChecked = this.checked |
|||
} |
|||
this.isDisabled = this.disabled |
|||
}, |
|||
methods: { |
|||
selected() { |
|||
if (this.isDisabled) return |
|||
this.isIndeterminate = false |
|||
this.isChecked = !this.isChecked |
|||
this.$emit('checkboxSelected', { |
|||
checked: this.isChecked, |
|||
data: this.cellData |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
$uni-primary: #007aff !default; |
|||
$border-color: #DCDFE6; |
|||
$disable:0.4; |
|||
|
|||
.uni-table-checkbox { |
|||
display: flex; |
|||
flex-direction: row; |
|||
align-items: center; |
|||
justify-content: center; |
|||
position: relative; |
|||
margin: 5px 0; |
|||
cursor: pointer; |
|||
|
|||
// 多选样式 |
|||
.checkbox__inner { |
|||
/* #ifndef APP-NVUE */ |
|||
flex-shrink: 0; |
|||
box-sizing: border-box; |
|||
/* #endif */ |
|||
position: relative; |
|||
width: 16px; |
|||
height: 16px; |
|||
border: 1px solid $border-color; |
|||
border-radius: 2px; |
|||
background-color: #fff; |
|||
z-index: 1; |
|||
|
|||
.checkbox__inner-icon { |
|||
position: absolute; |
|||
/* #ifdef APP-NVUE */ |
|||
top: 2px; |
|||
/* #endif */ |
|||
/* #ifndef APP-NVUE */ |
|||
top: 2px; |
|||
/* #endif */ |
|||
left: 5px; |
|||
height: 7px; |
|||
width: 3px; |
|||
border: 1px solid #fff; |
|||
border-left: 0; |
|||
border-top: 0; |
|||
opacity: 0; |
|||
transform-origin: center; |
|||
transform: rotate(45deg); |
|||
box-sizing: content-box; |
|||
} |
|||
|
|||
&.checkbox--indeterminate { |
|||
border-color: $uni-primary; |
|||
background-color: $uni-primary; |
|||
|
|||
.checkbox__inner-icon { |
|||
position: absolute; |
|||
opacity: 1; |
|||
transform: rotate(0deg); |
|||
height: 2px; |
|||
top: 0; |
|||
bottom: 0; |
|||
margin: auto; |
|||
left: 0px; |
|||
right: 0px; |
|||
bottom: 0; |
|||
width: auto; |
|||
border: none; |
|||
border-radius: 2px; |
|||
transform: scale(0.5); |
|||
background-color: #fff; |
|||
} |
|||
} |
|||
&:hover{ |
|||
border-color: $uni-primary; |
|||
} |
|||
// 禁用 |
|||
&.is-disable { |
|||
/* #ifdef H5 */ |
|||
cursor: not-allowed; |
|||
/* #endif */ |
|||
background-color: #F2F6FC; |
|||
border-color: $border-color; |
|||
} |
|||
|
|||
// 选中 |
|||
&.is-checked { |
|||
border-color: $uni-primary; |
|||
background-color: $uni-primary; |
|||
|
|||
.checkbox__inner-icon { |
|||
opacity: 1; |
|||
transform: rotate(45deg); |
|||
} |
|||
|
|||
// 选中禁用 |
|||
&.is-disable { |
|||
opacity: $disable; |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,171 @@ |
|||
<template> |
|||
<!-- #ifdef H5 --> |
|||
<tr class="uni-table-tr"> |
|||
<th v-if="selection === 'selection' && ishead" class="checkbox" :class="{ 'tr-table--border': border }"> |
|||
<table-checkbox :checked="checked" :indeterminate="indeterminate" :disabled="disabled" @checkboxSelected="checkboxSelected"></table-checkbox> |
|||
</th> |
|||
<slot></slot> |
|||
<!-- <uni-th class="th-fixed">123</uni-th> --> |
|||
</tr> |
|||
<!-- #endif --> |
|||
<!-- #ifndef H5 --> |
|||
<view class="uni-table-tr"> |
|||
<view v-if="selection === 'selection' " class="checkbox" :class="{ 'tr-table--border': border }"> |
|||
<table-checkbox :checked="checked" :indeterminate="indeterminate" :disabled="disabled" @checkboxSelected="checkboxSelected"></table-checkbox> |
|||
</view> |
|||
<slot></slot> |
|||
</view> |
|||
<!-- #endif --> |
|||
</template> |
|||
|
|||
<script> |
|||
import tableCheckbox from './table-checkbox.vue' |
|||
/** |
|||
* Tr 表格行组件 |
|||
* @description 表格行组件 仅包含 th,td 组件 |
|||
* @tutorial https://ext.dcloud.net.cn/plugin?id= |
|||
*/ |
|||
export default { |
|||
name: 'uniTr', |
|||
components: { tableCheckbox }, |
|||
props: { |
|||
disabled: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
keyValue: { |
|||
type: [String, Number], |
|||
default: '' |
|||
} |
|||
}, |
|||
options: { |
|||
virtualHost: true |
|||
}, |
|||
data() { |
|||
return { |
|||
value: false, |
|||
border: false, |
|||
selection: false, |
|||
widthThArr: [], |
|||
ishead: true, |
|||
checked: false, |
|||
indeterminate:false |
|||
} |
|||
}, |
|||
created() { |
|||
this.root = this.getTable() |
|||
this.head = this.getTable('uniThead') |
|||
if (this.head) { |
|||
this.ishead = false |
|||
this.head.init(this) |
|||
} |
|||
this.border = this.root.border |
|||
this.selection = this.root.type |
|||
this.root.trChildren.push(this) |
|||
const rowData = this.root.data.find(v => v[this.root.rowKey] === this.keyValue) |
|||
if(rowData){ |
|||
this.rowData = rowData |
|||
} |
|||
this.root.isNodata() |
|||
}, |
|||
mounted() { |
|||
if (this.widthThArr.length > 0) { |
|||
const selectionWidth = this.selection === 'selection' ? 50 : 0 |
|||
this.root.minWidth = this.widthThArr.reduce((a, b) => Number(a) + Number(b)) + selectionWidth |
|||
} |
|||
}, |
|||
// #ifndef VUE3 |
|||
destroyed() { |
|||
const index = this.root.trChildren.findIndex(i => i === this) |
|||
this.root.trChildren.splice(index, 1) |
|||
this.root.isNodata() |
|||
}, |
|||
// #endif |
|||
// #ifdef VUE3 |
|||
unmounted() { |
|||
const index = this.root.trChildren.findIndex(i => i === this) |
|||
this.root.trChildren.splice(index, 1) |
|||
this.root.isNodata() |
|||
}, |
|||
// #endif |
|||
methods: { |
|||
minWidthUpdate(width) { |
|||
this.widthThArr.push(width) |
|||
}, |
|||
// 选中 |
|||
checkboxSelected(e) { |
|||
let rootData = this.root.data.find(v => v[this.root.rowKey] === this.keyValue) |
|||
this.checked = e.checked |
|||
this.root.check(rootData||this, e.checked,rootData? this.keyValue:null) |
|||
}, |
|||
change(e) { |
|||
this.root.trChildren.forEach(item => { |
|||
if (item === this) { |
|||
this.root.check(this, e.detail.value.length > 0 ? true : false) |
|||
} |
|||
}) |
|||
}, |
|||
/** |
|||
* 获取父元素实例 |
|||
*/ |
|||
getTable(name = 'uniTable') { |
|||
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"> |
|||
$border-color: #ebeef5; |
|||
|
|||
.uni-table-tr { |
|||
/* #ifndef APP-NVUE */ |
|||
display: table-row; |
|||
transition: all 0.3s; |
|||
box-sizing: border-box; |
|||
/* #endif */ |
|||
} |
|||
|
|||
.checkbox { |
|||
padding: 0 8px; |
|||
width: 26px; |
|||
padding-left: 12px; |
|||
/* #ifndef APP-NVUE */ |
|||
display: table-cell; |
|||
vertical-align: middle; |
|||
/* #endif */ |
|||
color: #333; |
|||
font-weight: 500; |
|||
border-bottom: 1px $border-color solid; |
|||
font-size: 14px; |
|||
// text-align: center; |
|||
} |
|||
|
|||
.tr-table--border { |
|||
border-right: 1px $border-color solid; |
|||
} |
|||
|
|||
/* #ifndef APP-NVUE */ |
|||
.uni-table-tr { |
|||
::v-deep .uni-table-th { |
|||
&.table--border:last-child { |
|||
// border-right: none; |
|||
} |
|||
} |
|||
|
|||
::v-deep .uni-table-td { |
|||
&.table--border:last-child { |
|||
// border-right: none; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* #endif */ |
|||
</style> |
@ -0,0 +1,9 @@ |
|||
{ |
|||
"filter-dropdown.reset": "Reset", |
|||
"filter-dropdown.search": "Search", |
|||
"filter-dropdown.submit": "Submit", |
|||
"filter-dropdown.filter": "Filter", |
|||
"filter-dropdown.gt": "Greater or equal to", |
|||
"filter-dropdown.lt": "Less than or equal to", |
|||
"filter-dropdown.date": "Date" |
|||
} |
@ -0,0 +1,9 @@ |
|||
{ |
|||
"filter-dropdown.reset": "Reiniciar", |
|||
"filter-dropdown.search": "Búsqueda", |
|||
"filter-dropdown.submit": "Entregar", |
|||
"filter-dropdown.filter": "Filtrar", |
|||
"filter-dropdown.gt": "Mayor o igual a", |
|||
"filter-dropdown.lt": "Menos que o igual a", |
|||
"filter-dropdown.date": "Fecha" |
|||
} |
@ -0,0 +1,9 @@ |
|||
{ |
|||
"filter-dropdown.reset": "Réinitialiser", |
|||
"filter-dropdown.search": "Chercher", |
|||
"filter-dropdown.submit": "Soumettre", |
|||
"filter-dropdown.filter": "Filtre", |
|||
"filter-dropdown.gt": "Supérieur ou égal à", |
|||
"filter-dropdown.lt": "Inférieur ou égal à", |
|||
"filter-dropdown.date": "Date" |
|||
} |
@ -0,0 +1,12 @@ |
|||
import en from './en.json' |
|||
import es from './es.json' |
|||
import fr from './fr.json' |
|||
import zhHans from './zh-Hans.json' |
|||
import zhHant from './zh-Hant.json' |
|||
export default { |
|||
en, |
|||
es, |
|||
fr, |
|||
'zh-Hans': zhHans, |
|||
'zh-Hant': zhHant |
|||
} |
@ -0,0 +1,9 @@ |
|||
{ |
|||
"filter-dropdown.reset": "重置", |
|||
"filter-dropdown.search": "搜索", |
|||
"filter-dropdown.submit": "确定", |
|||
"filter-dropdown.filter": "筛选", |
|||
"filter-dropdown.gt": "大于等于", |
|||
"filter-dropdown.lt": "小于等于", |
|||
"filter-dropdown.date": "日期范围" |
|||
} |
@ -0,0 +1,9 @@ |
|||
{ |
|||
"filter-dropdown.reset": "重置", |
|||
"filter-dropdown.search": "搜索", |
|||
"filter-dropdown.submit": "確定", |
|||
"filter-dropdown.filter": "篩選", |
|||
"filter-dropdown.gt": "大於等於", |
|||
"filter-dropdown.lt": "小於等於", |
|||
"filter-dropdown.date": "日期範圍" |
|||
} |
@ -0,0 +1,83 @@ |
|||
{ |
|||
"id": "uni-table", |
|||
"displayName": "uni-table 表格", |
|||
"version": "1.2.2", |
|||
"description": "表格组件,多用于展示多条结构类似的数据,如", |
|||
"keywords": [ |
|||
"uni-ui", |
|||
"uniui", |
|||
"table", |
|||
"表格" |
|||
], |
|||
"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","uni-datetime-picker"], |
|||
"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", |
|||
"字节跳动": "n", |
|||
"QQ": "y" |
|||
}, |
|||
"快应用": { |
|||
"华为": "n", |
|||
"联盟": "n" |
|||
}, |
|||
"Vue": { |
|||
"vue2": "y", |
|||
"vue3": "y" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
|
|||
|
|||
## Table 表单 |
|||
> 组件名:``uni-table``,代码块: `uTable`。 |
|||
|
|||
用于展示多条结构类似的数据 |
|||
|
|||
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-table) |
|||
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,68 @@ |
|||
package com.supervise.rms.biz.wechat; |
|||
|
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.supervise.rms.api.wechat.TemplateData; |
|||
import org.junit.Test; |
|||
import org.junit.runner.RunWith; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.boot.test.context.SpringBootTest; |
|||
import org.springframework.http.ResponseEntity; |
|||
import org.springframework.test.context.junit4.SpringRunner; |
|||
import org.springframework.web.client.RestTemplate; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
//@RunWith(SpringRunner.class)
|
|||
//@SpringBootTest
|
|||
//@Test
|
|||
public class WechatRestTest { |
|||
|
|||
|
|||
private String appId="wx1d44e0fcd110351a"; //wx0f6062989ab28c91
|
|||
private String sppSecret="4764e32722a7d98656dea6afd9405701"; //#本地c4d7fc22a9bd39efd9dbeedcf94a9d88
|
|||
|
|||
private String WX_URL_MESSAGE_SEND="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN"; |
|||
|
|||
private String WX_URL_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; |
|||
|
|||
public String getAccessToken(String appId, String appsecret) { |
|||
String url = WX_URL_ACCESS_TOKEN.replace("APPID", appId).replace("APPSECRET", appsecret); |
|||
RestTemplate restTemplate = new RestTemplate(); |
|||
String re = restTemplate.getForObject(url, String.class); |
|||
JSONObject jsonObject = JSONObject.parseObject(re); |
|||
String at = jsonObject.getString("access_token"); |
|||
return at; |
|||
} |
|||
|
|||
@Test |
|||
public void sendMessage() { |
|||
|
|||
String accessToken = getAccessToken(appId,sppSecret); |
|||
String wxUrl = WX_URL_MESSAGE_SEND.replace("ACCESS_TOKEN", accessToken); |
|||
|
|||
Map<String, Object> sendBody = new HashMap<>(); |
|||
Map<String, Object> sendMag = new HashMap<>(); |
|||
sendMag.put("thing2", new TemplateData("测试")); |
|||
sendMag.put("thing5", new TemplateData("该公司暂无风险")); |
|||
sendMag.put("time6", new TemplateData("时间")); |
|||
Map<String, String> miniprogram = new HashMap<>(); |
|||
miniprogram.put("appid", "wx11565021714ba796"); |
|||
miniprogram.put("pagepath", "pages/index/enterpriseRisk?id=1111"); |
|||
//拼接base参数 ?businessName="+riskDate.getBusinessName()+"&executionTime="+riskDate.getExecutionTime()
|
|||
sendBody.put("miniprogram", miniprogram); |
|||
sendBody.put("touser", "otnrM5ySvUo7ZZc4qafWzM9eyKBk"); // openId
|
|||
// sendBody.put("url", ""); // 点击模板信息跳转地址
|
|||
sendBody.put("topcolor", "#FF0000"); // 顶色
|
|||
sendBody.put("data", sendMag); // 模板参数
|
|||
sendBody.put("template_id", "fVgBuwpLC43YkeGWfl1Vw0mW0Qu5WP2giD77TfKAEc4");// 模板Id
|
|||
|
|||
RestTemplate restTemplate = new RestTemplate(); |
|||
ResponseEntity<String> forEntity = restTemplate.postForEntity(wxUrl, sendBody, String.class); |
|||
JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody()); |
|||
String messageCode = jsonObject.getString("errcode"); |
|||
String msgId = jsonObject.getString("msgid"); |
|||
System.out.println("messageCode : " + messageCode + ", msgId: " + msgId); |
|||
} |
|||
} |
Loading…
Reference in new issue