[置顶] 照片的相关描述

OpenID & Douban

August 14, 2010 Views
Comments 0

image

最近试用douban的API,douban使用OpenID作为验证协议,OpenID用途比较广泛,现成的.Net库并不多。

在初次调用的过程中,发现douban的API中存在较为严重的BUG。

传送地址的时候,例如请求的地址没有Encode

http://api.douban.com/people/@me

douban计算后返回的basestring中是如下结果,

Untitled-picture

@符号在douban的basestring变成了%2540

Untitled picture1

分析douban在处理@符号的时候,将其变成%40之后又对%40再Encode,变成了%2540!囧。

这样导致怎么签名数据都不会和douban的相符。

最终发现有这个BUG后将本地提交地址中的@Encode成%40搞定。

阅读全文My Programs

杭电极速

April 4, 2010 Views
Comments 0
20081002_df627428faee67d8a4b1rMVqh71BFynE 20081003_ad1bda53df0bf2643d95tKktXvqVIrGL ephoneOpen functionInSystem

本地计算机找到的几个用于论坛的图片。

很久以前的“杭电极速”项目。

阅读全文My Programs杭电极速  

豆瓣图片上传软件

February 23, 2010 Views
Comments 3

 

花了两天工作以外零零碎碎的时间做的一个东西,将图片文件用鼠标拖到这个东西里,就自动上传到豆瓣里面了~ 很神奇很方便吧。哈。

image

使用协议:

1.作者,即,本人不对使用者使用该软件造成的后果承担责任。使用者自担使用该软件造成的一切后果。

2.软件不收集,不保存任何信息,微软.Net在线安装规范,超级绿色。

3.任何用户名密码信息仅用于登录豆瓣,不会发送到除豆瓣官方以外的任何地方,可放心使用。

你必须同时理解并接受以上三条,才能够使用该程序。

点击链接进入下载/安装: http://nov30th.com/update/doubaner/publish.htm

阅读全文My Programstag  

本科的毕业论文

January 16, 2010 Views
Comments 1

 

本科时候的毕业论文。这个程序的代码99%都是手工写的,历时3个月,边学习Jquery和AJAX多层及很多乱七八糟的东西。

本科毕业设计

(2009届)

题 目

校园就业招聘系统

学 院

计算机学院

专 业

计算机科学与技术(专升本)

班 级

07055731

学 号

07058134

学生姓名

裘中杰

指导教师

郅跃茹

完成日期

2009年6月

目 录

1 引言... 6

2 设计规范... 7

2.1 系统架构... 7

2.2 模块结构... 7

2.3 计算处理... 7

2.4 负载处理... 7

2.5 扩展性... 8

2.6 接口... 8

2.7 数据标准... 8

3 需求分析... 9

3.1 所需设备... 9

3.1.1 硬件环境... 9

3.1.2 操作系统... 9

3.1.3 服务器软件... 9

3.1.4 开发工具... 9

3.2 用户交互平台... 10

3.2.1 教师组... 10

3.2.2 学生组... 10

3.2.3 企业组... 11

3.2.4 管理员... 11

3.3 消息发布方法... 11

3.3.1 调查... 11

3.3.2 短信... 11

3.3.3 邮件... 11

3.4 用户体验... 11

4 系统设计... 13

4.1 核心部分... 13

4.1.1 各类关系... 13

4.1.2 操作单位... 17

4.1.3 独立控制... 19

4.1.4 数据描述... 21

4.1.5 结构体定义... 22

4.2 内部公开API. 22

4.2.1 功能接口... 22

4.2.2 状态接口... 23

4.3 短信功能(仅32位)... 24

4.4 邮件功能... 25

4.5 消息队列类库... 25

4.6 消息队列服务... 27

4.6.1 结构... 27

4.6.2 作用... 27

4.6.3 云处理... 27

4.6.4 分布式控制... 28

4.6.5 服务独立... 28

5 关键技术... 30

5.1 Sitemap 机制... 30

5.2 QCMQ 消息队列... 31

5.3 内部开放API接口... 35

6 数据规范... 37

6.1 省级数据库格式支持... 37

6.2 Outlook日历订阅... 38

6.3 QC系统事件... 39

6.4 开发过程... 40

7 部分功能浏览... 43

7.1 交互界面... 43

8 安装及使用... 48

8.1 架构选择... 48

8.1.1 单一服务器无虚拟化配置方案... 48

8.1.2 单一服务器虚拟化配置方案... 49

8.1.3 多个物理服务器架构方案... 50

8.2 数据库搭建... 51

8.3 核心模块安装... 51

9 系统接口安装... 53

9.1 短信、邮件、消息接口的安装... 53

9.2 消息队列处理服务安装... 54

9.3 用户交互应用程序安装与配置... 55

9.4 群集诊断检测工具的使用... 55

9.5 QC系统扩展插件配置... 56

9.6 学生简历模板方案... 56

10 系统诊断及维护... 58

10.1 交互界面应用程序心跳... 58

10.2 内部公开数据接口状态... 58

10.3 消息队列日志的查看... 59

10.4 各节点参数独立配置方法... 61

10.5 软件环境相关问题... 62

11 插件开发... 63

11.1 概述... 63

11.2 样例程序... 63

11.3 样例介绍... 63

11.4 样例使用... 64

11.5 说明... 64

11.6 开发原则... 70

11.7 异常处理... 71

12 结束语... 72

13 致谢... 73

14 参考文献... 74

15 附录... 75

15.1 QzjCareer Portal API. 75

15.1.2目录CareerApi内容方法... 75

15.1.3 HELP文档缩略图... 84

1 引言

随着时代的进步和发展,无论在计算机还是通信领域,信息化的社会中信息获取和传递将起到越来越重要的地位。

学校拥有自己的信息媒介非常重要。在信息化时代网络横行的年代,建设符合学校背景,需求的招聘就业平台必将以指数倍的形式提高学生就业的效率和积极性。

现阶段学校的招聘就业信息网站已沦为鸡肋,其实质为新闻发布系统。因特网上如此多的招聘就业信息网站,使学生无从下手,海投简历,海量浏览无法保证学生就业的效率。同时,企业无法获得校园中求职学生的特长,技能等信息,在很大程度上失去了被“伯乐”发现的机会。

新的招聘就业网将主要采用互动形式的信息交互。分学生,教师,企业三个主要对象。其中学生和企业为主要用户,前者将能够浏览教师,就业指导员和企业发布的招聘就业信息。后者可以浏览学生的求职信息以及发布招聘信息。

学生与企业的互动采用流水形式的应聘、面试、试用、录用。学生对感兴趣的企业的职位发出应聘请求,企业查看该学生的自我简历与求职信之后决定是否给其面试机会;企业决定面试时间并接受应聘请求;学生收到面试通知参加企业的面试或者考试;企业在结束后给学生反馈考试(面试)信息以及是否录用;学生最终确定是否就职于该企业。

同时,系统地设计将遵循严密、有序、易于扩展的思路设计,使整个系统功能可以随需求变化而变化,将学生,教师,企业主动融入到信息传递、交流、分享的乐趣中。

2 设计规范

2.1 系统架构

系统采用多层架构,数据、代码、视图分离方式开发。

N层结构从逻辑上相互独立其特点:是某一层的变动通常不影响其它层,具有很高的可重用性。减少整个系统的维护成本,具有良好的开放性,进行严密的安全管理,可支持异种数据库,有很高的可用性。

代价是前期的开发周期较长,成本较高。

2.2 模块结构

多层架构设计同时,利用.Net简便的开发特性充分实现低耦合高内聚的模块结构。

2.3 计算处理

支持分布式云计算。

为保证在同时处理繁重任务时仍然稳定,系统支持分布式处理,信息处理和用户界面呈现可在不同地点,不同服务器上运行。信息处理服务能够在一台或者一台以上服务器平台上协同工作,效率为信息处理服务数量的倍数。

确保在因发生单点故障而卸载物理服务器时这些关键性消息处理仍能处于在线状态。

2.4 负载处理

支持服务器群集。

虚拟化的出现可以在硬件成本不变的情况下利用多核CPU运行多个操作系统,解决单一服务无法计时处理大量用户同时访问而性能下降乃至无响应的可能。

群集能够确保在因发生单点故障而卸载物理服务器时这些关键性应用程序仍能处于在线状态。实现这一功能丝毫不会增加用户使用上的复杂性。由于群集在终端用户、应用程序及网络面前呈现为一套单一系统,因此,他们可以像使用其它任意服务器那样来使用群集。

2.5 扩展性

提供内部公开API。

提供外部标准XML数据源。

2.6 接口

数据源及API接口遵循XML标准。

XML是基于W3C定制的开放标准,从而使得基于XML的应用具有广泛性。

2.7 数据标准

各层数据之间通信采用XML标准,同时遵循微软的Web Service 2.0标准,数据中包含各数据源类型的定义和说明,方便二次开发人员对系统进行开发

3 需求分析

3.1 所需设备

3.1.1硬件环境

硬件基于Intel Xeon。

多核多线程。

3.1.2操作系统

Windows Server 2008 Release 2 RC。

华为短信信息机。

3.1.3服务器软件

IIS 7.0 服务组件。

.Net Framework 4.0 可重组开发包。

Microsoft SQL Server 2008 数据库服务。

支持POP3及SMTP的邮件系统。

3.1.4开发工具

Windows Server 2008 R2 RC

Microsoft Visual Studio 2010 Beta 1

Microsoft SQL Server 2008 企业版

VisualSVN 版本控制

Internet Express Browser 8.0 Beta

3.2

教师

学院新闻系统

RSS订阅源管理

学院学生信息管理

学院新闻管理

学院招聘信息发布

学院学生密码管理

学院学生求职,浏览,搜索,应聘,各种操作统计

系统报表

(查看学生感兴趣的各类行业比例,预测将来趋势以及分析企业对该学院哪些学生感兴趣)

管理员

所有数据管理

企业注册审核

新闻发布审核

职位发布审核

校园宣讲审核

校园日历修改

系统基本功能维护

职位搜索

发布求职

新闻浏览

企业

企业信息管理

企业用户帐户管理

企业需求职位管理

学生简历搜索

发布招聘信息

管理学生应聘

定向智能学生搜索

校园宣讲申请

企业信息变更发布

企业公众活动日历发布

学生

简历管理

个人信息

职位搜索

发布求职

新闻浏览

新闻订阅

应聘职位

帮助及推荐

个人日历ICAL,RSS源

事件提醒订阅


用户交互平台

交互平台基于BS架构(Server/Browse),用户和招聘就业系统

图 1 交互系统模块主要功能

每单位用户对应一用户组,不同用户组的功能和操作也不同。

3.2.1教师组

学院学生信息管理,学院学生密码管理,学院新闻系统RSS订阅源管理,学院新闻管理,学院招聘信息发布,学院学生求职,浏览,搜索,应聘,各种操作统计,系统报表(查看学生感兴趣的各类行业比例,预测将来趋势以及分析企业对该学院哪些学生感兴趣)。

3.2.2学生组

简历管理;个人信息;职位搜索;发布求职;应聘职位;新闻浏览;新闻订阅;帮助及推荐。

3.2.3企业组

企业信息管理,企业用户账号管理,企业需求职位管理,学生简历搜索,发布招聘信息,管理学生应聘,定向智能学生搜索,校园宣讲申请,企业,息变更发布,企业公众活动日历发布。

3.2.4管理员

所有数据管理,企业注册审核,新闻发布审核,职位发布审核,校园宣讲审核,校园日历修改,系统基本功能维护,职位搜索,发布求职,新闻浏览

3.3 消息发布方法

3.3.1调查

结合校园学生生活习惯及调查,最有效快捷的方法将信息主动传到指定学生的贴身设备中,优选为短信传送。

结合企业工作人员及校园教师生活习惯及观察,电子邮件为其首选方式。

系统将内置2中消息通知方式,在用户未登录任何招聘就业系统终端时,即时的提醒事件、消息内容将主动发送至用户的手持设备或者电子邮件中。

3.3.2短信

用户登录系统的交互平台或终端,给定界面允许用户输入手机号码,并向用户手机发送验证码。用户接收到验证码后,将其输入系统交互界面(终端)的手机验证码输入框,设置该用户为手机已绑定,并记录手机号码至数据库。

3.3.3邮件

企业用户在注册时,输入邮件地址,首次注册信息将发送至企业用户电子邮箱。

学生,教师用户登录招聘就业系统交互界面后,随时可以更改邮件地址。

3.4 用户体验

使用户拥有操作招聘就业系统更好的体验,交互界面内容主要采用Ajax方式无刷新操作。

学生是该系统最大的用户群体,针对其时尚,追求新鲜的特性,系统提供个人日历订阅,新闻筛选订阅,校园活动订阅。这些订阅源可以采用RSS,XML,邮件,短信,WAP Push各种方式推送到用户设置的目的地。

提供内部API和外部API供开发人员使用。内部API用于开发扩展功能和第三方插件,增加用户体验指数。外部API可让学生制作类似Vista侧边拦的桌面、手持应用,突破仅有BS架构访问的局限。

4 系统设计

4.1 核心部分

4.1.1
图 2 类接口关系
各类关系

系统由教师,管理员,企业,学生,插件5个对象组成。这5个对象分别实现不同的接口功能。

图 3 交互应用程序接口

Namespace QzjCareer.Core 中共有11个接口,每个接口定义一组操作。
 


图 4 帐户用户接口

IAccount定义账户操作,处理基本的账户信息。

 

图 5 公司帐号操作接口

ICompanyVerify定义企业账号注册后管理员可对其执行的一系列操作。

 

图 6 自定义数据接口

IDetailcontroller定义所有对象拥有的参数数据库,该接口的实现通常用于第三方的数据操作中。

 

图 7 事件接口

IEvent定义系统内部产生的事件,该接口的实现用于消息队列和信息处理中。

 

图 8消息接口

IMessage定义各用户之间的消息传送功能及用户组之间的消息传送权限。

 

图 9职位接口

IJob定义企业和学生招聘应聘中的方法。

 

图 10简历接口

IResume定义学生简历的操作。该接口将在更高级的版本中被使用。

 

图 11注册接口

IRegisterController定义管理员对注册账号进行审核的方法。

 

图 12事件处理

IRaiseEvent定义事件处理类中的引发事件后的方法操作。

 

图 13求职处理

IForJob定义学生发布求职的方法。

 

图 14信息绑定接口

IInfroBindController定义所有用户均包含的公共系统属性操作方法。

4.1.2操作单位
 
图 15教师类

教师单位。实现IMessage、IAccount接口。继承于DetailController类。Sealed类。

 

图 16管理员类

管理员单位。实现IMessage,IAccount,ICompanyVerify接口。继承于DetailController类。Sealed类。

 

图 17企业类

企业招聘者单位。实现IAccount、IJob、IMessage接口。继承于DetailController类。Sealed类。

 

图 18学生类

学生单位。拥有各单位中最多的方法。实现IAccount、IMessage、IForJob、IJob、IResume接口。继承于DetailController类。Sealed类。

 

图 19插件类

插件单位。继承于DetailController。除了基本的数据操作外无其他功能,主要依赖插件(可扩展功能)的消息处理服务实现各种操作。Sealed类。

4.1.3独立控制
 
图 20自动对象类

用于域名创建对应单位实例的类。根据传入用户的ID动态创建相应单位类的实例。(由于反射应用对系统开销过高而被摒弃)

 

图 21自定义数据类

DetailController类。各单位的父类,数据类DataConnect的子类。实现系统各单位的Profile数据存放和数据层各表操作的继承。

实例化该对象时,除插件单位外的其他单位必须使用已存在的用户ID作为构造函数的第一个参数传入,否则将引发类无法创建异常,该异常将被QC(QzjCareer)代码捕获并抛出User does not exist(用户不存在)异常,内联该类无法创建异常。

 

图 22帐户定义类

AccountTypeDefine类。提供用户ID、登录ID、AccountType结构体之间转换的各种方法。

 

图 23 登录类

LoginController静态类。提供登录验证方法。

4.1.4数据描述
 
图 24 数据库表封装

数据层各表的封装。每一个类包含一个数据表的操作。使用Visual Studio 2010 的LinqToSql工具创建。所有表封装在CareerDBDataContext类下。

4.1.5结构体定义

QzjCareer.Core.Models

AccountType 描述各单位账号定义

BindStatus 描述手机绑定状态

DetailTimeType 描述用户私人信息临时数据存放时间

ForJobProcessType 描述学生求职状态

ProcessTypeIdType 描述学生和企业之间的应聘状态

ResumeDetailType 描述学生简历中各字段内容

QzjCareer.Core.Controller

SchedulesEventArgs 继承于EventArgs的Sealed类。

提供存放事件信息上下文数据的作用。

4.2 内部公开API

4.2.1功能接口
 
图 25内部公开API类

QzjCareer.Portal.CareerApi

系统功能实现的主要接口,依赖并调用核心模块的函数功能。

接口外部无需关心用户类型、操作过程、操作原理,仅传递基本参数和调用的方法即可。 开发手册请参见副页。

4.2.2状态接口
 
图 26状态接口

QzjCareer.Portal.Ping

群集、分布式应用程序的Alive状态记录功能。提供各应用程序工作状态的监测和命令管理。各点(端)应用程序能够在管理员设定的Ping时间内响应中心数据库返回的命令。

 

图 27服务状态信息

QzjCareer.Portal.WebServer & QzjCareer.Portal.WebServers

以上两个类分别用于存放个在线的点(端)应用程序及服务的状态信息,例如:IP,SID,AppPoolID,AppPath等。

遵循QC第三方插件规范的应用程序运行状态信息也将被存放并实时更新。

4.3 短信功能(仅32位)

 
图 28短信接口封装

QzjCareer.QZJSMS封装了华为信息机的短信接口,提供更人性化的短信操作函数作为对外接口。

由于华为信息机提供的接口为32位非托管带指针的非安全类库,造成QZJSMS无法被64位Runtime调用,因此在这里短信接口只能编译为32位类库。

4.4 邮件功能

 
图 29邮件接口封装

QzjCareer.QZJMail封装了.NET Framework中SMTP和POP3的邮件操作,并为QzjCareer对邮件发送的需求进行优化。

4.5 消息队列类库

QzjCareer.MessageQueue

 

图 30

任何应用程序都可以调用QzjCareer消息队列类库发送邮件或者短信。

4.6 消息队列服务

4.6.1结构

QzjCareer.ScheduleService

 

图 31消息队列服务

消息队列应用将作为Windows的服务运行。

4.6.2作用

它将处理整个QzjCareer系统中的邮件,短信,计划任务,以及事件消息。

消息队列服务包含QzjCareer.QZJSMS和QzjCareer.QZJMail,邮件和短信将通过它发送至目的地。通过Portal的内部API,开发者可以二次开发自定义的消息队列。

4.6.3云处理

当一个消息队列服务无法响应QC系统的大量消息处理时,可以在同一系统或者多个计算机节点上安装,无需单独配置,操作员可以复制在线的消息队列配置并安装在其他节点上,实现自动分布式消息处理。

4.6.4分布式控制

QC消息队列服务支持热启动和关闭,无需暂停QC核心服务,无需考虑多个消息队列的数据冲突或者丢失。但是至少保证一个消息队列服务实例的在线以便能够及时处理QC系统的消息。

4.6.5服务独立

QC消息队列处理服务主要处理事件中的短信和邮件发送,另外监视系统运行状态消息,记录警告和错误状态到数据库中,因此该服务的在线对整个系统至关重要。消息队列服务的运行和数据处理不依赖Portal,取而代之为直接连接数据库,同样使用了数据层,这样做的目的将保证Portal服务掉线或数据拥塞时不会影响到系统信息的处理。

5 关键技术

5.1 Sitemap 机制

图 32SiteMap用户导航

Default.aspx

Login.aspx

Admin/

Default.aspx

ResetPassword.aspx

UpdatePassword.aspx

StudnetManager.aspx

Aboutus.aspx

Contact.aspx

NewsRss.asmx

使用到Sitemap主要功能有 页面标题, 相关功能显示以及站点导航.

"相关功能"在页面的右上方, 使用Theme. master进行控制, 具体的读取算法为:

寻找当前节点的Sitemap Node, 并将其标题赋值给页面, 判断当前节点是否有1个以上的子节点, 如果有, 则将该节点深度为1的所有子节点作为数据源提供给"相关功能". 假如当前节点下没有1个以上的子节点, 则将父节点下深度为1的所有字节点作为数据源提供给"相关功能".

例如, 当访问Admin/Default.aspx时, 相关功能会显示 ResetPassword.aspx, UpdatePassword.aspx, StudnetManager.aspx 三个节点. 访问Aboutus.aspx时, 将显示 Login.aspx, Admin/Login.aspx, Contact.aspx, NewsRss.aspx 四个节点。

