低代码可视化-APP销售开单管理系统-代码生成器

销售开单管理系统,也称为销售订单管理系统,是一个全面的销售管理工具,旨在提升企业的销售效率和客户满意度。以下是对销售开单管理系统的详细介绍:


订单创建与管理

订单创建

系统能够高效地创建销售订单,包括订单的产品、数量、价格等信息,实现自动化管理,避免了传统纸质订单的繁琐过程。

支持批量操作,确保订单信息的准确性和一致性。

生成源码

<template>
	<view class="container container333104">
		<u-form :model="form" :rules="formRules" :errorType="['message', 'toast']" ref="formRef" class="flex diygw-form diygw-col-24">
			<view class="flex flex-wrap diygw-col-24 flex-direction-column flex-clz">
				<view class="flex flex-wrap diygw-col-0 justify-between items-center flex28-clz" @tap="navigateTo" data-type="page" data-url="/pages/customer" data-isselect="1">
					<text v-if="!userInfo.customer" class="diygw-col-0 text5-clz"> 请选择客户 </text>
					<view v-if="userInfo.customer" class="flex flex-wrap diygw-col-0 flex-direction-column justify-between items-center flex6-clz">
						<view class="flex flex-wrap diygw-col-24 items-end">
							<text class="diygw-col-0 title-clz">
								{{ userInfo.customer.title }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-24 items-end flex22-clz">
							<text class="diygw-text-line1 diygw-col-0 address-clz">
								{{ userInfo.customer.username }}
							</text>
							<text class="diygw-col-0 text22-clz">
								{{ userInfo.customer.phone }}
							</text>
						</view>
						<text class="diygw-text-line1 diygw-col-24 text20-clz">
							{{ userInfo.customer.address }}
						</text>
					</view>
					<text class="flex icon4 diygw-col-0 icon4-clz diy-icon-right"></text>
				</view>
				<u-form-item labelAlign="justify" class="diygw-col-24" :required="true" label="开单人" prop="kaidan">
					<u-input inputAlign="right" :focus="formData.kaidanFocus" placeholder="请输入开单人" v-model="form.kaidan"></u-input>
				</u-form-item>
				<u-form-item labelAlign="justify" class="diygw-col-24" label="开单日期" :required="true" prop="kaidanDate">
					<u-input inputAlign="right" @click="formData.showKaidanDate = true" class="" placeholder="请选择" v-model="form.kaidanDate" type="select"></u-input>
					<u-calendar maxDate="2050-12-31" v-model="formData.showKaidanDate" mode="date" @change="changeFormKaidanDate"></u-calendar>
				</u-form-item>
			</view>
			<view class="flex flex-wrap diygw-col-24 flex-direction-column flex1-clz">
				<text class="diygw-col-24 text-clz"> 商品清单 </text>
				<view class="flex flex-wrap diygw-col-24 flex2-clz">
					<text class="diygw-col-0 text11-clz"> # </text>
					<text class="diygw-col-0 text4-clz"> 名称 </text>
					<text class="diygw-col-0 text3-clz"> 单位 </text>
					<text class="diygw-col-0 text2-clz"> 数量 </text>
					<text class="diygw-col-0 text1-clz"> 单价 </text>
					<text class="diygw-col-0 text7-clz"> 合计 </text>
				</view>
				<view class="flex flex-wrap diygw-col-24">
					<view class="diygw-col-24" v-for="(productsItem, productsIndex) in form.products" :key="productsIndex">
						<u-form class="diygw-col-24" :model="form.products[productsIndex]" :errorType="['message', 'toast']" ref="productsRef" :rules="productsItemRules">
							<view class="flex flex-wrap diygw-col-24 items-stretch">
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center items-center flex4-clz">
									<text v-if="form.products.length - 1 != productsIndex && form.products.length > 0" @tap="delProductsItem" :data-index="productsIndex" class="flex icon diygw-col-0 diy-icon-roundclose"></text>
									<text v-if="form.products.length - 1 == productsIndex" @tap="addProductsItem" :data-index="productsIndex" class="flex icon1 diygw-col-0 diy-icon-roundadd"></text>
								</view>
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center items-center flex5-clz">
									<u-form-item :borderBottom="false" class="diygw-col-24 diygw-form-item-small" labelPosition="top" prop="title">
										<u-input :focus="formData.productsItemDatas[productsIndex].titleFocus" placeholder="" v-model="productsItem.title"></u-input>
									</u-form-item>
								</view>
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center items-center flex11-clz">
									<u-form-item :borderBottom="false" class="diygw-col-24 diygw-form-item-small" labelPosition="top" prop="unit">
										<u-input :focus="formData.productsItemDatas[productsIndex].unitFocus" placeholder="" v-model="productsItem.unit"></u-input>
									</u-form-item>
								</view>
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center items-center flex10-clz">
									<u-form-item :borderBottom="false" class="diygw-col-24 diygw-form-item-small" labelPosition="top" prop="number">
										<u-input inputAlign="right" :focus="formData.productsItemDatas[productsIndex].numberFocus" placeholder="" v-model="productsItem.number" type="digit"></u-input>
									</u-form-item>
								</view>
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center items-center flex9-clz">
									<u-form-item :borderBottom="false" class="diygw-col-24 diygw-form-item-small" labelPosition="top" prop="price">
										<u-input inputAlign="right" :focus="formData.productsItemDatas[productsIndex].priceFocus" placeholder="" v-model="productsItem.price" type="digit"></u-input>
									</u-form-item>
								</view>
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center flex7-clz">
									<text class="diygw-col-0">
										{{ calcTotal(productsItem) }}
									</text>
								</view>
							</view>
						</u-form>
					</view>
				</view>
				<view class="flex flex-wrap diygw-col-24 justify-end items-center flex12-clz">
					<text class="diygw-col-0 text9-clz"> 产品合计 </text>
					<view class="flex flex-wrap diygw-col-0 flex-direction-column">
						<text class="diygw-col-0 text14-clz">
							{{ productsTotalFunction() }}
						</text>
					</view>
				</view>
			</view>
			<view class="flex flex-wrap diygw-col-24 flex-direction-column flex14-clz">
				<text class="diygw-col-24 text13-clz"> 其他费用 </text>
				<view class="flex flex-wrap diygw-col-24 flex15-clz">
					<text class="diygw-col-0 text8-clz"> # </text>
					<text class="diygw-col-0 text10-clz"> 费用项 </text>
					<text class="diygw-col-0 text12-clz"> 费用金额 </text>
				</view>
				<view class="flex flex-wrap diygw-col-24">
					<view class="diygw-col-24" v-for="(costsItem, costsIndex) in form.costs" :key="costsIndex">
						<u-form class="diygw-col-24" :model="form.costs[costsIndex]" :errorType="['message', 'toast']" ref="costsRef" :rules="costsItemRules">
							<view class="flex flex-wrap diygw-col-24 items-stretch">
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center items-center flex17-clz">
									<text v-if="form.costs.length - 1 != costsIndex && form.costs.length > 0" @tap="delCostsItem" :data-index="costsIndex" class="flex icon2 diygw-col-0 diy-icon-roundclose"></text>
									<text v-if="form.costs.length - 1 == costsIndex" @tap="addCostsItem" :data-index="costsIndex" class="flex icon3 diygw-col-0 diy-icon-roundadd"></text>
								</view>
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center flex18-clz">
									<u-form-item :borderBottom="false" class="diygw-col-24 diygw-form-item-small" labelPosition="top" prop="title">
										<u-input :focus="formData.costsItemDatas[costsIndex].titleFocus" placeholder="" v-model="costsItem.title"></u-input>
									</u-form-item>
								</view>
								<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center flex19-clz">
									<u-form-item :borderBottom="false" class="diygw-col-24 diygw-form-item-small" labelPosition="top" prop="price">
										<u-input inputAlign="right" :focus="formData.costsItemDatas[costsIndex].priceFocus" placeholder="" v-model="costsItem.price"></u-input>
									</u-form-item>
								</view>
							</view>
						</u-form>
					</view>
				</view>
				<view class="flex flex-wrap diygw-col-24 justify-end items-center flex23-clz">
					<text class="diygw-col-0 text15-clz"> 其他费用合计 </text>
					<text class="diygw-col-0 text18-clz">
						{{ costsTotalFunction() }}
					</text>
				</view>
			</view>
			<view class="flex flex-wrap diygw-col-24 flex-direction-column flex20-clz">
				<u-form-item class="diygw-col-24" label="整单优惠" prop="youhui">
					<u-input inputAlign="right" :focus="formData.youhuiFocus" placeholder="填定整单优惠金额" v-model="form.youhui" type="number"></u-input>
				</u-form-item>
				<view class="flex flex-wrap diygw-col-24 justify-end items-center flex21-clz">
					<text class="diygw-col-0 text16-clz"> 费用合计 </text>
					<text class="diygw-col-0 text19-clz">
						{{ totalFunction() }}
					</text>
				</view>
			</view>
			<view class="flex flex-wrap diygw-col-24 flex-direction-column flex26-clz">
				<u-form-item labelWidth="auto" class="diygw-col-24" label="订单备注" labelPosition="top" prop="remark">
					<u-input maxlength="200" height="60px" class="" placeholder="订单备注信息" v-model="form.remark" type="textarea"></u-input>
				</u-form-item>
			</view>
		</u-form>
		<view class="flex flex-wrap diygw-col-24 flex-direction-column diygw-bottom flex27-clz">
			<text @click="submitForm" class="diygw-col-24 green text17-clz"> 提交订单 </text>
		</view>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: {},
				dataNum: 1,
				data: {
					code: 200,
					msg: 'success',
					data: {
						id: 15,
						products: '[{"title":"123","unit":"123","total":24,"number":"12","price":"2"}]',
						costs: '[{"title":"123","price":"2"}]',
						youhui: '2.000',
						total: '24.000',
						remark: '',
						status: null,
						kaidanDate: '2024-12-17 00:00:00',
						customerTitle: '客户名',
						customerUsername: '邓生',
						customerPhone: '15913132246',
						customerAddress: '联系地址联系地址',
						productsTotal: '24.000',
						costsTotal: '2.000',
						createTime: '2024-12-17 16:05:44',
						updateTime: '2024-12-17 16:05:44',
						deleteTime: null
					}
				},
				costsItemRules: {},
				formRules: {
					kaidan: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '开单人不能为空'
						}
					],
					kaidanDate: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '开单日期不能为空哟'
						}
					]
				},
				form: {
					kaidan: '',
					kaidanDate: '',
					products: [],
					costs: [],
					youhui: undefined,
					remark: ''
				},
				costsItemData: {
					titleFocus: false,
					priceFocus: false
				},
				costsItem: {
					title: '',
					price: ''
				},
				productsItem: {
					title: '',
					unit: '',
					number: undefined,
					price: undefined
				},
				productsItemData: {
					titleFocus: false,
					unitFocus: false,
					numberFocus: false,
					priceFocus: false
				},
				formData: {
					kaidanFocus: false,
					showKaidanDate: false,
					productsItemDatas: [],
					costsItemDatas: [],
					youhuiFocus: false
				},
				productsItemRules: {}
			};
		},
		onShow() {
			this.setCurrentPage(this);
		},
		onLoad(option) {
			this.setCurrentPage(this);
			if (option) {
				this.setData({
					globalOption: this.getOption(option)
				});
			}

			this.init();
		},
		onReady() {
			this.$refs.formRef?.setRules(this.formRules);
			this.initProductsData();
			this.initCostsData();
		},
		methods: {
			async init() {
				await this.dataApi();
				await this.initResetform();
			},
			// 列表数据 API请求方法
			async dataApi(param) {
				let thiz = this;
				param = param || {};

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/sell/orders/get';
				let http_data = {
					pageNum: this.dataNum,
					pageSize: 10,
					id: param.id || this.globalOption.id || '15'
				};
				let http_header = {};

				//这个判断意思是表示新增而不是编辑,不用请求API
				if (!this.globalOption.id) {
					this.$nextTick(() => {
						this.form.kaidan = this.userInfo.nickname;
						this.form.kaidanDate = this.$tools.getCurrentDate();
					});
					return;
				}

				let data = await this.$http.post(http_url, http_data, http_header, 'json');

				this.data = data;
				//把数据库返回来的数据转为JSON
				data.data.costs = JSON.parse(data.data.costs);
				data.data.products = JSON.parse(data.data.products);
				//重新构造客户表单显示数据
				let customer = {
					title: data.data.customerTitle,
					address: data.data.customerAddress,
					phone: data.data.customerPhone,
					username: data.data.customerUsername
				};
				data.data.kaidanDate = this.$tools.formatDateTime(data.data.kaidanDate, 'YYYY-mm-dd');

				let productsItemDatas = [];
				data.data.products.forEach((item) => {
					productsItemDatas.push(JSON.parse(JSON.stringify(this.productsItemData)));
				});
				this.formData.productsItemDatas = productsItemDatas;

				let costsItemDatas = [];
				data.data.costs.forEach((item) => {
					costsItemDatas.push(JSON.parse(JSON.stringify(this.costsItemData)));
				});
				this.formData.costsItemDatas = costsItemDatas;

				this.userInfo.customer = customer;
				this.form = data.data;
			},

			// 计算产品总金额 自定义方法
			productsTotalFunction(param) {
				let thiz = this;
				function calculateTotal(item) {
					let price = parseFloat(item.price) || 0;
					let number = parseFloat(item.number) || 0;
					return price * number;
				}
				this.form.productsTotal = this.form.products.reduce((sum, item) => sum + calculateTotal(item), 0);
				return this.form.productsTotal;
			},

			// 计算其他金额总价 自定义方法
			costsTotalFunction(param) {
				let thiz = this;
				function calculateTotal(item) {
					let price = parseFloat(item.price) || 0;
					return price;
				}
				this.form.costsTotal = this.form.costs.reduce((sum, item) => sum + calculateTotal(item), 0);
				return this.form.costsTotal;
			},

			// 总价 自定义方法
			totalFunction(param) {
				let thiz = this;
				let youhui = parseFloat(this.form.youhui) || 0;
				this.form.total = this.productsTotalFunction() + this.costsTotalFunction() - youhui;
				return this.form.total;
			},
			changeFormKaidanDate(evt) {
				this.form.kaidanDate = evt.result;
			},
			//初始化显示子表单数据条数
			initProductsData() {
				for (let i = 0; i < 1; i++) {
					this.form.products.push(JSON.parse(JSON.stringify(this.productsItem)));
					this.formData.productsItemDatas.push(JSON.parse(JSON.stringify(this.productsItemData)));
				}
				this.initProductsValid();
			},
			//子表单验证
			initProductsValid() {
				this.$nextTick(() => {
					this.$refs['productsRef']?.forEach((subform) => {
						subform.setRules(this.productsItemRules);
					});
				});
			},
			//上移子表单
			upProductsItem(evt) {
				let { index } = evt.currentTarget.dataset;
				if (index == 0) {
					this.navigateTo({
						type: 'tip',
						tip: '已经是第一个'
					});
					return false;
				}
				this.form.products[index] = this.form.products.splice(index - 1, 1, this.form.products[index])[0];
				this.formData.productsItemDatas[index] = this.formData.productsItemDatas.splice(index - 1, 1, this.formData.productsItemDatas[index])[0];
				this.initProductsValid();
			},
			//下移子表单
			downProductsItem(evt) {
				let { index } = evt.currentTarget.dataset;
				if (index == this.form.products.length - 1) {
					this.navigateTo({
						type: 'tip',
						tip: '已经是最后一个'
					});
					return false;
				}
				this.form.products[index] = this.form.products.splice(index + 1, 1, this.form.products[index])[0];
				this.formData.productsItemDatas[index] = this.formData.productsItemDatas.splice(index + 1, 1, this.formData.productsItemDatas[index])[0];
				this.initProductsValid();
			},
			//删除子表单
			delProductsItem(evt) {
				let { index } = evt.currentTarget.dataset;
				this.form.products.splice(index, 1);
				this.formData.productsItemDatas.splice(index, 1);
				this.initProductsValid();
			},
			//增加子表单
			addProductsItem() {
				this.form.products.push(JSON.parse(JSON.stringify(this.productsItem)));
				this.formData.productsItemDatas.push(JSON.parse(JSON.stringify(this.productsItemData)));
				this.initProductsValid();
			},
			//验证所有的子表单
			checkProductsValid() {
				let flag = true;
				this.$refs['productsRef']?.forEach((subform) => {
					subform.validate((valid) => {
						if (!valid) {
							flag = false;
							return false;
						}
					});
				});
				return flag;
			},
			calcTotal(item) {
				let price = parseFloat(item.price) || 0;
				let number = parseFloat(item.number) || 0;
				let total = price * number;
				item.total = total;
				return total;
			},
			//初始化显示子表单数据条数
			initCostsData() {
				for (let i = 0; i < 1; i++) {
					this.form.costs.push(JSON.parse(JSON.stringify(this.costsItem)));
					this.formData.costsItemDatas.push(JSON.parse(JSON.stringify(this.costsItemData)));
				}
				this.initCostsValid();
			},
			//子表单验证
			initCostsValid() {
				this.$nextTick(() => {
					this.$refs['costsRef']?.forEach((subform) => {
						subform.setRules(this.costsItemRules);
					});
				});
			},
			//上移子表单
			upCostsItem(evt) {
				let { index } = evt.currentTarget.dataset;
				if (index == 0) {
					this.navigateTo({
						type: 'tip',
						tip: '已经是第一个'
					});
					return false;
				}
				this.form.costs[index] = this.form.costs.splice(index - 1, 1, this.form.costs[index])[0];
				this.formData.costsItemDatas[index] = this.formData.costsItemDatas.splice(index - 1, 1, this.formData.costsItemDatas[index])[0];
				this.initCostsValid();
			},
			//下移子表单
			downCostsItem(evt) {
				let { index } = evt.currentTarget.dataset;
				if (index == this.form.costs.length - 1) {
					this.navigateTo({
						type: 'tip',
						tip: '已经是最后一个'
					});
					return false;
				}
				this.form.costs[index] = this.form.costs.splice(index + 1, 1, this.form.costs[index])[0];
				this.formData.costsItemDatas[index] = this.formData.costsItemDatas.splice(index + 1, 1, this.formData.costsItemDatas[index])[0];
				this.initCostsValid();
			},
			//删除子表单
			delCostsItem(evt) {
				let { index } = evt.currentTarget.dataset;
				this.form.costs.splice(index, 1);
				this.formData.costsItemDatas.splice(index, 1);
				this.initCostsValid();
			},
			//增加子表单
			addCostsItem() {
				this.form.costs.push(JSON.parse(JSON.stringify(this.costsItem)));
				this.formData.costsItemDatas.push(JSON.parse(JSON.stringify(this.costsItemData)));
				this.initCostsValid();
			},
			//验证所有的子表单
			checkCostsValid() {
				let flag = true;
				this.$refs['costsRef']?.forEach((subform) => {
					subform.validate((valid) => {
						if (!valid) {
							flag = false;
							return false;
						}
					});
				});
				return flag;
			},
			initResetform() {
				this.initform = JSON.stringify(this.form);
				//如果想给表单默认初始值,其中row为某一行数据也可能是API返回的结果集,然后给到this.form
				//this.form = this.$tools.changeRowToForm(row,this.form)
			},
			resetForm() {
				this.form = JSON.parse(this.initform);
			},

			async submitForm(e) {
				this.$refs.formRef?.setRules(this.formRules);

				this.initProductsValid();
				this.initCostsValid();
				this.$nextTick(async () => {
					let productsvalid = await this.checkProductsValid();
					let costsvalid = await this.checkCostsValid();
					let valid = await this.$refs.formRef.validate();
					if (valid && productsvalid && costsvalid) {
						//保存数据
						let param = this.form;
						let header = {
							'Content-Type': 'application/json'
						};
						let url = '/sell/orders/add';

						if (this.userInfo.customer) {
							param.customerTitle = this.userInfo.customer.title;
							param.customerPhone = this.userInfo.customer.phone;
							param.customerAddress = this.userInfo.customer.address;
							param.customerUsername = this.userInfo.customer.username;
						}

						if (this.form.products.length == 0) {
							this.showToast('产品不能为空');
							return;
						}

						let findProducts = this.form.products.filter((item) => {
							return !item.title;
						});
						if (findProducts.length > 0) {
							this.showToast('产品不能为空');
							return;
						}

						let res = await this.$http.post(url, param, header, 'json');
						if (res.code == 200) {
							//更新列表数据
							if (this.form.id) {
								this.showToast('更新成功');
								this.navigateTo({
									type: 'page',
									url: 'sells'
								});
							} else {
								//提示是否继续新增
								let flag = await this.showModal('是否继续新增');
								if (flag) {
									//重置表单
									this.resetForm();
								} else {
									//关闭窗口
									this.navigateTo({
										type: 'page',
										url: 'sells'
									});
								}
							}
						}
					} else {
						console.log('验证失败');
					}
				});
			}
		}
	};
