连锁门店管理系统

连锁门店管理系统是基于uniapp框架开发的连锁门店手机app版、小程序、h5等跨平台进销存销售管理系统,后端采用laravel框架开发。

目录结构:
在这里插入图片描述

功能介绍

  • 已开发的功能如下:

    • 增删改查门店客户管理
    • 会员卡类别增删改查
    • 门店客户级别增删改查
    • 客户记额充值.销售
    • 客户计次充值.销售
    • 咨询客户增改查 升级转正式合同客户 一键转门店客户
    • 预约客户增改查 升级转正式合同客户 一键转门店客户
    • 意向客户增改查 升级转正式合同客户 一键转门店客户
    • 合同客户增改查
    • 合作客户增改成
    • 客户管理(即将到期.已到期.已失效.正常客户)
    • 连锁门店管理
    • 连锁总店管理
    • 门店品牌管理
    • 门店分类管理
    • 生产供应商管理
    • 门店产品管理
    • 优惠券管理
    • 门店积分管理
    • 商品入库

部分源码:

<script>
import Vue from 'vue'
import newhost from 'host.js';
import request from 'common/request.js';
export default {
	data: {
		host: newhost.host,
		programsId: newhost.programsId,
		dologin: false,
		userInfo: null,
		imgHost: newhost.imgHost,
		access_token: false,  //带有微信手机号的token
		wx_token: false,  //带有微信openid的token
		members_id: false,
		version: newhost.version
	},

	onLaunch: function(options) {
		console.log("获取到的用户信息是",this.userInfo)
		this.globalData.userInfo = this.userInfo;
		this.globalData.programsId = this.programsId;
		this.globalData.dologin = this.dologin;
		this.globalData.imgHost = this.imgHost;
		this.globalData.version = this.version;
		this.globalData.host = this.host;
		this.globalData.members_id = this.members_id;
		this.globalData.access_token = this.access_token;
		this.globalData.wx_token = this.wx_token;
		Vue.prototype.clientType = function(){
			let c = 1; //默认为电脑
			// #ifdef APP-PLUS
			switch(uni.getSystemInfoSync().platform){
			    case 'android':
			        c = 3;
					break;
			    case 'ios':
			        c = 4;
					break;
				default:
					
			}
			// #endif	
			
			// #ifdef h5
			c = 2;
			// #endif	
			
			// #ifdef MP-WEIXIN
			c = 5;
			// #endif
			return  c
		}
		
		uni.getSystemInfo({
			success: function(e) {
				// #ifndef MP
				Vue.prototype.StatusBar = e.statusBarHeight;
				if (e.platform == 'android') {
					Vue.prototype.CustomBar = e.statusBarHeight + 50;
				} else {
					Vue.prototype.CustomBar = e.statusBarHeight + 45;
				};
				// #endif
		
				// #ifdef MP-WEIXIN
				Vue.prototype.StatusBar = e.statusBarHeight;
				let custom = wx.getMenuButtonBoundingClientRect();
				Vue.prototype.Custom = custom;
				Vue.prototype.CustomBar = custom.bottom + custom.top - e.statusBarHeight;
				// #endif		
		
				// #ifdef MP-ALIPAY
				Vue.prototype.StatusBar = e.statusBarHeight;
				Vue.prototype.CustomBar = e.statusBarHeight + e.titleBarHeight;
				// #endif
			}
		})
		
		//关闭页面
		Vue.prototype.closePage=function(){
			console.log(getCurrentPages());
			if(getCurrentPages().length>1){
				uni.navigateBack();
			}else{
				// #ifdef H5
				history.back()
				// #endif
				// #ifndef H5
				uni.reLaunch({
				    url: '/pages/index/index'
				});
				// #endif
				
			}
		}
		
	},
	onShow: function(options) {
		console.log('App Show', options);
		console.log('获取到的配置信息是', newhost.host);
	},
	methods: {
		//获取路由地址
		getNetAddresss: function(action) {
			this.getExtJson();
			let host = this.globalData.host;
			let programsId = this.globalData.programsId;
			let wx_token = this.getWxToken();
			let access_token = this.getAccessToken();
			let store_token = this.getStoreToken();
			let members_id = this.getStorage('members_id');
			let url = host + '/' + action + '?platform_id=' + programsId + '&wx_token=' + wx_token + '&store_token=' + store_token + '&members_id=' + members_id + '&access_token=' + access_token;
			console.log('APP____URL:::', url);
			return url;
			// return host + '/' + action;
		},
		//获取登录token 带有微信openid的token
		getWxToken: function() {
			var value = uni.getStorageSync('wx_token');
			if (value) {
				return value;
			} else {
				return 0;
			}
		},
		//获取access_token 带有微信手机号的token
		getAccessToken:function(){
			var value = uni.getStorageSync('access_token');
			if (value) {
				console.log('同步登录access_token', value);
				return value;
			} else {
				console.log('access_token失败');
				return 0;
			}
		},
		//获取store_token 带有门店信息的token
		getStoreToken:function(){
			var value = uni.getStorageSync('store_token');
			if (value) {
				console.log('store_token', value);
				this.dologin = true;
				this.globalData.dologin = true;
				return value;
			} else {
				console.log('store_token失败');
				return 0;
			}
		},
		//获取缓存信息
		getStorage:function(mark){
			var value = uni.getStorageSync(mark);
			if (value) {
				console.log('获取缓存信息', value);
				return value;
			} else {
				console.log('获取缓存信息失败',value);
				return 0;
			}
		},
		//获取用户信息
		getUserInfo: function(loginType, cb) {
			var that = this;
			if (this.globalData.userInfo) {
				typeof cb == 'function' && cb(this.globalData.userInfo, true);
				console.log("已经有用户信息了",this.globalData.userInfo)
				uni.navigateTo({
				    url: '/pages/login/login'
				});
				return true;
			} else {
				//1.调用登录接口
				uni.login({
					provider: 'weixin',
					success: function(e) {
						console.log("1.调用登录接口",e);
						if(e.code){
							var code = e.code;
							if(code){
								uni.setStorage({
									key:'wx_code',
									data:code
								})
							}
							that.request().postRequest(that.getNetAddresss('mag/login/index'), {
								'code':code,
							}, {
								'content-type': 'application/x-www-form-urlencoded'
							}).then(res => {
								if (res.code === 1) {
									var result = res.result.wx_token;
									uni.setStorage({
										key:'wx_token',
										data:result
									})
									that.wx_token = result;
									uni.setStorage({
										key:'members_id',
										data:res.result.members_id
									})
									that.members_id = res.result.members_id;
									that.userLogin();
									if(loginType != "getUserInfo:fail auth deny" && loginType != "undefined" && loginType){
										uni.navigateTo({
										    url: '/pages/login/login'
										});
									}
									return true;
								} else {
									uni.showToast({
										title: '温馨提醒:' + res.msg,
										icon: 'none',
										duration: 2000
									})
								}
							})
						}
						return true;
					},
					fail: function(e) {
						console.log('授权登录失败', e);
						uni.showModal({
							title:"授权登录失败",
							content:"因长时间未点击授权允许,授权失败,请重新点击"
						})
						return false;
					}
				});
			}
		},
		//授权用户登录
		userLogin:function(){
			var that = this;
			//2.检查按钮登录是否已过期
			uni.checkSession({
				success: function(c) {
					console.log('没有过期,登录成功', c);
					//3.检查用户设置的授权信息
					uni.getSetting({
						success(res) {
							console.log("检查用户设置的授权信息",res)
							if(res.errMsg == "getSetting:ok"){
								that.loginAuth();
							}else{
								uni.showModal({
									title:'温馨提示',
									content:'请允许用户信息授权!',
									showCancel:false
								})
								uni.authorize({
								    scope: 'scope.userInfo',
								    success(a) {
										that.loginAuth();
								    }
								})
							}
							return;
						},
						fail:function(res){
							console.log("用户授权信息获取失败",res)
							uni.showModal({
								title:'温馨提示',
								content:'请允许用户信息授权',
								showCancel:false
							})
						}
					});
				},
				fail: function(c) {
					console.log('已经过期,登录失败', c);
					uni.showModal({
						title:"登录超时失败",
						content:"因长时间未点击授权允许,授权失败,请重新点击",
						showCancel:false
					})
					return false;
				}
			});
		},
		loginAuth:function(){
			var that = this;
			//4.获取登录微信的信息
			uni.getUserInfo({
				provider: 'weixin',
				lang:"zh_CN",
				withCredentials: true,
				success: function(res) {
					console.log('获取用户信息成功', res);
					that.userInfo = res.userInfo;
					that.globalData.userInfo = res.userInfo;
					uni.setStorageSync('userInfo', res.userInfo);
					uni.setStorage({
					    key: 'userInfo',
					    data: res.userInfo,
					    success: function () {
					        console.log('用户授权信息保存成功');
					    }
					});
					that.setUserInfo(res.userInfo);
					typeof cb == "function" && cb(that.globalData.userInfo);
					uni.navigateTo({
					    url: '/pages/login/login'
					});
					return true;
				},
				fail: function(u) {
					console.log('获取用户信息失败', u);
					return false;
				}
			});
		},
		//设置用户信息
		setUserInfo:function(userInfo,encryptedData='',iv='',session_key=''){
			var that = this;
			if(userInfo){
				uni.setStorage({
				    key: 'userInfo',
				    data: userInfo,
				    success: function () {
				        console.log('用户授权信息保存成功');
				    }
				});
			}
			var nickName = userInfo.nickName;
			var avatarUrl = userInfo.avatarUrl;
			var gender = userInfo.gender;
			var province = userInfo.province;
			var city = userInfo.city;
			var country = userInfo.country;
			var access_token = that.getAccessToken();
			var wx_token = that.getWxToken();
			var members_id = that.getStorage('members_id');
			var code = that.getStorage('wx_code');
			if(encryptedData && iv){
				that.request().postRequest(that.getNetAddresss('api/login/userInfo'), {
					'members_id': members_id,
					'session_key':session_key,
					'avatarUrl':avatarUrl,
					'gender':gender,
					'province':province,
					'city':city,
					'country':country,
					'encryptedData':encryptedData,
					'iv':iv,
					'code':code,
				}, {
					'content-type': 'application/x-www-form-urlencoded',
					'access_token': access_token,
					'wx_token': wx_token,
				}).then(res => {
					if (res.code === 1) {
						var result = res.result;
						console.log("返回的信息是",result)
						if(result.access_token){
							var mobile = result.phoneNumber;
							uni.setStorage({
								key:'mobile',
								data:mobile
							})
							uni.setStorageSync('mobile',mobile);
							uni.setStorage({
							    key: 'access_token',
							    data: result.access_token,
							});
							return mobile;
						}else{
							return false;
						}
					} else {
						uni.showToast({
							title: '温馨提醒:' + res.msg,
							icon: 'none',
							duration: 2000
						})
						return false;
					}
				})
			}
		},
		//获取开放平台缓存数据
		getExtJson: function() {
			var that = this;
			console.log('getExtConfig', uni.getExtConfig);
			console.log('getExtConfigSync', uni.getExtConfigSync);
			if (uni.getExtConfig || uni.getExtConfigSync) {
				const extConfig = uni.getExtConfigSync ? uni.getExtConfigSync() : {};
				console.log('********extConfig*********', extConfig);
				if (extConfig.host) {
					console.log('================extJson exists===============');
					that.globalData.host = extConfig.host;
					that.globalData.programsId = extConfig.programsId;
					that.globalData.version = extConfig.version;
					console.log('设置version', that.globalData.version);
				} else {
					console.log('================extJson not exists===============');
					uni.getExtConfigSync({
						success: function(res) {
							console.log('================extJson===============', res.extConfig);
							that.globalData.host = res.extConfig.host;
							that.globalData.programsId = res.extConfig.programsId;
							that.globalData.version = res.extConfig.version;
							console.log('设置version', that.globalData.version);
						},
						fail: function(res) {
							console.log('================error.extJson===============', res);
						}
					});
				}
			} else {
				that.globalData.host = newhost.host;
				that.globalData.programsId = newhost.programsId;
				that.globalData.version = newhost.version;
			}
		},
		//网络请求
		request: function() {
			return new request();
		}
	},
	globalData: {
		userInfo: null
	},
	//隐藏卸载页面
	onHide: function(options) {
		console.log('隐藏卸载页面', options);
	}
};
</script>