相关操作的提供有助于提高用户访问操作的体验。

5.2 QCMQ 消息队列

 
图 33QCMQ消息队列描述

QC系统中针对于第三方消息处理分离 消息队列以Windows服务方式运行,支持傻瓜式分布处理配置,无需配置服务器参数便能实现云处理。

分布式计算,云计算优点及搭建方法请参考附录。

• 取出数据放入队列

• QzjCareer.Core

• QC系统中任务的计划

• QC系统中的安全警报

• 队列中等待发送

• CQMQ服务群集

• 第三方消息处理程序

• 发送至对应终端处理

• 短信

• 邮件

• 其他

数据逻辑处理部分

 

图 34API的整体封装

为了提高系统的可扩展性和兼容性,同时为云处理技术而优化,系统采用分层设计方式。数据库采用多个MSSQL协通工作处理大量的数据信息。

图 35API二次封装

QCMQ (QzjCareer.MessageQuere)直接处理数据库中等待处理的短信,邮件等外部信息,同时监视日历数据,发出提醒事件。有效解决处理大规模数据时终端拥塞线程假死。

图 36核心运作结构

QzjCareer.Core作为整个系统功能与数据库连接的核心部分,操作用户数据库唯一的途径,内建数据错误处理确保数据完整。同时对部分程序员对其二次开发过程中可能错误度地调用方法造成潜在致命的数据逻辑错误前发出提醒。

 

图 37API扩展描述

图 38接口延伸描述

QzjCareer.Portal 作为整个系统的核心对内功能API,提供所有系统操作所需要的函数,集成用户帐户角色安全,通过XML数据与外部程序进行交互。让程序员对QzjCareer系统进行二次开发,扩展功能更轻松方便。

 

图 39第三方接口封装描述

QzjCareer.SMS 、 QzjCareer.Mail 给系统以及第三方开发人员提供了简单易懂的参数配置和友好的第三方接口。

简单配置便能使程序连接华为短信信息机接口和符合国际ISO标准的SMTP,POP3邮件服务器。

5.3 内部开放API接口

由于QC平台对内接口的开放性, 致使第三方扩展功能都能在其基础上完成操作.

QC Portal采用XML标准对数据进行序列与反序列化. XML可以同时用来描述字段,定义字段,和包含字段的值, 给第三方开发以及系统自身扩展提供了简便快捷的基础.

第三方插件(扩展)同样可以注册和获得自定义的QC系统事件。

6 数据规范

6.1 省级数据库格式支持

 
图 40浙江省大学生网上就业市场
 
图 41教师导入学生资料Access数据库

以上表格为浙江省大学生网上就业市场提供教师下载填写班级信息、学生信息、学院信息的数据库。

 

图 42安装配置工具

QC系统支持并兼容该数据格式,将数据全部导入QC系统相同的表名后执行QC数据库工具的用户体验数据初始化

更新表数据时,删除上述所有表,重新添加。包括表结构和表数据,同时在所有表中添加以下两行字段

[chineseSpell] [varchar](50) NULL,

[chineseFirst] [varchar](50) NULL

QC系统将用其存放优化用户体验的数据。

注意:[浙江省大学生网上就业市场]提供的Access数据库并没有设定主键,但是QC系统中必须设定主键!不能以存放重复数据的字段作为主键。

学生在QC系统录入的获奖信息,个人信息,个人爱好等个人简历信息可以导出为[浙江省大学生网上就业市场]的模板数据,免去手工录入信息的时间和精力。

6.2 Outlook日历订阅

 
图 43日历页面

校园日历和个人日历均提供ICal与XML格式的数据源,任何兼容以上两种数据源的程序(例如Outlook)能够实时更新电脑或手持设备的个人日历以及校园日历。

6.3 QC系统事件

QC Event 规范

Event 使用 Details 表存放与读取数据。

Event 的动态属性有 事件名称,方法,值。

Event 静态属性为 用户标示ID,用户类型。

Event 与 Detail 表对应关系

Event.EventName -> Detail.DetailType

Event.EventMethod -> Detail.DetailName

Event.EventValue -> Detail.DetailValue

事件名称: 当发生该事件引发。(e.g. Event_XXX)

事件方法: 引发后对事件进行的操作。(e.g. SMS)

事件值: 对该事件操作的数据。

事件值格式:目标地址|内容[|...]

|为每项值分隔符,在添加事件处理条目时必须对值中已存在的|进行转义或者删除。

在第三方开发过程中,务必检查事件值格式的各项值中是否存有与分隔符相同的值。

例如:

表格 1 参数内容

事件类型[引发时间源]

Event_ApplyJob

事件方法[消息处理类型]

SMS

事件值[事件发生时数据]

13588860000|维护人员的应聘状态已经改变为:初次应聘成功,等待面试。|进入面试状态

当学生或者企业中用户的应聘状态改变时,将引发名称为Event_ApplyJob的事件,系统将对订阅该事件的对象产生相关数据放入[SYS_Schedules]表中。消息队列将对支持的方法进行处理,第三方插件从[SYS_Schedules]表中处理自身支持的信息并将反馈信息和处理结果保存。

具体信息请参阅附录的开发手册。

6.4 开发过程

 
图 44Windows操作系统

Windows 2008 R2 企业版操作系统。

 

图 45Visual Studio 开发环境

软件开发前期使用Visual Studio 2008 Team System。

后期开发及调试基于Visual Studio 2010 Team System,并转化为.Net 4.0应用程序。

 

图 46数据库版本

数据库使用SQL Server 2008。

之所以选择Visual Studio 2010来做开发,因为其强大的.Net Framework平台支持,高效的编程体验,同时拥有舒适的界面和完美的透明界面。.Net Framework 4.0种集成了许多人性化的新特性,鉴于其现在仍然是测试版本,新的控件和域名函数等新特性并没有使用在程序中。

 

图 47系统任务管理器

在开发就业招聘系统中,应用程序的调试启动速度一直是困扰本人开发效率的问题之一。调试状态需要装载各托管代码的签名及符号,在笔记本上开发的Debug模式比Release模式要多消耗近15倍的时间。为此更换了台式电脑,优化代码支持多核处理器。

版本控制对开发大型项目有效管理开发进度及任务的方法之一。通过自己架设的SVN,每次更新将更新的内容作为Comments传送到SVN服务器中。在未来浏览之前修改的代码会使过程思路非常清晰,不会因为文件、代码的繁多而晕头转向。

7 部分功能浏览

7.1 交互界面

 
图 48无验证码算法

采用无验证码的浏览器计算动态数据验证来判断登录异常。

图 49部分功能浏览
图 50部分功能浏览2
图 51部分功能浏览3

8 安装及使用

8.1 架构选择

QzjCareer系统可运行在多种网络拓扑方式以及多种系统架构,选择需依据用户同时访问量及硬件性能而定。

以下推荐三种配置方案供安装参考。

8.1.1单一服务器无虚拟化配置方案
 
图 52单一操作系统平台上安装配置

该方案适合访问量波动稳定,流量较小,硬件配置较好的单(双)核服务器.由单一的服务器上运行单一操作系统,同时在线QC核心服务,数据库服务,QCAPI服务,Email接口,SMS接口,QC消息队列服务,QC计划任务服务,QC扩展应用程序。

硬件配置最低要求:

CPU: Intel Xeon 2.0G

RAM: 4GB

Disk Space: 1TB

8.1.2单一服务器虚拟化配置方案
 
图 53虚拟化配置方案

上图为假定的宿主机配置。在宿主机上的虚拟控制化设备中建立5个客户机,如下图。

 

图 54虚拟化内部客户机连接示意图

每个客户机分配虚拟网络的独立IP地址,通过NAT技术连接到宿主机的物理网络上。同时宿主机需要指定NAT上的应用程序服务端口对应内部虚拟主机的服务端口。在这个配置中,需要在虚拟交换机NAT映射设置物理网络80端口对应QzjCareer.WEB主机的WEB服务端口才能够接受外部的传入连接。

在该配置下的宿主机必须严格配置安全策略,当入侵进入宿主机时,他将轻易获得虚拟环境下的任何设备信息数据。

8.1.3 多个物理服务器架构方案
图 55 使用多个服务器组建QzjCareer系统

上图用到了多个服务器。最右边两个为WEB服务,分别连接内网和外网。其中外网到WEB服务使用动态分流将不同TCP SYN请求发送至相对空闲的WEB服务器上实现负载均衡。

内网架设3个MSSQL服务器,采用微软视窗数据中心服务器系统,构建数据库服务器群集。同时3个支持虚拟化技术的服务器运行多个QzjCareer.Portal处理数据。运行消息处理服务的服务器同样使用支持虚拟化的服务器,运行多个实例。

网内还有存放用户文件的文件服务器、供维护人员使用的终端。

构建分布式网络得应注意:

1. 不能与其他局域网络混杂在一起。例如Portal,MessageQueue等服务对内始终采用信任模式运行,当内部网络出现问题时,入侵者将可能直接操作Portal而窃取数据库内资料。

2. 如果无法实施物理网络隔离,则采用虚拟隔离。在没有条件架设单独的局域网时,可以将QC系统的各个服务期组建成VLAN或者VPN方式的局域网。在VPN方式下的局域网,连接必须启用对称加密的IPSec确保虚拟不容易被入侵。

8.2 数据库搭建

 
图 56 T-SQL文件

1. 安装Microsoft SQL Server 2005或者以上版本,推荐使用Microsoft SQL Server 2008 以支持全部编录。

2. 进入SQL管理工具,New Database[1]并设定期望的数据库参数和文件存放位置。

3. 选择New Query[2]数据脚本,并导入数据库脚本文件,文件位置在InstallPacket\MSSQL Script目录下的CareerDataBase.Sql。

4. 导入完成后,生成对应的数据库连接语句准备其他应用程序配置时使用。

值得注意的是,数据库默认情况下使用Windows验证方式。如果维护人员希望使用TCP登录方式,请右键管理工具中的Object Explorer[3]选择属性。在Security[4]选项卡中更改SQL允许的验证方式为SQL Server and Windows。完成后检查能够从外部该机的外部网络访问,如遇失败则检查防火墙设置。

8.3 核心模块安装

在需要安装Portal对内API接口的内网服务器上执行SetupQzjCareerCore.msi。

 

图 57 Core安装

安装完成。依赖QzjCareer.Core库的组件便能够在该系统平台上运行。

9 系统接口安装

Portal内部接口依赖QzjCareer.Core库,未安装QzjCareer.Core库的系统平台上无法正确运行借口。

进入安装媒体[5]中的SetupQzjCareerPortal目录,依次执行以下步骤:

1. 打开QzjCareer.Portal.parameters.txt文件。

2. 设定QzjCareer.Portal_IisWebApplication的值为Portal在IIS中应用程序的名称。

3. 设定QzjCareer.Portal_CareerDB_ConnectionString为数据库连接字符串。如果数据库存在数据需备份,安装Portal时将会清空之前的数据。

4. 打开IIS管理工具,创建以修改QzjCareer.Portal_IisWebApplication后的值为名称的网站项目,并配置好基本信息,将.Net应用程序池的工作版本设置为4.0。

5. 执行QzjCareer.Portal.deploy.cmd [/T|/Y]。如需得到参数说明,直接执行QzjCareer.Portal.deploy.cmd。

提示:首先确保当前执行安装的用户的环境变量里添加有msdeploy的path变量,如果不存在,请查阅相关Windows使用技巧,加入path变量中msdeploy的路径。或者维护人员也可以在命令行模式下执行
set Path=%Path%;"C:\Program Files (x86)\IIS\Microsoft Web Deploy"[6]

6. 如果没有出现错误提示,安装就完成了。

打开http://localhost/ping.asmx检查是否可以正常访问。注意,Portal能够正常显示并不说明已正常连接到数据库。

9.1 短信、邮件、消息接口的安装

在需要使用QC短信邮件及消息处理的服务器上执行SetupQzjCareerSmsEmail\SetupQzjCareerSmsEmail.msi。

 

图 58 邮件、短信、消息接口安装

安装成功的操作系统平台将可处理QC中的短信邮件。

9.2 消息队列处理服务安装

QC消息队列处理服务主要处理事件中的短信和邮件发送,另外监视系统运行状态消息,记录警告和错误状态到数据库中,因此该服务的在线对整个系统至关重要,安装的系统需要能够与数据库快速地通信。

消息队列处理服务可以被安装在任何内部网络直接与数据库通信的操作系统平台上,一个操作系统只建议安装一个实例。

安装步骤:

1. 进入安装介质中的SetupScheduleService目录执行Setup.Exe。

 

图 59 消息队列安装

2. 安装完成后将在桌面创建一个名为“Install QzjCareer Message Queue Service”的快捷方式。双击运行。

3. 出现提示“The Commit phase completed successfully.”即安装成功。

4. 点击“开始”菜单的“运行”,输入Services.msc,找到QzjCareerDeamon服务,点击开始。

 

图 60 消息队列服务选项卡

9.3 用户交互应用程序安装与配置

用户交互界面的安装与Portal相似,安装媒体的SetupQzjCareerWeb目录下,运行QzjCareer.CareerWeb.deploy.cmd开始安装过程。需要注意的是,安装后要完成配置文件修改、网络配置,包括但不限于:

1. 数据库连接字符串。

2. 用户文件上传根文件夹。

3. MachineKey SecretKey的设置,分布式状态下必须设置相同。

4. 公用网络至QC网络服务端口NAT映射。

9.4 群集诊断检测工具的使用

在各QC内网主机上进行Portal的通讯测试,包括连接测试,访问测试,数据测试,功能测试。

 

图 61 群集诊断工具

9.5 QC系统扩展插件配置

QC系统插件基于Portal内部接口,运行QC插件的系统平台上必须能够访问Portal接口。

配置方式参考样例程序“QC插件XiaoNei小工具”。

9.6 学生简历模板方案

突出系统个性化、人性化功能以及吸引学生主动参加招聘就业系统上与企业进行交互,系统中许多功能都是定制方便修改的。以最简单的学生简历模板作为介绍:

 

图 62 学生简历模板

交互应用程序目录~/Anony/StudentResumeSkins/下用于存放个性化的学生简历模板,维护员或者开发者能够在当前目录下建立以容易辨明模板类型的目录名称来存放模板文件。模板文件内容基于JTemplate[7]中定义规范。详细开发规范可以从QC开发手册中获得。

10 系统诊断及维护

10.1 交互界面应用程序心跳

每个交互界面应用程序启动时都将提交其系统基本状态信息给Portal,并在预先设定的时间间隔持续发送数据。维护人员可以访问Portal的Ping GetServices中方法来查看当前在线以及最后在线应用程序的时间。

例如本地运行的交互界面应用程序,访问该方法后将返回XML数据如下:

<?xml version="1.0" encoding="utf-8" ?>

- <ArrayOfWebServer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">

- <WebServer>

<WebServerAddress>127.0.0.1</WebServerAddress>

<WebServerVersion>0.0001.7069</WebServerVersion>

<WebServerDomain>dd6576da-1-128874673611533984</WebServerDomain>

<LastUpdateAt>2009-05-22T20:03:23.6309375+08:00</LastUpdateAt>

<Id>127.0.0.1</Id>

<AddtionInformation>DEFID:WEB1|CLSID:0000-0000-0000-0000-FFFF-0001</AddtionInformation>

</WebServer>

</ArrayOfWebServer>

开发者可根据该接口开发状态监视及下线报警程序。

10.2 内部公开数据接口状态

任何对Portal接口访问的应用程序都应该在第一次启动或者访问时确认Portal能够正常访问,否则停止退出应用程序并间隔尝试。第一次访问时对Portal进行Ping下的HelloWorld方法访问,返回值和期望值相同时,启动后台线程持续进行AlivePing方法的访问。

同时,必须对后台线程使用守护进程或者异常处理,在任何导致线程退出的情况及时停止应用程序服务。

以上行为目的是为了保证在Portal接口不可用的情况下,不进行任何的业务操作,保证用户体验,同时确保Portal不会因下层应用程序单点的拒绝访问式攻击而瘫痪。

10.3 消息队列日志的查看

在消息队列处理服务的Windows系统平台上,维护人员能够在Windows系统管理工具的事件日志中查看服务状态以及服务所有进行的操作。日志分为四种,分别为:QzjCareer信息服务程序日志,短信日志,邮件日志,系统信息日志。

 

图 63 Windows系统日志

1. 信息服务日志包含服务启动,暂停,停止状态记录和服务内部异常、停止警告等。

 

图 64 信息服务日志

2. 短信日志包含短信发送状态消息、警告、错误。

 

图 65 短信服务日志

3. 邮件日志包含邮件发送状态消息、警告、错误。

 

图 66 邮件日志服务

4. 信息队列日志包含QzjCareer系统中各种事件的处理过程和结果信息。

 

图 67 系统事件日志服务

10.4 各节点参数独立配置方法

根据需求不同,维护人员可能希望两个交互应用程序运行在不同的环境中。例如,校园内部网络和校园外部网络,并且希望对其从不同网络位置访问的用户进行不同的限制。

使用独立参数配置可以解决类似问题。当交互应用程序[8]启动时,会试图读取其版本的初始化信息(该信息使用群集诊断工具配置,存放于数据库中)。读取的数据将用来覆盖应用程序web.config内基本配置信息。当然,除了数据库连接字符串之外,都可以被覆盖。

维护人员可以从群集诊断工具的使用中看到,QzjCareerVersion节配置信息。该节配置用来告诉数据库取何版本,何种类型应用程序的数据。当前样例中该交互应用程序QzjCareerVersion节点值为0.0001.7069,表示 主版本号0,附版本号0001,应用程序参数组编号7069。

理解参数获得方式,维护人员便可以设置不同的参数组,修改应用程序下的节点配置以对应维护人员期望的目的。

10.5 软件环境相关问题

在组建该系统的任何应用时,务必注意使用的.Net Framework版本。该系统基于.Net Framework 4.0 Beta 1 架构,也是当前编写该文档前4天微软对全球公开的第一个测试版本。微软于去年开始开发Visual Studio 10,CLR 4.0,.Net 4.0以及AJAX Framework 4.0。

因此,有可能在微软.Net运行库产生未知错误与问题。系统内代码已对所有涉及当前版本已知的.Net平台BUG进行优化,但维护人员仍务必做好数据、错误日志的备份,以便及时应对未知状况。

11 插件开发

11.1 概述

QzjCareer系统依照分层,零耦合,分布处理的思想进行编写。因此开发人员可以在原有架构上编写简单的代码来增加新的功能。

例如:添加Weblog Metabase的新闻源支持将方便用户使用Windows Live Writer发布,修改,删除新闻。添加日历同步源,使用户在Outlook创建的内容显示在交互应用程序中,增加其访问就业招聘系统的频率及依赖性。提供个人订阅职位类型中的更新RSS订阅,使Windows Vista及以上版本用户在使用电脑时能够同时在侧边栏中观察各种新职位。等等。

11.2 样例程序

为了让开发人员能够快速,方便地编写QC系统上插件和扩展,这里提供一个样例程序。基于QC系统Portal(内网公开API)和“校内网”[9]两种API同步信息的样例。

11.3 样例介绍

“校内网”是国内比较庞大的校友录网站,其功能及特点模仿国外Facebook交友网,共同拥有操作人性化,信息处理响应延迟低,功能全面,自定义性强等特点。在需求分析阶段的调查显示,无论在校学生、教师、已经参与工作的上班族注册该网站并不定时更新个人资料的群体占调查总人数的70%。按照预计发展,未来5年内如按照其现阶段的维护及功能更新,将会更大比例的学生、教师、企业工作人员使用其网站提供的功能。

“校内网”提倡使用实名制及真实个人信息,学校资料,工作资料。也提供类似Facebook网站的小工具功能,对外开放API接口,网站上的用户将能够使用小工具进行交互。

对QC系统而言,最关心其网站提供的个人信息,学校信息,以及工作单位信息的接口。QC可以使用其接口同步学校信息、个人爱好、个人照片、个人介绍,所有就读过的学校、工作单位、实习单位信息。

样例使用QC系统中Portal内部公开接口,除此之外,不使用其他QC系统资源。

11.4 样例使用

 
图 68 开发IDE及工程文件

插件使用3个工程,分别为“校内网”的XML数据结构定义,“校内网”API封装类,QC在“校内网”交互界面呈现组成。

11.5 说明

插件的安装非常简单,将安装媒体/Plugins/Xiaonei/下文件复制到IIS应用程序目录下,关联80端口。注册“校内网”,申请开发者应用。

 

图 69 校内网工具参数设置

Callback URL填写成QzjCareer.XiaoNeiWeb所在服务器对外的访问地址和端口。应用的服务器IP地址在开发阶段可以不指明,工具发布之后将只连接指定IP上的服务器。

 

图 70 校内网关于小工具页面

应用程序的“关于”页面将显示API Key和Secret Key以及APPID,将这些信息更新至QC的“校内”插件中web.config的对应信息。

 

图 71 QC插件扩展配置设置
 
图 72 Portal连接被拒绝提示

点击“校内网”该插件首页,出现如图所示错误表示Portal接口没有正确启动,或者无法连接。则需要检查Portal服务及网络连接。

 

图 73 QC插件未绑定登录界面

开启Portal服务器,初始页面如图。点击绑定帐号,

 

图 74 QC插件登录密码框

输入用户名和密码,选择帐号类型进行登录。

 

图 75 QC插件同步学校界面

上图下半部分为你在“校内网”填写的学校资料,点击“添加……”之后将同步到QC系统的个人资料中。

 

图 76 QC插件同步头像

可以上传头像。需配置物理文件服务器路径,建议使用IPSec或者SSL安全的连接。该功能需要配置服务器。

 

图 77 QC插件系统设置
 
图 78 QC插件系统设置AJAX完成

所有TAB组合在一个页面中并且使用AJAX无刷新,TAB切换的体验非常好。

 

图 79 QC插件同步实习、工具

同步实践、实习经历。上图的下半部分为“校内网”已经存在的个人资料,同步到QC系统中时,仅需填写“校内网”没有提供的资料,例如职位、经历描述。

 

图 80 “校内网”个人资料
 
图 81 “校内网”个人资料工作信息

“校内网”的个人信息设置,可以发现QC插件中从填写的个人资料中的信息得到。由于并不是所有资料都是经过“校内网”人工确认的,所以通过到QC系统中的资料只能作为未验证的学生自主输入的信息。

 

图 82 “校内网”插件已经帮定帐号

当你再次进入这个小工具的页面时,将会看到原来显示为“绑定帐号”的按钮已经是“直接进入”了。这是由于,插件使用QC.Portal提供的参数数据库,可以在QC数据库写入任何属于该用户的自定义信息,同时也可以获得属于该用户的自定义信息以及部分个人信息。

11.6 开发原则

总体而言,Portal提供了绝大部分对就业招聘系统操作方法。同时也提供额外的插件数据存放读取空间。这些空间对于开发者来说是没有限制的,但是应该合理利用这些资源,临时的数据必须标记系统可删除它的周期,单位可以是分钟,小时,天等等。不考虑资源的充分利用及回收,再多的分布式数据库也只能得到较低的性能发挥。

插件中的应用程序安全性是至关重要的一个环节,QC.Portal中的绝大部分操作要求参数传入当前用户的识别号[10]。虽然如此,开发者应该在交互应用程序上就判断用户的合法性,防止A用户欺骗交互应用程序而得到B用户的操作权限。 同时避免频繁使用Portal造成不必要的资源开销和非事务处理数据库数据的冲突发生。

11.7 异常处理

Portal内部公开接口中错误的发生将以异常形式抛出并返回,交互应用程序需要主动捕获异常并执行相应的清理资源操作。提交数据前对数据进行必要的格式、范围、类型检查,避频繁引发异常。

12 结束语

整个系统的设计由本人单独完成,大多涉及当前最新的技术应用。未来软件开发的形式将以高效、快捷、安全性、扩展性、兼容性为主导。当软件没有接口和扩展,其生存周期将和一次性用品一样,用之丢弃,在重视高效、资源合理分配重复利用的时代,这种旧时代的思想和产物必需丢弃。

该系统核心是信息处理系统,信息系统最主要是能够长久、稳定、持续地提供服务。因此,在软件的前期架构必将花费大量的时间和金钱保证产品的质量。

在没有任何经费购买或租用硬件设备的情况下,软件功能通过单机调试和类、接口的单元测试,没有条件进行压力测试和稳定性测试。原设计为Portal封装数据层提供包括WEB在内的所有服务,由于时间紧迫,WEB中部分代码采用直接连接数据层操作。

系统的设计过程,代码的编写过程,也是不断学习新事物的过程。软件的设计不可缺少的是创新,从多年的实践经验得到,想要有所创新就需要了解各种专业各种生活常识,各种人文情感。QC样例插件“校内网”小工具,并不是仅从程序员角度出发的需求分析,而是要站在学生用户角度考虑这些问题。

当程序设计经验积累到一定程度,能够提高的不是学习新的语言、语法,而是思维上的创新、理解、和快速反应能力。

13 致谢

感谢导师以及学生处老师在设计需求分析上给了很大的帮助。

感谢招商银行和建设银行在全球次级贷款金融危机时仍然提供贷款供本人购买计算机做开发。

感谢微软(中国)提供2天的Windows 7, IE8 ,Visual Studio 2010的免费培训及午餐。

14 参考文献

[1] ScottGu. jQuery and Microsoft. http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx

[2] ScottGu. jQuery Intellisense in VS 2008 http://weblogs.asp.net/scottgu/archive/2008/11/21/jquery-intellisense-in-vs-2008.aspx

[3] John Resig. How jQuery Works http://docs.jquery.com/Tutorials:How_jQuery_Works

[4] Stanley B. Lippman. C# Primer: A Practical Approach.

[5] Christian Nagel ,Bill Evjen ,Jay Glynn Professional C# 2008.

[6] Robert C.Martin敏捷软件开发人. 民邮电出版社. 2007.12

[7] Charles Petzold. Programming Microsoft Windows With C#.Microsoft Press. 2002

[8] Tanenbaum,A.S. 计算机网络(第4版). 清华大学出版社. 2004-8-1.

[9] 阎宏,《Java与模式》,电子工业出版社

[10] [美]James W. Cooper. 《C#设计模式》. 电子工业出版社.

[11] [美]Alan Shalloway James R. Trott. 《Design Patterns Explained》. 中国电力出版社.

[12] [美]Robert C. Martin. 《敏捷软件开发-原则、模式与实践》. 清华大学出版社

[13] [美]Don Box, Chris Sells. 《.NET本质论 第1卷:公共语言运行库》. 中国电力出版社.

15 附录

15.1 QzjCareer Portal API

图 83 QzjCareer API 文档
15.1.2 目录CareerApi内容方法

这里仅提供API目录,详细函数例子及说明请参阅HELP文档。如图。

Copyright (C) 1985-2009 HOHO``
All rights reserved
NameSpace:QzjCareer.Portal
Description : 提供给开发人员二次开发接口。
Created By Qzj At 3/23/2009
Created On WIN-PSFL4HEL378

Remarks

API注释中的用户标示ID,必须使用数据库中的用户存储格式输入,比如学号为07058134的学生ID为STU_07058134,而企业用户名为qzj登录的企业ID为COM_qzj。
注释中注明用户类别的函数,只能以其用户标示ID可以操作,传入其他用户标示ID通常会引发接口异常。
消息类发送请用异常判断是否发送成功,不要使用返回值判断。消息通常使用QzjCareer消息队列处理来避免前端线程堵塞。
QzjCareer的核心架构中和API中已经集成权限和用户组判断,以某用户识别ID操作其他用户的数据,将导致异常和非预期效果!
NOTICE:当前API只对系统内部开放,不可直接提供给用户访问。

constructor

Constructor

Description

 

CareerApi

 

Public method

Public method

Description

 

AddDetail

添加条目

 

AddDetailEx

添加自定义数据条目

 

AddExperience

Adds the experience.

 

AddForJob

添加学生求职

 

AddResume

 
 

Agreement

用户接收系统使用条款及协议

 

CancelCellphoneBind

取消手机和帐户的绑定

 

CancelForJob

撤回等待状态的求职

 

CancelJob

取消进行中的招聘(企业)

 

ChinesePinyin

返回中文字符串的拼音

 

ChinesePinyinFirst

返回中文字符串所有拼音的第一个字符

 

CompleteCompanyDetail

(Web Application Use)

 

CreateCompanyAccount

通过企业审核并创建帐号(管理员)

 

CreateCompanyDetail

(Web Application Use)

 

DataXml

Datas

 

DeclineApply

拒绝该学生的应聘(企业)

 

DeleteCompanyDetail

删除企业帐号
通常用于对恶意注册的帐号

 

DeleteForJob

删除学生的指定求职

 

DeleteMessage

删除用户的指定消息

 

DeleteResume

删除学生指定的简历

 

DelExperience

Dels the experience.

 

Dispose

(Inherit from MarshalByValueComponent)

 

DoApplyJob

应聘(学生)

 

DoPublicJob

发布招聘(企业)

 

EditResume

编辑更新简历

 

EmployApply

录用该应聘的学生(企业)

 

Equals

(Inherit from Object)

 

GetAccountDetail

获得帐号信息(该版本未使用)

 

GetAllDetails

返回指定用户的所有条目

 

GetApply

返回指定应聘结构

 

GetApplys

返回指定用户的应聘列表

 

GetBindCellphone

返回指定用户已经绑定的手机号码。没有绑定将返回string.Empty

 

GetCellphoneBindStatus

返回指定用户手机邦定状态

 

GetCellphoneNumber

Gets the cellphone number.

 

GetCollegeId

返回指定用户所属的学院ID。无所属学院的将返回-1或0

 

GetCompanyDetail

(Web Application Use)

 

GetCompanyId

返回指定用户所属于的企业ID。无所属企业的将返回-1或0

 

GetDetail

返回条目内容

 

GetDetailCount

返回条目数量

 

GetDetailCountEx

返回条目数量

 

GetDetailEx

返回条目内容

 

GetDetailsEx

返回指定用户指定类别的条目

 

GetDetailValue

返回条目的值

 

GetEvent

获得用户事件

 

GetEvents

获得用户的一种引发事件

 

GetExperiences

Gets the experiences.

 

GetHashCode

(Inherit from Object)

 

GetJob

返回指定的招聘(企业)

 

GetJobs

返回招聘(企业)

 

GetLoginIdByUserId

从用户名获得登录名

 

GetMessagesAmount

返回指定用户的所有消息数量

 

GetRealName

返回指定用户的真实姓名

 

GetService

(Inherit from MarshalByValueComponent)

 

GetsForJob

返回指定学生的求职列表

 

GetsResume

返回一个学生的简历列表

 

GetType

(Inherit from Object)

 

GetTypeByUserId

获得用户的帐户类别

 

GetTypeStringByUserId

获得用户类别的字符串

 

GetUnAuditedCompanys

返回未通过审核的企业帐号

 

GetUnAuditedCompanysCount

返回未通过审核的企业数量

 

GetUnreadMessagesAmount

返回指定用户未读的消息数量

 

GetUserIdByLoginId

从登录名获得用户名

 

HashPasword

获得加密后的用户密码

 

InsertEvent

新增用户事件

 

ModifyForJob

学生修改或者更新求职

 

ModifyPassword

修改密码(需要提供当前密码)

 

RefuseCompanyRegister

回退企业注册步骤
通常让企业重新填写企业信息或者上传营业执照

 

RemoveDetailKey

根据条目

 

RemoveDetailName

根据条目类别和名称删除该条目

 

RemoveDetailType

根据条目类别删除条目

 

RemoveDetailValue

根据条目内容删除条目 需要提供值,类型,名称,拥有者

 

RemoveEvent

删除用户事件

 

RemoveEventEx

删除用户事件

 

ReplyApply

回复应聘者(初次,比如决定是否给其面试机会)(企业)

 

ReplyEmploy

回复是否继续应聘(比如是否接受录用前的面试或者考试(学生)

 

ResetPassword

重置用户密码 (管理员)(教师)
管理员可以对除同级外所有用户用户重置密码
教师可以对其学员的学生重置密码

 

SendCellphoneVerifyCode

发送手机消息验证

 

SendMessage

发送信息
系统中已经定义可互相发送消息的用户类型,未允许的用户类型之间消息将会导致抛出异常。
定义每种用户之间是否能发送消息在 IMessage接口中的 CanSendTo 实现。

 

SendMessages

群发信息

 

SetCellphone

设置手机号码

 

SetEmailAddress

设置个人邮件地址

 

SetMessageAsRead

设定消息为已读

 

ToString

(Inherit from MarshalByValueComponent)

 

UpdateCompanyDetail

(Web Application Use)

 

UpdateDetail

更新条目信息

 

UpdateDetailEx2

更新条目

 

UpdateEx

更新条目

 

UpdatePersonalInfo

雇用单位成员更新其自身信息

 

Verify

验证密码是否正确

 

VerifyCellphone

验证指定用户提供的短信验证码,成功将设置其手机与系统绑定

 

VerifyEx

验证密码是否正确

 

Xmldata

XMLDATAs.

Public property

Public property

Description

 

Application

(Inherit from WebService)

 

Container

(Inherit from MarshalByValueComponent)

 

Context

(Inherit from WebService)

 

DesignMode

(Inherit from MarshalByValueComponent)

 

Server

(Inherit from WebService)

 

Session

(Inherit from WebService)

 

Site

(Inherit from MarshalByValueComponent)

 

SoapVersion

(Inherit from WebService)

 

User

(Inherit from WebService)

Ping class

Collapse All Expand All  

Copyright (C) 1985-2009 HOHO``
All rights reserved
NameSpace:QzjCareer.Portal
Description : 各群集服务器消息状态,不建议操作
NOTICE:当前API不集成登录检查,不可以让最终用户访问。
Created By Qzj At 4/11/2009
Created On WIN-PSFL4HEL378 constructor

Constructor

Description

 

Ping

 

Public method

Public method

Description

 

AlivePing

Alives the ping.

 

AlivePingEx

Alives the ping.

 

Dispose

(Inherit from MarshalByValueComponent)

 

Equals

(Inherit from Object)

 

GetHashCode

(Inherit from Object)

 

GetServers

Gets the servers.

 

GetService

(Inherit from MarshalByValueComponent)

 

GetType

(Inherit from Object)

 

HelloWorld

Helloes the world.

 

ToString

(Inherit from MarshalByValueComponent)

Public property

Public property

Description

 

Application

(Inherit from WebService)

 

Container

(Inherit from MarshalByValueComponent)

 

Context

(Inherit from WebService)

 

DesignMode

(Inherit from MarshalByValueComponent)

 

Server

(Inherit from WebService)

 

Session

(Inherit from WebService)

 

Site

(Inherit from MarshalByValueComponent)

 

SoapVersion

(Inherit from WebService)

 

User

(Inherit from WebService)

15.1.3
HELP文档缩略图
图 84 help文档缩略图

[1] New Database:新建数据库。

[2] New Query:新建查询。

[3] Object Explorer:对象浏览器。

[4] Security:安全。

[5] 安装媒体为含有QzjCareer安装文件的光盘或者镜像文件。

[6] 系统中msdeploy的文件夹路径。

[7] JTemplate是基于JavaScript扩展库JQuery中的一个小插件。

[8] 即QzjCareer.WEB

[9] 校友录类型的网站。

[10] 用户在数据库中的唯一识别字符串。

阅读全文My Programstags  

硬盘里依旧存在的本科毕业设计

January 16, 2010 Views
Comments 0

本科毕业设计的系统操作文档部分= =。

和专科毕业设计一样, 全部代码自己写完。

这个东西由于毕业以后还没有架设, 于是在校内寻找能够接手的同学, 但是几次都因东西涉及对于本科生过于深奥而遗憾地遭到拒绝。

全文PDF下载:

 

杭州电子科技大学 计算机学院 计算机科学与技术专业

校园就业招聘系统

毕业设计软件使用说明

 

裘中杰

2009/6/5

您可能需要具有计算机专业知识才能够读懂该文档

1 安装及使用

1.1 架构选择

QzjCareer系统可运行在多种网络拓扑方式以及多种系统架构,选择需依据用户同时访问量及硬件性能而定。

1.2 单一服务器无虚拟化配置方案

clip_image002[9]

1‑1 单机架设

该方案适合访问量波动稳定,流量较小,硬件配置较好的单(双)核服务器。由单一的服务器上运行单一操作系统,同时在线QC核心服务,数据库服务,QCAPI服务,Email接口,SMS接口,QC信息队列服务,QC计划任务服务,QC扩展应用程序。

l 硬件配置最低要求:

l CPU: Intel Xeon 2.0G

l RAM: 4GB

l Disk Space: 1TB

1.3 单一服务器虚拟化配置方案

clip_image004[9]

1‑2 单个物理多个虚拟架设

图1‑2为假定的宿主机配置。在宿主机上的虚拟控制化设备中建立5个客户,如图1‑3。

clip_image006[9]

1‑3虚拟化内部客户机连接示意图

每个客户机分配虚拟网络的独立IP地址,通过NAT技术连接到宿主机的物理网络上。同时宿主机需要指定NAT上的应用程序服务端口对应内部虚拟主机的服务端口。在这个配置中,需要在虚拟交换机NAT映射设置物理网络80端口对应QzjCareer.WEB主机的WEB服务端口才能够接受外部的传入连接。

在该配置下的宿主机必须严格配置安全策略,当入侵进入宿主机时,他将轻易获得虚拟环境下的任何设备信息数据。

1.4 clip_image007[9]clip_image009[9]多个物理服务器架构方案

用到了多个服务器。最右边两个为WEB服务,分别连接内网和外网。其中外网到WEB服务使用动态分流将不同TCP SYN请求发送至相对空闲的WEB服务器上实现负载均衡。

内网架设3个MSSQL服务器,采用微软视窗数据中心服务器系统,构建数据库服务器群集。同时3个支持虚拟化技术的服务器运行多个QzjCareer.Portal处理数据。运行信息处理服务的服务器同样使用支持虚拟化的服务器,运行多个实例。

网内还有存放用户文件的文件服务器、供维护人员使用的终端。

构建分布式网络得应注意:

a) 不能与其他局域网络混杂在一起。例如Portal,MessageQueue等服务始终采用信任模式运行,当内部网络出现问题时,入侵者将可能直接操作Portal而窃取数据库内资料。

b) 如果无法实施物理网络隔离,则采用虚拟隔离。在没有条件架设单独的局域网时,可以将QC系统的各个服务期组建成VLAN或者VPN方式的局域网。在VPN方式下的局域网,连接必须启用对称加密的IPSec确保虚拟不容易被入侵。

1.5 数据库搭建

clip_image011[9]

1‑5 T-SQL文件

安装Microsoft SQL Server 2005或者以上版本,推荐使用Microsoft SQL Server 2008 以支持全部编录。

进入SQL管理工具,New Database[1]并设定期望的数据库参数和文件存放位置。

选择New Query[2]数据脚本,并导入数据库脚本文件,文件位置在InstallPacket\MSSQL Script目录下的CareerDataBase.Sql。

导入完成后,生成对应的数据库连接语句准备其他应用程序配置时使用。

值得注意的是,数据库默认情况下使用Windows验证方式。如果维护人员希望使用TCP登录方式,请右键管理工具中的Object Explorer[3]选择属性。在Security[4]选项卡中更改SQL允许的验证方式为SQL Server and Windows。完成后检查能够从外部该机的外部网络访问,如失败则检查防火墙设置。

1.6 核心模块安装

在需要安装PortalAPI接口的内网服务器上执行SetupQzjCareerCore.msi。

clip_image013[9] clip_image015[9]

clip_image017[9]

1‑6 Core安装

安装完成。依赖QzjCareer.Core库的组件便能够在该系统平台上运行。

1.7 系统接口安装

Portal内部接口依赖QzjCareer.Core库,未安装QzjCareer.Core库的系统平台上无法正确运行借口。

进入安装媒体[5]中的SetupQzjCareerPortal目录,依次执行以下步骤:

打开QzjCareer.Portal.parameters.txt文件。

设定QzjCareer.Portal_IisWebApplication的值为Portal在IIS中应用程序的名称。

设定QzjCareer.Portal_CareerDB_ConnectionString为数据库连接字符串。如果数据库存在数据需备份,安装Portal时将会清空之前的数据。

打开IIS管理工具,创建以修改QzjCareer.Portal_IisWebApplication后的值为名称的网站项目,并配置好基本信息,将。Net应用程序池的工作版本设置为4.0。

执行QzjCareer.Portal.deploy.cmd [/T|/Y]。如需得到参数说明,直接执行QzjCareer.Portal.deploy.cmd。(提示:首先确保当前执行安装的用户的环境变量里添加有msdeploy的path变量,如果不存在,请查阅相关Windows使用技巧,加入path变量中msdeploy的路径。或者维护人员也可以在命令行模式下执行set Path=%Path%;"C:\Program Files (x86)\IIS\Microsoft Web Deploy"[6])。

如果没有出现错误提示,安装就完成了。

打开http://localhost/ping.asmx检查是否可以正常访问。注意,Portal能够正常显示并不说明已正常连接到数据库。

1.7.1 短信、邮件、信息接口的安装

在需要使用QC短信邮件及信息处理的服务器上执行SetupQzjCareerSmsEmail\SetupQzjCareerSmsEmail.msi。

clip_image019[9]clip_image021[9]

1‑7 邮件、短信、信息接口安装

安装成功的操作系统平台将可处理QC中的短信邮件。

1.7.2 信息队列处理服务安装

QC信息队列处理服务主要处理事件中的短信和邮件发送,另外监视系统运行状态信息,记录警告和错误状态到数据库中,因此该服务的在线对整个系统至关重要,安装的系统需要能够与数据库快速地通信。

信息队列处理服务可以被安装在任何内部网络直接与数据库通信的操作系统平台上,一个操作系统只建议安装一个实例。

安装步骤:

进入安装介质中的SetupScheduleService目录执行Setup.Exe。

clip_image023[9]clip_image025[9]

1‑8 信息队列安装

安装完成后将在桌面创建一个名为“Install QzjCareer Message Queue Service”的快捷方式。双击运行。

出现提示“The Commit phase completed successfully.”即安装成功。

点击“开始”菜单的“运行”,输入Services.msc,找到QzjCareerDeamon服务,点击开始。

clip_image027[9]

1‑9 信息队列服务选项卡

1.7.3 用户交互应用程序安装与配置

用户交互界面的安装与Portal相似,安装媒体的SetupQzjCareerWeb目录下,运行QzjCareer.CareerWeb.deploy.cmd开始安装过程。需要注意的是,安装后要完成配置文件修改、网络配置,包括但不限于:

l 数据库连接字符串。

l 用户文件上传根文件夹。

l MachineKey SecretKey的设置,分布式状态下必须设置相同。

l 公用网络至QC网络服务端口NAT映射。

1.8 群集诊断检测工具的使用

在各QC内网主机上进行Portal的通讯测试,包括连接测试,访问测试,数据测试,功能测试。

clip_image029[9]clip_image031[9]

clip_image033[9]

1‑10 群集诊断工具

1.9 QC系统扩展插件配置

QC系统插件基于Portal内部接口,运行QC插件的系统平台上必须能够访问Portal接口。

配置方式参考样例程序“QC插件XiaoNei小工具”。

1.10 学生简历模板方案

突出系统个性化、人性化功能以及吸引学生主动参加招聘就业系统上与企业进行交互,系统中许多功能都是定制方便修改的。以最简单的学生简历模板作为介绍:

clip_image035[9]

1‑11 学生简历模板

交互应用程序目录~/Anony/StudentResumeSkins/下用于存放个性化的学生简历模板,维护员或者开发者能够在当前目录下建立以容易辨明模板类型的目录名称来存放模板文件。模板文件内容基于JTemplate[7]中定义规范。详细开发规范可以从QC开发手册中获得。

clip_image037[9]

1‑12 信息服务日志

短信日志包含短信发送状态信息、警告、错误。

clip_image039[9]

1‑13 短信服务日志

邮件日志包含邮件发送状态信息、警告、错误。

clip_image041[16]

1‑14 邮件日志服务

信息队列日志包含QzjCareer系统中各种事件的处理过程和结果信息。

clip_image043[9]

1‑15 系统事件日志服务

1.11 各节点参数独立配置方法

根据需求不同,维护人员可能希望两个交互应用程序运行在不同的环境中。例如,校园内部网络和校园外部网络,并且希望对其从不同网络位置访问的用户进行不同的限制。

使用独立参数配置可以解决类似问题。当交互应用程序[8]启动时,会试图读取其版本的初始化信息(该信息使用群集诊断工具配置,存放于数据库中)。读取的数据将用来覆盖应用程序web.config内基本配置信息。当然,除了数据库连接字符串之外,都可以被覆盖。

维护人员可以从群集诊断工具的使用中看到,QzjCareerVersion节配置信息。该节配置用来告诉数据库取何版本,何种类型应用程序的数据。样例中该交互应用程序QzjCareerVersion节点值为0.0001.7069,表示主版本号0,附版本号0001,应用程序参数组编号7069。

理解参数获得方式,维护人员便可以设置不同的参数组,修改应用程序下的节点配置以对应维护人员期望的目的。

1.12 软件环境相关问题

在组建该系统的任何应用时,务必注意使用的。Net Framework版本。该系统基于。Net Framework 4.0 Beta 1 架构,也是当前编写该文档前4天微软对全球公开的第一个测试版本。微软于去年开始开发Visual Studio 10,CLR 4.0,.Net 4.0以及AJAX Framework 4.0。

因此,有可能在微软。Net运行库产生未知错误与问题。系统内代码已对所有涉及当前版本已知的。Net平台BUG进行优化,但维护人员仍务必做好数据、错误日志的备份,以便及时应对未知状况。

2 系统诊断及维护

2.1 交互界面应用程序心跳

每个交互界面应用程序启动时都将提交其系统基本状态信息给Portal,并在预先设定的时间间隔持续发送数据。维护人员可以访问Portal的Ping GetServices中方法来查看当前在线以及最后在线应用程序的时间。

例如本地运行的交互界面应用程序,访问该方法后将返回XML数据如下:

<?xml version="1.0" encoding="utf-8" ?>

-<ArrayOfWebServer >

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">

- <WebServer>

<WebServerAddress>127.0.0.1</WebServerAddress>

<WebServerVersion>0.0001.7069</WebServerVersion>

<WebServerDomain>dd6576da-1-128874673611533984</WebServerDomain>

  <LastUpdateAt>2009-05-22T20:03:23.6309375+08:00</LastUpdateAt>

<Id>127.0.0.1</Id>

  <AddtionInformation>DEFID:WEB1|CLSID:0000-0000-0000-0000-FFFF-0001</AddtionInformation>

</WebServer>

</ArrayOfWebServer>

开发者可根据该接口开发状态监视及下线报警程序。

2.2 内部公开数据接口状态

任何对Portal接口访问的应用程序都应该在第一次启动或者访问时确认Portal能够正常访问,否则停止退出应用程序并间隔尝试。第一次访问时对Portal进行Ping下的HelloWorld方法访问,返回值和期望值相同时,启动后台线程持续进行AlivePing方法的访问。

同时,必须对后台线程使用守护进程或者异常处理,在任何导致线程退出的情况及时停止应用程序服务。

以上行为目的是为了保证在Portal接口不可用的情况下,不进行任何的业务操作,保证用户体验,确保Portal不会因下层应用程序单点的拒绝访问式攻击而瘫痪。

2.3 信息队列日志的查看

在信息队列处理服务的Windows系统平台上,维护人员能够在Windows系统管理工具的事件日志中查看服务状态以及服务所有进行的操作。日志分为四种,分别为:QzjCareer信息服务程序日志,短信日志,邮件日志,系统信息日志。

clip_image045[9]

2‑1 Windows系统日志

信息服务日志包含服务启动,暂停,停止状态记录和服务内部异常、停止警告等。

clip_image046[9]

图2‑2 信息服务日志

短信日志包含短信发送状态信息、警告、错误。

clip_image047[9]

图2‑3 短信服务日志

邮件日志包含邮件发送状态信息、警告、错误。

clip_image041[17]

图2‑4 邮件日志服务

信息队列日志包含QzjCareer系统中各种事件的处理过程和结果信息。

clip_image048[9]

图2‑5 系统事件日志服务

2.4 各节点参数独立配置方法

根据需求不同,维护人员可能希望两个交互应用程序运行在不同的环境中。例如,校园内部网络和校园外部网络,并且希望对其从不同网络位置访问的用户进行不同的限制。

使用独立参数配置可以解决类似问题。当交互应用程序[9]启动时,会试图读取其版本的初始化信息(该信息使用群集诊断工具配置,存放于数据库中)。读取的数据将用来覆盖应用程序web.config内基本配置信息。当然,除了数据库连接字符串之外,都可以被覆盖。

维护人员可以从群集诊断工具的使用中看到,QzjCareerVersion节配置信息。该节配置用来告诉数据库取何版本,何种类型应用程序的数据。样例中该交互应用程序QzjCareerVersion节点值为0.0001.7069,表示主版本号0,附版本号0001,应用程序参数组编号7069。

理解参数获得方式,维护人员便可以设置不同的参数组,修改应用程序下的节点配置以对应维护人员期望的目的。

2.5 软件环境相关问题

在组建该系统的任何应用时,务必注意使用的。Net Framework版本。该系统基于。Net Framework 4.0 Beta 1 架构,也是当前编写该文档前4天微软对全球公开的第一个测试版本。微软于去年开始开发Visual Studio 10,CLR 4.0,.Net 4.0以及AJAX Framework 4.0。

因此,有可能在微软。Net运行库产生未知错误与问题。系统内代码已对所有涉及当前版本已知的。Net平台BUG进行优化,但维护人员仍务必做好数据、错误日志的备份,以便及时应对未知状况。

3 插件开发

3.1 概述

QzjCareer系统依照分层,零耦合,分布处理的思想进行编写。因此开发人员可以在原有架构上编写简单的代码来增加新的功能。

例如:添加Weblog Metabase的新闻源支持将方便用户使用Windows Live Writer发布,修改,删除新闻。添加日历同步源,使用户在Outlook创建的内容显示在交互应用程序中,增加其访问就业招聘系统的频率及依赖性。提供个人订阅职位类型中的更新RSS订阅,使Windows Vista及以上版本用户在使用电脑时能够同时在侧边栏中观察各种新职位。等等。

3.2 样例程序

为了让开发人员能够快速,方便地编写QC系统上插件和扩展,这里提供一个样例程序。基于QC系统Portal(内网公开API)和“校内网”[10]两种API同步信息的样例,样例的源代码演示了访问QC Portal API的方法。

3.3 样例介绍

“校内网”是国内比较庞大的校友录网站,其功能及特点模仿国外Facebook交友网,共同拥有操作人性化,信息处理响应延迟低,功能全面,自定义性强等特点。在需求分析阶段的调查显示,无论在校学生、教师、已经参与工作的上班族注册该网站并不定时更新个人资料的群体占调查总人数的70%。按照预计发展,未来5年内如按照其现阶段的维护及功能更新,将会更大比例的学生、教师、企业工作人员使用其网站提供的功能。

“校内网”提倡使用实名制及真实个人信息,学校资料,工作资料。也提供类似Facebook网站的小工具功能,对外开放API接口,网站上的用户将能够使用小工具进行交互。

对QC系统而言,最关心其网站提供的个人信息,学校信息,以及工作单位信息的接口。QC可以使用其接口同步学校信息、个人爱好、个人照片、个人介绍,所有就读过的学校、工作单位、实习单位信息。

样例使用QC系统中Portal内部公开接口,不使用其他QC系统资源。

3.4 样例使用

clip_image050[9]

3‑1 开发IDE及工程文件

插件使用3个工程,分别为“校内网”的XML数据结构定义,“校内网”API封装类,QC在“校内网”交互界面呈现组成。

3.5 说明

插件的安装非常简单,将安装媒体/Plugins/Xiaonei/下文件复制到IIS应用程序目录下,关联80端口。注册“校内网”,申请开发者应用。

在开发者应用中填写应用程序的开发者信息、用户支持Email地址、客户服务电话、用户登录小工具转到的服务器地址、小工具界面呈现的协议标准、服务器IP地址等信息。

服务器应架设在因特网中,使“校内网”与用户能够直接访问。“校内网”实现小工具服务端与其通信的方式为:

当用户点击“校内网”的该小工具链接后,将转到小工具的服务器地址,同时地址中将附带用户在“校内网”中的识别信息。

小工具服务器提取用户浏览器访问地址中的参数信息,并在服务端访问“校内网”API接口,传入用户提交的识别信息,验证该用户是否合法。验证合法后继续访问相应“校内网”API接口读取用户数据进行相关操作。

最终在用户端页面呈现小工具服务器处理后的相关信息。

image

3‑2 “校内网”工具参数设置

图3‑2为“校内网”小工具配置页,Callback URL为用户从小“校内网”转入小工具页面首先将访问的地址,也可以理解为QzjCareer.XiaoNeiWeb所在服务器对外的访问地址和端口。图中应用的服务器IP地址在开发阶段可以不指明,作用是防止DNS欺骗造成数据被递交到入侵者期望的服务期。工具发布之后将只连接指定IP上的服务器。

image

3‑3 “校内网”小工具信息

应用程序的“关于”页面将显示API Key和Secret Key以及APPID,将这些信息更新至QC的“校内”插件中web.config的对应信息。如图3‑4所示:

App开始的配置字段分别对应“校内网”提供的应用程序数据。

QC_DetailUserId为插件在QC系统中的名称。该字段的值在QC插件开发约定中以PLUGIN_起始的字符串,长度不超过20个英文字符。

QC_DetailDescript字段用于描述该插件的功能。

Plugin_Version描述该插件版本号。

最后以QC_起始的两个字段分别为插件类型唯一识别ID和插件唯一ID。

clip_image056[9]

3‑4 QC插件扩展配置设置

clip_image058[9]

3‑5 Portal连接被拒绝提示

当今运行插件时,点击“校内网”该插件首页将出现如图3‑5所示错误。错误的描述为在127.0.0.1的地址7069端口访问被主动拒绝。7069为Portal服务的默认端口,通过推测,可能Portal没有处于运行状态或者到Portal服务的网络连接出现了问题。在检查后发现,没有启动Portal服务,开启Portal服务之后刷新“校内网”小工具页面,出现如图3‑6所示。

clip_image060[9]

3‑6 QC未绑定QC帐号时的页面显示

开启Portal服务器,初始页面如图。点击绑定帐号,

clip_image062[9]

3‑7 QC插件登录密码框

输入用户名和密码,选择帐号类型进行登录。

clip_image064[9]

3‑8 QC插件同步学校界面

图3‑8下半部分为“校内网”用户信息资料,QC插件通过读取“校内网”用户信息将其显示在页面上,用户只需选择剩余的就读时间,再单击“添加……”之后将同步到QC系统的个人资料中。

clip_image066[9]

3‑9 QC插件同步头像

该页用户可以同步“校内网”中的个人头像到QC系统中,同步过程由插件和“校内网”API完成。涉及文件服务器的配置问题及开发环境条件限制,样例版本不提供演示。

clip_image068[9]

3‑10 QC插件系统设置

clip_image070[9]

3‑11 QC插件系统设置AJAX完成

所有TAB组合在一个页面中并且使用AJAX无刷新,TAB切换的体验非常好。

clip_image072[9]

3‑12 QC插件同步实习、工具

同步实践、实习经历。图3‑12的下半部分为“校内网”已经存在的个人资料,同步到QC系统中时,仅需填写“校内网”没有提供的资料,例如职位、经历描述。

clip_image074[9]

3‑13 “校内网”个人资料

clip_image076[9]

3‑14 “校内网”个人资料工作信息

“校内网”的个人信息修改页面。可以发现QC插件之前同步到QC系统中的信息从当前的个人资料中的得到。

“校内网”会验证一些用户填写的基本资料,但并不是所有资料都是经过“校内网”人工确认的,所以通过到QC系统中的资料只能作为未验证的学生自主输入的信息。

clip_image078[9]

3‑15 “校内网”插件已经帮定帐号

当你再次进入这个小工具的页面时,将会看到原来显示为“绑定帐号”的按钮已经是“直接进入”了。这是由于,插件使用QC.Portal提供的自定义数据信息存放的API,可以在QC数据库写入任何属于该用户插件的自定义信息,同时也可以获得属于该用户插件的自定义信息以及部分个人系统资料信息。

3.6 开发原则

总体而言,Portal提供了绝大部分对就业招聘系统操作方法。同时也提供额外的插件数据存放读取空间。这些空间对于开发者来说是没有限制的,但是应该合理利用这些资源,临时的数据必须标记系统可删除它的周期,单位可以是分钟,小时,天等等。不考虑资源的充分利用及回收,再多的分布式数据库也只能得到较低的性能发挥。

插件中的应用程序安全性是至关重要的一个环节,QC.Portal中的绝大部分操作要求参数传入当前用户的识别号[11]。即便如此,开发者也应在交互应用程序上就判断用户的合法性,防止A用户欺骗交互应用程序而得到B用户的操作权限。 同时避免频繁使用Portal造成不必要的资源开销和非事务处理数据库数据的冲突发生。

3.7 异常处理

Portal内部公开接口中错误的发生将以异常形式抛出并返回,交互应用程序需要主动捕获异常并执行相应的清理资源操作。提交数据前对数据进行必要的格式、范围、类型检查,避频繁引发异常。

在开发新的信息处理服务需考虑可能出现的异常以及灾难恢复机制。必要时创建守护进程。


[1] New Database:新建数据库。

[2] New Query:新建查询。

[3] Object Explorer:对象浏览器。

[4] Security:安全。

[5] 安装媒体为含有QzjCareer安装文件的光盘或者镜像文件。

[6] 系统中msdeploy的文件夹路径。

[7] JTemplate是基于JavaScript扩展库JQuery中的一个小插件。

[8] 即QzjCareer.WEB

[9] 即QzjCareer.WEB

[10] 校友录类型的网站。

[11] 用户在数据库中的唯一识别字符串。

阅读全文My Programstags  

翻出来的专科毕业论文.

January 16, 2010 Views
Comments 0

 

很久以前专科毕业时候为申报一课题时候的毕业论文.

全文PDF下载: 

 

摘要... I

Abstract II

引言... III

第一章 HOHO``系统概述... 1

第二章 HOHO``系统需求分析... 2

第三章 数据库设计... 3

3.1 学生专业(Nov30th_ZhuanYe). 3

3.2 社团成员职务(Nov30th_ZhiWu). 3

3.3 学生旷课(Nov30th_Truant). 3

3.4 系统加载信息(Nov30th_SysOpt). 4

3.5 学生科目(Nov30th_Subject). 4

3.6学生服务列表(Nov30th_StudentSerivceList). 5

3.7 学生服务(Nov30th_Service). 5

3.8 学生奖惩(Nov30th_Rewards). 5

3.9 学生关系(家长)详细(Nov30th_Relation). 6

3.10 专业公告(Nov30th_PMessage_ZhuanYe). 7

3.11 班级公告(Nov30th_PMessage_Class). 7

3.12 社团私人信息(Nov30th_PersonalMessages). 7

3.13 社团公告消息(Nov30th_OrganMessages). 8

3.14 社团信息(Nov30th_Organ). 8

3.15 教师与学生消息(Nov30th_Messages). 9

3.16 社团成员(Nov30th_Members). 9

3.17 学生成绩(Nov30th_Mark). 10

3.18 学生登陆记录(Nov30th_Login). 10

3.19 科目教师关系(Nov30th_Lessions). 11

3.20 社团活动消息(Nov30th_HuoDongMessages). 11

3.21社团活动(Nov30th_HuoDong). 12

3.22 综合评测数据(Nov30th_Evaluating_JYXY). 12

3.23学生详细信息(Nov30th_Detail). 13

3.24 智能课程表(Nov30th_Curriculum). 14

3.25 学生班级(Nov30th_Class). 14

3.26 社团分类(Nov30th_Category). 14

3.27 社团部门(Nov30th_BuMen). 15

3.28 系统管理员(教师)(Nov30th_Admin). 15

3.29 数据库视图... 16

第四章 系统功能模块设计... 22

4.1主登陆模块... 22

4.2管理员模块... 22

4.2.1 管理员设置... 23

4.2.2 发送消息... 23

4.2.3 专业管理... 24

4.2.4修改班级... 25

4.2.5 课程管理... 26

4.2.6 成绩管理... 26

4.2.7 家长管理... 27

4.2.8 学生资料... 27

4.2.9 请假管理... 28

4.2.10奖惩管理... 28

4.2.11 发送通知... 29

4.2.12 综合评测... 30

4.2.13 密码管理... 30

4.2.14 为您服务... 31

4.3 管理员插件部分... 31

4.3.1 社团管理... 31

4.3.2 社团消息... 32

4.4 统计模块... 32

4.5 学生模块... 33

4.5.1 个人消息... 33

4.5.2 综合评定... 34

4.6 手机访问模块... 35

4.7 社团模块... 36

4.7.1 我的社团... 36

4.7.2 我的消息... 37

4.7.3 退出社团... 37

4.7.4 加入社团... 37

4.7.5 系统消息... 38

4.7.6 社团管理... 38

第五章 系统功能实现... 41

5.1 检查是否学生在一专业中的类... 41

5.2 数据库连接基类... 42

5.3 手机WAP访问类... 45

5.4 社团控制类... 48

5.5 社团成员操作类... 56

5.6 社团消息操作类... 59

5.7 公共权限检查类... 63

5.8 安全检查类... 66

5.9 学生信息操作类... 70

5.10 系统插件类... 75

5.11 Asp.Net 全局操作文件... 76

5.12 根目录web.config 文件内容... 78

第六章 系统测试... 82

论文小结... 83

