日历部分功能
Showing
21 changed files
with
343 additions
and
36 deletions
363 Bytes
335 Bytes
src/components/date-picker/date-picker.js
0 → 100644
1 | import api from '@/api/api' | ||
2 | import { | ||
3 | httpGet, | ||
4 | httpPost | ||
5 | } from '@/api/fetch-api.js' | ||
6 | |||
7 | import Date from '@/utils/date.js'; | ||
8 | |||
9 | export default { | ||
10 | props: { | ||
11 | // 周末是否可选 | ||
12 | weekend: { | ||
13 | type: Boolean, | ||
14 | default: false | ||
15 | }, | ||
16 | filterDates: { | ||
17 | type: Array, | ||
18 | default(){ | ||
19 | return ["2019-11-26", "2019-11-28"] | ||
20 | } | ||
21 | } | ||
22 | }, | ||
23 | data() { | ||
24 | return { | ||
25 | key: 'value', | ||
26 | year: 1970, | ||
27 | month: 1, // (1~12) | ||
28 | date: 1, // (1~31) | ||
29 | day: 0, // (0~6) | ||
30 | // 用户渲染的数据 | ||
31 | fortmatMonthData: [], | ||
32 | } | ||
33 | }, | ||
34 | components: {}, | ||
35 | methods: { | ||
36 | /** | ||
37 | * 画月历图 | ||
38 | * 所需数据 | ||
39 | * year 年 | ||
40 | * month 月 (1~12) | ||
41 | * date 日 (1~31) | ||
42 | * day 星期几 (0-6) | ||
43 | * | ||
44 | * 输出数据 | ||
45 | * fortmatMonthData 用于渲染日历的数据 | ||
46 | */ | ||
47 | formatMonth() { | ||
48 | let result = []; | ||
49 | let year = this.year; | ||
50 | let month = this.month; | ||
51 | |||
52 | // 获取当月天数 | ||
53 | let dayNum = Date.getDaysInMonth(year, month - 1); | ||
54 | |||
55 | /** | ||
56 | * 排布出当月号码 | ||
57 | * 组装数据 | ||
58 | */ | ||
59 | for (let index = 0; index < dayNum; index++) { | ||
60 | let curData = {} | ||
61 | curData.standards = 0; | ||
62 | let date = index + 1; | ||
63 | let day = Date.parse(`${year}.${month}.${date}`).getDay(); | ||
64 | let isWeekend = day == 0 || day == 6; | ||
65 | let disable = false; // 判断是否不可选 | ||
66 | disable = isWeekend && !this.weekend; // 判断周末不可选 | ||
67 | let filterDates = this.filterDates; | ||
68 | filterDates.forEach(element => { | ||
69 | let curDate = `${year}-${month}-${date}`; | ||
70 | if (element == curDate) { | ||
71 | disable = true; | ||
72 | } | ||
73 | }); | ||
74 | curData = Object.assign({ | ||
75 | year: year, | ||
76 | month: month, | ||
77 | date: date, // (1~31) | ||
78 | day: day, | ||
79 | isWeekend: isWeekend, | ||
80 | disable: disable, | ||
81 | }, curData); | ||
82 | result.push(curData); | ||
83 | } | ||
84 | |||
85 | // 当月1号星期几 0-6 往前塞值 | ||
86 | let dateStr = month + '.' + '1' + '.' + year; | ||
87 | let firstDay = Date.parse(dateStr).getDay(); | ||
88 | |||
89 | // 根据星期几在前面补空格 星期日0格子,星期一1格子,星期六6格子 | ||
90 | for (let index = 0; index < firstDay; index++) { | ||
91 | result.unshift(null); | ||
92 | } | ||
93 | this.fortmatMonthData = result; | ||
94 | }, | ||
95 | // 加/减 月份 | ||
96 | addMonths(value) { | ||
97 | let dateStr = this.month + '.' + this.date + '.' + this.year; | ||
98 | let targetDate = Date.parse(dateStr).addMonths(value); | ||
99 | this.year = targetDate.getFullYear(); | ||
100 | this.month = targetDate.getMonth() + 1; | ||
101 | this.date = targetDate.getDate(); | ||
102 | this.formatMonth(); | ||
103 | }, | ||
104 | // 上一个月 | ||
105 | prevMonth() { | ||
106 | this.addMonths(-1); | ||
107 | }, | ||
108 | // 下一个月 | ||
109 | nextMonth() { | ||
110 | this.addMonths(1); | ||
111 | }, | ||
112 | // 加/减 年份 | ||
113 | addYear(value) { | ||
114 | let dateStr = this.month + '.' + this.date + '.' + this.year; | ||
115 | let targetDate = Date.parse(dateStr).addYears(value); | ||
116 | this.year = targetDate.getFullYear(); | ||
117 | this.month = targetDate.getMonth() + 1; | ||
118 | this.formatMonth(); | ||
119 | }, | ||
120 | // 上一年 | ||
121 | prevYear() { | ||
122 | this.addYear(-1); | ||
123 | }, | ||
124 | // 下一年 | ||
125 | nextYear() { | ||
126 | this.addYear(1); | ||
127 | }, | ||
128 | selectDay(item) { | ||
129 | if (!item) return; | ||
130 | let curData = item; | ||
131 | let date = curData.date; | ||
132 | this.date = date; | ||
133 | }, | ||
134 | initData() {} | ||
135 | }, | ||
136 | mounted() {}, | ||
137 | created() { | ||
138 | // 设置今天日期 | ||
139 | let today = Date.today(); | ||
140 | this.year = today.getFullYear(); | ||
141 | this.month = today.getMonth() + 1; | ||
142 | this.date = today.getDate(); | ||
143 | this.formatMonth(); | ||
144 | } | ||
145 | } |
src/components/date-picker/date-picker.scss
0 → 100644
1 | @import '@/styles/_support'; | ||
2 | |||
3 | // 日历容器 | ||
4 | .date-wrap { | ||
5 | |||
6 | font-family: Arial; | ||
7 | font-size: 14px; | ||
8 | |||
9 | // 日历 | ||
10 | .calendar-wrap { | ||
11 | position: relative; | ||
12 | @extend .bb; | ||
13 | width: 450px; | ||
14 | height: 320px; | ||
15 | border-radius: $borderRadius; | ||
16 | background-color: wheat; | ||
17 | border: solid 1px #dcdddd; | ||
18 | padding: 28px 36px 18px 36px; | ||
19 | background-color: #ffffff; | ||
20 | |||
21 | // 年月标题 | ||
22 | .nav-wrap { | ||
23 | @extend .flc; | ||
24 | align-items: center; | ||
25 | color: $cOrange; | ||
26 | |||
27 | .date-wrap { | ||
28 | @extend .flb; | ||
29 | align-items: center; | ||
30 | |||
31 | .date { | ||
32 | // margin: 0 40px; | ||
33 | width: 154px; | ||
34 | text-align: center; | ||
35 | } | ||
36 | } | ||
37 | |||
38 | .nav-btn2 { | ||
39 | color: #959595; | ||
40 | } | ||
41 | } | ||
42 | |||
43 | .con { | ||
44 | margin: 12px auto 0; | ||
45 | |||
46 | // 表头 | ||
47 | .th { | ||
48 | @extend .flb; | ||
49 | |||
50 | // 单元格 | ||
51 | .td { | ||
52 | color: $cOrange; | ||
53 | } | ||
54 | } | ||
55 | |||
56 | // 表体 | ||
57 | .tr { | ||
58 | @extend .flb; | ||
59 | justify-content: flex-start; | ||
60 | flex-wrap: wrap; | ||
61 | // margin-top: 0px; | ||
62 | |||
63 | .td { | ||
64 | text-align: center; | ||
65 | width: calc(100%/7); | ||
66 | height: 34px; | ||
67 | @extend .flb; | ||
68 | justify-content: center; | ||
69 | align-items: center; | ||
70 | } | ||
71 | } | ||
72 | |||
73 | .point { | ||
74 | width: 28px; | ||
75 | height: 28px; | ||
76 | line-height: 28px; | ||
77 | text-align: center; | ||
78 | border-radius: 100%; | ||
79 | } | ||
80 | |||
81 | .sel { | ||
82 | color: #ffffff; | ||
83 | background-color: $cOrange; | ||
84 | } | ||
85 | } | ||
86 | } | ||
87 | } | ||
88 | |||
89 | .disable { | ||
90 | color: #dcdddd !important; | ||
91 | cursor: default !important; | ||
92 | } |
src/components/date-picker/date-picker.vue
0 → 100644
1 | |||
2 | <template> | ||
3 | <div class="comp"> | ||
4 | <div class="date-wrap"> | ||
5 | <div class="calendar-wrap"> | ||
6 | <!-- 标题 --> | ||
7 | <div class="nav-wrap"> | ||
8 | <div class="date-wrap"> | ||
9 | <div class="pointer nav-btn" @click="prevMonth"> | ||
10 | <img src="@/assets/images/form/date-picker/data-picker-icon-up.png"> | ||
11 | </div> | ||
12 | <div class="date"> | ||
13 | <span class="pointer">{{year}}年{{month}}月</span> | ||
14 | </div> | ||
15 | <div class="pointer nav-btn" @click="nextMonth"> | ||
16 | <img src="@/assets/images/form/date-picker/data-picker-icon-down.png"> | ||
17 | </div> | ||
18 | </div> | ||
19 | </div> | ||
20 | <!-- 日历躯干 --> | ||
21 | <div class="con"> | ||
22 | <!-- 日历表头 --> | ||
23 | <div class="th tr"> | ||
24 | <div class="td" :class="{'disable':!weekend}">日</div> | ||
25 | <div class="td">一</div> | ||
26 | <div class="td">二</div> | ||
27 | <div class="td">三</div> | ||
28 | <div class="td">四</div> | ||
29 | <div class="td">五</div> | ||
30 | <div class="td" :class="{'disable':!weekend}">六</div> | ||
31 | </div> | ||
32 | <!-- 日历主体 --> | ||
33 | <div class="tr"> | ||
34 | <div class="td" v-for="(item,index) in fortmatMonthData" :key="index"> | ||
35 | <div @click="selectDay(item.disable ? null : item)" v-if="item && item.date" class="pointer point" :class="{'sel':item && item.date && item.date == date,'disable':item.disable}"> | ||
36 | <div>{{item && item.date || ""}}</div> | ||
37 | </div> | ||
38 | </div> | ||
39 | </div> | ||
40 | </div> | ||
41 | </div> | ||
42 | </div> | ||
43 | </div> | ||
44 | </template> | ||
45 | |||
46 | <script src="./date-picker.js"></script> | ||
47 | <style lang="scss" scoped> | ||
48 | @import "./date-picker.scss"; | ||
49 | </style> |
... | @@ -87,7 +87,7 @@ export default { | ... | @@ -87,7 +87,7 @@ export default { |
87 | // console.log("curData.value == =", curData.value) | 87 | // console.log("curData.value == =", curData.value) |
88 | if (curData.value == "logout") { | 88 | if (curData.value == "logout") { |
89 | // this.$store.commit("SET_USER_INFO", null); | 89 | // this.$store.commit("SET_USER_INFO", null); |
90 | this._loginHandler(); | 90 | this.loginHandler(); |
91 | } else { | 91 | } else { |
92 | // 不是的话,跳转页面 | 92 | // 不是的话,跳转页面 |
93 | this.$router.push({ | 93 | this.$router.push({ |
... | @@ -101,13 +101,13 @@ export default { | ... | @@ -101,13 +101,13 @@ export default { |
101 | // value: this.dataList[index] | 101 | // value: this.dataList[index] |
102 | // }); | 102 | // }); |
103 | }, | 103 | }, |
104 | _loginHandler() { | 104 | loginHandler() { |
105 | httpPost({ url: api.logout }).then(() => { | 105 | httpPost({ url: api.logout }).then(() => { |
106 | this.$store.commit("SET_USER_INFO", null); | 106 | this.$store.commit("SET_USER_INFO", null); |
107 | this._showLogoutTip(); | 107 | this.showLogoutTip(); |
108 | }); | 108 | }); |
109 | }, | 109 | }, |
110 | _showLogoutTip() { | 110 | showLogoutTip() { |
111 | // 登出后的提示 | 111 | // 登出后的提示 |
112 | alert("登出成功"); | 112 | alert("登出成功"); |
113 | } | 113 | } |
... | @@ -118,6 +118,5 @@ export default { | ... | @@ -118,6 +118,5 @@ export default { |
118 | } | 118 | } |
119 | }, | 119 | }, |
120 | created() { | 120 | created() { |
121 | // this. | ||
122 | }, | 121 | }, |
123 | }; | 122 | }; | ... | ... |
1 | // @import '@/styles/_support'; | 1 | @import '@/styles/_support'; |
2 | @import '@/styles/_utils'; | ||
3 | 2 | ||
4 | .v-footer { | 3 | .v-footer { |
5 | font-family: MicrosoftYaHei; | 4 | font-family: MicrosoftYaHei; |
6 | color: #ffffff; | 5 | color: #ffffff; |
7 | background-color: #2e2b2a; | 6 | background-color: #2e2b2a; |
7 | font-size: $fontSizeSmall; | ||
8 | 8 | ||
9 | .footer-containter { | 9 | .footer-containter { |
10 | margin: 0 auto; | 10 | margin: 0 auto; |
... | @@ -35,9 +35,7 @@ | ... | @@ -35,9 +35,7 @@ |
35 | 35 | ||
36 | // 热线 | 36 | // 热线 |
37 | .hotline { | 37 | .hotline { |
38 | // margin-right: 8rem; | ||
39 | min-width: 280px; | 38 | min-width: 280px; |
40 | // flex: 1; | ||
41 | 39 | ||
42 | .contact { | 40 | .contact { |
43 | .n-item { | 41 | .n-item { |
... | @@ -45,9 +43,8 @@ | ... | @@ -45,9 +43,8 @@ |
45 | } | 43 | } |
46 | 44 | ||
47 | .phone { | 45 | .phone { |
48 | // font-family: Arial; | ||
49 | color: #ea5a26; | 46 | color: #ea5a26; |
50 | font-size: 1.666667rem; | 47 | font-size: $fontSizeTitle; |
51 | font-weight: bold; | 48 | font-weight: bold; |
52 | } | 49 | } |
53 | 50 | ... | ... |
... | @@ -8,7 +8,7 @@ | ... | @@ -8,7 +8,7 @@ |
8 | padding: 2.833333rem 4.0rem 0 3.5rem; | 8 | padding: 2.833333rem 4.0rem 0 3.5rem; |
9 | width: 64.166667rem; | 9 | width: 64.166667rem; |
10 | height: 32.25rem; | 10 | height: 32.25rem; |
11 | border-radius: 8px; | 11 | border-radius: $borderRadius; |
12 | border: solid 1px #f2f2f2; | 12 | border: solid 1px #f2f2f2; |
13 | background-color: #ffffff; | 13 | background-color: #ffffff; |
14 | } | 14 | } |
... | @@ -19,13 +19,13 @@ | ... | @@ -19,13 +19,13 @@ |
19 | margin-bottom: 4.416667rem; | 19 | margin-bottom: 4.416667rem; |
20 | 20 | ||
21 | &-item { | 21 | &-item { |
22 | font-size: 12px; | 22 | font-size: $paddingSmall; |
23 | 23 | ||
24 | &-tit { | 24 | &-tit { |
25 | display: flex; | 25 | display: flex; |
26 | align-items: center; | 26 | align-items: center; |
27 | color: $cOrange; | 27 | color: $cOrange; |
28 | font-size: 18px; | 28 | font-size: $fontSizeTitle; |
29 | font-weight: bold; | 29 | font-weight: bold; |
30 | height: 2.833333rem; | 30 | height: 2.833333rem; |
31 | 31 | ... | ... |
... | @@ -4,13 +4,17 @@ import { | ... | @@ -4,13 +4,17 @@ import { |
4 | httpPost | 4 | httpPost |
5 | } from '@/api/fetch-api.js' | 5 | } from '@/api/fetch-api.js' |
6 | 6 | ||
7 | import DatePicker from '@/components/date-picker/date-picker.vue' | ||
8 | |||
7 | export default { | 9 | export default { |
8 | data() { | 10 | data() { |
9 | return { | 11 | return { |
10 | key: 'value' | 12 | key: 'value' |
11 | } | 13 | } |
12 | }, | 14 | }, |
13 | components: {}, | 15 | components: { |
16 | DatePicker | ||
17 | }, | ||
14 | methods: { | 18 | methods: { |
15 | initData() {} | 19 | initData() {} |
16 | }, | 20 | }, | ... | ... |
... | @@ -153,11 +153,11 @@ const routes = [ | ... | @@ -153,11 +153,11 @@ const routes = [ |
153 | } | 153 | } |
154 | }, | 154 | }, |
155 | // 404页面 | 155 | // 404页面 |
156 | { | 156 | // { |
157 | path: '*', // * 表示上面路径匹配不到的都显示这个页面 | 157 | // path: '*', // * 表示上面路径匹配不到的都显示这个页面 |
158 | name: '404', | 158 | // name: '404', |
159 | component: Index | 159 | // component: Index |
160 | }, | 160 | // }, |
161 | ] | 161 | ] |
162 | 162 | ||
163 | // add route path | 163 | // add route path | ... | ... |
... | @@ -94,10 +94,13 @@ | ... | @@ -94,10 +94,13 @@ |
94 | text-align: center; | 94 | text-align: center; |
95 | color: #ffffff; | 95 | color: #ffffff; |
96 | background-color: #f05a23; | 96 | background-color: #f05a23; |
97 | // box-shadow: 0px 10px 13px 0 rgba(236, 100, 41, 0.2); | ||
98 | // background-blend-mode: soft-light, ; | ||
99 | // background-image: linear-gradient(to bottom, #f05f28, #f05021); | ||
100 | |||
97 | box-shadow: 0px 10px 13px 0 rgba(236, 100, 41, 0.2); | 101 | box-shadow: 0px 10px 13px 0 rgba(236, 100, 41, 0.2); |
98 | background-blend-mode: soft-light, ; | 102 | background-blend-mode: soft-light, ; |
99 | // background-image: linear-gradient(to top, #000000, #ffffff), linear-gradient(to bottom, #f05a23, #f05a23); | 103 | background-image: linear-gradient(to top, #000000, #ffffff), linear-gradient(to bottom, #ec6429, #ec6429); |
100 | background-image: linear-gradient(to bottom, #f05f28, #f05021); | ||
101 | } | 104 | } |
102 | 105 | ||
103 | 106 | ... | ... |
... | @@ -3,18 +3,23 @@ | ... | @@ -3,18 +3,23 @@ |
3 | background-size: 100% 100%; | 3 | background-size: 100% 100%; |
4 | } | 4 | } |
5 | 5 | ||
6 | |||
7 | //flex 布局和 子元素 对其方式 | 6 | //flex 布局和 子元素 对其方式 |
8 | .fl { | 7 | .fl { |
9 | display: flex; | 8 | display: flex; |
10 | } | 9 | } |
11 | 10 | ||
12 | .fj { | 11 | .flc { |
12 | display: flex; | ||
13 | justify-content: center; | ||
14 | } | ||
15 | |||
16 | .flb { | ||
13 | display: flex; | 17 | display: flex; |
14 | justify-content: space-between; | 18 | justify-content: space-between; |
15 | } | 19 | } |
16 | 20 | ||
17 | .fla{ | 21 | |
22 | .fla { | ||
18 | display: flex; | 23 | display: flex; |
19 | align-items: center; | 24 | align-items: center; |
20 | } | 25 | } |
... | @@ -53,10 +58,10 @@ | ... | @@ -53,10 +58,10 @@ |
53 | text-align: center; | 58 | text-align: center; |
54 | } | 59 | } |
55 | 60 | ||
56 | .bc{ | 61 | .bc { |
57 | text-align: center; | 62 | text-align: center; |
58 | } | 63 | } |
59 | 64 | ||
60 | .flex1{ | 65 | .flex1 { |
61 | flex: 1; | 66 | flex: 1; |
62 | } | 67 | } | ... | ... |
... | @@ -6,6 +6,10 @@ | ... | @@ -6,6 +6,10 @@ |
6 | * | 6 | * |
7 | */ | 7 | */ |
8 | 8 | ||
9 | |||
10 | $borderRadiusSmall:5px; | ||
11 | $borderRadius:8px; | ||
12 | |||
9 | // Margin | 13 | // Margin |
10 | $marginSmall: 10px; // 小间距 | 14 | $marginSmall: 10px; // 小间距 |
11 | $marginMedium: 28px; // 间距 | 15 | $marginMedium: 28px; // 间距 |
... | @@ -29,3 +33,9 @@ $cGray:#bfbfbf; | ... | @@ -29,3 +33,9 @@ $cGray:#bfbfbf; |
29 | $cDark:#dcdcdc; | 33 | $cDark:#dcdcdc; |
30 | $cLightBlack:#333333; | 34 | $cLightBlack:#333333; |
31 | $cFontGray: #4c4948; | 35 | $cFontGray: #4c4948; |
36 | |||
37 | |||
38 | // 移动端 | ||
39 | $marginSmall-M: 10px; // 小间距 | ||
40 | $marginMedium-M: 20px; // 间距 | ||
41 | // $marginLarge: 28px; | ... | ... |
-
Please register or sign in to post a comment