</script>

<style lang="scss" scoped>
	.flex-clz {
		background-color: #ffffff;
		margin-left: 20rpx;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		margin-right: 20rpx;
	}
	.flex28-clz {
		padding-top: 20rpx;
		flex: 1;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		padding-right: 20rpx;
	}
	.text5-clz {
		flex: 1;
		font-weight: bold;
		font-size: 28rpx !important;
	}
	.flex6-clz {
		flex: 1;
	}
	.title-clz {
		flex: 1;
		font-weight: bold;
		font-size: 28rpx !important;
	}
	.flex22-clz {
		font-weight: bold;
		font-size: 28rpx !important;
	}
	.address-clz {
		flex: 1;
	}
	.text22-clz {
		font-weight: bold;
		font-size: 28rpx !important;
	}
	.text20-clz {
		margin-left: 0rpx;
		color: #989898;
		flex: 1;
		width: calc(100% - 0rpx - 0rpx) !important;
		margin-top: 10rpx;
		margin-bottom: 0rpx;
		margin-right: 0rpx;
	}
	.icon4-clz {
		color: #989898;
	}
	.icon4 {
		font-size: 40rpx;
	}
	.flex1-clz {
		background-color: #ffffff;
		margin-left: 20rpx;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		margin-right: 20rpx;
	}
	.text-clz {
		padding-top: 20rpx;
		flex: 1;
		padding-left: 20rpx;
		font-size: 28rpx !important;
		padding-bottom: 20rpx;
		padding-right: 20rpx;
	}
	.flex2-clz {
		background-color: #f4f4f4;
	}
	.text11-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text4-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		flex: 1;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text3-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text2-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text1-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text7-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex4-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		width: 60rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.icon {
		font-size: 40rpx;
	}
	.icon1 {
		font-size: 40rpx;
	}
	.flex5-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		flex: 1;
		width: 120rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.flex11-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		width: 120rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.flex10-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		width: 120rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.flex9-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		width: 120rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.flex7-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		width: 120rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.flex12-clz {
		padding-top: 20rpx;
		flex: 1;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		padding-right: 0rpx;
	}
	.text9-clz {
		margin-left: 10rpx;
		font-weight: bold;
		margin-top: 10rpx;
		margin-bottom: 10rpx;
		margin-right: 10rpx;
	}
	.text14-clz {
		color: #f30303;
		font-weight: bold;
		font-size: 28rpx !important;
		text-align: center;
		min-width: 60px;
	}
	.flex14-clz {
		background-color: #ffffff;
		margin-left: 20rpx;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		margin-right: 20rpx;
	}
	.text13-clz {
		padding-top: 20rpx;
		flex: 1;
		padding-left: 20rpx;
		font-size: 28rpx !important;
		padding-bottom: 20rpx;
		padding-right: 20rpx;
	}
	.flex15-clz {
		background-color: #f4f4f4;
	}
	.text8-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text10-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		flex: 1;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text12-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 160rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex17-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		width: 60rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.icon2 {
		font-size: 40rpx;
	}
	.icon3 {
		font-size: 40rpx;
	}
	.flex18-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		flex: 1;
		width: 120rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.flex19-clz {
		flex-shrink: 0;
		border-right: 2rpx solid #eee;
		width: 160rpx !important;
		border-bottom: 2rpx solid #eee;
		text-align: center;
	}
	.flex23-clz {
		padding-top: 10rpx;
		flex: 1;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		padding-right: 0rpx;
	}
	.text15-clz {
		margin-left: 10rpx;
		font-weight: bold;
		margin-top: 10rpx;
		margin-bottom: 10rpx;
		margin-right: 10rpx;
	}
	.text18-clz {
		color: #f30303;
		font-weight: bold;
		font-size: 28rpx !important;
		text-align: center;
		min-width: 60px;
	}
	.flex20-clz {
		background-color: #ffffff;
		margin-left: 20rpx;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		margin-right: 20rpx;
	}
	.flex21-clz {
		padding-top: 20rpx;
		flex: 1;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		padding-right: 0rpx;
	}
	.text16-clz {
		margin-left: 10rpx;
		font-weight: bold;
		margin-top: 10rpx;
		margin-bottom: 10rpx;
		margin-right: 10rpx;
	}
	.text19-clz {
		color: #f30303;
		font-weight: bold;
		font-size: 28rpx !important;
		text-align: center;
		min-width: 60px;
	}
	.flex26-clz {
		background-color: #ffffff;
		margin-left: 20rpx;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		margin-right: 20rpx;
	}
	.flex27-clz {
		background-color: #ffffff;
		border-bottom-left-radius: 0rpx;
		overflow: hidden;
		left: 0rpx;
		bottom: 0rpx;
		border-top-left-radius: 20rpx;
		border-top-right-radius: 20rpx;
		border-bottom-right-radius: 0rpx;
	}
	.text17-clz {
		padding-top: 16rpx;
		border-bottom-left-radius: 120rpx;
		color: #ffffff;
		padding-left: 20rpx;
		font-size: 28rpx !important;
		padding-bottom: 16rpx;
		border-top-right-radius: 120rpx;
		margin-right: 10rpx;
		margin-left: 10rpx;
		overflow: hidden;
		width: calc(100% - 10rpx - 10rpx) !important;
		border-top-left-radius: 120rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 120rpx;
		margin-bottom: 10rpx;
		text-align: center;
		padding-right: 20rpx;
	}
	.container333104 {
		padding-bottom: 160rpx;
		background-color: #f7f7f7;
	}