致谢... 84

文献综述... 85

摘要

HOHO``系统采用ASP.NET与SQLEXPRESS数据库设计。工作在.Net Framework2.0 上的WEB应用程序。

系统作为一个校园WEB系统,向学生,家长,教师等提供方便快捷的互动与管理。该系统以安全最先,效率其次,可维护性,可扩展性的原则设计。采用双层验证。所有涉及数据的界面均采用AJAX技术。提供手机访问支持以及插件功能支持。基于Middleware 基准测试规范系统中没有使用存储过程。

硬件需求:IIS服务器支持.Net Framework 2.0,SQL Express数据库或者更高版本。

关键词:校园,HOHO``,互动,社团,管理,学生。

Abstract

The system adopts ASP.NET and SQLEXPRESS database design.The work is in the .Net Framework2.0The last WEB applies procedure.

The system is a campus WEB system, to the student, parent, teacher's etc. provides convenient fast interaction and the management. That system the safety is earliest, the efficiency can support sex secondly, can expand a sexual principle design. The adoption double layer verifies. All interfaces which involve a data all adopt an AJAX technique. The interview of providing the cellular phone supports and the plug-in function support. Has no usage in the norm system according to the Middleware basis test saving process.

Hardware need: The support.Net Framework of the IIS server 2.0, the database of SQL Express or higher edition

Keywords: Campus, HOHO``, Interaction, consortium, manage, student.

引言

随着互联网络的发展和普及,信息时代已经完全降临。作为一个学校,必须有她自己独立的信息处理系统和互动系统。HOHO`` 系统是按照求是应用技术学院当前的管理体制和分配制度开发的。为了可以让更多没有独立信息系统的学校来使用该系统,预留了多种扩展方式。以满足不同需求。

该系统工作于.Net 平台上。所有HTML代码完全符合W3C XHTML 1.1 过渡规范。支持FF,IE7等符合W3C所有浏览器。安全性是当前互联网中系统最重要的考虑因素,HOHO``系统使用Form和Session双重验证。最大限度保证用户的用户登录的合法性及系统的安全性。接着往下看,你将会了解该系统如何工作的。

第一章 HOHO``系统概述

HOHO`` 系统能实现学校,家长,学生的互动。系统中有学生成绩管理,社团成员管理,综合评测统计,通知发布,学生互动交流等许多实用的功能。

HOHO`` 系统能节省大量,复杂的人力物力资源。一切成绩统计只需在网络上进行。该系统支持内网与外网安全设置,可以让学校内网和外网同时存在的情况下,控制外网访问的权限,保证系统的安全。

HOHO`` 系统采用ASP.NET,具有很好的扩展性,一个学校使用网络进行所有的管理,即可标志该学校的整个体制的改变。今后的几年,预计所有的学校都会使用信息化的管理。通过互联网进行管理和操作是大势所趋。

系统运行需要支持.net Framework 2.0 的 IIS 以及SQLEXPRESS数据库。

第二章 HOHO``系统需求分析

考虑到现在学生群体庞大,学校以学生为中心的各项管理增多,管理难度加大,HOHO``系统以学生管理系统为原型,针对现有的管理问题,开辟学生平台,教师平台,社团平台和学生会平台。主要满足学生能自主查询各项成绩等相关信息的功能,本系统考虑到查询信息的灵活性,还加入了手机查询模块,方便了学生及时快速的了解到自己的成绩。系统将动态的显示学生的各项评比情况,例如每学年一次的综合评定。在社团平台由学生直接参与讨论及管理。教师方面将赋予老师一定的权限,进行成绩管理和信息发布。教师和学生间平时缺少沟通也是普遍存在的问题,本系统中,教师和学生之间可以通过message形式进行沟通,促进了师生间的互动。

第三章 数据库设计

数据库名:C:\INETPUB\WWWROOT\APP_DATA\STUDENT.MDF

3.1 学生专业(Nov30th_ZhuanYe)

表3.1 学生专业表(Nov30th_ZhuanYe)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

Name

varchar

50

0

         

3

Memo

varchar

255

0

         

3.2 社团成员职务(Nov30th_ZhiWu)

表3.2 社团成员职务表(Nov30th_ZhiWu)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ZhiWuID

int

4

0

     

2

ZhiWuName

varchar

20

0

         

3

ZhiWuMemo

varchar

50

0

         

4

OrganID

int

4

0

         

3.3 学生旷课(Nov30th_Truant)

表3.3 学生旷课表(Nov30th_Truant)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

StudentID

int

4

0

         

3

Date

datetime

8

3

         

4

SubjectName

nvarchar

40

0

   

   

5

Reason

varchar

50

0

   

   

6

Times

smallint

2

0

     

((0))

 

7

Memo

varchar

50

0

   

   

8

IsAFK

bit

1

0

     

((0))

 

3.4 系统加载信息(Nov30th_SysOpt)

表3.4 系统加载信息(Nov30th_SysOpt)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

OptName

nvarchar

20

0

         

3

OptValue

int

4

0

   

   

4

OptChar

nvarchar

100

0

   

   

5

CorV

bit

1

0

         

6

Memo

nvarchar

100

0

         

3.5 学生科目(Nov30th_Subject)

表3.5 学生科目(Nov30th_Subject)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

SubjectID

int

4

0

     

2

Name

varchar

50

0

         

3

ZhuanYe

int

4

0

         

4

Credit

float

8

0

         

5

RuXue

smallint

2

0

     

((2000))

 

6

Term

tinyint

1

0

     

((1))

 

7

Memo

varchar

255

0

   

   

8

Category

smallint

2

0

     

((0))

 

3.6学生服务列表(Nov30th_StudentSerivceList)

表3.6 学生服务列表(Nov30th_StudentServiceList)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ServiceID

int

4

0

     

2

ServiceName

varchar

20

0

         

3

ServiceCat

int

4

0

         

4

Context

varchar

6000

0

         

5

ZhuanYeID

int

4

0

         

6

Memo

varchar

6000

0

         

7

Year

smallint

2

0

         

3.7 学生服务(Nov30th_Service)

表3.7 学生服务(Nov30th_Service)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

StartTime

datetime

8

3

 

     

2

SourceAdd

varchar

50

0

         

3

Status

bit

1

0

         

4

FromIP

char

15

0

         

3.8 学生奖惩(Nov30th_Rewards)

表3.8 学生奖惩(Nov30th_Rewards)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

Date

datetime

8

3

         

3

StudentID

int

4

0

         

4

Subject

varchar

100

0

         

5

Rank

varchar

50

0

         

6

Degree

varchar

50

0

     

('?')

 

7

Memo

char

1000

0

         

8

Disposal

bit

1

0

     

((0))

 

9

Term

tinyint

1

0

     

((1))

 

10

Score

float

8

0

     

((0))

 

11

Category

smallint

2

0

     

((0))

 

3.9 学生关系(家长)详细(Nov30th_Relation)

表3.9 学生关系(家长)详细(Nov30th_Relation)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

StudentID

int

4

0

         

3

Name

varchar

50

0

         

4

Sex

bit

1

0

         

5

Birthday

datetime

8

3

     

(((2000)-(1))-(1))

 

6

Relation

varchar

50

0

         

7

Address

varchar

50

0

   

   

8

Cellphone

varchar

50

0

   

   

9

Telephone

varchar

50

0

   

   

10

Fax

varchar

50

0

   

   

11

Zipcode

varchar

50

0

   

   

12

Company

varchar

50

0

   

   

13

Memo

varchar

255

0

   

   

14

Password

char

32

0

     

('81dc9bdb52d04dc20036dbd8313ed055')

 

3.10 专业公告(Nov30th_PMessage_ZhuanYe)

表3.10 专业公告(Novth30th_Pmessage_ZhuanYe)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

AdminName

varchar

20

0

         

3

ZhuanYeID

int

4

0

         

4

ExpDate

datetime

8

3

         

5

PubDate

datetime

8

3

         

6

Context

text

16

0

         

7

Tip

varchar

50

0

         

3.11 班级公告(Nov30th_PMessage_Class)

表3.11 班级公告(Nov30th_Pmessage_Class)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

AdminName

varchar

20

0

         

3

ClassID

int

4

0

         

4

ExpDate

datetime

8

3

         

5

PubDate

datetime

8

3

         

6

Context

text

16

0

         

7

Tip

varchar

50

0

         

3.12 社团私人信息(Nov30th_PersonalMessages)

表3.12 社团私人信息(Nov30th_PersonlMessages)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

MessageID

int

4

0

     

2

SendStudentID

int

4

0

         

3

ReceiveStudentID

int

4

0

         

4

IsRead

bit

1

0

         

5

MessageContext

varchar

255

0

         

6

SendTime

smalldatetime

4

0

         

7

MessageSign

tinyint

1

0

         

3.13 社团公告消息(Nov30th_OrganMessages)

表3.13 社团公告信息(Nov30th_OrganMessages)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

MessageID

int

4

0

     

2

SendStudentID

int

4

0

   

   

3

OrganID

int

4

0

         

4

AIMTpye

bit

1

0

         

5

BuMenID

int

4

0

         

6

ZhiWuID

int

4

0

         

7

MessageContext

varchar

255

0

         

8

SendTime

smalldatetime

4

0

         

3.14 社团信息(Nov30th_Organ)

表3.14 社团信息(Nov30th_Organ)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

OrganID

int

4

0

     

2

OrganName

varchar

50

0

         

3

OrganIntro

varchar

255

0

         

4

People

int

4

0

         

5

OrganCharge

int

4

0

         

6

OrganCreateTime

smalldatetime

4

0

         

7

OrganTeacher

varchar

10

0

         

8

CatID

int

4

0

         

9

IsActive

bit

1

0

         

10

OrganMemo

varchar

7000

0

         

3.15 教师与学生消息(Nov30th_Messages)

表3.15 教师与学生消息(Nov30th_Messages)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

AdminName

varchar

20

0

         

3

StudentID

int

4

0

         

4

SendDate

datetime

8

3

         

5

RecvDate

datetime

8

3

   

   

6

StuRead

bit

1

0

   

((0))

 

7

TeaRead

bit

1

0

   

((0))

 

8

ExpDate

datetime

8

3

         

9

TeaContext

varchar

8000

0

   

   

10

StuContext

varchar

8000

0

   

   

3.16 社团成员(Nov30th_Members)

表3.16 社团成员表(Nov30th_Members)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

MemberID

int

4

0

     

2

MemberStudentID

int

4

0

         

3

NickName

varchar

12

0

         

4

Contact

varchar

50

0

         

5

OrganID

int

4

0

         

6

ZhiWuID

int

4

0

         

7

BuMenID

int

4

0

         

8

JoinTime

smalldatetime

4

0

         

9

IsReg

bit

1

0

         

10

RegMemo

varchar

50

0

         

3.17 学生成绩(Nov30th_Mark)

表3.17 学生成绩表(Nov30th_Mark)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

Date

datetime

8

3

         

3

StudentID

int

4

0

         

4

SubjectID

int

4

0

         

5

Normal

float

8

0

   

((0))

 

6

Repair

float

8

0

   

((0))

 

7

MakeUp

float

8

0

   

((0))

 

8

Term

smallint

2

0

   

((1))

 

9

Overall

float

8

0

   

((0))

 

10

GetCredit

float

8

0

   

((0))

 

3.18 学生登陆记录(Nov30th_Login)

表3.18 学生登陆记录(Nov30th_Login)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

StudentID

int

4

0

 

     

2

Password

nvarchar

64

0

         

3

NickName

nvarchar

40

0

         

4

Count

int

4

0

         

5

LastLogin

datetime

8

3

         

6

LastIP

nvarchar

30

0

         

3.19 科目教师关系(Nov30th_Lessions)

表3.19 科目教师关系表(Nov30th_lessions)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

Name

varchar

50

0

         

3

Teacher

varchar

10

0

         

4

SubjectID

int

4

0

         

5

ClassID

int

4

0

         

3.20 社团活动消息(Nov30th_HuoDongMessages)

表3.20 社团活动消息(Nov30th_HuoDongMessages)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

MessageID

int

4

0

     

2

HuoDongID

int

4

0

         

3

SendStudentID

int

4

0

         

4

SendTime

smalldatetime

4

0

         

5

MessageContext

varchar

255

0

         

6

MessageSign

tinyint

1

0

         

3.21社团活动(Nov30th_HuoDong)

表3.21 社团活动表(Nov30th_HuoDong)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

HuoDongID

int

4

0

     

2

SignUpTime

smalldatetime

4

0

         

3

BeginTime

smalldatetime

4

0

         

4

EndTime

smalldatetime

4

0

         

5

Place

varchar

50

0

         

6

People

int

4

0

         

7

OrganID

int

4

0

         

8

Context

varchar

255

0

         

9

Title

varchar

20

0

         

10

Intro

varchar

50

0

         

11

Money

int

4

0

         

12

Category

int

4

0

         

13

InReg

bit

1

0

         

14

RegMemo

varchar

50

0

         

3.22 综合评测数据(Nov30th_Evaluating_JYXY)

表3.22 综合评测数据(Nov30th_Evaluting_JYXY)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

StudentID

int

4

0

         

3

D1

float

8

0

         

4

D2

float

8

0

         

5

D3

float

8

0

         

6

D4

float

8

0

         

7

Z1

float

8

0

         

8

Z2

float

8

0

         

9

T1

float

8

0

         

10

T2

float

8

0

         

11

T3

float

8

0

         

12

A

float

8

0

         

13

F

float

8

0

         

14

Term

tinyint

1

0

         

15

Publish

bit

1

0

         

3.23学生详细信息(Nov30th_Detail)

表3.23 学生详细信息(Nov30th_Detail)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

StudentID

int

4

0

 

     

2

Name

varchar

50

0

         

3

FamilyAdd

varchar

80

0

         

4

Contact

varchar

100

0

         

5

Dormitory

varchar

50

0

         

6

IsPM

tinyint

1

0

     

((0))

 

7

Birthday

smalldatetime

4

0

         

8

Address

varchar

50

0

         

9

CellPhone

varchar

50

0

         

10

Password

char

32

0

         

11

ZhuanYe

int

4

0

     

((0))

 

12

RuXue

smallint

2

0

         

13

Sex

bit

1

0

     

((0))

 

14

LoginLevel

tinyint

1

0

     

((100))

 

15

ClassID

int

4

0

     

((0))

 

3.24 智能课程表(Nov30th_Curriculum)

表3.24 智能课程表(Nov30th_Curriculum)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

Week

tinyint

1

0

     

((0))

 

3

Lweek

bit

1

0

     

((0))

 

4

ClassID

int

4

0

     

((0))

 

5

Name

varchar

20

0

         

6

Address

varchar

50

0

         

7

BeginTime

datetime

8

3

         

8

EndTime

datetime

8

3

         

9

Memo

varchar

255

0

     

('?б?')

 

10

LessionID

int

4

0

   

((0))

 

3.25 学生班级(Nov30th_Class)

表3.25 学生班级表(Nov30th_Class)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

ClassName

varchar

50

0

         

3

ZhuanYe

int

4

0

         

4

Master

varchar

10

0

   

   

5

Contact

varchar

20

0

         

6

Term

tinyint

1

0

     

((0))

 

7

RuXue

smallint

2

0

     

((0))

 

3.26 社团分类(Nov30th_Category)

表3.26 社团分类(Nov30th_Category)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

CatID

int

4

0

     

2

CatName

varchar

20

0

         

3

CatMemo

varchar

50

0

         

3.27 社团部门(Nov30th_BuMen)

表3.27 社团部门(Nov30th_BuMen)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

BuMenID

int

4

0

     

2

BuMenName

varchar

20

0

         

3

BuMenMemo

varchar

50

0

         

4

OrganID

int

4

0

         

3.28 系统管理员(教师)(Nov30th_Admin)

表3.28 系统管理员(教师)(Nov30th_Admin)

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

字段说明

1

ID

int

4

0

     

2

Name

varchar

50

0

         

3

Password

char

32

0

         

4

level

tinyint

1

0

         

5

Memo

varchar

255

0

         

6

Question

varchar

50

0

   

   

7

Answer

varchar

50

0

   

   

8

Email

varchar

100

0

   

   

9

CellPhone

varchar

50

0

         

10

LastLogin

smalldatetime

4

0

         

11

LoginTimes

int

4

0

     

((0))

 

12

Actived

bit

1

0

         

13

ZhuanYeID

int

4

0

     

((0))

 

3.29 数据库视图

各功能视图如下

clip_image002

图3.1 私人消息视图

clip_image004

图3.2班级公告视图

clip_image006

图3.3 专业公告视图

clip_image008

图3.4 学生家长信息视图

clip_image010

图3.5 奖惩视图

clip_image012

图3.6 学生详细信息视图

clip_image014

图3.7 科目视图

clip_image016

图3.8 学生基本信息视图

clip_image018

图3.9 班级信息视图

clip_image020

图3.10 成绩视图

clip_image022

图3.11课程视图

clip_image024

图3.12 成绩视图

clip_image026

图3.13 社团成员信息视图

clip_image028

图3.14 学生所在社团视图

clip_image030

图3.15 学生收发消息视图

clip_image032

图3.16 社团消息视图

第四章 系统功能模块设计

4.1主登陆模块

登陆界面,在这里可以输入管理员用户名或者学号进行登陆,由系统自动判断用户类型。输入错误,均会出现clip_image034或者clip_image036的提示。

clip_image038

图4.1 系统登陆界面

使用超级管理员的身份登陆之后,出现后台操作界面。其中系统设置是针对整个网站的安全性进行配置。可以选择是否允许学校或者家长登陆,是否只在学校内网使用等。安全模式用于系统处理批量数据时,防止学生或者教师操作冲突,可以暂停数据服务。停止服务则是关闭整个网站服务系统。

4.2管理员模块

clip_image040

图4.2 管理员模块

4.2.1 管理员设置

管理员设置中,超级管理员(等级255)可以添加或者删除所有管理员(除本身)。该页面只有超级管理员能够访问。管理员必须对应一个学校的专业。有且只有一个。

clip_image042

图4.3 管理员设置

4.2.2 发送消息

教师可以与学生通过类似留言的方式交流。主要面向与发送个人通知,事物之类的消息。学生可以回复教师的消息,但只能回复一次。该功能只有超级管理员能够使用。

clip_image044

图4.4 发送消息

4.2.3 专业管理

该设置是使用这个系统的前提,所有数据分配都按照专业级别划分,其中的专业中应该包含入学时间,比如04届计算机专业。每个管理员都对应一个专业。在这里可以编辑,添加专业。

clip_image046

图4.5 专业管理

如同其他页面一样,都采用了AJAX技术。页面无刷新编辑。

clip_image048

图4.6 专业信息

(a) 科目管理。这里查看已经有的科目及对应的教师。也可以编辑科目信息。

clip_image050

图4.7 科目管理

点“编辑”按钮之后可以直接进行科目编辑。(AJAX)

clip_image052

图4.8 科目详细

(b) 添加科目。在这里页面可以用来添加学校的科目,课程。

clip_image054

图4.9 添加科目

点“科目类别说明”可以看到有关与综合评测的项目已经必须遵循的规定。

clip_image056

图4.10 科目管理说明

4.2.4修改班级

这里将显示该管理员相对应的专业中所有的班级,该页面提供编辑班级,添加班级信息的功能。

clip_image058

图4.11 班级管理

4.2.5 课程管理

一个学校不可能一个教师上所有同样的课程,于是必须要多个教师对应一个课程。

clip_image060

图4.12 课程管理

4.2.6 成绩管理

这里添加学生的成绩。作为辅助。主要途径是用插件或者其他工具进行批量数据库录入。

clip_image062

图4.13 成绩管理

4.2.7 家长管理

查询,修改和录入学生家长的信息。方便教师和学生家长沟通。可以根据多个条件搜索学生的家长信息。

clip_image064

图4.14 家长管理

4.2.8 学生资料

学生信息的加添和修改页面。作为辅助。主要用插件或者其他工具将学生信息批量录入数据库。

clip_image066

图4.15 学生资料

4.2.9 请假管理

录入和查询学生的请假旷课信息。

clip_image068

图4.16 请假管理

4.2.10奖惩管理

添加修改删除奖惩信息。会作用到最后的综合评定。

clip_image070

图4.17 奖惩管理

4.2.11 发送通知

该页面用于发送班级通知和专业通知,所属的学生登陆之后都能看到该通知的内容。

clip_image072

图4.18 发送通知界面

4.2.12 综合评测

综合评测的统计和查看,输入学生学号后,系统将根据学生的所有评测联系项目进行统计评分。页面中的评测统计按照2002年求是应用技术学院学生手册公式计算。

clip_image074

图4.19 综合评测发布

4.2.13 密码管理

管理员用于重新设置自己的账户密码。

