2 files deleted
41 files added
18 files modified
| | |
| | | const config = { |
| | | baseUrl: "http://120.26.43.34:8081/api", //测试 |
| | | // baseUrl: "http://47.99.64.149:8081/api", //生产 |
| | | // baseUrl: "http://120.26.43.34:8081/api/", //测试 |
| | | baseUrl: "https://qx.7drlb.com/api", //生产 |
| | | // baseUrl: "http://192.168.0.9:8081/api", //生产 |
| | | }; |
| | | module.exports = config; |
| | |
| | | <script> |
| | | import Vue from 'vue' |
| | | import { |
| | | getUserInfor, |
| | | getDic |
| | | } from '@/utils/login.js' // 配置文件 |
| | | import store from '@/store/index.js' |
| | | import { |
| | | httpPost, |
| | | httpGet |
| | | } from '@/utils/http.js' |
| | | export default { |
| | | onLaunch: function() { |
| | | onLaunch() { |
| | | // 自动登录检测 |
| | | this.getUserInfo() |
| | | }, |
| | | methods: { |
| | | /** |
| | | * 自动登录 |
| | | * 判断本地是否有账号信息,如果有,就自动重新登录 |
| | | * |
| | | */ |
| | | getUserInfo() { |
| | | let token = uni.getStorageSync('token') |
| | | console.log('apptoken', token) |
| | | if (!token) { |
| | | uni.login({ |
| | | provider: 'weixin', |
| | | success(res) { |
| | | if (res.code) { |
| | | // 调用接口。将登录code传给后端进行判断 |
| | | httpGet('/AppUser/wx/login', { |
| | | 'code': res.code |
| | | }).then(result => { |
| | | success: loginRes => { |
| | | console.log('loginRes', loginRes) |
| | | httpGet('/AppUser/wx/login', { |
| | | 'code': loginRes.code |
| | | }).then(result => { |
| | | try { |
| | | if (result.data.code === 0) { |
| | | // 存在用户 |
| | | uni.clearStorageSync() |
| | | uni.setStorageSync('token', result.data.token) |
| | | // setTimeout(() => { |
| | | // uni.reLaunch({ |
| | | // url: '/pages/actionChange/agencyPage/index', |
| | | // }) |
| | | // }, 3000) |
| | | getUserInfor(result.data.token) |
| | | uni.setStorageSync('userInfor', JSON.stringify(result.data)) |
| | | uni.setStorageSync('tonken', result.data.token) |
| | | getDic() |
| | | this.$isResolve() |
| | | } else { |
| | | // 不存在用户 |
| | | uni.clearStorageSync() |
| | | uni.setStorageSync('openId', result.data.openId) |
| | | uni.showModal({ |
| | | title: '未登录', |
| | |
| | | } |
| | | }, |
| | | }) |
| | | this.$isResolve() |
| | | } |
| | | } catch (e) { |
| | | console.error(e) |
| | | } |
| | | }).catch(errors => { |
| | | console.log('appdddd', errors) |
| | | uni.showToast({ |
| | | title: errors, |
| | | icon: 'none', |
| | | }) |
| | | } else { |
| | | console.log(res.errMsg) |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | } else { |
| | | this.$isResolve() |
| | | } |
| | | }, |
| | | methods: { |
| | | /** |
| | | * 自动登录 |
| | | * 判断本地是否有账号信息,如果有,就自动重新登录 |
| | | * |
| | | */ |
| | | getWXCode() { |
| | | let that = this |
| | | uni.login({ |
| | | provider: 'weixin', |
| | | success(res) { |
| | | that.getLogin(res.code) |
| | | } |
| | | }) |
| | | }, |
| | | getLogin(data) { |
| | | // 调用接口。将登录code传给后端进行判断 |
| | | httpGet('/AppUser/wx/login', { |
| | | 'code': data |
| | | }).then(result => { |
| | | if (result.data.code === 0) { |
| | | // 存在用户 |
| | | uni.clearStorage() |
| | | store.commit('setUserInfor', result.data) |
| | | store.commit('setTonken', result.data.token) |
| | | getDic() |
| | | try { |
| | | this.$isResolve() |
| | | } catch (e) { |
| | | console.error(e) |
| | | } |
| | | // getUserInfor(result.data.token) |
| | | } else { |
| | | // 不存在用户 |
| | | // console.log('openId', result.data.openId) |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | } |
| | | </script> |
| | |
| | | |
| | | .formItemContent { |
| | | ::v-deep.u-form-item { |
| | | padding: 8px 0; |
| | | padding: 5px 0; |
| | | border-bottom: 1px dashed #bbb; |
| | | } |
| | | |
| | | ::v-deep.u-form-item__body__left__content__label { |
| | | font-size: 16px !important; |
| | | } |
| | | |
| | | ::v-deep.u-form-item__body, |
| | | /deep/.u-textarea { |
| | | padding: 0 !important; |
| | | } |
| | | } |
| | | |
| | | ::v-deep.u-form-item__body__left__content__label, |
| | | /deep/.u-radio__text { |
| | | font-size: 13px !important; |
| | | .tabarStyle { |
| | | /deep/.u-tabbar-item__text { |
| | | font-size: 18px !important; |
| | | } |
| | | |
| | | /deep/.u-tabbar__content__item-wrapper { |
| | | height: 60px !important; |
| | | } |
| | | |
| | | /deep/.u-icon__icon { |
| | | font-size: 25px !important; |
| | | } |
| | | } |
| | | |
| | | .dataRangeSerch { |
| | | |
| | | /deep/.range-separator, |
| | | /deep/.uni-date__x-input { |
| | | height: 30px !important; |
| | | line-height: 30px !important; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | import Vue from "vue"; |
| | | import App from "./App"; |
| | | import * as http from "./utils/http"; // http请求接口 |
| | | import * as login from "./utils/login"; // 登录 |
| | | import * as utils from "./utils/utils"; // 工具文件 |
| | | import Vue from 'vue' |
| | | import App from './App' |
| | | import * as http from './utils/http' // http请求接口 |
| | | import * as login from './utils/login' // 登录 |
| | | import * as utils from './utils/utils' // 工具文件 |
| | | // import * as common from './utils/common' // 公共文件 |
| | | import store from "./store"; |
| | | import storage from "./utils/storage"; // 缓存文件 |
| | | import ".env.js"; |
| | | import store from './store/index.js' |
| | | import storage from './utils/storage' // 缓存文件 |
| | | import '.env.js' |
| | | // 定义全局 |
| | | Vue.prototype.$store = store; |
| | | Vue.prototype.$storage = storage; |
| | | Vue.prototype.$http = http; |
| | | Vue.prototype.$login = login; |
| | | Vue.prototype.$utils = utils; |
| | | Vue.prototype.$store = store |
| | | Vue.prototype.$storage = storage |
| | | Vue.prototype.$http = http |
| | | Vue.prototype.$login = login |
| | | Vue.prototype.$utils = utils |
| | | // Vue.prototype.$common = common |
| | | |
| | | App.mpType = "app"; |
| | | App.mpType = 'app' |
| | | const app = new Vue({ |
| | | store, |
| | | ...App, |
| | | }); |
| | | app.$mount(); |
| | | import uView from "@/uni_modules/uview-ui"; |
| | | Vue.use(uView); |
| | | store, |
| | | ...App, |
| | | }) |
| | | Vue.prototype.$onLaunched = new Promise(resolve => { |
| | | Vue.prototype.$isResolve = resolve |
| | | }) |
| | | app.$mount() |
| | | import uView from '@/uni_modules/uview-ui' |
| | | Vue.use(uView) |
| | |
| | | { |
| | | "pages": [ |
| | | //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages |
| | | |
| | | { |
| | | "path": "pages/actionChange/agencyPage/index", |
| | | "style": { |
| | | "navigationBarTitleText": "首页", |
| | | "enablePullDownRefresh": false |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/login/login" |
| | | }, |
| | | { |
| | | "path": "pages/login/register/register", |
| | | "style": { |
| | | "navigationBarTitleText": "注册", |
| | | "enablePullDownRefresh": false |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/actionChange/newPage/index", //立行立改新建交办单 |
| | | "style": { |
| | | "navigationBarTitleText": "新建交办单", |
| | | "enablePullDownRefresh": false, |
| | | "navigationBarHidden":true |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/actionChange/workOrderDetails/index", //立行立改交办单详情 |
| | | "style": { |
| | | "navigationBarTitleText": "交办单信息", |
| | | "enablePullDownRefresh": false |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/actionChange/myInfor/index", |
| | | "style": { |
| | | "navigationBarTitleText": "我的", |
| | | "enablePullDownRefresh": false |
| | | } |
| | | } |
| | | ], |
| | | "tabBar": { |
| | | "color": "#515151", |
| | | "selectedColor": "#3875C5", |
| | | "list": [ |
| | | "pages": [ |
| | | //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages |
| | | { |
| | | "text": "首页", |
| | | "pagePath": "pages/actionChange/agencyPage/index", |
| | | "iconPath": "static/img/shouye.png", |
| | | "selectedIconPath": "static/img/shouyeClick.png" |
| | | }, |
| | | { |
| | | "text": "新建交办单", |
| | | "pagePath": "pages/actionChange/newPage/index", |
| | | "iconPath": "static/img/xinjian.png", |
| | | "selectedIconPath": "static/img/xinjianClick.png" |
| | | }, |
| | | |
| | | { |
| | | "text": "我的", |
| | | "iconPath": "static/img/wode-.png", |
| | | "selectedIconPath": "static/img/wodeClick.png", |
| | | "pagePath": "pages/actionChange/myInfor/index" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | "path": "pages/index/index", |
| | | "style": { |
| | | "navigationBarTitleText": "首页", |
| | | "enablePullDownRefresh": false, |
| | | "disableSwipeBack": true, |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, { |
| | | "path": "pages/actionChange/agencyPage/index", |
| | | "style": { |
| | | "navigationBarTitleText": "首页", |
| | | "navigationStyle": "custom", |
| | | "enablePullDownRefresh": false |
| | | } |
| | | }, { |
| | | "path": "pages/login/login" |
| | | }, { |
| | | "path": "pages/login/register/register", |
| | | "style": { |
| | | "navigationBarTitleText": "注册", |
| | | "enablePullDownRefresh": false |
| | | } |
| | | }, { |
| | | "path": "pages/actionChange/newPage/index", //立行立改新建交办单 |
| | | "style": { |
| | | "navigationBarTitleText": "新建交办单", |
| | | "enablePullDownRefresh": false |
| | | } |
| | | }, { |
| | | "path": "pages/actionChange/workOrderDetails/index", //立行立改交办单详情 |
| | | "style": { |
| | | "navigationBarTitleText": "交办单信息", |
| | | "enablePullDownRefresh": false |
| | | } |
| | | }, { |
| | | "path": "pages/actionChange/myInfor/index", |
| | | "style": { |
| | | "navigationBarTitleText": "我的", |
| | | "enablePullDownRefresh": false, |
| | | "disableSwipeBack": true, |
| | | "navigationStyle": "custom" |
| | | } |
| | | } |
| | | ] |
| | | // "tabBar": { |
| | | // "color": "#515151", |
| | | // "height": "60px", |
| | | // "fontSize": "60px", |
| | | // "selectedFontSize": 20, |
| | | // "selectedColor": "#3875C5", |
| | | // "list": [{ |
| | | // "text": "首页", |
| | | // "pagePath": "pages/actionChange/agencyPage/index", |
| | | // "iconPath": "static/img/shouye.png", |
| | | // "selectedIconPath": "static/img/shouyeClick.png", |
| | | // "textStyle": { |
| | | // "fontSize": "60px" |
| | | // } |
| | | // }, { |
| | | // "text": "新建交办单", |
| | | // "pagePath": "pages/actionChange/newPage/index", |
| | | // "iconPath": "static/img/xinjian.png", |
| | | // "selectedIconPath": "static/img/xinjianClick.png", |
| | | // "textStyle": { |
| | | // "fontSize": "20px" |
| | | // } |
| | | // }, { |
| | | // "text": "我的", |
| | | // "iconPath": "static/img/wode-.png", |
| | | // "selectedIconPath": "static/img/wodeClick.png", |
| | | // "pagePath": "pages/actionChange/myInfor/index", |
| | | // "textStyle": { |
| | | // "fontSize": "20px" |
| | | // } |
| | | // }] |
| | | // } |
| | | } |
| | |
| | | <view class="hearderInfor"> |
| | | <view> |
| | | <p class="unit"> |
| | | <text>责任单位:{{ userInfor.userName ||''}}</text> |
| | | <text>责任单位:{{ unitName }}</text> |
| | | </p> |
| | | </view> |
| | | <view class="headSculpture"> |
| | | <image alt="" src="/static/img/headSculpture.png" /> |
| | | <text>欢迎您:{{ userInfor.userName || ''}}</text> |
| | | <button open-type="chooseAvatar" @chooseavatar='onChooseAvatar' |
| | | style="padding: 0;margin: 0;border-radius: 100px;"> |
| | | <u-avatar :src="avatarUrl" randomBgColor size='60'></u-avatar> |
| | | </button> |
| | | <text style="margin-left: 46.15rpx;">欢迎您:{{ userName || ''}}</text> |
| | | </view> |
| | | </view> |
| | | <view> |
| | | <u-tabs :list="list" :scrollable="scrollable" @change="changeTap" /> |
| | | <u-tabs :list="list" :scrollable="scrollable" lineWidth="60" @change="changeTap" /> |
| | | </view> |
| | | <view class="" v-if="userInfor.userName"> |
| | | <view class="" v-if="userName"> |
| | | <view class="dataRangeSerch" v-if="current===3"> |
| | | <view class="dataRangeSerchLabel"> |
| | | <text style="margin-right: 8px;">日期:</text> |
| | | <uni-datetime-picker v-model="range" type="daterange" rangeSeparator="至" /> |
| | | </view> |
| | | <view> |
| | | <u-button type="primary" size="small" text="查询" @click="getWorkOrder"></u-button> |
| | | </view> |
| | | </view> |
| | | <view :key="index" v-for="(item, index) in workOderList" class="workOrderDetail" |
| | | @tap="handleClick(item, 'edit')"> |
| | | <view class="mainContent"> |
| | | <p class="rowTip" style="justify-content: space-between"> |
| | | <text class=""> 交办单号: {{ item.allocationNum }} |
| | | <text class=" titleLable"> 交办单号: {{ item.allocationNum }} |
| | | </text> |
| | | <text class="rowTipContenet_right"> |
| | | <text catchtap class="butsName" @tap.stop="handleClick(item, 'view')"> 查看 </text> |
| | |
| | | <view class="rowTipContenet"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">流程状态:</text> |
| | | <text class="rowTipContenetAll"> |
| | | {{ stateFormatter(item.state) }} |
| | | </text> |
| | | <u--text type="warning" :text="item.state |stateFormatter" size='30.77rpx' |
| | | v-if="item.state===20 ||item.state===9"></u--text> |
| | | <u--text type="primary" :text="item.state |stateFormatter" size='30.77rpx' |
| | | v-if="item.state===30"></u--text> |
| | | <u--text type="success" :text="item.state |stateFormatter" size='30.77rpx' |
| | | v-if="item.state===40"></u--text> |
| | | <u--text type="error" :text="item.state |stateFormatter" size='30.77rpx' |
| | | v-if="item.state===50"></u--text> |
| | | </view> |
| | | </view> |
| | | </p> |
| | |
| | | </view> |
| | | </p> |
| | | </view> |
| | | <view class="yingzhang" v-if="item.isInvalid===1"> |
| | | <view class="seal-red"> 已作废 </view> |
| | | </view> |
| | | </view> |
| | | <u-loadmore :status="status" :loading-text="loadingText" @loadmore='getLoadmore' |
| | | :loadmore-text="loadmoreText" dashed line :nomore-text="nomoreText" /> |
| | | </view> |
| | | </view> |
| | | </template> |
| | |
| | | httpPost, |
| | | httpGet |
| | | } from '@/utils/http.js' |
| | | import store from '@/store/index.js' |
| | | export default { |
| | | data() { |
| | | return { |
| | | range: [], |
| | | scrollable: false, |
| | | userInfor: {}, |
| | | userInfor: null, |
| | | dictObj: [], |
| | | list: [{ |
| | | name: '全部', |
| | |
| | | name: '已完成', |
| | | value: 3, |
| | | }, ], |
| | | showeEscalationTime: false, |
| | | current: 0, |
| | | startTime: '', |
| | | endTime: '', |
| | | workOderList: [], |
| | | unitList: [], |
| | | polluteList: [], |
| | | avatarUrl: '', |
| | | baseUrl: '', |
| | | token: '', |
| | | status: 'loadmore', |
| | | loadingText: '努力加载中', |
| | | loadmoreText: '加载更多', |
| | | nomoreText: '实在没有了', |
| | | isLoading: false, |
| | | page: { |
| | | currentPage: 1, |
| | | pageSize: 10 |
| | | } |
| | | } |
| | | }, |
| | | mounted() { |
| | | console.log('mounted this.userInfo', this.userInfo) |
| | | watch: { |
| | | range(newval) { |
| | | console.log('newval', newval) |
| | | this.startTime = newval[0] |
| | | this.endTime = newval[1] |
| | | }, |
| | | }, |
| | | created() { |
| | | console.log('created this.userInfo', this.userInfo) |
| | | this.getContaminateList() |
| | | this.getUnitList() |
| | | this.getWorkOrder() |
| | | computed: { |
| | | unitName() { |
| | | let data = '' |
| | | if (this.userInfor && this.unitList.length > 0) { |
| | | data = this.unitList && this.unitList.find(a => Number(a.unitId) === Number(this.userInfor.unitId)) |
| | | } |
| | | if (this.userInfor) { |
| | | data = this.userInfor.unName |
| | | } |
| | | return data |
| | | }, |
| | | userName() { |
| | | let data = '' |
| | | if (this.userInfor) { |
| | | data = this.userInfor.userName |
| | | } |
| | | return data |
| | | } |
| | | }, |
| | | onShow() { |
| | | uni.showTabBar() |
| | | onReachBottom() { |
| | | //这里是判断是否需要继续掉接口 |
| | | if (this.isLoading) { |
| | | this.status = 'loading' |
| | | //请求一次接口,页码就++ |
| | | this.page.currentPage = ++this.page.currentPage |
| | | //根据索引,点击哪个tab加载哪个 |
| | | this.getWorkOrder() |
| | | } |
| | | }, |
| | | mounted() {}, |
| | | filters: { |
| | | stateFormatter(val) { |
| | | let information = JSON.parse(uni.getStorageSync('dictObj') || '[]') |
| | | return information.allocationApproveEnum[val] |
| | | } |
| | | }, |
| | | onLoad: () => {}, |
| | | methods: { |
| | | getLoadmore() { |
| | | if (this.isLoading) { |
| | | this.status = 'loading' |
| | | //请求一次接口,页码就++ |
| | | this.page.currentPage = ++this.page.currentPage |
| | | //根据索引,点击哪个tab加载哪个 |
| | | this.getWorkOrder() |
| | | } |
| | | }, |
| | | async onChooseAvatar(e) { |
| | | const { |
| | | avatarUrl |
| | | } = e.detail // 此返回的路径为临时路径,需转换为永久路径保存使用 |
| | | this.avatarUrl = avatarUrl |
| | | uni.showToast({ |
| | | title: '成功', |
| | | duration: 1000 |
| | | }) |
| | | let a = uni.uploadFile({ |
| | | url: this.baseUrl + '/file/upload', |
| | | filePath: this.avatarUrl, |
| | | header: { |
| | | token: this.token, |
| | | Authorization: this.token, |
| | | }, |
| | | name: 'file', |
| | | formData: { |
| | | sysCode: '1202401' |
| | | }, |
| | | success: res => { |
| | | let resData = JSON.parse(res.data) |
| | | let parms = { |
| | | 'file': resData.data, |
| | | 'userId': this.userInfor.userId |
| | | } |
| | | this.$http.httpPost('/allocationApp/appFile', parms).then(res => { |
| | | uni.removeStorageSync('userInfor') |
| | | this.userInfor.file = resData.data |
| | | console.log('resData.data', resData.data) |
| | | uni.setStorageSync('userInfor', JSON.stringify(this.userInfor)) |
| | | console.log('this.userInforSet', this.userInfor) |
| | | }) |
| | | console.log(this.url) |
| | | }, |
| | | fail: res => { |
| | | uni.showToast({ |
| | | title: res.data, |
| | | icon: 'none', |
| | | }) |
| | | } |
| | | }) |
| | | }, |
| | | changeTap(data) { |
| | | console.log(data) |
| | | this.current = data.value |
| | | this.page = { |
| | | currentPage: 1, |
| | | pageSize: 10 |
| | | } |
| | | this.startTime = '' |
| | | this.endTime = '' |
| | | this.getWorkOrder() |
| | | }, |
| | | // 获取责任单位list |
| | | getUnitList() { |
| | | this.$http.httpGet('/allocation/unit').then(res => { |
| | | this.unitList = res.data |
| | | this.userInfor = this.$storage.getJson('userInfo') |
| | | this.dictObj = this.$storage.getJson('dictObj') |
| | | this.$storage.setJson('unitList', this.unitList) |
| | | }) |
| | | }, |
| | | getContaminateList() { |
| | | console.log('indexindex') |
| | | this.$http.httpGet('/allocation/contaminate').then(res => { |
| | | this.polluteList = res.data |
| | | this.$storage.setJson('polluteList', this.polluteList) |
| | | this.dictObj = JSON.parse(uni.getStorageSync('dictObj') || '[]') |
| | | this.userInfor = JSON.parse(uni.getStorageSync('userInfor') || '{}') |
| | | this.baseUrl = this.$storage.get('baseUrl') |
| | | this.token = uni.getStorageSync('tonken') |
| | | this.avatarUrl = `${this.baseUrl}/file/preview/${this.userInfor.file.fileId}` |
| | | console.log('indexindexindexindexthis.userInfor', this.userInfor) |
| | | this.getUnitList() |
| | | this.getWorkOrder() |
| | | }).catch(res => { |
| | | console.log('错了么', res) |
| | | // this.getContaminateList() |
| | | }) |
| | | }, |
| | | stateFormatter(val) { |
| | | return this.dictObj.allocationApproveEnum[val] |
| | | }, |
| | | getWorkOrder() { |
| | | httpGet('/allocationApp/select', { |
| | | httpPost('/allocationApp/page', { |
| | | state: this.current, |
| | | startTime: '', |
| | | endTime: '', |
| | | startTime: this.startTime, |
| | | endTime: this.endTime, |
| | | page: { |
| | | 'currentPage': this.page.currentPage, |
| | | 'pageSize': this.page.pageSize |
| | | }, |
| | | }).then(res => { |
| | | this.workOderList = res.data |
| | | console.log('indexindex', res.data.list) |
| | | if (res.data.list) { |
| | | if (res.data.list.length < this.page.pageSize) { |
| | | //这里设置成false就不可以继续加载,不可以进入请求接口的方法里了 |
| | | this.isLoading = false |
| | | this.status = 'nomore' |
| | | } else { |
| | | this.isLoading = true |
| | | this.status = 'loadmore' |
| | | } |
| | | if (this.page.currentPage === res.data.page.currentPage) { |
| | | this.workOderList = res.data.list |
| | | } else { |
| | | res.data.list.forEach(el => { |
| | | this.workOderList.push(el) |
| | | }) |
| | | } |
| | | } else { |
| | | this.status = 'nomore' |
| | | } |
| | | }) |
| | | }, |
| | | handleClick(e, pageState) { |
| | |
| | | id: e.allocationId |
| | | }).then(res => { |
| | | let data = res.data |
| | | data.pageState = pageState |
| | | data.pageState = data.state === 50 || data.state === 40 ? 'view' : pageState |
| | | let myData = JSON.stringify(data) |
| | | uni.navigateTo({ |
| | | url: '/pages/actionChange/workOrderDetails/index?infor=' + myData, |
| | |
| | | } |
| | | |
| | | .hearderInfor { |
| | | font-size: 26.92rpx; |
| | | height: 223.08rpx; |
| | | font-size: 28.85rpx; |
| | | background-color: #3875c5; |
| | | padding-bottom: 8px; |
| | | color: #f2f2f2; |
| | | |
| | | .unit { |
| | |
| | | .headSculpture { |
| | | display: flex; |
| | | align-items: center; |
| | | padding-left: 20px; |
| | | |
| | | image { |
| | | .imageSrc { |
| | | height: 117.31rpx; |
| | | width: 117.31rpx; |
| | | margin: 0rpx 46.15rpx; |
| | |
| | | .textContent { |
| | | text-align: left; |
| | | width: 100%; |
| | | font-size: 28.85rpx; |
| | | font-size: 30.77rpx; |
| | | } |
| | | |
| | | .workOrderDetail { |
| | | border: 1px solid #bbb; |
| | | border-radius: 5px; |
| | | min-height: 288.46rpx; |
| | | margin: 19.23rpx; |
| | | padding: 19.23rpx; |
| | | margin: 9.62rpx; |
| | | padding: 9.62rpx 19.23rpx; |
| | | color: #101010; |
| | | font-weight: 700; |
| | | font-size: 26.92rpx; |
| | | font-size: 30.77rpx; |
| | | |
| | | /deep/.u-line { |
| | | margin: 19.23rpx 0px !important; |
| | | margin: 9.62rpx 0px !important; |
| | | } |
| | | |
| | | .mainContent { |
| | | margin-bottom: 10px; |
| | | margin-bottom: 5px; |
| | | |
| | | .rowTip { |
| | | display: flex; |
| | |
| | | color: #1990ff; |
| | | } |
| | | |
| | | .titleLable { |
| | | font-size: 30.77rpx; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .rowTipContenet_right { |
| | | text-align: right !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /deep/.u-tabs__wrapper__nav__item__text { |
| | | font-size: 34.62rpx !important; |
| | | } |
| | | |
| | | .yingzhang { |
| | | position: relative; |
| | | |
| | | .seal-red { |
| | | position: absolute; |
| | | right: 0; |
| | | top: -85px; |
| | | display: inline-block; |
| | | border: solid 2px #e93e00; |
| | | border-radius: .2em; |
| | | color: #e24c06; |
| | | font-size: 19px; |
| | | line-height: 1; |
| | | opacity: 0; |
| | | padding: .1em .5em; |
| | | text-transform: uppercase; |
| | | opacity: 0; |
| | | transform: rotate(-2deg) scale(5); |
| | | animation: seal .3s cubic-bezier(0.6, 0.04, 0.98, 0.335) forwards; |
| | | } |
| | | |
| | | @keyframes seal { |
| | | 100% { |
| | | opacity: .75; |
| | | transform: rotate(-15deg) scale(1); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .dataRangeSerch { |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | padding: 10px 0 5px 0px; |
| | | |
| | | .dataRangeSerchLabel { |
| | | display: flex; |
| | | align-items: center; |
| | | width: 75%; |
| | | } |
| | | |
| | | /deep/.range-separator, |
| | | /deep/.uni-date__x-inpu { |
| | | height: 30px !important; |
| | | line-height: 30px !important; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <u-line color="#bbb" /> |
| | | <view> |
| | | <view class="mainContent"> |
| | | |
| | | <u--form labelPosition="left" label-width="70" :model="form" :border-bottom="false" :rules="rules" |
| | | <u--form labelPosition="left" label-width="80" :model="form" :border-bottom="false" :rules="rules" |
| | | ref="uForm"> |
| | | <view class="formItemContent"> |
| | | <u-form-item border-bottom label="考核打分:" prop="checkScore" required :border-bottom="false"> |
| | | <view class="" v-if="basicInfor.pageState==='view'"> |
| | | <u-form-item border-bottom label="考核打分:" prop="checkScore" |
| | | :required="basicInfor.pageState==='edit'" :border-bottom="false"> |
| | | <view class="fonttest" v-if="basicInfor.pageState==='view'"> |
| | | {{ basicInfor.checkScore ||''}} |
| | | </view> |
| | | <u-input v-else v-model="form.checkScore" border="none" placeholder="请输入" type="text" /> |
| | | <u-input v-else v-model="form.checkScore" border="none" placeholder="请输入" |
| | | type="number" /> |
| | | </u-form-item> |
| | | </view> |
| | | <view class="formItemContent"> |
| | | <u-form-item border-bottom label="理由:" prop="checkDescribe" required :border-bottom="false"> |
| | | <view class="" v-if="basicInfor.pageState==='view'"> |
| | | <u-form-item border-bottom label="理由:" prop="checkDescribe" |
| | | :required="basicInfor.pageState==='edit'" :border-bottom="false"> |
| | | <view class="fonttest" v-if="basicInfor.pageState==='view'"> |
| | | {{ basicInfor.checkDescribe ||''}} |
| | | </view> |
| | | <u--textarea v-else v-model="form.checkDescribe" border="none" placeholder="请输入内容" /> |
| | | </u-form-item> |
| | | </view> |
| | | <view class="formItemContent"> |
| | | <u-form-item border-bottom label="相关附件" :border-bottom="false"> |
| | | <u-form-item border-bottom label="相关附件:" :border-bottom="false"> |
| | | <view class="fileBox" v-if="basicInfor.pageState==='view'"> |
| | | <cl-upload v-model="fileList" :add="false" :action="`''`" cloud-type="other" |
| | | :remove="false" /> |
| | | </view> |
| | | <view class="fileBox" v-else> |
| | | <fileUpload class="rowTipContenetAll" :sys-code="sysCode" @handleFile="handleFile" /> |
| | | <fileUpload class="rowTipContenetAll" :sys-code="sysCode" |
| | | @handleFile="handleFile" /> |
| | | </view> |
| | | </u-form-item> |
| | | </view> |
| | |
| | | checkScore: 0, |
| | | checkDescribe: '', |
| | | }, |
| | | dictObj: this.$storage.getJson('dictObj'), |
| | | dictObj: JSON.parse(uni.getStorageSync('dictObj') || '[]'), |
| | | fileList: [], |
| | | fileBaseList: [], |
| | | baseUrl: this.$storage.get('baseUrl'), |
| | |
| | | console.log('this.fileList', this.basicInfor.fileBaseList) |
| | | console.log('this.fileList', this.fileList) |
| | | } |
| | | |
| | | }, |
| | | methods: { |
| | | handleFile(data) { |
| | |
| | | }, |
| | | formVali() { |
| | | return new Promise((resolve, reject) => { |
| | | if(this.basicInfor.pageState!=='view'){ |
| | | if (this.basicInfor.pageState !== 'view') { |
| | | this.$refs.uForm.validate().then(res => { |
| | | resolve(true) |
| | | }) |
| | | .catch(errors => { |
| | | reject(false) |
| | | uni.$u.toast('校验失败') |
| | | }) |
| | | } else{ |
| | | resolve(true) |
| | | }).catch(errors => { |
| | | reject(false) |
| | | uni.$u.toast('校验失败') |
| | | }) |
| | | } else { |
| | | resolve(true) |
| | | } |
| | | |
| | | }); |
| | | |
| | | }) |
| | | } |
| | | |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | /deep/.u-line { |
| | | margin: 19.23rpx 0px !important; |
| | |
| | | .workOrderDetail { |
| | | border: 1px solid #bbb; |
| | | border-radius: 5px; |
| | | min-height: 288.46rpx; |
| | | margin: 19.23rpx; |
| | | padding: 19.23rpx; |
| | | color: #101010; |
| | | font-weight: 700; |
| | | font-size: 26.92rpx; |
| | | font-size: 30.77rpx; |
| | | |
| | | .headerCont { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | font-size: 15px; |
| | | font-size: 30.77rpx; |
| | | } |
| | | |
| | | .mainContent { |
| | |
| | | font-weight: 500; |
| | | |
| | | .rowTip { |
| | | // display: flex; |
| | | padding: 8px 0; |
| | | display: flex; |
| | | padding: 5px 0; |
| | | border-bottom: 1px dashed #bbb; |
| | | |
| | | .wholeLine { |
| | | display: flex; |
| | | width: 100%; |
| | | align-items: center; |
| | | |
| | | .rowTipContenetLabel { |
| | | min-width: 125rpx; |
| | | min-width: 144.23rpx; |
| | | font-size: 28.85rpx; |
| | | text-align: left; |
| | | } |
| | | } |
| | | |
| | | .rowTipContenetAll { |
| | | width: calc(100% - 125rpx; ); |
| | | .rowTipContenetAll { |
| | | font-size: 28.85rpx; |
| | | width: calc(100% - 144.23rpx); |
| | | } |
| | | } |
| | | |
| | | .rowTipContenet { |
| | |
| | | text-align: right !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /deep/.u-form-item { |
| | | padding: 8px 0; |
| | | border-bottom: 1px dashed #bbb; |
| | | } |
| | | |
| | | /deep/.u-form-item__body, |
| | | /deep/.u-textarea { |
| | | padding: 0 !important; |
| | | } |
| | | |
| | | /deep/.u-form-item__body__left__content__label, |
| | | /deep/.u-radio__text { |
| | | font-size: 13px !important; |
| | | } |
| | | |
| | | .fileBox { |
| | | display: -webkit-box; |
| | | display: -webkit-flex; |
| | | display: flex; |
| | | position: relative; |
| | | width: 100%; |
| | | height: 100%; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-box-direction: normal; |
| | | -webkit-flex-direction: column; |
| | | flex-direction: column; |
| | | -webkit-box-pack: center; |
| | | -webkit-justify-content: center; |
| | | justify-content: center; |
| | | } |
| | | </style> |
| | |
| | | <p class="rowTip"> |
| | | <view class="rowTipContenet"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">上报时间:</text> |
| | | <text class="rowTipContenetAll"> |
| | | {{ basicInfor.escalationTime ||'' }} |
| | | </text> |
| | | </view> |
| | | </view> |
| | | <view class="rowTipContenet"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">上报人:</text> |
| | | <text class="rowTipContenetAll">{{ basicInfor.escalationName ||'' }}</text> |
| | | </view> |
| | | </view> |
| | | </p> |
| | | <p class="rowTip"> |
| | | <view class="rowTipContenet"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">责任主体:</text> |
| | | <text class="rowTipContenetAll"> |
| | | {{ unitName }} |
| | |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">整改类型:</text> |
| | | <text class="rowTipContenetAll"> |
| | | {{ dictObj.changeEnum[basicInfor.changeType] ||'' }} |
| | | <text>{{ dictObj.changeEnum[basicInfor.changeType]||'' }}</text> |
| | | <!-- <text>{{ basicInfor.residueDay||'' }}</text> --> |
| | | </text> |
| | | </view> |
| | | </view> |
| | |
| | | </text> |
| | | </view> |
| | | </view> |
| | | <view class="rowTipContenet"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">上报人:</text> |
| | | <text class="rowTipContenetAll">{{ basicInfor.escalationName ||'' }}</text> |
| | | </view> |
| | | </view> |
| | | </p> |
| | | <p class="rowTip"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">上报时间:</text> |
| | | <text class="rowTipContenetAll">{{ basicInfor.escalationTime ||'' }}</text> |
| | | </view> |
| | | </p> |
| | | <p class="rowTip"> |
| | | <view class="wholeLine"> |
| | |
| | | <text class="rowTipContenetAll">{{ basicInfor.pollutePosition ||'' }}</text> |
| | | </view> |
| | | </p> |
| | | <p class="rowTip"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">相关附件:</text> |
| | | <text v-if="fileList.length>0" class="rowTipContenetAll"> |
| | | <cl-upload |
| | | v-model="fileList" |
| | | :action="`''`" |
| | | :add="false" |
| | | cloud-type="other" |
| | | :remove="false" |
| | | /> |
| | | </text> |
| | | </view> |
| | | </p> |
| | | <view class="formItemContent"> |
| | | <u--form labelPosition="left" label-width="75" :border-bottom="false" ref="uForm"> |
| | | <u-form-item border-bottom label="相关附件:" :border-bottom="false"> |
| | | <view class="fileBox"> |
| | | <cl-upload v-model="fileList" :add="false" :action="`''`" cloud-type="other" |
| | | :remove="false" /> |
| | | </view> |
| | | </u-form-item> |
| | | </u--form> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | props: { |
| | | basicInfor: { |
| | | type: Object, |
| | | default: ()=> {} |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | polluteList: this.$storage.getJson('polluteList'), |
| | | unitList: this.$storage.getJson('unitList'), |
| | | dictObj: this.$storage.getJson('dictObj'), |
| | | fileList: [], |
| | | baseUrl: this.$storage.get('baseUrl'), |
| | | } |
| | | }, |
| | | computed: { |
| | | unitName(){ |
| | | let data ={} |
| | | if(this.basicInfor.unitId){ |
| | | data=this.unitList&& this.unitList.find( |
| | | (a)=> parseInt(a.unitId) === this.basicInfor.unitId |
| | | ) |
| | | console.log('nnnnnn', this.unitList) |
| | | console.log('nnnnnn', this.basicInfor.unitId) |
| | | |
| | | } |
| | | return data.unitName || '' |
| | | }, |
| | | escalationUnitName(){ |
| | | let data ={} |
| | | if(this.basicInfor.unitId){ |
| | | data=this.unitList&& this.unitList.find( |
| | | (a)=> parseInt(a.unitId) === this.basicInfor.escalationUnitId |
| | | ) |
| | | console.log('nnnnnn', this.unitList) |
| | | console.log('nnnnnn', this.basicInfor.unitId) |
| | | |
| | | } |
| | | return data.unitName || '' |
| | | |
| | | }, |
| | | polluteType(){ |
| | | let data ={} |
| | | if(this.basicInfor.polluteType){ |
| | | data=this.polluteList.find( |
| | | (a)=> parseInt(a.dataKey) === this.basicInfor.polluteType |
| | | ) |
| | | } |
| | | return data.dataValue ||'' |
| | | } |
| | | }, |
| | | watch: { |
| | | basicInfor: { |
| | | handler: function(newValue, oldValue) { |
| | | // 响应数据变化 |
| | | this.basicInfor=newValue |
| | | export default { |
| | | props: { |
| | | basicInfor: { |
| | | type: Object, |
| | | default: () => {} |
| | | }, |
| | | deep: true |
| | | } |
| | | }, |
| | | onLoad: function (option) { |
| | | //option为object类型,会序列化上个页面传递的参数 |
| | | console.log(option) //打印出上个页面传递的参数。 |
| | | }, |
| | | mounted() { |
| | | if(this.basicInfor.fileBaseList&&this.basicInfor.fileBaseList.length>0){ |
| | | this.basicInfor.fileBaseList.forEach(item=> { |
| | | this.baseUrl='http://120.26.43.34:8081/api/' |
| | | let name = item.fileType === 1 ? 'name.png' : '' |
| | | this.fileList.push(`${this.baseUrl}/file/preview/${item.fileId}?${name}`) // 原图 |
| | | this.fileList.push('http://120.26.43.34:8081/api//file/preview/145?name.png') // 原图 |
| | | }) |
| | | console.log('this.fileList', this.basicInfor.fileBaseList) |
| | | console.log('this.fileList', this.fileList) |
| | | } |
| | | |
| | | }, |
| | | methods: {}, |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | polluteList: [], |
| | | unitList: [], |
| | | dictObj: JSON.parse(uni.getStorageSync('dictObj') || '[]'), |
| | | fileList: [], |
| | | baseUrl: this.$storage.get('baseUrl'), |
| | | } |
| | | }, |
| | | computed: { |
| | | unitName() { |
| | | let data = '' |
| | | if (this.basicInfor.unitId && this.unitList.length > 0) { |
| | | data = this.unitList && this.unitList.find(a => Number(a.unitId) === Number(this.basicInfor.unitId)) |
| | | .unitName |
| | | } |
| | | return data |
| | | }, |
| | | escalationUnitName() { |
| | | let data = '' |
| | | if (this.basicInfor.unitId && this.unitList.length > 0) { |
| | | data = this.unitList && this.unitList.find(a => Number(a.unitId) === Number(this.basicInfor |
| | | .escalationUnitId)).unitName |
| | | } |
| | | return data |
| | | }, |
| | | polluteType() { |
| | | let data = '' |
| | | console.log('this.polluteList', this.polluteList) |
| | | console.log('this.basicInfor.polluteType', this.basicInfor.polluteType) |
| | | if (String(this.basicInfor.polluteType) && this.polluteList.length > 0) { |
| | | data = this.polluteList.find(a => Number(a.dataKey) === Number(this.basicInfor.polluteType)).dataValue |
| | | } |
| | | console.log('data', data) |
| | | return data |
| | | } |
| | | }, |
| | | watch: { |
| | | basicInfor: { |
| | | handler: function(newValue, oldValue) { |
| | | // 响应数据变化 |
| | | this.basicInfor = newValue |
| | | }, |
| | | deep: true |
| | | } |
| | | }, |
| | | onLoad: function(option) { |
| | | //option为object类型,会序列化上个页面传递的参数 |
| | | console.log(option) //打印出上个页面传递的参数。 |
| | | }, |
| | | created() { |
| | | this.getUnitList() |
| | | }, |
| | | mounted() { |
| | | // 获取责任单位list |
| | | if (this.basicInfor.fileBaseList && this.basicInfor.fileBaseList.length > 0) { |
| | | this.basicInfor.fileBaseList.forEach(item => { |
| | | let name = item.fileType === 1 ? 'name.png' : '' |
| | | this.fileList.push(`${this.baseUrl}/file/preview/${item.fileId}?${name}`) // 原图 |
| | | }) |
| | | console.log('this.basicInfor.fileList', this.basicInfor.fileBaseList) |
| | | console.log('this.fileList', this.fileList) |
| | | } |
| | | }, |
| | | methods: { |
| | | getUnitList() { |
| | | this.$http.httpGet('/allocation/unit').then(res => { |
| | | this.unitList = res.data |
| | | this.getContaminateList() |
| | | }) |
| | | }, |
| | | getContaminateList() { |
| | | this.$http.httpGet('/allocation/contaminate').then(res => { |
| | | this.polluteList = res.data |
| | | }) |
| | | }, |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | /deep/.u-line { |
| | | margin: 19.23rpx 0px !important; |
| | | } |
| | | .workOrderDetail { |
| | | border: 1px solid #bbb; |
| | | border-radius: 5px; |
| | | min-height: 288.46rpx; |
| | | margin: 19.23rpx; |
| | | padding: 19.23rpx; |
| | | color: #101010; |
| | | font-weight: 700; |
| | | font-size: 26.92rpx; |
| | | .headerCont { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | font-size: 15px; |
| | | } |
| | | .mainContent { |
| | | margin-bottom: 10px; |
| | | font-weight: 500; |
| | | .rowTip { |
| | | display: flex; |
| | | padding: 8px 0; |
| | | border-bottom: 1px dashed #bbb; |
| | | .wholeLine { |
| | | display: flex; |
| | | width: 100%; |
| | | align-items: center; |
| | | .rowTipContenetLabel { |
| | | min-width: 125rpx; |
| | | } |
| | | .rowTipContenetAll{ |
| | | width: calc(100% - 125rpx); |
| | | } |
| | | } |
| | | /deep/.u-line { |
| | | margin: 19.23rpx 0px !important; |
| | | } |
| | | |
| | | .rowTipContenet { |
| | | width: 50%; |
| | | text-align: left; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | .butsName { |
| | | display: inline-block; |
| | | margin-left: 19.23rpx; |
| | | color: #1990ff; |
| | | } |
| | | } |
| | | } |
| | | .rowTipContenet_right { |
| | | text-align: right !important; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | | .workOrderDetail { |
| | | border: 1px solid #bbb; |
| | | border-radius: 5px; |
| | | min-height: 288.46rpx; |
| | | margin: 19.23rpx; |
| | | padding: 19.23rpx; |
| | | color: #101010; |
| | | font-weight: 700; |
| | | font-size: 30.77rpx; |
| | | |
| | | .headerCont { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | font-size: 30.77rpx; |
| | | } |
| | | |
| | | .mainContent { |
| | | margin-bottom: 10px; |
| | | font-weight: 500; |
| | | |
| | | .rowTip { |
| | | display: flex; |
| | | padding: 5px 0; |
| | | border-bottom: 1px dashed #bbb; |
| | | |
| | | .wholeLine { |
| | | display: flex; |
| | | width: 100%; |
| | | align-items: center; |
| | | |
| | | .rowTipContenetLabel { |
| | | min-width: 144.23rpx; |
| | | font-size: 28.85rpx; |
| | | text-align: left; |
| | | } |
| | | |
| | | .rowTipContenetAll { |
| | | font-size: 28.85rpx; |
| | | width: calc(100% - 144.23rpx); |
| | | } |
| | | } |
| | | |
| | | .rowTipContenet { |
| | | width: 50%; |
| | | text-align: left; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | |
| | | .butsName { |
| | | display: inline-block; |
| | | margin-left: 19.23rpx; |
| | | color: #1990ff; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .rowTipContenet_right { |
| | | text-align: right !important; |
| | | } |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <view class="tabarStyle"> |
| | | <u-tabbar :value="value" @change="name => value = name" :fixed="true" :placeholder="true" |
| | | :safeAreaInsetBottom="true"> |
| | | <u-tabbar-item text="首页" @click="clickTo" icon="home"></u-tabbar-item> |
| | | <u-tabbar-item text="新建交办单" icon="plus-circle" @click="clickTo"></u-tabbar-item> |
| | | <u-tabbar-item text="我的" icon="account" @click="clickTo"></u-tabbar-item> |
| | | </u-tabbar> |
| | | </view> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | value: 0, |
| | | } |
| | | }, |
| | | props: { |
| | | currIndex: { |
| | | type: String, |
| | | default: '0' |
| | | }, |
| | | }, |
| | | watch: { |
| | | currIndex(newValue, oldValue) { |
| | | console.log('currIndex', newValue) |
| | | this.value = Number(newValue) |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.value = Number(this.currIndex) |
| | | }, |
| | | methods: { |
| | | clickTo(index) { |
| | | this.$emit('handleChangeTabe', index) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | </style> |
| | |
| | | <template> |
| | | <view class=""> |
| | | <cl-upload |
| | | v-model="fileList" |
| | | :action="uploadTermExcelUrl" |
| | | cloud-type="other" |
| | | :data="{ sysCode }" |
| | | :headers="hearder" |
| | | :image-form-data="{ |
| | | <cl-upload v-model="fileList" :action="uploadTermExcelUrl" cloud-type="other" :data="{ sysCode }" |
| | | :headers="hearder" :image-form-data="{ |
| | | compress: true, |
| | | }" |
| | | :list-style="{ |
| | | }" :list-style="{ |
| | | columns: 3, |
| | | columnGap: '10rpx', |
| | | rowGap: '10rpx', |
| | | padding: '10rpx', |
| | | radius: '20rpx' |
| | | }" |
| | | use-before-delete |
| | | @beforeDelete="beforeDelete" |
| | | @onSuccess="onSuccess" |
| | | /> |
| | | }" use-before-delete @beforeDelete="beforeDelete" @onSuccess="onSuccess" /> |
| | | </cl-upload> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | props: { |
| | | sysCode: { |
| | | type: String, |
| | | export default { |
| | | props: { |
| | | sysCode: { |
| | | type: String, |
| | | }, |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | fileList: [], |
| | | upLoadList: [], |
| | | beforFileList: [], |
| | | baseUrl: this.$storage.get('baseUrl'), |
| | | token: this.$storage.get('token'), |
| | | } |
| | | }, |
| | | computed: { |
| | | uploadTermExcelUrl() { |
| | | return `${this.baseUrl}/file/upload` || '' |
| | | data() { |
| | | return { |
| | | fileList: [], |
| | | upLoadList: [], |
| | | beforFileList: [], |
| | | baseUrl: this.$storage.get('baseUrl'), |
| | | token: '', |
| | | } |
| | | }, |
| | | hearder() { |
| | | let obj = { token: this.token, Authorization: this.token } |
| | | return obj |
| | | created() { |
| | | this.token = uni.getStorageSync('tonken') |
| | | console.log('tonken', this.token) |
| | | }, |
| | | }, |
| | | methods: { |
| | | onSuccess(res) { |
| | | console.log(res.data.fileId) |
| | | let fileId = res.data.fileId |
| | | let name = res.data.fileType === 1 ? 'name.png' : '' |
| | | this.fileList.push(`${this.baseUrl}/file/preview/${fileId}?${name}`) // 原图 |
| | | this.upLoadList.push(res.data) |
| | | console.log(this.fileList) |
| | | this.$emit('handleFile', this.upLoadList) |
| | | }, |
| | | /** |
| | | * 删除前钩子 |
| | | * @param {Object} item 当前删除的图片或者视频信息 |
| | | * @param {Number} index 当前删除的图片或视频索引 |
| | | * @param {Function} next 调用此函数继续执行组件删除逻辑 |
| | | * */ |
| | | beforeDelete(item, index, next) { |
| | | |
| | | uni.showModal({ |
| | | title: '提示信息', |
| | | content: '确定要删除这个文件嘛?', |
| | | success: res=> { |
| | | if (res.confirm) { |
| | | this.fileList.splice(index, 1) |
| | | this.upLoadList.splice(index, 1) |
| | | console.log('this.fileList', this.upLoadList) |
| | | this.$emit('handleFile', this.upLoadList) |
| | | } |
| | | computed: { |
| | | uploadTermExcelUrl() { |
| | | return `${this.baseUrl}/file/upload` || '' |
| | | }, |
| | | hearder() { |
| | | let obj = { |
| | | token: this.token, |
| | | Authorization: this.token |
| | | } |
| | | }) |
| | | return obj |
| | | }, |
| | | }, |
| | | }, |
| | | } |
| | | methods: { |
| | | onSuccess(res) { |
| | | let fileId = res.data.fileId |
| | | let name = res.data.fileType === 1 ? 'name.png' : '' |
| | | this.fileList.push(`${this.baseUrl}/file/preview/${fileId}?${name}`) // 原图 |
| | | this.upLoadList.push(res.data) |
| | | this.$emit('handleFile', this.upLoadList) |
| | | }, |
| | | /** |
| | | * 删除前钩子 |
| | | * @param {Object} item 当前删除的图片或者视频信息 |
| | | * @param {Number} index 当前删除的图片或视频索引 |
| | | * @param {Function} next 调用此函数继续执行组件删除逻辑 |
| | | * */ |
| | | beforeDelete(item, index, next) { |
| | | uni.showModal({ |
| | | title: '提示信息', |
| | | content: '确定要删除这个文件嘛?', |
| | | success: res => { |
| | | if (res.confirm) { |
| | | this.fileList.splice(index, 1) |
| | | this.upLoadList.splice(index, 1) |
| | | console.log('this.fileList', this.upLoadList) |
| | | this.$emit('handleFile', this.upLoadList) |
| | | } |
| | | } |
| | | }) |
| | | }, |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style></style> |
| | | <style></style> |
| | |
| | | <u-line color="#bbb" /> |
| | | <view> |
| | | <view class="mainContent"> |
| | | <u--form labelPosition="left" label-width="70" :model="form" :border-bottom="false" :rules="rules" |
| | | <u--form labelPosition="left" label-width="80" :model="form" :border-bottom="false" :rules="rules" |
| | | ref="uForm"> |
| | | <view class="formItemContent"> |
| | | <u-form-item label="是否整改:" required :border-bottom="false"> |
| | | <view class="" v-if="pageState"> |
| | | {{ dictObj.yesOrNo[basicInfor.isChange] ||''}} |
| | | <view class="" v-if="pageState"> |
| | | <p class="rowTip"> |
| | | <view class="rowTipContenet"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">是否整改:</text> |
| | | <text class="rowTipContenetAll"> |
| | | {{ dictObj.yesOrNo[basicInfor.isChange] ||''}} |
| | | </text> |
| | | </view> |
| | | </view> |
| | | <u-radio-group v-else v-model="form.isChange" @change="radioGroupChange"> |
| | | <u-radio :key="index" v-for="(item, index) in list" |
| | | :custom-style="{marginRight: '8px'}" :label="item.name" :name="item.value" /> |
| | | </u-radio-group> |
| | | </u-form-item> |
| | | <view class="rowTipContenet"> |
| | | <view class="wholeLine"> |
| | | <text class="rowTipContenetLabel">整改人:</text> |
| | | <text class="rowTipContenetAll">{{ basicInfor.changeName ||''}}</text> |
| | | </view> |
| | | </view> |
| | | </p> |
| | | </view> |
| | | <view class="" v-else> |
| | | <view class="formItemContent"> |
| | | <u-form-item label="是否整改:" :required="!pageState" :border-bottom="false"> |
| | | <u-radio-group v-model="form.isChange" @change="radioGroupChange"> |
| | | <u-radio :key="index" v-for="(item, index) in list" |
| | | :custom-style="{marginRight: '8px'}" :label="item.name" |
| | | :name="item.value" /> |
| | | </u-radio-group> |
| | | </u-form-item> |
| | | </view> |
| | | <view class="formItemContent"> |
| | | <u-form-item label="整改人:" prop="changeName" :border-bottom="false" |
| | | :required="!pageState"> |
| | | <u-input v-model="form.changeName" border="none" placeholder="请输入" type="text" /> |
| | | </u-form-item> |
| | | </view> |
| | | </view> |
| | | <view class="formItemContent"> |
| | | <u-form-item label="整改人:" prop="changeName" :border-bottom="false" required> |
| | | <view class="" v-if="pageState"> |
| | | {{ basicInfor.changeName ||''}} |
| | | </view> |
| | | <u-input v-else v-model="form.changeName" border="none" placeholder="请输入" type="text" /> |
| | | </u-form-item> |
| | | </view> |
| | | <view class="formItemContent"> |
| | | <u-form-item label="整改反馈" prop="changeDescribe" :border-bottom="false" required> |
| | | <view class="" v-if="pageState"> |
| | | <u-form-item label="整改反馈:" prop="changeDescribe" :border-bottom="false" |
| | | :required="!pageState"> |
| | | <view class="fonttest" v-if="pageState"> |
| | | {{ basicInfor.changeDescribe ||''}} |
| | | </view> |
| | | <u--textarea v-else v-model="form.changeDescribe" border="none" placeholder="请输入内容" /> |
| | | <u--textarea v-else v-model="form.changeDescribe" border="none" /> |
| | | </u-form-item> |
| | | </view> |
| | | |
| | | <view class="formItemContent"> |
| | | <u-form-item label="相关附件" :border-bottom="false"> |
| | | <u-form-item label="相关附件:" :border-bottom="false"> |
| | | <view class="fileBox" v-if="pageState"> |
| | | <cl-upload v-model="fileList" :add="false" :action="`''`" cloud-type="other" |
| | | :remove="false" /> |
| | |
| | | return { |
| | | sysCode: '1010202', |
| | | list: [{ |
| | | name: '是', |
| | | value: 0, |
| | | }, |
| | | { |
| | | name: '否', |
| | | value: 1, |
| | | }, |
| | | ], |
| | | name: '是', |
| | | value: 0, |
| | | }, { |
| | | name: '否', |
| | | value: 1, |
| | | }, ], |
| | | form: { |
| | | isChange: 0, |
| | | changeName: '', |
| | | changeDescribe: '', |
| | | }, |
| | | dictObj: this.$storage.getJson('dictObj'), |
| | | dictObj: JSON.parse(uni.getStorageSync('dictObj') || '[]'), |
| | | fileList: [], |
| | | fileBaseList: [], |
| | | baseUrl: this.$storage.get('baseUrl'), |
| | |
| | | return new Promise((resolve, reject) => { |
| | | if (!this.pageState) { |
| | | this.$refs.uForm.validate().then(res => { |
| | | resolve(true) |
| | | }) |
| | | .catch(errors => { |
| | | reject(false) |
| | | uni.$u.toast('校验失败') |
| | | }) |
| | | resolve(true) |
| | | }).catch(errors => { |
| | | reject(false) |
| | | uni.$u.toast('校验失败') |
| | | }) |
| | | } else { |
| | | resolve(true) |
| | | } |
| | | |
| | | }); |
| | | |
| | | }) |
| | | } |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | /deep/.u-line { |
| | | margin: 19.23rpx 0px !important; |
| | |
| | | .workOrderDetail { |
| | | border: 1px solid #bbb; |
| | | border-radius: 5px; |
| | | min-height: 288.46rpx; |
| | | margin: 19.23rpx; |
| | | padding: 19.23rpx; |
| | | color: #101010; |
| | | font-weight: 700; |
| | | font-size: 26.92rpx; |
| | | font-size: 30.77rpx; |
| | | |
| | | .headerCont { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | font-size: 15px; |
| | | font-size: 30.77rpx; |
| | | } |
| | | |
| | | .mainContent { |
| | |
| | | font-weight: 500; |
| | | |
| | | .rowTip { |
| | | padding: 8px 0; |
| | | display: flex; |
| | | padding: 5px 0; |
| | | border-bottom: 1px dashed #bbb; |
| | | |
| | | .wholeLine { |
| | |
| | | align-items: center; |
| | | |
| | | .rowTipContenetLabel { |
| | | min-width: 125rpx; |
| | | min-width: 144.23rpx; |
| | | font-size: 28.85rpx; |
| | | text-align: left; |
| | | } |
| | | } |
| | | |
| | | .rowTipContenetAll { |
| | | width: calc(100% - 125rpx; ); |
| | | .rowTipContenetAll { |
| | | font-size: 28.85rpx; |
| | | width: calc(100% - 144.23rpx); |
| | | } |
| | | } |
| | | |
| | | .rowTipContenet { |
| | |
| | | text-align: right !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .formItemContent { |
| | | /deep/.u-form-item { |
| | | padding: 8px 0; |
| | | border-bottom: 1px dashed #bbb; |
| | | } |
| | | |
| | | /deep/.u-form-item__body, |
| | | /deep/.u-textarea { |
| | | padding: 0 !important; |
| | | } |
| | | |
| | | /deep/.u-form-item__body__left__content__label, |
| | | /deep/.u-radio__text { |
| | | font-size: 13px !important; |
| | | } |
| | | } |
| | | |
| | | .fileBox { |
| | | display: -webkit-box; |
| | | display: -webkit-flex; |
| | | display: flex; |
| | | position: relative; |
| | | width: 100%; |
| | | height: 100%; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-box-direction: normal; |
| | | -webkit-flex-direction: column; |
| | | flex-direction: column; |
| | | -webkit-box-pack: center; |
| | | -webkit-justify-content: center; |
| | | justify-content: center; |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <view class=""> |
| | | <u-modal :show="showUserSculpture" :title="title"> |
| | | <view class="slot-content"> |
| | | <view class=""> |
| | | <u-avatar :src="avatarUrl" size="60"></u-avatar> |
| | | </view> |
| | | </view> |
| | | <view class="" slot="confirmButton"> |
| | | <view class="confirmButton"> |
| | | <button type="primary" open-type="chooseAvatar" @chooseavatar="onChooseAvatar" plain="true" |
| | | style="border: none;position: relative;"> |
| | | <image :src="avatar" mode="aspectFill" |
| | | style="width: 150rpx;height: 150rpx;border-radius: 20rpx;" v-if="avatar"> |
| | | </image> |
| | | <image src="../../static/home/noavatar.jpg" mode="aspectFill" |
| | | style="width: 150rpx;height: 150rpx;border-radius: 20rpx;" v-else></image> |
| | | <view class="tips">点击授权头像</view> |
| | | </button> |
| | | <button type="primary" open-type="chooseAvatar" @chooseavatar="onChooseAvatar" plain="true" |
| | | style="border: none;position: relative; width: 200px;"> |
| | | <u-button text="确定" class="buts"></u-button> </button> |
| | | <button type="primary" plain="true" style="border: none;position: relative; width: 200px;"> |
| | | <u-button text="取消" class="buts"></u-button> |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </u-modal> |
| | | </view> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | props: { |
| | | showUserSculpture: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | title: '设置头像', |
| | | avatarUrl: '' |
| | | } |
| | | }, |
| | | methods: { |
| | | onChooseAvatar(e) { |
| | | const { |
| | | avatarUrl |
| | | } = e.detail // 此返回的路径为临时路径,需转换为永久路径保存使用 |
| | | this.avatarUrl = avatarUrl |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style lang="scss" scoped> |
| | | .slot-content { |
| | | display: flex; |
| | | width: 100%; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .confirmButton { |
| | | display: flex; |
| | | } |
| | | </style> |
| | |
| | | <view class="mainContent"> |
| | | <view class="headerAvatar"> |
| | | <view class=""> |
| | | <u-avatar :text="firstFont" fontSize="40" randomBgColor size='100'></u-avatar> |
| | | <u-avatar :src="avatarUrl" fontSize="40" randomBgColor size='100'></u-avatar> |
| | | </view> |
| | | </view> |
| | | <view class="inforBox"> |
| | | <u-cell-group> |
| | | <u-cell-group :custom-style='fontStyleobj'> |
| | | <u-cell icon="server-man" title="姓名" :value="userInfor.userName"></u-cell> |
| | | <u-cell icon="account-fill" title="账号" :value="userInfor.account"></u-cell> |
| | | <u-cell icon="integral-fill" title="责任单位" :value="unitName"></u-cell> |
| | |
| | | </view> |
| | | </template> |
| | | <script> |
| | | import { |
| | | created |
| | | } from '../../../uni_modules/uview-ui/libs/mixin/mixin' |
| | | import store from '@/store/index.js' |
| | | export default { |
| | | data() { |
| | | return { |
| | | loading: false, |
| | | userInfor: {}, |
| | | unitList: [] |
| | | avatarUrl: '', |
| | | unitList: [], |
| | | fontStyleobj: { |
| | | 'fontSize': '16px' |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | unitName() { |
| | | let data = '' |
| | | if (this.unitList.length > 0) { |
| | | data = this.unitList.find(a => parseInt(a.unitId) === this.userInfor.unitId).unitName |
| | | if (Object.values(this.userInfor).length > 0 && this.unitList.length > 0) { |
| | | if (this.userInfor.unitId) { |
| | | data = this.unitList.find(a => parseInt(a.unitId) === this.userInfor.unitId).unitName |
| | | } |
| | | } |
| | | return data || '' |
| | | }, |
| | | firstFont() { |
| | | return this.userInfor.userName[0] || '七' |
| | | } |
| | | // firstFont() { |
| | | // let data = '' |
| | | // if (Object.values(this.userInfor).length > 0) { |
| | | // data = this.userInfor.userName[0] |
| | | // } |
| | | // return data || '七' |
| | | // } |
| | | }, |
| | | created() { |
| | | this.$http.httpGet('/allocation/unit').then(res => { |
| | | this.unitList = res.data |
| | | }) |
| | | this.userInfor = this.$storage.getJson('userInfo') |
| | | console.log('userInfor', this.userInfor.userName[0]) |
| | | this.userInfor = JSON.parse(uni.getStorageSync('userInfor') || '{}') |
| | | console.log('this.userInforGet', this.userInfor) |
| | | let baseUrl = this.$storage.get('baseUrl') |
| | | this.avatarUrl = `${baseUrl}/file/preview/${this.userInfor.file.fileId}` |
| | | }, |
| | | methods: { |
| | | goOut() { |
| | | let openId = uni.getStorageSync('openId') |
| | | uni.showModal({ |
| | | title: '退出', |
| | | content: '确认退出吗?', |
| | |
| | | userId: this.userInfor.userId |
| | | }).then(res => { |
| | | uni.clearStorageSync() |
| | | uni.setStorageSync('openId', openId) |
| | | uni.reLaunch({ |
| | | url: '/pages/login/login', |
| | | }) |
| | | }).catch(uni.$u.toast('退出失败')) |
| | | }) |
| | | } |
| | | } |
| | | }) |
| | |
| | | .bunts { |
| | | margin-top: 57.69rpx; |
| | | } |
| | | |
| | | /deep/ .u-cell__title-text, |
| | | /deep/.u-cell__value { |
| | | font-size: 30.77rpx !important; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <view class="mianContent"> |
| | | <p class="title">基本信息</p> |
| | | <u-form |
| | | ref="uForm" |
| | | label-width="65" |
| | | :model="form" |
| | | :rules="rules" |
| | | > |
| | | <u-form-item |
| | | border-bottom |
| | | label="责任主体:" |
| | | prop="unitId" |
| | | required |
| | | @click=" |
| | | <u-form ref="uForm" label-width="80" :model="form" :rules="rules" :labelStyle="labelStyle"> |
| | | <u-form-item border-bottom label="上报时间:" prop="escalationTime" required @click="showeEscalationTime = true"> |
| | | <u-input v-model="form.escalationTime" border="none" disabled disabled-color="#ffffff" placeholder="请选择" |
| | | type="select" /> |
| | | <u-icon slot="right" name="arrow-right" /> |
| | | <u-datetime-picker ref="datetimePicker" v-model="timeFormet" mode="date" :show="showeEscalationTime" |
| | | @confirm="checkTime" @cancel='showeEscalationTime=false' /> |
| | | </u-form-item> |
| | | <u-form-item border-bottom label="污染位置:" prop="pollutePosition" required> |
| | | <u-input v-model="form.pollutePosition" border="none" placeholder="请输入" type="text" /> |
| | | </u-form-item> |
| | | <u-form-item border-bottom label="责任主体:" prop="unitId" required @click=" |
| | | showCheckBox = true; |
| | | hideKeyboard('unitList', 'unitId'); |
| | | " |
| | | > |
| | | <u--input |
| | | v-model="form.unitId" |
| | | border="none" |
| | | disabled |
| | | disabled-color="#ffffff" |
| | | placeholder="请选择" |
| | | /> |
| | | "> |
| | | <u--input v-model="form.unitId" border="none" disabled disabled-color="#ffffff" placeholder="请选择" /> |
| | | <u-icon slot="right" name="arrow-right" /> |
| | | </u-form-item> |
| | | |
| | | <u-form-item |
| | | border-bottom |
| | | label="污染分类:" |
| | | prop="polluteType" |
| | | required |
| | | @click=" |
| | | <u-form-item border-bottom label="污染分类:" prop="polluteType" required @click=" |
| | | showCheckBox = true; |
| | | hideKeyboard('polluteList', 'polluteType'); |
| | | " |
| | | > |
| | | <u-input |
| | | v-model="form.polluteType" |
| | | border="none" |
| | | disabled |
| | | disabled-color="#ffffff" |
| | | placeholder="请选择" |
| | | type="select" |
| | | /> |
| | | "> |
| | | <u-input v-model="form.polluteType" border="none" disabled disabled-color="#ffffff" placeholder="请选择" |
| | | type="select" /> |
| | | <u-icon slot="right" name="arrow-right" /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | border="none" |
| | | border-bottom |
| | | label="整改类型:" |
| | | prop="changeType" |
| | | required |
| | | @click=" |
| | | <u-form-item border="none" border-bottom label="整改类型:" prop="changeType" required @click=" |
| | | showCheckBox = true; |
| | | hideKeyboard('changeEnum', 'changeType'); |
| | | " |
| | | > |
| | | <u-input |
| | | v-model="form.changeType" |
| | | border="none" |
| | | disabled |
| | | disabled-color="#ffffff" |
| | | placeholder="请选择" |
| | | type="select" |
| | | /> |
| | | "> |
| | | <u-input v-model="form.changeType" border="none" disabled disabled-color="#ffffff" placeholder="请选择" |
| | | type="select" /> |
| | | <u-icon slot="right" name="arrow-right" /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | border-bottom |
| | | label="限期天数:" |
| | | placeholder="请输入" |
| | | required |
| | | > |
| | | <u-form-item border-bottom label="限期天数:" placeholder="请输入" required> |
| | | <u-input v-model="form.changeDay" border="none" type="number" /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | border-bottom |
| | | label="上报单位:" |
| | | prop="escalationUnitId" |
| | | required |
| | | @click=" |
| | | <u-form-item border-bottom label="上报单位:" prop="escalationUnitId" required @click=" |
| | | showCheckBox = true; |
| | | hideKeyboard('unitList', 'escalationUnitId'); |
| | | " |
| | | > |
| | | <u-input |
| | | v-model="form.escalationUnitId" |
| | | border="none" |
| | | disabled |
| | | disabled-color="#ffffff" |
| | | placeholder="请选择" |
| | | type="select" |
| | | /> |
| | | "> |
| | | <u-input v-model="form.escalationUnitId" border="none" disabled disabled-color="#ffffff" |
| | | placeholder="请选择" type="select" /> |
| | | <u-icon slot="right" name="arrow-right" /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | border-bottom |
| | | label="上报人:" |
| | | prop="escalationName" |
| | | required |
| | | > |
| | | <u-input |
| | | v-model="form.escalationName" |
| | | border="none" |
| | | placeholder="请输入" |
| | | type="text" |
| | | /> |
| | | <u-form-item border-bottom label="上报人:" prop="escalationName" required> |
| | | <u-input v-model="form.escalationName" border="none" placeholder="请输入" type="text" /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | border-bottom |
| | | label="排查方式:" |
| | | prop="investigationType" |
| | | required |
| | | > |
| | | <u-form-item border-bottom label="排查方式:" prop="investigationType" required> |
| | | <u-radio-group v-model="form.investigationType" style="font-size: 13px;"> |
| | | <u-radio |
| | | :key="index" |
| | | v-for="(item, index) in Dic.investigationEnum" |
| | | :custom-style="{marginRight: '8px'}" |
| | | :label="item.name" |
| | | :name="item.value" |
| | | /> |
| | | <u-radio :key="index" v-for="(item, index) in Dic.investigationEnum" |
| | | :custom-style="{marginRight: '8px'}" :label="item.name" :name="item.value" /> |
| | | </u-radio-group> |
| | | </u-form-item> |
| | | <u-form-item |
| | | border-bottom |
| | | label="上报时间:" |
| | | prop="escalationTime" |
| | | required |
| | | @click="showeEscalationTime = true" |
| | | > |
| | | <u-input |
| | | v-model="form.escalationTime" |
| | | border="none" |
| | | disabled |
| | | disabled-color="#ffffff" |
| | | placeholder="请选择" |
| | | type="select" |
| | | /> |
| | | <u-icon slot="right" name="arrow-right" /> |
| | | <u-datetime-picker |
| | | ref="datetimePicker" |
| | | v-model="timeFormet" |
| | | mode="date" |
| | | :show="showeEscalationTime" |
| | | @confirm="checkTime" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | border-bottom |
| | | label="污染位置:" |
| | | prop="pollutePosition" |
| | | required |
| | | > |
| | | <u-input |
| | | v-model="form.pollutePosition" |
| | | border="none" |
| | | placeholder="请输入" |
| | | type="text" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | border-bottom |
| | | label="问题描述:" |
| | | prop="problemDescribe" |
| | | required |
| | | > |
| | | <u-form-item border-bottom label="问题描述:" prop="problemDescribe" required> |
| | | <u--textarea v-model="form.problemDescribe" border="none" placeholder="请输入内容" /> |
| | | </u-form-item> |
| | | <u-form-item border-bottom label="相关附件:"> |
| | |
| | | </view> |
| | | </u-form-item> |
| | | </u-form> |
| | | <u-action-sheet |
| | | v-if="actionOptionList.length > 0" |
| | | :actions="actionOptionList" |
| | | :show="showCheckBox" |
| | | title="请选择" |
| | | @close="showCheckBox = false" |
| | | @select="selectBack" |
| | | /> |
| | | <u-picker :show="showCheckBox" keyName="label" :columns="actionOptionList" @cancel="showCheckBox = false" |
| | | @confirm="selectBack"></u-picker> |
| | | <!-- <u-action-sheet v-if="actionOptionList.length > 0" :actions="actionOptionList" :show="showCheckBox" title="请选择" |
| | | @close="showCheckBox = false" @select="selectBack" /> --> |
| | | <view class="bunts"> |
| | | <u-button shape="square" @click="close">关闭</u-button> |
| | | <u-button shape="square" type="primary" @click="submit">提交</u-button> |
| | | <view class="but butRight"> |
| | | <u-button shape="square" @click="close">关闭</u-button> |
| | | </view> |
| | | <view class="but butleft"> |
| | | <u-button shape="square" type="primary" @click="submit">提交</u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import fileUpload from '../components/fileUpload.vue' |
| | | export default { |
| | | components: { |
| | | fileUpload |
| | | }, |
| | | data() { |
| | | return { |
| | | sysCode: '1010201', // |
| | | showCheckBox: false, |
| | | showeEscalationTime: false, |
| | | actionOptionList: [], |
| | | rules: { |
| | | 'unitId': { |
| | | required: true, |
| | | message: '请输入', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'polluteType': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'changeType': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'changeDay': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'escalationName': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur'] |
| | | }, |
| | | 'escalationUnitId': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'escalationTime': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur'] |
| | | }, 'problemDescribe': { |
| | | required: true, |
| | | message: '请输入', |
| | | trigger: ['blur'] |
| | | }, 'pollutePosition': { |
| | | required: true, |
| | | message: '请输入', |
| | | trigger: ['blur'] |
| | | }, |
| | | }, |
| | | currentKey: '', |
| | | Dic: this.$storage.getJson('dict'), |
| | | changeEnum: [], |
| | | timeFormet: Number(new Date()), |
| | | form: { |
| | | unitId: '', |
| | | polluteType: '', |
| | | changeType: '', |
| | | changeDay: '', |
| | | escalationName: '', |
| | | escalationUnitId: '', |
| | | escalationTime: '', |
| | | problemDescribe: '', |
| | | pollutePosition: '', |
| | | }, |
| | | sumbitForm: { |
| | | unitId: '', |
| | | polluteType: '', |
| | | changeType: '', |
| | | changeDay: '', |
| | | escalationName: '', |
| | | escalationUnitId: '', |
| | | escalationTime: '', |
| | | problemDescribe: '', |
| | | pollutePosition: '', |
| | | }, |
| | | unitList: [], |
| | | polluteList: [], |
| | | fileBaseList: [], |
| | | } |
| | | }, |
| | | onReady() { |
| | | //onReady 为uni-app支持的生命周期之一 |
| | | this.$refs.uForm.setRules(this.rules) |
| | | }, |
| | | onShow(){ |
| | | uni.hideTabBar() |
| | | }, |
| | | created() { |
| | | this.changeEnum = this.Dic.changeEnum |
| | | this.getUnitList() |
| | | this.getContaminateList() |
| | | }, |
| | | methods: { |
| | | handleFile(data){ |
| | | this.fileBaseList=data |
| | | import fileUpload from '../components/fileUpload.vue' |
| | | export default { |
| | | components: { |
| | | fileUpload |
| | | }, |
| | | close(){ |
| | | uni.reLaunch({ |
| | | url: '/pages/actionChange/agencyPage/index', |
| | | data() { |
| | | return { |
| | | sysCode: '1010201', // |
| | | showCheckBox: false, |
| | | labelStyle: { |
| | | fontSize: '30.77rpx' |
| | | }, |
| | | showeEscalationTime: false, |
| | | actionOptionList: [], |
| | | rules: { |
| | | 'unitId': { |
| | | required: true, |
| | | message: '请输入', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'polluteType': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'changeType': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'changeDay': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'escalationName': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur'] |
| | | }, |
| | | 'escalationUnitId': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur', 'change'] |
| | | }, |
| | | 'escalationTime': { |
| | | required: true, |
| | | message: '请选择', |
| | | trigger: ['blur'] |
| | | }, |
| | | 'problemDescribe': { |
| | | required: true, |
| | | message: '请输入', |
| | | trigger: ['blur'] |
| | | }, |
| | | 'pollutePosition': { |
| | | required: true, |
| | | message: '请输入', |
| | | trigger: ['blur'] |
| | | }, |
| | | }, |
| | | currentKey: '', |
| | | Dic: [], |
| | | changeEnum: [], |
| | | timeFormet: Number(new Date()), |
| | | form: { |
| | | unitId: '', |
| | | polluteType: '', |
| | | changeType: '', |
| | | changeDay: '', |
| | | escalationName: '', |
| | | escalationUnitId: '', |
| | | escalationTime: '', |
| | | problemDescribe: '', |
| | | pollutePosition: '', |
| | | }, |
| | | sumbitForm: { |
| | | unitId: '', |
| | | polluteType: '', |
| | | changeType: '', |
| | | changeDay: '', |
| | | escalationName: '', |
| | | escalationUnitId: '', |
| | | escalationTime: '', |
| | | problemDescribe: '', |
| | | pollutePosition: '', |
| | | }, |
| | | unitList: [], |
| | | polluteList: [], |
| | | fileBaseList: [], |
| | | } |
| | | }, |
| | | onReady() { |
| | | //onReady 为uni-app支持的生命周期之一 |
| | | this.$refs.uForm.setRules(this.rules) |
| | | }, |
| | | onShow() { |
| | | uni.hideTabBar() |
| | | }, |
| | | created() { |
| | | this.getUnitList() |
| | | this.getContaminateList() |
| | | }, |
| | | onBackPress(e) { |
| | | uni.navigateBack({ |
| | | delta: 1, //返回上上一级注意这里要设置为2 |
| | | }) |
| | | return false |
| | | }, |
| | | hideKeyboard(data, key) { |
| | | this.actionOptionList = [] |
| | | let list = this[data] |
| | | |
| | | this.currentKey = key |
| | | list.forEach((item)=> { |
| | | item.name = item.dataValue || item.name || item.unitName |
| | | item.value = item.dataKey || item.value|| item.unitId |
| | | }) |
| | | |
| | | this.actionOptionList = list |
| | | }, |
| | | selectBack(e) { |
| | | this.form[this.currentKey] = e.name |
| | | this.sumbitForm[this.currentKey] = e.value |
| | | |
| | | }, |
| | | checkTime(e) { |
| | | this.showeEscalationTime = false |
| | | let data = this.$utils.dateFormatter(e.value) |
| | | this.form.escalationTime = data |
| | | this.sumbitForm.escalationTime = data |
| | | }, |
| | | submit() { |
| | | this.$refs.uForm.validate().then(res=> { |
| | | this.sumbitForm.problemDescribe=this.form.problemDescribe |
| | | this.sumbitForm.pollutePosition=this.form.pollutePosition |
| | | this.sumbitForm.changeDay=this.form.changeDay |
| | | this.sumbitForm.escalationName=this.form.escalationName |
| | | this.sumbitForm.fileBaseList=this.fileBaseList |
| | | this.sumbitForm.state='10' |
| | | console.log('this.sumbitForm', this.sumbitForm) |
| | | this.$http.httpPost('/allocation/insert', {...this.sumbitForm}).then((res)=> { |
| | | uni.$u.toast('提交成功') |
| | | this.close() |
| | | methods: { |
| | | handleFile(data) { |
| | | this.fileBaseList = data |
| | | }, |
| | | close() { |
| | | uni.$emit('currIndex', { |
| | | data: { |
| | | index: '0', |
| | | showTabBar: true |
| | | } |
| | | }) |
| | | }).catch(errors=> { |
| | | uni.$u.toast('校验失败') |
| | | }) |
| | | uni.navigateBack({ |
| | | delta: 1, //返回上上一级注意这里要设置为2 |
| | | }) |
| | | }, |
| | | hideKeyboard(data, key) { |
| | | this.actionOptionList = [] |
| | | let list = this[data] |
| | | this.currentKey = key |
| | | list.forEach(item => { |
| | | item.label = item.dataValue || item.name || item.unitName |
| | | item.id = item.dataKey || item.value || item.unitId |
| | | }) |
| | | console.log('list', list) |
| | | this.$set(this.actionOptionList, 0, list) |
| | | }, |
| | | selectBack(e) { |
| | | console.log(e) |
| | | this.form[this.currentKey] = e.value[0].label |
| | | this.sumbitForm[this.currentKey] = e.value[0].id |
| | | this.showCheckBox = false |
| | | }, |
| | | checkTime(e) { |
| | | this.showeEscalationTime = false |
| | | let data = this.$utils.dateFormatter(e.value) |
| | | console.log('e.value', e.value) |
| | | this.form.escalationTime = data |
| | | this.sumbitForm.escalationTime = data |
| | | }, |
| | | submit() { |
| | | this.$refs.uForm.validate().then(res => { |
| | | this.sumbitForm.problemDescribe = this.form.problemDescribe |
| | | this.sumbitForm.pollutePosition = this.form.pollutePosition |
| | | this.sumbitForm.changeDay = this.form.changeDay |
| | | this.sumbitForm.escalationName = this.form.escalationName |
| | | this.sumbitForm.investigationType = this.form.investigationType |
| | | this.sumbitForm.fileBaseList = this.fileBaseList |
| | | this.sumbitForm.state = '20' |
| | | console.log('this.sumbitForm', this.sumbitForm) |
| | | this.$http.httpPost('/allocation/insert', { |
| | | ...this.sumbitForm |
| | | }).then(res => { |
| | | uni.$u.toast('提交成功') |
| | | this.close() |
| | | }) |
| | | }).catch(errors => { |
| | | uni.$u.toast('校验失败') |
| | | }) |
| | | }, |
| | | setDefaultValue() { |
| | | let time = new Date().getTime() |
| | | let data = this.$utils.dateFormatter(time) |
| | | this.form.escalationTime = data |
| | | this.sumbitForm.escalationTime = data |
| | | if (this.changeEnum.length > 0) { |
| | | this.form.changeType = this.changeEnum[0].name |
| | | this.sumbitForm.changeType = this.changeEnum[0].value |
| | | } |
| | | let userInfor = JSON.parse(uni.getStorageSync('userInfor') || '{}') |
| | | if (userInfor.unitId && this.unitList.length > 0) { |
| | | let data = this.unitList && this.unitList.find(a => Number(a.unitId) === Number(userInfor.unitId)) |
| | | .unitName |
| | | this.form.unitId = data |
| | | this.sumbitForm.unitId = userInfor.unitId |
| | | this.form.escalationUnitId = data |
| | | this.sumbitForm.escalationUnitId = userInfor.unitId |
| | | } |
| | | this.form.escalationName = userInfor.name || '' |
| | | this.sumbitForm.escalationName = userInfor.name || '' |
| | | this.form.investigationType = 1 |
| | | this.sumbitForm.investigationType = 1 |
| | | console.log('this.sumbitForm', this.sumbitForm) |
| | | }, |
| | | // 获取责任单位list |
| | | getUnitList() { |
| | | this.$http.httpGet('/allocation/unit').then(res => { |
| | | this.unitList = res.data |
| | | this.Dic = JSON.parse(uni.getStorageSync('dict') || '[]') |
| | | this.changeEnum = this.Dic.changeEnum |
| | | this.setDefaultValue() |
| | | }) |
| | | }, |
| | | getContaminateList() { |
| | | this.$http.httpGet('/allocation/contaminate').then(res => { |
| | | this.polluteList = res.data |
| | | }) |
| | | }, |
| | | }, |
| | | // 获取责任单位list |
| | | getUnitList() { |
| | | this.$http.httpGet('/allocation/unit').then((res)=> { |
| | | this.unitList = res.data |
| | | }) |
| | | }, |
| | | getContaminateList() { |
| | | this.$http.httpGet('/allocation/contaminate').then((res)=> { |
| | | this.polluteList = res.data |
| | | }) |
| | | }, |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | uni-page-body { |
| | | padding-top: 10px; |
| | |
| | | .mianContent { |
| | | margin: 19.23rpx; |
| | | border-radius: 5px; |
| | | padding-bottom: 38.46rpx; |
| | | |
| | | .title { |
| | | padding: 9.62rpx; |
| | | font-size: 16px; |
| | |
| | | padding-left: 10px; |
| | | } |
| | | |
| | | /deep/.u-form-item__body { |
| | | padding: 5px 0px !important; |
| | | font-size: 13px!important; |
| | | } |
| | | /deep/.u-form-item__body__left__content__label,/deep/.u-input__content__field-wrapper__field,/deep/.u-radio__text{ |
| | | font-size: 13px!important; |
| | | } |
| | | // /deep/.u-form-item__body { |
| | | // padding: 8px 0px !important; |
| | | // font-size: 15px !important; |
| | | // } |
| | | // /deep/.u-form-item__body__left__content__label, |
| | | // /deep/.u-input__content__field-wrapper__field, |
| | | // /deep/.u-radio__text { |
| | | // font-size: 15px !important; |
| | | // } |
| | | } |
| | | |
| | | .bunts { |
| | | display: flex; |
| | | margin-top: 20px; |
| | | margin-bottom: 96.15rpx; |
| | | padding-bottom: 20px; |
| | | .u-button { |
| | | width: 288.46rpx; |
| | | padding: 0 20px; |
| | | justify-content: center; |
| | | |
| | | .but { |
| | | width: 50%; |
| | | } |
| | | |
| | | .butRight { |
| | | padding-right: 20px; |
| | | } |
| | | |
| | | .butleft { |
| | | padding-left: 20px; |
| | | } |
| | | } |
| | | .fileBox{ |
| | | |
| | | .fileBox { |
| | | display: -webkit-box; |
| | | display: -webkit-flex; |
| | | display: flex; |
| | |
| | | <template> |
| | | <view class="mainContent"> |
| | | <basicInfor :basic-infor="basicInfor" /> |
| | | <rectificationInfor ref="rectificationInfor" :basic-infor="basicInfor" /> |
| | | <rectificationInfor ref="rectificationInfor" :basic-infor="basicInfor" |
| | | v-if="!(pageState === 'view' && basicInfor.state === 20)" /> |
| | | <approvalnfor ref="approvalnfor" v-if="basicInfor.state >= 30" :basic-infor="basicInfor" /> |
| | | <view class="bunts"> |
| | | <u-button shape="square" @click="close">关闭</u-button> |
| | | <u-button |
| | | v-if="pageState==='edit'" |
| | | shape="square" |
| | | type="primary" |
| | | @click="submit" |
| | | > |
| | | 提交 |
| | | </u-button> |
| | | <view class="but butRight"> |
| | | <u-button shape="square" @click="refuse" type="error" |
| | | v-if="pageState==='edit'&& basicInfor.state >= 30">拒绝</u-button> |
| | | <u-button shape=" square" @click="close" v-else>关闭</u-button> |
| | | </view> |
| | | <view class="but butleft" v-if="pageState==='edit'"> |
| | | <u-button shape="square" type="primary" @click="submit"> 提交 </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | <script> |
| | | import basicInfor from '../components/basicInfor.vue' |
| | | import rectificationInfor from '../components/rectificationInfor.vue' |
| | | import approvalnfor from '../components/approvalnfor.vue' |
| | | export default { |
| | | components: { |
| | | basicInfor, |
| | | rectificationInfor, |
| | | approvalnfor, |
| | | }, |
| | | data() { |
| | | return { |
| | | basicInfor: {} |
| | | } |
| | | }, |
| | | computed: { |
| | | pageState() { |
| | | return this.basicInfor.pageState |
| | | } |
| | | }, |
| | | onLoad: function(option) { |
| | | console.log('option', option) |
| | | //option为object类型,会序列化上个页面传递的参数 |
| | | this.basicInfor = JSON.parse(option.infor) |
| | | |
| | | }, |
| | | onBackPress(e) { |
| | | uni.navigateTo({ |
| | | url: '/pages/actionChange/agencyPage/index', |
| | | }) |
| | | return false |
| | | }, |
| | | methods: { |
| | | radioGroupChange(e) { |
| | | console.log('radioGroupe,e', this.workForme.isChange) |
| | | import basicInfor from '../components/basicInfor.vue' |
| | | import rectificationInfor from '../components/rectificationInfor.vue' |
| | | import approvalnfor from '../components/approvalnfor.vue' |
| | | export default { |
| | | components: { |
| | | basicInfor, |
| | | rectificationInfor, |
| | | approvalnfor, |
| | | }, |
| | | close() { |
| | | let pages = getCurrentPages() // 当前页面 |
| | | let beforePage = pages[pages.length - 3] // 上上一页 |
| | | //beforePage.$vm.reFresh = Math.random()//触发上一页监听器 |
| | | data() { |
| | | return { |
| | | basicInfor: {} |
| | | } |
| | | }, |
| | | computed: { |
| | | pageState() { |
| | | return this.basicInfor.pageState |
| | | } |
| | | }, |
| | | onLoad: function(option) { |
| | | console.log('option', option) |
| | | //option为object类型,会序列化上个页面传递的参数 |
| | | this.basicInfor = JSON.parse(option.infor) |
| | | }, |
| | | onBackPress(e) { |
| | | uni.navigateBack({ |
| | | delta: 1, //返回上上一级注意这里要设置为2 |
| | | success: function() { |
| | | // beforePage.$vm.reFresh() |
| | | } |
| | | }) |
| | | return false |
| | | }, |
| | | submit() { |
| | | Promise.all([this.$refs.rectificationInfor && this.$refs.rectificationInfor.formVali(), this.$refs |
| | | .approvalnfor && this.$refs.approvalnfor.formVali() |
| | | ]) // |
| | | .then(()=> { |
| | | let api = this.basicInfor.state >= 30 ? '/allocation/check' : '/allocation/change' //审批 |
| | | let form = this.basicInfor.state >=30 ? this.$refs.approvalnfor.form : this.$refs.rectificationInfor.form |
| | | let data = { |
| | | allocationId: this.basicInfor.allocationId, |
| | | ...form, |
| | | state: this.basicInfor.state, |
| | | methods: { |
| | | radioGroupChange(e) { |
| | | console.log('radioGroupe,e', this.workForme.isChange) |
| | | }, |
| | | close() { |
| | | uni.$emit('currIndex', { |
| | | data: { |
| | | index: '0', |
| | | showTabBar: true |
| | | } |
| | | this.$http.httpPost(api, data).then((res)=> { |
| | | this.close() |
| | | }) |
| | | uni.navigateBack({ |
| | | delta: 1, //返回上上一级注意这里要设置为2 |
| | | }) |
| | | }, |
| | | refuse() { |
| | | Promise.all([this.$refs.rectificationInfor && this.$refs.rectificationInfor.formVali(), this.$refs |
| | | .approvalnfor && this.$refs.approvalnfor.formVali() |
| | | ]) // |
| | | .then(() => { |
| | | let api = this.basicInfor.state >= 30 ? '/allocation/check' : '/allocation/change' //审批 |
| | | let form = this.basicInfor.state >= 30 ? this.$refs.approvalnfor.form : this.$refs |
| | | .rectificationInfor.form |
| | | let data = { |
| | | allocationId: this.basicInfor.allocationId, |
| | | ...form, |
| | | state: 50, |
| | | } |
| | | this.$http.httpPost(api, data).then(res => { |
| | | this.close() |
| | | }) |
| | | }).catch(err => { |
| | | console.log('拒绝失败:', err) |
| | | }) |
| | | }) |
| | | .catch(err=> { |
| | | console.log('文件上传异常:', err) |
| | | }) |
| | | |
| | | } |
| | | }, |
| | | } |
| | | }, |
| | | submit() { |
| | | Promise.all([this.$refs.rectificationInfor && this.$refs.rectificationInfor.formVali(), this.$refs |
| | | .approvalnfor && this.$refs.approvalnfor.formVali() |
| | | ]) // |
| | | .then(() => { |
| | | let api = this.basicInfor.state >= 30 ? '/allocation/check' : '/allocation/change' //审批 |
| | | let form = this.basicInfor.state >= 30 ? this.$refs.approvalnfor.form : this.$refs |
| | | .rectificationInfor.form |
| | | let data = { |
| | | allocationId: this.basicInfor.allocationId, |
| | | ...form, |
| | | state: this.basicInfor.state === 20 ? 30 : 40, |
| | | } |
| | | this.$http.httpPost(api, data).then(res => { |
| | | this.close() |
| | | }) |
| | | }).catch(err => { |
| | | console.log('提交失败:', err) |
| | | }) |
| | | } |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .mainContent { |
| | | padding-bottom: 38.46rpx; |
| | |
| | | margin-top: 20px; |
| | | margin-bottom: 96.15rpx; |
| | | padding: 0 20px; |
| | | justify-content: center; |
| | | |
| | | .u-button { |
| | | width: 288.46rpx; |
| | | .but { |
| | | width: 50%; |
| | | } |
| | | |
| | | .butRight { |
| | | padding-right: 20px; |
| | | } |
| | | |
| | | .butleft { |
| | | padding-left: 20px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template /> |
| | | |
| | | <script></script> |
| | | |
| | | <style></style> |
| | | <template> |
| | | <view class="newIndex"> |
| | | <uni-nav-bar backgroundColor='#000' color='#fff' statusBar :border='false' fixed :title="title" /> |
| | | <u-loading-page :loading="loading"></u-loading-page> |
| | | <agencyPage v-if="isShow" ref="agencyPage"></agencyPage> |
| | | <myInfor v-if="!isShow"></myInfor> |
| | | <tabBar v-if="showTabBar" @handleChangeTabe='handleChangeTabe' :currIndex='currIndex'></tabBar> |
| | | </view> |
| | | </template> |
| | | <script> |
| | | import agencyPage from '@/pages/actionChange/agencyPage/index.vue' |
| | | import myInfor from '@/pages/actionChange/myInfor/index.vue' |
| | | import tabBar from '@/pages/actionChange/components/commonUserTabBar.vue' |
| | | export default { |
| | | data() { |
| | | return { |
| | | isShow: true, |
| | | loading: true, |
| | | showTabBar: true, |
| | | token: '', |
| | | currIndex: '0', |
| | | title: '首页' |
| | | } |
| | | }, |
| | | components: { |
| | | agencyPage, |
| | | myInfor, |
| | | tabBar |
| | | }, |
| | | onLoad(option) {}, |
| | | onReady() {}, |
| | | onShow() { |
| | | this.currIndex = '0' |
| | | this.showTabBar = true |
| | | }, |
| | | async mounted() { |
| | | //等待登录成功 |
| | | await this.$onLaunched |
| | | this.token = uni.getStorageSync('tonken') |
| | | console.log('indextoken', this.token) |
| | | this.loading = false |
| | | this.getData() |
| | | uni.$on('currIndex', data => { |
| | | console.log('currIndexOn', data) |
| | | this.currIndex = data.data.index |
| | | this.showTabBar = data.data.showTabBar |
| | | this.$refs.agencyPage.getContaminateList() |
| | | }) |
| | | }, |
| | | methods: { |
| | | getData() { |
| | | console.log('indextokengetContaminateList') |
| | | this.$refs.agencyPage.getContaminateList() |
| | | }, |
| | | handleChangeTabe(index) { |
| | | if (index === 2) { |
| | | this.isShow = false |
| | | this.title = '我的' |
| | | } |
| | | if (index === 0) { |
| | | this.isShow = true |
| | | this.$nextTick(() => { |
| | | this.getData() |
| | | }) |
| | | } |
| | | if (index === 1) { |
| | | uni.navigateTo({ |
| | | url: '/pages/actionChange/newPage/index' |
| | | }) |
| | | this.showTabBar = false |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style></style> |
| | |
| | | </u-form> |
| | | </view> |
| | | <view class="loginContent"> |
| | | <p> |
| | | <!-- <p> |
| | | <navigator style="display: inline-block;" url="/pages/login/register/register"> |
| | | <text style="text-decoration: underline">立即注册</text> |
| | | </navigator> |
| | | </p> |
| | | </p> --> |
| | | <u-button @click="submit">登录</u-button> |
| | | </view> |
| | | </view> |
| | |
| | | <script> |
| | | import { |
| | | login, |
| | | getUserInfor, |
| | | getDic |
| | | } from '@/utils/login.js' // 配置文件 |
| | | import { |
| | | httpPost, |
| | | httpGet |
| | | } from '@/utils/http.js' |
| | | import store from '@/store/index.js' |
| | | export default { |
| | | data() { |
| | | return { |
| | | labelStyle: { |
| | | color: '#fff' |
| | | }, |
| | | title: '设置头像', |
| | | passwordIcon: false, |
| | | form: { |
| | | account: '', |
| | |
| | | //onReady 为uni-app支持的生命周期之一 |
| | | this.$refs.uForm.setRules(this.rules) |
| | | }, |
| | | async onLoad(option) { |
| | | //等待登录成功 |
| | | await this.$onLaunched |
| | | // 后续业务逻辑 |
| | | }, |
| | | async onShow() { |
| | | uni.hideHomeButton() |
| | | }, |
| | | methods: { |
| | | submit() { |
| | | this.$refs.uForm.validate().then(res => { |
| | | this.getlogin() |
| | | }).catch(errors => { |
| | | uni.$u.toast('校验失败') |
| | | }) |
| | | }).catch(errors => {}) |
| | | }, |
| | | //登录 |
| | | getlogin() { |
| | | let openId = this.$storage.get('openId') |
| | | const value = uni.getStorageSync('openId') |
| | | console.log('openId', value) |
| | | if (value) { |
| | | this.logining(value) |
| | | console.log('openId', openId) |
| | | } |
| | | }, |
| | | logining(openId) { |
| | | login({ |
| | | ...this.form, |
| | | openId |
| | | }).then(response => { |
| | | this.$storage.set('token', response.data.token) |
| | | uni.setStorageSync('userInfor', JSON.stringify(response.data)) |
| | | uni.setStorageSync('tonken', response.data.token) |
| | | getDic() |
| | | getUserInfor(response.data.token) |
| | | uni.hideLoading() |
| | | uni.switchTab({ |
| | | url: '/pages/actionChange/agencyPage/index', |
| | | uni.navigateTo({ |
| | | url: '/pages/index/index', |
| | | }) |
| | | // this.$storage.setJson("accountInFor", this.form); |
| | | // console.log('this.$store', this.$store) |
| | | // this.$store.commit('token', token) |
| | | }).catch(errors => { |
| | | uni.showToast({ |
| | | title: errors, |
| | | icon: 'none', |
| | | }) |
| | | }) |
| | | }, |
| | | } |
| | | }, |
| | | } |
| | | </script> |
| | |
| | | import Vue from 'vue' |
| | | import Vuex from 'vuex' |
| | | import modules from './modules/index.js' |
| | | Vue.use(Vuex) |
| | | |
| | | const store = new Vuex.Store(modules) |
| | | export default store |
| | | const store = new Vuex.Store({ |
| | | state: { |
| | | userInfor: {}, |
| | | tonken: '', |
| | | dictObj: {}, |
| | | dict: null |
| | | }, |
| | | mutations: { |
| | | setUserInfor(state, data) { |
| | | state.userInfor = data |
| | | // 缓存用户信息 |
| | | uni.setStorageSync('userInfor', JSON.stringify(data)) //转换为字符串存储数据 |
| | | }, |
| | | setDictObj(state, data) { |
| | | state.dictObj = data |
| | | // 缓存用户信息 |
| | | uni.setStorageSync('dictObj', JSON.stringify(data)) //转换为字符串存储数据 |
| | | }, |
| | | setDict(state, data) { |
| | | state.dict = data |
| | | // 缓存用户信息 |
| | | uni.setStorageSync('dict', JSON.stringify(data)) //转换为字符串存储数据 |
| | | }, |
| | | setTonken(state, data) { |
| | | state.tonken = data |
| | | // 缓存用户信息 |
| | | uni.setStorageSync('tonken', data) |
| | | }, |
| | | }, |
| | | actions: { |
| | | getUserInfo(context, data) { |
| | | context.commit('userInfor', data) |
| | | } |
| | | }, |
| | | }) |
| | | export default store |
New file |
| | |
| | | ## 2.2.25(2023-10-18) |
| | | - 修复 PC端初次修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737) |
| | | ## 2.2.24(2023-06-02) |
| | | - 修复 部分情况修改时间,开始、结束时间显示异常的Bug [详情](https://ask.dcloud.net.cn/question/171146) |
| | | - 优化 当前月可以选择上月、下月的日期的Bug |
| | | ## 2.2.23(2023-05-02) |
| | | - 修复 部分情况修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737) |
| | | - 修复 部分平台及设备第一次点击无法显示弹框的Bug |
| | | - 修复 ios 日期格式未补零显示及使用异常的Bug [详情](https://ask.dcloud.net.cn/question/162979) |
| | | ## 2.2.22(2023-03-30) |
| | | - 修复 日历 picker 修改年月后,自动选中当月1日的Bug [详情](https://ask.dcloud.net.cn/question/165937) |
| | | - 修复 小程序端 低版本 ios NaN的Bug [详情](https://ask.dcloud.net.cn/question/162979) |
| | | ## 2.2.21(2023-02-20) |
| | | - 修复 firefox 浏览器显示区域点击无法拉起日历弹框的Bug [详情](https://ask.dcloud.net.cn/question/163362) |
| | | ## 2.2.20(2023-02-17) |
| | | - 优化 值为空依然选中当天问题 |
| | | - 优化 提供 default-value 属性支持配置选择器打开时默认显示的时间 |
| | | - 优化 非范围选择未选择日期时间,点击确认按钮选中当前日期时间 |
| | | - 优化 字节小程序日期时间范围选择,底部日期换行的Bug |
| | | ## 2.2.19(2023-02-09) |
| | | - 修复 2.2.18 引起范围选择配置 end 选择无效的Bug [详情](https://github.com/dcloudio/uni-ui/issues/686) |
| | | ## 2.2.18(2023-02-08) |
| | | - 修复 移动端范围选择change事件触发异常的Bug [详情](https://github.com/dcloudio/uni-ui/issues/684) |
| | | - 优化 PC端输入日期格式错误时返回当前日期时间 |
| | | - 优化 PC端输入日期时间超出 start、end 限制的Bug |
| | | - 优化 移动端日期时间范围用法时间展示不完整问题 |
| | | ## 2.2.17(2023-02-04) |
| | | - 修复 小程序端绑定 Date 类型报错的Bug [详情](https://github.com/dcloudio/uni-ui/issues/679) |
| | | - 修复 vue3 time-picker 无法显示绑定时分秒的Bug |
| | | ## 2.2.16(2023-02-02) |
| | | - 修复 字节小程序报错的Bug |
| | | ## 2.2.15(2023-02-02) |
| | | - 修复 某些情况切换月份错误的Bug |
| | | ## 2.2.14(2023-01-30) |
| | | - 修复 某些情况切换月份错误的Bug [详情](https://ask.dcloud.net.cn/question/162033) |
| | | ## 2.2.13(2023-01-10) |
| | | - 修复 多次加载组件造成内存占用的Bug |
| | | ## 2.2.12(2022-12-01) |
| | | - 修复 vue3 下 i18n 国际化初始值不正确的Bug |
| | | ## 2.2.11(2022-09-19) |
| | | - 修复 支付宝小程序样式错乱的Bug [详情](https://github.com/dcloudio/uni-app/issues/3861) |
| | | ## 2.2.10(2022-09-19) |
| | | - 修复 反向选择日期范围,日期显示异常的Bug [详情](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) |
| | | ## 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/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 适配 |
New file |
| | |
| | | <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--today': weeks.isToday}"></view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | props: { |
| | | weeks: { |
| | | type: Object, |
| | | default () { |
| | | return {} |
| | | } |
| | | }, |
| | | calendar: { |
| | | type: Object, |
| | | default: () => { |
| | | return {} |
| | | } |
| | | }, |
| | | selected: { |
| | | type: Array, |
| | | default: () => { |
| | | return [] |
| | | } |
| | | }, |
| | | 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-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 { |
| | | cursor: default; |
| | | } |
| | | |
| | | .uni-calendar-item--disable .uni-calendar-item__weeks-box-text-disable { |
| | | color: #D1D1D1; |
| | | } |
| | | |
| | | .uni-calendar-item--today { |
| | | 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> |
New file |
| | |
| | | <template> |
| | | <view class="uni-calendar" @mouseleave="leaveCale"> |
| | | |
| | | <view v-if="!insert && show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" |
| | | @click="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 class="uni-calendar__header-btn-box" @click.stop="changeMonth('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 class="uni-calendar__header-btn-box" @click.stop="changeMonth('next')"> |
| | | <view class="uni-calendar__header-btn uni-calendar--right"></view> |
| | | </view> |
| | | |
| | | <view v-if="!insert" class="dialog-close" @click="close"> |
| | | <view class="dialog-close-plus" data-id="close"></view> |
| | | <view class="dialog-close-plus dialog-close-rotate" data-id="close"></view> |
| | | </view> |
| | | </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" :checkHover="range" @change="choiceDate" |
| | | @handleMouse="handleMouse"> |
| | | </calendar-item> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-if="!insert && !range && hasTime" 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="timepickerStartTime" :end="timepickerEndTime" v-model="time" |
| | | :disabled="!tempSingleDate" :border="false" :hide-second="hideSecond" class="time-picker-style"> |
| | | </time-picker> |
| | | </view> |
| | | |
| | | <view v-if="!insert && range && hasTime" 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="timepickerStartTime" 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="timepickerEndTime" 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-datetime-picker--btn" @click="confirm">{{confirmText}}</view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { Calendar, getDate, getTime } from './util.js'; |
| | | import calendarItem from './calendar-item.vue' |
| | | import timePicker from './time-picker.vue' |
| | | |
| | | import { initVueI18n } from '@dcloudio/uni-i18n' |
| | | import i18nMessages from './i18n/index.js' |
| | | const { t } = initVueI18n(i18nMessages) |
| | | |
| | | /** |
| | | * Calendar 日历 |
| | | * @description 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等 |
| | | * @tutorial https://ext.dcloud.net.cn/plugin?id=56 |
| | | * @property {String} date 自定义当前时间,默认为今天 |
| | | * @property {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 是否选择月份为背景 |
| | | * @property {[String} defaultValue 选择器打开时默认显示的时间 |
| | | * @event {Function} change 日期改变,`insert :ture` 时生效 |
| | | * @event {Function} confirm 确认选择`insert :false` 时生效 |
| | | * @event {Function} monthSwitch 切换月份时触发 |
| | | * @example <uni-calendar :insert="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 [] |
| | | } |
| | | }, |
| | | startDate: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | endDate: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | startPlaceholder: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | endPlaceholder: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | range: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | hasTime: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | insert: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | showMonth: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | clearDate: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | checkHover: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | hideSecond: { |
| | | type: [Boolean], |
| | | default: false |
| | | }, |
| | | pleStatus: { |
| | | type: Object, |
| | | default () { |
| | | return { |
| | | before: '', |
| | | after: '', |
| | | data: [], |
| | | fulldate: '' |
| | | } |
| | | } |
| | | }, |
| | | defaultValue: { |
| | | type: [String, Object, Array], |
| | | default: '' |
| | | } |
| | | }, |
| | | 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) { |
| | | if (!this.range) { |
| | | this.tempSingleDate = newVal |
| | | setTimeout(() => { |
| | | this.init(newVal) |
| | | }, 100) |
| | | } |
| | | } |
| | | }, |
| | | defTime: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | if (!this.range) { |
| | | this.time = newVal |
| | | } else { |
| | | this.timeRange.startTime = newVal.start |
| | | this.timeRange.endTime = newVal.end |
| | | } |
| | | } |
| | | }, |
| | | startDate(val) { |
| | | // 字节小程序 watch 早于 created |
| | | if(!this.cale){ |
| | | return |
| | | } |
| | | this.cale.setStartDate(val) |
| | | this.cale.setDate(this.nowDate.fullDate) |
| | | this.weeks = this.cale.weeks |
| | | }, |
| | | endDate(val) { |
| | | // 字节小程序 watch 早于 created |
| | | if(!this.cale){ |
| | | return |
| | | } |
| | | this.cale.setEndDate(val) |
| | | this.cale.setDate(this.nowDate.fullDate) |
| | | this.weeks = this.cale.weeks |
| | | }, |
| | | selected(newVal) { |
| | | // 字节小程序 watch 早于 created |
| | | if(!this.cale){ |
| | | return |
| | | } |
| | | this.cale.setSelectInfo(this.nowDate.fullDate, newVal) |
| | | this.weeks = this.cale.weeks |
| | | }, |
| | | pleStatus: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | 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 { |
| | | // 字节小程序 watch 早于 created |
| | | if(!this.cale){ |
| | | return |
| | | } |
| | | |
| | | this.cale.setDefaultMultiple(before, after) |
| | | if (which === 'left' && before) { |
| | | this.setDate(before) |
| | | this.weeks = this.cale.weeks |
| | | } else if(after) { |
| | | this.setDate(after) |
| | | this.weeks = this.cale.weeks |
| | | } |
| | | this.cale.lastHover = true |
| | | } |
| | | }, 16) |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | timepickerStartTime() { |
| | | const activeDate = this.range ? this.tempRange.before : this.calendar.fullDate |
| | | return activeDate === this.startDate ? this.selectableTimes.start : '' |
| | | }, |
| | | timepickerEndTime() { |
| | | const activeDate = this.range ? this.tempRange.after : this.calendar.fullDate |
| | | return activeDate === this.endDate ? this.selectableTimes.end : '' |
| | | }, |
| | | /** |
| | | * 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({ |
| | | selected: this.selected, |
| | | startDate: this.startDate, |
| | | endDate: this.endDate, |
| | | range: this.range, |
| | | }) |
| | | // 选中某一天 |
| | | this.init(this.date) |
| | | }, |
| | | 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 |
| | | }, |
| | | // 蒙版点击事件 |
| | | maskClick() { |
| | | this.close() |
| | | 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(new Date()) |
| | | }, |
| | | |
| | | bindDateChange(e) { |
| | | const value = e.detail.value + '-1' |
| | | this.setDate(value) |
| | | }, |
| | | /** |
| | | * 初始化日期显示 |
| | | * @param {Object} date |
| | | */ |
| | | init(date) { |
| | | // 字节小程序 watch 早于 created |
| | | if(!this.cale){ |
| | | return |
| | | } |
| | | this.cale.setDate(date || new Date()) |
| | | this.weeks = this.cale.weeks |
| | | this.nowDate = this.cale.getInfo(date) |
| | | this.calendar = {...this.nowDate} |
| | | if(!date){ |
| | | // 优化date为空默认不选中今天 |
| | | this.calendar.fullDate = '' |
| | | if(this.defaultValue && !this.range){ |
| | | // 暂时只支持移动端非范围选择 |
| | | const defaultDate = new Date(this.defaultValue) |
| | | const fullDate = getDate(defaultDate) |
| | | const year = defaultDate.getFullYear() |
| | | const month = defaultDate.getMonth()+1 |
| | | const date = defaultDate.getDate() |
| | | const day = defaultDate.getDay() |
| | | this.calendar = { |
| | | fullDate, |
| | | year, |
| | | month, |
| | | date, |
| | | day |
| | | }, |
| | | this.tempSingleDate = fullDate |
| | | this.time = getTime(defaultDate, this.hideSecond) |
| | | } |
| | | } |
| | | }, |
| | | /** |
| | | * 打开日历弹窗 |
| | | */ |
| | | open() { |
| | | // 弹窗模式并且清理数据 |
| | | if (this.clearDate && !this.insert) { |
| | | this.cale.cleanMultipleStatus() |
| | | 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) { |
| | | if(!this.range){ |
| | | if(!this.calendar.fullDate){ |
| | | this.calendar = this.cale.getInfo(new Date()) |
| | | this.tempSingleDate = this.calendar.fullDate |
| | | } |
| | | if(this.hasTime && !this.time) { |
| | | this.time = getTime(new Date(), this.hideSecond) |
| | | } |
| | | } |
| | | let { |
| | | year, |
| | | month, |
| | | date, |
| | | fullDate, |
| | | extraInfo |
| | | } = this.calendar |
| | | this.$emit(name, { |
| | | range: this.cale.multipleStatus, |
| | | year, |
| | | month, |
| | | date, |
| | | time: this.time, |
| | | timeRange: this.timeRange, |
| | | fulldate: fullDate, |
| | | 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 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() |
| | | }, |
| | | changeMonth(type) { |
| | | let newDate |
| | | if(type === 'pre') { |
| | | newDate = this.cale.getPreMonthObj(this.nowDate.fullDate).fullDate |
| | | } else if(type === 'next') { |
| | | newDate = this.cale.getNextMonthObj(this.nowDate.fullDate).fullDate |
| | | } |
| | | |
| | | this.setDate(newDate) |
| | | 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; |
| | | /* #ifdef MP-TOUTIAO */ |
| | | font-size: 16px; |
| | | /* #endif */ |
| | | 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> |
New file |
| | |
| | | { |
| | | "uni-datetime-picker.selectDate": "select date", |
| | | "uni-datetime-picker.selectTime": "select time", |
| | | "uni-datetime-picker.selectDateTime": "select date and time", |
| | | "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" |
| | | } |
New file |
| | |
| | | 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 |
| | | } |
New file |
| | |
| | | { |
| | | "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": "确认" |
| | | } |
New file |
| | |
| | | { |
| | | "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": "確認" |
| | | } |
New file |
| | |
| | | <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> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { initVueI18n } from '@dcloudio/uni-i18n' |
| | | import i18nMessages from './i18n/index.js' |
| | | const { t } = initVueI18n(i18nMessages) |
| | | import { fixIosDateFormat } from './util' |
| | | |
| | | /** |
| | | * 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', |
| | | 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) { |
| | | if (newVal) { |
| | | this.parseValue(fixIosDateFormat(newVal)) |
| | | this.initTime(false) |
| | | } else { |
| | | this.time = '' |
| | | this.parseValue(Date.now()) |
| | | } |
| | | }, |
| | | immediate: true |
| | | }, |
| | | // #endif |
| | | // #ifdef VUE3 |
| | | modelValue: { |
| | | handler(newVal) { |
| | | if (newVal) { |
| | | this.parseValue(fixIosDateFormat(newVal)) |
| | | 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(fixIosDateFormat(newVal), 'start') |
| | | }, |
| | | immediate: true |
| | | }, |
| | | end: { |
| | | handler(newVal) { |
| | | this.parseDatetimeRange(fixIosDateFormat(newVal), 'end') |
| | | }, |
| | | 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)) { |
| | | 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)) { |
| | | 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 = fixIosDateFormat(this.time) |
| | | 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> |
New file |
| | |
| | | <template> |
| | | <view class="uni-date"> |
| | | <view class="uni-date-editor" @click="show"> |
| | | <slot> |
| | | <view |
| | | class="uni-date-editor--x" |
| | | :class="{'uni-date-editor--x__disabled': disabled,'uni-date-x--border': border}" |
| | | > |
| | | <view v-if="!isRange" class="uni-date-x uni-date-single"> |
| | | <uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons> |
| | | <view class="uni-date__x-input">{{ displayValue || singlePlaceholderText }}</view> |
| | | </view> |
| | | |
| | | <view v-else class="uni-date-x uni-date-range"> |
| | | <uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons> |
| | | <view class="uni-date__x-input text-center">{{ displayRangeValue.startDate || startPlaceholderText }}</view> |
| | | |
| | | <view class="range-separator">{{rangeSeparator}}</view> |
| | | |
| | | <view class="uni-date__x-input text-center">{{ displayRangeValue.endDate || endPlaceholderText }}</view> |
| | | </view> |
| | | |
| | | <view v-if="showClearIcon" class="uni-date__icon-clear" @click.stop="clear"> |
| | | <uni-icons type="clear" color="#c0c4cc" size="22"></uni-icons> |
| | | </view> |
| | | </view> |
| | | </slot> |
| | | </view> |
| | | |
| | | <view v-show="pickerVisible" class="uni-date-mask--pc" @click="close"></view> |
| | | |
| | | <view v-if="!isPhone" v-show="pickerVisible" ref="datePicker" class="uni-date-picker__container"> |
| | | <view v-if="!isRange" class="uni-date-single--x" :style="pickerPositionStyle"> |
| | | <view class="uni-popper__arrow"></view> |
| | | |
| | | <view v-if="hasTime" class="uni-date-changed popup-x-header"> |
| | | <input class="uni-date__input text-center" type="text" v-model="inputDate" |
| | | :placeholder="selectDateText" /> |
| | | |
| | | <time-picker type="time" v-model="pickerTime" :border="false" :disabled="!inputDate" |
| | | :start="timepickerStartTime" :end="timepickerEndTime" :hideSecond="hideSecond" style="width: 100%;"> |
| | | <input class="uni-date__input text-center" type="text" v-model="pickerTime" :placeholder="selectTimeText" |
| | | :disabled="!inputDate" /> |
| | | </time-picker> |
| | | </view> |
| | | |
| | | <Calendar ref="pcSingle" :showMonth="false" :start-date="calendarRange.startDate" |
| | | :end-date="calendarRange.endDate" :date="calendarDate" @change="singleChange" |
| | | :default-value="defaultValue" |
| | | style="padding: 0 8px;" /> |
| | | |
| | | <view v-if="hasTime" class="popup-x-footer"> |
| | | <text class="confirm-text" @click="confirmSingleChange">{{okText}}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-else class="uni-date-range--x" :style="pickerPositionStyle"> |
| | | <view class="uni-popper__arrow"></view> |
| | | <view v-if="hasTime" class="popup-x-header uni-date-changed"> |
| | | <view class="popup-x-header--datetime"> |
| | | <input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startDate" |
| | | :placeholder="startDateText" /> |
| | | |
| | | <time-picker type="time" v-model="tempRange.startTime" :start="timepickerStartTime" :border="false" |
| | | :disabled="!tempRange.startDate" :hideSecond="hideSecond"> |
| | | <input class="uni-date__input uni-date-range__input" type="text" |
| | | v-model="tempRange.startTime" :placeholder="startTimeText" |
| | | :disabled="!tempRange.startDate" /> |
| | | </time-picker> |
| | | </view> |
| | | |
| | | <uni-icons type="arrowthinright" color="#999" style="line-height: 40px;"></uni-icons> |
| | | |
| | | <view class="popup-x-header--datetime"> |
| | | <input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endDate" |
| | | :placeholder="endDateText" /> |
| | | |
| | | <time-picker type="time" v-model="tempRange.endTime" :end="timepickerEndTime" :border="false" |
| | | :disabled="!tempRange.endDate" :hideSecond="hideSecond"> |
| | | <input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endTime" |
| | | :placeholder="endTimeText" :disabled="!tempRange.endDate" /> |
| | | </time-picker> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="popup-x-body"> |
| | | <Calendar ref="left" :showMonth="false" :start-date="calendarRange.startDate" |
| | | :end-date="calendarRange.endDate" :range="true" :pleStatus="endMultipleStatus" |
| | | @change="leftChange" @firstEnterCale="updateRightCale" style="padding: 0 8px;" /> |
| | | <Calendar ref="right" :showMonth="false" :start-date="calendarRange.startDate" |
| | | :end-date="calendarRange.endDate" :range="true" @change="rightChange" |
| | | :pleStatus="startMultipleStatus" @firstEnterCale="updateLeftCale" |
| | | style="padding: 0 8px;border-left: 1px solid #F1F1F1;" /> |
| | | </view> |
| | | |
| | | <view v-if="hasTime" class="popup-x-footer"> |
| | | <text @click="clear">{{clearText}}</text> |
| | | <text class="confirm-text" @click="confirmRangeChange">{{okText}}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <Calendar v-if="isPhone" ref="mobile" :clearDate="false" :date="calendarDate" :defTime="mobileCalendarTime" |
| | | :start-date="calendarRange.startDate" :end-date="calendarRange.endDate" :selectableTimes="mobSelectableTime" |
| | | :startPlaceholder="startPlaceholder" :endPlaceholder="endPlaceholder" |
| | | :default-value="defaultValue" |
| | | :pleStatus="endMultipleStatus" :showMonth="false" :range="isRange" :hasTime="hasTime" :insert="false" |
| | | :hideSecond="hideSecond" @confirm="mobileChange" @maskClose="close" /> |
| | | </view> |
| | | </template> |
| | | <script> |
| | | /** |
| | | * DatetimePicker 时间选择器 |
| | | * @description 同时支持 PC 和移动端使用日历选择日期和日期范围 |
| | | * @tutorial https://ext.dcloud.net.cn/plugin?id=3962 |
| | | * @property {String} type 选择器类型 |
| | | * @property {String|Number|Array|Date} value 绑定值 |
| | | * @property {String} placeholder 单选择时的占位内容 |
| | | * @property {String} start 起始时间 |
| | | * @property {String} end 终止时间 |
| | | * @property {String} start-placeholder 范围选择时开始日期的占位内容 |
| | | * @property {String} end-placeholder 范围选择时结束日期的占位内容 |
| | | * @property {String} range-separator 选择范围时的分隔符 |
| | | * @property {Boolean} border = [true|false] 是否有边框 |
| | | * @property {Boolean} disabled = [true|false] 是否禁用 |
| | | * @property {Boolean} clearIcon = [true|false] 是否显示清除按钮(仅PC端适用) |
| | | * @property {[String} defaultValue 选择器打开时默认显示的时间 |
| | | * @event {Function} change 确定日期时触发的事件 |
| | | * @event {Function} maskClick 点击遮罩层触发的事件 |
| | | * @event {Function} show 打开弹出层 |
| | | * @event {Function} close 关闭弹出层 |
| | | * @event {Function} clear 清除上次选中的状态和值 |
| | | **/ |
| | | import Calendar from './calendar.vue' |
| | | import TimePicker from './time-picker.vue' |
| | | import { initVueI18n } from '@dcloudio/uni-i18n' |
| | | import i18nMessages from './i18n/index.js' |
| | | import { getDateTime, getDate, getTime, getDefaultSecond, dateCompare, checkDate, fixIosDateFormat } from './util' |
| | | |
| | | export default { |
| | | name: 'UniDatetimePicker', |
| | | options: { |
| | | virtualHost: true |
| | | }, |
| | | components: { |
| | | Calendar, |
| | | TimePicker |
| | | }, |
| | | data() { |
| | | return { |
| | | isRange: false, |
| | | hasTime: false, |
| | | displayValue: '', |
| | | inputDate: '', |
| | | calendarDate: '', |
| | | pickerTime: '', |
| | | calendarRange: { |
| | | startDate: '', |
| | | startTime: '', |
| | | endDate: '', |
| | | endTime: '' |
| | | }, |
| | | displayRangeValue: { |
| | | startDate: '', |
| | | endDate: '', |
| | | }, |
| | | tempRange: { |
| | | startDate: '', |
| | | startTime: '', |
| | | endDate: '', |
| | | endTime: '' |
| | | }, |
| | | // 左右日历同步数据 |
| | | startMultipleStatus: { |
| | | before: '', |
| | | after: '', |
| | | data: [], |
| | | fulldate: '' |
| | | }, |
| | | endMultipleStatus: { |
| | | before: '', |
| | | after: '', |
| | | data: [], |
| | | fulldate: '' |
| | | }, |
| | | pickerVisible: false, |
| | | pickerPositionStyle: null, |
| | | isEmitValue: false, |
| | | isPhone: false, |
| | | isFirstShow: true, |
| | | i18nT: () => {} |
| | | } |
| | | }, |
| | | props: { |
| | | type: { |
| | | type: String, |
| | | default: 'datetime' |
| | | }, |
| | | value: { |
| | | type: [String, Number, Array, Date], |
| | | default: '' |
| | | }, |
| | | modelValue: { |
| | | type: [String, Number, Array, Date], |
| | | default: '' |
| | | }, |
| | | start: { |
| | | type: [Number, String], |
| | | default: '' |
| | | }, |
| | | end: { |
| | | type: [Number, String], |
| | | default: '' |
| | | }, |
| | | returnType: { |
| | | type: String, |
| | | default: 'string' |
| | | }, |
| | | placeholder: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | startPlaceholder: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | endPlaceholder: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | rangeSeparator: { |
| | | type: String, |
| | | default: '-' |
| | | }, |
| | | border: { |
| | | type: [Boolean], |
| | | default: true |
| | | }, |
| | | disabled: { |
| | | type: [Boolean], |
| | | default: false |
| | | }, |
| | | clearIcon: { |
| | | type: [Boolean], |
| | | default: true |
| | | }, |
| | | hideSecond: { |
| | | type: [Boolean], |
| | | default: false |
| | | }, |
| | | defaultValue: { |
| | | type: [String, Object, Array], |
| | | default: '' |
| | | } |
| | | }, |
| | | watch: { |
| | | type: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | this.hasTime = newVal.indexOf('time') !== -1 |
| | | this.isRange = newVal.indexOf('range') !== -1 |
| | | } |
| | | }, |
| | | // #ifndef VUE3 |
| | | value: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | if (this.isEmitValue) { |
| | | this.isEmitValue = false |
| | | return |
| | | } |
| | | this.initPicker(newVal) |
| | | } |
| | | }, |
| | | // #endif |
| | | // #ifdef VUE3 |
| | | modelValue: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | if (this.isEmitValue) { |
| | | this.isEmitValue = false |
| | | return |
| | | } |
| | | this.initPicker(newVal) |
| | | } |
| | | }, |
| | | // #endif |
| | | start: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | if (!newVal) return |
| | | this.calendarRange.startDate = getDate(newVal) |
| | | if (this.hasTime) { |
| | | this.calendarRange.startTime = getTime(newVal) |
| | | } |
| | | } |
| | | }, |
| | | end: { |
| | | immediate: true, |
| | | handler(newVal) { |
| | | if (!newVal) return |
| | | this.calendarRange.endDate = getDate(newVal) |
| | | if (this.hasTime) { |
| | | this.calendarRange.endTime = getTime(newVal, this.hideSecond) |
| | | } |
| | | } |
| | | }, |
| | | }, |
| | | computed: { |
| | | timepickerStartTime() { |
| | | const activeDate = this.isRange ? this.tempRange.startDate : this.inputDate |
| | | return activeDate === this.calendarRange.startDate ? this.calendarRange.startTime : '' |
| | | }, |
| | | timepickerEndTime() { |
| | | const activeDate = this.isRange ? this.tempRange.endDate : this.inputDate |
| | | return activeDate === this.calendarRange.endDate ? this.calendarRange.endTime : '' |
| | | }, |
| | | mobileCalendarTime() { |
| | | const timeRange = { |
| | | start: this.tempRange.startTime, |
| | | end: this.tempRange.endTime |
| | | } |
| | | return this.isRange ? timeRange : this.pickerTime |
| | | }, |
| | | mobSelectableTime() { |
| | | return { |
| | | start: this.calendarRange.startTime, |
| | | end: this.calendarRange.endTime |
| | | } |
| | | }, |
| | | datePopupWidth() { |
| | | // todo |
| | | return this.isRange ? 653 : 301 |
| | | }, |
| | | |
| | | /** |
| | | * for i18n |
| | | */ |
| | | singlePlaceholderText() { |
| | | return this.placeholder || (this.type === 'date' ? this.selectDateText : this.selectDateTimeText) |
| | | }, |
| | | startPlaceholderText() { |
| | | return this.startPlaceholder || this.startDateText |
| | | }, |
| | | endPlaceholderText() { |
| | | return this.endPlaceholder || this.endDateText |
| | | }, |
| | | selectDateText() { |
| | | return this.i18nT("uni-datetime-picker.selectDate") |
| | | }, |
| | | selectDateTimeText() { |
| | | return this.i18nT("uni-datetime-picker.selectDateTime") |
| | | }, |
| | | selectTimeText() { |
| | | return this.i18nT("uni-datetime-picker.selectTime") |
| | | }, |
| | | startDateText() { |
| | | return this.startPlaceholder || this.i18nT("uni-datetime-picker.startDate") |
| | | }, |
| | | startTimeText() { |
| | | return this.i18nT("uni-datetime-picker.startTime") |
| | | }, |
| | | endDateText() { |
| | | return this.endPlaceholder || this.i18nT("uni-datetime-picker.endDate") |
| | | }, |
| | | endTimeText() { |
| | | return this.i18nT("uni-datetime-picker.endTime") |
| | | }, |
| | | okText() { |
| | | return this.i18nT("uni-datetime-picker.ok") |
| | | }, |
| | | clearText() { |
| | | return this.i18nT("uni-datetime-picker.clear") |
| | | }, |
| | | showClearIcon() { |
| | | return this.clearIcon && !this.disabled && (this.displayValue || (this.displayRangeValue.startDate && this.displayRangeValue.endDate)) |
| | | } |
| | | }, |
| | | created() { |
| | | this.initI18nT() |
| | | this.platform() |
| | | }, |
| | | methods: { |
| | | initI18nT() { |
| | | const vueI18n = initVueI18n(i18nMessages) |
| | | this.i18nT = vueI18n.t |
| | | }, |
| | | initPicker(newVal) { |
| | | if ((!newVal && !this.defaultValue) || Array.isArray(newVal) && !newVal.length) { |
| | | this.$nextTick(() => { |
| | | this.clear(false) |
| | | }) |
| | | return |
| | | } |
| | | |
| | | if (!Array.isArray(newVal) && !this.isRange) { |
| | | if(newVal){ |
| | | this.displayValue = this.inputDate = this.calendarDate = getDate(newVal) |
| | | if (this.hasTime) { |
| | | this.pickerTime = getTime(newVal, this.hideSecond) |
| | | this.displayValue = `${this.displayValue} ${this.pickerTime}` |
| | | } |
| | | }else if(this.defaultValue){ |
| | | this.inputDate = this.calendarDate = getDate(this.defaultValue) |
| | | if(this.hasTime){ |
| | | this.pickerTime = getTime(this.defaultValue, this.hideSecond) |
| | | } |
| | | } |
| | | } else { |
| | | const [before, after] = newVal |
| | | if (!before && !after) return |
| | | const beforeDate = getDate(before) |
| | | const beforeTime = getTime(before, this.hideSecond) |
| | | |
| | | const afterDate = getDate(after) |
| | | const afterTime = getTime(after, this.hideSecond) |
| | | const startDate = beforeDate |
| | | const endDate = afterDate |
| | | this.displayRangeValue.startDate = this.tempRange.startDate = startDate |
| | | this.displayRangeValue.endDate = this.tempRange.endDate = endDate |
| | | |
| | | if (this.hasTime) { |
| | | this.displayRangeValue.startDate = `${beforeDate} ${beforeTime}` |
| | | this.displayRangeValue.endDate = `${afterDate} ${afterTime}` |
| | | this.tempRange.startTime = beforeTime |
| | | this.tempRange.endTime = afterTime |
| | | } |
| | | const defaultRange = { |
| | | before: beforeDate, |
| | | after: afterDate |
| | | } |
| | | this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, defaultRange, { |
| | | which: 'right' |
| | | }) |
| | | this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, defaultRange, { |
| | | which: 'left' |
| | | }) |
| | | } |
| | | }, |
| | | updateLeftCale(e) { |
| | | const left = this.$refs.left |
| | | // 设置范围选 |
| | | left.cale.setHoverMultiple(e.after) |
| | | left.setDate(this.$refs.left.nowDate.fullDate) |
| | | }, |
| | | updateRightCale(e) { |
| | | const right = this.$refs.right |
| | | // 设置范围选 |
| | | right.cale.setHoverMultiple(e.after) |
| | | right.setDate(this.$refs.right.nowDate.fullDate) |
| | | }, |
| | | platform() { |
| | | if(typeof navigator !== "undefined"){ |
| | | this.isPhone = navigator.userAgent.toLowerCase().indexOf('mobile') !== -1 |
| | | return |
| | | } |
| | | const { windowWidth } = uni.getSystemInfoSync() |
| | | this.isPhone = windowWidth <= 500 |
| | | this.windowWidth = windowWidth |
| | | }, |
| | | show() { |
| | | if (this.disabled) { |
| | | return |
| | | } |
| | | this.platform() |
| | | if (this.isPhone) { |
| | | setTimeout(() => { |
| | | this.$refs.mobile.open() |
| | | }, 0); |
| | | return |
| | | } |
| | | this.pickerPositionStyle = { |
| | | top: '10px' |
| | | } |
| | | const dateEditor = uni.createSelectorQuery().in(this).select(".uni-date-editor") |
| | | dateEditor.boundingClientRect(rect => { |
| | | if (this.windowWidth - rect.left < this.datePopupWidth) { |
| | | this.pickerPositionStyle.right = 0 |
| | | } |
| | | }).exec() |
| | | setTimeout(() => { |
| | | this.pickerVisible = !this.pickerVisible |
| | | if (!this.isPhone && this.isRange && this.isFirstShow) { |
| | | this.isFirstShow = false |
| | | const { |
| | | startDate, |
| | | endDate |
| | | } = this.calendarRange |
| | | if (startDate && endDate) { |
| | | if (this.diffDate(startDate, endDate) < 30) { |
| | | this.$refs.right.changeMonth('pre') |
| | | } |
| | | } else { |
| | | this.$refs.right.changeMonth('next') |
| | | if(this.isPhone){ |
| | | this.$refs.right.cale.lastHover = false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | }, 50) |
| | | }, |
| | | close() { |
| | | setTimeout(() => { |
| | | this.pickerVisible = false |
| | | this.$emit('maskClick', this.value) |
| | | this.$refs.mobile && this.$refs.mobile.close() |
| | | }, 20) |
| | | }, |
| | | setEmit(value) { |
| | | if (this.returnType === "timestamp" || this.returnType === "date") { |
| | | if (!Array.isArray(value)) { |
| | | if (!this.hasTime) { |
| | | value = value + ' ' + '00:00:00' |
| | | } |
| | | value = this.createTimestamp(value) |
| | | if (this.returnType === "date") { |
| | | value = new Date(value) |
| | | } |
| | | } else { |
| | | if (!this.hasTime) { |
| | | value[0] = value[0] + ' ' + '00:00:00' |
| | | value[1] = value[1] + ' ' + '00:00:00' |
| | | } |
| | | value[0] = this.createTimestamp(value[0]) |
| | | value[1] = this.createTimestamp(value[1]) |
| | | if (this.returnType === "date") { |
| | | value[0] = new Date(value[0]) |
| | | value[1] = new Date(value[1]) |
| | | } |
| | | } |
| | | } |
| | | |
| | | this.$emit('update:modelValue', value) |
| | | this.$emit('input', value) |
| | | this.$emit('change', value) |
| | | this.isEmitValue = true |
| | | }, |
| | | createTimestamp(date) { |
| | | date = fixIosDateFormat(date) |
| | | return Date.parse(new Date(date)) |
| | | }, |
| | | singleChange(e) { |
| | | this.calendarDate = this.inputDate = e.fulldate |
| | | if (this.hasTime) return |
| | | this.confirmSingleChange() |
| | | }, |
| | | confirmSingleChange() { |
| | | if(!checkDate(this.inputDate)){ |
| | | const now = new Date() |
| | | this.calendarDate = this.inputDate = getDate(now) |
| | | this.pickerTime = getTime(now, this.hideSecond) |
| | | } |
| | | |
| | | let startLaterInputDate = false |
| | | let startDate, startTime |
| | | if(this.start) { |
| | | let startString = this.start |
| | | if(typeof this.start === 'number'){ |
| | | startString = getDateTime(this.start, this.hideSecond) |
| | | } |
| | | [startDate, startTime] = startString.split(' ') |
| | | if(this.start && !dateCompare(startDate, this.inputDate)) { |
| | | startLaterInputDate = true |
| | | this.inputDate = startDate |
| | | } |
| | | } |
| | | |
| | | let endEarlierInputDate = false |
| | | let endDate, endTime |
| | | if(this.end) { |
| | | let endString = this.end |
| | | if(typeof this.end === 'number'){ |
| | | endString = getDateTime(this.end, this.hideSecond) |
| | | } |
| | | [endDate, endTime] = endString.split(' ') |
| | | if(this.end && !dateCompare(this.inputDate, endDate)) { |
| | | endEarlierInputDate = true |
| | | this.inputDate = endDate |
| | | } |
| | | } |
| | | if (this.hasTime) { |
| | | if(startLaterInputDate){ |
| | | this.pickerTime = startTime || getDefaultSecond(this.hideSecond) |
| | | } |
| | | if(endEarlierInputDate){ |
| | | this.pickerTime = endTime || getDefaultSecond(this.hideSecond) |
| | | } |
| | | if(!this.pickerTime){ |
| | | this.pickerTime = getTime(Date.now(), this.hideSecond) |
| | | } |
| | | this.displayValue = `${this.inputDate} ${this.pickerTime}` |
| | | } else { |
| | | this.displayValue = this.inputDate |
| | | } |
| | | this.setEmit(this.displayValue) |
| | | this.pickerVisible = false |
| | | }, |
| | | leftChange(e) { |
| | | const { |
| | | before, |
| | | after |
| | | } = e.range |
| | | this.rangeChange(before, after) |
| | | const obj = { |
| | | before: e.range.before, |
| | | after: e.range.after, |
| | | data: e.range.data, |
| | | fulldate: e.fulldate |
| | | } |
| | | this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, obj) |
| | | }, |
| | | rightChange(e) { |
| | | const { |
| | | before, |
| | | after |
| | | } = e.range |
| | | this.rangeChange(before, after) |
| | | const obj = { |
| | | before: e.range.before, |
| | | after: e.range.after, |
| | | data: e.range.data, |
| | | fulldate: e.fulldate |
| | | } |
| | | this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, obj) |
| | | }, |
| | | mobileChange(e) { |
| | | if (this.isRange) { |
| | | const {before, after} = e.range |
| | | |
| | | if(!before || !after){ |
| | | return |
| | | } |
| | | |
| | | this.handleStartAndEnd(before, after, true) |
| | | if (this.hasTime) { |
| | | const { |
| | | startTime, |
| | | endTime |
| | | } = e.timeRange |
| | | this.tempRange.startTime = startTime |
| | | this.tempRange.endTime = endTime |
| | | } |
| | | this.confirmRangeChange() |
| | | } else { |
| | | if (this.hasTime) { |
| | | this.displayValue = e.fulldate + ' ' + e.time |
| | | } else { |
| | | this.displayValue = e.fulldate |
| | | } |
| | | this.setEmit(this.displayValue) |
| | | } |
| | | this.$refs.mobile.close() |
| | | }, |
| | | rangeChange(before, after) { |
| | | if (!(before && after)) return |
| | | this.handleStartAndEnd(before, after, true) |
| | | if (this.hasTime) return |
| | | this.confirmRangeChange() |
| | | }, |
| | | confirmRangeChange() { |
| | | if (!this.tempRange.startDate || !this.tempRange.endDate) { |
| | | this.pickerVisible = false |
| | | return |
| | | } |
| | | if(!checkDate(this.tempRange.startDate)){ |
| | | this.tempRange.startDate = getDate(Date.now()) |
| | | } |
| | | if(!checkDate(this.tempRange.endDate)){ |
| | | this.tempRange.endDate = getDate(Date.now()) |
| | | } |
| | | |
| | | let start, end |
| | | |
| | | let startDateLaterRangeStartDate = false |
| | | let startDateLaterRangeEndDate = false |
| | | let startDate, startTime |
| | | if(this.start) { |
| | | let startString = this.start |
| | | if(typeof this.start === 'number'){ |
| | | startString = getDateTime(this.start, this.hideSecond) |
| | | } |
| | | [startDate,startTime] = startString.split(' ') |
| | | if(this.start && !dateCompare(this.start, this.tempRange.startDate)) { |
| | | startDateLaterRangeStartDate = true |
| | | this.tempRange.startDate = startDate |
| | | } |
| | | if(this.start && !dateCompare(this.start, this.tempRange.endDate)) { |
| | | startDateLaterRangeEndDate = true |
| | | this.tempRange.endDate = startDate |
| | | } |
| | | } |
| | | let endDateEarlierRangeStartDate = false |
| | | let endDateEarlierRangeEndDate = false |
| | | let endDate, endTime |
| | | if(this.end) { |
| | | let endString = this.end |
| | | if(typeof this.end === 'number'){ |
| | | endString = getDateTime(this.end, this.hideSecond) |
| | | } |
| | | [endDate,endTime] = endString.split(' ') |
| | | |
| | | if(this.end && !dateCompare(this.tempRange.startDate, this.end)) { |
| | | endDateEarlierRangeStartDate = true |
| | | this.tempRange.startDate = endDate |
| | | } |
| | | if(this.end && !dateCompare(this.tempRange.endDate, this.end)) { |
| | | endDateEarlierRangeEndDate = true |
| | | this.tempRange.endDate = endDate |
| | | } |
| | | } |
| | | if (!this.hasTime) { |
| | | start = this.displayRangeValue.startDate = this.tempRange.startDate |
| | | end = this.displayRangeValue.endDate = this.tempRange.endDate |
| | | } else { |
| | | if(startDateLaterRangeStartDate){ |
| | | this.tempRange.startTime = startTime || getDefaultSecond(this.hideSecond) |
| | | }else if(endDateEarlierRangeStartDate){ |
| | | this.tempRange.startTime = endTime || getDefaultSecond(this.hideSecond) |
| | | } |
| | | if(!this.tempRange.startTime){ |
| | | this.tempRange.startTime = getTime(Date.now(), this.hideSecond) |
| | | } |
| | | |
| | | if(startDateLaterRangeEndDate){ |
| | | this.tempRange.endTime = startTime || getDefaultSecond(this.hideSecond) |
| | | }else if(endDateEarlierRangeEndDate){ |
| | | this.tempRange.endTime = endTime || getDefaultSecond(this.hideSecond) |
| | | } |
| | | if(!this.tempRange.endTime){ |
| | | this.tempRange.endTime = getTime(Date.now(), this.hideSecond) |
| | | } |
| | | start = this.displayRangeValue.startDate = `${this.tempRange.startDate} ${this.tempRange.startTime}` |
| | | end = this.displayRangeValue.endDate = `${this.tempRange.endDate} ${this.tempRange.endTime}` |
| | | } |
| | | if(!dateCompare(start,end)){ |
| | | [start, end] = [end, start] |
| | | } |
| | | this.displayRangeValue.startDate = start |
| | | this.displayRangeValue.endDate = end |
| | | const displayRange = [start, end] |
| | | this.setEmit(displayRange) |
| | | this.pickerVisible = false |
| | | }, |
| | | handleStartAndEnd(before, after, temp = false) { |
| | | if (!(before && after)) return |
| | | |
| | | const type = temp ? 'tempRange' : 'range' |
| | | const isStartEarlierEnd = dateCompare(before, after) |
| | | this[type].startDate = isStartEarlierEnd ? before : after |
| | | this[type].endDate = isStartEarlierEnd ? after : before |
| | | }, |
| | | /** |
| | | * 比较时间大小 |
| | | */ |
| | | dateCompare(startDate, endDate) { |
| | | // 计算截止时间 |
| | | startDate = new Date(startDate.replace('-', '/').replace('-', '/')) |
| | | // 计算详细项的截止时间 |
| | | endDate = new Date(endDate.replace('-', '/').replace('-', '/')) |
| | | return startDate <= endDate |
| | | }, |
| | | |
| | | /** |
| | | * 比较时间差 |
| | | */ |
| | | diffDate(startDate, endDate) { |
| | | // 计算截止时间 |
| | | startDate = new Date(startDate.replace('-', '/').replace('-', '/')) |
| | | // 计算详细项的截止时间 |
| | | endDate = new Date(endDate.replace('-', '/').replace('-', '/')) |
| | | const diff = (endDate - startDate) / (24 * 60 * 60 * 1000) |
| | | return Math.abs(diff) |
| | | }, |
| | | |
| | | clear(needEmit = true) { |
| | | if (!this.isRange) { |
| | | this.displayValue = '' |
| | | this.inputDate = '' |
| | | this.pickerTime = '' |
| | | if (this.isPhone) { |
| | | this.$refs.mobile && this.$refs.mobile.clearCalender() |
| | | } else { |
| | | this.$refs.pcSingle && this.$refs.pcSingle.clearCalender() |
| | | } |
| | | if (needEmit) { |
| | | this.$emit('change', '') |
| | | this.$emit('input', '') |
| | | this.$emit('update:modelValue', '') |
| | | } |
| | | } else { |
| | | this.displayRangeValue.startDate = '' |
| | | this.displayRangeValue.endDate = '' |
| | | this.tempRange.startDate = '' |
| | | this.tempRange.startTime = '' |
| | | this.tempRange.endDate = '' |
| | | this.tempRange.endTime = '' |
| | | if (this.isPhone) { |
| | | this.$refs.mobile && this.$refs.mobile.clearCalender() |
| | | } else { |
| | | this.$refs.left && this.$refs.left.clearCalender() |
| | | this.$refs.right && this.$refs.right.clearCalender() |
| | | this.$refs.right && this.$refs.right.changeMonth('next') |
| | | } |
| | | if (needEmit) { |
| | | this.$emit('change', []) |
| | | this.$emit('input', []) |
| | | this.$emit('update:modelValue', []) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | $uni-primary: #007aff !default; |
| | | |
| | | .uni-date { |
| | | width: 100%; |
| | | flex: 1; |
| | | } |
| | | .uni-date-x { |
| | | display: flex; |
| | | flex-direction: row; |
| | | align-items: center; |
| | | justify-content: center; |
| | | border-radius: 4px; |
| | | background-color: #fff; |
| | | color: #666; |
| | | font-size: 14px; |
| | | flex: 1; |
| | | |
| | | .icon-calendar{ |
| | | padding-left: 3px; |
| | | } |
| | | .range-separator{ |
| | | height: 35px; |
| | | /* #ifndef MP */ |
| | | padding: 0 2px; |
| | | /* #endif */ |
| | | line-height: 35px; |
| | | } |
| | | } |
| | | |
| | | .uni-date-x--border { |
| | | box-sizing: border-box; |
| | | border-radius: 4px; |
| | | border: 1px solid #e5e5e5; |
| | | } |
| | | |
| | | .uni-date-editor--x { |
| | | display: flex; |
| | | align-items: center; |
| | | position: relative; |
| | | } |
| | | |
| | | .uni-date-editor--x .uni-date__icon-clear { |
| | | padding-right: 3px; |
| | | display: flex; |
| | | align-items: center; |
| | | /* #ifdef H5 */ |
| | | cursor: pointer; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .uni-date__x-input { |
| | | width: auto; |
| | | height: 35px; |
| | | /* #ifndef MP */ |
| | | padding-left: 5px; |
| | | /* #endif */ |
| | | position: relative; |
| | | flex: 1; |
| | | line-height: 35px; |
| | | font-size: 14px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .text-center { |
| | | text-align: center; |
| | | } |
| | | |
| | | .uni-date__input { |
| | | height: 40px; |
| | | width: 100%; |
| | | line-height: 40px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .uni-date-range__input { |
| | | text-align: center; |
| | | max-width: 142px; |
| | | } |
| | | |
| | | .uni-date-picker__container { |
| | | position: relative; |
| | | } |
| | | |
| | | .uni-date-mask--pc { |
| | | position: fixed; |
| | | bottom: 0px; |
| | | top: 0px; |
| | | left: 0px; |
| | | right: 0px; |
| | | background-color: rgba(0, 0, 0, 0); |
| | | transition-duration: 0.3s; |
| | | z-index: 996; |
| | | } |
| | | |
| | | .uni-date-single--x { |
| | | background-color: #fff; |
| | | position: absolute; |
| | | top: 0; |
| | | z-index: 999; |
| | | border: 1px solid #EBEEF5; |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .uni-date-range--x { |
| | | background-color: #fff; |
| | | position: absolute; |
| | | top: 0; |
| | | z-index: 999; |
| | | border: 1px solid #EBEEF5; |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .uni-date-editor--x__disabled { |
| | | opacity: 0.4; |
| | | cursor: default; |
| | | } |
| | | |
| | | .uni-date-editor--logo { |
| | | width: 16px; |
| | | height: 16px; |
| | | vertical-align: middle; |
| | | } |
| | | |
| | | /* 添加时间 */ |
| | | .popup-x-header { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | } |
| | | |
| | | .popup-x-header--datetime { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | flex: 1; |
| | | } |
| | | |
| | | .popup-x-body { |
| | | display: flex; |
| | | } |
| | | |
| | | .popup-x-footer { |
| | | padding: 0 15px; |
| | | border-top-color: #F1F1F1; |
| | | border-top-style: solid; |
| | | border-top-width: 1px; |
| | | line-height: 40px; |
| | | text-align: right; |
| | | color: #666; |
| | | } |
| | | |
| | | .popup-x-footer text:hover { |
| | | color: $uni-primary; |
| | | cursor: pointer; |
| | | opacity: 0.8; |
| | | } |
| | | |
| | | .popup-x-footer .confirm-text { |
| | | margin-left: 20px; |
| | | color: $uni-primary; |
| | | } |
| | | |
| | | .uni-date-changed { |
| | | text-align: center; |
| | | color: #333; |
| | | border-bottom-color: #F1F1F1; |
| | | border-bottom-style: solid; |
| | | border-bottom-width: 1px; |
| | | } |
| | | |
| | | .uni-date-changed--time text { |
| | | height: 50px; |
| | | line-height: 50px; |
| | | } |
| | | |
| | | .uni-date-changed .uni-date-changed--time { |
| | | flex: 1; |
| | | } |
| | | |
| | | .uni-date-changed--time-date { |
| | | color: #333; |
| | | opacity: 0.6; |
| | | } |
| | | |
| | | .mr-50 { |
| | | margin-right: 50px; |
| | | } |
| | | |
| | | /* picker 弹出层通用的指示小三角, todo:扩展至上下左右方向定位 */ |
| | | .uni-popper__arrow, |
| | | .uni-popper__arrow::after { |
| | | position: absolute; |
| | | display: block; |
| | | width: 0; |
| | | height: 0; |
| | | border: 6px solid transparent; |
| | | border-top-width: 0; |
| | | } |
| | | |
| | | .uni-popper__arrow { |
| | | filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); |
| | | top: -6px; |
| | | left: 10%; |
| | | margin-right: 3px; |
| | | border-bottom-color: #EBEEF5; |
| | | } |
| | | |
| | | .uni-popper__arrow::after { |
| | | content: " "; |
| | | top: 1px; |
| | | margin-left: -6px; |
| | | border-bottom-color: #fff; |
| | | } |
| | | </style> |
New file |
| | |
| | | class Calendar { |
| | | constructor({ |
| | | selected, |
| | | startDate, |
| | | endDate, |
| | | range, |
| | | } = {}) { |
| | | // 当前日期 |
| | | this.date = this.getDateObj(new Date()) // 当前初入日期 |
| | | // 打点信息 |
| | | this.selected = selected || []; |
| | | // 起始时间 |
| | | this.startDate = startDate |
| | | // 终止时间 |
| | | this.endDate = endDate |
| | | // 是否范围选择 |
| | | this.range = range |
| | | // 多选状态 |
| | | this.cleanMultipleStatus() |
| | | // 每周日期 |
| | | this.weeks = {} |
| | | this.lastHover = false |
| | | } |
| | | /** |
| | | * 设置日期 |
| | | * @param {Object} date |
| | | */ |
| | | setDate(date) { |
| | | const selectDate = this.getDateObj(date) |
| | | this.getWeeks(selectDate.fullDate) |
| | | } |
| | | |
| | | /** |
| | | * 清理多选状态 |
| | | */ |
| | | cleanMultipleStatus() { |
| | | this.multipleStatus = { |
| | | before: '', |
| | | after: '', |
| | | data: [] |
| | | } |
| | | } |
| | | |
| | | setStartDate(startDate) { |
| | | this.startDate = startDate |
| | | } |
| | | |
| | | setEndDate(endDate) { |
| | | this.endDate = endDate |
| | | } |
| | | |
| | | getPreMonthObj(date){ |
| | | date = fixIosDateFormat(date) |
| | | date = new Date(date) |
| | | |
| | | const oldMonth = date.getMonth() |
| | | date.setMonth(oldMonth - 1) |
| | | const newMonth = date.getMonth() |
| | | if(oldMonth !== 0 && newMonth - oldMonth === 0){ |
| | | date.setMonth(newMonth - 1) |
| | | } |
| | | return this.getDateObj(date) |
| | | } |
| | | getNextMonthObj(date){ |
| | | date = fixIosDateFormat(date) |
| | | date = new Date(date) |
| | | |
| | | const oldMonth = date.getMonth() |
| | | date.setMonth(oldMonth + 1) |
| | | const newMonth = date.getMonth() |
| | | if(newMonth - oldMonth > 1){ |
| | | date.setMonth(newMonth - 1) |
| | | } |
| | | return this.getDateObj(date) |
| | | } |
| | | |
| | | /** |
| | | * 获取指定格式Date对象 |
| | | */ |
| | | getDateObj(date) { |
| | | date = fixIosDateFormat(date) |
| | | date = new Date(date) |
| | | |
| | | return { |
| | | fullDate: getDate(date), |
| | | year: date.getFullYear(), |
| | | month: addZero(date.getMonth() + 1), |
| | | date: addZero(date.getDate()), |
| | | day: date.getDay() |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取上一个月日期集合 |
| | | */ |
| | | getPreMonthDays(amount, dateObj) { |
| | | const result = [] |
| | | for (let i = amount - 1; i >= 0; i--) { |
| | | const month = dateObj.month - 1 |
| | | result.push({ |
| | | date: new Date(dateObj.year, month, -i).getDate(), |
| | | month, |
| | | disable: true |
| | | }) |
| | | } |
| | | return result |
| | | } |
| | | /** |
| | | * 获取本月日期集合 |
| | | */ |
| | | getCurrentMonthDays(amount, dateObj) { |
| | | const result = [] |
| | | const fullDate = this.date.fullDate |
| | | for (let i = 1; i <= amount; i++) { |
| | | const currentDate = `${dateObj.year}-${dateObj.month}-${addZero(i)}` |
| | | const isToday = fullDate === currentDate |
| | | // 获取打点信息 |
| | | const info = this.selected && this.selected.find((item) => { |
| | | if (this.dateEqual(currentDate, item.date)) { |
| | | return item |
| | | } |
| | | }) |
| | | |
| | | // 日期禁用 |
| | | let disableBefore = true |
| | | let disableAfter = true |
| | | if (this.startDate) { |
| | | disableBefore = dateCompare(this.startDate, currentDate) |
| | | } |
| | | |
| | | if (this.endDate) { |
| | | disableAfter = dateCompare(currentDate, this.endDate) |
| | | } |
| | | |
| | | let multiples = this.multipleStatus.data |
| | | let multiplesStatus = -1 |
| | | if (this.range && multiples) { |
| | | multiplesStatus = multiples.findIndex((item) => { |
| | | return this.dateEqual(item, currentDate) |
| | | }) |
| | | } |
| | | const checked = multiplesStatus !== -1 |
| | | |
| | | result.push({ |
| | | fullDate: currentDate, |
| | | year: dateObj.year, |
| | | date: i, |
| | | multiple: this.range ? checked : false, |
| | | beforeMultiple: this.isLogicBefore(currentDate, this.multipleStatus.before, this.multipleStatus.after), |
| | | afterMultiple: this.isLogicAfter(currentDate, this.multipleStatus.before, this.multipleStatus.after), |
| | | month: dateObj.month, |
| | | disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare(currentDate,this.endDate)), |
| | | isToday, |
| | | userChecked: false, |
| | | extraInfo: info |
| | | }) |
| | | } |
| | | return result |
| | | } |
| | | /** |
| | | * 获取下一个月日期集合 |
| | | */ |
| | | _getNextMonthDays(amount, dateObj) { |
| | | const result = [] |
| | | const month = dateObj.month + 1 |
| | | for (let i = 1; i <= amount; i++) { |
| | | result.push({ |
| | | date: i, |
| | | month, |
| | | disable: true |
| | | }) |
| | | } |
| | | return result |
| | | } |
| | | |
| | | /** |
| | | * 获取当前日期详情 |
| | | * @param {Object} date |
| | | */ |
| | | getInfo(date) { |
| | | if (!date) { |
| | | date = new Date() |
| | | } |
| | | |
| | | return this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate) |
| | | } |
| | | |
| | | /** |
| | | * 比较时间是否相等 |
| | | */ |
| | | dateEqual(before, after) { |
| | | before = new Date(fixIosDateFormat(before)) |
| | | after = new Date(fixIosDateFormat(after)) |
| | | return before.valueOf() === after.valueOf() |
| | | } |
| | | |
| | | /** |
| | | * 比较真实起始日期 |
| | | */ |
| | | |
| | | isLogicBefore(currentDate, before, after) { |
| | | let logicBefore = before |
| | | if (before && after) { |
| | | logicBefore = dateCompare(before, after) ? before : after |
| | | } |
| | | return this.dateEqual(logicBefore, currentDate) |
| | | } |
| | | |
| | | isLogicAfter(currentDate, before, after) { |
| | | let logicAfter = after |
| | | if (before && after) { |
| | | logicAfter = dateCompare(before, after) ? after : before |
| | | } |
| | | return this.dateEqual(logicAfter, currentDate) |
| | | } |
| | | |
| | | /** |
| | | * 获取日期范围内所有日期 |
| | | * @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.getDateObj(new Date(parseInt(k))).fullDate) |
| | | } |
| | | return arr |
| | | } |
| | | |
| | | /** |
| | | * 获取多选状态 |
| | | */ |
| | | setMultiple(fullDate) { |
| | | if (!this.range) return |
| | | |
| | | let { |
| | | before, |
| | | after |
| | | } = this.multipleStatus |
| | | 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 (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.getWeeks(fullDate) |
| | | } |
| | | |
| | | /** |
| | | * 鼠标 hover 更新多选状态 |
| | | */ |
| | | setHoverMultiple(fullDate) { |
| | | if (!this.range || this.lastHover) return |
| | | |
| | | const { before } = this.multipleStatus |
| | | |
| | | if (!before) { |
| | | this.multipleStatus.before = fullDate |
| | | } else { |
| | | this.multipleStatus.after = fullDate |
| | | if (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.getWeeks(fullDate) |
| | | } |
| | | |
| | | /** |
| | | * 更新默认值多选状态 |
| | | */ |
| | | setDefaultMultiple(before, after) { |
| | | this.multipleStatus.before = before |
| | | this.multipleStatus.after = after |
| | | if (before && after) { |
| | | if (dateCompare(before, after)) { |
| | | this.multipleStatus.data = this.geDateAll(before, after); |
| | | this.getWeeks(after) |
| | | } else { |
| | | this.multipleStatus.data = this.geDateAll(after, before); |
| | | this.getWeeks(before) |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取每周数据 |
| | | * @param {Object} dateData |
| | | */ |
| | | getWeeks(dateData) { |
| | | const { |
| | | year, |
| | | month, |
| | | } = this.getDateObj(dateData) |
| | | |
| | | const preMonthDayAmount = new Date(year, month - 1, 1).getDay() |
| | | const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData)) |
| | | |
| | | const currentMonthDayAmount = new Date(year, month, 0).getDate() |
| | | const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData)) |
| | | |
| | | const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount |
| | | const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData)) |
| | | |
| | | const calendarDays = [...preMonthDays, ...currentMonthDays, ...nextMonthDays] |
| | | |
| | | const weeks = new Array(6) |
| | | for (let i = 0; i < calendarDays.length; i++) { |
| | | const index = Math.floor(i / 7) |
| | | if(!weeks[index]){ |
| | | weeks[index] = new Array(7) |
| | | } |
| | | weeks[index][i % 7] = calendarDays[i] |
| | | } |
| | | |
| | | this.calendar = calendarDays |
| | | this.weeks = weeks |
| | | } |
| | | } |
| | | |
| | | function getDateTime(date, hideSecond){ |
| | | return `${getDate(date)} ${getTime(date, hideSecond)}` |
| | | } |
| | | |
| | | function getDate(date) { |
| | | date = fixIosDateFormat(date) |
| | | date = new Date(date) |
| | | const year = date.getFullYear() |
| | | const month = date.getMonth()+1 |
| | | const day = date.getDate() |
| | | return `${year}-${addZero(month)}-${addZero(day)}` |
| | | } |
| | | |
| | | function getTime(date, hideSecond){ |
| | | date = fixIosDateFormat(date) |
| | | date = new Date(date) |
| | | const hour = date.getHours() |
| | | const minute = date.getMinutes() |
| | | const second = date.getSeconds() |
| | | return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}` |
| | | } |
| | | |
| | | function addZero(num) { |
| | | if(num < 10){ |
| | | num = `0${num}` |
| | | } |
| | | return num |
| | | } |
| | | |
| | | function getDefaultSecond(hideSecond) { |
| | | return hideSecond ? '00:00' : '00:00:00' |
| | | } |
| | | |
| | | function dateCompare(startDate, endDate) { |
| | | startDate = new Date(fixIosDateFormat(startDate)) |
| | | endDate = new Date(fixIosDateFormat(endDate)) |
| | | return startDate <= endDate |
| | | } |
| | | |
| | | function checkDate(date){ |
| | | const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g |
| | | return date.match(dateReg) |
| | | } |
| | | |
| | | const dateTimeReg = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])( [0-5]?[0-9]:[0-5]?[0-9]:[0-5]?[0-9])?$/ |
| | | function fixIosDateFormat(value) { |
| | | if (typeof value === 'string' && dateTimeReg.test(value)) { |
| | | value = value.replace(/-/g, '/') |
| | | } |
| | | return value |
| | | } |
| | | |
| | | export {Calendar, getDateTime, getDate, getTime, addZero, getDefaultSecond, dateCompare, checkDate, fixIosDateFormat} |
New file |
| | |
| | | { |
| | | "id": "uni-datetime-picker", |
| | | "displayName": "uni-datetime-picker 日期选择器", |
| | | "version": "2.2.25", |
| | | "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" |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | |
| | | |
| | | > `重要通知:组件升级更新 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 |
New file |
| | |
| | | ## 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目录规范 |
New file |
| | |
| | | export default { |
| | | "id": "2852637", |
| | | "name": "uniui图标库", |
| | | "font_family": "uniicons", |
| | | "css_prefix_text": "uniui-", |
| | | "description": "", |
| | | "glyphs": [ |
| | | { |
| | | "icon_id": "25027049", |
| | | "name": "yanse", |
| | | "font_class": "color", |
| | | "unicode": "e6cf", |
| | | "unicode_decimal": 59087 |
| | | }, |
| | | { |
| | | "icon_id": "25027048", |
| | | "name": "wallet", |
| | | "font_class": "wallet", |
| | | "unicode": "e6b1", |
| | | "unicode_decimal": 59057 |
| | | }, |
| | | { |
| | | "icon_id": "25015720", |
| | | "name": "settings-filled", |
| | | "font_class": "settings-filled", |
| | | "unicode": "e6ce", |
| | | "unicode_decimal": 59086 |
| | | }, |
| | | { |
| | | "icon_id": "25015434", |
| | | "name": "shimingrenzheng-filled", |
| | | "font_class": "auth-filled", |
| | | "unicode": "e6cc", |
| | | "unicode_decimal": 59084 |
| | | }, |
| | | { |
| | | "icon_id": "24934246", |
| | | "name": "shop-filled", |
| | | "font_class": "shop-filled", |
| | | "unicode": "e6cd", |
| | | "unicode_decimal": 59085 |
| | | }, |
| | | { |
| | | "icon_id": "24934159", |
| | | "name": "staff-filled-01", |
| | | "font_class": "staff-filled", |
| | | "unicode": "e6cb", |
| | | "unicode_decimal": 59083 |
| | | }, |
| | | { |
| | | "icon_id": "24932461", |
| | | "name": "VIP-filled", |
| | | "font_class": "vip-filled", |
| | | "unicode": "e6c6", |
| | | "unicode_decimal": 59078 |
| | | }, |
| | | { |
| | | "icon_id": "24932462", |
| | | "name": "plus_circle_fill", |
| | | "font_class": "plus-filled", |
| | | "unicode": "e6c7", |
| | | "unicode_decimal": 59079 |
| | | }, |
| | | { |
| | | "icon_id": "24932463", |
| | | "name": "folder_add-filled", |
| | | "font_class": "folder-add-filled", |
| | | "unicode": "e6c8", |
| | | "unicode_decimal": 59080 |
| | | }, |
| | | { |
| | | "icon_id": "24932464", |
| | | "name": "yanse-filled", |
| | | "font_class": "color-filled", |
| | | "unicode": "e6c9", |
| | | "unicode_decimal": 59081 |
| | | }, |
| | | { |
| | | "icon_id": "24932465", |
| | | "name": "tune-filled", |
| | | "font_class": "tune-filled", |
| | | "unicode": "e6ca", |
| | | "unicode_decimal": 59082 |
| | | }, |
| | | { |
| | | "icon_id": "24932455", |
| | | "name": "a-rilidaka-filled", |
| | | "font_class": "calendar-filled", |
| | | "unicode": "e6c0", |
| | | "unicode_decimal": 59072 |
| | | }, |
| | | { |
| | | "icon_id": "24932456", |
| | | "name": "notification-filled", |
| | | "font_class": "notification-filled", |
| | | "unicode": "e6c1", |
| | | "unicode_decimal": 59073 |
| | | }, |
| | | { |
| | | "icon_id": "24932457", |
| | | "name": "wallet-filled", |
| | | "font_class": "wallet-filled", |
| | | "unicode": "e6c2", |
| | | "unicode_decimal": 59074 |
| | | }, |
| | | { |
| | | "icon_id": "24932458", |
| | | "name": "paihangbang-filled", |
| | | "font_class": "medal-filled", |
| | | "unicode": "e6c3", |
| | | "unicode_decimal": 59075 |
| | | }, |
| | | { |
| | | "icon_id": "24932459", |
| | | "name": "gift-filled", |
| | | "font_class": "gift-filled", |
| | | "unicode": "e6c4", |
| | | "unicode_decimal": 59076 |
| | | }, |
| | | { |
| | | "icon_id": "24932460", |
| | | "name": "fire-filled", |
| | | "font_class": "fire-filled", |
| | | "unicode": "e6c5", |
| | | "unicode_decimal": 59077 |
| | | }, |
| | | { |
| | | "icon_id": "24928001", |
| | | "name": "refreshempty", |
| | | "font_class": "refreshempty", |
| | | "unicode": "e6bf", |
| | | "unicode_decimal": 59071 |
| | | }, |
| | | { |
| | | "icon_id": "24926853", |
| | | "name": "location-ellipse", |
| | | "font_class": "location-filled", |
| | | "unicode": "e6af", |
| | | "unicode_decimal": 59055 |
| | | }, |
| | | { |
| | | "icon_id": "24926735", |
| | | "name": "person-filled", |
| | | "font_class": "person-filled", |
| | | "unicode": "e69d", |
| | | "unicode_decimal": 59037 |
| | | }, |
| | | { |
| | | "icon_id": "24926703", |
| | | "name": "personadd-filled", |
| | | "font_class": "personadd-filled", |
| | | "unicode": "e698", |
| | | "unicode_decimal": 59032 |
| | | }, |
| | | { |
| | | "icon_id": "24923351", |
| | | "name": "back", |
| | | "font_class": "back", |
| | | "unicode": "e6b9", |
| | | "unicode_decimal": 59065 |
| | | }, |
| | | { |
| | | "icon_id": "24923352", |
| | | "name": "forward", |
| | | "font_class": "forward", |
| | | "unicode": "e6ba", |
| | | "unicode_decimal": 59066 |
| | | }, |
| | | { |
| | | "icon_id": "24923353", |
| | | "name": "arrowthinright", |
| | | "font_class": "arrow-right", |
| | | "unicode": "e6bb", |
| | | "unicode_decimal": 59067 |
| | | }, |
| | | { |
| | | "icon_id": "24923353", |
| | | "name": "arrowthinright", |
| | | "font_class": "arrowthinright", |
| | | "unicode": "e6bb", |
| | | "unicode_decimal": 59067 |
| | | }, |
| | | { |
| | | "icon_id": "24923354", |
| | | "name": "arrowthinleft", |
| | | "font_class": "arrow-left", |
| | | "unicode": "e6bc", |
| | | "unicode_decimal": 59068 |
| | | }, |
| | | { |
| | | "icon_id": "24923354", |
| | | "name": "arrowthinleft", |
| | | "font_class": "arrowthinleft", |
| | | "unicode": "e6bc", |
| | | "unicode_decimal": 59068 |
| | | }, |
| | | { |
| | | "icon_id": "24923355", |
| | | "name": "arrowthinup", |
| | | "font_class": "arrow-up", |
| | | "unicode": "e6bd", |
| | | "unicode_decimal": 59069 |
| | | }, |
| | | { |
| | | "icon_id": "24923355", |
| | | "name": "arrowthinup", |
| | | "font_class": "arrowthinup", |
| | | "unicode": "e6bd", |
| | | "unicode_decimal": 59069 |
| | | }, |
| | | { |
| | | "icon_id": "24923356", |
| | | "name": "arrowthindown", |
| | | "font_class": "arrow-down", |
| | | "unicode": "e6be", |
| | | "unicode_decimal": 59070 |
| | | },{ |
| | | "icon_id": "24923356", |
| | | "name": "arrowthindown", |
| | | "font_class": "arrowthindown", |
| | | "unicode": "e6be", |
| | | "unicode_decimal": 59070 |
| | | }, |
| | | { |
| | | "icon_id": "24923349", |
| | | "name": "arrowdown", |
| | | "font_class": "bottom", |
| | | "unicode": "e6b8", |
| | | "unicode_decimal": 59064 |
| | | },{ |
| | | "icon_id": "24923349", |
| | | "name": "arrowdown", |
| | | "font_class": "arrowdown", |
| | | "unicode": "e6b8", |
| | | "unicode_decimal": 59064 |
| | | }, |
| | | { |
| | | "icon_id": "24923346", |
| | | "name": "arrowright", |
| | | "font_class": "right", |
| | | "unicode": "e6b5", |
| | | "unicode_decimal": 59061 |
| | | }, |
| | | { |
| | | "icon_id": "24923346", |
| | | "name": "arrowright", |
| | | "font_class": "arrowright", |
| | | "unicode": "e6b5", |
| | | "unicode_decimal": 59061 |
| | | }, |
| | | { |
| | | "icon_id": "24923347", |
| | | "name": "arrowup", |
| | | "font_class": "top", |
| | | "unicode": "e6b6", |
| | | "unicode_decimal": 59062 |
| | | }, |
| | | { |
| | | "icon_id": "24923347", |
| | | "name": "arrowup", |
| | | "font_class": "arrowup", |
| | | "unicode": "e6b6", |
| | | "unicode_decimal": 59062 |
| | | }, |
| | | { |
| | | "icon_id": "24923348", |
| | | "name": "arrowleft", |
| | | "font_class": "left", |
| | | "unicode": "e6b7", |
| | | "unicode_decimal": 59063 |
| | | }, |
| | | { |
| | | "icon_id": "24923348", |
| | | "name": "arrowleft", |
| | | "font_class": "arrowleft", |
| | | "unicode": "e6b7", |
| | | "unicode_decimal": 59063 |
| | | }, |
| | | { |
| | | "icon_id": "24923334", |
| | | "name": "eye", |
| | | "font_class": "eye", |
| | | "unicode": "e651", |
| | | "unicode_decimal": 58961 |
| | | }, |
| | | { |
| | | "icon_id": "24923335", |
| | | "name": "eye-filled", |
| | | "font_class": "eye-filled", |
| | | "unicode": "e66a", |
| | | "unicode_decimal": 58986 |
| | | }, |
| | | { |
| | | "icon_id": "24923336", |
| | | "name": "eye-slash", |
| | | "font_class": "eye-slash", |
| | | "unicode": "e6b3", |
| | | "unicode_decimal": 59059 |
| | | }, |
| | | { |
| | | "icon_id": "24923337", |
| | | "name": "eye-slash-filled", |
| | | "font_class": "eye-slash-filled", |
| | | "unicode": "e6b4", |
| | | "unicode_decimal": 59060 |
| | | }, |
| | | { |
| | | "icon_id": "24923305", |
| | | "name": "info-filled", |
| | | "font_class": "info-filled", |
| | | "unicode": "e649", |
| | | "unicode_decimal": 58953 |
| | | }, |
| | | { |
| | | "icon_id": "24923299", |
| | | "name": "reload-01", |
| | | "font_class": "reload", |
| | | "unicode": "e6b2", |
| | | "unicode_decimal": 59058 |
| | | }, |
| | | { |
| | | "icon_id": "24923195", |
| | | "name": "mic_slash_fill", |
| | | "font_class": "micoff-filled", |
| | | "unicode": "e6b0", |
| | | "unicode_decimal": 59056 |
| | | }, |
| | | { |
| | | "icon_id": "24923165", |
| | | "name": "map-pin-ellipse", |
| | | "font_class": "map-pin-ellipse", |
| | | "unicode": "e6ac", |
| | | "unicode_decimal": 59052 |
| | | }, |
| | | { |
| | | "icon_id": "24923166", |
| | | "name": "map-pin", |
| | | "font_class": "map-pin", |
| | | "unicode": "e6ad", |
| | | "unicode_decimal": 59053 |
| | | }, |
| | | { |
| | | "icon_id": "24923167", |
| | | "name": "location", |
| | | "font_class": "location", |
| | | "unicode": "e6ae", |
| | | "unicode_decimal": 59054 |
| | | }, |
| | | { |
| | | "icon_id": "24923064", |
| | | "name": "starhalf", |
| | | "font_class": "starhalf", |
| | | "unicode": "e683", |
| | | "unicode_decimal": 59011 |
| | | }, |
| | | { |
| | | "icon_id": "24923065", |
| | | "name": "star", |
| | | "font_class": "star", |
| | | "unicode": "e688", |
| | | "unicode_decimal": 59016 |
| | | }, |
| | | { |
| | | "icon_id": "24923066", |
| | | "name": "star-filled", |
| | | "font_class": "star-filled", |
| | | "unicode": "e68f", |
| | | "unicode_decimal": 59023 |
| | | }, |
| | | { |
| | | "icon_id": "24899646", |
| | | "name": "a-rilidaka", |
| | | "font_class": "calendar", |
| | | "unicode": "e6a0", |
| | | "unicode_decimal": 59040 |
| | | }, |
| | | { |
| | | "icon_id": "24899647", |
| | | "name": "fire", |
| | | "font_class": "fire", |
| | | "unicode": "e6a1", |
| | | "unicode_decimal": 59041 |
| | | }, |
| | | { |
| | | "icon_id": "24899648", |
| | | "name": "paihangbang", |
| | | "font_class": "medal", |
| | | "unicode": "e6a2", |
| | | "unicode_decimal": 59042 |
| | | }, |
| | | { |
| | | "icon_id": "24899649", |
| | | "name": "font", |
| | | "font_class": "font", |
| | | "unicode": "e6a3", |
| | | "unicode_decimal": 59043 |
| | | }, |
| | | { |
| | | "icon_id": "24899650", |
| | | "name": "gift", |
| | | "font_class": "gift", |
| | | "unicode": "e6a4", |
| | | "unicode_decimal": 59044 |
| | | }, |
| | | { |
| | | "icon_id": "24899651", |
| | | "name": "link", |
| | | "font_class": "link", |
| | | "unicode": "e6a5", |
| | | "unicode_decimal": 59045 |
| | | }, |
| | | { |
| | | "icon_id": "24899652", |
| | | "name": "notification", |
| | | "font_class": "notification", |
| | | "unicode": "e6a6", |
| | | "unicode_decimal": 59046 |
| | | }, |
| | | { |
| | | "icon_id": "24899653", |
| | | "name": "staff", |
| | | "font_class": "staff", |
| | | "unicode": "e6a7", |
| | | "unicode_decimal": 59047 |
| | | }, |
| | | { |
| | | "icon_id": "24899654", |
| | | "name": "VIP", |
| | | "font_class": "vip", |
| | | "unicode": "e6a8", |
| | | "unicode_decimal": 59048 |
| | | }, |
| | | { |
| | | "icon_id": "24899655", |
| | | "name": "folder_add", |
| | | "font_class": "folder-add", |
| | | "unicode": "e6a9", |
| | | "unicode_decimal": 59049 |
| | | }, |
| | | { |
| | | "icon_id": "24899656", |
| | | "name": "tune", |
| | | "font_class": "tune", |
| | | "unicode": "e6aa", |
| | | "unicode_decimal": 59050 |
| | | }, |
| | | { |
| | | "icon_id": "24899657", |
| | | "name": "shimingrenzheng", |
| | | "font_class": "auth", |
| | | "unicode": "e6ab", |
| | | "unicode_decimal": 59051 |
| | | }, |
| | | { |
| | | "icon_id": "24899565", |
| | | "name": "person", |
| | | "font_class": "person", |
| | | "unicode": "e699", |
| | | "unicode_decimal": 59033 |
| | | }, |
| | | { |
| | | "icon_id": "24899566", |
| | | "name": "email-filled", |
| | | "font_class": "email-filled", |
| | | "unicode": "e69a", |
| | | "unicode_decimal": 59034 |
| | | }, |
| | | { |
| | | "icon_id": "24899567", |
| | | "name": "phone-filled", |
| | | "font_class": "phone-filled", |
| | | "unicode": "e69b", |
| | | "unicode_decimal": 59035 |
| | | }, |
| | | { |
| | | "icon_id": "24899568", |
| | | "name": "phone", |
| | | "font_class": "phone", |
| | | "unicode": "e69c", |
| | | "unicode_decimal": 59036 |
| | | }, |
| | | { |
| | | "icon_id": "24899570", |
| | | "name": "email", |
| | | "font_class": "email", |
| | | "unicode": "e69e", |
| | | "unicode_decimal": 59038 |
| | | }, |
| | | { |
| | | "icon_id": "24899571", |
| | | "name": "personadd", |
| | | "font_class": "personadd", |
| | | "unicode": "e69f", |
| | | "unicode_decimal": 59039 |
| | | }, |
| | | { |
| | | "icon_id": "24899558", |
| | | "name": "chatboxes-filled", |
| | | "font_class": "chatboxes-filled", |
| | | "unicode": "e692", |
| | | "unicode_decimal": 59026 |
| | | }, |
| | | { |
| | | "icon_id": "24899559", |
| | | "name": "contact", |
| | | "font_class": "contact", |
| | | "unicode": "e693", |
| | | "unicode_decimal": 59027 |
| | | }, |
| | | { |
| | | "icon_id": "24899560", |
| | | "name": "chatbubble-filled", |
| | | "font_class": "chatbubble-filled", |
| | | "unicode": "e694", |
| | | "unicode_decimal": 59028 |
| | | }, |
| | | { |
| | | "icon_id": "24899561", |
| | | "name": "contact-filled", |
| | | "font_class": "contact-filled", |
| | | "unicode": "e695", |
| | | "unicode_decimal": 59029 |
| | | }, |
| | | { |
| | | "icon_id": "24899562", |
| | | "name": "chatboxes", |
| | | "font_class": "chatboxes", |
| | | "unicode": "e696", |
| | | "unicode_decimal": 59030 |
| | | }, |
| | | { |
| | | "icon_id": "24899563", |
| | | "name": "chatbubble", |
| | | "font_class": "chatbubble", |
| | | "unicode": "e697", |
| | | "unicode_decimal": 59031 |
| | | }, |
| | | { |
| | | "icon_id": "24881290", |
| | | "name": "upload-filled", |
| | | "font_class": "upload-filled", |
| | | "unicode": "e68e", |
| | | "unicode_decimal": 59022 |
| | | }, |
| | | { |
| | | "icon_id": "24881292", |
| | | "name": "upload", |
| | | "font_class": "upload", |
| | | "unicode": "e690", |
| | | "unicode_decimal": 59024 |
| | | }, |
| | | { |
| | | "icon_id": "24881293", |
| | | "name": "weixin", |
| | | "font_class": "weixin", |
| | | "unicode": "e691", |
| | | "unicode_decimal": 59025 |
| | | }, |
| | | { |
| | | "icon_id": "24881274", |
| | | "name": "compose", |
| | | "font_class": "compose", |
| | | "unicode": "e67f", |
| | | "unicode_decimal": 59007 |
| | | }, |
| | | { |
| | | "icon_id": "24881275", |
| | | "name": "qq", |
| | | "font_class": "qq", |
| | | "unicode": "e680", |
| | | "unicode_decimal": 59008 |
| | | }, |
| | | { |
| | | "icon_id": "24881276", |
| | | "name": "download-filled", |
| | | "font_class": "download-filled", |
| | | "unicode": "e681", |
| | | "unicode_decimal": 59009 |
| | | }, |
| | | { |
| | | "icon_id": "24881277", |
| | | "name": "pengyouquan", |
| | | "font_class": "pyq", |
| | | "unicode": "e682", |
| | | "unicode_decimal": 59010 |
| | | }, |
| | | { |
| | | "icon_id": "24881279", |
| | | "name": "sound", |
| | | "font_class": "sound", |
| | | "unicode": "e684", |
| | | "unicode_decimal": 59012 |
| | | }, |
| | | { |
| | | "icon_id": "24881280", |
| | | "name": "trash-filled", |
| | | "font_class": "trash-filled", |
| | | "unicode": "e685", |
| | | "unicode_decimal": 59013 |
| | | }, |
| | | { |
| | | "icon_id": "24881281", |
| | | "name": "sound-filled", |
| | | "font_class": "sound-filled", |
| | | "unicode": "e686", |
| | | "unicode_decimal": 59014 |
| | | }, |
| | | { |
| | | "icon_id": "24881282", |
| | | "name": "trash", |
| | | "font_class": "trash", |
| | | "unicode": "e687", |
| | | "unicode_decimal": 59015 |
| | | }, |
| | | { |
| | | "icon_id": "24881284", |
| | | "name": "videocam-filled", |
| | | "font_class": "videocam-filled", |
| | | "unicode": "e689", |
| | | "unicode_decimal": 59017 |
| | | }, |
| | | { |
| | | "icon_id": "24881285", |
| | | "name": "spinner-cycle", |
| | | "font_class": "spinner-cycle", |
| | | "unicode": "e68a", |
| | | "unicode_decimal": 59018 |
| | | }, |
| | | { |
| | | "icon_id": "24881286", |
| | | "name": "weibo", |
| | | "font_class": "weibo", |
| | | "unicode": "e68b", |
| | | "unicode_decimal": 59019 |
| | | }, |
| | | { |
| | | "icon_id": "24881288", |
| | | "name": "videocam", |
| | | "font_class": "videocam", |
| | | "unicode": "e68c", |
| | | "unicode_decimal": 59020 |
| | | }, |
| | | { |
| | | "icon_id": "24881289", |
| | | "name": "download", |
| | | "font_class": "download", |
| | | "unicode": "e68d", |
| | | "unicode_decimal": 59021 |
| | | }, |
| | | { |
| | | "icon_id": "24879601", |
| | | "name": "help", |
| | | "font_class": "help", |
| | | "unicode": "e679", |
| | | "unicode_decimal": 59001 |
| | | }, |
| | | { |
| | | "icon_id": "24879602", |
| | | "name": "navigate-filled", |
| | | "font_class": "navigate-filled", |
| | | "unicode": "e67a", |
| | | "unicode_decimal": 59002 |
| | | }, |
| | | { |
| | | "icon_id": "24879603", |
| | | "name": "plusempty", |
| | | "font_class": "plusempty", |
| | | "unicode": "e67b", |
| | | "unicode_decimal": 59003 |
| | | }, |
| | | { |
| | | "icon_id": "24879604", |
| | | "name": "smallcircle", |
| | | "font_class": "smallcircle", |
| | | "unicode": "e67c", |
| | | "unicode_decimal": 59004 |
| | | }, |
| | | { |
| | | "icon_id": "24879605", |
| | | "name": "minus-filled", |
| | | "font_class": "minus-filled", |
| | | "unicode": "e67d", |
| | | "unicode_decimal": 59005 |
| | | }, |
| | | { |
| | | "icon_id": "24879606", |
| | | "name": "micoff", |
| | | "font_class": "micoff", |
| | | "unicode": "e67e", |
| | | "unicode_decimal": 59006 |
| | | }, |
| | | { |
| | | "icon_id": "24879588", |
| | | "name": "closeempty", |
| | | "font_class": "closeempty", |
| | | "unicode": "e66c", |
| | | "unicode_decimal": 58988 |
| | | }, |
| | | { |
| | | "icon_id": "24879589", |
| | | "name": "clear", |
| | | "font_class": "clear", |
| | | "unicode": "e66d", |
| | | "unicode_decimal": 58989 |
| | | }, |
| | | { |
| | | "icon_id": "24879590", |
| | | "name": "navigate", |
| | | "font_class": "navigate", |
| | | "unicode": "e66e", |
| | | "unicode_decimal": 58990 |
| | | }, |
| | | { |
| | | "icon_id": "24879591", |
| | | "name": "minus", |
| | | "font_class": "minus", |
| | | "unicode": "e66f", |
| | | "unicode_decimal": 58991 |
| | | }, |
| | | { |
| | | "icon_id": "24879592", |
| | | "name": "image", |
| | | "font_class": "image", |
| | | "unicode": "e670", |
| | | "unicode_decimal": 58992 |
| | | }, |
| | | { |
| | | "icon_id": "24879593", |
| | | "name": "mic", |
| | | "font_class": "mic", |
| | | "unicode": "e671", |
| | | "unicode_decimal": 58993 |
| | | }, |
| | | { |
| | | "icon_id": "24879594", |
| | | "name": "paperplane", |
| | | "font_class": "paperplane", |
| | | "unicode": "e672", |
| | | "unicode_decimal": 58994 |
| | | }, |
| | | { |
| | | "icon_id": "24879595", |
| | | "name": "close", |
| | | "font_class": "close", |
| | | "unicode": "e673", |
| | | "unicode_decimal": 58995 |
| | | }, |
| | | { |
| | | "icon_id": "24879596", |
| | | "name": "help-filled", |
| | | "font_class": "help-filled", |
| | | "unicode": "e674", |
| | | "unicode_decimal": 58996 |
| | | }, |
| | | { |
| | | "icon_id": "24879597", |
| | | "name": "plus-filled", |
| | | "font_class": "paperplane-filled", |
| | | "unicode": "e675", |
| | | "unicode_decimal": 58997 |
| | | }, |
| | | { |
| | | "icon_id": "24879598", |
| | | "name": "plus", |
| | | "font_class": "plus", |
| | | "unicode": "e676", |
| | | "unicode_decimal": 58998 |
| | | }, |
| | | { |
| | | "icon_id": "24879599", |
| | | "name": "mic-filled", |
| | | "font_class": "mic-filled", |
| | | "unicode": "e677", |
| | | "unicode_decimal": 58999 |
| | | }, |
| | | { |
| | | "icon_id": "24879600", |
| | | "name": "image-filled", |
| | | "font_class": "image-filled", |
| | | "unicode": "e678", |
| | | "unicode_decimal": 59000 |
| | | }, |
| | | { |
| | | "icon_id": "24855900", |
| | | "name": "locked-filled", |
| | | "font_class": "locked-filled", |
| | | "unicode": "e668", |
| | | "unicode_decimal": 58984 |
| | | }, |
| | | { |
| | | "icon_id": "24855901", |
| | | "name": "info", |
| | | "font_class": "info", |
| | | "unicode": "e669", |
| | | "unicode_decimal": 58985 |
| | | }, |
| | | { |
| | | "icon_id": "24855903", |
| | | "name": "locked", |
| | | "font_class": "locked", |
| | | "unicode": "e66b", |
| | | "unicode_decimal": 58987 |
| | | }, |
| | | { |
| | | "icon_id": "24855884", |
| | | "name": "camera-filled", |
| | | "font_class": "camera-filled", |
| | | "unicode": "e658", |
| | | "unicode_decimal": 58968 |
| | | }, |
| | | { |
| | | "icon_id": "24855885", |
| | | "name": "chat-filled", |
| | | "font_class": "chat-filled", |
| | | "unicode": "e659", |
| | | "unicode_decimal": 58969 |
| | | }, |
| | | { |
| | | "icon_id": "24855886", |
| | | "name": "camera", |
| | | "font_class": "camera", |
| | | "unicode": "e65a", |
| | | "unicode_decimal": 58970 |
| | | }, |
| | | { |
| | | "icon_id": "24855887", |
| | | "name": "circle", |
| | | "font_class": "circle", |
| | | "unicode": "e65b", |
| | | "unicode_decimal": 58971 |
| | | }, |
| | | { |
| | | "icon_id": "24855888", |
| | | "name": "checkmarkempty", |
| | | "font_class": "checkmarkempty", |
| | | "unicode": "e65c", |
| | | "unicode_decimal": 58972 |
| | | }, |
| | | { |
| | | "icon_id": "24855889", |
| | | "name": "chat", |
| | | "font_class": "chat", |
| | | "unicode": "e65d", |
| | | "unicode_decimal": 58973 |
| | | }, |
| | | { |
| | | "icon_id": "24855890", |
| | | "name": "circle-filled", |
| | | "font_class": "circle-filled", |
| | | "unicode": "e65e", |
| | | "unicode_decimal": 58974 |
| | | }, |
| | | { |
| | | "icon_id": "24855891", |
| | | "name": "flag", |
| | | "font_class": "flag", |
| | | "unicode": "e65f", |
| | | "unicode_decimal": 58975 |
| | | }, |
| | | { |
| | | "icon_id": "24855892", |
| | | "name": "flag-filled", |
| | | "font_class": "flag-filled", |
| | | "unicode": "e660", |
| | | "unicode_decimal": 58976 |
| | | }, |
| | | { |
| | | "icon_id": "24855893", |
| | | "name": "gear-filled", |
| | | "font_class": "gear-filled", |
| | | "unicode": "e661", |
| | | "unicode_decimal": 58977 |
| | | }, |
| | | { |
| | | "icon_id": "24855894", |
| | | "name": "home", |
| | | "font_class": "home", |
| | | "unicode": "e662", |
| | | "unicode_decimal": 58978 |
| | | }, |
| | | { |
| | | "icon_id": "24855895", |
| | | "name": "home-filled", |
| | | "font_class": "home-filled", |
| | | "unicode": "e663", |
| | | "unicode_decimal": 58979 |
| | | }, |
| | | { |
| | | "icon_id": "24855896", |
| | | "name": "gear", |
| | | "font_class": "gear", |
| | | "unicode": "e664", |
| | | "unicode_decimal": 58980 |
| | | }, |
| | | { |
| | | "icon_id": "24855897", |
| | | "name": "smallcircle-filled", |
| | | "font_class": "smallcircle-filled", |
| | | "unicode": "e665", |
| | | "unicode_decimal": 58981 |
| | | }, |
| | | { |
| | | "icon_id": "24855898", |
| | | "name": "map-filled", |
| | | "font_class": "map-filled", |
| | | "unicode": "e666", |
| | | "unicode_decimal": 58982 |
| | | }, |
| | | { |
| | | "icon_id": "24855899", |
| | | "name": "map", |
| | | "font_class": "map", |
| | | "unicode": "e667", |
| | | "unicode_decimal": 58983 |
| | | }, |
| | | { |
| | | "icon_id": "24855825", |
| | | "name": "refresh-filled", |
| | | "font_class": "refresh-filled", |
| | | "unicode": "e656", |
| | | "unicode_decimal": 58966 |
| | | }, |
| | | { |
| | | "icon_id": "24855826", |
| | | "name": "refresh", |
| | | "font_class": "refresh", |
| | | "unicode": "e657", |
| | | "unicode_decimal": 58967 |
| | | }, |
| | | { |
| | | "icon_id": "24855808", |
| | | "name": "cloud-upload", |
| | | "font_class": "cloud-upload", |
| | | "unicode": "e645", |
| | | "unicode_decimal": 58949 |
| | | }, |
| | | { |
| | | "icon_id": "24855809", |
| | | "name": "cloud-download-filled", |
| | | "font_class": "cloud-download-filled", |
| | | "unicode": "e646", |
| | | "unicode_decimal": 58950 |
| | | }, |
| | | { |
| | | "icon_id": "24855810", |
| | | "name": "cloud-download", |
| | | "font_class": "cloud-download", |
| | | "unicode": "e647", |
| | | "unicode_decimal": 58951 |
| | | }, |
| | | { |
| | | "icon_id": "24855811", |
| | | "name": "cloud-upload-filled", |
| | | "font_class": "cloud-upload-filled", |
| | | "unicode": "e648", |
| | | "unicode_decimal": 58952 |
| | | }, |
| | | { |
| | | "icon_id": "24855813", |
| | | "name": "redo", |
| | | "font_class": "redo", |
| | | "unicode": "e64a", |
| | | "unicode_decimal": 58954 |
| | | }, |
| | | { |
| | | "icon_id": "24855814", |
| | | "name": "images-filled", |
| | | "font_class": "images-filled", |
| | | "unicode": "e64b", |
| | | "unicode_decimal": 58955 |
| | | }, |
| | | { |
| | | "icon_id": "24855815", |
| | | "name": "undo-filled", |
| | | "font_class": "undo-filled", |
| | | "unicode": "e64c", |
| | | "unicode_decimal": 58956 |
| | | }, |
| | | { |
| | | "icon_id": "24855816", |
| | | "name": "more", |
| | | "font_class": "more", |
| | | "unicode": "e64d", |
| | | "unicode_decimal": 58957 |
| | | }, |
| | | { |
| | | "icon_id": "24855817", |
| | | "name": "more-filled", |
| | | "font_class": "more-filled", |
| | | "unicode": "e64e", |
| | | "unicode_decimal": 58958 |
| | | }, |
| | | { |
| | | "icon_id": "24855818", |
| | | "name": "undo", |
| | | "font_class": "undo", |
| | | "unicode": "e64f", |
| | | "unicode_decimal": 58959 |
| | | }, |
| | | { |
| | | "icon_id": "24855819", |
| | | "name": "images", |
| | | "font_class": "images", |
| | | "unicode": "e650", |
| | | "unicode_decimal": 58960 |
| | | }, |
| | | { |
| | | "icon_id": "24855821", |
| | | "name": "paperclip", |
| | | "font_class": "paperclip", |
| | | "unicode": "e652", |
| | | "unicode_decimal": 58962 |
| | | }, |
| | | { |
| | | "icon_id": "24855822", |
| | | "name": "settings", |
| | | "font_class": "settings", |
| | | "unicode": "e653", |
| | | "unicode_decimal": 58963 |
| | | }, |
| | | { |
| | | "icon_id": "24855823", |
| | | "name": "search", |
| | | "font_class": "search", |
| | | "unicode": "e654", |
| | | "unicode_decimal": 58964 |
| | | }, |
| | | { |
| | | "icon_id": "24855824", |
| | | "name": "redo-filled", |
| | | "font_class": "redo-filled", |
| | | "unicode": "e655", |
| | | "unicode_decimal": 58965 |
| | | }, |
| | | { |
| | | "icon_id": "24841702", |
| | | "name": "list", |
| | | "font_class": "list", |
| | | "unicode": "e644", |
| | | "unicode_decimal": 58948 |
| | | }, |
| | | { |
| | | "icon_id": "24841489", |
| | | "name": "mail-open-filled", |
| | | "font_class": "mail-open-filled", |
| | | "unicode": "e63a", |
| | | "unicode_decimal": 58938 |
| | | }, |
| | | { |
| | | "icon_id": "24841491", |
| | | "name": "hand-thumbsdown-filled", |
| | | "font_class": "hand-down-filled", |
| | | "unicode": "e63c", |
| | | "unicode_decimal": 58940 |
| | | }, |
| | | { |
| | | "icon_id": "24841492", |
| | | "name": "hand-thumbsdown", |
| | | "font_class": "hand-down", |
| | | "unicode": "e63d", |
| | | "unicode_decimal": 58941 |
| | | }, |
| | | { |
| | | "icon_id": "24841493", |
| | | "name": "hand-thumbsup-filled", |
| | | "font_class": "hand-up-filled", |
| | | "unicode": "e63e", |
| | | "unicode_decimal": 58942 |
| | | }, |
| | | { |
| | | "icon_id": "24841494", |
| | | "name": "hand-thumbsup", |
| | | "font_class": "hand-up", |
| | | "unicode": "e63f", |
| | | "unicode_decimal": 58943 |
| | | }, |
| | | { |
| | | "icon_id": "24841496", |
| | | "name": "heart-filled", |
| | | "font_class": "heart-filled", |
| | | "unicode": "e641", |
| | | "unicode_decimal": 58945 |
| | | }, |
| | | { |
| | | "icon_id": "24841498", |
| | | "name": "mail-open", |
| | | "font_class": "mail-open", |
| | | "unicode": "e643", |
| | | "unicode_decimal": 58947 |
| | | }, |
| | | { |
| | | "icon_id": "24841488", |
| | | "name": "heart", |
| | | "font_class": "heart", |
| | | "unicode": "e639", |
| | | "unicode_decimal": 58937 |
| | | }, |
| | | { |
| | | "icon_id": "24839963", |
| | | "name": "loop", |
| | | "font_class": "loop", |
| | | "unicode": "e633", |
| | | "unicode_decimal": 58931 |
| | | }, |
| | | { |
| | | "icon_id": "24839866", |
| | | "name": "pulldown", |
| | | "font_class": "pulldown", |
| | | "unicode": "e632", |
| | | "unicode_decimal": 58930 |
| | | }, |
| | | { |
| | | "icon_id": "24813798", |
| | | "name": "scan", |
| | | "font_class": "scan", |
| | | "unicode": "e62a", |
| | | "unicode_decimal": 58922 |
| | | }, |
| | | { |
| | | "icon_id": "24813786", |
| | | "name": "bars", |
| | | "font_class": "bars", |
| | | "unicode": "e627", |
| | | "unicode_decimal": 58919 |
| | | }, |
| | | { |
| | | "icon_id": "24813788", |
| | | "name": "cart-filled", |
| | | "font_class": "cart-filled", |
| | | "unicode": "e629", |
| | | "unicode_decimal": 58921 |
| | | }, |
| | | { |
| | | "icon_id": "24813790", |
| | | "name": "checkbox", |
| | | "font_class": "checkbox", |
| | | "unicode": "e62b", |
| | | "unicode_decimal": 58923 |
| | | }, |
| | | { |
| | | "icon_id": "24813791", |
| | | "name": "checkbox-filled", |
| | | "font_class": "checkbox-filled", |
| | | "unicode": "e62c", |
| | | "unicode_decimal": 58924 |
| | | }, |
| | | { |
| | | "icon_id": "24813794", |
| | | "name": "shop", |
| | | "font_class": "shop", |
| | | "unicode": "e62f", |
| | | "unicode_decimal": 58927 |
| | | }, |
| | | { |
| | | "icon_id": "24813795", |
| | | "name": "headphones", |
| | | "font_class": "headphones", |
| | | "unicode": "e630", |
| | | "unicode_decimal": 58928 |
| | | }, |
| | | { |
| | | "icon_id": "24813796", |
| | | "name": "cart", |
| | | "font_class": "cart", |
| | | "unicode": "e631", |
| | | "unicode_decimal": 58929 |
| | | } |
| | | ] |
| | | } |
New file |
| | |
| | | <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> |
New file |
| | |
| | | .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"; |
| | | } |
New file |
| | |
| | | { |
| | | "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" |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | ## Icons 图标 |
| | | > **组件名:uni-icons** |
| | | > 代码块: `uIcons` |
| | | |
| | | 用于展示 icons 图标 。 |
| | | |
| | | ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) |
| | | #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
New file |
| | |
| | | ## 1.3.11(2023-03-29) |
| | | - 修复 自定义状态栏高度闪动BUG |
| | | ## 1.3.10(2023-03-29) |
| | | - 修复 暗黑模式下边线颜色错误的bug |
| | | ## 1.3.9(2022-10-13) |
| | | - 修复 条件编译错误的bug |
| | | ## 1.3.8(2022-10-12) |
| | | - 修复 nvue 环境 fixed 为 true 的情况下,无法置顶的 bug |
| | | ## 1.3.7(2022-08-11) |
| | | - 修复 nvue 环境下 fixed 为 true 的情况下,无法置顶的 bug |
| | | ## 1.3.6(2022-06-30) |
| | | - 修复 组件示例中插槽用法无法显示内容的bug |
| | | ## 1.3.5(2022-05-24) |
| | | - 新增 stat 属性 ,可开启统计title 上报 ,仅使用了title 属性且项目开启了uni统计生效 |
| | | ## 1.3.4(2022-01-24) |
| | | - 更新 组件示例 |
| | | ## 1.3.3(2022-01-24) |
| | | - 新增 left-width/right-width属性 ,可修改左右两侧的宽度 |
| | | ## 1.3.2(2022-01-18) |
| | | - 修复 在vue下,标题不垂直居中的bug |
| | | ## 1.3.1(2022-01-18) |
| | | - 修复 height 属性类型错误 |
| | | ## 1.3.0(2022-01-18) |
| | | - 新增 height 属性,可修改组件高度 |
| | | - 新增 dark 属性可可开启暗黑模式 |
| | | - 优化 标题字数过多显示省略号 |
| | | - 优化 插槽,插入内容可完全覆盖 |
| | | ## 1.2.1(2022-01-10) |
| | | - 修复 color 属性不生效的bug |
| | | ## 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-nav-bar](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) |
| | | ## 1.1.0(2021-07-30) |
| | | - 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
| | | ## 1.0.11(2021-05-12) |
| | | - 新增 组件示例地址 |
| | | ## 1.0.10(2021-04-30) |
| | | - 修复 在nvue下fixed为true,宽度不能撑满的Bug |
| | | ## 1.0.9(2021-04-21) |
| | | - 优化 添加依赖 uni-icons, 导入后自动下载依赖 |
| | | ## 1.0.8(2021-04-14) |
| | | - uni-ui 修复 uni-nav-bar 当 fixed 属性为 true 时铺不满屏幕的 bug |
| | | |
| | | ## 1.0.7(2021-02-25) |
| | | - 修复 easycom 下,找不到 uni-status-bar 的bug |
| | | |
| | | ## 1.0.6(2021-02-05) |
| | | - 优化 组件引用关系,通过uni_modules引用组件 |
| | | |
| | | ## 1.0.5(2021-02-05) |
| | | - 调整为uni_modules目录规范 |
New file |
| | |
| | | <template> |
| | | <view class="uni-navbar" :class="{'uni-dark':dark, 'uni-nvue-fixed': fixed}"> |
| | | <view class="uni-navbar__content" :class="{ 'uni-navbar--fixed': fixed, 'uni-navbar--shadow': shadow, 'uni-navbar--border': border }" |
| | | :style="{ 'background-color': themeBgColor, 'border-bottom-color':themeColor }" > |
| | | <status-bar v-if="statusBar" /> |
| | | <view :style="{ color: themeColor,backgroundColor: themeBgColor ,height:navbarHeight}" |
| | | class="uni-navbar__header"> |
| | | <view @tap="onClickLeft" class="uni-navbar__header-btns uni-navbar__header-btns-left" |
| | | :style="{width:leftIconWidth}"> |
| | | <slot name="left"> |
| | | <view class="uni-navbar__content_view" v-if="leftIcon.length > 0"> |
| | | <uni-icons :color="themeColor" :type="leftIcon" size="20" /> |
| | | </view> |
| | | <view :class="{ 'uni-navbar-btn-icon-left': !leftIcon.length > 0 }" class="uni-navbar-btn-text" |
| | | v-if="leftText.length"> |
| | | <text :style="{ color: themeColor, fontSize: '12px' }">{{ leftText }}</text> |
| | | </view> |
| | | </slot> |
| | | </view> |
| | | <view class="uni-navbar__header-container " @tap="onClickTitle"> |
| | | <slot> |
| | | <view class="uni-navbar__header-container-inner" v-if="title.length>0"> |
| | | <text class="uni-nav-bar-text uni-ellipsis-1" |
| | | :style="{color: themeColor }">{{ title }}</text> |
| | | </view> |
| | | </slot> |
| | | </view> |
| | | <view @click="onClickRight" class="uni-navbar__header-btns uni-navbar__header-btns-right" |
| | | :style="{width:rightIconWidth}"> |
| | | <slot name="right"> |
| | | <view v-if="rightIcon.length"> |
| | | <uni-icons :color="themeColor" :type="rightIcon" size="22" /> |
| | | </view> |
| | | <view class="uni-navbar-btn-text" v-if="rightText.length && !rightIcon.length"> |
| | | <text class="uni-nav-bar-right-text" :style="{ color: themeColor}">{{ rightText }}</text> |
| | | </view> |
| | | </slot> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- #ifndef APP-NVUE --> |
| | | <view class="uni-navbar__placeholder" v-if="fixed"> |
| | | <status-bar v-if="statusBar" /> |
| | | <view class="uni-navbar__placeholder-view" :style="{ height:navbarHeight}" /> |
| | | </view> |
| | | <!-- #endif --> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import statusBar from "./uni-status-bar.vue"; |
| | | const getVal = (val) => typeof val === 'number' ? val + 'px' : val; |
| | | |
| | | /** |
| | | * |
| | | * |
| | | * NavBar 自定义导航栏 |
| | | * @description 导航栏组件,主要用于头部导航 |
| | | * @tutorial https://ext.dcloud.net.cn/plugin?id=52 |
| | | * @property {Boolean} dark 开启黑暗模式 |
| | | * @property {String} title 标题文字 |
| | | * @property {String} leftText 左侧按钮文本 |
| | | * @property {String} rightText 右侧按钮文本 |
| | | * @property {String} leftIcon 左侧按钮图标(图标类型参考 [Icon 图标](http://ext.dcloud.net.cn/plugin?id=28) type 属性) |
| | | * @property {String} rightIcon 右侧按钮图标(图标类型参考 [Icon 图标](http://ext.dcloud.net.cn/plugin?id=28) type 属性) |
| | | * @property {String} color 图标和文字颜色 |
| | | * @property {String} backgroundColor 导航栏背景颜色 |
| | | * @property {Boolean} fixed = [true|false] 是否固定顶部 |
| | | * @property {Boolean} statusBar = [true|false] 是否包含状态栏 |
| | | * @property {Boolean} shadow = [true|false] 导航栏下是否有阴影 |
| | | * @property {Boolean} stat 是否开启统计标题上报 |
| | | * @event {Function} clickLeft 左侧按钮点击时触发 |
| | | * @event {Function} clickRight 右侧按钮点击时触发 |
| | | * @event {Function} clickTitle 中间标题点击时触发 |
| | | */ |
| | | export default { |
| | | name: "UniNavBar", |
| | | components: { |
| | | statusBar |
| | | }, |
| | | emits: ['clickLeft', 'clickRight', 'clickTitle'], |
| | | props: { |
| | | dark: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: "" |
| | | }, |
| | | leftText: { |
| | | type: String, |
| | | default: "" |
| | | }, |
| | | rightText: { |
| | | type: String, |
| | | default: "" |
| | | }, |
| | | leftIcon: { |
| | | type: String, |
| | | default: "" |
| | | }, |
| | | rightIcon: { |
| | | type: String, |
| | | default: "" |
| | | }, |
| | | fixed: { |
| | | type: [Boolean, String], |
| | | default: false |
| | | }, |
| | | color: { |
| | | type: String, |
| | | default: "" |
| | | }, |
| | | backgroundColor: { |
| | | type: String, |
| | | default: "" |
| | | }, |
| | | statusBar: { |
| | | type: [Boolean, String], |
| | | default: false |
| | | }, |
| | | shadow: { |
| | | type: [Boolean, String], |
| | | default: false |
| | | }, |
| | | border: { |
| | | type: [Boolean, String], |
| | | default: true |
| | | }, |
| | | height: { |
| | | type: [Number, String], |
| | | default: 44 |
| | | }, |
| | | leftWidth: { |
| | | type: [Number, String], |
| | | default: 60 |
| | | }, |
| | | rightWidth: { |
| | | type: [Number, String], |
| | | default: 60 |
| | | }, |
| | | stat: { |
| | | type: [Boolean, String], |
| | | default: '' |
| | | } |
| | | }, |
| | | computed: { |
| | | themeBgColor() { |
| | | if (this.dark) { |
| | | // 默认值 |
| | | if (this.backgroundColor) { |
| | | return this.backgroundColor |
| | | } else { |
| | | return this.dark ? '#333' : '#FFF' |
| | | } |
| | | } |
| | | return this.backgroundColor || '#FFF' |
| | | }, |
| | | themeColor() { |
| | | if (this.dark) { |
| | | // 默认值 |
| | | if (this.color) { |
| | | return this.color |
| | | } else { |
| | | return this.dark ? '#fff' : '#333' |
| | | } |
| | | } |
| | | return this.color || '#333' |
| | | }, |
| | | navbarHeight() { |
| | | return getVal(this.height) |
| | | }, |
| | | leftIconWidth() { |
| | | return getVal(this.leftWidth) |
| | | }, |
| | | rightIconWidth() { |
| | | return getVal(this.rightWidth) |
| | | } |
| | | }, |
| | | mounted() { |
| | | if (uni.report && this.stat && this.title !== '') { |
| | | uni.report('title', this.title) |
| | | } |
| | | }, |
| | | methods: { |
| | | onClickLeft() { |
| | | this.$emit("clickLeft"); |
| | | }, |
| | | onClickRight() { |
| | | this.$emit("clickRight"); |
| | | }, |
| | | onClickTitle() { |
| | | this.$emit("clickTitle"); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | $nav-height: 44px; |
| | | |
| | | .uni-nvue-fixed { |
| | | /* #ifdef APP-NVUE */ |
| | | position: sticky; |
| | | /* #endif */ |
| | | } |
| | | .uni-navbar { |
| | | // box-sizing: border-box; |
| | | } |
| | | |
| | | .uni-nav-bar-text { |
| | | /* #ifdef APP-PLUS */ |
| | | font-size: 34rpx; |
| | | /* #endif */ |
| | | /* #ifndef APP-PLUS */ |
| | | font-size: 14px; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .uni-nav-bar-right-text { |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .uni-navbar__content { |
| | | position: relative; |
| | | // background-color: #fff; |
| | | // box-sizing: border-box; |
| | | background-color: transparent; |
| | | } |
| | | |
| | | .uni-navbar__content_view { |
| | | // box-sizing: border-box; |
| | | } |
| | | |
| | | .uni-navbar-btn-text { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: column; |
| | | justify-content: flex-start; |
| | | align-items: center; |
| | | line-height: 12px; |
| | | } |
| | | |
| | | .uni-navbar__header { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | padding: 0 10px; |
| | | flex-direction: row; |
| | | height: $nav-height; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .uni-navbar__header-btns { |
| | | /* #ifndef APP-NVUE */ |
| | | overflow: hidden; |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-wrap: nowrap; |
| | | flex-direction: row; |
| | | width: 120rpx; |
| | | // padding: 0 6px; |
| | | justify-content: center; |
| | | align-items: center; |
| | | /* #ifdef H5 */ |
| | | cursor: pointer; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .uni-navbar__header-btns-left { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | width: 120rpx; |
| | | justify-content: flex-start; |
| | | align-items: center; |
| | | } |
| | | |
| | | .uni-navbar__header-btns-right { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | // width: 150rpx; |
| | | // padding-right: 30rpx; |
| | | justify-content: flex-end; |
| | | align-items: center; |
| | | } |
| | | |
| | | .uni-navbar__header-container { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex: 1; |
| | | padding: 0 10px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .uni-navbar__header-container-inner { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex: 1; |
| | | flex-direction: row; |
| | | align-items: center; |
| | | justify-content: center; |
| | | font-size: 12px; |
| | | overflow: hidden; |
| | | // box-sizing: border-box; |
| | | } |
| | | |
| | | |
| | | .uni-navbar__placeholder-view { |
| | | height: $nav-height; |
| | | } |
| | | |
| | | .uni-navbar--fixed { |
| | | position: fixed; |
| | | z-index: 998; |
| | | /* #ifdef H5 */ |
| | | left: var(--window-left); |
| | | right: var(--window-right); |
| | | /* #endif */ |
| | | /* #ifndef H5 */ |
| | | left: 0; |
| | | right: 0; |
| | | /* #endif */ |
| | | |
| | | } |
| | | |
| | | .uni-navbar--shadow { |
| | | box-shadow: 0 1px 6px #ccc; |
| | | } |
| | | |
| | | .uni-navbar--border { |
| | | border-bottom-width: 1rpx; |
| | | border-bottom-style: solid; |
| | | border-bottom-color: #eee; |
| | | } |
| | | |
| | | .uni-ellipsis-1 { |
| | | overflow: hidden; |
| | | /* #ifndef APP-NVUE */ |
| | | white-space: nowrap; |
| | | text-overflow: ellipsis; |
| | | /* #endif */ |
| | | /* #ifdef APP-NVUE */ |
| | | lines: 1; |
| | | text-overflow: ellipsis; |
| | | /* #endif */ |
| | | } |
| | | |
| | | // 暗主题配置 |
| | | .uni-dark {} |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <view :style="{ height: statusBarHeight }" class="uni-status-bar"> |
| | | <slot /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'UniStatusBar', |
| | | data() { |
| | | return { |
| | | statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px' |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" > |
| | | .uni-status-bar { |
| | | // width: 750rpx; |
| | | height: 20px; |
| | | // height: var(--status-bar-height); |
| | | } |
| | | </style> |
New file |
| | |
| | | { |
| | | "id": "uni-nav-bar", |
| | | "displayName": "uni-nav-bar 自定义导航栏", |
| | | "version": "1.3.11", |
| | | "description": "自定义导航栏组件,主要用于头部导航。", |
| | | "keywords": [ |
| | | "uni-ui", |
| | | "导航", |
| | | "导航栏", |
| | | "自定义导航栏" |
| | | ], |
| | | "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": "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" |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | |
| | | |
| | | ## NavBar 导航栏 |
| | | > **组件名:uni-nav-bar** |
| | | > 代码块: `uNavBar` |
| | | |
| | | 导航栏组件,主要用于头部导航。 |
| | | |
| | | ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) |
| | | #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
| | | |
| | | |
| | | |
| | | |
| | | |
New file |
| | |
| | | ## 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 |
New file |
| | |
| | | @import './styles/index.scss'; |
New file |
| | |
| | | { |
| | | "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" |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | `uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 |
| | | |
| | | ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) |
| | | #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
New file |
| | |
| | | @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'; |
New file |
| | |
| | | .uni-border { |
| | | border: 1px $uni-border-1 solid; |
| | | } |
New file |
| | |
| | | |
| | | // 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; |
| | | } |
New file |
| | |
| | | @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) |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | |
| | | @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); |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | /* #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 */ |
New file |
| | |
| | | @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 */ |
| | | } |
New file |
| | |
| | | // @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; |
New file |
| | |
| | | // 合并 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; |
| | | }; |
New file |
| | |
| | | // 间距基础倍数 |
| | | $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); |
New file |
| | |
| | | @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); |
| | |
| | | import request from '@/utils/request' |
| | | import store from '@/store/index.js' |
| | | export function login(params) { |
| | | return new Promise((resolve, reject) => { |
| | | request.post('/AppUser/logins', params, false).then(result => { |
| | |
| | | } |
| | | export function getUserInfor(token) { |
| | | request.post('/getUserInfo', token).then(result => { |
| | | uni.setStorageSync('userInfo', JSON.stringify(result.data)) |
| | | uni.setStorageSync('userInfor', JSON.stringify(result.data)) |
| | | }) |
| | | } |
| | | export function getDic() { |
| | | request.get('/dict/list').then(result => { |
| | | uni.setStorageSync('dict', JSON.stringify(result.data)) |
| | | uni.setStorageSync('dictObj', JSON.stringify(objToArr(result.data))) |
| | | store.commit('setDict', result.data) |
| | | store.commit('setDictObj', objToArr(result.data)) |
| | | }) |
| | | } |
| | | |
| | |
| | | import storage from './storage' // 缓存封装 |
| | | import store from '../store/index.js' |
| | | export default { |
| | | console(options) { |
| | | if (config.debug) { |
| | |
| | | // loading加载 |
| | | uni.showLoading({ title: '加载中', }) |
| | | // 拼接路劲,下面的配置文件会提到 |
| | | // uni.showLoading({ title: baseUrl, }) |
| | | options.url = baseUrl + '' + options.url |
| | | // 请求方式 |
| | | options.method = options.method || 'GET' |
| | | // 判断登录是否 |
| | | if (isLogin) { |
| | | let token = storage.get('token') |
| | | console.log('tokentoken', token) |
| | | let token = uni.getStorageSync('tonken') |
| | | console.log('token', token) |
| | | if (token !== null) { |
| | | // options.header["token"] = token; |
| | | options.header = { |
| | |
| | | return new Promise((resolve, reject) => { |
| | | uni.request(options).then(data => { |
| | | var [error, res] = data |
| | | if (error != null) { |
| | | if (error !== null) { |
| | | reject(error) |
| | | } else { |
| | | // 相应拦截、根据后端的状态码来写,可以自行判断和封装 |
| | |
| | | export default { |
| | | set(name, value) { |
| | | uni.setStorageSync(name, value); |
| | | }, |
| | | |
| | | setJson(name, value) { |
| | | uni.setStorageSync(name, JSON.stringify(value)); |
| | | }, |
| | | |
| | | get(name) { |
| | | return uni.getStorageSync(name); |
| | | }, |
| | | |
| | | getJson(name) { |
| | | const content = uni.getStorageSync(name); |
| | | if (!content) { |
| | | return null; |
| | | } |
| | | |
| | | return JSON.parse(content); |
| | | }, |
| | | |
| | | remove(name) { |
| | | uni.removeStorageSync(name); |
| | | }, |
| | | |
| | | clear() { |
| | | uni.clearStorageSync(); |
| | | }, |
| | | }; |
| | | set(name, value) { |
| | | uni.setStorageSync(name, value) |
| | | }, |
| | | setJson(name, value) { |
| | | uni.setStorageSync(name, JSON.stringify(value)) |
| | | }, |
| | | get(name) { |
| | | return uni.getStorageSync(name) |
| | | }, |
| | | getJson(name) { |
| | | const content = uni.getStorageSync(name) |
| | | if (!content) { |
| | | return null |
| | | } |
| | | return JSON.parse(content) |
| | | }, |
| | | remove(name) { |
| | | uni.removeStorageSync(name) |
| | | }, |
| | | clear() { |
| | | uni.clearStorageSync() |
| | | }, |
| | | } |