Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Хранения Настроек Пользователя / 25 сообщений из 26, страница 1 из 2
27.02.2018, 08:26
    #39607597
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Здравствуйте !
Есть форма с большим количеством вкладок, на которых большое количество гридов и полей ввода.
Форма - карточка сотрудника, описывающая все данные о сотруднике.
Форма показывается различным пользователям.
В зависимости от настроек пользователя ему могут быть доступны различные вкладки формы и поля для просмотра или доступны для редактирования.
Данные о доступности той или иной вкладки/поля нужно хранить в базе
Возможно настройки нужно хранить не для пользователя, а для группы или же общие настройки группы и индивидуальные настройки пользователя

В каком виде хранить эти настройки ? Под каждую настройку отдельно поле таблицы, или же одно больше текстовое/бинарное поле в котором хранить настройки по типу Ini файла (Параметр=значение) или же например XML структуру
Может есть готовые обёртки ? Или подобные статьи в которых описаны плюсы и минусы.

Как это реализовано у вас ?
...
Рейтинг: 0 / 0
27.02.2018, 08:47
    #39607603
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
DimaBr,

Придумать права для пользователей. Что бы не привязываться жестко к интерфейсу, и, вообще, сущностей поменьше. Например, как у нас: пользователю разрешено просматривать протокол или нет, разрешено редактировать протокол или нет. Дальше возле этого права строится вся обвязка, и интерфейсная и кодовая. Возможно вообще в нескольких интерфейсах. Права в любом удобном виде хранить в базе. Цеплять это всё либо непосредственно к пользователям (если их относительно немного) либо, по хорошему, делать группы пользователей, раздавать права группам, а пользователей вносит в группы, по мере необходимости.
...
Рейтинг: 0 / 0
27.02.2018, 09:04
    #39607608
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Привязывать доступ к элементам интерфейса, особенно к каждому полю-колонке-- заманчивая, но бесперспективная идея. В конечном итоге все эти настройки сами собой сведутся к небольшому количеству стандартных шаблонов/ролей, которые и будут назначаться пользователям.

Тут все зависит от объемов: если приложение несложное, а сами потенциальные роли ограничиваются небольшим перечнем типа "заказы-финансы-отчеты", то можно прямо в коде захардкодить проверки (в основном, в главном меню-форме).

Если что-то сложное, много разработчиков, разные системы и надо что-то универсальное -- можно все хранить в базе, внутри под капотом будут доступы к элементам форм и кастомным объектам, но все настройки и доступы будут идти через стандартные роли/группы.
...
Рейтинг: 0 / 0
27.02.2018, 09:46
    #39607629
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Собственно вопрос о структуре хранения настроек:
1. Отдельные поля под каждый чих в настроечной таблице
2. Одно текстовое/блоб поле по типу Ini-файла
3. Поле XML типа или текстовое с хранением XML
4. Другой вариант
...
Рейтинг: 0 / 0
27.02.2018, 09:52
    #39607632
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
я обычно делаю объект TMySettings и прямо туда загружаю данные из JSON с помощью XSuperObject
это удобнее чем XML. Если поля объекта поменяются, JSON тоже изменится.
Да и объем в два раза меньше
...
Рейтинг: 0 / 0
27.02.2018, 09:56
    #39607634
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Отдельный список (одна настройка -- одна запись). Это позволит потом строить довольно полезные отчеты по типу кто чем пользуется, что востребовано, а что нет, подсчитать количество реальных пользователей у каждого модуля. Если писать логи доступа (кто какой доступ запрашивает) -- то и отчеты об использовании приложения тоже можно собирать.

В базе всё это занимает мало места по сравнению с остальными данными, и работает быстро -- даже если запросы к серверу будут идти каждый раз при открытии формы и/или по таймеру. Зато запросы легко делать -- не надо ковыряться в тех же xml/json данных. А эти отчеты в последствие пригодятся -- например, для службы безопасности, при исследовании инцидентов с доступом/порчей данных, сливов. Да и самим разработчиком -- видеть, что чаще всего используется, а что никому неинтересно.
...
Рейтинг: 0 / 0
27.02.2018, 09:57
    #39607637
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Плюс легко можно делать массовые изменения -- например, когда добавляется новая фича и ее надо включить у всех, у кого есть доступ к другой фиче из той же темы.
...
Рейтинг: 0 / 0
27.02.2018, 09:59
    #39607643
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
DimaBr,
У JEDI есть компоненты для однообразного хранения параметров в Ini|XML|DB, сам я правда их не смотрел, все руки не доходят
...
Рейтинг: 0 / 0
27.02.2018, 10:16
    #39607653
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
JaDiОтдельный список (одна настройка -- одна запись).
Такого типа ?
ПользовательПараметрЗначениеИвановДоступКРедактированиюФИОестьПетровДоступКРедактированиюФИОнетСидоровДоступКРедактированиюФИОпо вторникам
...
Рейтинг: 0 / 0
27.02.2018, 10:26
    #39607665
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
DimaBr,

