hookehuyr

✨ feat: 新增评分模块

1 +<!--
2 + * @Date: 2022-09-08 15:47:54
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-09-08 16:20:11
5 + * @FilePath: /data-table/src/components/RatePickerField/index.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="rate-field">
10 + <div class="label">{{ item.label }}<span v-if="item.required">&nbsp;*</span></div>
11 + <van-rate v-model="rate_value" :count="item.component_props.count" @change="onChange" style="padding: 1rem;" />
12 + <div v-if="show_empty" class="van-field__error-message" style="padding: 0 1rem 1rem 1rem;">评分不能为空</div>
13 + </div>
14 +</template>
15 +
16 +<script setup>
17 +const props = defineProps({
18 + item: Object
19 +});
20 +const emit = defineEmits(['active']);
21 +const show_empty = ref(false);
22 +const rate_value = ref(0);
23 +
24 +const onChange = () => {
25 + props.item.value = { key: 'rate', value: rate_value.value };
26 + emit('active', props.item.value);
27 +}
28 +
29 +onMounted(() => {
30 + props.item.value = { key: 'rate', value: rate_value.value };
31 + emit('active', props.item.value);
32 +});
33 +
34 +const validRate = () => {
35 + // 必填项
36 + if (props.item.required && !rate_value.value) {
37 + show_empty.value = true;
38 + } else {
39 + show_empty.value = false;
40 + }
41 + return !show_empty.value
42 +}
43 +
44 +defineExpose({ validRate });
45 +</script>
46 +
47 +<style lang="less" scoped>
48 +.rate-field {
49 + .label {
50 + padding: 1rem 1rem 0 1rem;
51 + font-size: 0.9rem;
52 + font-weight: bold;
53 +
54 + span {
55 + color: red;
56 + }
57 + }
58 +}
59 +</style>
...@@ -13,6 +13,7 @@ import ImageUploaderField from '@/components/ImageUploaderField/index.vue' ...@@ -13,6 +13,7 @@ import ImageUploaderField from '@/components/ImageUploaderField/index.vue'
13 import PhoneField from '@/components/PhoneField/index.vue' 13 import PhoneField from '@/components/PhoneField/index.vue'
14 import EmailField from '@/components/EmailField/index.vue' 14 import EmailField from '@/components/EmailField/index.vue'
15 import SignField from '@/components/SignField/index.vue' 15 import SignField from '@/components/SignField/index.vue'
16 +import RatePickerField from '@/components/RatePickerField/index.vue'
16 17
17 /** 18 /**
18 * 生成自定义组件类型 19 * 生成自定义组件类型
...@@ -30,6 +31,7 @@ import SignField from '@/components/SignField/index.vue' ...@@ -30,6 +31,7 @@ import SignField from '@/components/SignField/index.vue'
30 * @type phone 手机输入框 PhoneField 31 * @type phone 手机输入框 PhoneField
31 * @type email 邮箱输入框 EmailField 32 * @type email 邮箱输入框 EmailField
32 * @type sign 电子签名输入框 SignField 33 * @type sign 电子签名输入框 SignField
34 + * @type rate_picker 评分选择器 RatePickerField
33 */ 35 */
34 export function createComponentType(data) { 36 export function createComponentType(data) {
35 // 判断类型和使用组件 37 // 判断类型和使用组件
...@@ -91,5 +93,9 @@ export function createComponentType(data) { ...@@ -91,5 +93,9 @@ export function createComponentType(data) {
91 item.name = item.key; 93 item.name = item.key;
92 item.component = SignField; 94 item.component = SignField;
93 } 95 }
96 + if (item.component_props.name === 'rate_picker') {
97 + item.name = item.key;
98 + item.component = RatePickerField;
99 + }
94 }) 100 })
95 } 101 }
......
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
2 * @Author: hookehuyr hookehuyr@gmail.com 2 * @Author: hookehuyr hookehuyr@gmail.com
3 * @Date: 2022-05-31 12:06:19 3 * @Date: 2022-05-31 12:06:19
4 * @LastEditors: hookehuyr hookehuyr@gmail.com 4 * @LastEditors: hookehuyr hookehuyr@gmail.com
5 - * @LastEditTime: 2022-09-08 15:06:26 5 + * @LastEditTime: 2022-09-08 15:47:18
6 * @FilePath: /data-table/src/main.js 6 * @FilePath: /data-table/src/main.js
7 * @Description: 7 * @Description:
8 */ 8 */
9 import { createApp } from 'vue'; 9 import { createApp } from 'vue';
10 -import { Button, Image as VanImage, Col, Row, Icon, Form, Field, CellGroup, ConfigProvider, Toast, Uploader, Empty, Tab, Tabs, Overlay, NumberKeyboard, Lazyload, List, PullRefresh, Popup, Picker, Sticky, Stepper, Tag, Swipe, SwipeItem, Dialog, ActionSheet, Loading, Checkbox, Search, NavBar, Collapse, CollapseItem, RadioGroup, Radio, CheckboxGroup, Area, DatePicker, TimePicker, PickerGroup } from 'vant'; 10 +import { Button, Image as VanImage, Col, Row, Icon, Form, Field, CellGroup, ConfigProvider, Toast, Uploader, Empty, Tab, Tabs, Overlay, NumberKeyboard, Lazyload, List, PullRefresh, Popup, Picker, Sticky, Stepper, Tag, Swipe, SwipeItem, Dialog, ActionSheet, Loading, Checkbox, Search, NavBar, Collapse, CollapseItem, RadioGroup, Radio, CheckboxGroup, Area, DatePicker, TimePicker, PickerGroup, Rate } from 'vant';
11 import router from './router'; 11 import router from './router';
12 import App from './App.vue'; 12 import App from './App.vue';
13 // import axios from './utils/axios'; 13 // import axios from './utils/axios';
...@@ -25,6 +25,6 @@ app.config.warnHandler = () => null; ...@@ -25,6 +25,6 @@ app.config.warnHandler = () => null;
25 25
26 app.config.globalProperties.$http = axios; // 关键语句 26 app.config.globalProperties.$http = axios; // 关键语句
27 27
28 -app.use(pinia).use(router).use(Button).use(VanImage).use(Col).use(Row).use(Icon).use(Form).use(Field).use(CellGroup).use(Toast).use(Uploader).use(Empty).use(Tab).use(Tabs).use(Overlay).use(NumberKeyboard).use(Lazyload).use(List).use(PullRefresh).use(Popup).use(Picker).use(Sticky).use(Stepper).use(Tag).use(Swipe).use(SwipeItem).use(Dialog).use(ActionSheet).use(Loading).use(Checkbox).use(Search).use(ConfigProvider).use(NavBar).use(Collapse).use(CollapseItem).use(Radio).use(RadioGroup).use(CheckboxGroup).use(Area).use(DatePicker).use(TimePicker).use(PickerGroup); 28 +app.use(pinia).use(router).use(Button).use(VanImage).use(Col).use(Row).use(Icon).use(Form).use(Field).use(CellGroup).use(Toast).use(Uploader).use(Empty).use(Tab).use(Tabs).use(Overlay).use(NumberKeyboard).use(Lazyload).use(List).use(PullRefresh).use(Popup).use(Picker).use(Sticky).use(Stepper).use(Tag).use(Swipe).use(SwipeItem).use(Dialog).use(ActionSheet).use(Loading).use(Checkbox).use(Search).use(ConfigProvider).use(NavBar).use(Collapse).use(CollapseItem).use(Radio).use(RadioGroup).use(CheckboxGroup).use(Area).use(DatePicker).use(TimePicker).use(PickerGroup).use(Rate);
29 app.use(vueEsign) 29 app.use(vueEsign)
30 app.mount('#app'); 30 app.mount('#app');
......
1 <!-- 1 <!--
2 * @Date: 2022-07-18 10:22:22 2 * @Date: 2022-07-18 10:22:22
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2022-09-08 15:22:09 4 + * @LastEditTime: 2022-09-08 17:50:25
5 * @FilePath: /data-table/src/views/index.vue 5 * @FilePath: /data-table/src/views/index.vue
6 * @Description: 首页 6 * @Description: 首页
7 --> 7 -->
...@@ -205,15 +205,26 @@ onMounted(() => { ...@@ -205,15 +205,26 @@ onMounted(() => {
205 // multiple: false 205 // multiple: false
206 // } 206 // }
207 // } 207 // }
208 + // {
209 + // key: 'datetime',
210 + // value: '2022-06-01 12:00',
211 + // label: '日期时间',
212 + // placeholder: '请选择日期时间',
213 + // component_props: {
214 + // name: 'datetime_picker',
215 + // title: '请选择',
216 + // minDate: new Date(),
217 + // },
218 + // required: true,
219 + // },
208 { 220 {
209 - key: 'datetime', 221 + key: 'rate',
210 - value: '2022-06-01 12:00', 222 + value: '',
211 - label: '日期时间', 223 + label: '评分',
212 - placeholder: '请选择日期时间', 224 + placeholder: '请选择评分',
213 component_props: { 225 component_props: {
214 - name: 'datetime_picker', 226 + name: 'rate_picker',
215 - title: '请选择', 227 + count: 10
216 - minDate: new Date(),
217 }, 228 },
218 required: true, 229 required: true,
219 } 230 }
...@@ -223,6 +234,7 @@ onMounted(() => { ...@@ -223,6 +234,7 @@ onMounted(() => {
223 }) 234 })
224 235
225 const sign = ref(null); 236 const sign = ref(null);
237 +const rate_picker = ref(null);
226 238
227 const onSubmit = (values) => { 239 const onSubmit = (values) => {
228 // 合并自定义字段到提交表单字段 240 // 合并自定义字段到提交表单字段
...@@ -230,8 +242,8 @@ const onSubmit = (values) => { ...@@ -230,8 +242,8 @@ const onSubmit = (values) => {
230 // console.warn(mockData.value); 242 // console.warn(mockData.value);
231 // 检查非表单输入项 243 // 检查非表单输入项
232 if (validOther()) { // 通过验证 244 if (validOther()) { // 通过验证
233 - console.warn('通过验证');
234 console.warn(postData.value); 245 console.warn(postData.value);
246 + console.warn('通过验证');
235 } else { 247 } else {
236 console.warn('不通过验证'); 248 console.warn('不通过验证');
237 } 249 }
...@@ -242,6 +254,9 @@ const onActive = (item) => { ...@@ -242,6 +254,9 @@ const onActive = (item) => {
242 if (item.key === 'sign') { 254 if (item.key === 'sign') {
243 postData.value['sign'] = item.value 255 postData.value['sign'] = item.value
244 } 256 }
257 + if (item.key === 'rate') {
258 + postData.value['rate'] = item.value
259 + }
245 } 260 }
246 261
247 const validOther = () => { 262 const validOther = () => {
...@@ -250,6 +265,9 @@ const validOther = () => { ...@@ -250,6 +265,9 @@ const validOther = () => {
250 if (sign.value) { // 检验电子签名 265 if (sign.value) { // 检验电子签名
251 flag = sign.value[0].validSign(); 266 flag = sign.value[0].validSign();
252 } 267 }
268 + if (rate_picker.value) { // 检验评分
269 + flag = rate_picker.value[0].validRate();
270 + }
253 return flag; 271 return flag;
254 } 272 }
255 </script> 273 </script>
......