Есть программа (или комплекс программ). В этой программе:
1. Есть список зарегистрированных пользователей, которые входят в ту, или иную группу.
2. Есть список объектов, над которыми можно производить некие действия.
3. Есть ряд других критериев.
Для того, чтобы пользователь смог проделать на объектом какое-либо действие, должно выполниться определённое условие, назовём его РАЗРЕШЕНИЕ. Если РАЗРЕШЕНИЕ для конкретного пользователя+объекта+действия_над_объектом возращает TRUE — то действие_над_объектом можно выполнить.
На данный момент, эти РАЗРЕШЕНИЯ прописываются вручную, программистом, или продвинутым пользователем, и хранятся в базе данных в виде текстовых строк.
(Например в таком виде:
что расшифровывается так:
над объектом1 можно произвести действие1 в том случае, если тек_пользователь входит в группу1 или в группу2, и при этом объект1 находится в состоянии1, либо же действие1 можно произвести если текущий пользователь является администратором.
Теперь собственно проблема. Не хочется изобретать велосипед, может кто сталкивался, может кто подскажет где поискать.
Нужно предоставить пользователю инструмент, визуальный инструмет, чтобы он смог строить РАЗРЕШЕНИЯ с помощью некоего мастера, накликав мышкой правила и их взаимозависимость. Некий инструмент, типа построителя выражений в Access'е, когда пользователь на экране видит названия таблиц и задаёт связи между ними, а в результате получается SQL-запрос.
Здравствуйте, WalkerSW, Вы писали:
WSW>Попытаюсь описать проблему абстрактно.
Во-первых и сразу — можешь рассказать что это такое ты творишь? (Есть аналогичная задача, просто не дошел ещё до этого момента.)
WSW>Нужно предоставить пользователю инструмент, визуальный инструмет, чтобы он смог строить РАЗРЕШЕНИЯ с помощью некоего мастера, накликав мышкой правила и их взаимозависимость. Некий инструмент, типа построителя выражений в Access'е, когда пользователь на экране видит названия таблиц и задаёт связи между ними, а в результате получается SQL-запрос.
Пользователи — это подмножества Ролей + работать с единичными пользователями не хорошо. Итог — две сущности: Роль и Разрешения. Роли — можно деревом.
Ну на первый взгляд сразу приходит мысль — разделить окно на 3 части:
Хорошо, попробую сказать по другому.
Есть то самое выражение, которое описывает правило.
По этому выражению пробегает парсер и строит дерево, в качестве ноды у этого дерева — структура (запись), которая может быть нескольких типов (например оператор или параметр).
Теперь мне нужно это дерево отобразить на экране, но не ввиде TreeView (это слишком просто для программиста и не понятно для обывателя), а ввиде древоидной структуры.
И не просто отобразить, а дать пользователю возможность мышкой двигать объекты (ноды), определять связи и естественно добалять/править/удалять ноды.
Ну и в конце, после манипуляций пользователя, заново построить выражение-правило. (собственно, это тоже не сложно).
Так — это проще простого.
ммм, по-моему я уже писал... вот, цитирую
И не просто отобразить, а дать пользователю возможность мышкой двигать объекты (ноды), определять связи и естественно добалять/править/удалять ноды.
А вообще, строго говоря, в виде бинарного дерева оно по любому для пользователя будет не понятно. В итоге я отказался от своей идеи, буду делать по-другому, что из этого выйдет — посмотрим
Здравствуйте, WalkerSW, Вы писали:
WSW>Есть программа (или комплекс программ). В этой программе: WSW>1. Есть список зарегистрированных пользователей, которые входят в ту, или иную группу. WSW>2. Есть список объектов, над которыми можно производить некие действия. WSW>3. Есть ряд других критериев.
* Ориентировочное количество всех сущностей, какие участвуют в построении запроса (состояний, групп, ...)?
* Разнородность сущностей (у всех объектов одинаковые наборы состояний, все группы одинаково выглядят)?
* Необходимая расширяемость решения (могут ли дальше добавляться совсем другие сущности)?
А вообще (и я требую занесения этой фразы в FAQ ) — в вопросах по юзабилити действует простое правило:
На любой вопрос — любой ответ.
То есть, чем абстактнее (в смысле общо) сформулировать проблему, тем абстрактнее (в смысле — неприменимо в реальной жизни) получится решение.