<style>
/*每个页面公共css */
	@import "/common/iconfont/iconfont.css";
	/* #ifndef APP-PLUS-NVUE */
	@import "/common/main.css";
	/* #endif */
	
	/* 骨架屏方案 */
	.Skeleton {
		background-color: #f3f3f3;
		padding: 20upx 0;
		border-radius: 6upx;
	}
/**app.wxss**/
page {
	background: #f1f5f8;
	font-size: 32rpx;
	/* height: 100%; */
}
.background {
	width: 100%;
	height: 100%;
	position: fixed;
	background-size: 100% 100%;
	z-index: -1;
}
swiper-item {
	display: flex;
	flex-direction: column;
}
.ContentBackground {
	width: 96%;
	background-color: white;
	margin: 0rpx auto;
	border-radius: 10rpx;
	padding-bottom: 50rpx;
	padding-top: 10rpx;
	box-shadow: 0 0.05rem 0.5rem 0.25rem rgba(80, 136, 230, 0.1);
}
.swiper-tab {
	width: 100%;
	text-align: center;
	height: 88rpx;
	line-height: 88rpx;
	display: flex;
	flex-flow: row;
	justify-content: space-between;
	background-color: #ffffff;
}

.swiper-tab-item {
	width: 30%;
	font-size: 12pt;
	color: #000000;
}
.switch-group {
	flex: 1;
	display: flex;
}