Почти.

Иерархический справочник всех объектов, к которым можут быть доступ. Например, в виде структуры: модуль/приложение - раздел/форма - меню/кнопки/экшены/своё (или как удобнее хранить).

Справочник ролей (тоже можно иерархический/папкам для удобного хранения, если их будет много) с настройками доступа под каждую роль -- тот самый список объектов, куда есть доступ (в виде ссылок на справочник выше).

Справочник пользователей с привязкой к реальным сотрудникам из кадровой базы, доменным пользователям и т.п. сведения. В т.ч. список ролей, назначенных пользователю (ссылки на справочник ниже) -- та самая таблица из поста выше, только в виде ссылок.
...
Рейтинг: 0 / 0
27.02.2018, 10:33
    #39607668
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Иерархическая система прав, хранится в базе данных в виде строк (одна строка - одно маленькое право). При соединении с базой данных эти права считываются (один раз) и в зависимости от их совокупности настраиваются интерфейсные элементы.
...
Рейтинг: 0 / 0
27.02.2018, 10:38
    #39607675
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Были еще варианты в виде наследования ролей/доступов -- идея интересная, но усложняет некоторые запросы и логику настроек. Обычная техподдержка, которая потом всё это настраивает -- может не осилить и накосячить.

На самом деле это один из главных вопросов -- кто всем этим будет заниматься и как ОРГАНИЗАЦИОННО всё это будет сделано в организации. Я бы от него и отталкивался. Потому что могут быть разные ситуации -- например, надо каждому сотруднику уникальный доступ настраиватт, или делать это по подразделениям (тоже нетривиальная задача -- проконтролировать, чтобы при переходе из одного отдела в другой -- у человека убрался старый доступ и он получил его к новым). Плюс может быть доступ К ДАННЫМ. Причем как к постоянным данным (список компаний и их базы), так и к динамическим (конкретным заказам, клиентам, направлениям).

P.S. Был еще провальный опыт с доступом к объектам базы данных (через оракл). Но идея была оригинальной.
...
Рейтинг: 0 / 0
27.02.2018, 11:20
    #39607715
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Xml/json/ini - компактнее, первые два позволяют задать иерархию.
Таблица Юзер-Имя опции-Значение опции - удобнее для изменения и статистики. Но плоская структура дает сложности в задании иерархических данных.

Если настройки задаются админом, и юзер не может их менять (что-то вроде прав доступа) - то однозначно второй вариант. Если же это индивидуальные настройки, то особо без разницы.
...
Рейтинг: 0 / 0
27.02.2018, 11:35
    #39607737
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
JaDiНа самом деле это один из главных вопросов -- кто всем этим будет заниматься и как ОРГАНИЗАЦИОННО всё это будет сделано в организации. Я бы от него и отталкивался. Потому что могут быть разные ситуации -- например, надо каждому сотруднику уникальный доступ настраиватт, или делать это по подразделениям (тоже нетривиальная задача -- проконтролировать, чтобы при переходе из одного отдела в другой -- у человека убрался старый доступ и он получил его к новым). Плюс может быть доступ К ДАННЫМ. Причем как к постоянным данным (список компаний и их базы), так и к динамическим (конкретным заказам, клиентам, направлениям).Делал возможность копировать права с эталонного юзера на целевого с опцией объединения прав.
Н-р у эталонного нет права редактировать ТипДокХХХ, а у пользователя есть. При копировании он это право потеряет, а при объединении нет.
...
Рейтинг: 0 / 0
27.02.2018, 15:00
    #39607913
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
UserNameAppNameFormNameComponentNameVisibleEnabledВасяSuperBug.exeUglyFormTrueFalse
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.02.2018, 15:16
    #39607921
Glays
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
JaDiP.S. Был еще провальный опыт с доступом к объектам базы данных (через оракл). Но идея была оригинальной.
О! Расскажи, пожалуйста, где провалилось?
...
Рейтинг: 0 / 0
27.02.2018, 15:31
    #39607935
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Мимопроходящий,

как-то через name стрёмно

лучше через например Help Context

ну и Application/Form/Component я бы отдельной таблицей-справочником хранил древообразно.
Также как и список пользователей и ролей - отдельными таблицами.

А права доступа уже - их пересечения.
...
Рейтинг: 0 / 0
27.02.2018, 15:33
    #39607938
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Glays,

