上一篇中,我们已经处理完前端每份餐点、每张订单的状态都处理完了。
顺带一提,如果要在使用返回按键时保留原本餐点的状态时,
我们可以在undo_order()中增加以下两行程序码:
cb_id = `cb_${head.uid}_${item.uid}`
$(`#${cb_id}`).prop('checked', item.itemDone)
这篇开始我们会将前端的清单资料,
与後台资料库中的资料做交换。
这边会分成几个部份去处理:
function Exchange(is_init) {
//第一次进网页则删除原本的localStorage
if (is_init) {
localStorage.removeItem('done_data')
localStorage.removeItem('undo_data')
}
var done_data = localStorage.getItem('done_data') === null ? [] : JSON.parse(localStorage.getItem("done_data"))
var undo_data = localStorage.getItem("undo_data") === null ? [] : JSON.parse(localStorage.getItem("undo_data"))
var data = undo_data
done_data.forEach((item) => {
data[data.length] = item
})
var data_string = JSON.stringify(data)
$.ajax({
url: "@Url.Action("ExchangeData")",
type: "post",
data: {
"data": data_string
},
dataType: "json",
success: function (new_data) {
var done_data = localStorage.getItem('done_data') === null ? [] : JSON.parse(localStorage.getItem("done_data"))
var undo_data = localStorage.getItem("undo_data") === null ? [] : JSON.parse(localStorage.getItem("undo_data"))
new_data.forEach((item) => {
if (item.head.orderDone) {
done_order(item.head, item.bodys)
done_data[done_data.length] = item
}
else {
undo_order(item.head, item.bodys)
undo_data[undo_data.length] = item
}
})
localStorage.setItem("undo_data", JSON.stringify(undo_data))
localStorage.setItem("done_data", JSON.stringify(done_data))
},
error: function (xhr, ajaxOptions, thrownError) {
alert("status: " + xhr.status);
alert(xhr.responseText);
alert(thrownError);
},
complete: function () {}
})
}
<script>
//初始化
Exchange(true)
// 固定时间交换资料
setInterval(Exchange, 10000,false);
</script>
ExchangeData()
[HttpPost]
public IActionResult ExchangeData(string data)
{
Console.WriteLine("data:" + data);
var proprietor = ProprietorModel.proprietor;
//更新资料
bool successful = proprietor.UpdateOrder(_config, data);
//取得今天的订单清单
var orders = proprietor.SelectOrder(_config);
//比对出新的资料
var new_orders = proprietor.DataCompare(orders, data);
//自动转成json格式
return Json(new_orders);
}
UpdateOrder()
public bool UpdateOrder(IConfiguration config,string orders_string)
{
var successful = false;
var orders = JsonConvert.DeserializeObject<List<Order>>(orders_string);
//连线设定
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
//连线字串
ConnectionString = config.GetValue<string>("WebmenuConnectionString"),
DbType = DbType.SqlServer,//连线类型
IsAutoCloseConnection = true //自动关闭连线
});
try
{
//当执行时,触发事件
db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql);//查看SQL语法
};
//begin tran
db.BeginTran();
//取得菜单表头,并排序(正序)
foreach(var order in orders)
{
//更新表头中的订单状态
var result_h = db.Updateable(order.head).UpdateColumns(head => new { head.OrderDone }).ExecuteCommand();
//更新表身中的餐点状态
var result_b = db.Updateable(order.bodys).UpdateColumns(body => new { body.ItemDone }).ExecuteCommand();
}
db.CommitTran();
successful = true;
}
catch
{
successful = false;
db.RollbackTran();//rollback
throw;
}
return successful;
}
SelectOrder()
public List<Order> SelectOrder(IConfiguration config)
{
var order_list = new List<Order>();
//连线设定
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
//连线字串
ConnectionString = config.GetValue<string>("WebmenuConnectionString"),
DbType = DbType.SqlServer,//连线类型
IsAutoCloseConnection = true //自动关闭连线
});
try
{
//当执行时,触发事件
db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql);//查看SQL语法
};
//begin tran
db.BeginTran();
//取得菜单表头,并排序(正序)
var list_h = db.Queryable<Menulisth>().Where(head => head.Createtime >= DateTime.Today).OrderBy(head => head.Createtime, OrderByType.Asc).ToList();
var list_b = db.Queryable<Menulistb, Menulisth>((body, head) => new JoinQueryInfos(JoinType.Left, head.Uid == body.H_uid))
.Where((body, head) => head.Createtime >= DateTime.Today)
.OrderBy((body, head) => head.Createtime, OrderByType.Asc)
.Select<Menulistb>().ToList();
//将表头加入到表身资料写入
foreach (var head in list_h)
{
head.Formnum = head.Formnum.Replace(" ", "").Trim();
var order = new Order();
//加入表头
order.head = head;
//加入表身
foreach (var body in list_b)
{
if (body.H_uid == head.Uid)
{
body.Item = body.Item.Replace(" ", "").Trim();
order.bodys.Add(body);
}
}
order_list.Add(order);
}
db.CommitTran();
}
catch
{
db.RollbackTran();//rollback
throw;
}
return order_list;
}
DataCompare()
public List<Order> DataCompare(List<Order> db_orders, string data)
{
var client_orders = JsonConvert.DeserializeObject<List<Order>>(data);
var order_Enumable = from db in db_orders
where !(from client in client_orders
select client.head.Uid)
.Contains(db.head.Uid)
select db;
var orders = order_Enumable.ToList();
return orders;
}
这样就完成了。来看一下完整的Proprietor.cshtml 中script语法
9. 成果
前面做的时候分成未完成清单、和已完成清单两个部分来实作。
当开发到後面的时候会发现,其实这两段程序码有非常多重覆的地方。
像是这样的情形在开发中很常会发生,
我们可以透过不断的CodeReview,来精简程序码。
这样久而久之就能撰写出更加优美的程序码。
<<: Day 26 - Divide and Conquer & Dynamic Programming
>>: Day28_隐私盾协定听起来好酷呀-2021/10/11
前言 今天要来接续表单的制作,不同於前两天的是,今天的主题比较明确,我们要写各式各样的 dashbo...
为了做火焰烤饼而自制酸奶油,做完烤饼还有剩下的酸奶油,所以试着找了其他酸奶油料了,意外发现了俄罗斯的...
前言 今天来聊一个看起来不浪费的浪费。 多工会怎样 在我们的成长过程中,应该不只一次会听到前辈们的告...
在昨天的影片中提到了输入命令以及输出命令,这两种是程序之中非常基本的命令,今天就稍微进阶一点,让输出...
第二个「V」要思考的数据问题是多样性Velocity,资料的格式有千百种,从数不完的副档名就知道。软...