帮助你开发基于MySQL数据库的论坛设计_MySQL
1。系统架构: EA vK| `
采用模块化思想,分为3层: q,n,B|Q
NY7f
a。数据存储层:使用MySQL来存放bbs的所有数据,包括用户信息,文章数据,用户信件,用户消息,系统数据(?),关键问题: 数据库的规划,是否用文件来辅助。 ! _Q"
CB[H 2
b。系统功能层:完成bbs的基本功能,由多个并列模块组成,向下调用mysql的函数访问数据库,向上,接受处理请求,将处理的结果返回上层,根据请求类型,返回成败结果和其他数据。而且模块高度灵活,可以方便的修改增加。包括: V|1Q4[Yc
O3c"afU
** 用户模块,处理用户的注册,基本数据的修改,权限的变化,网友信息的查询。 e`i K%C;)
** 版面模块,完成文章发表,文章的读取,文章的删除,文章的加标记,读改删权限检查,此模块对数据库的要求最高。 VqZ .K(9
** 精华区模块,包括精华区的文章,目录的增加,删除,上下移动 S ]2u|S
!_u{|t
'%H8 pm
(?)读改删权限检查,目录结构是其中的难点。 n' y/':K
-rZ%??[rC
** 信件模块,包括发新信件,读删信件,信笺标记,新信件的通知 :U-k* 3e
** 消息模块,包括发送消息,接受消息,新消息通知,消息回顾,消息存信件。 \i#" (w!Q
** 系统动态模块,包括当前上站人数,当前动态,由于变动频繁,此类数据用共享内存实现可能更好。 j" :e#Apb
** 聊天模块,双人聊天是否能借鉴icq的做法,由双方直接通话,但聊天结果存信件可能较麻烦,同时,为兼容telnet功能,当上层服务层为telnet时,增加专门的模块来进行处理。 (.?|T4
** 聊天室模块,利用共享内存还是数据库?开房间,里面的权限问题。根据需要,还能增加新的功能。例如:活动看板模块,但对于非telnet终端,意义好象不大。。。。。
3。数据库设计 ]AD]O?
O~.{XT$
关键还是MySQL的效率问题,合理分配mysql的内存,特别是table cache的 K!?c-1[~}(
大小。另外,当系统突然掉电呢?mysql是否robust? 6b]~K[cp%
table的名字设计,采用一位前缀表明类型,全部用小写表示(?),例如: &WOC)^ Ia
系统的数据库,以s为前导,如用户表:suser(sUSER 呢?),具体如下: }0gv0Q#
~^s=i,O
s :系统表,suser,sclass wJidO_Tu_
m :用户信件表,msysop,mdrangon ia "3A)4
w :用户消息表,wsysop,wdrangon mpx9@4pk>
a :版面索引表,aLinux,acampus e\7*9~}?
b :版面文章表,blinux,bcampus '{{bfIHz
c :特殊分类版面表,cnewboard _cY&(_
i :精华区索引表,ilinux,ilinux01,icampus,icampus04 g@jk'l
j :精华区文章表,jlinux,jcampus, k9 O5S~^U
(I?C5*Yu
另外,是使用字串还是数字作为标识呢?例如,一个叫sysop的帐号,其 g@;uj Or'
id是1,他的信的表是msysop还是m00001呢?同样,一个叫campus的版,对应的 5oc:%{ L$
代码是5,则这个版的文章的表名是bcampus还是b00005呢?可能用字串会容易 PSf V #3
理解,查错吧。 lR73 R|;
l?e.%QRW
用户信息表:suser +>:B-hD^.A
X ~xt[`s_
usernum int unique, // 唯一标识符,最多30000个帐号,会不会太少了? \p>N^n-q
userid char[20] primary key, // 排序的关键字,id,全小写。 XLd@on3?f
passwd char[20], // 密码,存放加密后的密文。 Jr3=i
realid char[20], // 实际id,大小写混合。 9'xg>PS
username char[24], // 用户的泥称 7b
userlevel longint, // 64种权限? hQrV~P9\c
nUMLogins int, xas T3G
numposts int, YuFmcPmT
firstlogin time, BR?eE@3
lastlogin time, r%3.H
staytime time, /* 总共停留时间 */ FD#JN3L1!
lasthost char[32], 6j%+RR
email varchar[100], v(0TszV
address varchar[100], sN7*a )7b
;dw*g5L)
// 还需要其他数据吗?是否需要留出一定的保留值,以后alter table来 XDHhobR
// 增加新的字段时,效率如何? t#t'S?@
d!_lxJ?w
版面分类表:sclass {>]h*)% $
;X 4:9J E
classnum int unique, // 分类标识 cfDb3,!PU
classid char[20], // 分类的英文id:computer uf8|mvac
classname varchar[100],// 分类的中文描述:电脑世界 6} u2yx1
classtable char[20], // 特殊分类对应的版面表 5 pz\ &
// 一般来说,每个版面只属于一个分类,对于特殊分类,例如拳头版块, EsGx\0Y|k
// 新版面,可以用专门的表来描述 aj Jjgs;
版面表:sboard DY\Q[=X
k|a[T(
boardnum int unique, // 版面的标识(需要吗?) W0@_:CFYa
boardid char[20], // 版面的英文名 \g.@+=cSR
boardname varchar[100], // 版面的中文名 *i&h`
boardclass char[20], // 版面所属分类 {n/L}w_Z
boardsysop varchar[100], // 斑竹名单 ]y{wUf k
boardposts int, // 版面的文章数 B22[ER
boardlevel int, // 版面的读写权限 a3_=C!A7H
indextable char[20], // 版面对应的索引表的名称:aboardid? RGf5g #
texttable char[20], // 版面对应的文章表名称: bboardid? >38CZUP
$)zW0oa
// 最后两项有没有必要出现,是否可以作为必然对应关系,还是允许 =(&"F\r@X
// 出现更大的灵活性?另外版面的大小写问题是否可以直接默认 QO} y_~@
// 只开头字母大写, `AvA 34S;
d"Xf`@B&ZZ
特殊分类版面表:snewboard, sstarboard )\hbT[s%
k/bqGHYb
boardid char[20], // 版面的id )_17O93d7W
// 这样的表有必要吗? o^}&o,+
qT'wA*{
版面索引表:acampus,aLinux,afootball。。。。。。 00,Viq6
V\T7W|(
id int, // 文章序数,要手动调整???? dMq nEP@
mark char[1], // 文章标记,m,g,b,d。。。。 WqZ9Dn3l
title varchar[100], // 文章标题 @ThXa"
writer char[20], // 文章作者id i1 +Q@pw
posttime time, // 发表时间 .,&y>
textnum longint, // 对应的编号???不调整 U/jc[j@
qhPa{~
版面文章表 $lq H
zzaoFki[
textnum longint, // 文章编号? c{8=MZvM\
textword text, // 文章内容? v3*wj*Bk
Pil=(%s
// 有必要将索引和文章内容分开吗?从效率上看,况且lazy flush /eJ*o~U&
// 是必然的。删除也是先做个标记。 DFqN|i_ `
d;R.o
// 用户中的版面文章是否未读的数据比较繁,是否应该再建一堆的表 i| O~^DVD
// 才能实现呢? *Z',OZxB
// 投票功能暂不考虑。。。。
4。用户模块设计 D
对于底层数据库,调用MySQL的C API函数来进行数据库的修改,内部保存一定的状态变量(例如用户名,还是留给上一层完成?),对上一层,则提供用户管理的接口。 ,3$]1*K- 9
+.6"#p"PF
Class UserManage { ~(JH>?ncMI
private: \d.GW9FV
char myuserid[20]; // 用户的id,未登陆前为空 JPmJ
time logintime; // 用户登陆时间,并用于计算停留时间 Pw_ngscK
char loginhost[20]; //上站地点。 5Ri/^;W
FsO/'G
public: ZnnC%9~,
Qr^' 9 _T
int NewUser( char *userid, char *passwd ); ^)%{=*Sx:
新建一个用户,判断是否已经有,其他资料暂时为空, @#tdSD^`M
firstlogintime,权限等设缺省值。 Y);DKP/
int UserLogin( char *userid, char *passwd ); uxxyQz2 q
用户登陆,验证密码, !isP~z
int ChangePasswd( char *oldpasswd, char *newpasswd ); $$|cbQ,
修改密码,要求原密码一致。 j=]Y `V>
int ChangePriData( char *newname, char *newemail, ?8iZi$t!
char *newaddr ); TIWNQ+t8
改变基本数据,泥称,email,住址。。。。 d]t3sa)WSf
int ModifyNumData( int addlogin, int addpost ); w=a~yi}Dl
修改文章数,上站次数,等数据。。。。注意调用对象。 Yjh(~P
int UserLogout(); $-Q"=7
用户退出,修改lastlogin,staytime,loginhost等 y]qi\nw5\
#l=$]aD&e
// 普通查询命令 @yW m7
int QueryCommonData( const char * userid, int& loginnum, XS1i
char * username, int& postnum, 42 VZv
time& lastlogin, char *lasthost ); 31.tCQo}TU
查询网友基本信息。 y9%_^7 b*
!)Rwh2Z
// 特权指令,函数在完成功能前,先判断权限。 'K=ZtHu`C
int QueryPriData( const char * userid, char *email, @AL|i>mV
char *addr ); =8kY1o ]
查询基本信息,普通人只能查自己,有特权才能查其他人。 G K=]R;Fq_
int ModifyUserLevel( BOOL isAdd, unsigned long level ); zi \N>M
修改用户的权限, lg7jZJA\
int ModifyUserId( char *oldid, char *newid ); m?[~,Pg=
char *newemail, char *newaddr ); 8 T~^\8U)
修改用户的基本数据。 tKesJ.U
int ModifyUserNumdata( char *userid, int addlogin, int addpost ); TjoEGoTf,
修改用户的文章数等数据。 f=)!.u;
int ModifyUsERPasswd( char *userid, char *newpasswd ); Xr#:@8Y;
修改用户的密码。 "5'$Bs&=
} mdzn! %.f6
5Pc#4CWUP
以上各个函数难度不大,都是执行相应的sql语句,访问mysql数据库,是否将一般指令归到特权指令中去呢?权限的检查,是放在这一层还是上一层? yyyhM9*"YR
这更多的是看考虑的着重点,是看程序的清晰性还是代码的简练,可能还是看代码吧,毕竟要考虑访问量,另外,上层服务层是否也应该考虑权限检查问题呢? wvK@GL?
5。版面模块设计 1XZyP [Ik
| [zXh]TI
所谓分类,更多的是为telnet服务端考虑的,在cq66模式下,用户可以按照自己的意愿进行分类,反正最后都是直接以版为基本单位访问的。 c%8?":bQ
对于版面文章的访问,存放的时候以整篇文章为参数,文章的分块由本层完成,如果上层以块为单位传送,则在上层全部传完,组合后,再传参到本层分解;在读取 的时候,本层则以块为单位访问,如果上层要以全文为单位访问,则在上层做合并 工作,本层不管。 I._}jCOC1U
至于要不要独立出索引,不影响上层的操作,主要和下层的数据库构造有关,主要考虑可行性,效率需求等。 *z:2fk>
权限的检查放在哪里进行呢?还是放在上层吧,其实就telnet服务器端,和cq66 的客户端,根本不会给一般用户显示特殊指令的菜单,当然,用户可以直接发送cq66 的指令,服务器方还是要检查的。但应该不用在它下面的功能模块层再检查一次吧 。 :R6lJb:48
tv5VSP.I
Class BoardManage { 1f> 6sl
private: u4P{-"~'
R3 WIn.de
public: R%0LmFoK
// 有关分类的操作 c|$& -$!7
int GetClassNameInfo( int maxclass, char **classid, R/iz#mLX
char ** classname ); yGFZ)IIw
返回分类的信息,中英文名。 W7|oo#9azg
int GetBoardName( int maxboards, char *classid, _H' 3nN7G=
char **boardname ); uF&HM +a
返回某分类中的版面信息,一般分类,直接select .. `TY s8^D
from sboard i/pp?epU
where boardclass == .... 特殊分类则查相应的表。。。。 y7bj -
>:\zTsV"
// 修改需要版面管理员以上的特权 d\l!MOGL
int NewClass( char * newclassname, int type ); `%[j,Z#
新建分类,普通分类还是特殊分类, 2MNg\rbp
int DeleteClass( char *newclassname ); lyl:a]a
删除分类,但不cascade,即本层不负责一致性,由上层负责将 Rc
相应的版面的分类信息改为别的。分类改名也是先删再建, 4||6=L
int AddClassBoard( const char *classname, char *newboardname ); `/!\!*gz|N
将已建好的版加入某分类中,专门针对特殊分类,对一般分类,其 ^aHBtr:
效果和modifyboardinfo一样, %0' Y?%s
int DeleteClassBoard( const char *classname, char *boardname ); UYTZw9-^O
从分类中删除某个版,也是针对特殊分类,对一般分类,效果也 $|SWF=Q
是和modifyboardinfo一样,一个版的分类属性可以为空,即不属 6^{n!i&q|{
于任何分类。 4}BAXm?F
// 有关版的信息的操作。 R( 1v
int NewBoard( const char *boardid,char *boardname); FWvL`
新建一个版,建立对应的表。其他参数取默认值。 2 N F)i
int DeleteBoard( const char *boardid ); bopeof8
删除一个版,删除对应的表。 ~2Ap?gwoax
int GetBoardInfo( const char *boardid, char *boardname, GdPMT|^
int& numposts, char *masters, char *class, \_0M
long &level ); =kU9A*?
取的版面的信息。 yGp{ "
int ModifyBoardId( const char *oldid, char *newid ); g`_ca
改变版的英文id,对应table的名称也要改变, 7-*gd 8Xd}
int ModifyBoardInfo( const char *boardid, char *boardname, IJV(2#*Y
int numposts, char *masters, char *class, #+@tDx=
long level ); H[8nq{0 @
修改版面信息,需要特权。 jVYv+9pk
obX%,/
// 有关版面文章的操作。 irGM_mh%-
int AddText( char *boardid, char *title, char *writer, )bJ] 5f 9
char *text ); _M WRO
往版面中增加文章,内部将长文章分割成2k的块。 Fmi3E2N
int DeleteText( char *boardid, int num ); B`UdWdjr0(
删除文章,只是做一个标记,并不立刻修改对应的table。 OohU?!7;OP
int FlushTable( char *boardid ); %|3AMv;p
刷新版面,删除被删文章的对应的记录。 NAiOE(B
int MarkText( char *boardid, int num, char mark ); DmA{jNn1
给文章做标记。 o?U31}
int ModifyTitle( char *boardid, int num, char *newtitle ); ' ;OR.L
修改文章的标题。 zdV"8!
int ModifyText( char *boardid, int num, char *newtext ); 78j}j!H1
修改文章内容,不是自己的文章需要特权。 XFc&GYW|
int GetTextInfo( const char *boardid, int num, char *title, DR8xyAy_
char *writer, char& mark ); 0` RcHOk
取得文章的标题信息。 +P7]T(L:k
int GetText( const char *boardid, int num, int block, qCI;k{Eq
char *text ); D" (* }K
读取文章的内容,以块为单位。 Vtr>w f]yn
hpy e6AA
// 文章和作者的查询 61"\x% I
// 一次将查询的结果全部返回? A1"~vh
int QueryWriter( const char *boardid, char *writer,

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









4월 26일 뉴스에 따르면 ZTE의 5G 휴대용 Wi-Fi U50S는 현재 899위안부터 공식 판매되고 있습니다. 외관 디자인 측면에서 ZTE U50S 휴대용 Wi-Fi는 심플하고 스타일리시하며 쥐기 쉽고 포장이 쉽습니다. 크기는 159/73/18mm로 휴대가 간편해 언제 어디서나 5G 고속 네트워크를 즐길 수 있어 방해받지 않는 모바일 오피스와 엔터테인먼트 경험을 선사합니다. ZTE 5G 휴대용 Wi-Fi U50S는 최대 1800Mbps의 속도로 고급 Wi-Fi 6 프로토콜을 지원합니다. Snapdragon X55 고성능 5G 플랫폼을 사용하여 사용자에게 매우 빠른 네트워크 경험을 제공합니다. 5G 듀얼 모드 SA+NSA 네트워크 환경과 Sub-6GHz 주파수 대역을 지원할 뿐만 아니라 측정된 네트워크 속도도 놀라운 500Mbps에 도달해 쉽게 만족할 수 있습니다.

7월 12일 뉴스에 따르면, 새로운 Honor Vision Soothing Oasis 눈 보호 화면을 탑재한 Honor Magic V3 시리즈가 오늘 공식 출시되었습니다. 화면 자체는 높은 사양과 품질을 갖추고 있으면서도 AI 능동형 눈 보호 장치 도입을 개척했습니다. 기술. 근시를 완화하는 전통적인 방법은 근시 안경의 도수가 고르게 분포되어 있어 중심 시력 영역은 망막에 맺히지만 주변 영역은 망막 뒤에 맺히는 것으로 알려져 있습니다. 망막은 상이 뒤쳐져 있음을 감지하여 눈의 축방향 성장을 촉진시켜 정도를 심화시킵니다. 현재 근시 발생을 완화시키는 주요 방법 중 하나가 '디포커스 렌즈'다. 중심 영역은 정상적인 도수를 갖고, 주변 영역은 광학 설계 파티션을 통해 조절해 주변 영역의 상이 안으로 들어가게 한다. 망막 앞.

7월 29일 뉴스에 따르면 Honor X60i 휴대폰은 오늘부터 1,399위안부터 공식 판매되고 있다. 디자인 측면에서 Honor X60i 휴대폰은 중앙에 구멍이 있고 4면 모두 경계가 거의 없는 매우 좁은 테두리가 있는 직선형 스크린 디자인을 채택하여 시야를 크게 넓혔습니다. Honor X60i 매개변수 디스플레이: 6.7인치 고화질 디스플레이 배터리: 5000mAh 대용량 배터리 프로세서: Dimensity 6080 프로세서(TSMC 6nm, 2x2.4G A76+6×2G A55) 시스템: MagicOS8.0 시스템 기타 기능: 5G 신호 향상 , 스마트 캡슐, 언더스크린 지문, 듀얼 마이크, 소음 감소, 지식 Q&A, 사진 촬영 기능: 후면 듀얼 카메라 시스템: 5천만 화소 메인 카메라, 200만 화소 보조 렌즈, 전면 셀카 렌즈: 800만 화소, 가격: 8GB

5월 13일 뉴스에 따르면 vivoX100s는 오늘 밤 공식적으로 출시되었으며 뛰어난 이미지 외에도 신호 성능도 매우 뛰어납니다. vivo의 공식 소개에 따르면 vivoX100s는 최대 21개의 안테나가 장착된 혁신적인 범용 신호 증폭 시스템을 사용합니다. 이 디자인은 5G, 4G, Wi-Fi, GPS, NFC 등 다양한 신호 요구 사항의 균형을 맞추기 위해 다이렉트 화면을 기반으로 다시 최적화되었습니다. 이로써 vivoX100s는 생체 역사상 가장 강력한 신호 수신 기능을 갖춘 휴대폰이 되었습니다. 새 휴대폰은 또한 안테나가 본체 주위에 분산된 독특한 360° 서라운드 디자인을 사용합니다. 이 디자인은 신호 강도를 향상시킬 뿐만 아니라 다양한 일상 자세를 최적화하여 부적절한 쥐기 방법으로 인해 발생하는 문제를 방지합니다.

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

7월 19일 뉴스에 따르면, 첫 번째 플래그십 폴더블 폴더블폰인 샤오미 MIX Fold 4가 오늘 공식 출시됐으며 최초로 '3차원 특수형 배터리'를 탑재했다. 보도에 따르면 샤오미 MIX Fold4는 배터리 기술에서 획기적인 발전을 이루었으며 접이식 스크린을 위해 특별히 혁신적인 '3차원 특수형 배터리'를 설계했습니다. 기존 병풍장치는 공간 활용 효율이 낮은 기존의 각형 전지를 주로 사용하고 있다. 이 문제를 해결하기 위해 샤오미는 일반적인 와인딩 배터리 셀을 사용하지 않고 새로운 적층 공정을 개발하여 새로운 형태의 배터리를 만들어 공간 활용도를 크게 향상시켰습니다. 배터리 기술 혁신 양극 시트와 음극 시트를 정확하게 교대로 쌓고 리튬 이온의 안전한 매립을 보장하기 위해 Xiaomi는 용접 및 절단 정확도를 향상시키는 새로운 초음파 용접기와 라미네이션 기계를 개발했습니다.

5월 8일 소식에 따르면, 애플의 새로운 아이패드 프로/에어 태블릿이 출시됐다. 애플 공식 홈페이지에 따르면, 신형 아이패드 프로와 아이패드 에어는 더 이상 2018년에 출시된 2세대 애플 펜슬을 지원하지 않고, 애플 펜슬 프로만 지원한다고 한다. 및 Apple Pencil(USB-C)이 있습니다. Apple Pencil(USB-C)은 2023년 11월에 출시됩니다. 이 스타일러스는 1세대 및 2세대 Apple Pencil과 동일한 픽셀 수준 정확도, 낮은 대기 시간, 기울기 각도 감지 기능을 유지하면서 압력 감도 및 기능을 제거합니다. 무선 충전을 지원하지 않습니다. 가격은 649위안이다. 그리고 새로 출시된 ApplePe

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())
