完成服务信息设置

This commit is contained in:
TOP糯米 2023-03-13 01:37:13 +08:00
parent 09020fb8ff
commit f5be62d934
10 changed files with 33905 additions and 108 deletions

View File

@ -1,4 +1,10 @@
const apis = { const apis = {
system: {
uploadFile: {
url: "/wxapp/index/one",
showLoading: true,
},
},
user: { user: {
sendCode: { sendCode: {
url: "/wxapp/public/send", url: "/wxapp/public/send",
@ -17,8 +23,21 @@ const apis = {
}, },
info: { info: {
url: "/user/workerinfo/getuserinfo", url: "/user/workerinfo/getuserinfo",
auth: true,
}, },
setServiceInfo: {
url: "/user/workerinfo/setinfo",
auth: true,
}
}, },
service: {
cate: {
url: "/wxapp/index/category1",
},
carType: {
url: "/wxapp/index/getallcar"
},
}
} }
export default apis export default apis

View File

@ -1,9 +1,13 @@
import order from "@/core/models/order"; import order from "@/core/models/order";
import user from "@/core/models/user"; import user from "@/core/models/user";
import worker from "@/core/models/worker"; import worker from "@/core/models/worker";
import system from "@/core/models/system";
import service from "@/core/models/service";
export default { export default {
order, order,
user, user,
worker, worker,
system,
service
} }

View File

@ -0,0 +1,58 @@
import Vue from "vue"
let prototype = Vue.prototype;
export default {
/**
* 安装分类
*/
getInstallCate() {
return new Promise((resolve, reject) => {
prototype.$request({
api: "service.cate",
}).then((response) => {
if (response.code == 1) {
let list = [];
response.data.forEach((item) => {
let child = [];
item.child.forEach((v) => {
child.push({
id: v.id,
name: v.name,
cover: v.more,
page: "",
});
});
list.push({
id: item.id,
name: item.name,
cover: item.more,
child: child,
page: "",
});
});
return resolve(list);
}
return reject(response.msg);
});
});
},
getCarType() {
return new Promise((resolve, reject) => {
prototype.$request({
api: "service.carType",
}).then(response => {
if (response.code == 1) {
let list = [];
response.data.forEach(item => {
list.push({
id: item.id,
name: item.title
});
});
return resolve(list);
}
return reject(response.msg);
});
});
},
}

86
src/core/models/system.js Normal file
View File

@ -0,0 +1,86 @@
import Vue from "vue"
let prototype = Vue.prototype;
export default {
getCity() {
const citys = require("@/static/temp/district.json");
let res = [];
if (citys.length) {
// 递归生成
res = this.handleTree(citys);
}
return res;
},
handleTree(data, parent_code = null) {
let res = [];
let keys = {
id: "code",
pid: "parent_code",
children: "children",
text: "name",
value: "code",
};
let oneItemDEMO = {
text: "",
value: "",
children: [],
};
let oneItem = {};
// 循环
for (let index in data) {
// 判断
if (parent_code === null) {
// 顶级菜单 - 省
if (!data[index].hasOwnProperty(keys.pid) || data[index][keys.pid] == parent_code) {
// 不存在parent_code或者已匹配
oneItem = JSON.parse(JSON.stringify(oneItemDEMO));
oneItem.text = data[index][keys.text];
oneItem.value = data[index][keys.value];
// 递归下去
oneItem.children = this.handleTree(data, data[index][keys.id]);
res.push(oneItem);
} else {
// 匹配不到,跳过
}
} else {
// 非顶级菜单 - 市、区、街道
if (data[index].hasOwnProperty(keys.pid) && data[index][keys.pid] == parent_code) {
// 已匹配
oneItem = JSON.parse(JSON.stringify(oneItemDEMO));
oneItem.text = data[index][keys.text];
oneItem.value = data[index][keys.value];
// 递归下去
// oneItem.children = this.handleTree(data, data[index][keys.id]);
oneItem.children = [];
res.push(oneItem);
} else {
// 匹配不到,跳过
}
}
}
return res;
},
/**
* 上传文件
*/
upload(path) {
return new Promise((resolve, reject) => {
prototype.$upload({
api: "system.uploadFile",
path: path
}).then(response => {
if (response.code == 1) {
return resolve(response.data);
}
return reject(response.msg);
});
});
},
}

View File

@ -18,7 +18,7 @@ export default {
code: result.code code: result.code
} }
}).then((response) => { }).then((response) => {
this.$storage.set("open_id", response.data.openid); prototype.$storage.set("open_id", response.data.openid);
return resolve(response.data); return resolve(response.data);
}).catch(e => { }); }).catch(e => { });
} }
@ -86,14 +86,31 @@ export default {
}).then(response => { }).then(response => {
if (response.code == 1) { if (response.code == 1) {
let user = { let user = {
id: response.data.id,
avatar: response.data.avatar, avatar: response.data.avatar,
nickname: response.data.user_nickname, nickname: response.data.user_nickname,
openid: response.data.openid, openid: response.data.openid,
mobile: response.data.mobile, mobile: response.data.mobile,
createTime: response.data.create_time, createTime: response.data.create_time,
finishInfo: response.data.worker != null, worker: null,
}; };
if (response.data.worker) {
user.worker = {
id: response.data.worker.id,
uid: response.data.worker.uid,
avatar: response.data.worker.avatar,
province: response.data.worker.province,
city: response.data.worker.city,
cateId: response.data.worker.service,
carTypeId: response.data.worker.car,
name: response.data.worker.name,
mobile: response.data.worker.mobile,
idcardA: response.data.worker.imga,
idcardB: response.data.worker.imgb,
license: response.data.worker.imgc,
content: response.data.worker.desc,
type: response.data.worker.status,
};
}
prototype.$storage.set('userinfo', user); prototype.$storage.set('userinfo', user);
return resolve(user); return resolve(user);
} else { } else {
@ -183,5 +200,21 @@ export default {
return reject(response.msg); return reject(response.msg);
}).catch(e => { }); }).catch(e => { });
}); });
},
/**
* 设置信息
*/
setServiceInfo(data) {
return new Promise((resolve, reject) => {
prototype.$request({
api: "user.setServiceInfo",
data: data
}).then(response => {
if (response.code == 1) {
return resolve(response.msg);
}
return reject(response.msg);
}).catch(e => { });
});
} }
} }

