Kaynağa Gözat

基础资料组件拆分;openid存储失败排查修复;字典过滤显示封装;添加企业表单交互、接口对接;

sinea17 1 yıl önce
ebeveyn
işleme
99991c2c3c

+ 4 - 3
App.vue

@@ -66,9 +66,10 @@ export default {
 
 				success: (res) => {
 					console.log(res);
-					if (res.code === 200) {
-						getApp().globalData.open_id = res.data.openid;
-						getApp().globalData.session_key = res.data.session_key;
+					if (res.data.code === 200) {
+						uni.setStorageSync('openid', res.data.data.openid)
+						getApp().globalData.open_id = res.data.data.openid;
+						getApp().globalData.session_key = res.data.data.session_key;
 						that.$isResolve();
 						//	uni.hideLoading()
 					}

+ 13 - 0
api/enterprise.js

@@ -0,0 +1,13 @@
+import request from '@/api'
+
+const openid = uni.getStorageSync('openid')
+
+const enterpriseService = {
+	// 添加绑定企业
+	addEnterprise: params => request.post('/company/add', {
+		...params,
+		openid
+	})
+}
+
+export default enterpriseService

+ 4 - 6
api/index.js

@@ -17,7 +17,7 @@ const baseRequest = async (url, method, data = {}, loading = true) => {
 						reslove(res)
 					} else {
 						uni.showToast({
-							title: '登录信息失效'
+							title: '未知错误'
 						})
 					}
 				} else {
@@ -40,6 +40,7 @@ const baseRequest = async (url, method, data = {}, loading = true) => {
 	})
 }
 const request = {
+	get: (api, data, loading) => baseRequest(api, 'GET', data, loading),
 	getPath: (api, data, keys, loading) => {
 		let newRequestPath = api;
 		Object.keys(keys).forEach(function (key) {
@@ -49,11 +50,8 @@ const request = {
 			);
 		});
 		return baseRequest(newRequestPath, 'GET', data, loading)
-	}
+	},
+	post: (api, data, loading) => baseRequest(api, 'POST', data, loading),
 }
 
-// ['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => {
-// 	request[method] = (api, data, loading) => baseRequest(api, method, data, loading)
-// })
-
 export default request

+ 8 - 2
api/system.js

@@ -1,4 +1,10 @@
 import request from '@/api'
 
-// 字典接口, 用字典类型关键字获取字典数据接口
-export const getDict = code => request.getPath('/dict/{code}', {}, {code})
+const systemService = {
+	// 字典接口, 用字典类型关键字获取字典数据接口
+	getDict: code => request.getPath('/dict/{code}', {}, {
+		code
+	})
+}
+
+export default systemService

+ 253 - 0
pages/self/enterprise/components/BaseInfo.vue

