项目感想
从开始的设计来说吧,自己的问题主要出现在设计阶段,开始设计的时候对这个项目还不熟悉,因为很少用商城,对商城的具体流程不清楚,就看了很多开源的商城,还有网上大型的商城,但是在数据库设计过程中还是出现了几个问题。
后台设计
1. 订单模块是自己需求设计中最失败的地方,当时想的是把用户购买的商品用一个字符串存储起来,n件商品就需要一个字符串,一条记录就能搞定,不用想常规方法用几条记录存储,但是存取的时候没有问题很简单,开始的时候自己没有想到订单要存的信息很多,不光是商品名字,价钱,最重要的还有数量,这些参数整成一个字符串,然后玩字符串把他拿出来存进去,算法还不算难,但是在做最后统计的时候就纠结了,因为只有一条记录,这条记录中的内容还很多,而且没规律,想统计很麻烦,最后还是选择了常规方法,用多条记录存,虽然数据库存的多点,但是做统计很easy几条关联查询搞定;
2.在商品模块中把商品类型和商品品牌弄混了,导致商品在做无限分类的时候没有标识的字段,还有商品分热卖,推荐,打折等,同样在数据库中没有设置字段进行标识;
3. 在会员模块中,添加会员部分少了会员级别的无限分类,导致在添加会员的时候不能设置会员的级别;
4.统计模块,觉的自己设计的统计内容不够详细,没有满足用户需求,只是统计了每件商品利润,销售额,还有总的销售额,和总利润,还有每个用户的消费的额,还有站内的访问量,注册量等等还有没想的到没统计,没有设计好;
5.在传奇私服设计的部分,主要文件存放的位置还行,首页文件include的几个页面存放的位置在设计之前没有考虑到,全放在和主页面同传奇私服下,弄的传奇私服结构显的很乱;
前台
6.主要就是感觉自己会员模块做的不好,开始设计的时候忽略了,里面的功能没有想完整
项目感觉做的好的地方
1.重复的功能尽量写成函数来require用,比如说分页,添加商品模块中的分类列表,会员等级列表,上传加水印缩放函数,数据库查询函数(当然是能满足当时需求的简单函数)时期函数等,用到时候就包含调用,使重复代码量减少;
2. 写的函数也比较灵活,如分页的函数的url 是从$_SERVER[]中拿到的,只要包含就能用,统计中按照日期查询的函数中日期的区间是数据库中最小的日期的0时0分到当前日期的23时59分等,都是根据能根据不同的应用环境自己适应的,(就是感觉查询数据库花的开销大)
3.采用了缓存文件,在订单确认时,不仅插入数据库,而且还在本地生成一个文本文件,在自己查询的时候,首选是从本地文本文件中读取,当文件不存在时从数据库中读取,(可能这个缓存文件用的位置不对,感觉应该把首页的内容加入缓存文件才对)
4. 购物车的应用只采用了一个session变量实现,里面存了一个一维数组,一个以商品id 为键值,私服传奇,商品信息如 价格,名称 数量等 形成一个以逗号分隔的字符串作为值的数组,避免你在重复点击时候的累加,还有用多个session 来存储的问题,只用了一个一维数组;
5.冒险岛私服文件中每个功能模块划分清晰,一般是每个功能一个文件;
6.功能条例清晰,1.85合击传奇,功能之间相互调用,而又能独立运行,不会因为某个功能甭贵而到时其他功能崩溃,移植的时候只要导入数据库就能使用;
7. 前台各个栏目都是从数据库中拿出去的,如无限分类,热卖,打折,新货等各种商品等,就是说你只要改变后台的一下数据,前台就能随之改变,能保持前后台的互动;
8.前台的主体页面结构是通过一个页面控制器get 不同的 interface 值 ,根据不同的请求,include不同的页面,避免重复加载头和尾页面;
9.搜索中,不仅能在搜索框中搜索,还能在点击热门关键字进行搜索
总结--
自己的问题主要出现在设计阶段,说白了,自己不知道把网站做成什么样的,觉得自己平常上网太少,对商城还有其他产品的了解太少,以后上网的时候多注意观察吧,了解各个关节,和其他网站提供的功能,还有优化自己的界面,多看大网站的源代码,开阔眼界吧,对于算法, 感觉没遇到什么砍,大部分都是做过的,今日新开传奇,思路比较清晰,但是肯定还有很多需要优化的方面,其实在刚做完项目还有做项目的时候想法和感想很多,时间一久,或者说学了面向对象,知道东西一多,觉的自己做的太烂了,面向对象是重点,希望自己能在代码中不断提高
//========================================================================
//TITLE:
// 在C++类中实现Windows窗口的创建
//AUTHOR:
// norains
//DATE:
// Thursday 9-November-2006
//========================================================================
在面向过程的方法中实现窗口的创建很简单,但有个非常明显的缺点,就是封装不好。如果是自写自用,倒不是一个很大的问题,www.30ok.com,但如果是写给用户的,可能用户在包含头文件之后,看到那一大堆函数以及变量声明就已经晕掉。最好的方法当然是使用类,只给使用者留出应该使用的接口。但这会有个问题,就是消息处理函数必须为static的CALLBACK,否则编译会出错;但如果消息处理函数为static,其就归属于类,就根本无法调用对象的成员函数,而这个在经典的《windows 程序设计》中也没有涉及到。
难道我们就只能束手无策,只能采用面向过程的方法了么?那倒未必,毕竟在MFC框架中已经做到,那么相信我们也可以做到。经过一番摸索,终于找到在类中创建窗口的方法,在此不敢独享,放出代码和大家探讨。
为便于理解,代码的作用很简单,仅仅是完成了类的声明和对话框的创建,唯一多余的是在接收到WM_INITDIALOG消息时弹出一个消息框,以证明private函数能够正常调用。
代码首先是声明一个CMainDlg类:
///////////////////////////
//MainDlg.h
///////////////////////////
class CMainDlg
{
//--------------------------------------------------------------------------------------------
public:
//静态的回调函数
static BOOL CALLBACK CMainDlg::MainDlgProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam);
//-------------------------------------------------------------------------------------------
//Function
public:
//构造函数
CMainDlg(HINSTANCE hInst);
//析构函数
virtual ~CMainDlg();
//创建对话框
BOOL CreateMainDlg();
//消息调用函数,具体意义请参见函数的实现
BOOL CallDlgProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam);
private:
//临时测试调用函数,仅作为调试用
void TempTestFuncion(){MessageBox(NULL,L"test",L"",NULL);};
//---------------------------------------------------------------------------------------------
//数据成员
private:
HINSTANCE m_hInst;
HWND m_hDlg;
};
然后是MainDlg类的实现:
/////////////////////////////////
//MainDlg.cpp
////////////////////////////////
#include "stdafx.h"
#include "MainDlg.h"
#include "resource.h"
//全局指针,用来指向所创建的对象,即this的指向对象
CMainDlg *g_pDlg = NULL;
//消息的回调函数的实现
BOOL CALLBACK CMainDlg::MainDlgProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
{
if(g_pDlg != NULL)
{
//如果this指针不为空,则调用CallDlgProc函数
return g_pDlg->CallDlgProc(hWnd,复古传奇,wMsg,wParam,lParam);
}
return FALSE;
}
//构造函数
CMainDlg::CMainDlg(HINSTANCE hInst)
{
g_pDlg = this; //存储this对象到全局变量中
m_hInst = hInst;
}
//析构函数
CMainDlg::~CMainDlg()
{
}
//创建对话框
BOOL CMainDlg::CreateMainDlg()
{
m_hDlg = CreateDialog(m_hInst,MAKEINTRESOURCE(IDD_MAIN_DLG),NULL,MainDlgProc);
if(m_hDlg == NULL)
{
return FALSE;
}
ShowWindow(m_hDlg,TRUE);//显示窗口
return TRUE;
}
//真正的消息处理函数,在这里可以任意调用对象的成员函数
BOOL CMainDlg::CallDlgProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
{
switch(wMsg)
{
case WM_INITDIALOG:
TempTestFuncion(); //norains:测试的私有函数
break;
}
return FALSE;
}
这是在主程序中对类的的调用:
//////////////////
//MainApp.cpp
//////////////////
#include "stdafx.h"
#include "MainDlg.h"
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
//声明一个对象
CMainDlg mainDlg(hInstance);
//创建并显示窗口
if(mainDlg.CreateMainDlg() == FALSE)
{
return 0x05;
}
//消息循环
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
这段代码的关键点在于MainDlgProc声明为类的static函数,以及使用g_pDlg来存储this对象指针,并在MainDlgProc中调用。只要注意到这两点,在类中创建一个窗口就不是一件非常困难的事情。
对于CallDlgProc()函数,可能有不少人觉得是鸡肋,因为相同的功能完全可以在MainDlgProc()中实现,比如这程序的代码完全可以撇开CallDlgProc()写成这样:
BOOL CALLBACK CMainDlg::MainDlgProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
{
if(g_pDlg != NULL)
{
switch(wMsg)
{
case WM_INITDIALOG:
g_pDlg->TempTestFuncion();
break;
}
}
return FALSE;
}
所完成的功能和之前的代码相同。不过如果要更改之后的代码正常工作的话,还需要把TempTestFuncion()函数声明为public。也许有的读者已经发现问题之所在:如果对消息相应的处理函数不多,这样倒是可以;但如果很多的话,那么那些消息相应函数都需要声明为public,并且这些消息响应函数都是用户不可能用到的!用户看到如此之多用不到的public函数,即使没头晕,也需要好一阵子才能回神过来。
所以呢,CallDlgProc()函数只是起到一个缓冲作用,不必要把所有的消息相应函数都暴露给用户。虽然这样做也暴露了CallDlgProc()函数,但毕竟相对于上十个甚至上百个消息响应函数而言,仅仅只是暴露一个没什么作用的CallDlgProc()函数函数,应该能让用户减轻不少负担才是。
在网上看到有一个方法不是采用全局变量,而是直接设置窗口数据,然后再获取。这方法比较有意思,在此将更改的代码贴出:
BOOL CMainDlg::CreateMainDlg()
{
m_hDlg = CreateDialog(m_hInst,MAKEINTRESOURCE(IDD_MAIN_DLG),NULL,MainDlgProc);
if(m_hDlg == NULL)
{
return FALSE;
}
ShowWindow(m_hDlg,TRUE);//显示窗口
SetWindowLong(m_hDlg,GWL_USERDATA,(LONG)this);//将this指针传递给窗口
return TRUE;
}
BOOL CALLBACK CMainDlg::MainDlgProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
{
static CMainDlg * pDlg = NULL;
if(pDlg == NULL)
{
pDlg = (CMainDlg *)GetWindowLong(hWnd,GWL_USERDATA);
}
if(pDlg != NULL)
{
switch(wMsg)
{
case WM_INITDIALOG:
pDlg->TempTestFuncion();
break;
}
}
return FALSE;
}
这段代码关键就只在于两个函数:SetWindowLong()和GetWindowLong().很巧妙地让窗口通过这两个函数来传输this对象,的确是一个很好的方法.
网通传世私发布网服
请使用1024*768分辨率浏览本站以达到游戏最佳视觉效果
打击盗版支持正版游戏 任何组织或个人未经同意,不得使用和传播盗版游戏,如有侵犯利益请来电告知说明,本站72小时内删除。