AdminMainForm.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. using Npgsql;
  2. using System;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Windows.Forms;
  6. using System.Windows.Forms.DataVisualization.Charting;
  7. using OfficeOpenXml;
  8. using OfficeOpenXml.Style;
  9. using System.Drawing;
  10. using System.IO;
  11. using OfficeOpenXml;
  12. namespace WindowsFormsApp4
  13. {
  14. public partial class AdminMainForm : Form
  15. {
  16. private readonly string connStr = ConfigurationManager.ConnectionStrings["PostgreSQL"].ConnectionString;
  17. public AdminMainForm()
  18. {
  19. ExcelPackage.License.SetNonCommercialPersonal("Ваше Имя");
  20. InitializeComponent();
  21. }
  22. private void AdminMainForm_Load(object sender, EventArgs e)
  23. {
  24. labelWelcome.Text = $"Админ: {Session.UserFullName}";
  25. LoadLogs();
  26. LoadUsers();
  27. dateTimePickerEnd.Value = DateTime.Now;
  28. dateTimePickerStart.Value = DateTime.Now.AddDays(-30);
  29. LoadStatistics();
  30. }
  31. private void LoadLogs()
  32. {
  33. string query = @"
  34. SELECT
  35. l.id,
  36. l.action_time,
  37. l.user_name,
  38. l.table_name,
  39. l.action,
  40. l.record_id
  41. FROM logs l
  42. ORDER BY l.action_time DESC";
  43. DataTable dt = new DataTable();
  44. using (var conn = new NpgsqlConnection(connStr))
  45. using (var cmd = new NpgsqlCommand(query, conn))
  46. {
  47. conn.Open();
  48. using (var adapter = new NpgsqlDataAdapter(cmd))
  49. {
  50. adapter.Fill(dt);
  51. }
  52. }
  53. dataGridViewLogs.DataSource = dt;
  54. }
  55. private void btnExportLogs_Click(object sender, EventArgs e)
  56. {
  57. ExportDataGridViewToExcel(dataGridViewLogs, "Логи_системы");
  58. }
  59. private void LoadUsers()
  60. {
  61. string filter = cmbRoleFilter.SelectedItem?.ToString();
  62. string query = @"
  63. SELECT
  64. u.id,
  65. u.name,
  66. u.lastname,
  67. mask_sensitive_data(u.phone),
  68. mask_sensitive_data(u.email),
  69. u.role_name AS role,
  70. u.bilet_active,
  71. l.name AS library_name
  72. FROM users u
  73. LEFT JOIN libraries l ON u.library_id = l.id
  74. WHERE 1=1";
  75. if (!string.IsNullOrEmpty(filter) && filter != "Все")
  76. {
  77. query += " AND u.role_name = @role::role";
  78. }
  79. query += " ORDER BY u.id";
  80. DataTable dt = new DataTable();
  81. using (var conn = new NpgsqlConnection(connStr))
  82. using (var cmd = new NpgsqlCommand(query, conn))
  83. {
  84. if (!string.IsNullOrEmpty(filter) && filter != "Все")
  85. cmd.Parameters.AddWithValue("role", filter);
  86. conn.Open();
  87. using (var adapter = new NpgsqlDataAdapter(cmd))
  88. {
  89. adapter.Fill(dt);
  90. }
  91. }
  92. dataGridViewUsers.DataSource = dt;
  93. if (dataGridViewUsers.Columns["id"] != null)
  94. dataGridViewUsers.Columns["id"].Visible = false;
  95. }
  96. private void cmbRoleFilter_SelectedIndexChanged(object sender, EventArgs e)
  97. {
  98. LoadUsers();
  99. }
  100. private void btnAddUser_Click(object sender, EventArgs e)
  101. {
  102. using (var addForm = new AdminUserEditForm(null))
  103. {
  104. if (addForm.ShowDialog() == DialogResult.OK)
  105. LoadUsers();
  106. }
  107. }
  108. private void btnEditUser_Click(object sender, EventArgs e)
  109. {
  110. if (dataGridViewUsers.CurrentRow == null)
  111. {
  112. MessageBox.Show("Выберите пользователя для редактирования");
  113. return;
  114. }
  115. int userId = Convert.ToInt32(dataGridViewUsers.CurrentRow.Cells["id"].Value);
  116. AdminUserEditForm editForm = new AdminUserEditForm(userId);
  117. editForm.FormClosed += (s, args) => LoadUsers();
  118. editForm.ShowDialog();
  119. }
  120. private void btnDeleteUser_Click(object sender, EventArgs e)
  121. {
  122. if (dataGridViewUsers.CurrentRow == null)
  123. {
  124. MessageBox.Show("Выберите пользователя для удаления");
  125. return;
  126. }
  127. int userId = Convert.ToInt32(dataGridViewUsers.CurrentRow.Cells["id"].Value);
  128. string role = dataGridViewUsers.CurrentRow.Cells["role"].Value.ToString();
  129. if (role == "admin")
  130. {
  131. MessageBox.Show("Нельзя удалить администратора через интерфейс.");
  132. return;
  133. }
  134. if (MessageBox.Show("Удалить пользователя? Это действие необратимо.", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes)
  135. {
  136. try
  137. {
  138. using (var conn = new NpgsqlConnection(connStr))
  139. {
  140. conn.Open();
  141. string query = "DELETE FROM users WHERE id = @id";
  142. using (var cmd = new NpgsqlCommand(query, conn))
  143. {
  144. cmd.Parameters.AddWithValue("id", userId);
  145. cmd.ExecuteNonQuery();
  146. }
  147. }
  148. LoadUsers();
  149. MessageBox.Show("Пользователь удалён.");
  150. }
  151. catch (Exception ex)
  152. {
  153. MessageBox.Show($"Ошибка: {ex.Message}");
  154. }
  155. }
  156. }
  157. private void LoadStatistics()
  158. {
  159. DateTime start = dateTimePickerStart.Value.Date;
  160. DateTime end = dateTimePickerEnd.Value.Date.AddDays(1).AddSeconds(-1);
  161. LoadTopBooks(start, end);
  162. LoadChart(start, end);
  163. }
  164. private void LoadTopBooks(DateTime start, DateTime end)
  165. {
  166. string query = @"
  167. SELECT
  168. b.title AS Название,
  169. COUNT(o.d) AS Выдано
  170. FROM orders o
  171. JOIN book_exemplar be ON o.book_exemplar = be.isbn
  172. JOIN book b ON be.book_id = b.id
  173. WHERE o.give_date BETWEEN @start AND @end
  174. GROUP BY b.id, b.title
  175. ORDER BY Выдано DESC
  176. LIMIT 10";
  177. DataTable dt = new DataTable();
  178. using (var conn = new NpgsqlConnection(connStr))
  179. using (var cmd = new NpgsqlCommand(query, conn))
  180. {
  181. cmd.Parameters.AddWithValue("start", start);
  182. cmd.Parameters.AddWithValue("end", end);
  183. conn.Open();
  184. using (var adapter = new NpgsqlDataAdapter(cmd))
  185. {
  186. adapter.Fill(dt);
  187. }
  188. }
  189. dataGridViewTopBooks.DataSource = dt;
  190. }
  191. private void LoadChart(DateTime start, DateTime end)
  192. {
  193. string query = @"
  194. SELECT
  195. DATE(o.give_date) AS Дата,
  196. COUNT(*) AS Количество
  197. FROM orders o
  198. WHERE o.give_date BETWEEN @start AND @end
  199. GROUP BY DATE(o.give_date)
  200. ORDER BY Дата";
  201. DataTable dt = new DataTable();
  202. using (var conn = new NpgsqlConnection(connStr))
  203. using (var cmd = new NpgsqlCommand(query, conn))
  204. {
  205. cmd.Parameters.AddWithValue("start", start);
  206. cmd.Parameters.AddWithValue("end", end);
  207. conn.Open();
  208. using (var adapter = new NpgsqlDataAdapter(cmd))
  209. {
  210. adapter.Fill(dt);
  211. }
  212. }
  213. chartPopularBooks.Series.Clear();
  214. Series series = new Series("Выдачи");
  215. series.ChartType = SeriesChartType.Column;
  216. series.XValueMember = "Дата";
  217. series.YValueMembers = "Количество";
  218. chartPopularBooks.DataSource = dt;
  219. chartPopularBooks.Series.Add(series);
  220. chartPopularBooks.ChartAreas[0].AxisX.Title = "Дата";
  221. chartPopularBooks.ChartAreas[0].AxisY.Title = "Количество выдач";
  222. chartPopularBooks.DataBind();
  223. }
  224. private void btnRefreshStats_Click(object sender, EventArgs e)
  225. {
  226. LoadStatistics();
  227. }
  228. private void btnExportExcel_Click(object sender, EventArgs e)
  229. {
  230. ExportDataGridViewToExcel(dataGridViewTopBooks, "Топ_книг");
  231. }
  232. private void ExportDataGridViewToExcel(DataGridView dgv, string fileName)
  233. {
  234. if (dgv.Rows.Count == 0)
  235. {
  236. MessageBox.Show("Нет данных для экспорта.");
  237. return;
  238. }
  239. SaveFileDialog saveFileDialog = new SaveFileDialog();
  240. saveFileDialog.Filter = "Excel files (*.xlsx)|*.xlsx";
  241. saveFileDialog.FileName = $"{fileName}_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx";
  242. if (saveFileDialog.ShowDialog() == DialogResult.OK)
  243. {
  244. using (ExcelPackage package = new ExcelPackage())
  245. {
  246. ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");
  247. for (int i = 1; i <= dgv.Columns.Count; i++)
  248. {
  249. worksheet.Cells[1, i].Value = dgv.Columns[i - 1].HeaderText;
  250. worksheet.Cells[1, i].Style.Font.Bold = true;
  251. worksheet.Cells[1, i].Style.Fill.PatternType = ExcelFillStyle.Solid;
  252. worksheet.Cells[1, i].Style.Fill.BackgroundColor.SetColor(Color.LightGray);
  253. }
  254. for (int i = 0; i < dgv.Rows.Count; i++)
  255. {
  256. for (int j = 0; j < dgv.Columns.Count; j++)
  257. {
  258. var value = dgv.Rows[i].Cells[j].Value;
  259. worksheet.Cells[i + 2, j + 1].Value = value != null ? value.ToString() : "";
  260. }
  261. }
  262. worksheet.Cells.AutoFitColumns();
  263. package.SaveAs(new FileInfo(saveFileDialog.FileName));
  264. }
  265. MessageBox.Show("Экспорт завершён.");
  266. }
  267. }
  268. private void btnLogout_Click(object sender, EventArgs e)
  269. {
  270. Session.UserId = 0;
  271. Session.UserRole = null;
  272. Session.UserFullName = null;
  273. Session.LibraryId = null;
  274. this.Close();
  275. }
  276. private void dataGridViewLogs_CellContentClick(object sender, DataGridViewCellEventArgs e)
  277. {
  278. }
  279. private void dataGridViewUsers_CellContentClick(object sender, DataGridViewCellEventArgs e)
  280. {
  281. if (e.RowIndex >= 0)
  282. {
  283. int userId = Convert.ToInt32(dataGridViewUsers.Rows[e.RowIndex].Cells["id"].Value);
  284. using (var editForm = new AdminUserEditForm(userId))
  285. {
  286. if (editForm.ShowDialog() == DialogResult.OK)
  287. LoadUsers();
  288. }
  289. }
  290. }
  291. private void chartPopularBooks_Click(object sender, EventArgs e)
  292. {
  293. }
  294. private void dataGridViewTopBooks_CellContentClick(object sender, DataGridViewCellEventArgs e)
  295. {
  296. }
  297. private void dataGridViewUsers_CellContentClick_1(object sender, DataGridViewCellEventArgs e)
  298. {
  299. }
  300. }
  301. }