@@ -0,0 +1,253 @@
+<template>
+	<view class="info-panel">
+		<view class="space"></view>
+		<view class="row">
+			<view class="label">企业Logo</view>
+			<image class="avatar" src="@/static/auth-icon.png" mode="aspectFill"></image>
+		</view>
+		<view class="row">
+			<view class="label">企业全称</view>
+			<input class="text" type="text" placeholder="必填" placeholder-class="gray" v-model="form.customerName" />
+		</view>
+		<view class="row">
+			<view class="label">企业简称</view>
+			<input class="text" type="text" placeholder="选填" placeholder-class="gray" v-model="form.customerTitle" />
+		</view>
+		<view class="row">
+			<view class="label">统一信用代码</view>
+			<input class="text" type="text" placeholder="选填" placeholder-class="gray" v-model="form.customerUsci" />
+		</view>
+		<view class="row">
+			<view class="label">注册资本</view>
+			<input class="text" type="text" placeholder="选填" placeholder-class="gray" v-model="form.capital" />
+		</view>
+		<view class="row no-border">
+			<view class="label">注册地址</view>
+			<input class="text" type="text" placeholder="选填" placeholder-class="gray" v-model="form.address" />
+		</view>
+		<view class="space"></view>
+		<picker :range="companyTypeList" range-key="dictLabel" @change="onCompanyTypePickerChange">
+			<view class="row">
+				<view class="label">企业类型</view>
+				<view :class="{text: true, gray: !form.companyType}">{{ form.companyType ? filterDict(form.companyType, companyTypeList) : '请选择' }}</view>
+				<image class="arrow" src="@/static/svg/arrow.svg"></image>
+			</view>
+		</picker>
+		<picker :range="companyTaxList" range-key="dictLabel" @change="onCompanyTaxPickerChange">
+			<view class="row">
+				<view class="label">纳税性质</view>
+				<view :class="{text: true, gray: !form.tax}">{{ form.tax ? filterDict(form.tax, companyTaxList) : '请选择' }}</view>
+				<image class="arrow" src="@/static/svg/arrow.svg"></image>
+			</view>
+		</picker>
+		<picker mode="region" @change="onRegionPickerChange">
+			<view class="row">
+				<view class="label">所属地区</view>
+				<view :class="{text: true, gray: !form.region}">{{ form.region || '请选择' }}</view>
+				<image class="arrow" src="@/static/svg/arrow.svg"></image>
+			</view>
+		</picker>
+		<picker :range="companyIndustryList" range-key="dictLabel" @change="onCompanyIndustryPickerChange">
+			<view class="row">
+				<view class="label">所属行业</view>
+				<view :class="{text: true, gray: !form.industry}">{{ form.industry ? filterDict(form.industry, companyIndustryList) : '请选择' }}</view>
+				<image class="arrow" src="@/static/svg/arrow.svg"></image>
+			</view>
+		</picker>
+		<picker :range="companySizeList" range-key="dictLabel" @change="onCompanySizePickerChange">
+			<view class="row">
+				<view class="label">人员规模</view>
+				<view :class="{text: true, gray: !form.staffSize}">{{ form.staffSize ? filterDict(form.staffSize, companySizeList) : '请选择' }}</view>
+				<image class="arrow" src="@/static/svg/arrow.svg"></image>
+			</view>
+		</picker>
+		<view class="space"></view>
+		<view class="row">
+			<view class="label">联系人</view>
+			<input class="text" type="text" placeholder="选填" placeholder-class="gray" v-model="form.contact" />
+		</view>
+		<view class="row">
+			<view class="label">联系电话</view>
+			<input class="text" type="text" placeholder="选填" placeholder-class="gray" v-model="form.tel" maxlength="11"/>
+		</view>
+		<view class="row">
+			<view class="label">电子件接收邮箱</view>
+			<input class="text" type="text" placeholder="选填" placeholder-class="gray" v-model="form.email" />
+		</view>
+	</view>
+</template>
+
+<script>
+import systemService from '@/api/system.js';
+import enterpriseService from '@/api/enterprise.js';
+import { filterDict } from '@/utils/util.js';
+export default {
+	data() {
+		return {
+			form: {
+				customerName: '',
+				customerTitle: '',
+				customerUsci: '',
+				capital: '',
+				address: '',
+				companyType: '',
+				tax: '',
+				region: '',
+				industry: '',
+				staffSize: '',
+				contact: '',
+				tel: '',
+				email: ''
+			},
+			companyTypeList: [],
+			companyTaxList: [],
+			companyIndustryList: [],
+			companySizeList: [],
+		};
+	},
+	created() {
+		this.getOptionsConfig();
+	},
+	beforeDestroy() {
+		this.updateEnterpriseInfo();
+	},
+	methods: {
+		// 修改企业资料
+		async updateEnterpriseInfo() {
+			if(!this.form.customerName) return
+			await enterpriseService.addEnterprise(this.form);
+		},
+		// 获取选项配置
+		async getOptionsConfig() {
+			const { rows: companyTypeList } = await systemService.getDict('biz_company_type');
+			const { rows: companyTaxList } = await systemService.getDict('biz_company_tax ');
+			const { rows: companyIndustryList } = await systemService.getDict('biz_company_industry');
+			const { rows: companySizeList } = await systemService.getDict('biz_company_size');
+			this.companyTypeList = companyTypeList;
+			this.companyTaxList = companyTaxList;
+			this.companyIndustryList = companyIndustryList;
+			this.companySizeList = companySizeList;
+		},
+		// 监听选择器变化-企业类型
+		onCompanyTypePickerChange(e) {
+			this.form.companyType = this.companyTypeList[e.detail.value].dictValue;
+		},
+		// 监听选择器变化-纳税性质
+		onCompanyTaxPickerChange(e) {
+			this.form.tax = this.companyTaxList[e.detail.value].dictValue;
+		},
+		// 监听选择器变化-省市区
+		onRegionPickerChange(e) {
+			this.form.region = e.detail.value.join('/');
+		},
+		// 监听选择器变化-所属行业
+		onCompanyIndustryPickerChange(e) {
+			this.form.industry = this.companyIndustryList[e.detail.value].dictValue;
+		},
+		// 监听选择器变化-人员规模
+		onCompanySizePickerChange(e) {
+			this.form.staffSize = this.companySizeList[e.detail.value].dictValue;
+		},
+		// 引用方法需要手动注入,否则报错
+		filterDict
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.info-panel {
+	font-size: 27.47rpx;
+
+	.row {
+		min-height: 96.15rpx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20.6rpx 41.21rpx;
+		box-sizing: border-box;
+		background: #fff;
+		position: relative;
+		color: #515151;
+		border-bottom: 1rpx solid #e0e0e0;
+		&.no-border {
+			border: none;
+		}
+
+		.label {
+			white-space: nowrap;
+			margin-right: 54.95rpx;
+		}
+
+		.text {
+			flex: 1;
+			text-align: right;
+		}
+
+		.arrow {
+			width: 27.47rpx;
+			height: 27.47rpx;
+			margin-left: 6.87rpx;
+		}
+
+		.avatar {
+			width: 82.42rpx;
+			height: 82.42rpx;
+			border-radius: 50%;
+		}
+		
+		/deep/.gray{
+			color: #ccc;
+		}
+	}
+
+	.title {
+		color: #666666;
+		padding: 0 41.21rpx;
+		line-height: 82.42rpx;
+	}
+
+	.space {
+		background: #f3f3f3;
+		height: 13.74rpx;
+	}
+
+	.radio-group {
+		display: flex;
+
+		.item {
+			position: relative;
+			padding-left: 43.96rpx;
+			line-height: 32.97rpx;
+			margin-left: 41.21rpx;
+
+			&:before {
+				content: '';
+				position: absolute;
+				left: 0%;
+				top: 50%;
+				transform: translateY(-50%);
+				width: 30.22rpx;
+				height: 30.22rpx;
+				border: 1rpx solid #ddd;
+				border-radius: 50%;
+				box-sizing: border-box;
+			}
+
+			.radio {
+				width: 32.97rpx;
+				height: 32.97rpx;
+				position: absolute;
+				left: 0;
+				top: 50%;
+				transform: translateY(-50%);
+				display: none;
+				z-index: 1;
+			}
+
+			&.active .radio {
+				display: block;
+			}
+		}
+	}
+}
+</style>

+ 7 - 2
pages/self/enterprise/index.vue

@@ -30,7 +30,7 @@
 			<button class="btn">企业资料</button>
 			<button class="btn">删除</button>
 		</view>
-		<button class="add-btn">+ 添加企业</button>
+		<button class="add-btn" @click="handleOpenAddEnterprise">+ 添加企业</button>
 	</view>
 </template>
 
@@ -42,7 +42,12 @@ export default {
 	methods: {
 		handleOpenInfo(){
 			uni.navigateTo({
-				url: 'info'
+				url: 'info?id=1'
+			})
+		},
+		handleOpenAddEnterprise(){
+			uni.navigateTo({
+				url: 'info',
 			})
 		}
 	}

+ 18 - 101
pages/self/enterprise/info.vue

@@ -1,77 +1,14 @@
 <template>
 	<view class="page-wrap">
-		<view class="tabs-panel">
-			<view :class="{ item: true, active: tabActive === item.value }" v-for="(item, index) in tabList" :key="index" @click="tabActive = item.value">
-				{{ item.label }}
+		<view class="tabs-panel-wrap" v-if="enterpriseId">
+			<view class="tabs-panel">
+				<view :class="{ item: true, active: tabActive === item.value }" v-for="(item, index) in tabList" :key="index" @click="tabActive = item.value">
+					{{ item.label }}
+				</view>
 			</view>
 		</view>
 		<!-- 基础资料 -->
-		<view v-if="tabActive === 1" class="info-panel">
-			<view class="space"></view>
-			<view class="row">
-				<view class="label">企业Logo</view>
-				<image class="avatar" src="../../../static/auth-icon.png" mode="aspectFill"></image>
-			</view>
-			<view class="row">
-				<view class="label">企业全称</view>
-				<input class="text" type="text" placeholder="请输入" v-model="testValue1" />
-			</view>
-			<view class="row">
-				<view class="label">企业简称</view>
-				<input class="text" type="text" placeholder="选填" v-model="testValue2" />
-			</view>
-			<view class="row">
-				<view class="label">统一信用代码</view>
-				<input class="text" type="text" placeholder="选填" v-model="testValue2" />
-			</view>
-			<view class="row">
-				<view class="label">注册资本</view>
-				<input class="text" type="text" placeholder="选填" v-model="testValue2" />
-			</view>
-			<view class="row">
-				<view class="label">注册地址</view>
-				<input class="text" type="text" placeholder="选填" v-model="testValue2" />
-			</view>
-			<view class="space"></view>
-			<view class="row">
-				<view class="label">企业类型</view>
-				<view class="text">有限责任公司</view>
-				<image class="arrow" src="../../../static/svg/arrow.svg"></image>
-			</view>
-			<view class="row">
-				<view class="label">纳税性质</view>
-				<view class="text">一般纳税人</view>
-				<image class="arrow" src="../../../static/svg/arrow.svg"></image>
-			</view>
-			<view class="row">
-				<view class="label">所属地区</view>
-				<view class="text">天津市</view>
-				<image class="arrow" src="../../../static/svg/arrow.svg"></image>
-			</view>
-			<view class="row">
-				<view class="label">所属行业</view>
-				<view class="text">网络技术</view>
-				<image class="arrow" src="../../../static/svg/arrow.svg"></image>
-			</view>
-			<view class="row">
-				<view class="label">人员规模</view>
-				<view class="text">50~100人</view>
-				<image class="arrow" src="../../../static/svg/arrow.svg"></image>
-			</view>
-			<view class="space"></view>
-			<view class="row">
-				<view class="label">联系人</view>
-				<input class="text" type="text" placeholder="选填" v-model="testValue2" />
-			</view>
-			<view class="row">
-				<view class="label">联系电话</view>
-				<input class="text" type="text" placeholder="选填" v-model="testValue2" />
-			</view>
-			<view class="row">
-				<view class="label">电子件接收邮箱</view>
-				<input class="text" type="text" placeholder="选填" v-model="testValue2" />
-			</view>
-		</view>
+		<BaseInfo v-show="tabActive === 1" />
 		<!-- 资金账户 -->
 		<view v-if="tabActive === 2" class="info-panel">
 			<view class="title">银行公户</view>
@@ -233,10 +170,12 @@
 </template>
 
 <script>
-import { getDict } from '@/api/system.js';
+import BaseInfo from './components/BaseInfo.vue';
 export default {
+	components: { BaseInfo },
 	data() {
 		return {
+			enterpriseId: '',
 			tabActive: 1,
 			tabList: [
 				{
@@ -263,18 +202,10 @@ export default {
 			testValue2: ''
 		};
 	},
-	onLoad() {
-		this.getOptionsConfig();
+	onLoad(option) {
+		this.enterpriseId = option.id;
 	},
 	methods: {
-		// 获取选项配置
-		async getOptionsConfig() {
-			const { rows: companyTypeList } = await getDict('biz_company_type');
-			const { rows: companyTaxList } = await getDict('biz_company_tax ');
-			const { rows: companyIndustryList } = await getDict('biz_company_industry');
-			const { rows: companySizeList } = await getDict('biz_company_size');
-			console.log(companyTypeList, companyTaxList, companyIndustryList, companySizeList);
-		},
 		handleOpenAddMember() {
 			this.$refs.memberDialog.open();
 		},
@@ -293,10 +224,6 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.page-wrap {
-	padding-top: 82.42rpx;
-}
-
 .tabs-panel {
 	position: fixed;
 	left: 0;
@@ -305,24 +232,14 @@ export default {
 	height: 82.42rpx;
 	background: #fff;
 	display: flex;
-	z-index: 1;
-
-	&::before,
-	&::after {
-		content: '';
-		position: absolute;
-		left: 0;
-		right: 0;
-		height: 1rpx;
-		background: #e0e0e0;
-	}
+	z-index: 2;
+	border-width: 1rpx 0;
+	border-style: solid;
+	border-color: #e0e0e0;
+	box-sizing: border-box;
 
-	&::before {
-		top: 0;
-	}
-
-	&::after {
-		bottom: 0;
+	&-wrap {
+		height: 82.42rpx;
 	}
 
 	.item {

+ 7 - 0
utils/util.js

@@ -0,0 +1,7 @@
+// 字典枚举列表查询
+export function filterDict(callValue, enumDict) {
+	console.log(callValue, enumDict)
+  let filterData = {};
+  if (Array.isArray(enumDict)) filterData = enumDict.find((item) => item.dictValue === callValue);
+  return filterData ? filterData.dictLabel : "--";
+}