</style>

订单管理

订单可以管理所有的开单信息,可以二次编辑、删除等功能。

分别绑定显示的数据源

生成源码

<template>
	<view class="container container333104">
		<u-form-item :borderBottom="false" v-if="globalData.isshow" class="diygw-col-24 title-clz" labelPosition="top" prop="title">
			<u-input @blur="listApi({ refresh: 1 })" :focus="titleFocus" placeholder="请输入客户名或产品名" v-model="title"></u-input>
			<text @tap="navigateTo" data-type="listApi" :data-customer-title="title" data-refresh="1" class="diy-icon-search" style="color: #363636; font-size: 32rpx"></text>
		</u-form-item>
		<view v-if="list.total > 0" class="flex flex-wrap diygw-col-24 flex-direction-column">
			<view v-for="(item, index) in list.rows" :key="index" class="flex flex-wrap diygw-col-24 flex-direction-column flex4-clz">
				<view v-if="userInfo.customer" class="flex flex-wrap diygw-col-0 flex-direction-column justify-between items-center flex6-clz">
					<text class="diygw-col-24 titless-clz">
						{{ item.customerTitle }}
					</text>
					<view class="flex flex-wrap diygw-col-24 items-end">
						<text class="diygw-text-line1 diygw-col-0 address-clz">
							{{ item.customerAddress }}
						</text>
						<text class="diygw-col-0">
							{{ item.customerPhone }}
						</text>
					</view>
					<text class="diygw-text-line1 diygw-col-24">
						{{ item.customerAddress }}
					</text>
				</view>
				<view class="flex flex-wrap diygw-col-24 flex-direction-column flex8-clz">
					<text class="diygw-col-24 text4-clz"> 商品清单 </text>
					<view class="flex flex-wrap diygw-col-24 flex10-clz">
						<text class="diygw-col-0 text11-clz"> # </text>
						<text class="diygw-col-0 text5-clz"> 名称 </text>
						<text class="diygw-col-0 text12-clz"> 单位 </text>
						<text class="diygw-col-0 text14-clz"> 数量 </text>
						<text class="diygw-col-0 text15-clz"> 单价 </text>
						<text class="diygw-col-0 text16-clz"> 合计 </text>
					</view>
					<view v-for="(item, index) in item.products" :key="index" class="flex flex-wrap diygw-col-24 items-stretch">
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex30-clz">
							<text class="diygw-col-0">
								{{ index + 1 }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex18-clz">
							<text class="diygw-text-line3 diygw-col-0 text20-clz">
								{{ item.title }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex19-clz">
							<text class="diygw-col-0">
								{{ item.unit }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex29-clz">
							<text class="diygw-col-0">
								{{ item.number }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex27-clz">
							<text class="diygw-col-0">
								{{ item.price }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex24-clz">
							<text class="diygw-col-0">
								{{ item.total }}
							</text>
						</view>
					</view>
					<view class="flex flex-wrap diygw-col-24 justify-end items-center flex21-clz">
						<text class="diygw-col-0 text29-clz"> 产品合计: </text>
						<view class="flex flex-wrap diygw-col-0 flex-direction-column">
							<text class="diygw-col-0 text30-clz">
								{{ item.productsTotal }}
							</text>
						</view>
					</view>
				</view>
				<view v-if="item.costs.length > 0" class="flex flex-wrap diygw-col-24 flex-direction-column flex13-clz">
					<text class="diygw-col-24 text26-clz"> 费用清单 </text>
					<view class="flex flex-wrap diygw-col-24 flex14-clz">
						<text class="diygw-col-0 text27-clz"> # </text>
						<text class="diygw-col-0 text28-clz"> 名称 </text>
						<text class="diygw-col-0 text32-clz"> 金额 </text>
					</view>
					<view v-for="(item, index) in item.costs" :key="index" class="flex flex-wrap diygw-col-24">
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex33-clz">
							<text class="diygw-col-0">
								{{ index + 1 }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex32-clz">
							<text class="diygw-text-line3 diygw-col-0 text34-clz">
								{{ item.title }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 justify-center items-center flex31-clz">
							<text class="diygw-col-0">
								{{ item.price }}
							</text>
						</view>
					</view>
					<view class="flex flex-wrap diygw-col-24 justify-end items-center flex16-clz">
						<text class="diygw-col-0 text39-clz"> 费用合计: </text>
						<view class="flex flex-wrap diygw-col-0 flex-direction-column">
							<text class="diygw-col-0 text40-clz">
								{{ item.costsTotal }}
							</text>
						</view>
					</view>
				</view>
				<view class="flex flex-wrap diygw-col-24 justify-end items-center flex12-clz">
					<view class="flex flex-wrap diygw-col-24 justify-between items-end flex1-clz">
						<view class="flex flex-wrap diygw-col-0 items-baseline">
							<text class="diygw-text-line1 diygw-col-0 text7-clz"> 开单人: </text>
							<text class="diygw-col-0">
								{{ item.kaidan }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 items-baseline">
							<text class="diygw-text-line1 diygw-col-0 text9-clz"> 整单优惠: </text>
							<text class="diygw-col-0 text10-clz">
								{{ item.youhui || 0 }}
							</text>
						</view>
					</view>
					<view class="flex flex-wrap diygw-col-24 justify-between items-end flex25-clz">
						<view class="flex flex-wrap diygw-col-0 items-baseline">
							<text class="diygw-text-line1 diygw-col-0 text36-clz"> 开单日期: </text>
							<text class="diygw-col-0">
								{{ $tools.formatDateTime(item.kaidanDate, 'YYYY-mm-dd') }}
							</text>
						</view>
						<view class="flex flex-wrap diygw-col-0 items-baseline">
							<text class="diygw-text-line1 diygw-col-0 text43-clz"> 销售总价: </text>
							<text class="diygw-col-0 text44-clz">
								{{ item.total }}
							</text>
						</view>
					</view>
				</view>
				<text v-if="item.remark" class="diygw-text-line3 diygw-col-24 text2-clz">
					{{ item.remark }}
				</text>
				<view class="flex flex-wrap diygw-col-24 justify-end items-center flex2-clz">
					<text @tap="navigateTo" data-type="page" data-url="/pages/sell" :data-id="item.id" class="diygw-col-0 text6-clz"> 修改 </text>
					<text @tap="navigateTo" data-type="delApi" :data-id="item.id" :data-index="index" class="diygw-col-0 text13-clz"> 删除 </text>
				</view>
			</view>
		</view>
		<view v-if="globalData.isshow && list.code == 200 && list.total == 0" class="flex flex-wrap diygw-col-24 flex-direction-column items-center flex-clz">
			<image src="/static/zwjl.png" class="image-size diygw-image diygw-col-0" mode="widthFix"></image>
			<text class="diygw-col-0 text-clz"> 未找到任何数据 </text>
		</view>
		<view @touchmove.stop.prevent="" v-if="modal" class="diygw-modal basic" :class="modal" style="z-index: 1000000">
			<view class="diygw-dialog diygw-dialog-modal basis-lg">
				<view class="justify-end diygw-bar">
					<view class="content">
						{{ form.id ? '编辑产品' : '新增产品' }}
					</view>
					<view class="action" data-type="closemodal" data-id="modal" @tap="navigateTo">
						<text class="diy-icon-close"></text>
					</view>
				</view>
				<view>
					<view class="flex diygw-dialog-content">
						<u-form :model="form" :rules="formRules" :errorType="['message', 'toast']" ref="formRef" class="flex diygw-form diygw-col-24">
							<u-form-item class="diygw-col-24" :required="true" label="标题" prop="title">
								<u-input :focus="formData.titleFocus" placeholder="请输入标题" v-model="form.title"></u-input>
							</u-form-item>
							<u-form-item class="diygw-col-24" label="备注" prop="remark">
								<u-input maxlength="200" height="60px" class="" placeholder="请输入提示信息" v-model="form.remark" type="textarea"></u-input>
							</u-form-item>
							<view class="flex diygw-col-24">
								<button @tap="navigateTo" data-type="clearFunction" class="diygw-btn red radius-xs flex-sub margin-xs button-button-clz">取消</button>
								<button @click="submitForm" class="diygw-btn green radius-xs flex-sub margin-xs button-button-clz">保存</button>
							</view>
						</u-form>
					</view>
				</view>
			</view>
		</view>
		<view v-if="globalData.isshow" class="flex flex-wrap diygw-col-24 justify-start diygw-bottom flex3-clz">
			<view class="flex flex-wrap diygw-col-24 justify-center items-center green flex20-clz" @tap="navigateTo" data-type="page" data-url="/pages/sell">
				<text class="flex icon2 diygw-col-0 diy-icon-add"></text>
				<text class="diygw-col-0"> 新增销售单 </text>
			</view>
		</view>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: { isshow: false },
				listNum: 1,
				list: {
					rows: [
						{
							id: 0,
							products: '',
							costs: '',
							youhui: null,
							total: '',
							remark: '',
							status: null,
							kaidanDate: '',
							customerTitle: '',
							customerUsername: '',
							customerPhone: '',
							customerAddress: '',
							productsTotal: '',
							costsTotal: '',
							createTime: '',
							updateTime: '',
							deleteTime: null
						}
					],
					total: 0,
					code: 0,
					msg: ''
				},
				del: {
					code: 200,
					msg: '删除成功'
				},
				titleFocus: false,
				title: '',
				modal: '',
				formRules: {
					title: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '标题不能为空'
						}
					]
				},
				form: {
					title: '',
					remark: ''
				},
				formData: {
					titleFocus: false
				}
			};
		},
		onShow() {
			this.setCurrentPage(this);

			this.initShow();
		},
		onLoad(option) {
			this.setCurrentPage(this);
			if (option) {
				this.setData({
					globalOption: this.getOption(option)
				});
			}

			this.init();
		},
		onReady() {
			this.$refs.formRef?.setRules(this.formRules);
		},
		methods: {
			async init() {
				await this.initResetform();
			},
			async initShow() {
				//强制重新刷新页面
				await this.listApi({ refresh: 1 });
			},
			// 列表数据 API请求方法
			async listApi(param) {
				let thiz = this;
				param = param || {};

				//如果请求要重置页面,请配置点击附加参数refresh=1  增加判断如输入框回调param不是对象
				if (param.refresh || typeof param != 'object') {
					this.listNum = 1;
				}

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/sell/orders/list';
				let http_data = {
					pageNum: this.listNum,
					pageSize: 10,
					customerTitle: param.customerTitle || this.title
				};
				let http_header = {};

				let list = await this.$http.post(http_url, http_data, http_header, 'json');

				list.rows.forEach((item) => {
					item.products = item.products ? JSON.parse(item.products) : [];
					item.costs = item.costs ? JSON.parse(item.costs) : [];
					item.costs = item.costs.filter((item) => {
						return item.title;
					});
				});

				let datarows = list.rows;
				if (http_data.pageNum == 1) {
					this.list = list;
				} else if (datarows) {
					let rows = this.list.rows.concat(datarows);
					list.rows = rows;
					this.list = list;
				}
				if (datarows && datarows.length > 0) {
					this.listNum = this.listNum + 1;
				}
				this.globalData.isshow = true;
			},
			// 删除数据 API请求方法
			async delApi(param) {
				let thiz = this;
				param = param || {};

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/sell/orders/del';
				let http_data = {
					id: param.id || this.item.id,
					index: param.index || this.index
				};
				let http_header = {};

				let flag = await this.showModal('是否确定删除该数据');
				if (!flag) {
					this.showToast('你已取消删');
					return;
				}

				let del = await this.$http.post(http_url, http_data, http_header, 'json');

				this.del = del;
				if (del.code == 200) {
					this.list.rows.splice(param.index, 1);
					this.list.total = this.list.rows.length;
					this.showToast('删除数据成功');
				} else {
					this.showToast('删除数据失败', 'error');
				}
			},
			initResetform() {
				this.initform = JSON.stringify(this.form);
				//如果想给表单默认初始值,其中row为某一行数据也可能是API返回的结果集,然后给到this.form
				//this.form = this.$tools.changeRowToForm(row,this.form)
			},
			resetForm() {
				this.form = JSON.parse(this.initform);
			},

			async submitForm(e) {
				this.$refs.formRef?.setRules(this.formRules);

				this.$nextTick(async () => {
					let valid = await this.$refs.formRef.validate();
					if (valid) {
						//保存数据
						let param = this.form;
						let header = {
							'Content-Type': 'application/json'
						};
						let url = '/demo/table/add';

						if (this.form.id) {
							url = '/demo/table/update';
						}
						uni.showLoading({
							title: '正在保存...'
						});
						let res = await this.$http.post(url, param, header, 'json');
						uni.hideLoading();
						if (res.code == 200) {
							//更新列表数据
							this.listNum = 1;
							this.listApi();
							if (this.form.id) {
								this.showToast('更新成功');
								//关闭窗口
								this.navigateTo({
									type: 'closemodal',
									id: 'modal'
								});
							} else {
								//提示是否继续新增
								let flag = await this.showModal('是否继续新增');
								if (flag) {
									//重置表单
									this.resetForm();
								} else {
									//关闭窗口
									this.navigateTo({
										type: 'closemodal',
										id: 'modal'
									});
								}
							}
						} else {
							this.showModal(res.msg, '提示', false);
						}
					} else {
						console.log('验证失败');
					}
				});
			}
		},
		onPullDownRefresh() {
			// 列表数据 API请求方法
			this.listNum = 1;
			this.listApi();

			uni.stopPullDownRefresh();
		},
		onReachBottom() {
			// 列表数据 API请求方法
			this.listApi();
		}
	};
</script>

<style lang="scss" scoped>
	.title-clz {
		background-color: #ffffff;
		margin-left: 16rpx;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 16rpx - 16rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 16rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 16rpx;
		margin-right: 16rpx;
	}
	.flex4-clz {
		padding-top: 10rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 12rpx;
		margin-right: 20rpx;
		background-color: #ffffff;
		margin-left: 20rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex6-clz {
		border: 2rpx solid #eee;
		padding-top: 10rpx;
		flex: 1;
		padding-left: 10rpx;
		font-size: 28rpx !important;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.titless-clz {
		flex: 1;
	}
	.address-clz {
		flex: 1;
	}
	.flex8-clz {
		margin-left: 0rpx;
		border: 2rpx solid #eee;
		width: calc(100% - 0rpx - 0rpx) !important;
		margin-top: 10rpx;
		margin-bottom: 0rpx;
		margin-right: 0rpx;
	}
	.text4-clz {
		background-color: #f4f4f4;
		padding-top: 10rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex10-clz {
		background-color: #f4f4f4;
		border-top: 2rpx solid #eee;
	}
	.text11-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text5-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		flex: 1;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text12-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text14-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text15-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text16-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex30-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex18-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		flex: 1;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text20-clz {
		flex: 1;
	}
	.flex19-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex29-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex27-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex24-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex21-clz {
		flex: 1;
	}
	.text29-clz {
		margin-left: 10rpx;
		font-weight: bold;
		margin-top: 10rpx;
		margin-bottom: 10rpx;
		margin-right: 10rpx;
	}
	.text30-clz {
		color: #f30303;
		font-weight: bold;
		font-size: 28rpx !important;
		text-align: center;
		min-width: 60px;
	}
	.flex13-clz {
		margin-left: 0rpx;
		border: 2rpx solid #eee;
		width: calc(100% - 0rpx - 0rpx) !important;
		margin-top: 10rpx;
		margin-bottom: 0rpx;
		margin-right: 0rpx;
	}
	.text26-clz {
		background-color: #f4f4f4;
		padding-top: 10rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex14-clz {
		background-color: #f4f4f4;
		border-top: 2rpx solid #eee;
	}
	.text27-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text28-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		flex: 1;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text32-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex33-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex32-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		flex: 1;
		padding-left: 10rpx;
		width: 60rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.text34-clz {
		flex: 1;
	}
	.flex31-clz {
		flex-shrink: 0;
		padding-top: 10rpx;
		border-right: 2rpx solid #eee;
		padding-left: 10rpx;
		width: 120rpx !important;
		padding-bottom: 10rpx;
		border-bottom: 2rpx solid #eee;
		text-align: center;
		padding-right: 10rpx;
	}
	.flex16-clz {
		flex: 1;
	}
	.text39-clz {
		margin-left: 10rpx;
		font-weight: bold;
		margin-top: 10rpx;
		margin-bottom: 10rpx;
		margin-right: 10rpx;
	}
	.text40-clz {
		color: #f30303;
		font-weight: bold;
		font-size: 28rpx !important;
		text-align: center;
		min-width: 60px;
	}
	.flex12-clz {
		margin-left: 0rpx;
		border: 2rpx solid #eee;
		width: calc(100% - 0rpx - 0rpx) !important;
		margin-top: 10rpx;
		margin-bottom: 0rpx;
		margin-right: 0rpx;
	}
	.flex1-clz {
		padding-top: 10rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text7-clz {
		flex: 1;
	}
	.text9-clz {
		color: #000000;
		flex: 1;
		font-weight: bold;
	}
	.text10-clz {
		color: #f30303;
		font-weight: bold;
		font-size: 28rpx !important;
		text-align: center;
		min-width: 60px;
	}
	.flex25-clz {
		padding-top: 10rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text36-clz {
		flex: 1;
	}
	.text43-clz {
		color: #000000;
		flex: 1;
		font-weight: bold;
	}
	.text44-clz {
		color: #f30303;
		font-weight: bold;
		font-size: 28rpx !important;
		text-align: center;
		min-width: 60px;
	}
	.text2-clz {
		padding-top: 10rpx;
		color: #7c7c7c;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex2-clz {
		border-top: 2rpx solid #eee;
		padding-top: 10rpx;
		color: #6b6b6b;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text6-clz {
		border: 2rpx solid #038af2;
		padding-top: 10rpx;
		border-bottom-left-radius: 10rpx;
		color: #038af2;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 10rpx;
		margin-right: 10rpx;
		background-color: #f0f1ff;
		margin-left: 10rpx;
		overflow: hidden;
		border-top-left-radius: 10rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 10rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.text13-clz {
		border: 2rpx solid #ffb08f;
		padding-top: 10rpx;
		border-bottom-left-radius: 10rpx;
		color: #ff592c;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 10rpx;
		margin-right: 10rpx;
		background-color: #fff4f0;
		margin-left: 10rpx;
		overflow: hidden;
		border-top-left-radius: 10rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 10rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.flex-clz {
		padding-top: 20rpx;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		padding-right: 20rpx;
	}
	.image-size {
		height: 400rpx !important;
		width: 400rpx !important;
	}
	.text-clz {
		color: #969696;
		font-size: 28rpx !important;
	}
	.modal-clz {
		z-index: 1000000;
	}
	.diygw-dialog-modal {
	}
	.button-button-clz {
		margin: 6rpx !important;
	}
	.flex3-clz {
		padding-top: 16rpx;
		border-bottom-left-radius: 0rpx;
		color: #747474;
		bottom: 0rpx;
		padding-left: 16rpx;
		padding-bottom: 16rpx;
		border-top-right-radius: 20rpx;
		background-color: #ffffff;
		overflow: hidden;
		left: 0rpx;
		border-top-left-radius: 20rpx;
		border-bottom-right-radius: 0rpx;
		padding-right: 16rpx;
	}
	.flex20-clz {
		padding-top: 16rpx;
		border-bottom-left-radius: 200rpx;
		overflow: hidden;
		font-weight: bold;
		padding-left: 10rpx;
		font-size: 28rpx !important;
		padding-bottom: 16rpx;
		border-top-left-radius: 200rpx;
		border-top-right-radius: 200rpx;
		border-bottom-right-radius: 200rpx;
		padding-right: 10rpx;
	}
	.icon2 {
		font-size: 40rpx;
	}
	.container333104 {
		padding-bottom: 160rpx;
		background-color: #f5f5f5;
	}
</style>

客户管理

系统能够记录和管理客户的基本信息、联系方式等,方便销售人员进行客户分析和维护。提供客户分类和标签功能,有助于销售人员更好地识别和管理不同类型的客户。

生成源码

<template>
	<view class="container container333104">
		<u-form-item :borderBottom="false" v-if="globalData.isshow" class="diygw-col-24 title-clz" labelPosition="top" prop="title">
			<u-input @blur="listApi({ refresh: 1 })" :focus="titleFocus" placeholder="请输入客户名" v-model="title"></u-input>
			<text @blur="listApi({ refresh: 1 })" class="diy-icon-search" style="color: #363636; font-size: 32rpx"></text>
		</u-form-item>
		<view v-if="list.total > 0" class="flex flex-wrap diygw-col-24 flex-direction-column">
			<view v-for="(item, index) in list.rows" :key="index" class="flex flex-wrap diygw-col-24 flex-direction-column flex4-clz">
				<text class="diygw-text-line2 diygw-col-24 text1-clz">
					{{ item.title }}
				</text>
				<text v-if="item.remark" class="diygw-text-line3 diygw-col-24 text2-clz">
					{{ item.remark }}
				</text>
				<view class="flex flex-wrap diygw-col-24 justify-end items-center flex2-clz">
					<text v-if="globalOption.isselect" @tap="navigateTo" data-type="selectCustomerFunction" :data-index="index" class="diygw-col-0 text6-clz"> 选择客户 </text>
					<text @tap="navigateTo" data-type="editFunction" :data-index="index" class="diygw-col-0 text4-clz"> 修改 </text>
					<text @tap="navigateTo" data-type="delApi" :data-id="item.id" :data-index="index" class="diygw-col-0 text13-clz"> 删除 </text>
				</view>
			</view>
		</view>
		<view v-if="globalData.isshow" class="flex flex-wrap diygw-col-24 justify-start diygw-bottom flex3-clz">
			<view class="flex flex-wrap diygw-col-24 justify-center items-center green flex20-clz" @tap="navigateTo" data-type="openmodal" data-id="modal">
				<text class="flex icon2 diygw-col-0 diy-icon-add"></text>
				<text class="diygw-col-0"> 新增客户 </text>
			</view>
		</view>
		<view v-if="globalData.isshow && list.code == 200 && list.total == 0" class="flex flex-wrap diygw-col-24 flex-direction-column items-center flex-clz">
			<image src="/static/zwjl.png" class="image-size diygw-image diygw-col-0" mode="widthFix"></image>
			<text class="diygw-col-0 text-clz"> 未找到任何数据 </text>
		</view>
		<view @touchmove.stop.prevent="" v-if="modal" class="diygw-modal bottom-modal" :class="modal" style="z-index: 1000000">
			<view class="diygw-dialog diygw-dialog-modal">
				<view class="justify-end diygw-bar">
					<view class="content">
						{{ form.id ? '编辑客户' : '新增客户' }}
					</view>
					<view class="action" data-type="closemodal" data-id="modal" @tap="navigateTo">
						<text class="diy-icon-close"></text>
					</view>
				</view>
				<view>
					<view class="flex diygw-dialog-content">
						<u-form :model="form" :rules="formRules" :errorType="['message', 'toast']" ref="formRef" class="flex diygw-form diygw-col-24">
							<u-form-item labelAlign="justify" class="diygw-col-24" :required="true" label="客户名称" prop="title">
								<u-input :focus="formData.titleFocus" placeholder="请输入客户名称" v-model="form.title"></u-input>
							</u-form-item>
							<u-form-item labelAlign="justify" class="diygw-col-24" :required="true" label="联系人" prop="username">
								<u-input :focus="formData.usernameFocus" placeholder="请输入联系人" v-model="form.username"></u-input>
							</u-form-item>
							<u-form-item labelAlign="justify" class="diygw-col-24" :required="true" label="联系电话" prop="phone">
								<u-input :focus="formData.phoneFocus" placeholder="请输入电话" v-model="form.phone"></u-input>
							</u-form-item>
							<u-form-item labelAlign="justify" class="diygw-col-24" :required="true" label="联系地址" prop="address">
								<u-input :focus="formData.addressFocus" placeholder="请输入联系地址" v-model="form.address"></u-input>
							</u-form-item>
							<u-form-item labelAlign="justify" class="diygw-col-24" label="备注" prop="remark">
								<u-input maxlength="200" height="60px" class="" placeholder="请输入提示信息" v-model="form.remark" type="textarea"></u-input>
							</u-form-item>
							<view class="flex diygw-col-24">
								<button @tap="navigateTo" data-type="closemodal" data-id="modal" class="diygw-btn red radius flex-sub margin-xs button-button-clz">取消</button>
								<button @click="submitForm" class="diygw-btn green radius flex-sub margin-xs button-button-clz">保存</button>
							</view>
						</u-form>
					</view>
				</view>
			</view>
		</view>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: { isshow: false },
				listNum: 1,
				list: {
					rows: [],
					total: 0,
					code: 200,
					msg: 'success'
				},
				del: {
					code: 200,
					msg: '删除成功'
				},
				titleFocus: false,
				title: '',
				modal: '',
				formRules: {
					title: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '客户不能为空'
						}
					],
					username: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '联系人不能为空'
						}
					],
					phone: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '电话不能为空'
						},

						{
							trigger: ['change', 'blur'],
							message: '请输入11位的手机号码',
							pattern: /^1[3-9]\d{9}$/
						}
					],
					address: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '联系地址不能为空'
						}
					]
				},
				form: {
					title: '',
					username: '',
					phone: '',
					address: '',
					remark: ''
				},
				formData: {
					titleFocus: false,
					usernameFocus: false,
					phoneFocus: false,
					addressFocus: false
				}
			};
		},
		onShow() {
			this.setCurrentPage(this);
		},
		onLoad(option) {
			this.setCurrentPage(this);
			if (option) {
				this.setData({
					globalOption: this.getOption(option)
				});
			}

			this.init();
		},
		onReady() {
			this.$refs.formRef?.setRules(this.formRules);
		},
		methods: {
			async init() {
				await this.listApi();
				await this.initResetform();
			},
			// 列表数据 API请求方法
			async listApi(param) {
				let thiz = this;
				param = param || {};

				//如果请求要重置页面,请配置点击附加参数refresh=1  增加判断如输入框回调param不是对象
				if (param.refresh || typeof param != 'object') {
					this.listNum = 1;
				}

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/sell/customer/list';
				let http_data = {
					pageNum: this.listNum,
					pageSize: 10,
					title_like: param.title_like || this.title
				};
				let http_header = {};

				let list = await this.$http.post(http_url, http_data, http_header, 'json');

				let datarows = list.rows;
				if (http_data.pageNum == 1) {
					this.list = list;
				} else if (datarows) {
					let rows = this.list.rows.concat(datarows);
					list.rows = rows;
					this.list = list;
				}
				if (datarows && datarows.length > 0) {
					this.listNum = this.listNum + 1;
				}
				this.globalData.isshow = true;
			},
			// 删除数据 API请求方法
			async delApi(param) {
				let thiz = this;
				param = param || {};

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/sell/customer/del';
				let http_data = {
					id: param.id || this.item.id,
					index: param.index || this.index
				};
				let http_header = {};

				let flag = await this.showModal('是否确定删除该数据');
				if (!flag) {
					this.showToast('你已取消删');
					return;
				}

				let del = await this.$http.post(http_url, http_data, http_header, 'json');

				this.del = del;
				if (del.code == 200) {
					this.list.rows.splice(param.index, 1);
					this.list.total = this.list.rows.length;
					this.showToast('删除数据成功');
				} else {
					this.showToast('删除数据失败', 'error');
				}
			},

			// 修改数据 自定义方法
			async editFunction(param) {
				let thiz = this;
				let index = param && (param.index || param.index == 0) ? param.index : thiz.index || '';
				this.form = JSON.parse(JSON.stringify(this.list.rows[param.index]));
				this.navigateTo({
					type: 'openmodal',
					id: 'modal'
				});
			},

			// 选择客户 自定义方法
			async selectCustomerFunction(param) {
				let thiz = this;
				let index = param && (param.index || param.index == 0) ? param.index : thiz.index || '';
				this.$session.setUserValue('customer', this.list.rows[param.index]);
				this.navigateTo({
					type: 'page',
					url: 'sell'
				});
			},
			initResetform() {
				this.initform = JSON.stringify(this.form);
				//如果想给表单默认初始值,其中row为某一行数据也可能是API返回的结果集,然后给到this.form
				//this.form = this.$tools.changeRowToForm(row,this.form)
			},
			resetForm() {
				this.form = JSON.parse(this.initform);
			},

			async submitForm(e) {
				this.$refs.formRef?.setRules(this.formRules);

				this.$nextTick(async () => {
					let valid = await this.$refs.formRef.validate();
					if (valid) {
						//保存数据
						let param = this.form;
						let header = {};
						let url = '/sell/customer/add';

						if (this.form.id) {
							url = '/sell/customer/update';
						}
						uni.showLoading({
							title: '正在保存...'
						});
						let res = await this.$http.post(url, param, header, 'json');
						uni.hideLoading();
						if (res.code == 200) {
							//更新列表数据
							this.listNum = 1;
							this.listApi();
							if (this.form.id) {
								this.showToast('更新成功');
								//关闭窗口
								this.navigateTo({
									type: 'closemodal',
									id: 'modal'
								});
							} else {
								//提示是否继续新增
								let flag = await this.showModal('是否继续新增');
								if (flag) {
									//重置表单
									this.resetForm();
								} else {
									//关闭窗口
									this.navigateTo({
										type: 'closemodal',
										id: 'modal'
									});
								}
							}
						} else {
							this.showModal(res.msg, '提示', false);
						}
					} else {
						console.log('验证失败');
					}
				});
			}
		},
		onPullDownRefresh() {
			// 列表数据 API请求方法
			this.listNum = 1;
			this.listApi();

			uni.stopPullDownRefresh();
		},
		onReachBottom() {
			// 列表数据 API请求方法
			this.listApi();
		}
	};
