首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 安全技术 > 服务器安全 >

“个人设置”设计思路解决办法

2012-02-17 
“个人设置”设计思路系统中用户可以自己定义页面宽度,待办事项列表显示行数,是否自动弹出提醒窗口,审批意见

“个人设置”设计思路
系统中用户可以自己定义页面宽度,待办事项列表显示行数,是否自动弹出提醒窗口,审批意见默认项,下面我就这一需求实现思路进行描述。

一、在.config文件中定义“用户自定义属性”栏目的数据结构及默认值。

     <userSettings>
  <applications>
  <add name ="OAPortal" description="门户应用">
  <programs>
  <add name ="Portal" description="门户">
  <properties>
  <add name ="UnCompleteTaskListPageSize" description="待办事项单页显示条数" valueType="Integer" category="列表展示" defaultValue="10" minValue="1" maxValue="100"/>
  <add name ="UnReadTaskListPageSize" description="通知单页显示条数" valueType="Integer" category="列表展示" defaultValue="10" minValue="1" maxValue="100"/>
  <add name ="CompletedTaskListPageSize" description="已办事项单页显示条数" valueType="Integer" category="列表展示" defaultValue="10" minValue="1" maxValue="100"/>
  <add name ="SearchPageSize" description="全文搜索单页显示条数" valueType="Integer" category="列表展示" defaultValue="10" minValue="1" maxValue="100"/>
  <add name ="CommonOpinion" description ="常用意见" valueType ="String" category="公共设置" defaultValue="同意 不同意 已阅"/>
  <add name ="AutoShowNotify" description ="是否自动弹出日程提醒窗口" valueType ="Boolean" category="公共设置" defaultValue="true"/>
  </properties>
  </add>
  </programs>
  </add>
  </applications>
 </userSettings>

配置信息中包含如下一些信息:

1、应用名称,applications,在大项目中,一个系统可能有多个应用。

2、程序名称,programs,一个应用可能有多个程序。

3、属性,properties,一个属性包含,name(名称),description(描述),valueType(值类型),category(属性类型),defaultValue(默认值)

二、在数据库建入相应表,用于存储用户的自定义设置信息,数据结构如下:

 [USER_ID] [nvarchar](36) NOT NULL,
 [APPLICATION_NAME] [nvarchar](36) NOT NULL,
 [PROGRAM_NAME] [nvarchar](36) NOT NULL,
 [PROPERTY_NAME] [nvarchar](36) NOT NULL,
 [PROPERTY_VALUE] [nvarchar](512) NOT NULL