clip_image076

图4.20 管理密码

4.2.14 为您服务

学生界面的菜单修改。当学生点击该菜单中的一个项目时,将用整个网页显示该菜单所包含的内容。即通知。菜单可以为不同专业的学生显示不同的内容。

clip_image078

图4.21 为您服务界面

管理员界面顶部菜单,有退出系统和插件部分的功能。默认情况下,系统中有2个插件,分别为社团管理和系统消息,是针对社团模块的控制。

clip_image080

图4.22 顶部菜单

4.3 管理员插件部分

4.3.1 社团管理

创建,批准,修改社团信息。

clip_image082

图4.23 社团管理

4.3.2 社团消息

修改社团模块的系统消息。

clip_image084

图4.24 社团系统消息

4.4 统计模块

用于比较和统计学生的成绩。管理员登陆之后,首先要进行统计的专业及班级设置。

clip_image086

图4.25 统计模块之第一步

clip_image088

图4.26 统计模块之第二步

clip_image090

图4.27 统计完成

班级中分数统计,每一项科目中有该班级中最高,最低,和平均分统计。

clip_image092

图4.28 成绩统计

4.5 学生模块

以学生身份登陆之后,出现学生的操作界面。默认界面是专业和班级的通知。

clip_image094

图4.29 学生模块

4.5.1 个人消息

用于存放教师发送给学生的信息,可以回复一次。

clip_image096

图4.30 个人消息

4.5.2 综合评定

当给学生综合评定完毕后,选择了发布,该生就能从学生界面看到每个学期的综合评定。

clip_image098

图4.31个人综合评定

以下三项分别可以查询该生登陆对应的学生成绩,旷课请假,奖励惩罚信息。

clip_image100

图4.32 菜单

clip_image102

图4.33 奖惩情况

4.6 手机访问模块

手机访问该系统时,会自定定为到手机页面。页面编码全采用手机浏览器规范。

clip_image104

图4.34 手机访问界面

选中成绩查询可以进入学生登陆界面。

clip_image106

图4.35 手机登陆系统界面

填写学号和密码后登陆。显示查询成绩界面。

可以选择更换学生登陆(方便用一个手机查询N个学生成绩)或者返回主界面(使用其他功能)。选择要查询的学期成绩和科目的关键字(词)。

clip_image108

图4.36 手机查询界面

选择学期和输入科目关键字查询,关键字为空查询该学期所有科目成绩。选择第一学期后,关键字留空,出现以下界面。有多个结果将会分页显示。

clip_image110

图4.37 查询结果

4.7 社团模块

登陆社团操作界面,显示如下界面。默认主画面显示所有存在的社团。

clip_image112

图4.38 社团界面

4.7.1 我的社团

显示已经加入的社团,点击后可以在右边显示该社团的详细信息。

clip_image114

图4.39 我的社团

4.7.2 我的消息

有个人消息项,点击后可以发送和接收个人消息。类似短消息。

clip_image116

图4.40 社团里个人消息

4.7.3 退出社团

退出社团功能用于当学生不再想参加一个社团时,可以自主退出该社团。该操作不能撤销。

clip_image118

图4.41 推出社团

4.7.4 加入社团

申请想加入的社团,经社团的管理员批准后并设定相应的职位部门后,即可成为社团成员。

clip_image120

图4.42 加入社团

右上有一行快捷操作。快捷定位到常用的操作界面。

clip_image122

图4.42 快捷定位

1. 成绩查询:转到学生成绩查询界面。

2. 系统消息:显示管理员用插件设定的系统消息。

3. 我的消息:显示该学生接收的所有消息。

4. 社团管理:显示可以管理的社团,选择相应的社团可以进行详细的操作。

5. 帮 助:社团的操作帮助。

6. 退 出:退出学生登陆。

4.7.5 系统消息

显示一些重要的通知。

clip_image124

图4.43 显示系统重要通知的界面

4.7.6 社团管理

选择后出现详细的每一项可管理项。

clip_image126

图4.44 社团管理

(a) 验证加入成员

社团管理人员在这里通过或者拒绝提出加入社团的成员请求。

clip_image128

图4.45 验证新进成员

(b) 社团信息维护

上传社团标志。

clip_image130

图4.46 上传社团标志

(c) 成员管理

重新调整社团成员职务和部分或者踢出社团成员。

clip_image132

图4.47 社团成员管理

(d) 结构管理

调整社团的整体结构。删除,添加。

clip_image134

图4.48 社团结构调整

第五章 系统功能实现

5.1 检查是否学生在一专业中的类

ChkStuInZY.cs

public class ChkStuInZY : IDisposable

{

private int ZYid;

private SqlConnection conn = new SqlConnection();

private SqlCommand cmd = new SqlCommand();

public ChkStuInZY(int zhuanYeID)

{

conn.ConnectionString = ConfigurationManager.ConnectionStrings["StudentConnectionString"].ConnectionString;

conn.Open();

cmd.Connection = conn;

ZYid = zhuanYeID;

}

public int IsStuidINzy(int studentId)

{

//判断StudentID是否在指定的专业ID里

cmd.Parameters.Clear();

cmd.CommandText = "SELECT TOP 1 [StudentID] FROM [Nov30th_Detail] WHERE [ZhuanYe]=@zhuanye AND [StudentID]=@studentid";

cmd.Parameters.Add("@zhuanye", SqlDbType.Int).Value = ZYid;

cmd.Parameters.Add("@studentid", SqlDbType.Int).Value = studentId;

return Convert.ToInt32(cmd.ExecuteScalar());

}

5.2 数据库连接基类

ConnectDB.cs

public class ConnectDB : IDisposable

{

private SqlConnection conn = new SqlConnection();

private SqlCommand cmd = new SqlCommand();

public SqlCommand Cmd

{

get { return cmd; }

set { cmd = value; }

}

private SqlDataReader reader;

public SqlDataReader Reader

{

get { return reader; }

set { reader = value; }

}

private bool isConn;

public bool IsConn

{

get { return isConn; }

}

private bool doNotReplaceCmd;

public bool DoNotReplaceCmd

{

get { return doNotReplaceCmd; }

set { doNotReplaceCmd = value; }

}

public ConnectDB()

{

conn.ConnectionString = ConfigurationManager.ConnectionStrings["StudentConnectionString"].ConnectionString;

{

conn.Open();

cmd.Connection = conn;

isConn = true;

}

/// <summary>

/// Create Reader

/// </summary>

/// <param name="strcmd">SQL Command</param>

/// <returns>Is success</returns>

public bool ExeReader(string strcmd)

{

bool isSuccess = false;

if (!isConn)

return false;

try

{

cmd.CommandText = strcmd;

reader = cmd.ExecuteReader();

isSuccess = true;

}

catch

{

//do something

}

return isSuccess;

}

/// <summary>

/// 检查管理员的用户名和MD5密码,并更新登陆次数

/// </summary>

/// <param name="strusername">用户名</param>

/// <param name="strpassword">MD5加密后的密码</param>

/// <returns>

/// -1 处理错误

/// -2 输入的数据不符合要求

/// 0 用户名或者密码错误

/// 1 用户名和密码正确

/// </returns>

public int CheckAP(string strusername, string strpassword)

{

int retval = -1;

if (strusername.Length < 4 || strpassword.Length != 32)

return -2;

cmd.CommandText = "update [Admin] set [LoginTimes] = [LoginTimes] + 1 where [Name] = @username and [Password] = @password";

cmd.Parameters.Clear();

cmd.Parameters.Add("@username", SqlDbType.VarChar, 50).Value = strusername;

cmd.Parameters.Add("@password", SqlDbType.VarChar, 32).Value = strpassword;

retval = cmd.ExecuteNonQuery();

return retval;

}

/// <summary>

/// Create Reader Without Command

/// </summary>

/// <returns>是否创建Reader成功</returns>

public bool ExeReader()

{

bool isSuccess = false;

if (!isConn)

return false;

try

{

reader = cmd.ExecuteReader();

isSuccess = true;

}

catch

{

//do something

}

return isSuccess;

}

5.3 手机WAP访问类

MobileStudentClass.cs

/// <summary>

/// Can Login With StudentId And Password?

/// </summary>

/// <param name="passWord">Password Without MD5 HASH</param>

/// <returns>LoginLevel</returns>

public int StudentLogin(string passWord)

{

object retSql;

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT TOP 1 [LoginLevel] FROM [Nov30th_Detail] WHERE [StudentID]=@stuid AND [Password]=@pwd";

Cmd.Parameters.Add("@stuid", SqlDbType.Int).Value = studentId;

Cmd.Parameters.Add("@pwd", SqlDbType.VarChar, 32).Value = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(passWord, "MD5").ToLower();

retSql = Cmd.ExecuteScalar();

if (DBNull.Value == retSql)

return -1;//Not Pass

else

{

return Convert.ToInt32(retSql);

}

}

/// <summary>

/// Return String including Student's Mark

/// </summary>

/// <param name="term">Term</param>

/// <param name="keyWords">KeyWords of Subject</param>

/// <returns>String including Student's Mark(WAP)</returns>

public string ShowWapMark(byte term, string keyWords)

{

StringBuilder strapp = new StringBuilder("SELECT [Date], [Expr1], [Normal], [Repair], [MakeUp], [Overall], [GetCredit], [Credit] FROM [View_Mark] WHERE [StudentID]=@stuid AND [Term]=@term");

StringBuilder retstr = new StringBuilder("-以下是该学期成绩-<br />");

Cmd.Parameters.Clear();

if (!string.IsNullOrEmpty(keyWords))

strapp.Append(" AND [Expr1] LIKE @keywords");

strapp.Append(" ORDER BY [Date] DESC");

Cmd.CommandText = strapp.ToString();

Cmd.Parameters.Add("@stuid", SqlDbType.Int).Value = studentId;

Cmd.Parameters.Add("@term", SqlDbType.TinyInt).Value = term;

if (!string.IsNullOrEmpty(keyWords))

Cmd.Parameters.Add("@keywords", SqlDbType.VarChar, 20).Value = "%" + keyWords + "%";

DoNotReplaceCmd = true;

ExeReader();

while (Reader.Read())

{

retstr.Append("<br />考试日期:");

retstr.Append(Reader.GetDateTime(0));

retstr.Append("<br />考试科目:");

retstr.Append(Reader.GetString(1));

retstr.Append("<br />考试成绩:");

retstr.Append(Reader.GetDouble(2));

if (Reader.GetDouble(3) >= 1)

{

retstr.Append("<br />补考成绩:");

retstr.Append(Reader.GetDouble(3));

}

if (Reader.GetDouble(4) >= 1)

{

retstr.Append("<br />重修成绩:");

retstr.Append(Reader.GetDouble(4));

}

retstr.Append("<br />总评成绩:");

retstr.Append(Reader.GetDouble(5));

retstr.Append("<br />获得学分");

retstr.Append(Reader.GetDouble(6));

retstr.Append("<br />科目学分:");

retstr.Append(Reader.GetDouble(7));

retstr.Append("<br />=======");

}

Reader.Close();

retstr.Append("<br />-成绩显示结束-");

return retstr.ToString();

}

}

5.4 社团控制类

OrganControl.cs

/// <summary>

/// Check if is The Organ's Leader

/// </summary>

/// <param name="istudentId">Studnet ID</param>

/// <returns>Result</returns>

public bool GetCanControl(int studentId)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_Organ] WHERE [OrganCharge]=@stuid AND [OrganID]=@organid";

Cmd.Parameters.Add("@stuid", SqlDbType.Int).Value = studentId;

Cmd.Parameters.Add("@organid", SqlDbType.Int).Value = organId;

object obj = Cmd.ExecuteScalar();

if (obj == null)

{

return false;

}

else

{

return obj.ToString() == "0" ? false : true;

}

}

/// <summary>

/// Read Organ Information

/// </summary>

/// <returns>

/// -1:Create Reader Error

/// 0:No Such Information

/// 1:Success

/// </returns>

public int GetOrganInfo()

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT TOP 1 [OrganName], [OrganIntro], [People], [OrganCharge], [OrganCreateTime], [OrganTeacher], [CatID], [IsActive], [OrganMemo] FROM [Nov30th_Organ] WHERE [OrganID]=@organId";

Cmd.Parameters.Add("@organId", SqlDbType.Int).Value = organId;

DoNotReplaceCmd = true;

if (!ExeReader())

return -1;

if (!Reader.Read())

{

Reader.Close();

return 0;

}

organName = Reader.GetString(0);

organIntro = Reader.GetString(1);

organPeople = Reader.GetInt32(2);

organCharge = Reader.GetInt32(3);

organCreateTime = Reader.GetDateTime(4);

organTeacher = Reader.GetString(5);

catID = Reader.GetInt32(6);

isActive = Reader.GetBoolean(7);

organMemo = Reader.GetString(8);

Reader.Close();

return 1;

}

/// <summary>

/// Accept Member To Organ

/// </summary>

/// <param name="memberId">Member ID</param>

/// <param name="buMenId">Bu Men ID</param>

/// <param name="zhiWuId">Zhi Wu ID</param>

/// <returns>Is Success?</returns>

public bool SetAcceptMember(int memberId, int buMenId, int zhiWuId)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "UPDATE [Nov30th_Members] SET [IsReg]=0, [BuMenID] = @bumenid, [ZhiWuId] = @zhiwuid WHERE [MemberID]=@memberid AND [OrganId]=@organid";

Cmd.Parameters.Add("@bumenid", SqlDbType.Int).Value = buMenId;

Cmd.Parameters.Add("@zhiwuid", SqlDbType.Int).Value = zhiWuId;

Cmd.Parameters.Add("memberid", SqlDbType.Int).Value = memberId;

Cmd.Parameters.Add("organid", SqlDbType.Int).Value = organId;

return Cmd.ExecuteNonQuery() > 0 ? true : false;

}

/// <summary>

/// Create Bu Men

/// </summary>

/// <param name="buMenName">Bu Men Name</param>

/// <param name="buMenMemo">Bu Men Memo</param>

/// <returns>Is Success?</returns>

public bool InsertBuMen(string buMenName, string buMenMemo)

{

if (CountBuMen() > BUMENMAXCOUNT)

return false;

Cmd.Parameters.Clear();

Cmd.CommandText = "INSERT INTO [Nov30th_BuMen] ( [BuMenName], [BuMenMemo], [OrganID]) VALUES (@BuMenName,@BuMenMemo,@OrganID)";

Cmd.Parameters.Add("@BuMenName", SqlDbType.VarChar, 20).Value = buMenName.Substring(0, buMenName.Length > 20 ? 20 : buMenName.Length);

Cmd.Parameters.Add("@BuMenMemo", SqlDbType.VarChar, 50).Value = buMenMemo.Substring(0, buMenMemo.Length > 50 ? 50 : buMenMemo.Length);

Cmd.Parameters.Add("@OrganID", SqlDbType.Int).Value = organId;

return Cmd.ExecuteNonQuery() > 0 ? true : false;

}

/// <summary>

/// Count The BuMen

/// </summary>

/// <returns>BuMen Amount</returns>

public int CountBuMen()

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_BuMen] WHERE [OrganID] = @OrganID";

Cmd.Parameters.Add("OrganID", SqlDbType.Int).Value = organId;

return Convert.ToInt32(Cmd.ExecuteScalar());

}

/// <summary>

/// Create Zhi Wu

/// </summary>

/// <param name="zhiWuName">Zhi Wu Name</param>

/// <param name="zhiWuMemo">Zhi Wu Memo</param>

/// <returns>Is Success?</returns>

public bool InsertZhiWu(string zhiWuName, string zhiWuMemo)

{

if (CountZhiWu() >= ZHIWUMAXCOUNT)

return false;

Cmd.Parameters.Clear();

Cmd.CommandText = "INSERT INTO [Nov30th_ZhiWu] ( [ZhiWuName], [ZhiWuMemo], [OrganID]) VALUES (@ZhiWuName,@ZhiWuMemo,@OrganID)";

Cmd.Parameters.Add("@ZhiWuName", SqlDbType.VarChar, 20).Value = zhiWuName.Substring(0, zhiWuName.Length > 20 ? 20 : zhiWuName.Length);

Cmd.Parameters.Add("@ZhiWuMemo", SqlDbType.VarChar, 50).Value = zhiWuMemo.Substring(0, zhiWuMemo.Length > 50 ? 50 : zhiWuMemo.Length);

Cmd.Parameters.Add("@OrganID", SqlDbType.Int).Value = organId;

return Cmd.ExecuteNonQuery() == 0 ? false : true;

}

/// <summary>

/// Count The ZhiWu

/// </summary>

/// <returns>ZhiWu Amount</returns>

public int CountZhiWu()

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_ZhiWu] WHERE [OrganID] = @OrganID";

Cmd.Parameters.Add("OrganID", SqlDbType.Int).Value = organId;

return Convert.ToInt32(Cmd.ExecuteScalar());

}

/// <summary>

/// Count People in ZhiWu ID

/// </summary>

/// <param name="zhiWuId">Zhi Wu Id</param>

/// <returns>People</returns>

public int CountPeopleInZhiWu(int zhiWuId)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_Members] WHERE [ZhiWuID]=@ZhiWuId";

Cmd.Parameters.Add("@ZhiWuId", SqlDbType.Int).Value = zhiWuId;

return Convert.ToInt32(Cmd.ExecuteScalar());

}

/// <summary>

/// Count People in BuMen ID

/// </summary>

/// <param name="buMenId">Bu Men Id</param>

/// <returns>People</returns>

public int CountPeopleInBuMen(int buMenId)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_Members] WHERE [BuMenID]=@BuMenId";

Cmd.Parameters.Add("@BuMenId", SqlDbType.Int).Value = buMenId;

return Convert.ToInt32(Cmd.ExecuteScalar());

}

/// <summary>

/// Delete bumen

/// </summary>

/// <param name="buMenId">bumen id</param>

/// <returns>is success</returns>

public bool DeleteBuMen(int buMenId)

{

if (CountPeopleInBuMen(buMenId) != 0)

return false;

Cmd.Parameters.Clear();

Cmd.CommandText = "DELETE FROM [Nov30th_BuMen] WHERE [BuMenID] = @BuMenID";

Cmd.Parameters.Add("@BuMenID", SqlDbType.Int).Value = buMenId;

return Cmd.ExecuteNonQuery() > 0 ? true : false;

}

/// <summary>

/// Delete zhiwu

/// </summary>

/// <param name="zhiWuId">zhiwu id</param>

/// <returns>is success</returns>

public bool DeleteZhiWu(int zhiWuId)

{

if (CountPeopleInZhiWu(zhiWuId) != 0)

return false;

Cmd.Parameters.Clear();

Cmd.CommandText = "DELETE FROM [Nov30th_ZhiWu] WHERE [ZhiWuID] = @ZhiWuID";

Cmd.Parameters.Add("@ZhiWuID", SqlDbType.Int).Value = zhiWuId;

return Cmd.ExecuteNonQuery() > 0 ? true : false;

}

/// <summary>

/// Delete Member From organ

/// </summary>

/// <param name="memberId">Member ID</param>

/// <returns>is success?</returns>

public bool DeleteMember(int memberId)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "DELETE FROM [Nov30th_Members] WHERE [MemberID]=@MemberID AND [OrganID]=@OrganID";

Cmd.Parameters.Add("@MemberID", SqlDbType.Int).Value = memberId;

Cmd.Parameters.Add("@OrganID", SqlDbType.Int).Value = organId;

return Cmd.ExecuteNonQuery() > 0 ? true : false;

}

/// <summary>

/// Get My Information In This Organ

/// </summary>

/// <param name="istudentId">Student ID</param>

/// <returns>is success</returns>

public bool GetMyInfo(int istudentId)

{

int studentId = 0;

if (istudentId == 0)

{

if (HttpContext.Current.Session["Nov30th_StudentID"] != null)

studentId = Convert.ToInt32(HttpContext.Current.Session["Nov30th_StudentID"].ToString());

}

else

studentId = istudentId;

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT [BuMenID], [ZhiWuID], [MemberID], [JoinTime] FROM [Nov30th_Members] WHERE [OrganID]=@OrganID AND [MemberStudentID]=@MemberStudentID";

Cmd.Parameters.Add("@OrganID", SqlDbType.Int).Value = organId;

Cmd.Parameters.Add("MemberStudentID", SqlDbType.Int).Value = studentId;

DoNotReplaceCmd = true;

if (!ExeReader())

return false;

if (!Reader.Read())

{

Reader.Close();

return false;

}

myBuMen = Reader.GetInt32(0);

myZhiWu = Reader.GetInt32(1);

myMemberId = Reader.GetInt32(2);

myJoinedTime = Reader.GetDateTime(3);

Reader.Close();

return true;

}

}

5.5 社团成员操作类

