65.9K
CodeProject 正在变化。 阅读更多。
Home

简单的调查应用程序

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012年10月21日

CPOL

5分钟阅读

viewsIcon

20880

简介:         提供各种服务的公司需要从客户那里获得各种形式的反馈。

引言

         通过分析这些反馈,公司将对他们的服务和绩效有一个概览。

         在不同的情况和组织中,调查或投票非常重要。例如,考虑一家公司在市场上销售不同的产品。如果他们想了解产品的使用情况和最终用户的满意度,他们将在收集到大部分公众反馈后对用户进行一次简单的调查,然后从不同角度开始分析这些反馈,例如:
  1. 该产品在人们中的使用百分比是多少。
  2. 人们购买该产品的频率如何?
  3. 公众满意度指数等。

所有这些都将有助于

  • 将他们的业务提升到一个新的水平。
  • 并分析未来最近的市场份额。 
  • 并根据市场需求增加产量

解决方案

       我们有不同的网站提供简单的问卷和答案集准备工具,然后发布或分享您的调查链接给目标群体、网络或个人。

       我们可以在常规应用程序中嵌入自己的解决方案,该解决方案将在一段时间内开放供组织内部人员填写。

       最后,对于普通人分享他们的调查或投票,我们有提供有限功能的社交网站。

问题陈述

     我们需要开发一个简单的应用程序,管理员可以准备一份问卷,创建一个简单的调查,并与在我们网站上注册的任何人分享。

       一旦最终用户填写了调查,网站管理员或任何授权人员都可以以图形或文本等任何形式分析调查结果和反馈。

此示例具有以下要求

  考虑我们有一个要求,对通过在线预订系统预订的机票进行客户旅行体验调查。该系统提供通过不同旅行社预订机票的服务。

高层设计


Survey application use case

参与者

管理员:准备调查并通过电子邮件与注册用户共享的人。
经理:分析并准备已填写调查报告的人
用户:收到邮件后填写调查表表的实际用户。

操作: 

注册:用户最初注册到网站
创建调查: 管理员创建调查
共享调查:一旦创建了调查,管理员就与最终用户共享此调查
填写调查:最终用户填写并发送响应。
分析调查:一旦开始收到调查响应,经理就可以根据不同的参数开始分析它们

类图



数据库架构



simple survey app schema

  架构非常简单,说明了应用程序中所有实体之间的关系。
到目前为止,我们已经完成了高层设计、数据库设计和类图。现在我们一步一步地看看实际的应用程序开发。

创建数据库

创建一个名为 SurveyApp 的新数据库,如下图所示
sql server database screen

在此数据库上使用以下脚本创建新表


