Commit caf23611 by pangchong

feat: 提交

parent 93b00d6f
...@@ -8,7 +8,6 @@ export const getRqmListApi = (data, config) => { ...@@ -8,7 +8,6 @@ export const getRqmListApi = (data, config) => {
config config
}) })
} }
export const getRqmOptionsApi = (data, config) => { export const getRqmOptionsApi = (data, config) => {
return http({ return http({
method: 'POST', method: 'POST',
...@@ -17,3 +16,11 @@ export const getRqmOptionsApi = (data, config) => { ...@@ -17,3 +16,11 @@ export const getRqmOptionsApi = (data, config) => {
config config
}) })
} }
export const updateRqmDataApi = (data, config) => {
return http({
method: 'POST',
url: '/RepairControl/updateRqmData',
data,
config
})
}
...@@ -9,3 +9,8 @@ export const appealInfo = [ ...@@ -9,3 +9,8 @@ export const appealInfo = [
{ label: '申诉跟踪', value: 1 }, { label: '申诉跟踪', value: 1 },
{ label: '申诉关闭', value: 2 } { label: '申诉关闭', value: 2 }
] ]
export const eventType = [
{ label: '扣分', value: 0 },
{ label: '加分', value: 1 }
]
<template> <template>
<picker mode="selector" :range="getRange" @change="onChange" :disabled="disabled" :value="getPickerValue"> <picker
<view class="picker placeholder" :class="{ placeholder: !!getVal }" :style="getStyle"> :mode="mode"
<text>{{ getVal }}</text> :range="getRange"
<uni-icons type="right" size="18" color="#86909C"></uni-icons> @change="onChange"
:disabled="disabled"
:value="mode == 'selector' ? getPickerValue : getVal"
style="flex: auto"
>
<view class="picker" :class="{ placeholder: !!getVal, disabled }" :style="getStyle">
<text class="picker-value">{{ getVal }}</text>
<view class="picker-icon">
<view class="picker-icon-close" v-if="clearable && selectedValue" @tap.stop="clear">
<up-icon name="close-circle-fill" color="#c0c4cc" size="36rpx"></up-icon>
</view>
<up-icon name="arrow-right" color="#86909C" size="36rpx"></up-icon>
</view>
</view> </view>
</picker> </picker>
</template> </template>
<script setup> <script setup>
import { computed, onMounted, ref } from 'vue' import { computed, onMounted, ref, watch } from 'vue'
import * as dictData from './dictData' import * as dictData from './dictData'
import { cloneDeep } from 'lodash' import { cloneDeep } from 'lodash'
import Day from '@/utils/dayjs'
const es = defineEmits(['update:modelValue', 'change']) const es = defineEmits(['update:modelValue', 'change'])
const ps = defineProps({ const ps = defineProps({
// selector,date
mode: {
type: String,
default: 'selector'
},
dictkey: { dictkey: {
type: String, type: String,
default: '' default: ''
...@@ -26,6 +44,10 @@ const ps = defineProps({ ...@@ -26,6 +44,10 @@ const ps = defineProps({
type: Array, type: Array,
default: () => [] default: () => []
}, },
clearable: {
type: Boolean,
default: false
},
labelField: { labelField: {
type: String, type: String,
default: 'label' default: 'label'
...@@ -34,9 +56,9 @@ const ps = defineProps({ ...@@ -34,9 +56,9 @@ const ps = defineProps({
type: String, type: String,
default: 'value' default: 'value'
}, },
align: { pickAlign: {
type: String, type: String,
default: 'right' default: 'left'
}, },
placeholder: { placeholder: {
type: String, type: String,
...@@ -48,30 +70,62 @@ const ps = defineProps({ ...@@ -48,30 +70,62 @@ const ps = defineProps({
} }
}) })
const getStyle = computed(() => { const getStyle = computed(() => {
let pickAlign = 'flex-start'
if (ps.pickAlign == 'center') {
pickAlign = 'center'
} else if (ps.pickAlign == 'right') {
pickAlign = 'flex-end'
}
return { return {
textAlign: ps.align justifyContent: pickAlign
} }
}) })
const selectedValue = ref() const selectedValue = ref('')
watch(
() => ps.modelValue,
(value) => {
selectedValue.value = value
}
)
//获取options //获取options
const getOptions = computed(() => { const getOptions = computed(() => {
if (ps.dictkey) { if (ps.dictkey) {
return cloneDeep(dictData[ps.dictkey]) return cloneDeep(dictData[ps.dictkey])
} else { } else {
if (ps.options && Object.prototype.toString.call(ps.options[0]) == '[object object]') {
return ps.options return ps.options
} else {
return ps.options.map((item) => {
return {
[ps.labelField]: item,
[ps.valueField]: item
}
})
}
} }
}) })
const getRange = computed(() => { const getRange = computed(() => {
return getOptions.value.map((option) => option[ps.labelField]) return getOptions.value.map((option) => option[ps.labelField])
}) })
const onChange = (event) => { const onChange = (event) => {
if (ps.mode == 'selector') {
const index = event.detail.value const index = event.detail.value
selectedValue.value = getOptions.value[index][ps.labelField] selectedValue.value = getOptions.value[index][ps.labelField]
es('update:modelValue', getOptions.value[index][ps.valueField]) es('update:modelValue', getOptions.value[index][ps.valueField])
es('change', getOptions.value[index][ps.valueField]) es('change', getOptions.value[index][ps.valueField])
} else {
selectedValue.value = event.detail.value
es('update:modelValue', Day(selectedValue.value).valueOf())
es('change', Day(selectedValue.value).valueOf())
}
} }
const getVal = computed(() => { const getVal = computed(() => {
if (ps.mode == 'selector') {
return selectedValue.value || ps.placeholder return selectedValue.value || ps.placeholder
} else {
//日期
return uni.$tool.timeStampFormat(selectedValue.value, { format: 'YYYY-MM-DD' }) || ps.placeholder
}
}) })
//获取初始值 //获取初始值
const init = () => { const init = () => {
...@@ -84,19 +138,34 @@ const getPickerValue = computed(() => { ...@@ -84,19 +138,34 @@ const getPickerValue = computed(() => {
const index = getOptions.value.findIndex((option) => String(option[ps.valueField]) === String(ps.modelValue)) const index = getOptions.value.findIndex((option) => String(option[ps.valueField]) === String(ps.modelValue))
return index > 0 ? index : 0 return index > 0 ? index : 0
}) })
//清空值
const clear = () => {
selectedValue.value = ''
}
onMounted(() => { onMounted(() => {
init() init()
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.picker { .picker {
line-height: 40rpx; line-height: 48rpx;
display: flex;
align-items: center;
&-value {
color: #1d2129;
}
&.placeholder { &.placeholder {
color: #86909c; color: #86909c;
} }
uni-icons { &.disabled {
position: relative; background: #f5f7fa;
top: 4rpx; }
&-icon {
display: flex;
align-items: center;
&-close {
margin-left: 4rpx;
}
} }
} }
</style> </style>
...@@ -28,11 +28,11 @@ const ps = defineProps({ ...@@ -28,11 +28,11 @@ const ps = defineProps({
}, },
width: { width: {
type: [String, Number], type: [String, Number],
default: 155 default: 80
}, },
height: { height: {
type: [String, Number], type: [String, Number],
default: 155 default: 80
}, },
url: { url: {
type: String, type: String,
...@@ -41,8 +41,8 @@ const ps = defineProps({ ...@@ -41,8 +41,8 @@ const ps = defineProps({
}) })
const getUploadButtonSize = computed(() => { const getUploadButtonSize = computed(() => {
return { return {
width: ps.width + 'rpx', width: ps.width + 'px',
height: ps.height + 'rpx' height: ps.height + 'px'
} }
}) })
...@@ -81,9 +81,6 @@ const uploadFilePromise = (url) => { ...@@ -81,9 +81,6 @@ const uploadFilePromise = (url) => {
url: ps.url, url: ps.url,
filePath: url, filePath: url,
name: 'file', name: 'file',
formData: {
user: 'test'
},
success: (res) => { success: (res) => {
setTimeout(() => { setTimeout(() => {
resolve(res.data.data) resolve(res.data.data)
......
import { createSSRApp } from 'vue' import { createSSRApp } from 'vue'
import App from './App.vue' import App from './App.vue'
import pinia from './store' import pinia from './store'
import uviewPlus, { setConfig } from 'uview-plus' import uviewPlus from 'uview-plus'
import * as message from '@/utils/message' import * as message from '@/utils/message'
import * as tool from '@/utils/tool' import * as tool from '@/utils/tool'
// 引入字体 // 引入字体
...@@ -14,22 +14,6 @@ export function createApp() { ...@@ -14,22 +14,6 @@ export function createApp() {
const app = createSSRApp(App) const app = createSSRApp(App)
app.use(pinia) app.use(pinia)
app.use(uviewPlus) app.use(uviewPlus)
setConfig({
// 修改$u.config对象的属性
config: {
// 修改默认单位为rpx,相当于执行 uni.$u.config.unit = 'rpx'
unit: 'rpx'
},
// 修改$u.props对象的属性
props: {
// 修改radio组件的size参数的默认值,相当于执行 uni.$u.props.radio.size = 30
radio: {
size: 15
}
// 其他组件属性配置
// ......
}
})
return { return {
app app
} }
......
...@@ -2,14 +2,14 @@ ...@@ -2,14 +2,14 @@
<global-page title="添加公司值班信息" showEdit @handleCancel="handleCancel" @handleSave="handleSave"> <global-page title="添加公司值班信息" showEdit @handleCancel="handleCancel" @handleSave="handleSave">
<view class="form"> <view class="form">
<up-form labelPosition="left" labelWidth="auto"> <up-form labelPosition="left" labelWidth="auto">
<up-form-item label="公司值班经理" borderBottom> <up-form-item label="公司值班经理" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="公司值班经理意见" borderBottom> <up-form-item label="公司值班经理意见" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="公司值班经理意见描述" borderBottom labelPosition="top"> <up-form-item label="公司值班经理意见描述" :borderBottom="true" labelPosition="top">
<up-textarea placeholder="一段很长很长的内容文字,长文本自动换行,该选项的描述是一段很长的内容"></up-textarea> <up-textarea placeholder="一段很长很长的内容文字,长文本自动换行,该选项的描述是一段很长的内容" autoHeight></up-textarea>
</up-form-item> </up-form-item>
</up-form> </up-form>
</view> </view>
......
...@@ -2,45 +2,53 @@ ...@@ -2,45 +2,53 @@
<global-page title="考核记录登记"> <global-page title="考核记录登记">
<view class="content"> <view class="content">
<view class="form"> <view class="form">
<up-form labelPosition="left" labelWidth="auto"> <up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef" :rules="rules">
<up-form-item label="事件来源" borderBottom> <up-form-item label="事件来源" :borderBottom="true">
<up-input border="none" inputAlign="right" placeholder="请输入"></up-input> <up-input border="none" inputAlign="right" placeholder="请输入" clearable v-model="formData.eventSource"></up-input>
</up-form-item> </up-form-item>
<up-form-item label="基地/职能部门" borderBottom> <up-form-item label="基地/职能部门" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable v-model="formData.department" :options="department"></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="考核对象" borderBottom> <up-form-item label="考核对象" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable v-model="formData.appraisee" :options="appraisee"></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="机号" borderBottom> <up-form-item label="机号" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable :options="deviceNumSelect" v-model="formData.ac"></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="客户" borderBottom> <up-form-item label="客户" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable v-model="formData.acOwn" disabled></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="机型" borderBottom> <up-form-item label="机型" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable v-model="formData.acType" disabled></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="日期" borderBottom> <up-form-item label="日期" :borderBottom="true" required prop="eventTime">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable v-model="formData.eventTime" mode="date"></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="事件描述" borderBottom labelPosition="top"> <up-form-item label="事件描述" :borderBottom="true" labelPosition="top">
<up-textarea placeholder="一段很长很长的内容文字,长文本自动换行,该选项的描述是一段很长的内容"></up-textarea> <up-textarea
placeholder="一段很长很长的内容文字,长文本自动换行,该选项的描述是一段很长的内容"
v-model="formData.eventMsg"
:height="70"
></up-textarea>
</up-form-item> </up-form-item>
<up-form-item label="事件类别" borderBottom> <up-form-item label="事件类别" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable v-model="formData.eventType" dictkey="eventType"></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="考核类型" borderBottom> <up-form-item label="考核类型" :borderBottom="true">
<global-picker aligh="right"></global-picker> <global-picker pickAlign="right" clearable v-model="formData.examineType" :options="examineType"></global-picker>
</up-form-item> </up-form-item>
<up-form-item label="考核依据" borderBottom labelPosition="top"> <up-form-item label="考核依据" :borderBottom="true" labelPosition="top">
<up-textarea placeholder="一段很长很长的内容文字,长文本自动换行,该选项的描述是一段很长的内容"></up-textarea> <up-textarea
placeholder="一段很长很长的内容文字,长文本自动换行,该选项的描述是一段很长的内容"
v-model="formData.examineBasis"
:height="70"
></up-textarea>
</up-form-item> </up-form-item>
<up-form-item label="分值" borderBottom> <up-form-item label="分值" :borderBottom="true">
<up-input border="none" inputAlign="right" placeholder="请输入"></up-input> <up-input border="none" inputAlign="right" placeholder="请输入" v-model.number="formData.score" type="number"></up-input>
</up-form-item> </up-form-item>
<up-form-item label="当班人员" borderBottom> <up-form-item label="当班人员" :borderBottom="true">
<up-input border="none" inputAlign="right" placeholder="请输入"></up-input> <up-input border="none" inputAlign="right" placeholder="请输入" v-model="formData.onDutyUser"></up-input>
</up-form-item> </up-form-item>
</up-form> </up-form>
</view> </view>
...@@ -79,39 +87,98 @@ ...@@ -79,39 +87,98 @@
<view class="appeal"> <view class="appeal">
<view class="appeal-title"> <view class="appeal-title">
<text>申诉情况</text> <text>申诉情况</text>
<global-picker></global-picker> <global-picker pickAlign="right" dictkey="appealInfo" clearable></global-picker>
</view>
<view class="appeal-content">
<global-upload v-model="fileList"></global-upload>
</view> </view>
<!-- <view class="appeal-content">
<global-upload v-model="formData.file" url="/resource/uploadFile"></global-upload>
</view> -->
</view> </view>
</view> </view>
<template #bottom> <template #bottom>
<view class="submit-btn"> <view class="submit-btn">
<global-button type="primary" size="large">保存</global-button> <global-button type="primary" size="large" @tap="handleSubmit">保存</global-button>
</view> </view>
</template> </template>
</global-page> </global-page>
</template> </template>
<script setup> <script setup>
import { ref } from 'vue' import { reactive, ref } from 'vue'
import CardDetails from './components/card-details.vue' import CardDetails from './components/card-details.vue'
import CardDetailsItem from './components/card-details-item.vue' import CardDetailsItem from './components/card-details-item.vue'
import { onLoad } from '@dcloudio/uni-app' import { onLoad } from '@dcloudio/uni-app'
import { showData } from '@/utils/tool' import { showData } from '@/utils/tool'
import useBaseStore from '@/store/base'
import { useGetDictByValue } from '@/components/global-picker/useDict'
import useAppraisalRecordStore from '@/store/appraisal-record'
import { updateRqmDataApi } from '@/api/appraisal-record'
// 校验规则
const rules = {
eventTime: [
{
required: true,
message: '请选择日期',
trigger: ['blur', 'change']
}
]
}
//获取下拉框选项
const {
selectList: { deviceNumSelect }
} = useBaseStore()
const {
selectList: { appraisee, department, examineType }
} = useAppraisalRecordStore()
// 表单数据
const formData = reactive({
id: '',
ac: '',
acOwn: '',
acType: '',
appealInfo: '',
appraisee: '',
department: '',
dmUid: '',
eventMsg: '',
eventSource: '',
eventTime: '',
eventType: '',
examineBasis: '',
examineType: '',
onDutyUser: '',
opinionMsg: '',
opinionType: '',
score: null,
qmUid: '',
qualityOpinionMsg: '',
qualityOpinionType: '',
status: '',
file: [],
emailSendTime: ''
})
//提交表单
const formRef = ref()
const handleSubmit = async () => {
await formRef.value?.validate()
const res = await updateRqmDataApi(formData, { loading: true })
if (res.code == 200) {
} else {
uni.$message.showToast(res.message)
}
}
// 添加
const handleAdd = () => {
uni.navigateTo({ url: 'add' })
}
//获取页面内容
const details = ref() const details = ref()
onLoad(() => { onLoad(() => {
uni.$once('appraisalRecordEdit', (data) => { uni.$once('appraisalRecordEdit', (data) => {
details.value = data details.value = data
Object.assign(formData, data)
}) })
}) })
const fileList = ref([])
// 添加
const handleAdd = () => {
uni.navigateTo({ url: 'add' })
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.content { .content {
......
...@@ -22,9 +22,10 @@ ...@@ -22,9 +22,10 @@
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
import { getRqmListApi, getRqmOptionsApi } from '@/api/appraisal-record' import { getRqmListApi } from '@/api/appraisal-record'
import { onLoad } from '@dcloudio/uni-app' import { onLoad } from '@dcloudio/uni-app'
import { showData } from '@/utils/tool' import { showData } from '@/utils/tool'
import useAppraisalRecordStore from '@/store/appraisal-record'
const tabList = ref([ const tabList = ref([
{ name: 'OPEN', value: 1 }, { name: 'OPEN', value: 1 },
...@@ -40,22 +41,10 @@ const goDetails = (data) => { ...@@ -40,22 +41,10 @@ const goDetails = (data) => {
} }
}) })
} }
//获取选项数据 //加载下拉框数据
const appraisee = ref([]) const appraisalRecordStore = useAppraisalRecordStore()
const department = ref([])
const examineType = ref([])
const getRqmOptions = async () => {
const res = await getRqmOptionsApi()
if (res.code == 200) {
appraisee.value = res.data.appraisee || []
department.value = res.data.department || []
examineType.value = res.data.examineType || []
} else {
uni.$message.showToast(res.message)
}
}
onLoad(() => { onLoad(() => {
getRqmOptions() appraisalRecordStore.getRqmOptions()
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -15,8 +15,8 @@ import PanelNavbar from './panel-navbar.vue' ...@@ -15,8 +15,8 @@ import PanelNavbar from './panel-navbar.vue'
import PanelMenu from './panel-menu.vue' import PanelMenu from './panel-menu.vue'
import useBaseStore from '@/store/base' import useBaseStore from '@/store/base'
const userBase = useBaseStore() const baseStore = useBaseStore()
userBase.getAircraftNumbers() baseStore.getAircraftNumbers()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.page-bg { .page-bg {
......
import { getRqmOptionsApi } from '@/api/appraisal-record'
import { defineStore } from 'pinia'
const useAppraisalRecordStore = defineStore('appraisalRecord', {
state: () => {
return {
selectList: {
appraisee: [],
department: [],
examineType: []
}
}
},
getters: {},
actions: {
async getRqmOptions() {
const res = await getRqmOptionsApi({})
if (res.code == 200) {
this.selectList.appraisee = res.data.appraisee || []
this.selectList.department = res.data.department || []
this.selectList.examineType = res.data.examineType || []
}
}
},
// 配置持久化
persist: false
})
export default useAppraisalRecordStore
...@@ -3,12 +3,19 @@ import { defineStore } from 'pinia' ...@@ -3,12 +3,19 @@ import { defineStore } from 'pinia'
const useBaseStore = defineStore('base', { const useBaseStore = defineStore('base', {
state: () => { state: () => {
return {} return {
selectList: {
deviceNumSelect: [] //机号
}
}
}, },
getters: {}, getters: {},
actions: { actions: {
async getAircraftNumbers() { async getAircraftNumbers() {
const res = await getAircraftNumbersApi({}) const res = await getAircraftNumbersApi({})
if (res.code == 200) {
this.selectList.deviceNumSelect = res.data
}
} }
}, },
// 配置持久化 // 配置持久化
......
...@@ -31,13 +31,13 @@ class ServiceLoading { ...@@ -31,13 +31,13 @@ class ServiceLoading {
uni.showLoading({ uni.showLoading({
title: loadingText, title: loadingText,
mask: true mask: true
}); })
} }
} }
close() { close() {
this.count-- this.count--
if (this.count <= 0) { if (this.count <= 0) {
uni.hideLoading(); uni.hideLoading()
} }
} }
} }
...@@ -47,6 +47,7 @@ const serviceLoading = new ServiceLoading() ...@@ -47,6 +47,7 @@ const serviceLoading = new ServiceLoading()
const httpInterceptor = { const httpInterceptor = {
// 拦截前触发 // 拦截前触发
invoke(options) { invoke(options) {
const userStore = useUserStore()
//responseType //responseType
if (options.config?.arraybuffer) { if (options.config?.arraybuffer) {
options.responseType = 'arraybuffer' options.responseType = 'arraybuffer'
...@@ -60,7 +61,7 @@ const httpInterceptor = { ...@@ -60,7 +61,7 @@ const httpInterceptor = {
...options.data, ...options.data,
apiPwd: 'Ifar$2_0160_525_Mocp', apiPwd: 'Ifar$2_0160_525_Mocp',
requestFrom: '3', requestFrom: '3',
realUserId: '21' realUserId: userStore.userInfo?.id
} }
} }
// 非 http 开头需拼接地址 // 非 http 开头需拼接地址
...@@ -70,16 +71,28 @@ const httpInterceptor = { ...@@ -70,16 +71,28 @@ const httpInterceptor = {
// 请求超时, 默认 60s // 请求超时, 默认 60s
options.timeout = 10000 options.timeout = 10000
// 添加小程序端请求头标识 // 添加小程序端请求头标识
if (options.name == 'file') {
options.formData = {
...options.formData,
apiPwd: 'Ifar$2_0160_525_Mocp',
requestFrom: '6',
uid: userStore.userInfo?.id
}
options.header = {
'Content-Type': 'multipart/form-data',
...options.header
}
} else {
options.header = { options.header = {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
...options.header, ...options.header
}
} }
// 添加 token 请求头标识 // 添加 token 请求头标识
const userStore = useUserStore()
if (userStore.token) { if (userStore.token) {
options.header.Authorization = `Bearer ${userStore.token}` options.header.Authorization = `Bearer ${userStore.token}`
} }
}, }
} }
uni.addInterceptor('request', httpInterceptor) uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor) uni.addInterceptor('uploadFile', httpInterceptor)
...@@ -125,7 +138,7 @@ export const http = (options) => { ...@@ -125,7 +138,7 @@ export const http = (options) => {
serviceLoading.close() serviceLoading.close()
uni.$message.showToast('网络错误,换个网络试试') uni.$message.showToast('网络错误,换个网络试试')
reject(err) reject(err)
}, }
}) })
}) })
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment