Creating a basic calculator and establishing a connection to a MySQL database using C# WinForms.

Introduction

Project Functionality

In this project, our main focus is on establishing a connection between the program and the database, enabling operations like retrieval, modification, and more. Additionally, we aim to enhance the functionality of a calculator.
GitHub Project Link:Front-end code [https://github.com/wzxslcwdg/Back-end-code.git]
Back-end code [https://github.com/wzxslcwdg/Front-end-code.git]

The Table about personal information:

The Link Your Classhttps://bbs.csdn.net/forums/ssynkqtd-04
The Link of Requirement of This Assignmenthttps://bbs.csdn.net/topics/617378696
The Aim of This AssignmentSimple Web Calculator
MU STU ID and FZU STU ID21125261_832102218

psp Table

Personal Software Process StagesEstimated Time(minutes)Actual Time(minutes)
Planning6035
• Estimate
Development1010
• Analysis
• Design Spec1015
• Design Review510
• Coding Standard2020
• Design52
• Coding90150
• Code Review520
• Test2050
Reporting
• Test Repor3030
• Size Measurement1010
• Postmortem & Process Improvement Plan1010
Sum290326

Code Overview

Frontend Code

namespace Calculate
{
partial class Form1
{
    /// <summary>
    ///  Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    ///  Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    ///  Required method for Designer support - do not modify
    ///  the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        button1 = new Button();
        button2 = new Button();
        button3 = new Button();
        button4 = new Button();
        button5 = new Button();
        button6 = new Button();
        button7 = new Button();
        button8 = new Button();
        button9 = new Button();
        button10 = new Button();
        plus = new Button();
        multiply = new Button();
        minus = new Button();
        division = new Button();
        button16 = new Button();
        label1 = new Label();
        label2 = new Label();
        label3 = new Label();
        label4 = new Label();
        labelout = new Label();
        labelmode = new Label();
        labelbefore = new Label();
        button11 = new Button();
        remainder = new Button();
        connect = new Button();
        clear = new Button();
        SuspendLayout();
        // 
        // button1
        // 
        button1.Location = new Point(12, 174);
        button1.Name = "button1";
        button1.Size = new Size(94, 29);
        button1.TabIndex = 0;
        button1.Text = "1";
        button1.UseVisualStyleBackColor = true;
        button1.Click += button1_Click;
        // 
        // button2
        // 
        button2.Location = new Point(112, 174);
        button2.Name = "button2";
        button2.Size = new Size(94, 29);
        button2.TabIndex = 1;
        button2.Text = "2";
        button2.UseVisualStyleBackColor = true;
        button2.Click += button2_Click;
        // 
        // button3
        // 
        button3.Location = new Point(224, 174);
        button3.Name = "button3";
        button3.Size = new Size(94, 29);
        button3.TabIndex = 2;
        button3.Text = "3";
        button3.UseVisualStyleBackColor = true;
        button3.Click += button3_Click;
        // 
        // button4
        // 
        button4.Location = new Point(12, 240);
        button4.Name = "button4";
        button4.Size = new Size(94, 29);
        button4.TabIndex = 3;
        button4.Text = "4";
        button4.UseVisualStyleBackColor = true;
        button4.Click += button4_Click;
        // 
        // button5
        // 
        button5.Location = new Point(112, 240);
        button5.Name = "button5";
        button5.Size = new Size(94, 29);
        button5.TabIndex = 4;
        button5.Text = "5";
        button5.UseVisualStyleBackColor = true;
        button5.Click += button5_Click;
        // 
        // button6
        // 
        button6.Location = new Point(224, 240);
        button6.Name = "button6";
        button6.Size = new Size(94, 29);
        button6.TabIndex = 5;
        button6.Text = "6";
        button6.UseVisualStyleBackColor = true;
        button6.Click += button6_Click;
        // 
        // button7
        // 
        button7.Location = new Point(12, 292);
        button7.Name = "button7";
        button7.Size = new Size(94, 29);
        button7.TabIndex = 6;
        button7.Text = "7";
        button7.UseVisualStyleBackColor = true;
        button7.Click += button7_Click;
        // 
        // button8
        // 
        button8.Location = new Point(112, 292);
        button8.Name = "button8";
        button8.Size = new Size(94, 29);
        button8.TabIndex = 7;
        button8.Text = "8";
        button8.UseVisualStyleBackColor = true;
        button8.Click += button8_Click;
        // 
        // button9
        // 
        button9.Location = new Point(224, 292);
        button9.Name = "button9";
        button9.Size = new Size(94, 29);
        button9.TabIndex = 8;
        button9.Text = "9";
        button9.UseVisualStyleBackColor = true;
        button9.Click += button9_Click;
        // 
        // button10
        // 
        button10.Location = new Point(12, 349);
        button10.Name = "button10";
        button10.Size = new Size(94, 29);
        button10.TabIndex = 9;
        button10.Text = "0";
        button10.UseVisualStyleBackColor = true;
        button10.Click += button10_Click;
        // 
        // plus
        // 
        plus.Location = new Point(324, 174);
        plus.Name = "plus";
        plus.Size = new Size(94, 29);
        plus.TabIndex = 10;
        plus.Text = "+";
        plus.UseVisualStyleBackColor = true;
        plus.Click += plus_Click;
        // 
        // multiply
        // 
        multiply.Location = new Point(324, 292);
        multiply.Name = "multiply";
        multiply.Size = new Size(94, 29);
        multiply.TabIndex = 11;
        multiply.Text = "*";
        multiply.UseVisualStyleBackColor = true;
        multiply.Click += multiply_Click;
        // 
        // minus
        // 
        minus.Location = new Point(324, 240);
        minus.Name = "minus";
        minus.Size = new Size(94, 29);
        minus.TabIndex = 12;
        minus.Text = "-";
        minus.UseVisualStyleBackColor = true;
        minus.Click += minus_Click;
        // 
        // division
        // 
        division.Location = new Point(324, 349);
        division.Name = "division";
        division.Size = new Size(94, 29);
        division.TabIndex = 13;
        division.Text = "/";
        division.UseVisualStyleBackColor = true;
        division.Click += division_Click;
        // 
        // button16
        // 
        button16.Location = new Point(224, 349);
        button16.Name = "button16";
        button16.Size = new Size(94, 29);
        button16.TabIndex = 15;
        button16.Text = "ce";
        button16.UseVisualStyleBackColor = true;
        button16.Click += button16_Click;
        // 
        // label1
        // 
        label1.AutoSize = true;
        label1.Location = new Point(111, 12);
        label1.Name = "label1";
        label1.Size = new Size(0, 20);
        label1.TabIndex = 16;
        // 
        // label2
        // 
        label2.AutoSize = true;
        label2.Location = new Point(111, 52);
        label2.Name = "label2";
        label2.Size = new Size(0, 20);
        label2.TabIndex = 17;
        // 
        // label3
        // 
        label3.AutoSize = true;
        label3.Location = new Point(111, 94);
        label3.Name = "label3";
        label3.Size = new Size(0, 20);
        label3.TabIndex = 18;
        // 
        // label4
        // 
        label4.AutoSize = true;
        label4.Location = new Point(111, 135);
        label4.Name = "label4";
        label4.Size = new Size(0, 20);
        label4.TabIndex = 19;
        // 
        // labelout
        // 
        labelout.AutoSize = true;
        labelout.Font = new Font("Microsoft YaHei UI", 22.2F, FontStyle.Regular, GraphicsUnit.Point);
        labelout.Location = new Point(12, 71);
        labelout.Name = "labelout";
        labelout.Size = new Size(42, 48);
        labelout.TabIndex = 26;
        labelout.Text = "0";
        // 
        // labelmode
        // 
        labelmode.AutoSize = true;
        labelmode.Font = new Font("Microsoft YaHei UI", 10.8F, FontStyle.Regular, GraphicsUnit.Point);
        labelmode.Location = new Point(16, 41);
        labelmode.Name = "labelmode";
        labelmode.Size = new Size(0, 24);
        labelmode.TabIndex = 27;
        // 
        // labelbefore
        // 
        labelbefore.AutoSize = true;
        labelbefore.Location = new Point(1, 9);
        labelbefore.Name = "labelbefore";
        labelbefore.Size = new Size(0, 20);
        labelbefore.TabIndex = 28;
        // 
        // button11
        // 
        button11.Location = new Point(118, 349);
        button11.Name = "button11";
        button11.Size = new Size(88, 29);
        button11.TabIndex = 29;
        button11.Text = "=";
        button11.UseVisualStyleBackColor = true;
        button11.Click += button11_Click;
        // 
        // remainder
        // 
        remainder.Location = new Point(224, 395);
        remainder.Name = "remainder";
        remainder.Size = new Size(94, 29);
        remainder.TabIndex = 31;
        remainder.Text = "%";
        remainder.UseVisualStyleBackColor = true;
        remainder.Click += remainder_Click;
        // 
        // connect
        // 
        connect.Location = new Point(118, 395);
        connect.Name = "connect";
        connect.Size = new Size(94, 29);
        connect.TabIndex = 32;
        connect.Text = "ans";
        connect.UseVisualStyleBackColor = true;
        connect.Click += connect_Click;
        // 
        // clear
        // 
        clear.Location = new Point(12, 395);
        clear.Name = "clear";
        clear.Size = new Size(94, 29);
        clear.TabIndex = 33;
        clear.Text = "clear";
        clear.UseVisualStyleBackColor = true;
        clear.Click += clear_Click;
        // 
        // Form1
        // 
        AutoScaleDimensions = new SizeF(9F, 20F);
        AutoScaleMode = AutoScaleMode.Font;
        ClientSize = new Size(415, 436);
        Controls.Add(clear);
        Controls.Add(connect);
        Controls.Add(remainder);
        Controls.Add(button11);
        Controls.Add(labelbefore);
        Controls.Add(labelmode);
        Controls.Add(labelout);
        Controls.Add(label4);
        Controls.Add(label3);
        Controls.Add(label2);
        Controls.Add(label1);
        Controls.Add(button16);
        Controls.Add(division);
        Controls.Add(minus);
        Controls.Add(multiply);
        Controls.Add(plus);
        Controls.Add(button10);
        Controls.Add(button9);
        Controls.Add(button8);
        Controls.Add(button7);
        Controls.Add(button6);
        Controls.Add(button5);
        Controls.Add(button4);
        Controls.Add(button3);
        Controls.Add(button2);
        Controls.Add(button1);
        Name = "Form1";
        Text = "Form1";
        Load += Form1_Load;
        ResumeLayout(false);
        PerformLayout();
    }

    #endregion

    private Button button1;
    private Button button2;
    private Button button3;
    private Button button4;
    private Button button5;
    private Button button6;
    private Button button7;
    private Button button8;
    private Button button9;
    private Button button10;
    private Button plus;
    private Button multiply;
    private Button minus;
    private Button division;
    private Button button16;
    private Label label1;
    private Label label2;
    private Label label3;
    private Label label4;
    private Label labelout;
    private Label labelmode;
    private Label labelbefore;
    private Button button11;
    private Button remainder;
    private Button connect;
    private Button clear;
}
}

Backend Code

using MySql.Data.MySqlClient;
using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Calculate
{
public partial class Form1 : Form
{
    double number1 = 0, number2 = 0, number3 = 0;
    int inputnumber;

    enum Operator { none, plus, minus, multiply, division, remainder }
    Operator mode = Operator.none;
    bool ismode = false;
    bool isplus = false;
    bool isminus = false;
    bool ismult = false;
    bool isdivi = false;
    bool isremainder = false;


    public Form1()
    {
        InitializeComponent();
    }



    private void button16_Click(object sender, EventArgs e)
    {
        number1 = 0;
        number2 = 0;
        number3 = 0;
        isminus = false;
        ismult = false;
        isdivi = false;
        isplus = false;
        ismode = false;
        isremainder = false;
        labelout.Text = Convert.ToString(number1);
        labelout.Text = Convert.ToString(number2);
        labelout.Text = Convert.ToString(number3);

    }
    private void plus_Click(object sender, EventArgs e)
    {

        mode = Operator.plus;

        labelmode.Text = "+";
        labelout.Text = Convert.ToString(number2);
        labelbefore.Text = Convert.ToString(number1);
        ismode = true;
        isplus = true;

    }
    private void minus_Click(object sender, EventArgs e)
    {
        mode = Operator.minus;

        labelmode.Text = "-";
        labelout.Text = Convert.ToString(number2);
        labelbefore.Text = Convert.ToString(number1);
        ismode = true;
        isminus = true;
    }
    private void multiply_Click(object sender, EventArgs e)
    {
        mode = Operator.multiply;

        labelmode.Text = "*";
        labelout.Text = Convert.ToString(number2);
        labelbefore.Text = Convert.ToString(number1);
        ismode = true;
        ismult = true;
    }
    private void division_Click(object sender, EventArgs e)
    {
        mode = Operator.division;

        labelmode.Text = "/";
        labelout.Text = Convert.ToString(number2);
        labelbefore.Text = Convert.ToString(number1);
        ismode = true;
        isdivi = true;
    }
    private void remainder_Click(object sender, EventArgs e)
    {
        mode = Operator.remainder;

        labelmode.Text = "%";
        labelout.Text = Convert.ToString(number2);
        labelbefore.Text = Convert.ToString(number1);
        ismode = true;
        isremainder = true;
    }



    private void button10_Click(object sender, EventArgs e)
    {
        inputnumber = 0;
        Calculate(inputnumber);
    }

    private void button9_Click(object sender, EventArgs e)
    {
        inputnumber = 9;
        Calculate(inputnumber);
    }

    private void button8_Click(object sender, EventArgs e)
    {
        inputnumber = 8;
        Calculate(inputnumber);
    }

    private void button7_Click(object sender, EventArgs e)
    {
        inputnumber = 7;
        Calculate(inputnumber);
    }

    private void button6_Click(object sender, EventArgs e)
    {
        inputnumber = 6;
        Calculate(inputnumber);
    }

    private void button5_Click(object sender, EventArgs e)
    {
        inputnumber = 5;
        Calculate(inputnumber);
    }

    private void button4_Click(object sender, EventArgs e)
    {
        inputnumber = 4;
        Calculate(inputnumber);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        inputnumber = 3;
        Calculate(inputnumber);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        inputnumber = 2;
        Calculate(inputnumber);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        inputnumber = 1;
        Calculate(inputnumber);
    }
    public void Calculate(int ck)
    {
        if (ismode == false)
        {
            number1 = number1 * 10 + ck;
            labelout.Text = Convert.ToString(number1);
        }
        else
        {
            number2 = number2 * 10 + ck;
            labelout.Text = Convert.ToString(number2);
        }
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        labelout.Text = Convert.ToString(number1);
    }

    private void button11_Click(object sender, EventArgs e)
    {
        string operatorSymbol = "";
        double result = 0.0;

        if (isplus)
        {
            operatorSymbol = "+";
            result = number1 + number2;
        }
        else if (isminus)
        {
            operatorSymbol = "-";
            result = number1 - number2;
        }
        else if (ismult)
        {
            operatorSymbol = "*";
            result = number1 * number2;
        }
        else if (isdivi && number2 != 0)
        {
            operatorSymbol = "/";
            result = number1 / number2;
        }
        else if (isdivi && number2 == 0)
        {
            labelbefore.Text = "";
            labelmode.Text = "";
            labelout.Text = "error";
            operatorSymbol = "/";
        }
        else if (isremainder)
        {
            operatorSymbol = "%";
            result = number1 % number2;
        }

        string calculationString = $"{number1} {operatorSymbol} {number2}";
        labelbefore.Text = "";
        labelmode.Text = "";
        labelout.Text = result.ToString();

        InsertCalculationIntoDatabase(calculationString, result);

        number1 = result;
        number2 = 0;
        isplus = false;
        isminus = false;
        ismult = false;
        isdivi = false;
        ismode = false;
    }


    private void button12_Click(object sender, EventArgs e)
    {

    }

    private void connect_Click(object sender, EventArgs e)
    {
        string connStr = "server=localhost;port=3306;user=root;password=Kk20021125k*;database=cal;";
        MySqlConnection con = new MySqlConnection(connStr);
        try
        {
            con.Open();
            string history = "";
            string query = "SELECT String, Result FROM cal ORDER BY ID DESC LIMIT 10"; // 修改列名
            using (MySqlCommand cmd = new MySqlCommand(query, con))
            {
                using (MySqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string calculationString = reader.GetString("String");
                        string result = reader.GetString("Result");
                        history = history + calculationString + " = " + result + "\r\n";
                    }
                }
            }
            MessageBox.Show(history, "History");
            con.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    private void InsertCalculationIntoDatabase(string String, double result)
    {
        string connStr = "server=localhost;port=3306;user=root;password=Kk20021125k*;database=cal;";
        MySqlConnection con = new MySqlConnection(connStr);

        try
        {
            con.Open();
            string insertQuery = "INSERT INTO cal (String, Result) VALUES (@String, @Result)";

            using (MySqlCommand insertCommand = new MySqlCommand(insertQuery, con))
            {
                insertCommand.Parameters.AddWithValue("@String", String);
                insertCommand.Parameters.AddWithValue("@Result", result);
                insertCommand.ExecuteNonQuery();
            }
            MessageBox.Show("Calculation inserted successfully.", "Success");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message, "Error");
        }
        finally
        {
            con.Close();
        }
    }

    private void clear_Click(object sender, EventArgs e)
    {
        string connStr = "server=localhost;port=3306;user=root;password=Kk20021125k*;database=cal;";
        MySqlConnection con = new MySqlConnection(connStr);

        try
        {
            con.Open();
            string clearQuery = "DELETE FROM cal";
            using (MySqlCommand clearCommand = new MySqlCommand(clearQuery, con))
            {
                clearCommand.ExecuteNonQuery();
            }
            MessageBox.Show("Database cleared successfully.", "Success");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message, "Error");
        }
        finally
        {
            con.Close();
        }
    }
}
}

