首页 新闻 会员 周边

关于锁定文章 不让其他人编辑 怎么处理

0
悬赏园豆:10 [已解决问题] 解决于 2011-07-20 09:15

谁做过 这类的项目 一个文章 一个用户编辑了 另一个用户就不让编辑了   
我现在有一种办法 就是给加个状态 当一个用户编辑 让state=1 编辑完成修改成0   
state=1的时候别人就编辑不成 为0的时候就可以进行编辑
但是这样子 假如 停电啊 什么的断网 则 需要管理员手动去改回为0

另一种办法就是 application 但是这个有没有过期时间呢 我正在google中...

有遇到的朋友 讨论下 谢谢了饿

一个土豆一棵青菜的主页 一个土豆一棵青菜 | 菜鸟二级 | 园豆:268
提问于:2011-07-19 11:04
< >
分享
最佳答案
0

我感觉你这在把简单的问题复杂化,

 

如果有两个人先后编辑同一文章,管它们客户端的状态呢,谁先提交的算谁编辑的。

 

当然,照顾到后提交者的情绪,可以这样做:

 

每篇文章记录编辑次数count,网页提交Form中放一个隐藏的input标签,记录用户刷新时的count,提交成功后服务器里count+1。

这样,当有多人提交的时候,你就知道他编辑的是否为最新版本,如不是,则提交驳回,并提示人家有最新编辑的版本。同时还可以缓存下人家要提交的东西,避免丢失。

收获园豆:4
vons | 小虾三级 |园豆:1033 | 2011-07-20 07:07
其他回答(3)
0

诺  有个方法  只不过耗点资源  

在页面上做一个js  timer   之后每隔2min 向服务器给个ajax   

之后服务器端接收,刷application 或者cache 的过期时间  ,这个是我原来写的个

function CheckUserOnline() { //不断发AJAX请求
$.ajax({
type: "GET",
url: "./Common/GotUserOnline.ashx?timestamp=" + Math.random(),
datatype: "html",
success: function (msg) {

}
});
setTimeout("CheckUserOnline()", 60000);

}

$(function () {
CheckUserOnline();
});
public class GotUserOnline : IHttpHandler,IRequiresSessionState
{

public void ProcessRequest(HttpContext context)
{
try
{
var userCode
= context.Session["usercode"].ToString();

OnLineUserHelper.ReceiveOnlineUser(userCode, deptname, context.Request.UserHostAddress);

context.Response.ContentType
= "text/plain";
context.Response.Write(
"Hello World");
}
catch { }
}

public bool IsReusable
{
get
{
return false;
}
}
}
private static List<OnlineUser> list;
public static List<OnlineUser> List
{
get
{
if (CacheManager.GetInstance().ExistCache("onlineUser") == false)
{
CacheManager.GetInstance().AddCache(
"onlineUser", new List<OnlineUser>(), 24 * 60);
}

list
= CacheManager.GetInstance().GetCache<List<OnlineUser>>("onlineUser");

return list;
}

}

public static void ReceiveOnlineUser(string UserCode, string deptname, string UserIP)
{
if (List.Exists(p => p.UserCode == UserCode))
{
List.Find(p
=> p.UserCode == UserCode).RefreshTime();
}
else
{
List.Add(
new OnlineUser
{
UserCode
= UserCode,
deptname
= deptname,
FirstSendTime
= DateTime.Now,
LastSendTime
= DateTime.Now,
UserIP
= UserIP,
});
}
}
public static bool UserOnline(string UserCode)
{
return List.Exists(p => p.UserCode == UserCode);
}
}
public class OnlineUser
{
public string UserCode { get; set; }
public DateTime FirstSendTime { get; set; }
public DateTime LastSendTime { get; set; }
private Timer time { get; set; }
public string UserIP { get; set; }
public string deptname { get; set; }
public string OnLineTime { get; set; }
public OnlineUser()
{

time
= new Timer();
time.Interval
= 120 * 1000;
time.Elapsed
+= new ElapsedEventHandler(time_Elapsed);
this.time.Start();
}
public void RefreshTime()
{
this.LastSendTime = DateTime.Now;
this.time.Interval = 120 * 1000;
this.time.Start();
}
void time_Elapsed(object sender, ElapsedEventArgs e)
{

OnLineUserHelper.List.Remove(
this);
}

}

Atpking | 园豆:150 (初学一级) | 2011-07-19 11:24
0

这是一个并发处理的问题,建议采用乐观锁的方式。

收获园豆:4
鹤冲天 | 园豆:2379 (老鸟四级) | 2011-07-19 12:36
你的意思 让所有的人都可以编辑 提交的时候看 数据库中的是不是原来的 如果是就让你更新,如果不是就提示你已经有了最新版本的 但是我想点击标题的时候 就给他提示说有人正在编辑
支持(0) 反对(0) 一个土豆一棵青菜 | 园豆:268 (菜鸟二级) | 2011-07-19 12:50
“点击标题的时候 就给他提示说有人正在编辑“
如果点击标题时没有被编辑,点击后马上被人编辑了怎么办?
支持(0) 反对(0) 鹤冲天 | 园豆:2379 (老鸟四级) | 2011-07-19 12:53
点击标题直接进入编辑页面的啊 点击标题的那一时刻就在数据库中改状态或者application呀然后进去
谁先点击就让谁编辑 在于点的那一时刻
支持(0) 反对(0) 一个土豆一棵青菜 | 园豆:268 (菜鸟二级) | 2011-07-19 14:37
这是悲观处理方式
支持(0) 反对(0) 鹤冲天 | 园豆:2379 (老鸟四级) | 2011-07-19 20:03
哪种比较好一点呢 我觉得乐观的麻烦呀
支持(0) 反对(0) 一个土豆一棵青菜 | 园豆:268 (菜鸟二级) | 2011-07-19 20:53
0

你好,你这里对这个文章加一个状态和当前编辑者

state=1表示非编辑用户不可编辑

state=0表示任意用户可编辑

每次某个用户XXX编辑的时候为这篇文章修改状态state=1,且当前编辑用户为XXX

修改完成之后设置state=0,切将当前编辑用户设置为空。

如果遇到断电的情况下,那么用户XXX重新登录到系统中,这个state=1且当前编辑用户为XXX的文章对于用户XXX为可编辑,其他用户不可编辑。

收获园豆:2
.NET架构 | 园豆:350 (菜鸟二级) | 2011-07-19 14:56
每次登陆的时候就检测当前用户有没有state>0的 如果有
提示您上次未正常关闭请处理 是不是呢 可以让state=用户id 用户id是永远>0的 但是假如这个用户长时间不登陆了呢 这个就挂在那了...
支持(0) 反对(0) 一个土豆一棵青菜 | 园豆:268 (菜鸟二级) | 2011-07-19 15:01
悲观并发不好控制,就像你说的停电、断网等很难处理。
乐观并发就没有这种情况。
支持(0) 反对(0) 鹤冲天 | 园豆:2379 (老鸟四级) | 2011-07-20 08:43
呵呵,你可以在用户非正常状态退出的时候由服务器端清理掉用户编辑的那篇文章的状态。
比如在断电的情况下是可以由服务端自动注销清理用户信息的。

ASP中有个Global.asax里面有个

void Session_End(object sender, EventArgs e)
{
//在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式
//设置为 StateServer 或 SQLServer,则不会引发该事件。

}
支持(0) 反对(0) .NET架构 | 园豆:350 (菜鸟二级) | 2011-07-20 10:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册