WorldSkills:奥运会参与者回顾


哈Ha!

每个程序员都想发挥自己的技能,每个公司都想见到合格的专家,但是如何实现呢? 奥林匹克运动会来救援,本文将涉及其中之一。

撤退


事实证明,本文篇幅如此之多,因此所有代码和大多数图像都在剧透之下。 仍在测试文章提交格式。 如果您觉得这种格式不舒服,请写下来。 此外,所有图片都是可单击的。

关于比赛


WorldSkills是一项竞赛,其目标是寻找特定领域的专业人员。 这项竞赛起源于国际非营利协会WorldSkills International(WSI)。

参加比赛是免费的。 参加者的年龄为18至28岁,是大专院校的学生。

该大学的比赛持续5天:第一天,职位的开放和验证,然后第三天,最后一天的比赛-总结和结束。

关于能力选择和培训


在第二年的大学实习中,我偶然地了解了奥运会。 我受邀参加了“为企业开发软件解决方案”的能力。 为了解决这些问题,需要使用C#或Java的知识,并需要使用数据库,并且正如我在第一次Android奥运会中所发现的那样。 奥林匹克运动会原定于6月初开幕,而窗户已经是4月底。 在那一刻,我完全不需要任何知识。

当所有潜在的参与者都聚集起来接受培训时,我感到很惊讶。 听众中有7人,其中6人已经是三年级学生,而我是第七名。 我为什么这么惊讶? 在第三年,将为学生教授数据库课程,该课程将持续2个学期,这意味着每个人都有超过一年的实践经验。 我不想拒绝,所以我向老师询问数据库中的书籍,在互联网上找到 C# 课程并开始准备,并定期出现在预备班上。

奥运会开始前两周,我们获悉,本部门最多可以参加三人。 通过排位赛。 在1.5个小时内,我们必须使用ER模型在MSSQL数据库管理系统中创建数据库,从Excel文件导入数据并将其显示在应用程序中。 一言以蔽之,我被允许参加我们部门的奥运会。

现在关于比赛


比赛的第一天或“ C -1”


期待已久的发现发生在这一天。 所有参与者都聚集在礼堂,向他们介绍了WorldSkills的历史,能力,并向所有参与者介绍了专家。
仪式结束后,每个人都去了现场检查设备。 举行了“奉献仪式”,我们选择了工作并签署了安全保证书。 当时,我不知道可以在该软件中进行哪些检查,因此在抽奖之后,我立即离开去为第二天做准备。

比赛第二天或比赛开始


什么是奥运会?

对于我们的能力,在2天(其他能力为3天)中,有6个小时的时间,偶尔休息,我们被要求用C#/ Java编写一个客户端服务器应用程序并查询数据库。 更确切地说,说“我们有时间写的所有东西”,因为奥林匹克运动会的原则是“竭尽所能,尽力而为”。

据专家称,标准为几十页A4页。 标准仅在会议结束后才发布,并且仅发布给专家,因此我无法对它们发表任何评论。

让我们继续第二天的活动。 对于第一届会议,需要实施以下内容:

  • 使用众所周知的ER图创建数据库
  • 将数据从Excel文件导入数据库
  • 为演示文稿中的布局创建4个屏幕

第二个组成另外五个布局屏幕。

简而言之,除了显示数据库中的图片和创建元素的自定义列表外,所有任务都已解决。

一些截图:




该界面允许您按姓名(甚至首字母),赛季和球队来查找球员。 通过双击未实现的图像,可以打开有关播放器的详细信息。 现在,我将通过DataGridViewImageColumn实现它。




