资源描述
4S店客户管理系统V1.0
详细设计说明书
拟制人 日期 2011年03月16日
审核人 日期 2011年03月 16日
批准人 日期 2011年03月 16日
历史修改记录
序号
版本号
更改时间
更改内容描述
填写人
1
V1.0
2011-3-26
建立
2
V1.0
2011-6-08
修改
3
4
目 录
1、引言 1
1.1、编写目的 1
1.2 预期读者 1
1.3 系统名称及版本号 1
1.4 任务提出者 1
1.5 项目承接者和实施者 1
1.6 面向的用户群体 2
2、系统的组织结构 2
2.1 系统的组织架构图 3
3、界面设计要求 4
3.1 基本原则 4
3.1.1 界面设计样式 4
3.1.2 其他界面约定 5
3.2 用户界面设计规则 5
3.2.1 字体 5
3.2.2 尺寸 5
3.2.4 自适应对象的尺寸改变 5
4、程序描述 5
4.1 数据库设计 5
4.2 数据库接口 6
4.3 系统登录 10
4.5 基本页面结构 13
5、模块设计 25
5.1模块一:数据库处理模块 25
5.2模块二:会员管理模块 25
5.3模块三:权限管理模块 26
5.4模块四:短信发送模块 27
5.5模块五:违章查询模块 27
5.6模块六:系统设置模块 28
1、引言
1.1、编写目的
编写本详细设计说明书的目的在于详细的说明4S客户管理系统的各个模块,确定系统的详细功能模块和数据结构,为下阶段开发工作提供依据。
本手册作为系统的详细设计说明书,将为编码人员从事本系统的编写工作提供一套详实的、可操作性强的文档。
1.2 预期读者
本文档的读者为4S店客户管理系统项目组开发小组成员、集成小组成员、测试小组成员、维护人员等。
1.3 系统名称及版本号
中文名称:4S店客户管理系统
系统版本:V1.0
1.4 任务提出者
项目组组长:xx
1.5 项目承接者和实施者
xxx科技有限公司
4S店客户管理系统项目组
1.6 面向的用户群体
角色
人员
描述
管理系统角色
系统管理员
管理整个系统的人员,分配分店用户
分店管理员
配置本店系统参数
信息审批员
审核短信发送
系统服务角色
业务管理员
查看数据,添加数据等
客户服务员
查看数据、发送短信等
系统服务角色
最终用户
获得信息
2、系统的组织结构
系统主要是依托在数据库上的B/S结构的管理系统,是对众多数据的管理和查看,而表现出来的功能模块,都与数据库操作相关。结合权限管理,合理限制各使用角色的操作过程,有效实现系统既定需求目标。
系统的总体设计遵循如下的原则。
1)系统应具有良好的适应性:能适应用户对系统的软件环境、管理内容、模式和界面的要求;
2)系统应具有可靠性:采用成熟的技术方法和软件开发平台,以保证系统在以后的应用中安全、可靠;
3)系统应具有较好的安全性:应提高安全机制和用户权限限制机制的完善程度,确保数据的受限访问;
4)系统应具有良好的可维护性:系统应易于维护、安装;
5)系统应具有良好的可扩展性:系统应适应未来信息化的要求,能方便地进行功能扩展,以建立完善的信息集成管理体系
2.1 系统的组织架构图
权
限
管
理
模
块
数据库
数据库管理模块
会员资料管理模块
短信发送管理模块
违章查询管理模块
系统设置管理模块
1)数据库
数据库是系统的基础,为了使系统便于安装和维护,结合需求中要求的数据数量等级,系统使用MYSQL数据库。
2)数据库管理模块
为了使系统涉及的数据库相关操作更加简单可靠,增加可读性和复用性,将数据库操作封装成模块,使用一个类来实现数据库的增、删、改、查功能。
3)权限管理模块
权限管理模块包括权限检查和权限管理,权限通过单权限和角色来实现,首先建立操作员,为操作员分配角色,而对应的角色具有相应的权限,以此来实现权限的管理。权限的检验只检验单项权限,权限值为数字,单项权限为2的n(n取值0-20)次方计算出来的,角色所拥有的权限为各项权限值相加得到,通过“用户权限&该项操作所需权限>0”来检验是否具有该项权限。
4)系统设置模块
系统设置模块主要是作为程序扩展的一个部分单独出来,具有通用性,与系统具体功能无关,包括如下功能:
A、 登录管理
B、 菜单管理
C、 页面自动生成
D、 字典表定义(键、值对应参数)
5)违章查询管理模块
该模块主要实现和违章数据库的接口,实现会员违章查询功能,查询模块与违章数据库使用直连接口,即直接查询违章数据库。
6)短信发送管理模块
该模块主要实现短信发送功能,与违章查询类似,短信发送模块使用直连数据库的方式,将信息发送到待发表中,短信发送功能的实现需要借助SP的短信网关,或者安装短信猫程序,接口则使用直接写入数据库这种模式。
7)会员资料管理模块
该功能是4s管理系统的核心功能,实现信息资料的录入、修改、查询、删除等功能,根据需求,编写相应的界面。
3、界面设计要求
3.1 基本原则
根据需求分析,对界面的要求主要为响应速度快、简洁美观、字体大小适中、功能列表清晰、颜色明快。结合需求,将界面设计为框架模式,分上、左、中、右4个模块,上部内容为系统名称、常用功能、当前时间、当前登录用户信息;左部内容为菜单,菜单分为大菜单和子菜单,主要是为了使功能分块清晰,使用户更容易找到需要的功能,左部可通过点击边缘按钮进行隐藏,使中部显示具有更大的窗口,方便用户查看和操作;中部内容为主要显示部分,操作功能、展示都在中部实现,是系统的主要部分;右部内容为帮助,默认隐藏不显示。
3.1.1 界面设计样式
界面主要部分为灰色,装饰部分使用蓝色,按钮蓝色带花纹,菜单使用图片、文字相结合模式,表格使用深灰色1像素宽线条分割,操作以10*14像素大小图标美化。
3.1.2 其他界面约定
界面尽量使用CSS样式表来定义视觉效果。
3.2 用户界面设计规则
3.2.1 字体
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
3.2.2 尺寸
100%适应窗口大小
3.2.3 布局
标题栏
菜单
主功能区
帮助
3.2.4 自适应对象的尺寸改变
100%自适应窗口大小
4、程序描述
4.1 数据库设计
数据库设计请参考《数据库设计》
4.2 数据库接口
数据库接口封装成一个类db_mysql.php,程序代码如下:
<?php
/*
*######################################
* Sea DMS
*######################################
*/
class db {
var $querynum = 0;
var $cn;
function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0) {
if($pconnect) {
if(!$this->cn=@mysql_pconnect($dbhost, $dbuser, $dbpw)) {
$this->halt('Can not connect to MySQL server');
}
} else {
if(!$this->cn=@mysql_connect($dbhost, $dbuser, $dbpw)) {
$this->halt('Can not connect to MySQL server');
}
}
if($this->version() > '4.1' && $GLOBALS['charset']) {
//ATTENTION: remove the following line if you want to use the default database character set.
mysql_query("SET NAMES 'gbk'", $this->cn);
}
if($this->version() > '5.0') {
mysql_query("SET sql_mode=''", $this->cn);
}
if($dbname) {
mysql_select_db($dbname, $this->cn);
}
}
function select_db($dbname) {
return mysql_select_db($dbname, $this->cn);
}
function fetch_array($query, $result_type = MYSQL_ASSOC) {
return mysql_fetch_array($query, $result_type);
}
function query($sql, $type = '') {
if($type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query')) {
$query = mysql_unbuffered_query($sql);
} else {
if($type == 'CACHE' && intval(mysql_get_server_info()) >= 4) {
$sql = 'SELECT SQL_CACHE'.substr($sql, 6);
}
if(!($query = mysql_query($sql, $this->cn)) && $type != 'SILENT') {
$this->halt('MySQL Query Error', $sql);
}
}
$this->querynum++;
return $query;
}
function affected_rows() {
return mysql_affected_rows($this->cn);
}
function error() {
return mysql_error($this->cn);
}
function errno() {
return intval(mysql_errno($this->cn));
}
function result($query, $row) {
$query = @mysql_result($query, $row);
return $query;
}
function num_rows($query) {
$query = mysql_num_rows($query);
return $query;
}
function num_fields($query) {
return mysql_num_fields($query);
}
function list_tables($query) {
return mysql_list_tables($query);
}
function free_result($query) {
return mysql_free_result($query);
}
function insert_id() {
$id = mysql_insert_id($this->cn);
return $id;
}
function fetch_row($query) {
$query = mysql_fetch_row($query);
return $query;
}
function version() {
return mysql_get_server_info();
}
function close() {
return mysql_close($this->cn);
}
function halt($message = '', $sql = '') {
echo "MySQL Query:$sql<br> Message:".$this->error();
exit();
}
}
?>
4.3 系统登录
登录需要登录名、密码和图片验证码,图片验证码使用数字验证码,在用户打开页面时通过checkcode.php文件生成,同时注册一个Session,用于验证用户输入。checkcode.php代码如下(需要php.ini开去gd2):
<?
$img_width=70; //先定义图片的长、宽
$img_height=23;
function creatpwd($len)
{
//根据需要,可以加入英文字母
$word = array("0","1","2","3","4","5","6","7","8","9");
srand((double)microtime()*1000000);
for($i=0; $i<$len; $i++)
{
$rand = rand();
srand($rand);
$single = $rand%10;
$pwd .= $word[$single];
}
return $pwd;
}
$temp_pwd = creatpwd(4);
session_register("temp_pwd");
$aimg = imageCreate($img_width,$img_height); //生成图片
ImageColorAllocate($aimg, 255,255,255); //图片底色,ImageColorAllocate第1次定义颜色PHP就认为是底色了
$black = ImageColorAllocate($aimg, 0,0,0); //定义需要的黑色
ImageRectangle($aimg,0,0,$img_width-1,$img_height-1,$black);//先成一黑色的矩形把图片包围
//下面该生成雪花背景了,其实就是在图片上生成一些符号
for ($i=1; $i<=100; $i++) { //先用100个做测试
imageString($aimg,1,mt_rand(1,$img_width),mt_rand(1,$img_height),"*",imageColorAllocate($aimg,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
}
//上面生成了背景,现在就该把已经生成的随机数放上来了。道理和上面差不多,随机数1个1个地放,同时让他们的位置、大小、颜色都用成随机数~~
//为了区别于背景,这里的颜色不超过200,上面的不小于200
for ($i=0;$i<strlen($temp_pwd);$i++){
imageString($aimg, mt_rand(3,5),$i*$img_width/4+mt_rand(1,10),mt_rand(1,$img_height/4), $temp_pwd[$i],imageColorAllocate($aimg,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200)));
}
//Header("Content-type: image/png"); //告诉浏览器,下面的数据是图片,而不要按文字显示
ImagePng($aimg); //生成png格式
ImageDestroy($aimg);
?>
登录时在数据库中验证用户名和密码,验证通过后,查询用户所属分店、角色、用户名、用户编号,再根据角色取得权限,并将这些值注册成为SESSION,使之在总个会话过程有效。成功后跳转至主框架页面frame.php。
4.4 权限检查
权限检查在每一个页面开始都需要包含,名称为:login.php,用于检验用户是否合法登录,保证系统安全,程序代码如下:
<?
session_start();
//检验用户是否登录
if($_SESSION["session_user_power"] <= 0)
{
?>
<link href="main.css" rel="stylesheet" type="text/css">
<table width="300" border="0" align="center" cellpadding="6" cellspacing="0" class="d">
<tr>
<td align="center">
<font color="#FF0000">你未登录或者权限不够进行此操作!</font><br><br>
[<a href="index.php" target="_parent">登录</a>] [<a href="javascript:window.close()">关闭窗口</a>]
</td>
</tr>
</table>
<?
exit();
}
?>
权限检查语句如下所示:
if(($session_user_power&该页面所需操作权限)==0)
{
echo "权限不足!";
exit();
}
4.5 基本页面结构
因为大部分的功能页面,都是通过数据库操作来实现其功能,所以具有类似性,规定数据库相关操作页面,分为3个基本页面,及浏览页面_view.php,编辑和添加页面_edit.php,功能实现页面_do.php,view页面实现数据库数据的查询、展示功能,edit页面实现用户输入功能,do页面将用户输入提交到数据库保存。
View页面的大致结构,如需显示不同数据库表中的数据,则只需要修改主显示区域部分即可,其他部分可以复用:
<?
//权限检查
require_once("login.php");
//数据库
require_once("opendb.php");
//全局函数
require_once("global.php");
//操作权限检查
if(($session_user_power&16)==0)
{
echo "权限不足!";
exit();
}
?>
<link href="main.css" rel="stylesheet" type="text/css">
<script language="javascript">
//<!--
function delmsg(id)
{
if(confirm("真的要删除吗?"))
{
window.location = "car_series_do.php?action=delete&id="+id;
}
}
//-->
</script>
<?
//1为管理员权限,如果非管理员,则只能查看本分店的信息
if(($session_user_power&1)==0)
$addition = " parent_id='".$session_company."'";
else
$addition = " 1 ";
$url = "&action=".$action;
//根据关键字进行查询
if($key_word != "")
{
$addition .= " AND ".$key." LIKE '%".$key_word."%'";
$url .= "&key=".$key."&key_word=".$key_word;
}
$addition = " car_series WHERE ".$addition;
//分页
if($pagesize <= 0 || $pagesize == "")
$pagesize = 30;
if($cur_page == "")
$cur_page = 1;
$max = $db->fetch_array($db->query("SELECT COUNT(*) as c FROM ".$addition));
if(($max["c"]/$pagesize) == floor($max["c"]/$pagesize))//分页显示初始化
$max_page=floor($max["c"]/$pagesize);//假如可以整除
else
$max_page=floor($max["c"]/$pagesize)+1;//否则再加一页显示
if($max_page == 0)//如果总页数为0
$max_page = 1;//显示1页
//排序
if($orderby == "")
$orderby = "id";
if($desc == "")
$desc = "desc";
if($desc == "desc")
{
$img_src = "images/down.gif";
}
else
{
$img_src = "images/up.gif";
}
?>
<!—查询表单-->
<form name="form1" method="post" action="<?=$PHP_SELF?>?action=submit">
<table width="400" style="border: 1px solid #999999;" cellspacing="0" cellpadding="3" class="d">
<tr align="left">
<td width="30">
<input type="button" value="添加" onclick="javascript:window.location='car_series_edit.php'">
</td>
<td width="80">
<select name="key">
<option value="id" <?if($key == id) echo "selected";?>>编号</option>
<option value="name" <?if($key == name) echo "selected";?>>车系</option>
</select>
</td>
<td width="80">
<input type="text" value="<?=$key_word?>" size="10" name="key_word">
</td>
<td>
<input type="submit" value="查询">
</td>
</tr>
</table>
</form>
<!—主显示区域开始-->
<table width="400" border="1" style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="3" class="d">
<tr align="right">
<td colspan="3">
<?
if($cur_page>1){?>
<a href=<?=$PHP_SELF;?>?cur_page=1<?=$url?>>
<?}?>
首页</a>
<?if($cur_page>1){?>
<a href=<?=$PHP_SELF;?>?cur_page=<?=$cur_page-1;?><?=$url?>>
<?}?>
上一页</a>
<?if($max_page>1&&$cur_page<$max_page){?>
<a href=<?=$PHP_SELF;?>?cur_page=<?=$cur_page+1;?><?=$url?>>
<?}?>
下一页</a>
<?if($max_page>1&&$cur_page<$max_page){?>
<a href=<?=$PHP_SELF;?>?cur_page=<?=$max_page;?><?=$url?>>
<?}
?>
尾页</a>
<?echo $cur_page."/".$max_page;?> <?=$max["c"];?>
</td>
</tr>
<tr align="center" bgcolor="#E5E5E5">
<td width="100" align="center"><a href="<?=$PHP_SELF?>?orderby=id&desc=<?=$desc=="desc"?"asc":"desc"?><?=$url?>">编号</a><?if(id==$orderby){?><img src="<?=$img_src?>" border="0"><?}?></td>
<td width="100" align="center"><a href="<?=$PHP_SELF?>?orderby=name&desc=<?=$desc=="desc"?"asc":"desc"?><?=$url?>">车系</a><?if(name==$orderby){?><img src="<?=$img_src?>" border="0"><?}?></td>
<td width="100" align="center">操作</td>
</tr>
<?
$addition .= " ORDER BY ".$orderby." ".$desc." ";
$addition .= " LIMIT ".($cur_page-1)*$pagesize.",".$pagesize;
$sql = "SELECT * FROM ".$addition;
// echo $sql;
$rss = @$db->query($sql);
while($rs = $db->fetch_array($rss))
{
?>
<tr>
<td width="100" align="center"><?=$rs["id"]?></td>
<td width="100" align="center"><?=$rs["name"]?></td>
<td width="100" align="center">
<?if(($session_user_power&16) > 0 ){?>
<a href="car_series_edit.php?id=<?=$rs["id"]?>&action=edit">编辑</a>
<?}if(($session_user_power&16) > 0 ){?>
<a href="javascript:delmsg(<?=$rs["id"]?>);">删除</a>
<?}?>
</td>
</tr>
<?
}
?>
<tr align="right">
<td colspan="3">
<?
$url .= "&orderby=".$orderby."&desc=".$desc;
if($cur_page>1){?>
<a href=<?=$PHP_SELF;?>?cur_page=1<?=$url?>>
<?}?>
首页</a>
<?if($cur_page>1){?>
<a href=<?=$PHP_SELF;?>?cur_page=<?=$cur_page-1;?><?=$url?>>
<?}?>
上一页</a>
<?if($max_page>1&&$cur_page<$max_page){?>
<a href=<?=$PHP_SELF;?>?cur_page=<?=$cur_page+1;?><?=$url?>>
<?}?>
下一页</a>
<?if($max_page>1&&$cur_page<$max_page){?>
<a href=<?=$PHP_SELF;?>?cur_page=<?=$max_page;?><?=$url?>>
<?}
?>
尾页</a>
<?echo $cur_page."/".$max_page;?> <?=$max["c"];?>
</td>
</tr>
<?if(($session_user_power&1) > 0){?>
<tr>
<td colspan="3"> <? echo $sql;?>
</td>
</tr>
<?}?>
</table>
<!—主显示区域结束-->
Edit页面结构如下,如需要操作其他数据库,需要修改相应部分的代码:
<?
require_once("login.php");
require_once("opendb.php");
require_once("global.php");
//权限检查
if(($session_user_power&16)==0)
{
echo "权限不足!";
exit();
}
//如果是编辑,则需要将原数据库信息取出作为比较
if($action == "edit")
{
//定义需要操作的数据库表
$sql = "SELECT * FROM car_series WHERE id='".$id."'";
$rs = $db->fetch_array($db->query($sql));
//取得原信息内容
$name = $rs['name'];
}
?>
<link href="main.css" rel="stylesheet" type="text/css">
<form name="form1" method="post" action="car_series_do.php?action=<?if($action=="edit") echo "update";else echo "insert";?>">
<table width="400" style="border: 1px solid #999999;" cellspacing="0" cellpadding="3" class="d">
<!—主操作区域开始-->
<tr>
<td width="100" align="center">车系</td><td width="300"><input type="text" name="name" value="<?=$name?>"></td>
</tr>
<!—主操作区域结束-->
<tr align="center">
<td colspan="4" bgcolor="#CCCCCC">
<input type="submit" name="Submit" value="提交">
<input type="hidden" name="id" value="<?=$id?>">
<input type="button" value="返回" onClick="javascript:history.back(-1)">
</td>
</tr>
</table>
</form>
Do页面的基本结构,根据需要修改相应的SQL语句即可:
<?
require_once("login.php");
require_once("opendb.php");
require_once("global.php");
//权限
if(($session_user_power&16)==0)
{
echo "权限不足!";
exit();
}
//处理增加、更新、删除
if($action == "insert" || $action == "update" ||$action == "delete")
{
//增加记录
if($action == "insert" && ($session_user_power&16) > 0)
{
$sql = "INSERT INTO car_series (name,parent_id) VALUES ('$name','$session_company')";
}
//修改记录
else if($action == "update" && (($session_user_power&16) > 0))
{
$sql = "UPDATE car_series SET name='$name' WHERE id='$id' and parent_id='".$session_company."'";
}
//删除记录
e
展开阅读全文