完成服务信息设置

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 = {
system: {
uploadFile: {
url: "/wxapp/index/one",
showLoading: true,
},
},
user: {
sendCode: {
url: "/wxapp/public/send",
@ -17,8 +23,21 @@ const apis = {
},
info: {
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

View File

@ -1,9 +1,13 @@
import order from "@/core/models/order";
import user from "@/core/models/user";
import worker from "@/core/models/worker";
import system from "@/core/models/system";
import service from "@/core/models/service";
export default {
order,
user,
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
}
}).then((response) => {
this.$storage.set("open_id", response.data.openid);
prototype.$storage.set("open_id", response.data.openid);
return resolve(response.data);
}).catch(e => { });
}
@ -86,14 +86,31 @@ export default {
}).then(response => {
if (response.code == 1) {
let user = {
id: response.data.id,
avatar: response.data.avatar,
nickname: response.data.user_nickname,
openid: response.data.openid,
mobile: response.data.mobile,
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);
return resolve(user);
} else {
@ -183,5 +200,21 @@ export default {
return reject(response.msg);
}).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) => {
this.$store.dispatch("user/info");
this.$utils.toPage(
"",
{
complete() {
let pages = getCurrentPages();
let refer = pages[pages.length - 2];
if (typeof refer !== "undefined") {
if (typeof refer.initPage !== "undefined") {
refer.initPage(refer.options);
this.$utils.toast(response.msg).then(() => {
this.$utils.toPage(
"",
{
complete() {
let pages = getCurrentPages();
// #ifdef H5
let refer = pages[pages.length - 2];
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) => {
this.$utils.toast(e);

View File

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

View File

@ -7,25 +7,37 @@
<view class="service-form-container">
<view class="input-item">
<text class="title">*我的头像</text>
<!-- #ifdef H5 -->
<view class="headimg-box" @click="uploadHeadImg">
<image class="image" :src="headimg" mode="aspectFill" />
<image class="image" :src="avatar" mode="aspectFill" />
</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>
</view>
<view class="input-item">
<text class="title">*服务区域</text>
<picker
mode="selector"
:range="areaList"
range-key="name"
@change="changeArea"
class="select-widget"
:class="{ active: areaText.length > 0 }"
>
<view class="picker-view limit-line clamp-1">
{{ areaText ? areaText : "请选择服务区域" }}
</view>
</picker>
<view class="select-widget">
<uni-data-picker
:localdata="cityList"
placeholder="请选择服务区域"
popup-title="请选择服务区域"
@change="changeArea"
>
<block v-if="province && city">
<text class="preview">{{ province }} - {{ city }}</text>
</block>
<!-- #ifdef MP-WEIXIN -->
<block v-else>
<text>请选择服务区域</text>
</block>
<!-- #endif -->
</uni-data-picker>
</view>
<text class="iconfont icon-jinru"></text>
</view>
<view class="input-item">
@ -60,28 +72,12 @@
</picker>
<text class="iconfont icon-jinru"></text>
</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">
<text class="title">*认证资料<text class="desc">请录入身份资料</text></text>
<view class="profile-box">
<input
class="username"
v-model="username"
v-model="name"
placeholder="请输入您的姓名"
placeholder-class="placeholder-style-5"
/>
@ -108,8 +104,8 @@
<text class="title">服务资质<text class="desc">电工相关服务分类必上传</text></text>
<view class="section-content-box">
<view class="upload-image" @click="uploadLicense">
<image v-show="license" :src="license" mode="aspectFill" />
<view v-show="!license" class="icon">
<image v-if="license" class="icon" :src="license" mode="aspectFill" />
<view v-if="!license" class="icon">
<text class="iconfont icon-shangchuantupian"></text>
<view class="text">上传资质</view>
</view>
@ -124,7 +120,7 @@
</view>
</view>
<view class="common-save-form-btn">
<view class="btn">提交审核</view>
<view class="btn" @click="submit">提交审核</view>
</view>
</view>
</app-layout>
@ -133,52 +129,23 @@
<script>
import AppLayout from "@/components/layout/layout";
import WidgetTips from "@/components/widgets/tips";
import { mapState } from "vuex";
export default {
name: "member-service-info",
data() {
return {
maxContentLength: 300,
headimg: require("@/static/temp/member/2.png"),
areaList: [
{
name: "绵阳",
},
{
name: "成都",
},
],
cateList: [
{
name: "空调安装",
},
{
name: "装修服务",
},
],
carTypeList: [
{
name: "大巴",
},
{
name: "轿车",
},
],
serviceTypeList: [
{
name: "全职",
},
{
name: "兼职",
},
],
areaId: 0,
areaText: "",
cityList: [],
cateList: [],
carTypeList: [],
avatar: "",
province: "",
city: "",
cateId: 0,
cateText: "",
carTypeId: 0,
carTypeText: "",
serviceTypeId: 0,
serviceTypeText: "",
name: "",
idcardA: "",
idcardB: "",
license: "",
@ -189,35 +156,133 @@ export default {
AppLayout,
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() {},
onReady() {},
onReachBottom() {},
onPullDownRefresh() {},
methods: {
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() {
uni.chooseImage({});
this.$utils.chooseImage(1).then((tempFiles) => {
tempFiles.forEach((item) => {
this.$models.system.upload(item.path).then((response) => {
this.idcardA = response.img;
});
});
});
},
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() {
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) {
this.areaText = this.areaList[e.detail.value].name;
this.province = e.detail.value[0].text;
this.city = e.detail.value[1].text;
},
changeCate(e) {
this.cateId = this.cateList[e.detail.value].id;
this.cateText = this.cateList[e.detail.value].name;
},
changeCarType(e) {
this.carTypeId = this.carTypeList[e.detail.value].id;
this.carTypeText = this.carTypeList[e.detail.value].name;
},
changeServiceType(e) {
this.serviceTypeText = this.serviceTypeList[e.detail.value].name;
submit() {
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;
font-size: 28rpx;
color: #c9c9c9;
.picker-view {
.picker-view,
/deep/.uni-data-tree-input {
width: 670rpx;
box-sizing: border-box;
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 {
color: #666666;
@ -282,6 +370,12 @@ export default {
overflow: hidden;
}
}
button.headimg-box {
background-color: unset;
}
button.headimg-box::after {
border: unset;
}
.input-item-section {
padding: 44rpx 0;
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,
openId: "",
token: "",
finishInfo: false,
info: {
id: 0,
avatar: "",
@ -12,16 +13,13 @@ export default {
openid: "",
mobile: "",
createTime: 0,
finishInfo: false,
worker: {},
},
},
getters: {
isLogin(state) {
return state.token.length > 0;
},
finishInfo(state) {
return state.info.finishInfo;
}
},
mutations: {
showLoginModal(state, data) {
@ -35,11 +33,17 @@ export default {
},
info(state, data) {
state.info = data;
},
finishInfo(state, data) {
state.finishInfo = data;
}
},
actions: {
info(context) {
user.info().then(info => {
async info(context, refresh) {
await user.info(refresh).then(info => {
if (info.worker != null) {
context.commit('finishInfo', true);
}
context.commit('info', info);
});
},