【 以下文字转载自 ht_essay 讨论区 】
【 原文由 sdymhua 于 Sun Dec 12 15:32:43 2004 发表 】
发信人: chutium (秋天|阿新是谁?), 信区: BBSDev
标 题: WEB下斑竹管理模式增加删除文章和设置不可回复功能
发信站: 郑大绿城 BBS (Thu Oct 14 20:18:31 2004), 本站(bbs.zzu.edu.cn)
第一步先让web下能显示出帖子是否是不可回复的这个状态
BBSLIB.c
flag_str_bm(int access) 函数体改为
{
static char buf[80];
strcpy(buf, " ");
if (access & FH_DIGEST)
buf[0] = 'G';
if (access & FH_MARKED)
buf[0] = 'M';
if ((access & FH_MARKED) && (access & FH_DIGEST))
buf[0] = 'B';
if (access & FH_ATTACHED)
buf[1] = '@';
if (access & FH_NOREPLY)
buf[1] = '_';
if (access & FH_DEL)
buf[0] = 'X';
return buf;
}
flag_str(int access)改为
{
static char buf[80];
strcpy(buf, " ");
if (access & FH_DIGEST)
buf[0] = 'G';
if (access & FH_MARKED)
buf[0] = 'M';
if ((access & FH_MARKED) && (access & FH_DIGEST))
buf[0] = 'B';
if (access & FH_ATTACHED)
buf[1] = '@';
if (access & FH_NOREPLY)
buf[1] = '_';
return buf;
}
flag_str2(int access, int has_read)改为
{
static char buf[3];
buf[0] = 'N';
buf[1] = 0;
buf[2] = 0;
if (access & FH_DIGEST)
buf[0] = 'G';
if (access & FH_MARKED)
buf[0] = 'M';
if ((access & FH_MARKED) && (access & FH_DIGEST))
buf[0] = 'B';
if (access & FH_ATTACHED)
buf[1] = '@';
if (access & FH_NOREPLY)
buf[1] = '_';
if (has_read)
buf[0] = tolower(buf[0]);
if (buf[0] == 'n') {
buf[0] = buf[1];
buf[1] = 0;
}
return buf;
}
flag2这个函数加显示_的位置需要注意……必须按照上面这个顺序放,否则bbsdoc调用的时候处理has_read的帖子会有问题
下面改bbsmdoc.c,增加一个“删除文章”的按钮
bbsmdoc_main()中做添加并修改
printf
("<input type=button value=加删除标记 onclick="
"'if(confirm(\"请使用telnet方式进行区段删除,这里仅增加删除标记,你真的要加标记吗?\")) {document.form1.mode.value=0; document.form1.submit();}'>
\n");
printf
("<input type=button value=删除文章 onclick="
"'if(confirm(\"点击删除文章将彻底删除文章,你确定删除吗?\")) {document.form1.mode.value=1; document.form1.submit()
当然这里是吓唬人的,删除的文章还是会被放到回收站先,不过web下是看不到回收站的~
最后改bbsman.c,增加功能
bbsman_main()中先把25行改成
if (mode < 0 || mode > 5)
然后
if (mode == 0) {
do_set(data, size, parm_name[i] + 3,
FH_DEL, board);
cbuf = "delete";
} else if (mode == 1) {
do_del(board, parm_name[i] + 3);
cbuf = "do_del";
} else if (mode == 2) {
do_set(data, size, parm_name[i] + 3,
FH_MARKED, board);
cbuf = "mark";
} else if (mode == 3) {
do_set(data, size, parm_name[i] + 3,
FH_DIGEST, board);
cbuf = "digest";
} else if (mode == 4) {
do_set(data, size, parm_name[i] + 3,
FH_NOREPLY, board);
cbuf = "noreply";
} else if (mode == 5) {
do_set(data, size, parm_name[i] + 3, 0,
board);
cbuf = "clear_flag";
do_set()函数里做如下修改
om = f->accessed & FH_MARKED;
og = f->accessed & FH_DIGEST;
on = f->accessed & FH_NOREPLY;
f->accessed |= flag;
if (flag == 0)
f->accessed = 0;
nm = f->accessed & FH_MARKED;
ng = f->accessed & FH_DIGEST;
nn = f->accessed & FH_NOREPLY;
增加一段
else if ((!on) && (nn))
snprintf(buf, 256, "%s noreply %s %s %s",
currentuser->userid, board,
fh2owner(f), f->title);
else if ((on) && (!nn))
snprintf(buf, 256, "%s unnoreply %s %s %s",
currentuser->userid, board,
fh2owner(f), f->title);
遗留的问题
1.实际上判断((!ox) && (nx))还是(ox) && (!nx)是没用的,要实现unnoreply只有通过“清除标记”那个按钮 (mode=5, clear_flag) ,printf看看ox和nx就可以了~
2.想在web实现置顶功能,不过比较麻烦……参照 src/bbs.c 里的 addtop_post() 和 nju09/bbsman.c 的 do_del() 做了一个,差点搞的整个版的文章都乱掉了……呵呵~~~
--
FROM 220.172.240.172