nitializing and Creating Tables in MySQL Database

have installed MySQL as my database, which is a widely used open-source relational database. To set up MySQL, I followed the instructions provided in the following article: https://blog.csdn.net/weixin_43579015/article/details/117228159?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169795533216777224456568%2522%252
Once the installation and configuration were completed, I used Navicat software for more straightforward MySQL usage. Here are the steps I followed:
First,clicked on the “Connect” button in the top right corner and selected MySQL.
Then, entered the password to establish the connection.
As a result, I obtained the following situation:在这里插入图片描述
“We select a database and modify one of its tables to add fields and define their types. (Here, I need an ‘id’ for sequence confirmation, a ‘result,’ and an ‘equation,’ so I named them accordingly).”
在这里插入图片描述
Then we choose to save, completing the settings before writing the code.

Connecting to the Database in the Backend

If we want to establish a connection between MySQL and Visual Studio (VS), we need to import the Mysql.Data.dll, which can be directly downloaded from the official website.

Next, we need to determine our .Net Framework version. In my case, it’s version 4.8. Then, in Visual Studio, we select “Add Reference” and choose the corresponding Mysql.Data.dll file.
在这里插入图片描述
Then we can use the following code to check if the connection is successful:

First, we need to reference the relevant services and libraries.
Then, we establish a connection with the database by inputting the correct database properties and password using the following code.在这里插入图片描述
Finally, we use con.Open() to check if the database has been successfully connected.

Code for Interacting with the Database

Storing and Retrieving Data

In the code below, I have implemented the functionality to display the contents of the database. The MessageBox function is used to open a new window for displaying the relevant content.

private void clear_Click(object sender, EventArgs e)
{
  string connStr = 	"server=localhost;port=3306;user=root;password=Kk20021125k*;database=cal;";
 MySqlConnection con = new MySqlConnection(connStr);
 try
 {
     con.Open();
     string clearQuery = "DELETE FROM cal";
     using (MySqlCommand clearCommand = new MySqlCommand(clearQuery, con))
     {
         clearCommand.ExecuteNonQuery();
     }
     MessageBox.Show("Database cleared successfully.", "Success");
 }
 catch (Exception ex)
 {
     MessageBox.Show("Error: " + ex.Message, "Error");
 }
 finally
 {
     con.Close();
 }
}

The implementation of the storage functionality is as shown in the following code.

private void button11_Click(object sender, EventArgs e)
{
string operatorSymbol = "";
double result = 0.0;

if (isplus)
{
    operatorSymbol = "+";
    result = number1 + number2;
}
else if (isminus)
{
    operatorSymbol = "-";
    result = number1 - number2;
}
else if (ismult)
{
    operatorSymbol = "*";
    result = number1 * number2;
}
else if (isdivi && number2 != 0)
{
    operatorSymbol = "/";
    result = number1 / number2;
}
else if (isdivi && number2 == 0)
{
    labelbefore.Text = "";
    labelmode.Text = "";
    labelout.Text = "error";
    operatorSymbol = "/";
}
else if (isremainder)
{
    operatorSymbol = "%";
    result = number1 % number2;
}

string calculationString = $"{number1} {operatorSymbol} {number2}";
labelbefore.Text = "";
labelmode.Text = "";
labelout.Text = result.ToString();

InsertCalculationIntoDatabase(calculationString, result);

number1 = result;
number2 = 0;
isplus = false;
isminus = false;
ismult = false;
isdivi = false;
ismode = false;
}

