Data.cshtml.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using Microsoft.AspNetCore.Mvc;
  2. using Microsoft.AspNetCore.Mvc.RazorPages;
  3. using Npgsql;
  4. namespace RestaurantWeb2.Pages;
  5. public class DataModel : PageModel {
  6. public string Table="",Search="",Msg="",Role="";
  7. public bool IsErr,ShowForm;
  8. public int EditId;
  9. public List<string> Cols=new(),Vals=new();
  10. public List<List<string>> Rows=new();
  11. static readonly HashSet<string> IntCols = new(){
  12. "год_рождения","вес_г","id_персонала"
  13. };
  14. static readonly HashSet<string> DecCols = new(){
  15. "оклад","вес_кг","цена_руб"
  16. };
  17. static readonly Dictionary<string,string[]> Tbls = new(){
  18. ["Персонал"]=new[]{"id_персонала","фио","год_рождения","должность","оклад","телефон","адрес","паспортные_данные"},
  19. ["Блюда"]=new[]{"id_блюда","блюдо","категория","вес_г"},
  20. ["Склад"]=new[]{"id_ингредиента","ингредиент","вес_кг","цена_руб"},
  21. ["Заказы"]=new[]{"id_заказа","код_заказа","дата_заказа","id_персонала"},
  22. };
  23. public IActionResult OnGet(string? table,string? action,string? search,int? id){
  24. Role=HttpContext.Session.GetString("role")??"";
  25. if(Role=="") return RedirectToPage("/Index");
  26. Table=Tbls.ContainsKey(table??"")?table!:"Персонал";
  27. Search=search??"";
  28. Cols=Tbls[Table].ToList();
  29. if(action=="delete"&&id.HasValue&&Role=="admin") Del(id.Value);
  30. if(action=="edit"&&id.HasValue) LoadEdit(id.Value);
  31. if(action=="add") ShowForm=true;
  32. Load(); return Page();
  33. }
  34. public IActionResult OnPost(string table,int editId,IFormCollection form){
  35. Role=HttpContext.Session.GetString("role")??"";
  36. if(Role=="") return RedirectToPage("/Index");
  37. Table=Tbls.ContainsKey(table)?table:"Персонал";
  38. Cols=Tbls[Table].ToList();
  39. var cols=Cols.Skip(1).ToList();
  40. var vals=cols.Select((_,i)=>form[$"f{i+1}"].ToString()).ToList();
  41. try{
  42. using var conn=Db.Conn();conn.Open();
  43. if(editId>0){
  44. var sets=string.Join(",",cols.Select((c,i)=>$"\"{c}\"=@p{i}"));
  45. var cmd=new NpgsqlCommand($"UPDATE \"{Table}\" SET {sets} WHERE \"{Cols[0]}\"=@id",conn);
  46. for(int i=0;i<vals.Count;i++) cmd.Parameters.AddWithValue($"p{i}",TypedVal(cols[i],vals[i]));
  47. cmd.Parameters.AddWithValue("id",editId);
  48. cmd.ExecuteNonQuery();Msg="Обновлено.";
  49. }else{
  50. var cs=string.Join(",",cols.Select(c=>$"\"{c}\""));
  51. var ps=string.Join(",",cols.Select((_,i)=>$"@p{i}"));
  52. var cmd=new NpgsqlCommand($"INSERT INTO \"{Table}\"({cs}) VALUES({ps})",conn);
  53. for(int i=0;i<vals.Count;i++) cmd.Parameters.AddWithValue($"p{i}",TypedVal(cols[i],vals[i]));
  54. cmd.ExecuteNonQuery();Msg="Добавлено.";
  55. }
  56. }catch(Exception ex){Msg="Ошибка: "+ex.Message;IsErr=true;}
  57. Load();return Page();
  58. }
  59. // Приводим значение к нужному типу по имени колонки
  60. static object TypedVal(string col, string val) {
  61. if (string.IsNullOrWhiteSpace(val)) return DBNull.Value;
  62. if (IntCols.Contains(col) && int.TryParse(val, out var i)) return i;
  63. if (DecCols.Contains(col) && decimal.TryParse(val.Replace(",","."), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out var d)) return d;
  64. if (col == "дата_заказа" && DateTime.TryParse(val, out var dt)) return dt;
  65. return val;
  66. }
  67. void Load(){
  68. try{
  69. using var conn=Db.Conn();conn.Open();
  70. var cs=string.Join(",",Cols.Select(c=>$"\"{c}\""));
  71. var sql=$"SELECT {cs} FROM \"{Table}\"";
  72. if(!string.IsNullOrEmpty(Search)) sql+=$" WHERE \"{Cols[1]}\" ILIKE @s";
  73. sql+=$" ORDER BY \"{Cols[0]}\"";
  74. var cmd=new NpgsqlCommand(sql,conn);
  75. if(!string.IsNullOrEmpty(Search)) cmd.Parameters.AddWithValue("s",$"%{Search}%");
  76. using var r=cmd.ExecuteReader();
  77. while(r.Read()){var row=new List<string>();for(int i=0;i<r.FieldCount;i++)row.Add(r[i]?.ToString()??"");Rows.Add(row);}
  78. }catch(Exception ex){Msg="Ошибка: "+ex.Message;IsErr=true;}
  79. }
  80. void Del(int id){
  81. try{
  82. using var conn=Db.Conn();conn.Open();
  83. var cmd=new NpgsqlCommand($"DELETE FROM \"{Table}\" WHERE \"{Cols[0]}\"=@id",conn);
  84. cmd.Parameters.AddWithValue("id",id);cmd.ExecuteNonQuery();Msg="Удалено.";
  85. }catch(Exception ex){Msg="Ошибка: "+ex.Message;IsErr=true;}
  86. }
  87. void LoadEdit(int id){
  88. ShowForm=true;EditId=id;
  89. try{
  90. using var conn=Db.Conn();conn.Open();
  91. var cs=string.Join(",",Cols.Select(c=>$"\"{c}\""));
  92. var cmd=new NpgsqlCommand($"SELECT {cs} FROM \"{Table}\" WHERE \"{Cols[0]}\"=@id",conn);
  93. cmd.Parameters.AddWithValue("id",id);
  94. using var r=cmd.ExecuteReader();
  95. if(r.Read()) for(int i=1;i<r.FieldCount;i++) Vals.Add(r[i]?.ToString()??"");
  96. }catch{}
  97. }
  98. }