三、数据读取

    数据读取需要考虑如下方面:

    1、数据读取频繁(必须用缓存来解决)

    2、用户还没有设置“个人设置”(所以取用户的“个人设置”数据前,先要取.config文件中“个人设置”数据项及其默认值来初始化个人设置数据实体对象。

    3、取出数据库中“个人设置”项,更新当前“个人设置”数据实体对象,但更新之前需要判断数据库中某项设置,在定义项中是否还存在,或许某一项“个人设置”已经从.config文件中删除了。

  public static UserSettings GetUserSettings(string userID)
  {
  ExceptionHelper.TrueThrow<ArgumentNullException>(userID == null, "userID");

  UserSettings us;

  //先从Cache中读取,若已过期,则重新构造,并写入Cache
  lock(thisLock)
  {
  if (UserSettingsCacheQueue.Instance.TryGetValue(userID, out us) == false)
  {
  us = UserSettingsAdapter.Instance.Load(userID);

  UserSettingsCacheItemDependency dependency = new UserSettingsCacheItemDependency();
       UdpNotifierCacheDependency fileDependency = new UdpNotifierCacheDependency();
  MixedDependency mixedDependency = new MixedDependency(dependency, fileDependency);

  UserSettingsCacheQueue.Instance.Add(userID, us, mixedDependency);
  }
  }

  return us;
  }

  internal UserSettings Load(string userID)
  {
  ExceptionHelper.TrueThrow<ArgumentNullException>(userID == null, "userID");



  UserSettings us = new UserSettings(userID);
  string strSQL = string.Format("SELECT * FROM [USER_SETTING] WHERE [USER_ID] = {0}",
  TSqlBuilder.Instance.CheckQuotationMark(userID, true));
  DataView dv = DbHelper.RunSqlReturnDS(strSQL, ConnectionDefine.UserRelativeInfoConnectionName).Tables[0].DefaultView;

  foreach (DataRowView drv in dv)
  {
  if (UserSettings.CheckConfig(drv["APPLICATION_NAME"].ToString(), drv["PROGRAM_NAME"].ToString(), drv["PROPERTY_NAME"].ToString()))
  {
  us.AppSettings[drv["APPLICATION_NAME"].ToString()]
  .Programs[drv["PROGRAM_NAME"].ToString()]
  .Properties[drv["PROPERTY_NAME"].ToString()]
  .Value = drv["PROPERTY_VALUE"];
  }
  }

  return us;
  }

  #region 构造函数
  internal UserSettings(string userID)
  {
  this.userID = userID;
  this.appSettings = CreateSettingsByDescriptor();
  }
  #endregion

  /// <summary>
  /// 由配置信息生成UserSettings的架构
  /// </summary>
  private static AppSettingCollection CreateSettingsByDescriptor()
  {
  AppSettingCollection appSettings = new AppSettingCollection();

  foreach (AppSettingDespElement appDesp in UserSettingsConfig.GetConfig().Applications)
  {
  appSettings.Add(new AppSetting(appDesp));
  }

  return appSettings;
  }

四、保存“个人设置”

保存“个人设置”需要执行如下步骤:

1、保存数据到数据库中(1.1 先删除该用户所有“个人设置”。1.2 用事务方式重新插入“用户设置”各个属性项,)。

2、清除缓存

  /// <summary>
  /// 保存个人设置
  /// </summary>
  public void Save()
  {
  UserSettingsAdapter.Instance.Save(this);

  CacheNotifyData data = new CacheNotifyData(typeof(UserSettingsCacheQueue), this.UserID, CacheNotifyType.Invalid);
  UdpCacheNotifier.Instance.SendNotify(data);
  }

 internal void Save(UserSettings userSetting)
  {
  ExceptionHelper.TrueThrow<ArgumentNullException>(userSetting == null, "userSetting");

  StringBuilder strSQL = new StringBuilder(255);

  strSQL.Append("DELETE FROM USER_SETTING WHERE USER_ID = ");
  strSQL.Append(TSqlBuilder.Instance.CheckQuotationMark(userSetting.UserID, true));
  strSQL.Append(TSqlBuilder.Instance.DBStatementSeperator);

  foreach (AppSetting app in userSetting.AppSettings)
  {
  foreach (ProgSetting prog in app.Programs)
  {
  foreach (PropertySetting property in prog.Properties)
  {
  if (property.Value != null)
  {
  InsertSqlClauseBuilder objISCB = new InsertSqlClauseBuilder();
  objISCB.AppendItem("USER_ID", userSetting.UserID);
  objISCB.AppendItem("APPLICATION_NAME", app.Description.Name);
  objISCB.AppendItem("PROGRAM_NAME", prog.Description.Name);


  objISCB.AppendItem("PROPERTY_NAME", property.Description.Name);
  objISCB.AppendItem("PROPERTY_VALUE", property.Value.ToString());

  strSQL.Append("INSERT INTO USER_SETTING ");
  strSQL.Append(objISCB.ToSqlString(TSqlBuilder.Instance));
  strSQL.Append(TSqlBuilder.Instance.DBStatementSeperator);
  }
  }
  }
  }

  DbHelper.RunSqlWithTransaction(strSQL.ToString(), ConnectionDefine.UserRelativeInfoConnectionName);
  }


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zy41796745/archive/2010/05/27/5629035.aspx

[解决办法]
巨长,顶一下。
[解决办法]
看了半天没有看懂楼主意思, 楼主还不如用文字描述一下你的意思

热点排行