</script>

<style lang="scss" scoped>
	.title-clz {
		background-color: #ffffff;
		margin-left: 16rpx;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 16rpx - 16rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 16rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 16rpx;
		margin-right: 16rpx;
	}
	.flex4-clz {
		padding-top: 10rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 12rpx;
		margin-right: 20rpx;
		background-color: #ffffff;
		margin-left: 20rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text1-clz {
		padding-top: 10rpx;
		padding-left: 10rpx;
		font-size: 28rpx !important;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text2-clz {
		padding-top: 10rpx;
		color: #7c7c7c;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex2-clz {
		border-top: 2rpx solid #eee;
		padding-top: 10rpx;
		color: #6b6b6b;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text6-clz {
		border: 2rpx solid #038af2;
		padding-top: 10rpx;
		border-bottom-left-radius: 10rpx;
		color: #038af2;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 10rpx;
		margin-right: 10rpx;
		background-color: #f0f1ff;
		margin-left: 10rpx;
		overflow: hidden;
		border-top-left-radius: 10rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 10rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.text4-clz {
		border: 2rpx solid #038af2;
		padding-top: 10rpx;
		border-bottom-left-radius: 10rpx;
		color: #038af2;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 10rpx;
		margin-right: 10rpx;
		background-color: #f0f1ff;
		margin-left: 10rpx;
		overflow: hidden;
		border-top-left-radius: 10rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 10rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.text13-clz {
		border: 2rpx solid #ffb08f;
		padding-top: 10rpx;
		border-bottom-left-radius: 10rpx;
		color: #ff592c;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 10rpx;
		margin-right: 10rpx;
		background-color: #fff4f0;
		margin-left: 10rpx;
		overflow: hidden;
		border-top-left-radius: 10rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 10rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.flex3-clz {
		padding-top: 16rpx;
		border-bottom-left-radius: 0rpx;
		color: #747474;
		bottom: 0rpx;
		padding-left: 16rpx;
		padding-bottom: 16rpx;
		border-top-right-radius: 20rpx;
		background-color: #ffffff;
		overflow: hidden;
		left: 0rpx;
		border-top-left-radius: 20rpx;
		border-bottom-right-radius: 0rpx;
		padding-right: 16rpx;
	}
	.flex20-clz {
		padding-top: 16rpx;
		border-bottom-left-radius: 200rpx;
		overflow: hidden;
		font-weight: bold;
		padding-left: 10rpx;
		font-size: 28rpx !important;
		padding-bottom: 16rpx;
		border-top-left-radius: 200rpx;
		border-top-right-radius: 200rpx;
		border-bottom-right-radius: 200rpx;
		padding-right: 10rpx;
	}
	.icon2 {
		font-size: 40rpx;
	}
	.flex-clz {
		padding-top: 20rpx;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		padding-right: 20rpx;
	}
	.image-size {
		height: 400rpx !important;
		width: 400rpx !important;
	}
	.text-clz {
		color: #969696;
		font-size: 28rpx !important;
	}
	.modal-clz {
		z-index: 1000000;
	}
	.diygw-dialog-modal {
	}
	.button-button-clz {
		margin: 6rpx !important;
	}
	.container333104 {
		padding-bottom: 160rpx;
		background-color: #f5f5f5;
	}
</style>

系统首页

系统首页我们提供了快速开单、订单管理、客户管理、用户管理等快速入口界面

生成源码

<template>
	<view class="container container333104">
		<view class="flex diygw-col-24 flex-direction-column justify-center items-center flex-nowrap">
			<view class="flex flex-wrap diygw-col-0 flex-direction-column justify-center items-center flex19-clz" @tap="navigateTo" data-type="page" data-url="/pages/sell">
				<image src="/static/icon1_bj.png" class="image-size diygw-image diygw-col-0 image-clz" mode="widthFix"></image>
				<text class="diygw-col-0 text14-clz"> 快速开单 </text>
			</view>
		</view>
		<view class="flex flex-wrap diygw-col-24 flex13-clz">
			<view class="flex diygw-col-24 flex-direction-column items-start flex-wrap flex6-clz" @tap="navigateTo" data-type="page" data-url="/pages/sells">
				<view class="flex diygw-col-24 items-center flex-nowrap">
					<view class="flex flex-wrap diygw-col-0 flex-direction-column flex15-clz">
						<text class="diygw-col-0 text3-clz"> 订单管理 </text>
						<text class="diygw-col-0 text16-clz"> 查看所有订单 </text>
					</view>
					<image src="/static/icon1_gw.png" class="image2-size diygw-image diygw-col-0 image2-clz" mode="widthFix"></image>
				</view>
			</view>
			<view class="flex diygw-col-24 flex-direction-column items-start flex-wrap flex21-clz" @tap="navigateTo" data-type="page" data-url="/pages/customer">
				<view class="flex diygw-col-24 items-center flex-nowrap">
					<view class="flex flex-wrap diygw-col-0 flex-direction-column flex23-clz">
						<text class="diygw-col-0 text18-clz"> 客户管理 </text>
						<text class="diygw-text-line1 diygw-col-0 text19-clz"> 查看所有客户 </text>
					</view>
					<image src="/static/icon1_fs.png" class="image6-size diygw-image diygw-col-0 image6-clz" mode="widthFix"></image>
				</view>
			</view>
			<view class="flex diygw-col-24 flex-direction-column items-start flex-wrap flex4-clz" @tap="navigateTo" data-type="page" data-url="/pages/user">
				<view class="flex diygw-col-24 items-center flex-nowrap">
					<view class="flex flex-wrap diygw-col-0 flex-direction-column flex8-clz">
						<text class="diygw-col-0 text4-clz"> 用户管理 </text>
						<text class="diygw-col-0 text5-clz"> 管理登录用户 </text>
					</view>
					<image src="/static/icon1_rzyh.png" class="image3-size diygw-image diygw-col-0 image3-clz" mode="widthFix"></image>
				</view>
			</view>
			<view class="flex diygw-col-24 flex-direction-column items-start flex-wrap flex-clz" @tap="navigateTo" data-type="loginOutFunction">
				<view class="flex diygw-col-24 items-center flex-nowrap">
					<view class="flex flex-wrap diygw-col-0 flex-direction-column flex2-clz">
						<text class="diygw-col-0 text-clz"> 退出登录 </text>
					</view>
					<image src="/static/icon1_s.png" class="image1-size diygw-image diygw-col-0 image1-clz" mode="widthFix"></image>
				</view>
			</view>
		</view>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: {}
			};
		},
		onShow() {
			this.setCurrentPage(this);
		},
		onLoad(option) {
			this.setCurrentPage(this);
			if (option) {
				this.setData({
					globalOption: this.getOption(option)
				});
			}

			this.init();
		},
		methods: {
			async init() {},
			// 新增方法 自定义方法
			async initFunction(param) {
				let thiz = this;
				if (!this.$session.getToken()) {
					//比如未登录,转身到其他页面等
					this.showToast('请先登录');

					this.navigateTo({
						type: 'page',
						url: 'login'
					});
					return;
				}
			},

			// 退出登录 自定义方法
			async loginOutFunction(param) {
				let thiz = this;
				this.$session.clearUser();
				this.navigateTo({
					type: 'page',
					url: 'login'
				});
			}
		}
	};
</script>

<style lang="scss" scoped>
	.flex19-clz {
		padding-top: 40rpx;
		border-bottom-left-radius: 60%;
		padding-left: 40rpx;
		padding-bottom: 40rpx;
		border-top-right-radius: 60%;
		margin-right: 10rpx;
		background-color: #f7faff;
		margin-left: 10rpx;
		flex-shrink: 0;
		overflow: hidden;
		width: 400rpx !important;
		border-top-left-radius: 60%;
		margin-top: 40rpx;
		border-bottom-right-radius: 60%;
		margin-bottom: 40rpx;
		height: 400rpx !important;
		padding-right: 40rpx;
	}
	.image-clz {
		border: 2rpx solid #fbfbfb;
		border-bottom-left-radius: 120rpx;
		overflow: hidden;
		border-top-left-radius: 120rpx;
		border-top-right-radius: 120rpx;
		border-bottom-right-radius: 120rpx;
	}
	.image-size {
		height: 160rpx !important;
		width: 160rpx !important;
	}
	.text14-clz {
		font-weight: bold;
		font-size: 30rpx !important;
	}
	.flex13-clz {
		padding-top: 10rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex6-clz {
		padding-top: 20rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		border-top-right-radius: 12rpx;
		margin-right: 10rpx;
		background-color: #f7faff;
		margin-left: 10rpx;
		flex-shrink: 0;
		overflow: hidden;
		width: calc(100% - 10rpx - 10rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.flex15-clz {
		flex: 1;
	}
	.text3-clz {
		flex: 1;
		font-size: 30rpx !important;
	}
	.text16-clz {
		color: #a9a9a9;
	}
	.image2-clz {
		border: 2rpx solid #fbfbfb;
		border-bottom-left-radius: 120rpx;
		overflow: hidden;
		border-top-left-radius: 120rpx;
		border-top-right-radius: 120rpx;
		border-bottom-right-radius: 120rpx;
	}
	.image2-size {
		height: 80rpx !important;
		width: 80rpx !important;
	}
	.flex21-clz {
		padding-top: 20rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		border-top-right-radius: 12rpx;
		margin-right: 10rpx;
		background-color: #f7faff;
		margin-left: 10rpx;
		flex-shrink: 0;
		overflow: hidden;
		width: calc(100% - 10rpx - 10rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.flex23-clz {
		flex: 1;
	}
	.text18-clz {
		flex: 1;
		font-size: 30rpx !important;
	}
	.text19-clz {
		color: #a9a9a9;
	}
	.image6-clz {
		border: 2rpx solid #fbfbfb;
		border-bottom-left-radius: 120rpx;
		overflow: hidden;
		border-top-left-radius: 120rpx;
		border-top-right-radius: 120rpx;
		border-bottom-right-radius: 120rpx;
	}
	.image6-size {
		height: 80rpx !important;
		width: 80rpx !important;
	}
	.flex4-clz {
		padding-top: 20rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		border-top-right-radius: 12rpx;
		margin-right: 10rpx;
		background-color: #f7faff;
		margin-left: 10rpx;
		flex-shrink: 0;
		overflow: hidden;
		width: calc(100% - 10rpx - 10rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.flex8-clz {
		flex: 1;
	}
	.text4-clz {
		flex: 1;
		font-size: 30rpx !important;
	}
	.text5-clz {
		color: #a9a9a9;
	}
	.image3-clz {
		border: 2rpx solid #fbfbfb;
		border-bottom-left-radius: 120rpx;
		overflow: hidden;
		border-top-left-radius: 120rpx;
		border-top-right-radius: 120rpx;
		border-bottom-right-radius: 120rpx;
	}
	.image3-size {
		height: 80rpx !important;
		width: 80rpx !important;
	}
	.flex-clz {
		padding-top: 20rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		border-top-right-radius: 12rpx;
		margin-right: 10rpx;
		background-color: #f7faff;
		margin-left: 10rpx;
		flex-shrink: 0;
		overflow: hidden;
		width: calc(100% - 10rpx - 10rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.flex2-clz {
		flex: 1;
	}
	.text-clz {
		flex: 1;
		font-size: 30rpx !important;
	}
	.image1-clz {
		border: 2rpx solid #fbfbfb;
		border-bottom-left-radius: 120rpx;
		overflow: hidden;
		border-top-left-radius: 120rpx;
		border-top-right-radius: 120rpx;
		border-bottom-right-radius: 120rpx;
	}
	.image1-size {
		height: 80rpx !important;
		width: 80rpx !important;
	}
	.container333104 {
	}
</style>

 开源地址:


https://gitee.com/diygw/diygw-sell.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值