OrganMember.cs

public string ShowJoinedOrgan()

{

StringBuilder retStr = new StringBuilder();

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT [OrganName],[OrganID] FROM [View_MemberToOrgan] WHERE [MemberStudentID]=@StudentId AND [IsReg]=0 AND [IsActive]=1";

Cmd.Parameters.Add("@StudentId", SqlDbType.Int).Value = studentId;

DoNotReplaceCmd = true;

if (!ExeReader())

return string.Empty;

while (Reader.Read())

{

retStr.Append(Reader.GetString(0));

retStr.Append("|");

retStr.Append(Reader.GetInt32(1));

retStr.Append("|");

}

Reader.Close();

return retStr.ToString();

}

/// <summary>

/// Return Is Joined The Organ

/// </summary>

/// <param name="organId">Organ ID</param>

/// <param name="isReged">

/// 1:Reged

/// -1:Reging

/// 0:All Records

/// </param>

/// <returns>Joined?</returns>

public bool IsJoined(int organId, int isReged)

{

StringBuilder sql = new StringBuilder("SELECT TOP 1 [NickName] FROM [Nov30th_Members] WHERE [MemberStudentID]=@StudentId AND [OrganID]=@OrganId");

if (isReged == 1)

sql.Append(" AND [IsReg]=0");

else if (isReged == 0)

sql.Append(" AND [IsReg]=1");

Cmd.Parameters.Clear();

Cmd.CommandText = sql.ToString(); ;

Cmd.Parameters.Add("@StudentId", SqlDbType.Int).Value = studentId;

Cmd.Parameters.Add("@OrganId", SqlDbType.Int).Value = organId;

return !string.IsNullOrEmpty(Convert.ToString(Cmd.ExecuteScalar()));

}

/// <summary>

/// Join Organ

/// </summary>

/// <param name="organId">Organ ID</param>

/// <param name="regMemo">Reg Text</param>

/// <returns>Success?</returns>

public bool JoinOrgan(int organId, string regMemo)

{

if (IsJoined(organId, 0) || string.IsNullOrEmpty(regMemo))

return false;

Cmd.Parameters.Clear();

Cmd.CommandText = "INSERT INTO [Nov30th_Members] (MemberStudentID, NickName, Contact, OrganID, ZhiWuID, BuMenID, JoinTime, IsReg, RegMemo) VALUES (@MemberStudentID, '-', '-', @OrganID, 0, 0, getdate(), 1, @RegMemo)";

Cmd.Parameters.Add("@MemberStudentID", SqlDbType.Int).Value = studentId;

Cmd.Parameters.Add("@OrganID", SqlDbType.Int).Value = organId;

Cmd.Parameters.Add("@RegMemo", SqlDbType.VarChar, 50).Value = regMemo.Substring(0, regMemo.Length < 50 ? regMemo.Length : 50);

return (Cmd.ExecuteNonQuery() == 0) ? false : true;

}

}

5.6 社团消息操作类

OrganMessage.cs

/// <summary>

/// Send Private Message To Student

/// </summary>

/// <param name="recSutdentId">DestStudentId</param>

/// <param name="messageContext">MessageContext</param>

/// <param name="messageSign">MessageSign</param>

/// <returns>ExecuteNonQuery Value</returns>

public bool SendPrivateMessage(int recSutdentId, string messageContext, byte messageSign)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "INSERT INTO [Nov30th_PersonalMessages] (SendStudentID, ReceiveStudentID, IsRead, MessageContext, SendTime, MessageSign) VALUES (@sstuid, @rstuid, 0, @context, getdate(), @msgsign)";

Cmd.Parameters.Add("@sstuid", SqlDbType.Int).Value = studentId;

Cmd.Parameters.Add("@rstuid", SqlDbType.Int).Value = recSutdentId;

Cmd.Parameters.Add("@context", SqlDbType.VarChar, 255).Value = messageContext;

Cmd.Parameters.Add("@msgsign", SqlDbType.TinyInt).Value = messageSign;

return Cmd.ExecuteNonQuery() > 0 ? true : false;

}

/// <summary>

/// Count The Message Sent

/// </summary>

/// <param name="messageType">

/// 1.Personal

/// 2.Organ

/// 3.HuoDong

/// </param>

/// <returns>Count</returns>

public int CountSentMessages(int messageType)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_" + (messageType == 1 ? "PersonalMessages" : (messageType == 2 ? "OrganMessages" : "HuoDongMessages")) + "] WHERE [StudentID]=@stuid";

Cmd.Parameters.Add("@stuid", SqlDbType.Int).Value = studentId;

return Convert.ToInt32(Cmd.ExecuteScalar());

}

/// <summary>

/// Count The Private Message Received

/// </summary>

/// <returns>Count</returns>

public int CountReceivedMessages()

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_PersonalMessages] WHERE [ReceiveStudentID]=@stuid";

Cmd.Parameters.Add("@stuid", SqlDbType.Int).Value = studentId;

return Convert.ToInt32(Cmd.ExecuteScalar());

}

/// <summary>

/// The New Private Message Amount

/// </summary>

/// <returns></returns>

public int HasNewMessages()

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_PersonalMessages] WHERE [ReceiveStudentID]=@stuid AND IsRead = 0";

Cmd.Parameters.Add("@stuid", SqlDbType.Int).Value = studentId;

return Convert.ToInt32(Cmd.ExecuteScalar());

}

/// <summary>

/// Send Message To Organ

/// </summary>

/// <param name="OrganId">OgranID</param>

/// <param name="buMenId">BuMenID</param>

/// <param name="zhiWuId">ZhiWuID</param>

/// <param name="messageContext">Message Context</param>

/// <param name="messageType">NO USE,Type 0 Instand</param>

/// <returns></returns>

public int SendOrganMessage(int organId, int buMenId, int zhiWuId, string messageContext, int messageType)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "INSERT INTO [Nov30th_OrganMessages] (SendStudentID, OrganID, AIMTpye, BuMenID, ZhiWuID, MessageContext, SendTime) VALUES (@sstuid, @organid, @aimtype, @bumenid, @zhiwuid, @context, getdate())";

Cmd.Parameters.Add("@sstuid", SqlDbType.Int).Value = studentId;

Cmd.Parameters.Add("@organid", SqlDbType.Int).Value = organId;

Cmd.Parameters.Add("@aimtype", SqlDbType.Int).Value = messageType;

Cmd.Parameters.Add("@bumenid", SqlDbType.Int).Value = buMenId;

Cmd.Parameters.Add("@zhiwuid", SqlDbType.Int).Value = zhiWuId;

Cmd.Parameters.Add("@context", SqlDbType.VarChar, 255).Value = messageContext;

return Cmd.ExecuteNonQuery();

}

/// <summary>

/// Send Huo Dong Message

/// </summary>

/// <param name="huoDongId">HuoDongID</param>

/// <param name="messageContext">Message Context</param>

/// <param name="messageSign">Message Sign</param>

/// <returns>ExecuteNonQuery Value</returns>

public int SendHuoDongMessage(int huoDongId, string messageContext, byte messageSign)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "INSERT INTO [Nov30th_PersonalMessages] (HuoDongID, SendStudentID, SendTime, MessageContext, MessageSign) VALUES (@huodongid, @sstuid, getdate(), @context, @msgsign)";

Cmd.Parameters.Add("@huodongid", SqlDbType.Int).Value = huoDongId;

Cmd.Parameters.Add("@sstuid", SqlDbType.Int).Value = studentId;

Cmd.Parameters.Add("@context", SqlDbType.VarChar, 255).Value = messageContext;

Cmd.Parameters.Add("@msgsign", SqlDbType.TinyInt).Value = messageSign;

return Cmd.ExecuteNonQuery();

}

/// <summary>

/// is exists student?

/// </summary>

/// <param name="studentId">Student ID</param>

/// <returns>exists?</returns>

public bool IsExistStudent(int studentId)

{

Cmd.Parameters.Clear();

Cmd.CommandText = "SELECT COUNT(1) FROM [Nov30th_Detail] WHERE [StudentID]=@StudentID";

Cmd.Parameters.Add("@StudentID", SqlDbType.Int).Value = studentId;

return Convert.ToInt32(Cmd.ExecuteScalar()) == 0 ? false : true;

}

}

5.7 公共权限检查类

PublicCheck.cs

/// <summary>

/// 检查允许登陆的情况

/// Version 0.01

/// Code By HOHO``

/// </summary>

public class PublicCheck

{

private bool isSafeMode, isStuAllow, isNormalAllow, isParAllow;

public bool IsParAllow

{

get { return isParAllow; }

set { isParAllow = value; }

}

public bool IsNormalAllow

{

get { return isNormalAllow; }

set { isNormalAllow = value; }

}

public bool IsStuAllow

{

get { return isStuAllow; }

set { isStuAllow = value; }

}

public bool IsSafeMode

{

get { return isSafeMode; }

}

/// <summary>

/// 构造函数

/// </summary>

/// <param name="strIP_Address">客户机的IP地址</param>

/// <param name="SafeMode">SafeMode的全局网站变量</param>

/// <param name="StuLogin">StuLogin的全局网站变量</param>

/// <param name="ParLogin">ParLogin的全局网站变量</param>

/// <param name="AllowPub">AllowPub的全局网站变量</param>

public PublicCheck()

{

bool isPriIP = false;

string strIP_Address = HttpContext.Current.Request.ServerVariables["REMOTE_HOST"].ToString();

int safeMode = Convert.ToInt32(HttpContext.Current.Application["SafeMode"]);

int stuLogin = Convert.ToInt32(HttpContext.Current.Application["StuLogin"]);

int parLogin = Convert.ToInt32(HttpContext.Current.Application["ParLogin"]);

int allowPub = Convert.ToInt32(HttpContext.Current.Application["AllowPub"]);

//如果不允许外网

if (allowPub != 1)

{

if (strIP_Address.ToString() == "127.0.0.1")

isPriIP = true;

if (strIP_Address.Substring(0, 7).ToString() == "192.168")

isPriIP = true;

if (strIP_Address.Substring(0, 4).ToString() == "172." && Convert.ToInt16(strIP_Address.Substring(4, 3)) >= 16 && Convert.ToInt16(strIP_Address.Substring(4, 3)) <= 31)

isPriIP = true;

if (strIP_Address.Substring(0, 3).ToString() == "10.")

isPriIP = true;

if (!isPriIP)

return;

}

isNormalAllow = true;

//安全模式

if (safeMode == 1)

{

isSafeMode = true;

return;

}

isStuAllow = (stuLogin == 1) ? true : false;

isParAllow = (parLogin == 1) ? true : false;

}

}

5.8 安全检查类

SafeCheck.cs

public class SafeCheck

{

private int bytLevel = -1;

private bool bisOnly = true;

const byte CStudent = 100;

const byte CParent = 101;

const byte CAdmin = 254;

const byte CSuperAdmin = 255;

const byte CMaster = 250;

const byte CStudentWap = 100;

public SafeCheck(byte level, bool only)

{

bytLevel = level;

bisOnly = only;

}

~SafeCheck()

{

}

/// <summary>

/// 验证登陆是否正确

/// 学生WAP登陆,需要级别100

/// </summary>

/// <param name="bytLevel">登陆的级别</param>

/// <param name="bisOnly">是否允许高级别登陆</param>

/// <returns>Boolen</returns>

public bool ChkWAPStudent()

{

if (bytLevel >= CStudent && bisOnly == false)

return true;

else if (bytLevel == CStudent && bisOnly == true)

return true;

else

return false;

}

/// <summary>

/// 验证登陆是否正确

/// 学生登陆,需要级别100

/// </summary>

/// <param name="bytLevel">登陆的级别</param>

/// <param name="bisOnly">是否允许高级别登陆</param>

/// <returns>Boolen</returns>

public bool ChkStudent()

{

if (bytLevel >= CStudent && bisOnly == false)

return true;

else if (bytLevel == CStudent && bisOnly == true)

return true;

else

return false;

}

/// <summary>

/// 验证登陆是否正确

/// 班主任登陆,需要级别250

/// </summary>

/// <param name="bytLevel">登陆的级别</param>

/// <param name="bisOnly">是否允许高级别登陆</param>

/// <returns>Boolen</returns>

public bool ChkMaster()

{

if (bytLevel >= CMaster && bisOnly == false)

return true;

else if (bytLevel == CMaster && bisOnly == true)

return true;

else

return false;

}

/// <summary>

/// 验证登陆是否正确

/// 管理员登陆,需要级别200

/// </summary>

/// <param name="bytLevel">登陆的级别</param>

/// <param name="bisOnly">是否允许高级别登陆</param>

/// <returns>Boolen</returns>

public bool ChkAdmin()

{

if (bytLevel >= CAdmin && bisOnly == false)

return true;

else if (bytLevel == CAdmin && bisOnly == true)

return true;

else

return false;

}

/// <summary>

/// 验证登陆是否正确

/// 超级管理员登陆,需要级别255

/// </summary>

/// <param name="bytLevel">登陆的级别</param>

/// <param name="bisOnly">无所谓的参数</param>

/// <returns>Boolen</returns>

public bool ChkSuperAdmin()

{

if (bytLevel == CSuperAdmin)

return true;

else

return false;

}

/// <summary>

/// 验证登陆是否正确

/// 家长登陆,需要级别150

/// </summary>

/// <param name="bytLevel">登陆的级别</param>

/// <param name="bisOnly">是否允许高级别登陆</param>

/// <returns>Boolen</returns>

public bool ChkParent()

{

if (bytLevel >= CParent && bisOnly == false)

return true;

else if (bytLevel == CParent && bisOnly == true)

return true;

else

return false;

}

}

5.9 学生信息操作类

StudentInfo.cs

public class StudentInfo

{

private bool isConn;//is DB connected?

public bool IsConn

{

get { return isConn; }

set { isConn = value; }

}

private int intStudentId;//Save The StudentID

public int IntStudentID

{

get { return intStudentId; }

}

private byte errorId;//error id

public byte ErrorId

{

get { return errorId; }

}

private string errorText;//error text

public string ErrorText

{

get { return errorText; }

}

///Read back information

private string StudentName;

public string StudentNameOut

{

get { return StudentName; }

}

private string Dormitory;

public string DormitoryOut

{

get { return Dormitory; }

}

private string Password;

public string PasswordOut

{

get { return Password; }

}

private int ruXue;

public int RuXueOut

{

get { return ruXue; }

}

private bool Sex;

public bool SexOut

{

get { return Sex; }

}

private byte LoginLevel;

public byte LoginLevelOut

{

get { return LoginLevel; }

}

private int ClassId;

public int ClassIDOut

{

get { return ClassId; }

}

private string CellPhone;

public string CellPhoneOut

{

get { return CellPhone; }

}

private DateTime Birthday;

public DateTime BirthdayOut

{

get { return Birthday; }

}

private int zhuanYeId;

public int ZhuanYeIDOut

{

get { return zhuanYeId; }

}

private string ZhuanYeName;

public string ZhuanYeNameOut

{

get { return ZhuanYeName; }

}

private string ClassName;

public string ClassNameOut

{

get { return ClassName; }

}

private string ClassMaster;

public string ClassMasterOut

{

get { return ClassMaster; }

}

private string MasterName;

public string MasterNameOut

{

get { return MasterName; }

}

private byte Term;

public byte TermOut

{

get { return Term; }

}

/// <summary>

/// Read Student All Information From DataBase With StuID

/// </summary>

/// <param name="Studentid">Student ID</param>

public StudentInfo(int studentId)

{

//Create Conn and Read Info

SqlConnection conn = new SqlConnection();

SqlCommand cmd = new SqlCommand();

conn.ConnectionString = ConfigurationManager.ConnectionStrings["StudentConnectionString"].ConnectionString;

try

{

conn.Open();//open database connection

cmd.Connection = conn;

IsConn = true;

}

catch

{

//dosth

}

if (!isConn)

{

//if db open failed ,return.

errorId = 1;

errorText = "Can not connect Database";

cmd.Dispose();

conn.Close();

conn.Dispose();

return;

}

cmd.CommandText = "SELECT TOP 1 [StudentID], [Name], [Dormitory], [IsPM], [Birthday], [CellPhone], [Sex], [ClassName], [ZhuanYe], [ZY_Name], [Master], [Term], [RuXue], [Password], [ClassID], [LoginLevel], [Master] FROM [View_Student] Where [StudentID]=@studentid";

cmd.Parameters.Add("@studentid", SqlDbType.Int).Value = studentId;

SqlDataReader dr = cmd.ExecuteReader();

if (!dr.Read())

{

//if no Data With This Student ID,return.

dr.Close();

cmd.Dispose();

conn.Close();

conn.Dispose();

errorId = 2;

errorText = "No Data With This StudentID";

return;

}

//copy student info here

intStudentId = dr.GetInt32(0);

StudentName = dr.GetString(1);

Dormitory = dr.GetString(2);

Birthday = dr.GetDateTime(4);

CellPhone = dr.GetString(5);

Sex = dr.GetBoolean(6);

ClassName = dr.GetString(7);

zhuanYeId = dr.GetInt32(8);

ZhuanYeName = dr.GetString(9);

MasterName = dr.GetString(10);

Term = dr.GetByte(11);

ruXue = dr.GetInt16(12);

Password = dr.GetString(13);

ClassId = dr.GetInt32(14);

LoginLevel = dr.GetByte(15);

ClassMaster = dr.GetString(16);

//copy finished! close dr and conn

dr.Close();

cmd.Dispose();

conn.Close();

conn.Dispose();

}

}

5.10 系统插件类

SystemPlugin.cs

/// <summary>

/// SystemPlugin 的摘要说明

/// 调用该CLASS只能是网站二级目录的文件

/// Version 0.01

/// 插件功能

/// </summary>

public class SystemPlugin

{

const int MAXPLUGINCOUNT = 10;// The Max Files One Folder Can Read

public SystemPlugin()

{

}

/// <summary>

/// Response The Files In Plugin Path (no web.config)

/// </summary>

/// <returns>String[]</returns>

public string[] ReturnAdminPluginNames(string pathName)

{

string[] retVal = new string[MAXPLUGINCOUNT];

int fileCount = 0;

DirectoryInfo mainDir = new DirectoryInfo(System.Web.HttpContext.Current.Server.MapPath("../Plugin/") + pathName);

FileInfo[] fInfo = mainDir.GetFiles("*.aspx");

for (int i = 0; i < fInfo.Length; i++)

{

if (fileCount == MAXPLUGINCOUNT)

break;//if count Max then break

retVal[fileCount++] = fInfo[i].Name;

}

return retVal;

}

}

5.11 Asp.Net 全局操作文件

Global.asax

<%@ Application Language="C#" %>

<script RunAt="server">

protected void Application_Start(object sender, EventArgs e)

{

// 在应用程序启动时运行的代码

string AppName = string.Empty;

//检查变量,如果程序已经启动,无须再次启动。

if (Application["nov30th_isrun"] != null && string.IsNullOrEmpty(Application["nov30th_isrun"].ToString()))

return;

ConnectDB Cnt = new ConnectDB();

if (Cnt.IsConn != true)

{

//数据库无法连接

Application["nov30th_isrun"] = "false";

Application["Err_Details"] = "Can Not Connect DataBase!";

}

else

{

//读入数据到App中

if (Cnt.ExeReader("select [OptName],[OptValue],[OptChar],[CorV] from [Nov30th_SysOpt]"))

{

while (Cnt.Reader.Read())

{

AppName = Cnt.Reader.GetString(0);

if (Cnt.Reader.GetBoolean(3) == false)

{

//数值

Application[AppName] = Cnt.Reader.GetInt32(1);

//Response.Write("<br/>Key:" + Cnt.reader.GetString(0) + " Value:" + Cnt.reader.GetInt32(1).ToString());

}

else

{

Application[AppName] = Cnt.Reader.GetString(2);

//Response.Write("<br/>Key:" + Cnt.reader.GetString(0) + " Value:" + Cnt.reader.GetString(2));

}

}

Application["nov30th_isrun"] = Convert.ToByte(Application["Running"]) == 1 ? "true" : "false";

Application["Err_Details"] = "Started From Service";

}

}

Cnt.Dispose();

}

</script>

5.12 根目录web.config 文件内容

web.config

<?xml version="1.0"?>

<!--

注意: 除了手动编辑此文件以外,您还可以使用

Web 管理工具来配置应用程序的设置。可以使用 Visual Stud

设置和注释的完整列表在

machine.config.comments 中,该文件通常位于

\Windows\Microsoft.Net\Framework\v2.x\Config 中

-->

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

<configSections>

<section name="magicAjax" type="MagicAjax.Configuration.MagicAjaxSectionHandler, MagicAjax"/>

</configSections>

<magicAjax

outputCompareMode="HashCode"

tracing="false">

<pageStore

