| 成员名单 | 学号 |
|---|---|
| 周旭 | 2019111446 |
| 李志伟 | 2019110574 |
| 蒋壮壮 | 2019110596 |
| 杨瀚君 | 2019110094 |
- “线上食堂”项目报告
- 一:项目背景(需求分析)
- 二:底层逻辑
- 1.前台(用户操作逻辑):
- 2.数据逻辑(数据库设计):
- 三:工作流程
- 四:具体分工
- 五:窗体代码的注释
- 1.用户登录注册以及企业入口的窗体(李志伟)
- Module1.vb
- 登录界面.vb
- 注册窗口.vb
- 用户中心.vb
- 修改菜品.vb
- 新添菜品.vb
- 2.菜品列表与菜品详情的窗体(杨瀚君)
- 菜品查询.vb
- 菜品详情.vb
- 3.查看评价或增加评论的窗体(蒋壮壮)
- 查看评论.vb
- 增加评论.vb
- 4.共餐社区的窗体(周旭)
- 共餐社区.vb
- 修改帖子.vb
- 发布新的帖子.vb
- 留言.vb
- 六:遇到的部分问题以及解决办法
- 七:客观评价与总结
- 1.平行分工的利弊
- 2.部分未解决的设计漏洞
- 3.总结
食堂作为每一所大学的基础设施,承担着全校师生的饮食重任.然而,在校园网络化的进程中,食堂系统却并未与时俱进,依然保持着最原始的独立形态,设计一个信息公开化、查询便捷化、交互人性化的食堂系统显得尤为重要.
我们将亟需改革的痛点总结如下:
- 获取信息成本较高,缺乏高效线上浏览食堂信息的程序;
- 消费者面临信息不对称,缺乏系统评价食堂的论坛或程序;
- 作为公共场所,食堂所承担的社交属性有待开发;
- 信息流通程度不足,信息利用率底下,食堂无法获取用户诉求.
针对这些痛点,我们希望最终的项目能够基本完成以下功能:
- 能够在线上浏览食堂每一个菜品的详细信息;
- 能够在线上对菜品进行评价并浏览别人的评价;
- 提供线上约餐功能,提高学校脱单率;
- 让食堂可以获取用户反馈的数据.
就此,我们确立了小组项目的目标,建立一个线上食堂信息系统,即“线上食堂”项目.
二:底层逻辑 1.前台(用户操作逻辑):我们将用户设定为普通用户“学生”和企业用户“食堂”两类.
信息源为以下三类:
- 学生身份信息、食堂身份信息;
- 菜品信息;
- 交互信息:学生对菜品的评价、学生对学生的留言等.
就此我们大致确立了完整的用户操作逻辑如下:
其所对应的大致窗体分布为:
根据信息来源需要,我们确立了三大实体、三大联系如下:
- 实体1.用户(账号,密码,用户名,头像,性别,学号)
- 实体2.菜品(菜品代码,菜名,价格,折扣,窗口,原料,图片,菜品种类,累计点击量)
- 实体3.食堂(食堂代码,食堂名称,管理员密匙)
- 联系1.评论(账号,菜品代码,评论时间,评分,文字评论,图片,关键词)
- 联系2.共餐(账号,食堂代码,共餐时间,共餐时长,留言,菜品,备注)
- 联系3.点赞(账号,菜品代码,是否点赞)
对应的ER图如下:
对ER图的若干解释:
- 联系“共餐”代表的实际含义是“某一个用户发布一个共餐帖子,标明想在某一时间的某一食堂与其他人共餐”,因此,“一个人,一个地点、一个时间点”三要素能确立一个元组,共同作为该属性的主键.我们本来想将“共餐”设置为“两个用户在某一时间点共餐”,但涉及用户表的自连接,过于复杂,故舍弃这样的数据确定方式;
- 联系“评论”代表的含义是“某一个用户针对某一个菜品在某一时间点发布评论”,因此,“一个主体,一个对象,一个时间点”三要素能确立一个元组,共同作为该属性的主键;
- 联系“点赞”代表的含义是“某一个用户对某一个菜品点赞”,因此“用户”和“菜品”两要素可以确定一个元组,且“点赞”这一属性的值域为(是,否);
- 以上联系均满足第三范式或BC范式.
建表部分SQL代码如下:
create database meal1
go
use meal1
create table 用户(
账号 char(20) check(len(账号)>=6 and len(账号)<=20) primary key,
密码 char(15) check(len(密码)>=6 and len(密码)<=15),
用户名 char(20) check(len(用户名)>=5 and len(用户名)<=20),
头像 image,
性别 char(2) check(性别 in ('男','女')),
学号 char(10) check(isnumeric(学号)=1)
)
use meal1
create table 菜品(
菜品代码 char(4) check(菜品代码 like'c[0-9][0-9][0-9]') primary key,
菜名 char(10),
价格 money,
折扣 int,
窗口 int,
菜品种类 char(4),
图片 image,
原料 char(20),
食堂代码 char(5) foreign key references.食堂
)
use meal1
create table 评论(
账号 char(20) foreign key references.用户,
评论时间 date,
菜品代码 char(4) foreign key references.菜品,
评分 int check(评分>=0 and 评分<=5),
文字评论 char(50) check(len(文字评论)>=5 and len(文字评论)<=50),
评论图片 image,
primary key(账号,评论时间,菜品代码)
)
use meal1
create table 食堂(
食堂代码 char(5) primary key,
食堂名称 char(10),
管理员密匙 char(20)
)
use meal1
create table 共餐(
账号 char(20) foreign key references.用户,
食堂代码 char(5) foreign key references.食堂,
共餐时间 datetime,
共餐时长 char(5),
留言 char(50),
菜品代码 char(4) foreign key references.菜品,
备注 char(20),
primary key(账号,共餐时间,食堂代码)
)
use meal1
create table 点赞(
账号 char(20) foreign key references.用户,
菜品代码 char(4) foreign key references.菜品,
是否点赞 char(2) check(是否点赞 in ('是','否'))
)
三:工作流程
四:具体分工
- 李志伟:用户基本信息系统和食堂基本信息系统的构建
- 杨瀚君:菜品信息浏览功能的开发
- 蒋壮壮:评论功能的开发
- 周旭:共餐社区的设计开发
涉及到的全局变量
Imports System.Data.SqlClient
Module Module1
Public _account As String
Public _password As String
Public yonghuming As String
Public xuehao As String
Public shitang As String
Public myconn As New SqlConnection("database=meal0;data source=.;integrated security=true;")
End Module
定义全局变量包括用户名,用户密码,学号等信息,并定义myconn对象,便于在用户企业登录模块直接连接。
登录界面.vbImports System.Data.SqlClient
Public Class 登录界面
Dim mydataset As New DataSet
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim myselectquery As String = "select * from 用户 where 账号='" & TextBox1.Text & "'and 密码='" & TextBox2.Text & "'"
Dim mycommand As New SqlCommand(myselectquery, myconn)
myconn.Open()
Dim myreader As SqlDataReader
myreader = mycommand.ExecuteReader()
If myreader.HasRows = False Then
MsgBox("账号或密码错误!!")
TextBox1.Text = ""
TextBox2.Text = ""
Else
myreader.Read()
_account = Me.TextBox1.Text.ToString
_password = Me.TextBox2.Text.ToString
内容界面.Show()
Me.Hide()
End If
myreader.Close()
myconn.Close()
End Sub
End Class
用户登录的代码,思路与企业登录一致,连接数据库meal0,定义SQL查询语句,查询所输入的学号密码,若在数据库中存在一行该值,则说明账号密码正确,则登陆成功,否则账号或密码错误,重新输入。
注册窗口.vbImports System.Data.SqlClient
Imports System.IO
Public Class 注册窗口
Dim mydataset As New DataSet
Dim mysql As String = "select * from 用户"
Dim myadapter As SqlDataAdapter = New SqlDataAdapter(mysql, myconn)
Dim photoStream As IO.FileStream
Dim fileByte() As Byte
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If File.Exists("D:pic1.jpg") Then
Kill("D:pic1.jpg")
End If
Dim s As String
s = "D:pic1.jpg"
PictureBox1.Image.Save(s)
myadapter.Fill(mydataset, "user")
Dim user_row As DataRow = mydataset.Tables("user").NewRow
user_row(0) = Me.TextBox1.Text.ToString
user_row(1) = Me.TextBox2.Text.ToString
user_row(2) = Me.TextBox3.Text.ToString
yonghuming = TextBox3.Text
user_row(5) = Me.TextBox5.Text.ToString
xuehao = TextBox5.Text
Dim gender As String
gender = ""
If (RadioButton1.Checked) Then
gender = "男"
End If
If (RadioButton2.Checked) Then
gender = "女"
End If
user_row(4) = gender
photoStream = New FileStream("D:" & "pic1" & ".jpg", FileMode.Open)
ReDim fileByte(photoStream.Length - 1)
photoStream.Read(fileByte, 0, photoStream.Length)
user_row(3) = fileByte
mydataset.Tables("user").Rows.Add(user_row)
Dim cm As SqlCommandBuilder = New SqlCommandBuilder(myadapter)
myadapter.Update(mydataset, "user")
MsgBox("注册成功")
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
If OpenFileDialog1.ShowDialog <> Windows.Forms.DialogResult.Cancel Then
PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
End If
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
登录界面.Show()
Me.Close()
End Sub
End Class
- 用户注册的主要过程,包括用户名,密码等基本文字信息,以及头像的处理过程,其中用户名,密码,账号,学号,通过新建dataset.tables(“users”).newrow 新建立一行,并将textbox的字符串传入newrow中,其中图片的处理较为困难,首先通过openfiledialog1打开文件选择图片,填充到picturebox中,并保存图片至D盘目录下,通过photostream读取图片,转换成byte类型,放在newrow中的图片一列(即数据库中的image类型一列),最后通过update传入数据,更新数据库,即完成注册。
- 关于图片的现实操作,通过openfiledialog1打开文件并选择图片后,图片被显示在picturebox中,通过picturebox.sizemode设置为zoom保持图片大小根据picturebox大小进行变化。
Imports System.Data.SqlClient
Imports System.IO
Public Class 用户中心
Dim mydataset As New DataSet
Dim filebyte() As Byte
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Me.Close()
内容界面.Show()
End Sub
Private Sub 用户中心_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TextBox1.Text = _account
Dim mysql As String = "select 用户.用户名,学号,头像 from 用户 where 账号='" & _account & "'"
Dim myadapter As New SqlDataAdapter(mysql, myconn)
myadapter.Fill(mydataset, "用户信息")
TextBox2.Text = mydataset.Tables("用户信息").Rows(0).Item(0).ToString
TextBox3.Text = mydataset.Tables("用户信息").Rows(0).Item(1).ToString
filebyte = mydataset.Tables("用户信息").Rows(0).Item(2)
PictureBox1.Image = Image.FromStream(New MemoryStream(filebyte))
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
End Sub
End Class
主要目的为显示用户个人信息,因此思路与注册登录基本一致,建立mysql查询语句,通过建立与sqlsever连接,查询所登录账号的一列用户信息,继而通过vb中定义的mydataset的tables进行数据选择显示。关于图片的显示,同样读取image类型,将byte类型通过memorystream读取,放入picturebox中,可直接显示头像。
Imports System.Data.SqlClient
Imports System.IO
Public Class 修改菜品
Dim mydataset As New DataSet
Dim mysql As String = "select * from 菜品 where 食堂名称='" & shitang & "'"
Dim ada = New SqlDataAdapter(mysql, myconn)
Dim photostream As IO.FileStream
Dim data() As Byte
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
企业窗口.Show()
Me.Close()
End Sub
Private Sub 修改菜品_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'TODO: 这行代码将数据加载到表“Meal2DataSet.菜品”中。您可以根据需要移动或删除它。
ada.Fill(mydataset, "S")
Dim primarykey(0) As DataColumn
primarykey(0) = mydataset.Tables("S").Columns("菜品代码")
mydataset.Tables("S").PrimaryKey = primarykey
ComboBox1.DisplayMember = "菜品代码"
ComboBox1.DataSource = mydataset.Tables("S")
TextBox4.DataBindings.Add("Text", mydataset.Tables("S"), "菜名")
TextBox1.DataBindings.Add("Text", mydataset.Tables("S"), "价格")
TextBox2.DataBindings.Add("Text", mydataset.Tables("S"), "窗口")
TextBox3.DataBindings.Add("Text", mydataset.Tables("S"), "折扣")
myconn.Close()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim mysql As String = "update 菜品 set 价格=" & TextBox1.Text & ",折扣=" & TextBox3.Text & ",窗口=" & TextBox2.Text & "where 菜品代码='" & ComboBox1.Text.ToString & " '"
Dim mycmd As New SqlClient.SqlCommand(mysql, myconn)
Try
mycmd.ExecuteNonQuery()
Catch ex As Exception
MsgBox(ex.Message)
End Try
MsgBox("修改成功!!")
myconn.Close()
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
新添菜品.Show()
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
If mydataset.Tables("S").Rows.Find(ComboBox1.Text).Item(6).GetType() Is GetType(DBNull) Then
Exit Sub
Else
data = mydataset.Tables("S").Rows.Find(ComboBox1.Text).Item(6)
PictureBox1.Image = Image.FromStream(New MemoryStream(data))
End If
End Sub
End Class
- 关于菜品查询以及修改的问题,以及combox的用法问题,此窗口因为是来自于企业登录后的窗口,因此设计为登录某个食堂就显示该食堂的菜品(如,登录新食堂,此处的combox只显示新食堂所拥有的菜品,下文以新食堂举例),因此关于combox的datasource与displaymember就变得很难选择,因为是通过SQL语句现在数据中查询新食堂的菜品信息,需要新建立dataset获取查询后的菜品信息,并设置dataset.table中的主键,通过textbox的databindings功能实现当选择combox中另一个菜品时,textbox内容也会随之改变,而对于picturebox中的图片,选择在combox.selectedindexchange中放入一段代码,即data(byte类型)获取dataset.table中的image类型数据(即图片),然后再读入picturebox中。
- 关于菜品的修改问题,定义button2,点击后,使用SQLSERVER的update语句直接更新,直接更新textbox中修改后的信息。
Imports System.Data.SqlClient
Imports System.IO
Public Class 新添菜品
Dim mydataset As New DataSet
Dim mysql As String = "select * from 菜品"
Dim myadapter As SqlDataAdapter = New SqlDataAdapter(mysql, myconn)
Dim photoStream As IO.FileStream
Dim fileByte() As Byte
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
If OpenFileDialog1.ShowDialog <> Windows.Forms.DialogResult.Cancel Then
PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If File.Exists("D:pic1.jpg") Then
Kill("D:pic1.jpg")
End If
Dim s As String
s = "D:pic1.jpg"
PictureBox1.Image.Save(s)
myadapter.Fill(mydataset, "caipin")
Dim user_row As DataRow = mydataset.Tables("caipin").NewRow
user_row(0) = Me.TextBox1.Text.ToString
user_row(1) = Me.TextBox2.Text.ToString
user_row(2) = Me.TextBox3.Text
user_row(3) = Me.TextBox4.Text
user_row(4) = Me.TextBox5.Text
user_row(5) = Me.TextBox6.Text.ToString
photoStream = New FileStream("D:" & "pic1" & ".jpg", FileMode.Open)
ReDim fileByte(photoStream.Length - 1)
photoStream.Read(fileByte, 0, photoStream.Length)
user_row(6) = fileByte
user_row(7) = TextBox7.Text.ToString
user_row(8) = TextBox8.Text.ToString
mydataset.Tables("caipin").Rows.Add(user_row)
Dim cm As SqlCommandBuilder = New SqlCommandBuilder(myadapter)
myadapter.Update(mydataset, "caipin")
myconn.Close()
MsgBox("添加成功!!")
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Me.Close()
End Sub
End Class
此过程与用户注册过程一致,因此不做详细解释。
呈现指定食堂的所有菜品,可根据用户的选择进行筛选和排序操作.
mports System.Data.SqlClient
Public Class 菜品查询
Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs)
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.Enter
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
菜品详情.Show()
End Sub
'打开菜品详情窗口
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 菜品,食堂 where
食堂.食堂代码=菜品.食堂代码
and 食堂名称 ='" & ComboBox1.Text & "' and 菜品种类 ='" & ComboBox3.Text & "'"
'从数据库中查询特定食堂名称和菜品种类的菜品列表
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
DataGridView1.DataSource = mydataset.Tables("take_list")
'将菜品列表显示在datagrid框里面
End Sub
Private Sub ComboBox3_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox3.Enter
End Sub
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 菜品,食堂 where
食堂.食堂代码=菜品.食堂代码
and 食堂名称 ='" & ComboBox1.Text & "' and 菜品种类 ='" & ComboBox3.Text & "'
order by 菜品.折扣 desc" '将菜品列表以折扣降序排列
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
DataGridView1.DataSource = mydataset.Tables("take_list")
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 菜品,食堂 where
食堂.食堂代码=菜品.食堂代码
and 食堂名称 ='" & ComboBox1.Text & "' and 菜品种类 ='" & ComboBox3.Text & "'
order by 菜品.价格 desc"'将菜品列表以价格降序排列
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
DataGridView1.DataSource = mydataset.Tables("take_list")
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs)
End Sub
Private Sub 菜品查询_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ComboBox1.Items.Add("新食堂")
ComboBox1.Items.Add("绿叶食堂")
ComboBox1.Items.Add("清真食堂")
ComboBox1.Items.Add("新园食堂")
ComboBox3.Items.Add("川菜")
ComboBox3.Items.Add("粤菜")
ComboBox3.Items.Add("江浙")
ComboBox3.Items.Add("鲁菜")
ComboBox3.Items.Add("西北")
End Sub
Private Sub ComboBox1_SelectedIndexChanged_1(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
End Sub
End Class
菜品详情.vb
查看所选行(菜品)的详细信息
Imports System.Data.SqlClient
Imports WindowsApp2
Imports System.IO
Public Class 菜品详情
Dim f4 As New Form1
Dim photostream As IO.FileStream
Dim data() As Byte
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs)
End Sub
Private Sub TextBox5_TextChanged(sender As Object, e As EventArgs) Handles TextBox5.TextChanged
dishcode = TextBox5.Text '记录菜品序号
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 菜品
where 菜品代码='" & TextBox5.Text & " '" '查询菜品序号为dishcode的菜品
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
Dim primarykey(0) As DataColumn
primarykey(0) = mydataset.Tables("take_list").Columns("菜品代码")
mydataset.Tables("take_list").PrimaryKey = primarykey
DataGridView1.DataSource = mydataset.Tables("take_list")
data = mydataset.Tables("take_list").Rows.Find(TextBox5.Text).Item(6) '获取菜品图片单元格二进制代码
PictureBox1.Image = Image.FromStream(New MemoryStream(data)) '将二进制代码转换为图片放在picturebox中
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom '将picture大小自动调整为适应照片尺寸
End Sub
Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
End Sub
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
f4.Show() '显示查看评论窗口
End Sub
Private Sub 菜品详情_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
End Class
照片无法直接导入sql数据库,并且无法从vb中直接匹配图片
解决方法:将照片放在特定debug中的picture文件夹,通过vb将照片转换为二进制代码储存在sql数据库中,再通过vb将二进制转化为图片显示在界面上。
呈现指定菜品的相关评论,可根据用户的选择进行筛选和排序操作.
这里仅仅演示对一种菜品(c001)的评论的操作.
Imports System.Data.SqlClient
Public Class Form1
Dim f2 As New Form2
Private Sub 查看评论_Click(sender As Object, e As EventArgs) Handles 查看评论.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 评论
"
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
DataGridView1.DataSource = mydataset.Tables("take_list")
End Sub
//通过gridview查看评论
Private Sub 按时间排序_Click(sender As Object, e As EventArgs) Handles 按时间排序.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 评论
order by datediff(day,'2021-05-25',评论时间)
"
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
DataGridView1.DataSource = mydataset.Tables("take_list")
End Sub
//按照评论时间进行正序排列顺序
Private Sub 按评分正序_Click(sender As Object, e As EventArgs) Handles 按评分正序.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 评论
order by 评分 desc
"
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
DataGridView1.DataSource = mydataset.Tables("take_list")
End Sub
//按评分正序评论
Private Sub 按评分倒序_Click(sender As Object, e As EventArgs) Handles 按评分倒序.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 评论
order by -评分 desc
"
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
DataGridView1.DataSource = mydataset.Tables("take_list")
End Sub
//按评分倒序排列
Private Sub 按点赞数排序_Click(sender As Object, e As EventArgs) Handles 按点赞数排序.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 评论
order by 点赞数 desc
"
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "take_list")
DataGridView1.DataSource = mydataset.Tables("take_list")
End Sub
//按点赞数排序
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim zi%, zs$
For zi = 0 To DataGridView1.ColumnCount - 1
zs = DataGridView1.CurrentRow.Cells(zi).Value
ListBox1.Items.Add(zs)
Next
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
DataGridView1.CurrentRow.Cells(5).Value = DataGridView1.CurrentRow.Cells(5).Value + 1
MsgBox("点赞成功")
End Sub
//点赞功能
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
DataGridView1.CurrentRow.Cells(6).Value = DataGridView1.CurrentRow.Cells(6).Value + 1
End Sub
//举报功能
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
f2.ShowDialog()
End Sub
Private Sub MenuStrip1_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles MenuStrip1.ItemClicked
End Sub
/
Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
End Sub
End Class
增加评论.vb
为指定菜品增加评论.
这里仅仅演示当前登陆用户对一种菜品(c001)的评论的操作.
Imports System.Data.SqlClient
Public Class Form2
Dim T3 As Integer
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim myconn As New SqlConnection("DataBase=meal0;Data Source=.;Integrated Security=True;")
Dim mystrl As String = "Select * from 评论
"
Dim myadapter As New SqlDataAdapter(mystrl, myconn)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "scl")
Dim 评论_row As DataRow = mydataset.Tables("scl").NewRow
If Val(TextBox3.Text) = 0 Then
T3 = 0
Else
T3 = Val(TextBox3.Text)
End If
评论_row(0) = Me.TextBox1.Text.ToString
评论_row(1) = Now()
评论_row(2) = Me.TextBox2.Text.ToString
评论_row(3) = T3
评论_row(4) = Me.TextBox4.Text.ToString
评论_row(5) = 0
评论_row(6) = 0
mydataset.Tables("scl").Rows.Add(评论_row)
Dim cm As SqlCommandBuilder = New SqlCommandBuilder(myadapter)
myadapter.Update(mydataset, "scl")
MsgBox("反馈成功")
Close()
End Sub
//添加评论
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
End Class
点赞和举报功能的实现:通过设计使点赞和评论成为了表的一部分,然后使用currentrow控件实现对选定行的点赞和举报.
呈现所有用户发布的所有共餐帖子,可根据用户的选择进行筛选操作.
Imports System.Data.SqlClient
Public Class 共餐社区
Dim cb1 As String '食堂代码
Dim cb2 As String '性别
Dim cb3 As String '菜品种类
Dim cb4 As String '小时
Dim cb5 As Date '日期
Dim cb6 As Integer '时长开头
Dim cb7 As Integer '时长结尾
’设置公共变量
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ComboBox1.Items.Clear()
ComboBox1.Items.Add("所有食堂")
ComboBox1.Items.Add("清真食堂")
ComboBox1.Items.Add("新食堂")
ComboBox1.Items.Add("新园食堂")
ComboBox1.Items.Add("绿叶食堂")
ComboBox1.Text = ComboBox1.Items(0)
ComboBox2.Items.Clear()
ComboBox2.Items.Add("不限性别")
ComboBox2.Items.Add("只看男生")
ComboBox2.Items.Add("只看女生")
ComboBox2.Text = ComboBox2.Items(0)
ComboBox3.Items.Clear()
ComboBox3.Items.Add("所有菜系")
ComboBox3.Items.Add("鲁菜")
ComboBox3.Items.Add("江浙菜")
ComboBox3.Items.Add("西北菜")
ComboBox3.Items.Add("川菜")
ComboBox3.Items.Add("粤菜")
ComboBox3.Text = ComboBox3.Items(0)
ComboBox4.Items.Clear()
ComboBox4.Items.Add("大致时间")
ComboBox4.Items.Add("11:00")
ComboBox4.Items.Add("12:00")
ComboBox4.Items.Add("13:00")
ComboBox4.Items.Add("17:00")
ComboBox4.Items.Add("18:00")
ComboBox4.Items.Add("20:00")
ComboBox4.Items.Add("21:00")
ComboBox4.Text = ComboBox4.Items(0)
TextBox1.Text = 0
TextBox2.Text = 120
’combobox和textbox是筛选帖子的信息入口,此处设置率选的选项
Dim zconn As New SqlConnection("Initial Catalog=meal1;Data Source=.;User ID=sa;Password=1961615926;")
Dim zsqlstr1$
zsqlstr1 = "select * from 共餐"
Dim zadp As New SqlDataAdapter(zsqlstr1, zconn)
Dim zdataset As New DataSet
zdataset.Reset()
zadp.Fill(zdataset, "共餐")
DataGridView1.DataSource = zdataset.Tables("共餐")
’连接数据库,在DataGridView中展示“共餐”表的所有信息
DataGridView1.AutoGenerateColumns = True
DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter
’为保证可对DataGridView的信息直接进行修改,需要预设其可访问性
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim zi%, zs$
ListBox1.Items.Clear()
For zi = 0 To DataGridView1.ColumnCount - 1
zs = DataGridView1.CurrentRow.Cells(zi).Value
ListBox1.Items.Add(zs)
Next
End Sub
’为浏览数据更方便,将选中行的数据逐行展示在ListBox中
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Form2.Show()
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
留言.Show()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
修改帖子.Show()
End Sub
’进入留言窗口,对选中行的帖子进行留言
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
Call Form1_Load(Nothing, Nothing)
End Sub
’刷新窗体,清空选项,重新加载
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
If ComboBox1.Text = ComboBox1.Items(0) Then
cb1 = "*"
ElseIf ComboBox1.Text = ComboBox1.Items(1) Then
cb1 = "sh001"
ElseIf ComboBox1.Text = ComboBox1.Items(2) Then
cb1 = "sh004"
ElseIf ComboBox1.Text = ComboBox1.Items(3) Then
cb1 = "sh003"
ElseIf ComboBox1.Text = ComboBox1.Items(4) Then
cb1 = "sh002"
End If
If ComboBox2.Text = ComboBox2.Items(0) Then
cb2 = "*"
ElseIf ComboBox2.Text = ComboBox2.Items(1) Then
cb2 = "男"
ElseIf ComboBox2.Text = ComboBox2.Items(2) Then
cb2 = "女"
End If
If ComboBox3.Text = ComboBox3.Items(0) Then
cb3 = "*"
Else : cb3 = ComboBox3.Text
End If
If ComboBox4.Text = ComboBox4.Items(0) Then
cb4 = "*"
Else : cb4 = Microsoft.VisualBasic.Left(ComboBox4.Text, 2)
End If
cb5 = DateTimePicker1.Value.ToString("yyyy-MM-dd")
cb6 = TextBox1.Text '时长开头
cb7 = TextBox2.Text '时长结尾
’设置筛选项对应触发的结果,为sql查询做准备
Dim zsqlstr2 As String
zsqlstr2 = "select distinct 共餐.账号,共餐.食堂代码,共餐.共餐时间 ,共餐.共餐时长,共餐.留言,共餐.菜品代码,共餐.备注 from 共餐,菜品,用户 " _
& "where 共餐.食堂代码='" & cb1 & "'" _
& "and 用户.性别 in (select 用户.性别 from 用户 inner join 共餐 on 用户.账号=共餐.账号 where 用户.性别='" & cb2 & "') " _
& "and 菜品.菜品种类 in(select 菜品.菜品种类 from 菜品 inner join 共餐 on 菜品.菜品代码=共餐.菜品代码 where 菜品.菜品种类='" & cb3 & "') " _
& "and DATEPART(hh,共餐时间)-" & cb4 & "<1 and DATEPART(hh,共餐时间)-" & cb4 & ">-1 " _
& "and CONVERT(varchar(100),共餐.共餐时间, 23)='" & cb5 & "'" _
& "and 共餐时长>=" & cb6 & " and 共餐时长<=" & cb7
’sql查询:根据用户设定的要求筛选符合要求的帖子
Dim zconn As New SqlConnection("Initial Catalog=meal1;Data Source=.;User ID=sa;Password=1961615926;")
Dim zadp2 As New SqlDataAdapter(zsqlstr2, zconn)
Dim zdataset As New DataSet
zdataset.Reset()
zadp2.Fill(zdataset, "共餐")
DataGridView1.DataSource = zdataset.Tables("共餐")
’将查询结果展示在DataGridView中
End Sub
End Class
修改帖子.vb
对已选定的行(帖子)进行修改或删除操作
Imports System.Data.SqlClient
Public Class 修改帖子
Private Sub Form4_Load(sender As Object, e As EventArgs) Handles Me.Load
TextBox1.Text = 共餐社区.DataGridView1.CurrentRow.Cells(0).Value '用户名不可修改
TextBox2.Text = 共餐社区.DataGridView1.CurrentRow.Cells(1).Value '食堂代码不可修改
TextBox3.Text = 共餐社区.DataGridView1.CurrentRow.Cells(2).Value '共餐时间不可修改
TextBox4.Text = 共餐社区.DataGridView1.CurrentRow.Cells(3).Value '共餐时长
TextBox5.Text = 共餐社区.DataGridView1.CurrentRow.Cells(5).Value '菜品代码
TextBox6.Text = 共餐社区.DataGridView1.CurrentRow.Cells(6).Value '备注
TextBox1.Enabled = False
TextBox2.Enabled = False
TextBox3.Enabled = False
End Sub
’在修改框中显示选中行原有信息
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'此处需要验证是否为本用户
Dim i%, strsql$
i = MsgBox("确认修改?")
If i = vbOK Then
Dim strrow0 As String = 共餐社区.DataGridView1.CurrentRow.Cells(0).Value.ToString
Dim strrow1 As String = 共餐社区.DataGridView1.CurrentRow.Cells(1).Value.ToString
Dim strrow2 As String = 共餐社区.DataGridView1.CurrentRow.Cells(2).Value.ToString
strsql = "Update 共餐 set 共餐时长='" & TextBox4.Text & "',菜品代码='" & TextBox5.Text & "',备注='" & TextBox6.Text & "' where 账号 = '" + strrow0 + "'and 食堂代码='" + strrow1 + "'and 共餐时间='" + strrow2 + "'"
’根据前三个确定的属性确定帖子,对其进行update
Dim zconn As New SqlClient.SqlConnection("Initial Catalog=meal1;Data Source=.;User ID=sa;Password=1961615926;")
Dim zcomm As New SqlClient.SqlCommand(strsql, zconn)
zconn.Open()
zcomm.ExecuteNonQuery()
MsgBox("修改成功")
zconn.Close()
End If
Me.Hide()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim i%, strsql$
i = MsgBox("确认删除?")
If i = vbOK Then
Dim strrow0 As String = 共餐社区.DataGridView1.CurrentRow.Cells(0).Value.ToString
Dim strrow1 As String = 共餐社区.DataGridView1.CurrentRow.Cells(1).Value.ToString
Dim strrow2 As String = 共餐社区.DataGridView1.CurrentRow.Cells(2).Value.ToString
strsql = "delete * from 共餐 where 账号 = '" + strrow0 + "'and 食堂代码='" + strrow1 + "'and 共餐时间='" + strrow2 + "'"
’根据前三个确定的属性确定帖子,对其进行delete
Dim zconn As New SqlClient.SqlConnection("Initial Catalog=meal1;Data Source=.;User ID=sa;Password=1961615926;")
Dim zcomm As New SqlClient.SqlCommand(strsql, zconn)
zconn.Open()
zcomm.ExecuteNonQuery()
MsgBox("删除成功")
zconn.Close()
End If
Me.Hide()
End Sub
End Class
发布新的帖子.vb
指定用户发布新的共餐帖子
Imports System.Data.SqlClient
Public Class Form2
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load
TextBox3.Text = Format(Now, "yyyy-mm-dd")
TextBox4.Text = "例子 12:30"
TextBox5.Text = "例子 60"
End Sub
Private Sub TextBox3_Click(sender As Object, e As EventArgs) Handles TextBox3.Click
TextBox3.Text = ""
End Sub
Private Sub TextBox4_Click(sender As Object, e As EventArgs) Handles TextBox4.Click
TextBox4.Text = ""
End Sub
Private Sub TextBox5_Click(sender As Object, e As EventArgs) Handles TextBox5.Click
TextBox5.Text = ""
End Sub
’预设输入框内原有字符作为输入格式参照
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim zconn As New SqlConnection("Initial Catalog=meal1;Data Source=.;User ID=sa;Password=1961615926;")
Dim zsqlstr1 As String = "select * from 共餐"
Dim zadp As New SqlDataAdapter(zsqlstr1, zconn)
Dim zdataset As New DataSet
zdataset.Reset()
zadp.Fill(zdataset, "共餐1")
Dim 共餐_row As DataRow = zdataset.Tables("共餐1").NewRow
Dim ztimestr As String = TextBox3.Text & " " & TextBox4.Text & ":00"
Dim ztime As Date = CDate(ztimestr)
共餐_row(0) = Me.TextBox1.Text.ToString '账号
共餐_row(1) = Me.TextBox2.Text.ToString '食堂
共餐_row(2) = ztime '日期&时间
共餐_row(3) = Me.TextBox5.Text.ToString '时长
共餐_row(4) = "" '留言
共餐_row(5) = Me.TextBox6.Text.ToString '菜品
共餐_row(6) = Me.TextBox7.Text.ToString '备注
zdataset.Tables("共餐1").Rows.Add(共餐_row)
Dim zm As SqlCommandBuilder = New SqlCommandBuilder(zadp)
zadp.Update(zdataset, "共餐1")
Me.Hide()
End Sub
End Class
'更新共餐表
留言.vb
对选中行(帖子)进行留言操作
Public Class 留言
Private Sub Form3_Load(sender As Object, e As EventArgs) Handles Me.Load
Label3.Text = 共餐社区.DataGridView1.CurrentRow.Cells(4).Value
TextBox1.Text = 共餐社区.DataGridView1.CurrentRow.Cells(4).Value
End Sub
'显示选中行原有的留言作为参照
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim zconn As New SqlClient.SqlConnection("Initial Catalog=meal1;Data Source=.;User ID=sa;Password=1961615926;")
Dim strrow0 As String = 共餐社区.DataGridView1.CurrentRow.Cells(0).Value.ToString
Dim strrow1 As String = 共餐社区.DataGridView1.CurrentRow.Cells(1).Value.ToString
Dim strrow2 As String = 共餐社区.DataGridView1.CurrentRow.Cells(2).Value.ToString
Dim value As String = TextBox1.Text
Dim strcomm As String = "update 共餐 set 留言 ='" + value + "'where 账号 = '" + strrow0 + "'and 食堂代码='" + strrow1 + "'and 共餐时间='" + strrow2 + "'"
Dim zcomm As New SqlClient.SqlCommand(strcomm, zconn)
zconn.Open()
zcomm.ExecuteNonQuery()
MsgBox("留言成功")
zconn.Close()
Me.Hide()
End Sub
End Class
六:遇到的部分问题以及解决办法
-
用户信息中因为要得到用户的账号,用户名,头像,因此设计全局变量,在用户登录时获取用户账号,以便在用户信息的界面通过sql语言直接查询信息。
-
用户注册时的图片显示问题,起初的设计思路是从文件中挑选图片作为头像,显示在picturebox中,按下注册按钮时,直接将picturebox中的图片存入SQLSERVER数据库中,而实际情况无法实现。最终设计运行过程几乎没有区别,但是设计思路改变较大,先将picturebox中的图片保存至D盘,然后再读取该图片路径读取为byte类型,这也是为什么在该窗口最前面放置一段if判断代码(如果在D中存在的一张图片,则删除该图片,以防止后面读取图片时读错图片),然后再将图片放入dataset中。
-
修改菜品遇到的问题,经过修改菜品.vb中的叙述,起初的设计思路是,将查询所得出的数据放入datatable中,将textbox与picturebox直接通过databindings与datatable进行绑定,但是picturebox涉及到图片的类型方面,通过各种方式无法与其绑定,或者无法查询到图片位置,或者绑定后无法显示图片,因此最后通过设计dataset将dataset.table设置主键,通过查找,找到image类型头像,在读入byte类型的data,继而能够显示图片。
-
图片存放遇到的问题,由于新添菜品的vb程序设计只能添加一道菜的信息,因此为了避免过多的重复性劳动,另通过老师给的代码设计了一段vb代码,直接将所有菜品的图片直接存入至SQLSERVER的meal0数据库中,直接解决了菜品表中的图片问题。
-
日期形式统一问题:由于我们需要根据用户选择的日期(年月日)和时间段(整点)分别检索符合要求的帖子,因此必须保证“共餐”表中的“共餐时间”属性包括年月日和小时分钟.但是考虑到在vb.net中书写sql语句时必须保持vb和sql的时间精度一致,因此必须要选择两者中更精确的时间形式作为最小单位.由于vb.net的时间格式无法只取“时分”不要“秒”,因此sqlserver中不能取更实用的smalldatetime(年月日时分)格式,而应该采取精确到秒的datetime且默认秒为“:00”.
-
时间格式转换问题:由于时间和日期需要分别进行筛选,所以在sql中,选择采取CONVERT函数取年月日,采用DATEPART函数取小时,最终结果均为日期格式;在vb.net中采用DateTimePicker1.Value.ToString(“yyyy-MM-dd”)只取用户录入的日期(实际上精确到秒,默认时分秒为00:00:00)的年月日部分,用Microsoft.VisualBasic.Left(ComboBox4.Text, 2)只取用户录入的小时,最终结果均为字符串格式.由此可见,不同的时间段需要在不同软件中使用不同函数实现截取,而取得的结果的格式也是不一样的.
-
窗口合并后运行失败问题:原本能够运行的二级窗口在合并后成为三级窗口,如果涉及加载上一级窗口的数据则会报错.要将所引用的上一级窗口的数据设为变量存在model中则可以避免报错,正确运行.
- 为了让每个成员充分享受编程的快乐,应用学习的技能,我们采取了完全平行分工,要求每个成员都独立搭建了一整套可独立运行的程序,包括局部数据库的搭建和局部窗体的编写运行.
- 这样的分工使得每个人都完整地走完了一遍数据库项目的实现过程,且在自己负责的部分有更大的发挥空间,并有精力设计更多功能和细节.
- 但是在这个过程中,协调工作进程和统一数据源耗费了大量的时间和精力,且出现了原先可正常运行的窗体在合并后报错的问题,所幸最终得以解决.
- 第一类是功能的缺失或交互逻辑的漏洞:比如未赋予用户修改个人信息的权限、在发布评论和帖子时要求用户重新输入主键信息.未修补这样的漏洞的原因在于,我们已完成了一个相对完整且运行成功的程序,解决这些漏洞所需要的相关知识已在其他代码中有所体现,时间关系未能一一修改.
- 第二类是数据安全性问题:比如对帖子进行修改和删除操作时为验证操作用户和帖主身份是否一致.一方面,这是由于交接问题所导致的不良结果,不同组之间未能就变量统一及时达成共识;另一方面,验证所需知识已在其他代码中有所体现,时间关系没有在这些细节上改良.
我们的项目是极具创新性和实用性的,尤其是“共餐社区”,将消费场景和使用群体紧密联系.可以说,只要能够基于我们的项目进行移植,就可以成为上财乃至全国高校中最受欢迎的app之一,如果有机会,我们的团队将考虑在本科期间持续优化并维护该项目,切实用数据库课程所学知识服务现实生活.
最后,尤其要感谢史海波优秀的授课和细致的指导,衷心期待与史老师的下一次合作!