我如何保存图像
private void download_Click(object sender, EventArgs e) { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.DefaultExt = ".jpg"; saveFile.AddExtension = true; //   - / saveFile.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures); saveFile.Filter = "Bitmap files (*.bmp)|*.bmp|Image files (*.jpg;*.png)|*.jpg;*.png"; if (saveFile.ShowDialog() == DialogResult.OK) { if (!saveFile.FileName.Equals("")) { String[] arr = saveFile.FileName.Split('.'); //       "\"  String filepath = arr[0].Substring(0, arr[0].LastIndexOf('\\') + 1); for (int i = 1; i <= imageList1.Images.Count; i++) { Image image = Image.FromFile("..\\Pictures\\" + (i + offset) + ".jpg"); image.Save(filepath + i + "." + arr[1]); } } } } 


更多屏幕截图,文本和代码



该界面是主屏幕,可让您选择“用户”或“管理员”的角色,以及观看比赛中的最佳时刻。 找不到如何将元素放置在中心。

图片上传实施
 private int countImages() { sqlConnection = new SqlConnection(connectionString); using (sqlConnection) { sqlConnection.Open(); String sqlcomm = "SELECT Count(*) FROM [Pictures$]"; SqlCommand command = new SqlCommand(sqlcomm, sqlConnection); int result = (int)command.ExecuteScalar(); return result; } } private void loadPage() { sqlConnection = new SqlConnection(connectionString); using (sqlConnection) { sqlConnection.Open(); String sqlcomm = "SELECT [Img] , [CreateTime] FROM [Pictures] P" + " Order By P.CreateTime Desc" + " Offset @click Rows FETCH NEXT @svm ROWS ONLY"; SqlCommand cmd = new SqlCommand(sqlcomm, sqlConnection); cmd.Parameters.AddWithValue("@click", click); cmd.Parameters.AddWithValue("@svm", svm); dataAdapter.SelectCommand = cmd; DataSet data = new DataSet(); dataAdapter.Fill(data); imageList1.Images.Clear(); listView1.Clear(); for (int i = 0; i < data.Tables[0].Rows.Count; i++) { imageList1.Images.Add(Image.FromFile("..\\Pictures\\" + data.Tables[0].Rows[i].ItemArray[0].ToString())); } listView1.LargeImageList = imageList1; for (int i = 0; i < imageList1.Images.Count; i++) listView1.Items.Add("").ImageIndex = i; } } private void left_Click(object sender, EventArgs e) { if (click > 0) { if (!right.Enabled) { right.Enabled = true; } click -= svm; loadPage(); } else { left.Enabled = false; } } private void right_Click(object sender, EventArgs e) { if (click + svm < totalPhotos) { if (!left.Enabled) { left.Enabled = true; } click += svm; loadPage(); } else { right.Enabled = false; } } 





技术管理员和比赛组织者授权的界面,使您可以记住上次输入的用户名和密码。 就我而言,我没有加密就将数据写入硬盘上的文件。

检查数据库中是否存在输入的用户名和密码
  private int checkData(string jobnumber, string password) { //  SQL-Injection     String sqlchecked = "if (Isnull((Select RoleId From Admin$ Where Jobnumber like(@Jobnumber) and Passwords like(@Password)) , 0) = 0)" + " Select 0 " + " else " + " Select RoleId From Admin$ Where Jobnumber like(@Jobnumber) and Passwords like(@Password)"; sqlConnection = new SqlConnection(connectionString); int result = 0; using (sqlConnection) { sqlConnection.Open(); SqlCommand command = new SqlCommand(sqlchecked, sqlConnection); //     command.Parameters.AddWithValue("@Jobnumber", jobnumber); command.Parameters.AddWithValue("@Password", password); //        result = (int)command.ExecuteScalar(); } return result; } 


如果您知道验证数据的最佳方法,请在评论中写。




这就是未完成的屏幕的外观,这里我只是根据布局将组件扔到了表单上。 您能告诉我如何在C#中创建这样的自定义列表吗?




对我来说,最困难的屏幕是,因为有一些我没有准备好的图表。

比赛的第三天或与Android的意外会议


与第三天相比,前一天可以被认为是热身。 在3次会议上,另外8个屏幕将被记入屏幕。 在最后一届会议上,计划发生了变化,我们开始为Android制作简化版,而不是介绍已开发产品。 即,具有从数据库上传的图片的画廊。 现在听起来很简单,但那一刻我很高兴为会议安排了15分钟的访问互联网的时间。 在3小时内,使用ImageView形式的元素创建了GridView,将一组id图像传输到了Adapter,并重新定义了OnItemClickListener接口以创建带有图片的新Activity。

一些截图:




管理员界面,允许您查看播放器信息。 我认为,这是最没用的屏幕,因为您无法进行更改。

| | |

我的“完美”画廊可以在3个小时内使用互联网,并且没有Android编程技能。

更多图片,文字和代码。
当您不知道如何使用数据库时用于创建画廊的代码
 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) // id  var images = ArrayList<Int>() images.add(R.drawable.a1) //... images.add(R.drawable.a12) listView.adapter = CustomAdapter(images.toTypedArray()) listView.onItemClickListener = AdapterView.OnItemClickListener { _: AdapterView<*>, _: View, i: Int, _: Long -> var intent = Intent(this, FullscreenActivity::class.java) // id ,    intent.putExtra("id",images[i]) startActivity(intent) } } } class CustomAdapter internal constructor(var images: Array<Int>) : BaseAdapter() { override fun getCount(): Int { return images.size } //    override fun getItem(position: Int): Int { return images[position] } // id   override fun getItemId(position: Int): Long { return position.toLong() } //   override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { //    var view: View? = convertView // ,   if (view == null) { val inflater = LayoutInflater.from(parent.context) view = inflater.inflate(R.layout.item, parent, false) } view!!.findViewById<ImageView>(R.id.imageView).setImageResource(images[position]) return view } } class FullscreenActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_fullscreen) // id  var id = intent.getIntExtra("id",-1) imageView2.setImageResource(id) } } 





通过单击一个赛季(右表),将打开所有比赛的详细信息。




管理员界面,允许您更改命令列表并将数据导出到Excel。

我如何将数据导出到Excel
 private void exportExcel_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Excel (*.xls)|*.xls|All files (*.*)|*.*"; saveFileDialog.DefaultExt = ".xls"; if (saveFileDialog.ShowDialog() != DialogResult.OK) return; if (saveFileDialog.FileName.Equals("")) return; DataTable dt = (DataTable)dataGridView2.DataSource; //  StreamWriter wr = new StreamWriter(saveFileDialog.FileName); try { for (int i = 0; i < dt.Columns.Count; i++) { wr.Write(dt.Columns[i].ToString().ToUpper() + "\t"); } wr.WriteLine(); //    Excel for (int i = 0; i < (dt.Rows.Count); i++) { for (int j = 0; j < dt.Columns.Count; j++) { if (dt.Rows[i][j] != null) { wr.Write(Convert.ToString(dt.Rows[i][j]) + "\t"); } else { wr.Write("\t"); } } //    wr.WriteLine(); } //  wr.Close(); } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 



总结


12点钟举行了闭幕式,向所有参加者颁发了证书,并为获奖者颁发了带有奖状的奖牌。 在我们的能力中,我获得了第二名。 在奖励能力之间,学生们会唱歌和跳舞。

结论


在准备的一个月中,我掌握了DDL和DML SQL团队,从而大大简化了第三年数据库对的工作。 在C#和Windows Form中获得的知识还有很多需要改进的地方,除了使用数据库和用户界面外,我无需进行任何处理。

今年,我还参加了世界技能奥林匹克竞赛并获得了第一名,但是关于这一点,复杂的任务以及在下一篇文章中断开网站上的Internet的后果。

Source: https://habr.com/ru/post/zh-CN460819/


All Articles