USE [SurveyApp]
GO
/****** Object:  Table [dbo].[Roles]    Script Date: 09/12/2012 15:46:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Roles](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](200) NOT NULL,
 CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Questions]    Script Date: 09/12/2012 15:46:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Questions](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Text] [varchar](200) NOT NULL,
[QuestionType] [varchar](200) NOT NULL,
[Options] [varchar](2000) NOT NULL,
 CONSTRAINT [PK_Questions] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Users]    Script Date: 09/12/2012 15:46:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Users](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](200) NOT NULL,
[LastName] [varchar](200) NULL,
[UserName] [varchar](200) NOT NULL,
[Password] [varchar](200) NOT NULL,
[Role] [int] NOT NULL,
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Surveys]    Script Date: 09/12/2012 15:46:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Surveys](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Title] [varchar](200) NULL,
[Description] [varchar](200) NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ExpiresOn] [datetime] NULL,
[CreatedBy] [int] NOT NULL,
[Publish] [bit] NOT NULL,
 CONSTRAINT [PK_Surveys] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[SurveyResponse]    Script Date: 09/12/2012 15:46:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[SurveyResponse](
[ID] [int] NOT NULL,
[SurveyID] [int] NOT NULL,
[QuestionID] [int] NOT NULL,
[Response] [varchar](200) NOT NULL,
[FilledBy] [int] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Survey_Questions]    Script Date: 09/12/2012 15:46:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Survey_Questions](
[ID] [int] NOT NULL,
[SurveyID] [int] NOT NULL,
[QuestionID] [int] NOT NULL,
[OrderId] [int] NULL
) ON [PRIMARY]
GO
/****** Object:  ForeignKey [FK_Survey_Questions_Questions]    Script Date: 09/12/2012 15:46:11 ******/
ALTER TABLE [dbo].[Survey_Questions]  WITH CHECK ADD  CONSTRAINT [FK_Survey_Questions_Questions] FOREIGN KEY([QuestionID])
REFERENCES [dbo].[Questions] ([ID])
GO
ALTER TABLE [dbo].[Survey_Questions] CHECK CONSTRAINT [FK_Survey_Questions_Questions]
GO
/****** Object:  ForeignKey [FK_Survey_Questions_Surveys]    Script Date: 09/12/2012 15:46:11 ******/
ALTER TABLE [dbo].[Survey_Questions]  WITH CHECK ADD  CONSTRAINT [FK_Survey_Questions_Surveys] FOREIGN KEY([SurveyID])
REFERENCES [dbo].[Surveys] ([ID])
GO
ALTER TABLE [dbo].[Survey_Questions] CHECK CONSTRAINT [FK_Survey_Questions_Surveys]
GO
/****** Object:  ForeignKey [FK_SurveyResponse_Questions]    Script Date: 09/12/2012 15:46:11 ******/
ALTER TABLE [dbo].[SurveyResponse]  WITH CHECK ADD  CONSTRAINT [FK_SurveyResponse_Questions] FOREIGN KEY([QuestionID])
REFERENCES [dbo].[Questions] ([ID])
GO
ALTER TABLE [dbo].[SurveyResponse] CHECK CONSTRAINT [FK_SurveyResponse_Questions]
GO
/****** Object:  ForeignKey [FK_SurveyResponse_Surveys]    Script Date: 09/12/2012 15:46:11 ******/
ALTER TABLE [dbo].[SurveyResponse]  WITH CHECK ADD  CONSTRAINT [FK_SurveyResponse_Surveys] FOREIGN KEY([SurveyID])
REFERENCES [dbo].[Surveys] ([ID])
GO
ALTER TABLE [dbo].[SurveyResponse] CHECK CONSTRAINT [FK_SurveyResponse_Surveys]
GO
/****** Object:  ForeignKey [FK_SurveyResponse_Users]    Script Date: 09/12/2012 15:46:11 ******/
ALTER TABLE [dbo].[SurveyResponse]  WITH CHECK ADD  CONSTRAINT [FK_SurveyResponse_Users] FOREIGN KEY([FilledBy])
REFERENCES [dbo].[Users] ([ID])
GO
ALTER TABLE [dbo].[SurveyResponse] CHECK CONSTRAINT [FK_SurveyResponse_Users]
GO
/****** Object:  ForeignKey [FK_Surveys_Users]    Script Date: 09/12/2012 15:46:11 ******/
ALTER TABLE [dbo].[Surveys]  WITH CHECK ADD  CONSTRAINT [FK_Surveys_Users] FOREIGN KEY([CreatedBy])
REFERENCES [dbo].[Users] ([ID])
GO
ALTER TABLE [dbo].[Surveys] CHECK CONSTRAINT [FK_Surveys_Users]
GO
/****** Object:  ForeignKey [FK_Users_Roles]    Script Date: 09/12/2012 15:46:11 ******/
ALTER TABLE [dbo].[Users]  WITH CHECK ADD  CONSTRAINT [FK_Users_Roles] FOREIGN KEY([Role])
REFERENCES [dbo].[Roles] ([ID])
GO
ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_Users_Roles]
GO

创建项目

  1. 在 Visual Studio 中选择新建项目。
  2. 选择 asp.net Web 应用程序模板
  3. 将项目命名为 SimpleSurvey。

New Project

删除所有默认创建的文件夹,如下图所示

Survey Project
向项目中添加一个名为 SurveyForm.aspx 的新窗体
New Survey Form
添加一个名为 SurveysManager.cs 的新类
Survey Manager Form
向应用程序添加一个枚举,以便我们可以轻松地对问题进行分类
将以下枚举添加到 SurveysManager.cs
    public enum QuestionTypes
    {
        SingleLineTextBox, // will render a textbox 
        MultiLineTextBox, // will render a text area
        YesOrNo, //will render a checkbox
        SingleSelect, //will render a dropdownlist
        MultiSelect //will render a listbox
    }

用于数据库接口的 Entity Framework

 这里我们将使用 EF 进行数据库相关操作。只需添加一个名为 SurveyAppContext.edmx 的新文件,如下所示。

从 Visual Studio 数据模板中添加 ADO.NET Entity Model 的新项。

Survey Application

选择“从数据库生成模型”继续

Data Model

 选择一个连接字符串继续

Database Connection String

选择数据库活动所需的表并完成

Database tables

最后,Entity Framework 将在 Visual Studio 中生成如下模型,然后生成执行实体 CRUD 操作所需的必要方法。您可以在下面的图像中查看。