View File

@ -185,21 +185,33 @@ export default {
}) })
.then((response) => { .then((response) => {
this.$store.dispatch("user/info"); this.$store.dispatch("user/info");
this.$utils.toPage( this.$utils.toast(response.msg).then(() => {
"", this.$utils.toPage(
{ "",
complete() { {
let pages = getCurrentPages(); complete() {
let refer = pages[pages.length - 2]; let pages = getCurrentPages();
if (typeof refer !== "undefined") { // #ifdef H5
if (typeof refer.initPage !== "undefined") { let refer = pages[pages.length - 2];
refer.initPage(refer.options); if (typeof refer !== "undefined") {
if (typeof refer.initPage !== "undefined") {
refer.initPage(refer.options);
}
} }
} // #endif
// #ifdef MP-WEIXIN
let refer = pages[pages.length - 1];
if (typeof refer !== "undefined") {
if (typeof refer.onLoad !== "undefined") {
refer.onLoad(refer.options);
}
}
// #endif
},
}, },
}, "back"
"back" );
); });
}) })
.catch((e) => { .catch((e) => {
this.$utils.toast(e); this.$utils.toast(e);

View File

@ -8,18 +8,18 @@
<view class="head"> <view class="head">
<block v-if="isLogin"> <block v-if="isLogin">
<view class="headimg"> <view class="headimg">
<image class="image" :src="userInfo.avatar" mode="aspectFill" /> <image class="image" :src="userInfo.worker.avatar" mode="aspectFill" />
</view> </view>
<view class="detail"> <view class="detail">
<view class="name"> <view class="name">
<text>{{ userInfo.username }}</text> <text>{{ userInfo.worker.name }}</text>
<text <text
class="type" class="type"
:style="{ color: models.worker.getWorkerTypeTextColor(userInfo.workerType) }" :style="{ color: models.worker.getWorkerTypeTextColor(userInfo.worker.type) }"
>{{ models.worker.getWorkerTypeText(userInfo.workerType) }}</text >{{ models.worker.getWorkerTypeText(userInfo.worker.type) }}</text
> >
</view> </view>
<view class="line id">ID{{ userInfo.id }}</view> <view class="line id">ID{{ userInfo.worker.id }}</view>
<view class="line">注册时间{{ userInfo.createTime }}</view> <view class="line">注册时间{{ userInfo.createTime }}</view>
</view> </view>
<view class="accept-switch"> <view class="accept-switch">
@ -118,6 +118,7 @@ export default {
return { return {
utils: this.$utils, utils: this.$utils,
models: this.$models, models: this.$models,
timer: null,
safePt: 0, safePt: 0,
backgroundImage: require("@/static/temp/1.png"), backgroundImage: require("@/static/temp/1.png"),
acceptOrderState: false, acceptOrderState: false,
@ -130,14 +131,15 @@ export default {
computed: { computed: {
...mapGetters({ ...mapGetters({
isLogin: "user/isLogin", isLogin: "user/isLogin",
finishInfo: "user/finishInfo",
}), }),
...mapState({ ...mapState({
userInfo: (state) => state.user.info, userInfo: (state) => state.user.info,
finishInfo: (state) => state.user.finishInfo,
}), }),
}, },
onLoad() {}, onLoad() {},
onShow() { async onShow() {
await this.$store.dispatch("user/info");
if (this.isLogin && !this.finishInfo) { if (this.isLogin && !this.finishInfo) {
this.$utils.toPage("/pages/member/service-info"); this.$utils.toPage("/pages/member/service-info");
} }
@ -186,6 +188,7 @@ export default {
.image { .image {
width: 132rpx; width: 132rpx;
height: 132rpx; height: 132rpx;
border-radius: 50%;
} }
} }
.detail { .detail {

View File

@ -7,25 +7,37 @@
<view class="service-form-container"> <view class="service-form-container">
<view class="input-item"> <view class="input-item">
<text class="title">*我的头像</text> <text class="title">*我的头像</text>
<!-- #ifdef H5 -->
<view class="headimg-box" @click="uploadHeadImg"> <view class="headimg-box" @click="uploadHeadImg">
<image class="image" :src="headimg" mode="aspectFill" /> <image class="image" :src="avatar" mode="aspectFill" />
</view> </view>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<button open-type="chooseAvatar" @chooseavatar="uploadAvatar" class="headimg-box">
<image class="image" :src="avatar" mode="aspectFill" />
</button>
<!-- #endif -->
<text class="iconfont icon-jinru"></text> <text class="iconfont icon-jinru"></text>
</view> </view>
<view class="input-item"> <view class="input-item">
<text class="title">*服务区域</text> <text class="title">*服务区域</text>
<picker <view class="select-widget">
mode="selector" <uni-data-picker
:range="areaList" :localdata="cityList"
range-key="name" placeholder="请选择服务区域"
@change="changeArea" popup-title="请选择服务区域"
class="select-widget" @change="changeArea"
:class="{ active: areaText.length > 0 }" >
> <block v-if="province && city">
<view class="picker-view limit-line clamp-1"> <text class="preview">{{ province }} - {{ city }}</text>
{{ areaText ? areaText : "请选择服务区域" }} </block>
</view> <!-- #ifdef MP-WEIXIN -->
</picker> <block v-else>
<text>请选择服务区域</text>
</block>
<!-- #endif -->
</uni-data-picker>
</view>
<text class="iconfont icon-jinru"></text> <text class="iconfont icon-jinru"></text>
</view> </view>
<view class="input-item"> <view class="input-item">
@ -60,28 +72,12 @@
</picker> </picker>
<text class="iconfont icon-jinru"></text> <text class="iconfont icon-jinru"></text>
</view> </view>
<view class="input-item">
<text class="title">*服务类型</text>
<picker
mode="selector"
:range="serviceTypeList"
range-key="name"
@change="changeServiceType"
class="select-widget"
:class="{ active: serviceTypeText.length > 0 }"
>
<view class="picker-view limit-line clamp-1">
{{ serviceTypeText ? serviceTypeText : "请选择服务类型" }}
</view>
</picker>
<text class="iconfont icon-jinru"></text>
</view>
<view class="input-item-section"> <view class="input-item-section">
<text class="title">*认证资料<text class="desc">请录入身份资料</text></text> <text class="title">*认证资料<text class="desc">请录入身份资料</text></text>
<view class="profile-box"> <view class="profile-box">
<input <input
class="username" class="username"
v-model="username" v-model="name"
placeholder="请输入您的姓名" placeholder="请输入您的姓名"
placeholder-class="placeholder-style-5" placeholder-class="placeholder-style-5"
/> />
@ -108,8 +104,8 @@
<text class="title">服务资质<text class="desc">电工相关服务分类必上传</text></text> <text class="title">服务资质<text class="desc">电工相关服务分类必上传</text></text>
<view class="section-content-box"> <view class="section-content-box">
<view class="upload-image" @click="uploadLicense"> <view class="upload-image" @click="uploadLicense">
<image v-show="license" :src="license" mode="aspectFill" /> <image v-if="license" class="icon" :src="license" mode="aspectFill" />
<view v-show="!license" class="icon"> <view v-if="!license" class="icon">
<text class="iconfont icon-shangchuantupian"></text> <text class="iconfont icon-shangchuantupian"></text>
<view class="text">上传资质</view> <view class="text">上传资质</view>
</view> </view>
@ -124,7 +120,7 @@
</view> </view>
</view> </view>
<view class="common-save-form-btn"> <view class="common-save-form-btn">
<view class="btn">提交审核</view> <view class="btn" @click="submit">提交审核</view>
</view> </view>
</view> </view>
</app-layout> </app-layout>
@ -133,52 +129,23 @@
<script> <script>
import AppLayout from "@/components/layout/layout"; import AppLayout from "@/components/layout/layout";
import WidgetTips from "@/components/widgets/tips"; import WidgetTips from "@/components/widgets/tips";
import { mapState } from "vuex";
export default { export default {
name: "member-service-info", name: "member-service-info",
data() { data() {
return { return {
maxContentLength: 300, maxContentLength: 300,
headimg: require("@/static/temp/member/2.png"), cityList: [],
areaList: [ cateList: [],
{ carTypeList: [],
name: "绵阳", avatar: "",
}, province: "",
{ city: "",
name: "成都",
},
],
cateList: [
{
name: "空调安装",
},
{
name: "装修服务",
},
],
carTypeList: [
{
name: "大巴",
},
{
name: "轿车",
},
],
serviceTypeList: [
{
name: "全职",
},
{
name: "兼职",
},
],
areaId: 0,
areaText: "",
cateId: 0, cateId: 0,
cateText: "", cateText: "",
carTypeId: 0, carTypeId: 0,
carTypeText: "", carTypeText: "",
serviceTypeId: 0, name: "",
serviceTypeText: "",
idcardA: "", idcardA: "",
idcardB: "", idcardB: "",
license: "", license: "",
@ -189,35 +156,133 @@ export default {
AppLayout, AppLayout,
WidgetTips, WidgetTips,
}, },
onLoad() {}, computed: {
...mapState({
userInfo: (state) => state.user.info,
finishInfo: (state) => state.user.finishInfo,
}),
},
async onLoad() {
await this.$store.dispatch("user/info");
if (this.finishInfo) {
this.avatar = this.userInfo.worker.avatar;
this.province = this.userInfo.worker.province;
this.city = this.userInfo.worker.city;
this.cateId = this.userInfo.worker.cateId;
this.carTypeId = this.userInfo.worker.carTypeId;
this.name = this.userInfo.worker.name;
this.idcardA = this.userInfo.worker.idcardA;
this.idcardB = this.userInfo.worker.idcardB;
this.license = this.userInfo.worker.license;
this.content = this.userInfo.worker.content;
this.cateText = this.userInfo.worker.cateId;
this.carTypeText = this.userInfo.worker.carTypeId;
}
this.cityList = this.$models.system.getCity();
this.$models.service.getInstallCate().then((list) => {
this.cateList = list;
if (this.finishInfo) {
list.forEach((item) => {
if (item.id == this.userInfo.worker.cateId) {
this.cateText = item.name;
}
});
}
});
this.$models.service.getCarType().then((list) => {
this.carTypeList = list;
if (this.finishInfo) {
list.forEach((item) => {
if (item.id == this.userInfo.worker.carTypeId) {
this.carTypeText = item.name;
}
});
}
});
},
onShow() {}, onShow() {},
onReady() {}, onReady() {},
onReachBottom() {}, onReachBottom() {},
onPullDownRefresh() {}, onPullDownRefresh() {},
methods: { methods: {
uploadHeadImg() { uploadHeadImg() {
uni.chooseImage({}); this.$utils.chooseImage(1).then((tempFiles) => {
tempFiles.forEach((item) => {
this.$models.system.upload(item.path).then((response) => {
this.avatar = response.img;
});
});
});
},
uploadAvatar(e) {
this.$models.system.upload(e.detail.avatarUrl).then((response) => {
this.avatar = response.img;
});
}, },
uploadIdCardA() { uploadIdCardA() {
uni.chooseImage({}); this.$utils.chooseImage(1).then((tempFiles) => {
tempFiles.forEach((item) => {
this.$models.system.upload(item.path).then((response) => {
this.idcardA = response.img;
});
});
});
}, },
uploadIdCardB() { uploadIdCardB() {
uni.chooseImage({}); this.$utils.chooseImage(1).then((tempFiles) => {
tempFiles.forEach((item) => {
this.$models.system.upload(item.path).then((response) => {
this.idcardB = response.img;
});
});
});
}, },
uploadLicense() { uploadLicense() {
uni.chooseImage({}); this.$utils.chooseImage(1).then((tempFiles) => {
tempFiles.forEach((item) => {
this.$models.system.upload(item.path).then((response) => {
this.license = response.img;
});
});
});
}, },
changeArea(e) { changeArea(e) {
this.areaText = this.areaList[e.detail.value].name; this.province = e.detail.value[0].text;
this.city = e.detail.value[1].text;
}, },
changeCate(e) { changeCate(e) {
this.cateId = this.cateList[e.detail.value].id;
this.cateText = this.cateList[e.detail.value].name; this.cateText = this.cateList[e.detail.value].name;
}, },
changeCarType(e) { changeCarType(e) {
this.carTypeId = this.carTypeList[e.detail.value].id;
this.carTypeText = this.carTypeList[e.detail.value].name; this.carTypeText = this.carTypeList[e.detail.value].name;
}, },
changeServiceType(e) { submit() {
this.serviceTypeText = this.serviceTypeList[e.detail.value].name; this.$models.user
.setServiceInfo({
avatar: this.avatar,
province: this.province,
city: this.city,
service: this.cateId,
car: this.carTypeId,
name: this.name,
mobile: this.mobile,
imga: this.idcardA,
imgb: this.idcardB,
imgc: this.license,
desc: this.content,
})
.then((message) => {
this.$store.dispatch("user/info", true);
this.$utils.toast(message).then(() => {
this.$utils.toPage("/pages/member/member", {}, "switch");
});
})
.catch((e) => {
this.$utils.toast(e);
});
}, },
}, },
}; };
@ -258,11 +323,34 @@ export default {
align-items: center; align-items: center;
font-size: 28rpx; font-size: 28rpx;
color: #c9c9c9; color: #c9c9c9;
.picker-view { .picker-view,
/deep/.uni-data-tree-input {
width: 670rpx; width: 670rpx;
box-sizing: border-box; box-sizing: border-box;
padding: 44rpx 0 44rpx 190rpx; padding: 44rpx 0 44rpx 190rpx;
} }
/deep/.uni-data-tree-input {
.preview {
color: #666666;
}
.placeholder {
color: #c9c9c9;
font-size: 28rpx;
}
.input-value-border {
border: 0;
}
.input-value {
padding: 0;
height: auto;
font-size: 28rpx;
line-height: 38rpx;
}
.arrow-area,
.uniui-clear {
display: none;
}
}
} }
.select-widget.active { .select-widget.active {
color: #666666; color: #666666;
@ -282,6 +370,12 @@ export default {
overflow: hidden; overflow: hidden;
} }
} }
button.headimg-box {
background-color: unset;
}
button.headimg-box::after {
border: unset;
}
.input-item-section { .input-item-section {
padding: 44rpx 0; padding: 44rpx 0;
border-bottom: 2rpx solid #e8e7e7; border-bottom: 2rpx solid #e8e7e7;

33484
src/static/temp/district.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@ export default {
showLoginModal: false, showLoginModal: false,
openId: "", openId: "",
token: "", token: "",
finishInfo: false,
info: { info: {
id: 0, id: 0,
avatar: "", avatar: "",
@ -12,16 +13,13 @@ export default {
openid: "", openid: "",
mobile: "", mobile: "",
createTime: 0, createTime: 0,
finishInfo: false, worker: {},
}, },
}, },
getters: { getters: {
isLogin(state) { isLogin(state) {
return state.token.length > 0; return state.token.length > 0;
}, },
finishInfo(state) {
return state.info.finishInfo;
}
}, },
mutations: { mutations: {
showLoginModal(state, data) { showLoginModal(state, data) {
@ -35,11 +33,17 @@ export default {
}, },
info(state, data) { info(state, data) {
state.info = data; state.info = data;
},
finishInfo(state, data) {
state.finishInfo = data;
} }
}, },
actions: { actions: {
info(context) { async info(context, refresh) {
user.info().then(info => { await user.info(refresh).then(info => {
if (info.worker != null) {
context.commit('finishInfo', true);
}
context.commit('info', info); context.commit('info', info);
}); });
}, },