.swtich-label {
	margin-right: 30rpx;
	display: flex;
	justify-content: center;
	align-items: center;
}
.active {
	color: #09bb07;
	border-bottom: 5rpx solid #09bb07;
}

/* 幻灯片 */
.slide {
	width: 93%;
	margin: 0rpx auto;
	border-radius: 10rpx;
}

.swiper-wrapper .swiper-item-wrapper {
	height: 100%;
}
.swiper-wrapper .swiper-item-wrapper image {
	width: 100%;
	height: 100%;
}
.swiper-wrapper .swiper-item-wrapper {
	height: 100%;
}

.swiper-wrapper .swiper-item-wrapper image {
	width: 100%;
	height: 100%;
}

.container {
	height: 100%;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: space-between;
	/* padding: 200rpx 0; */
	box-sizing: border-box;
}
.foot {
	display: flex;
	justify-content: center;
}
.copyright {
	font-size: 28rpx;
	color: #999;
	bottom: 0;
	left: 0;
	right: 0;
	padding: 28rpx;
	text-align: center;
}

button {
	width: 97%;
	height: 3.5rem;
	line-height: 3.5rem;
	/* margin: 20rpx; */
}

.btn1 {
	margin-top: 20rpx;
	height: 3.5rem;
	line-height: 3.5rem;
	background-color: rgb(0, 148, 123);
	color: white;
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: center;
}

.btn2 {
	background-color: #69c3aa;
}

.button-hover {
	background-color: #69c3aa;
	opacity: 0.9;
}
.btnImg {
	margin-right: 8rpx;
	width: 46rpx;
	height: 46rpx;
}

.btn1::after {
	border-radius: 8rpx;
	width: 90%;
}

.click_icon {
	padding: 0.5rem;
}

.click_icon image {
	width: 2.5rem;
	height: 2.5rem;
}
</style>

完整源码私信获取

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