Survey Application Model
模型
Survey Application Project Hieraurchy
创建一个管理问题的新窗体,应如下所示。

Manage Questions
创建一个管理调查的新窗体,应如下所示
Manage Survey
我们已经完成了“管理问题”和“管理调查”屏幕的创建。现在我们完成了要求的一半。这两个将为我们提供添加一些问题和调查的方式。

我们以用户对产品的反馈表为例。

  反馈应包含以下问题。
  1. 名字
  2. 姓氏
  3. 用户电子邮件 ID
  4. 手机号码(可选)
  5. 评分(1 到 5)
  6. 注释
调查标题应为 反馈表。
从“管理问题”屏幕添加所有问题。
Survey Application
从“管理调查”屏幕添加反馈调查。
Survey Application
如上一步所示,将所有问题和调查添加到数据库。 

反馈表单渲染

应用程序的实际部分,我们现在将讨论。
第一步:从数据库获取相应的调查定义。
   我们的渲染页面将是这样的,并将列出已添加的调查数量。选择渲染示例反馈表单。
Feedback Form
最后,一旦您在下拉列表中选择了调查,它将回发并渲染带有问题和相应字段的页面,如图所示。
Survey Form
这里是如何用相应的控件渲染页面的基本代码格式。
 private void PopulateSurvey()
        {
            List<Question> questions = (from p in context.Questions
                                        join q in context.SurveyQuestions on p.ID equals q.QuestionID
                                        where q.SurveyID == surveyid
                                        select p).ToList();
            Table tbl = new Table();
            tbl.Width = Unit.Percentage(100);
            TableRow tr;
            TableCell tc;
            TextBox txt;
            CheckBox cbk;
            DropDownList ddl;
            foreach (Question q in questions)
            {
                tr = new TableRow();
                tc = new TableCell();
                tc.Width = Unit.Percentage(25);
                tc.Text = q.Text;
                tc.Attributes.Add("id", q.ID.ToString());
                tr.Cells.Add(tc);
                tc = new TableCell();
                if (q.QuestionType.ToLower() == "singlelinetextbox")
                {
                    txt = new TextBox();
                    txt.ID = "txt_" + q.ID;
                    txt.Width = Unit.Percentage(40);
                    tc.Controls.Add(txt);
                }
                if (q.QuestionType.ToLower() == "multilinetextbox")
                {
                    txt = new TextBox();
                    txt.ID = "txt_" + q.ID;
                    txt.TextMode = TextBoxMode.MultiLine;
                    txt.Width = Unit.Percentage(40);
                    tc.Controls.Add(txt);
                }
                if (q.QuestionType.ToLower() == "singleselect")
                {
                    ddl = new DropDownList();
                    ddl.ID = "ddl_" + q.ID;
                    ddl.Width = Unit.Percentage(41);
                    if (!string.IsNullOrEmpty(q.Options))
                    {
                        string[] values = q.Options.Split(',');
                        foreach (string v in values)
                            ddl.Items.Add(v.Trim());
                    }
                    tc.Controls.Add(ddl);
                }
                tc.Width = Unit.Percentage(80);
                tr.Cells.Add(tc);
                tbl.Rows.Add(tr);
            }
            pnlSurvey.Controls.Add(tbl);
        }
以下是单击提交按钮后,从动态控件获取响应的代码。
 private List<Survey_Response> GetSurveyReponse()
        {
            List<Survey_Response> response = new List<Survey_Response>();
            foreach (Control ctr in pnlSurvey.Controls)
            {
                if (ctr is Table)
                {
                    Table tbl = ctr as Table;
                    foreach (TableRow tr in tbl.Rows)
                    {
                        Survey_Response sres = new Survey_Response();
                        sres.FilledBy = 2;
                        sres.SurveyID = surveyid;
                        sres.QuestionID = Convert.ToInt32(tr.Cells[0].Attributes["ID"]);
                        TableCell tc = tr.Cells[1];
                        foreach (Control ctrc in tc.Controls)
                        {
                            if (ctrc is TextBox)
                            {
                                sres.Response = (ctrc as TextBox).Text.Trim();
                            }
                            else if (ctrc is DropDownList)
                            {
                                sres.Response = (ctrc as DropDownList).SelectedValue;
                            }
                            else if (ctrc is CheckBox)
                            {
                                sres.Response = (ctrc as CheckBox).Checked.ToString();
                            }
                        }
                        response.Add(sres);
                    }
                }
            }
            return response;
        } 
这是一个简单的应用程序,可以扩展以获取更多功能,并可以包含更多功能以获得更实时的功能。工作代码可以在这里下载
© . All rights reserved.