Необходимая оговорка.
Все, что Вы прочитаете ниже написано в меру компетентности Автора и отягощено его Субъективным взглядом на построение удобной электронной доски объявления (BBS). Посему я не буду в ступать в полемику по поводу удобства BBS и(или) наличия лучших решений, буде такая возникнет в результате написания данной статьи.
Код является свободно распространяемым. Вы вправе распоряжаться им по своему усмотрению и произвольно модифицировать его. Единственное условие – иметь линк на мой сайт. Или воткнуть вот эту кнопочку:
Данная статья описывает построение электронной доски объявлений с элементами форума на ASP.
Написать данную статью и саму BBS меня подтолкнуть тот факт, что в сети практически отсутствуют нормальные, в моем понимании, доски объявлений, реализованные на ASP.
За образец были взяты лучшие, из мне известных, реализации форума – www.webclub.ru и Ultimate Bulletin Board™.
Итак, BBS должна обладать следующими сервисами:
авторизация пользователя
различные уровни сервиса для пользователя (нотификация, настройки интерфейса и т.п)
наглядность
высокая скорость работы
устойчивость к деструктивным действиям
удобство администрирования
Текущие и повсеместно распространенные реализации форумов с древовидной структурой сообщений не устроили меня в силу своей низкой наглядности или иных причин. И ни какие ухищрения не сделают их удобнее для посетителя. Примеров сколько угодно. Я проанализировал следующие форумы:
http://www.activeserverpages.dk
http://www.aspforums.com/
http://learnasp.com
http://activesrverpages.ru
http://vbcity.com/
последний из них нагляден, но все остальное желает лучшего.
На этом вступление будем считать оконченным и перейдем к BBS.
Возможности BBS
Поддержка глобальных потоков
Поддержка субпотоков создаваемых пользователями
Открытый листинг сообщений в пределах субпотоков
Информация о пользователях
Фильтр по дате
Информация о новых сообщениях в потоке
Уведомление по почте при изменениях в субпотоке
Пейджейр
Администрирование через www интерфейс
Удержание настроек пользователя (имени и пароля)
Поддержка тегов в сообщениях
Гибко настраиваемый текстовый дизайн (css)
База данных.
В моем случае используется MS SQL 7.0
Структура базы данных и таблицы описываются следующим скриптом:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VIEW_Conf_List]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[VIEW_Conf_List]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VIEW_all]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[VIEW_all]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VIEW_globalthreadName_mamethread_totalMessages]')
and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[VIEW_globalthreadName_mamethread_totalMessages]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[global_thread]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[global_thread]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pager]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[pager]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[post_message]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[post_message]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[thread]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[thread]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_list]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[user_list]
GO
CREATE TABLE [dbo].[global_thread] (
[id_global_thread] [int] IDENTITY (1, 1) NOT NULL ,
[name_global_thread] [nvarchar] (50) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[pager] (
[id_message] [int] IDENTITY (1, 1) NOT NULL ,
[id_sender] [int] NULL ,
[id_recepient] [int] NULL ,
[message] [varchar] (255) NULL ,
[time_stamp] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[post_message] (
[id_global_thread] [int] NULL ,
[id_thread] [int] NULL ,
[id_user] [int] NULL ,
[id_post] [int] IDENTITY (1, 1) NOT NULL ,
[txt_post] [text] NULL ,
[time_stamp] [datetime] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[thread] (
[id_global_thread] [int] NULL ,
[id_thread] [int] IDENTITY (1, 1) NOT NULL ,
[id_user_creator] [int] NULL ,
[name_thread] [nvarchar] (50) NULL ,
[time_stamp] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[user_list] (
[id_user] [int] IDENTITY (1, 1) NOT NULL ,
[Nic] [nvarchar] (50) NULL ,
[Email] [nvarchar] (50) NULL ,
[password] [nvarchar] (50) NULL ,
[status] [nvarchar] (50) NULL ,
[Notify] [smallint] NULL
) ON [PRIMARY]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE VIEW dbo.VIEW_Conf_List
AS
SELECT global_thread.id_global_thread,
global_thread.name_global_thread, COUNT(thread.id_thread)
AS Count_Thread
FROM global_thread INNER JOIN
thread ON
global_thread.id_global_thread = thread.id_global_thread
GROUP BY global_thread.id_global_thread,
global_thread.name_global_thread
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE VIEW dbo.VIEW_all
AS
SELECT global_thread.id_global_thread,
global_thread.name_global_thread, thread.id_thread,
thread.name_thread, post_message.id_post, user_list.id_user,
user_list.Nic, user_list.Email, post_message.txt_post,
post_message.time_stamp
FROM global_thread INNER JOIN
thread ON
global_thread.id_global_thread = thread.id_global_thread INNER
JOIN
post_message ON
thread.id_thread = post_message.id_thread INNER JOIN
user_list ON post_message.id_user = user_list.id_user
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE VIEW dbo.VIEW_globalthreadName_mamethread_totalMessages
AS
SELECT global_thread.id_global_thread,
global_thread.name_global_thread, thread.id_thread,
thread.name_thread, user_list.Nic,
COUNT(post_message.id_post) AS total_messages
FROM global_thread INNER JOIN
thread ON
global_thread.id_global_thread = thread.id_global_thread INNER
JOIN
user_list ON
thread.id_user_creator = user_list.id_user INNER JOIN
post_message ON
thread.id_thread = post_message.id_thread
GROUP BY global_thread.id_global_thread,
global_thread.name_global_thread, thread.id_thread,
thread.name_thread, user_list.Nic
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
После того, как Вы исполните скрипт, у Вас в базе данных появится набор таблиц.
Но предварительно базу необходимо подготовить к работе.
Для этого:
В таблице global_thread укажите названия глобальных потоков BBS (поле name_ global_thread).
В таблицу user_list необходимо занести 1 пользователя – который будет администратором. Для того, чтобы его однозначно идентифицировать как администратора в поле user_list. Status занесите значение “boss”
Теперь база данных готова к работе.
Следующий шаг
Создайте пользователя, который будет иметь доступ к таблицам базы данных MS SQL. Не нужно работать под встроенным аккаунтом “sa”. Cоздайте нового пользователя и дайте ему все необходимые права на чтение и запись.
После того, как пользователь создан настройте ресурс ODBC.
Далее необходимо в файл global.asa занести переменные.
...
application("confname")="DSN=Здесь Ваш DNS;"
application("confuser")="Имя Юзера для доступа к базе данных"
application("confpass")="Пароль на доступ к базе данных " application("mail_server") = "адрес почтового сервера" ' application("time_to_live") = 30 '' время жизни кукисов ...
Для того, чтобы заработало уведомление по электронной почте необходимо:
Установить почтовый компонент.
В коде скрипта BBS предусмотрена работа c 2 – мя различными почтовыми компонентами – smtprus и Jmail.
Скачать эти компоненты можно с сайта asp.ablogic.ru
Код BBS тщательно задокументирован и не вызовет проблем.
Теперь BBS готова к работе.
Каких либо дополнительных настроек BBS не требует. Достаточно вызвать скрипт conf.asp
Пример работы BBS Вы можете посмотреть по адресу http://www.ablogic.ru/conf.asp