基于node+vue的婚纱摄影网站

博主主页猫头鹰源码

博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战

主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询

文末联系获取

项目介绍: 

本系统适合选题:婚纱、摄影、婚纱摄影、node、vue等。系统采用node+vue整合开发,功能齐全,界面美观。

部分功能:

1.用户管理模块
用户注册与登录:提供用户注册新账号和登录现有账号的功能。
个人资料管理:允许用户编辑和更新他们的个人资料,包括姓名、联系 信息、头像、介绍等。
2.摄影师管理模块
摄影师列表: 展示所有注册的摄影师,包括头像、姓名、作品等。
摄影师个人资料:允许摄影师创建和编辑自己的个人资料。
订单管理与统计:管理员可以查看和管理所有订单,生成报表和统计数据。
    3.摄影服务浏览与搜索
摄影作品展示:展示摄影师的作品集,包括照片和描述,以供用户浏览和选择。
搜索与筛选功能:允许用户根据不同标准(例如,价格范围、拍摄风格、摄影师名字等)搜索和筛选摄影师。
价格与服务详情:提供详细的价格信息和服务描述,帮助用户了解摄影师提供的具体服务。
4.预约与下单模块
预约摄影服务:允许用户选择摄影师并选择服务日期、时间等,然后创建预约请求。
下单与支付处理:用户能够确认预约并支付摄影服务费用,通常支持多种支付方式。
加购物车:允许用户将预约的物品加入购物车。
5.评价与反馈模块
用户对摄影师的评价:用户可以给摄影师提供评价和反馈,帮助其他用户做出决策。
评价统计与可视化:平台可以展示摄影师的平均评分和用户评价的可视化统计数据。
6.消息模块
用户间消息通信:用户和用户之间的消息通信功能,以便互相分享评价和经验。
用户与商家消息通信:用户和摄影师之间的消息通信功能,以便进一步协商和沟通。
通过以上工作,本毕业设计旨在研究并实现一款基于Vue.js和Node.js的婚纱摄影服务平台,解决现有市场上的问题,并为用户提供便捷的摄影服务。项目的工作量包括市场研究、系统设计、前后端开发、测试和用户反馈等多个方面,以确保平台的稳定性和用户满意度。

系统包含技术:

后端:nodejs
前端:vue
开发工具:webstorm/vscode
数据库:mysql 5.7

文档:

部分截图说明:

部分代码:

// 分页接口(后端)
	api.get('/page', async (req, res) => {

		try {

			let page = parseInt(req.query.page) || 1
			let limit = parseInt(req.query.limit) || 10
			let sort = req.query.sort || 'id'
			let order = req.query.order || 'asc'

			let where = {}
			let refid = req.query.refid
			if (refid) {

				if (refid.indexOf('%') != -1) {
					where.refid = {
						[Op.like]: refid
					}
				} else {
					where.refid = {
						[Op.eq]: refid
					}
				}
			}
			let userid = req.query.userid
			if (userid) {

				if (userid.indexOf('%') != -1) {
					where.userid = {
						[Op.like]: userid
					}
				} else {
					where.userid = {
						[Op.eq]: userid
					}
				}
			}
			let avatarurl = req.query.avatarurl
			if (avatarurl) {

				if (avatarurl.indexOf('%') != -1) {
					where.avatarurl = {
						[Op.like]: avatarurl
					}
				} else {
					where.avatarurl = {
						[Op.eq]: avatarurl
					}
				}
			}
			let nickname = req.query.nickname
			if (nickname) {

				if (nickname.indexOf('%') != -1) {
					where.nickname = {
						[Op.like]: nickname
					}
				} else {
					where.nickname = {
						[Op.eq]: nickname
					}
				}
			}
			let content = req.query.content
			if (content) {

				if (content.indexOf('%') != -1) {
					where.content = {
						[Op.like]: content
					}
				} else {
					where.content = {
						[Op.eq]: content
					}
				}
			}
			let reply = req.query.reply
			if (reply) {

				if (reply.indexOf('%') != -1) {
					where.reply = {
						[Op.like]: reply
					}
				} else {
					where.reply = {
						[Op.eq]: reply
					}
				}
			}
            if (jwt.decode(req.headers.token).role != '管理员' && DiscusssheyingzuopinModel.rawAttributes.hasOwnProperty('userid')) {
				where.userid = {
					[Op.eq]: req.session.userinfo === undefined ? jwt.decode(req.headers.token).id : req.session.userinfo.id
				}
            }

			let result = await DiscusssheyingzuopinModel.findAndCountAll({
				order: [[sort, order]],
				where,
				offset: (page - 1) * limit,
				limit
			})
			
			result.currPage = page
			result.pageSize = limit

			toRes.page(res, 0, result)
		} catch(err) {

			toRes.session(res, 500, '服务器错误!', '', 500)
		}
	})

    // 分页接口(前端)
	api.get('/list', async (req, res) => {

		try {

			let page = parseInt(req.query.page) || 1
			let limit = parseInt(req.query.limit) || 10
			let sort = req.query.sort || 'id'
			let order = req.query.order || 'asc'

			let where = {}
			let refid = req.query.refid
			if (refid) {
				where.refid = {
					[Op.eq]: refid
				}
			}
			let nickname = req.query.nickname
			if (nickname) {

				if (nickname.indexOf('%') != -1) {
					where.nickname = {
						[Op.like]: nickname
					}
				} else {
					where.nickname = {
						[Op.eq]: nickname
					}
				}
			}
			let content = req.query.content
			if (content) {

				if (content.indexOf('%') != -1) {
					where.content = {
						[Op.like]: content
					}
				} else {
					where.content = {
						[Op.eq]: content
					}
				}
			}


			let result = await DiscusssheyingzuopinModel.findAndCountAll({
				order: [[sort, order]],
				where,
				offset: (page - 1) * limit,
				limit
			})
			
			result.currPage = page
			result.pageSize = limit

			toRes.page(res, 0, result)
		} catch(err) {
			toRes.session(res, 401, err.message, '', 200)
		}
	})


	// 保存接口(后端)
	api.post('/save', async (req, res) => {

		try {

			Object.keys(req.body).forEach(item=>{
				if(req.body[item] == '')  delete req.body[item]
			})

			if (!req.body.userid) {
				req.body.userid = req.session.userinfo === undefined ? jwt.decode(req.headers.token).id : req.session.userinfo.id
			}


			const userinfo = await DiscusssheyingzuopinModel.create(req.body)

			if (userinfo === null) {

				toRes.session(res, -1, '添加失败!')
			} else {

				toRes.session(res, 0, '添加成功!')
			}
		} catch(err) {
			
			toRes.session(res, 500, '服务器错误!', '', 500)
		}
	})

    // 保存接口(前端)
	api.post('/add', async (req, res) => {

		try {

			Object.keys(req.body).forEach(item=>{
				if(req.body[item] == '')  delete req.body[item]
			})

			if (jwt.decode(req.headers.token) == null) {
				toRes.session(res, 401, '请登录后再操作', '', 401)
			}

			req.body.userid = req.session.userinfo === undefined ? jwt.decode(req.headers.token).id : req.session.userinfo.id


			const userinfo = await DiscusssheyingzuopinModel.create(req.body)

			if (userinfo === null) {

				toRes.session(res, -1, '添加失败!')
			} else {

				toRes.session(res, 0, '添加成功!')
			}
		} catch(err) {
			
			toRes.session(res, 500, '服务器错误!', '', 500)
		}
	})

以上就是部分功能展示,从整体上来看,本系统功能是十分完整的,界面设计简洁大方,交互友好,数据库设计也很合理,规模适中,代码工整,清晰,适合学习使用。

好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,下期见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫头鹰源码(同名B站)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值