I modified the code so that the data initialization process is implemented at the end. The purpose of this is to use the InsertCalculationIntoDatabase() function to transfer equations and results to the table before initialization.

There is the gif:
在这里插入图片描述

Clear historical records

If the historical records are continually stored without reduction, it can lead to various issues. Therefore, I have added a button to clear all historical records.

  private void clear_Click(object sender, EventArgs e)
 {
     string connStr = "server=localhost;port=3306;user=root;password=Kk20021125k*;database=cal;";
     MySqlConnection con = new MySqlConnection(connStr);

     try
     {
         con.Open();
         string clearQuery = "DELETE FROM cal";
         using (MySqlCommand clearCommand = new MySqlCommand(clearQuery, con))
         {
             clearCommand.ExecuteNonQuery();
         }
         MessageBox.Show("Database cleared successfully.", "Success");
     }
     catch (Exception ex)
     {
         MessageBox.Show("Error: " + ex.Message, "Error");
     }
     finally
     {
         con.Close();
     }
 }

There is the gif:
在这里插入图片描述

Implementing Remainder Calculation

The code here is similar to what was discussed earlier. The main idea is to define a state that changes when a button is pressed. The final calculation is performed based on this state when the equal sign button is pressed.

    private void remainder_Click(object sender, EventArgs e)
    {
        mode = Operator.remainder;
        labelmode.Text = "%";
        labelout.Text = Convert.ToString(number2);
        labelbefore.Text = Convert.ToString(number1);
        ismode = true;
        isremainder = true;
    }

There is the code in the equal button:

  else if (isremainder)
 {
   operatorSymbol = "%";
     result = number1 % number2;
}

在这里插入图片描述

Summary

The main challenge of this experiment was the database connection. I encountered several errors during the connection process, including but not limited to:

  1. Downloading the incorrect version of MySQL, leading to initialization failures.
  2. Incorrectly determining the .Net Framework version and using the wrong MySQL.Data.dll, resulting in a failed database connection.

It’s worth mentioning that when using MySQL, error messages frequently appeared, partly due to permission issues. To address this problem, I needed to grant administrative privileges to the cmd.

Another issue was that the MySQL service name isn’t always standard MySQL. By opening the service interface using the command “services.msc,” I discovered that the local MySQL name was “MySQL80.”

In summary, I successfully developed a calculator connected to a database. This project provided me with valuable experience in WinForms and MySQL database operations, improving my development skills. The separation of frontend and backend approaches greatly streamlined the frontend, increasing efficiency and clarifying roles. This also provides convenience for future project modifications and upgrades.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值