как практически отслеживать, что через три года после реализации функции её обновили, и теперь доступ к объектам 1,2,3 больше не нужен; к 4,5,6 наоборот стал нужен, а к 7,8,9 поменялся тип доступа ?
...
Рейтинг: 0 / 0
27.02.2018, 15:39
    #39607944
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
DimaBrВ каком виде хранить эти настройки ?

Простая таблица в виде ключ/значение + доп. поля, например, если нужно разграничивать по id пользователя.
Можно ещё добавить поле типа BLOB. Я так храню настройки cxGrid, dxLayoutControl - через TStream.
...
Рейтинг: 0 / 0
27.02.2018, 15:48
    #39607951
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
DimaBrМожет есть готовые обёртки ?

Не обёртки, но пример:

Код: pascal
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.
procedure StoreLayoutControlStream(LayoutControl: TdxLayoutControl);
var
  PatternLayout: string;
  stream: TStream;
  q: TpFibQuery;
begin
...
...
...

  stream := TMemoryStream.Create;
  try
//firebird
      q.SQL.Text := 'UPDATE OR INSERT INTO TLAYOUT (ID_USER, FORM_CLASSNAME, LAYOUTCONTROL_NAME, STREAM) VALUES (:ID_USER,:FORM_CLASSNAME, :LAYOUTCONTROL_NAME, :STREAM) MATCHING (FORM_CLASSNAME, LAYOUTCONTROL_NAME)';


    q.ParamByName('FORM_CLASSNAME').AsString     := LayoutControl.Owner.ClassName;
    q.ParamByName('LAYOUTCONTROL_NAME').AsString := LayoutControl.Name;

    PatternLayout := LayoutControl.Owner.ClassName + '.' + LayoutControl.Name;
    LayoutControl.Container.StoreToStream(stream, PatternLayout);
    stream.Seek(0, 0);
    q.ParamByName('STREAM').LoadFromStream(stream);
    try
      if not q.Transaction.Active then q.Transaction.StartTransaction;
      q.ExecQuery;
      if q.Transaction.InTransaction then q.Transaction.Commit;

    except
         ...
    end;

  finally
    q.Close;
    stream.Free;
    q.Free;
  end;
end;

...
Рейтинг: 0 / 0
27.02.2018, 15:51
    #39607954
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
GlaysJaDiP.S. Был еще провальный опыт с доступом к объектам базы данных (через оракл). Но идея была оригинальной.
О! Расскажи, пожалуйста, где провалилось?
На одном промышленном предприятии -- там каких только подходов к организации доступа не применялось, в т.ч. и "оракловский".
...
Рейтинг: 0 / 0
27.02.2018, 15:54
    #39607955
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
X11,
думаю ТС имел в виду права доступа, а не настройки гридов и прочего...
...
Рейтинг: 0 / 0
27.02.2018, 15:57
    #39607956
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
JaDi,

зачод!!!

спрашивали наверное все же - в контексте форума - какие именно проблемы вылезли в реализации/эксплуатации. Где в программировании была засада, а не в географии.
...
Рейтинг: 0 / 0
27.02.2018, 16:15
    #39607970
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
Arioch,

Из того, что сейчас вспоминается про оракловский доступ:
- сервер загадился огромной кучей "пустых" пользователей/схем, которые стала мешать разработчикам чисто своим существованием -- и так было много схем под приложения/модули, а тут еще и "пустые" учетки в общую кучу подмешались;
- очень сложные запросы по работе с доступом (вместо обычного sql к таблицам приходилось писать запросы к внутренностям оракла);
- проблемы с доступом к объектам, когда по факту один модуль "тихо" использовал данные из других схем -- что вылилось к решениям вида "давай полный доступ ко всем объектам базы, чтобы уж наверняка";
- оракловская часть была пятым колесом, весь доступ все-равно "дублировался" в таблицах.
...
Рейтинг: 0 / 0
27.02.2018, 16:25
    #39607977
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранения Настроек Пользователя
DimaBrВ каком виде хранить эти настройки ? Под каждую настройку отдельно поле таблицы, или же одно больше текстовое/бинарное поле
Одно большое текстовое/бинарное поле. Ибо во-первых, эти поля практически не используются в серверной бизнес-логике, а во-вторых, есть предмет постоянного расширения.

Конкретный формат хранения не особо важен. Лично я предпочитаю stringlist типа Раздел.Подраздел.Параметр=Значение как наиболее удачный вариант, сочетающий читаемость, лёгкость автоматической обработки, лёгкость ручного редактирования и отсутствие опасности задеть или забыть какую-нибудь закрывающую скобку.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Хранения Настроек Пользователя / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]