mode="NoStore"

unloadStoredPage="false"

cacheTimeout="5"

maxConcurrentPages="5"

maxPagesLimitAlert="false"

/>

</magicAjax>

<appSettings>

<add key="KuangKeTips" value="008:旷课超过8节了,可能会受到警告处分哦|014:旷课超过14节了,再旷课就要受到严重警告处分了!|018:旷课超过18节,奇迹了!"/>

<add key="Copyright" value="Student"/>

<add key="Version" value="V0.01 "/>

<add key="InstallKey" value="62e62e62e" />

</appSettings>

<connectionStrings>

<add name="StudentSetup" connectionString="Data Source=.\SQLEXPRESS;Integrated Security=True;User Instance=True"

providerName="System.Data.SqlClient" />

<add name="StudentConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Student.mdf;Integrated Security=True;User Instance=True"

providerName="System.Data.SqlClient" />

</connectionStrings>

<system.web>

<!--

设置 compilation debug="true" 将调试符号插入

已编译的页面中。但由于这会

影响性能,因此只在开发过程中将此值

设置为 true。

-->

<roleManager enabled="true" />

<compilation debug="true"/>

<!--

通过 <authentication> 节可以配置 ASP.NET 使用的

安全身份验证模式,

以标识传入的用户。

-->

<authentication mode="Forms" />

<!--

如果在执行请求的过程中出现未处理的错误,

则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,

开发人员通过该节可以配置

要显示的 html 错误页

以代替错误堆栈跟踪。

-->

<customErrors mode="RemoteOnly" defaultRedirect=" Error/Error.html">

<error statusCode="403" redirect="Error/Error403.html" />

<error statusCode="404" redirect="Error/Error404.html" />

</customErrors>

<pages>

<controls>

<add namespace="MagicAjax.UI.Controls" assembly="MagicAjax" tagPrefix="ajax"/>

</controls>

</pages>

<httpModules>

<add name="MagicAjaxModule" type="MagicAjax.MagicAjaxModule, MagicAjax"/>

</httpModules>

</system.web>

<!--

StudentFiles 目录拒绝所有访问

-->

<location path="StudentFiles">

<system.web>

<authorization>

<deny users="*" />

</authorization>

</system.web>

</location>

<!--

TEMP 目录拒绝所有访问

-->

<location path="TEMP">

<system.web>

<authorization>

<deny users="*" />

</authorization>

</system.web>

</location>

</configuration>

第六章 系统测试

本系统已经过测试通过,部分测试内容见第四章。

论文小结

.Net是一个强大平台,开发WEB应用无需涉及HTML语言及格式,这与我几年前开发ASP已经完全不同。和JAVA语言相类似,可以实现类的实现,接口等。代码和HTML分离,组织清晰,事件驱动和编程模型,跨浏览器,跨设备。是将来发展的趋势。在开发过程中也学习到很多新的知识。HOHO``系统开发时间不长,在功能上和细节上还有待完善。

致谢

在这次毕业设计过程中,遇到许多问题。Google及互联网的帮助是最大的,要感谢Google系统的开发人员。

文献综述

《ASP.NET 快速入门教程》http://chs.gotdotnet.com/quickstart/aspplus/doc/quickstart.aspx

《Visual C# 开发中心》http://www.microsoft.com/china/msdn/developercenter/VCSharp/default.mspx

阅读全文My Programstags  

HOHO VR 足迹 系统 源代码 全面提供下载

September 29, 2009 Views
Comments 0

vrsys

 

  <----点击下载

 

整理了一下原来的2006年的代码, 把VC++写的客户端和C#写的WEB Server端代码都打包在一个文件里.

有兴趣的可以下载来研究. 2006年寒假的产物. 还有2005年的ASP版本, 嗯.. 那东西得找找看, 能不能找出来, 大一的40G移动硬盘坏掉后, 花了1000RMB修好, 里面有部分的数据. 现在都打包在一个1TB的移动硬盘里, = = . 不久也会放上来, 并上线.

 

111Capture Capture4747  Capture888

阅读全文My Programs

一些源代码,很早很早的。

July 3, 2009 Views
Comments 1

VB写的,很早很早移动硬盘里翻到的。

 

Download File - Source Code
 
o2jam.zip   劲乐团官方客户端的服务器模拟器。
cmwap.zip  手机连接电脑上网后,使cmwap变为cmnet直连的TCP映射工具。
ring pro.zip手机cmwap或者cmnet上网铃声下载。
sx.exe        找不到源代码了,用来不断刷新网页的工具,TCP全连接攻击工具。
 
vb网络控件是这几个可执行文件运行需要的。运行一次即可。

 

QQ截图未命名

阅读全文My Programs

2005年写的劲乐团服务器,单人版。

August 3, 2008 Views
Comments 3

今天翻以前移动硬盘资料的时候,发现劲乐团出来不久写的一个服务端程序。当时可能是由于不能经常上网,所以自己做了一个单机的自娱自乐 = =。

可执行文件 http://hoho.bz/blog/upload/2008/8/O2JamPS.rar 

源代码 http://hoho.bz/blog/upload/2008/8/o2jam.rar 

用VB写的。很有意思。

启动后游戏里登陆用户名为hoho 密码为qzj

VERSION 5.00
Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
Begin VB.Form Form1
   BorderStyle     =   1 'Fixed Single
   Caption         =   "版权HOHO所有"
   ClientHeight    =   5565
   ClientLeft      =   765
   ClientTop       =   630
   ClientWidth     =   7680
   Icon            =   "Form1.frx":0000
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   5565
   ScaleWidth      =   7680
   StartUpPosition =   3 '窗口缺省
   Begin VB.Frame Frame3
      Caption         =   "关于"
      Height          =   735
      Left            =   120
      TabIndex        =   6
      Top             =   4680
      Width           =   7335
      Begin MSWinsockLib.Winsock wskhttp
         Index           =   0
         Left            =   960
         Top             =   240
         _ExtentX        =   741
         _ExtentY        =   741
         _Version        =   393216
         LocalPort       =   15000
      End
      Begin VB.CommandButton Command4
         Caption         =   "Command4"
         Height          =   315
         Left            =   5280
         TabIndex        =   8
         Top             =   300
         Visible         =   0   'False
         Width           =   1815
      End
      Begin VB.Label Label1
         Caption         =   "my name is hoho, my qq is 2460739."
         ForeColor       =   &H000000FF&
         Height          =   315
         Left            =   2100
         TabIndex        =   7
         Top             =   300
         Width           =   3195
      End
   End
   Begin MSWinsockLib.Winsock wsk
      Index           =   0
      Left            =   7140
      Top             =   4740
      _ExtentX        =   741
      _ExtentY        =   741
      _Version        =   393216
      LocalPort       =   15010
   End
   Begin VB.Frame Frame2
      Caption         =   "服务控制"
      Height          =   975
      Left            =   120
      TabIndex        =   2
      Top             =   3600
      Width           =   7335
      Begin VB.CommandButton Command1
         Caption         =   "傻瓜型启动劲乐团个人服务器版"
         Default         =   -1 'True
         Height          =   375
         Left            =   3360
         TabIndex        =   5
         Top             =   360
         Width           =   3855
      End
      Begin VB.CommandButton Command3
         Caption         =   "退出"
         Height          =   375
         Left            =   1740
         TabIndex        =   4
         Top             =   360
         Width           =   1455
      End
      Begin VB.CommandButton Command2
         Caption         =   "复位服务器"
         Height          =   375
         Left            =   120
         TabIndex        =   3
         Top             =   360
         Width           =   1455
      End
   End
   Begin VB.Frame Frame1
      Caption         =   "网络交换信息"
      Height          =   3375
      Left            =   120
      TabIndex        =   0
      Top             =   120
      Width           =   7335
      Begin VB.TextBox Text1
         Appearance      =   0 'Flat
         Height          =   2895
         Left            =   180
        MultiLine       =   -1 'True
         ScrollBars      =   2 'Vertical
         TabIndex        =   1
         Text            =   "Form1.frx":57E2
         Top             =   240
         Width           =   6975
      End
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim spass(54) As Byte
Dim fun(30) As Integer
Dim p9(8) As Byte, p10(9) As Byte, p8(7) As Byte, p4(3) As Byte, p12(11) As Byte, loadserver(54) As Byte, p16(15) As Byte, p6(5) As Byte, p5(4) As Byte
Dim room(3907) As Byte, data1(1049) As Byte, userinfo(309) As Byte, data2(79) As Byte, data3(4425) As Byte, createroom(12) As Byte, jz() As Byte
Dim finish(75) As Byte, msg(72) As Byte
Dim version As String, httpmsg1 As String, httpmsg2 As String, httpheader As String
 
Private Function enters()
Dim i As Integer
Dim str As String
str = InputBox("输入服务器IP地址或者计算机名称", "服务器连接", "127.8.8.8")
If Len(str) = 0 Then Exit Function
i = Shell("otwo 1 o2jam-patchbj02.9you.com o2jam/patch " & str & ":15000 1 1 1 1 1 1 1 1 " & str & " 15010 " & str & " 15010 " & str & " 15010 " & str & " 15010 " & str & " 15010", vbNormalFocus)
End Function
Private Sub Command1_Click()
If Dir("OTwo.exe", vbArchive + vbNormal) = "" Then
            MsgBox "把服务器程序和劲乐团放在一个目录下傻瓜型启动,谢谢!", 4096 + vbCritical, "HOHO Help System"
            Exit Sub
End If
Dim i As Integer
i = Shell("OTwo.exe 1 o2jam-patchbj02.9you.com o2jam/patch 127.8.8.8:15000 1 1 1 1 1 1 1 127.8.8.8 15010 127.8.8.8 15010 127.8.8.8 15010 127.8.8.8 15010 127.8.8.8 15010 127.8.8.8 15010 127.8.8.8 15010", vbNormalFocus)
End Sub
 
Private Sub Command2_Click()
Call resetwsk
Text1.Text = "Copyright HOHO"
End Sub
 
Private Sub Command3_Click()
End
End Sub
 
Private Sub Command4_Click()
Dim i As Integer
For i = 1 To 5
            If wsk(i).State = sckConnected Then
                        wsk(i).SendData msg()
                        addsock i, "接收帮助信息"
            End If
Next
End Sub
 
Private Sub Form_Load()
On Error GoTo xXx
version = "测试版V0.20"
Me.Caption = "O2Jam Personal Server " & version
Text1.Text = Text1.Text & vbCrLf & version
'If Date > DateAdd("s", 1, "2005-5-3") Then
'            MsgBox "测试期限到了!不过你可以调整系统时间到年月号或更早继续使用。", 4096 + vbApplicationModal + vbExclamation, version
'            End
'End If
Dim i As Integer
Dim ii As Integer
 
httpmsg1 = "//Lightboard" & vbCrLf & _
"欢迎您来到HOHO劲乐单机版世界!" & vbCrLf & vbCrLf & _
"//Stateroom" & vbCrLf & _
"抵制不良游戏,拒绝盗版游戏,注意自我保护,谨防上当受骗" & vbCrLf & _
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活" & vbCrLf & _
"对于单机版任何疑问或者问题,请联系QQ2460739" & vbCrLf & vbCrLf
 
httpmsg2 = "//StateWaiting" & vbCrLf & _
"欢迎使用HOHO劲乐团单机版服务器程序!" & vbCrLf & _
"F2                 : 自动更换颜色" & vbCrLf & _
"F3                 : 快速开始.单机模式没有房主" & vbCrLf & _
"F5                 : 游戏途中切换音符类型" & vbCrLf & _
"F6                 : 游戏途中调整音符帮助" & vbCrLf & _
"F7                 : 切换音符显示模式D / 3D" & vbCrLf & _
"F8                 : 切换鼠标模式window/image" & vbCrLf & _
"F9                 : 均衡器转换模式开/ 关" & vbCrLf & _
"PrintScreen        : 截图"
 
    httpheader = "HTTP/1.1 200 OK" & vbCrLf & _
    "Server: O2Jam PS/0.10" & vbCrLf & _
    "Date: Sat, 19 June 2004 00:00:00 GMT" & vbCrLf & _
    "Content-Type: text/plain" & vbCrLf & _
    "Accept-Ranges: bytes" & vbCrLf & _
    "Last-Modified: Sat, 19 June 2004 00:00:00 GMT" & vbCrLf & _
    "Content-Length: "
 
 
    'BLOG中,这里省略几千行代码.
    
ii = 12
For i = 1 To 20
            room(ii) = 120
            room(ii + 4) = &H60
            room(ii + 8) = 5
            room(ii + 11) = 5
ii = ii + 13
Next
Dim iii As Integer
ii = 398
For iii = 1 To 9
            For i = 1 To 30
                        room(ii) = iii
            ii = ii + 13
            Next
Next
 
wsk(0).Listen
For i = 1 To 5
            Load wsk(i)
Next
Load wskhttp(1)
wskhttp(0).Listen
Exit Sub
 
xXx:
Call enters
End
End Sub
 
 
Private Function resetwsk()
Dim i As Integer
For i = 1 To 5
            wsk(i).Close
Next
End Function
 
 
Private Function dosend(it As Integer, Index As Integer)
wsk(Index).SendData spass()
End Function
 
Private Sub wsk_ConnectionRequest(Index As Integer, ByVal requestID As Long)
 
Dim i As Integer
For i = 1 To 5
            If wsk(i).State <> sckConnected Then
                        wsk(i).Close
                        wsk(i).Accept requestID
                        Exit For
            End If
Next
If i = 6 Then
            add ("连接数已满!拒绝接入...")
            Exit Sub
End If
           
End Sub
 
Private Sub wsk_DataArrival(Index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Dim abc() As Byte
Dim fun As String
Dim iover As Integer
wsk(Index).GetData abc(), vbArray + vbByte
 
If abc(0) + abc(1) * 256 <> bytesTotal Then
            addsock Index, "非法的数据包被发现"
End If
 
 
fun = Hex(abc(3)) & Hex(abc(2))
           
Debug.Print fun
Select Case fun
            Case "FB5"
                        addsock Index, "尝试返回房间!"
                        p9(2) = &HB6
                        p9(3) = &HF
                        p9(4) = &H0
                        p9(5) = &HE
                        p9(6) = &H0
                        p9(7) = &H0
                        p9(8) = &H0
                        wsk(Index).SendData p9()
            Case "FB0"
                        addsock Index, "一曲结束!!"
                        p6(2) = &HB1
                        p6(3) = &HF
                        p6(4) = &H0
                        p6(5) = &H1
                        wsk(Index).SendData p6()
                        For iover = 13 To 24
                                    finish(iover) = abc(iover - 9)
                        Next
                        finish(25) = abc(18)
                        finish(26) = abc(19)
                        finish(27) = abc(20)
                        finish(28) = abc(21)
                        wsk(Index).SendData finish()
                        add "Cool:" & abc(4) + abc(5) * 256 & " Good:" & abc(6) + abc(7) * 256 & " Miss:" & abc(8) + abc(9) * 256 & " Bad:" & abc(10) + abc(11) * 256 & " HI:" & abc(12) + abc(13) * 256 & " Jam:" & abc(14) + abc(15) * 256 & " Total:" & abc(18) + abc(19) * 256 + abc(20) * 65535
                        'For iover = 0 To bytesTotal - 1
                        '            Debug.Print abc(iover)
                        'Next
            Case "1771"
                        addsock Index, "仍然连接!"
                        wsk(Index).SendData abc()
            Case "FA0"
                        addsock Index, "成功登入房间!"
                        abc(2) = &HA1
                        wsk(Index).SendData abc()
            Case "FBE"
                        addsock Index, "房间获得中..."
                        wsk(Index).SendData data1()
            Case "FB7"
                        addsock Index, "服务器数据处理.."
                        ReDim jz(bytesTotal) As Byte
                        jz(0) = bytesTotal + 1
                        jz(2) = &HB8
                        jz(3) = &HF
                        jz(4) = &H1
              
                        For iover = 5 To bytesTotal
                                    jz(iover) = abc(iover - 1)
                        Next
                        wsk(Index).SendData jz()
            Case "7D0"
                        addsock Index, "加载用户信息..."
                        wsk(Index).SendData userinfo()
            Case "FA4"
                        addsock Index, "变更颜色!拒绝!"
                        p6(2) = &HA5
                        p6(3) = &HF
                        p6(4) = &H0
                        p6(5) = &H5
            Case "7D4"
                        addsock Index, "为用户建立房间."
                        wsk(Index).SendData createroom()
            Case "FB2"
                        addsock Index, "爽色你!!"
                        p4(2) = &HB5
                        p4(3) = &HF
                        wsk(Index).SendData p4()
            Case "FAA"
                        addsock Index, "开启音乐..."
                        p12(2) = &HAB
                        p12(3) = &HF
                        p12(4) = &H0
                        p12(5) = &H0
                        p12(6) = &H0
                        p12(7) = &H0
                        p12(8) = &H9C
                        p12(9) = &HED
                        p12(10) = &H7B
                        p12(11) = &HE
                        wsk(Index).SendData p12()
            Case "FBB"
                        addsock Index, "退出房间.."
                        abc(2) = &HBC
                        wsk(Index).SendData abc()
            Case "FA2"
                        addsock Index, "FA2 Request"
                        p6(2) = &HA5
                        p6(3) = &HF
                        p6(4) = &H0
                        p6(5) = &H0
                        wsk(Index).SendData p6()
            Case "FAC"
                        addsock Index, "音乐就绪.."
                        p5(2) = &HAD
                        p5(3) = &HF
                        p5(4) = &H0
                        wsk(Index).SendData p5()
            Case "FAA"
                        addsock Index, "嘎快就死外的?"
                        p12(2) = &HAB
                        p12(3) = &HF
                        p12(4) = &H0
                        p12(5) = &H0
                        p12(6) = &H0
                        p12(7) = &H0
                        p12(8) = &H9B
                        p12(9) = &H50
                        p12(10) = &HB7
                        p12(11) = &H2
                        wsk(Index).SendData p12()
            Case "BBD"
                        addsock Index, "退出房间.."
                        p8(2) = &HBE
                        p8(3) = &HB
                        p8(4) = &H0
                        p8(5) = &H0
                        p8(6) = &H0
                        p8(7) = &H0
                        wsk(Index).SendData p8()
            Case "BB8"
                        addsock Index, "更改房间名称!拒绝"
                        p10(2) = &HB9
                        p10(3) = &HB
                        p10(4) = Asc("%")
                        p10(5) = Asc("H")
                        p10(6) = Asc("O")
                        p10(7) = Asc("H")
                        p10(8) = Asc("O")
                        p10(9) = Asc("%")
                        wsk(Index).SendData p10()
            Case "FAC"
                        addsock Index, "准备歌曲..."
                        p5(2) = &HAD
                        p5(3) = &HF
                        p5(4) = &H0
                        wsk(Index).SendData p5()
            Case "7E8"
                        p12(2) = &HE7
                        p12(3) = &H7
                        p12(4) = &H0
                        p12(5) = &H0
                        p12(6) = &H0
                        p12(7) = &H0
                        p12(8) = &HB2
                        p12(9) = &H0
                        p12(10) = &H0
                        p12(11) = &H1
                        wsk(Index).SendData p12()
            Case "7E5"
                        addsock Index, "返回星球"
                        p8(2) = &HE6
                        p8(3) = &H7
                        p8(4) = &H0
                        p8(5) = &H0
                        p8(6) = &H0
                        p8(7) = &H0
                        wsk(Index).SendData p8
            Case "3EA"
                        addsock Index, "开始获取星球信息!"
                        wsk(Index).SendData room()
            Case "3F3"
                        addsock Index, "要求获得星球信息!"
                        wsk(Index).SendData loadserver()
            Case "FB9"
                        addsock Index, "专辑房间.."
                        p6(2) = &HBA
                        p6(3) = &HF
                        p6(4) = &H0
                        p6(5) = &H0
                        wsk(Index).SendData p6()
            Case "3F4", "3E8"
                        addsock Index, "准备获得星球信息!"
                        p8(2) = &HE9
                        p8(3) = &H3
                        p8(4) = &H0
                        p8(5) = &H0
                        p8(6) = &H0
                        p8(7) = &H0
                        wsk(Index).SendData p8()
            Case "13A4"
                        addsock Index, "分配客户空间!"
                        p8(2) = &HA5
                        p8(3) = &H13
                        p8(4) = &H91
                        p8(5) = &H2E
                        p8(6) = &H0
                        p8(7) = &H0
                        wsk(Index).SendData p8
            Case "3F1"
                        addsock Index, "尝试登陆游戏"
                        wsk(Index).SendData spass()
            Case "7D2"
                        addsock Index, "获得房间信息"
                        wsk(Index).SendData data2()
                        wsk(Index).SendData data3()
            Case "3EC"