WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » BBS на ASP

BBS на ASP


Дата публикации: 17-03-2013

Необходимая оговорка.
Все, что Вы прочитаете ниже написано в меру компетентности Автора и отягощено его Субъективным взглядом на построение удобной электронной доски объявления (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

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Март 2017 (1)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

    Случайная цитата

    Pixadel:

    "Хорошо, Java, ВОЗМОЖНО, хороший пример того как должен выглядеть язык. Но тогда программы на Java — это хороший пример как НЕЛЬЗЯ писать программы."

    Опрос

    Какой аудио плеер Вы используете?

    Winamp
    Light Alloy
    foobar2000
    Apollo
    AIMP
    1by1
    iTunes
    jetAudio
    Другой...