Java實驗--基於Swing的簡單的歌曲信息管理系統(二)

来源:http://www.cnblogs.com/meiqing/archive/2017/12/13/8033994.html
-Advertisement-
Play Games

原創不易,轉載請標明出處。上一篇《Java實驗--基於Swing的簡單的歌曲信息管理系統(一)》講解瞭如何這個小項目的具體情況和主要功能,下麵進入編碼階段。 在eclipse中新建java項目,項目的結構如下: 資料庫的設計 該項目簡單,只涉及到了兩種表,且沒有涉及到關聯查詢,就只是對單表進行操作。 ...


原創不易,轉載請標明出處。上一篇《Java實驗--基於Swing的簡單的歌曲信息管理系統(一)》講解瞭如何這個小項目的具體情況和主要功能,下麵進入編碼階段。

  在eclipse中新建java項目,項目的結構如下:

 

  • 資料庫的設計

  該項目簡單,只涉及到了兩種表,且沒有涉及到關聯查詢,就只是對單表進行操作。

  工具:使用的是XMAPP(LZ裝了好久的mysql沒有裝上,各種報錯,然後同學就推薦了這款集成工具)和Navicat。

  步驟:

  1. 啟動XMAPP,然後啟動MySQL。如下圖所示:

      2. 這裡沒有選擇用命令行來創建資料庫,而是直接在可視化工具navicat中新建(若使用,點擊XMAPP中的shell按鈕即可),資料庫名為songmanage,註意選擇編碼為utf8,新建兩張表,一張名為song,一張名為user。具體表的欄位如下:

  user表(主鍵id,用戶名name,密碼password,類型role:1代表用戶、2代表管理員,roderby用來排序自增):

  

  song表(主鍵id,歌曲名name,語言language,類別category,歌手名singer,orderby用來排序自增):

  

  若使用命令行建資料庫:

# 創建資料庫
CREATE DATABASE 資料庫名;
# 創建表
CREATE TABLE 表名(
  列名  數據類型  [NULL | NOT NULL],

  ........
);

  •  實體類(entity包下)設計
  1. 用戶實體類:User.java
package shiyan6.entity;

/**
 * 用戶實體類,其中的role用於分別是普通人員還是管理員
 *
 */
public class User {
    private String id;
    private String name;
    private String password;
    private int role;  // 用戶身份,1表示普通用戶,2表示管理員
    // 無參構造器
    public User() {
        
    }
    /**
     * 有參構造器
     * @param id,使用util包下的Common.getUUID()來產生一個8位的uuid
     * @param name,用戶名
     * @param password,登錄密碼
     */
    public User(String id, String name, String password,int role) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.role = role;
    }
       // 各個屬性的set、get方法 
        ..........
}
View Code

  2. 歌曲實體類:Song.java

package shiyan6.entity;

/**
 * 歌曲實體類
 *
 */
public class Song {
    private String id; // 編號
    private String name; // 歌曲名
    private String language; // 語言
    private String category; // 類別
    private String singer;  // 歌手名
    /**
     * 有參構造函數
     * @param name
     * @param language
     * @param category
     * @param singer
     */
    public Song(String id, String name, String language, String category, String singer) {
        this.id = id;
        this.name = name;
        this.language = language;
        this.category = category;
        this.singer = singer;
    }
    /**
     * 無參構造函數
     */
    public Song() {
    }
        // 各屬性的get、set方法
        .............
}
View Code
  •  jdbc.properties文件類容(資料庫配置信息)
# 資料庫的用戶名
jdbc.username=root
# 資料庫的密碼
jdbc.password=
# 資料庫驅動
jdbc.driver=com.mysql.jdbc.Driver
# url
jdbc.url=jdbc:mysql://127.0.0.1:3306/songmanage?characterEncoding=utf8
  • JdbcUtil.java(獲取數據連接,util包下)

  這裡需要註意的獲取資料庫配置文件時,路徑的問題。

 

InputStream inStream = JdbcUtil.class.getResourceAsStream("/shiyan6/jdbc.properties");
Properties prop = new Properties();
prop.load(inStream);

該文件完整代碼:

package shiyan6.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

/**
 * 資料庫幫助類,主要用於獲取資料庫連接
 *
 */
public class JdbcUtil {
    // 表示定義資料庫的用戶名
    private static String USERNAME;

    // 定義資料庫的密碼
    private static String PASSWORD;

    // 定義資料庫的驅動信息
    private static String DRIVER;

    // 定義訪問資料庫的地址
    private static String URL;

    // 定義資料庫的連接
    private static Connection connection;

    /**
     * 靜態載入資料庫配置信息,並給相關的屬性賦值
     */
    static {
        try {
            InputStream inStream = JdbcUtil.class.getResourceAsStream("/shiyan6/jdbc.properties");
            Properties prop = new Properties();
            prop.load(inStream);
            USERNAME = prop.getProperty("jdbc.username");
            PASSWORD = prop.getProperty("jdbc.password");
            DRIVER = prop.getProperty("jdbc.driver");
            URL = prop.getProperty("jdbc.url");
        } catch (Exception e) {
            throw new RuntimeException("讀取資料庫配置文件異常!", e);
        }
    }
    /**
     * 獲取連接
     * @return
     */
    public static Connection getConn() {
        try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
View Code

使用JUnit生成一個測試類,JdbcUtilTest.java,在mysql啟動的狀態下,看看能否獲取到鏈接。

package shiyan6.test;

import java.sql.Connection;

import org.junit.Assert;
import org.junit.Test;

import shiyan6.util.JdbcUtil;

public class JdbcUtilTest {

    @Test
    public void testGetConn() {
        Connection connection = JdbcUtil.getConn();
        Assert.assertNotNull(connection);
        System.out.println(connection);
    }

}
View Code

看到如下效果,則說明測試通過,同時控制台列印消息。

  • Dao層,對資料庫的操作

   涉及到的sql語句:

  查找:SELECT 列名, .... FROM 表名, ....  [WHERE 條件] [UNION .....] [GROUP BY .....]

     [HAVING ....] [ORDER BY 排序條件]; 

  插入:INSERT INTO 表名 [(列名, .......)] VALUES(值, ......);

  更新:UPDATE 表名 SET 需修改的列=值 [WHERE .....];

  刪除:DELETE FROM 表名 [WHERE ......];

  1.  對用戶的操作

         userDao介面

package shiyan6.dao;

import java.util.List;

import shiyan6.entity.User;

/**
 * UserDao 介面
 * @author Changsheng
 *
 */
public interface UserDao {
    /**
     * 查詢所有普通用戶信息
     * @return
     */
    List<User> findAll(); 
    /**
     * 通過用戶名查看用戶是否存在
     * @param name
     * @return
     */
    int findCountByName(String name);
    /**
     * 通過用戶名查看用戶
     * @param name
     * @return
     */
    List<User> findByName(String name);
    /**
     * 通過用戶id查詢信息
     * @param id
     * @return
     */
    User findById(String id);
    /**
     * 通過登錄名和密碼查詢用戶
     * @param name
     * @param password
     * @return
     */
    User findByNameAndPass(String name, String password);
    /**
     * 添加用戶
     * @param user
     * @return
     */
    boolean addUser(User user);
    /**
     * 修改用戶信息
     * @param user
     * @return
     */
    boolean editUser(User user);
    /**
     * 刪除用戶
     * @param id
     * @return
     */
    boolean deleteUser(String id);
}
View Code

  userDaoImpl介面實現類

package shiyan6.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import shiyan6.entity.User;
import shiyan6.util.JdbcUtil;

/**
 * UserDao的實現類
 *
 */
public class UserDaoImpl implements UserDao {
    // 獲取資料庫連接
    private Connection connection = null;
    // prestatement用來執行動態sql語句,比statement要好
    private PreparedStatement pst = null;
    // ResultSet 用來存放結果
    private ResultSet rs = null;

    @Override
    public List<User> findAll() {
        // sql語句
        String sql = "SELECT * FROM user WHERE role = 1 ORDER BY orderby";
        // 用來存儲結果
        List<User> users = new ArrayList<>();
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            rs = pst.executeQuery(); // 執行sql
            // 把查詢到信息給封裝到User實體類中,再放到list中
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getString("id"));
                user.setName(rs.getString("name"));
                user.setPassword(rs.getString("password"));
                user.setRole(rs.getInt("role"));
                users.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉連接
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return users;
    }

    public int findCountByName(String name) {
        int count = 0;
        // sql語句,?號相當於占位符
        String sql = "SELECT COUNT(*) as count FROM user WHERE name = ?";
        // 存放結果
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            pst.setString(1, name); // 填充參數
            rs = pst.executeQuery();
            if (rs.next()) {
                count = rs.getInt("count");
                System.out.println("count" + count);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉連接
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return count;
    }

    @Override
    public User findById(String id) {
        // sql語句,?號相當於占位符
        String sql = "SELECT * FROM user WHERE id = ?";
        // 存放結果
        User user = null;
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            pst.setString(1, id); // 填充參數
            rs = pst.executeQuery();
            if (rs.next()) {
                // 初始化User對象
                user = new User();
                user.setId(rs.getString("id"));
                user.setName(rs.getString("name"));
                user.setPassword(rs.getString("password"));
                user.setRole(rs.getInt("role"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉連接
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return user;
    }

    @Override
    public User findByNameAndPass(String name, String password) {
        // sql語句,?號相當於占位符
        String sql = "SELECT * FROM user WHERE name = ? AND password = ?";
        // 存放結果
        User user = null;
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            pst.setString(1, name); // 填充參數
            pst.setString(2, password);
            rs = pst.executeQuery();
            if (rs.next()) {
                // 初始化User對象
                user = new User();
                user.setId(rs.getString("id"));
                user.setName(rs.getString("name"));
                user.setPassword(rs.getString("password"));
                user.setRole(rs.getInt("role"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉連接
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return user;
    }

    @Override
    public boolean addUser(User user) {
        // sql語句,?號相當於占位符
        String sql = "INSERT INTO user(id, name, password, role) VALUES(?,?,?,?)";
        // 是否成功
        boolean flag = false;
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            pst.setString(1, user.getId()); // 填充參數
            pst.setString(2, user.getName());
            pst.setString(3, user.getPassword());
            pst.setInt(4, user.getRole());
            if (pst.executeUpdate() == 1) {
                flag = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉連接
            try {
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return flag;
    }

    @Override
    public boolean editUser(User user) {
        // sql語句,?號相當於占位符
        String sql = "UPDATE user SET name=?, password=?, role=? " + "WHERE id=? ";
        // 是否成功
        boolean flag = false;
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            pst.setString(1, user.getName());
            pst.setString(2, user.getPassword());
            pst.setInt(3, user.getRole());
            pst.setString(4, user.getId()); // 填充參數
            if (pst.executeUpdate() == 1) {
                flag = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉連接
            try {
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return flag;
    }

    @Override
    public boolean deleteUser(String id) {
        // sql語句,?號相當於占位符
        String sql = "DELETE FROM user WHERE id=?";
        // 是否成功
        boolean flag = false;
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            pst.setString(1, id);
            if (pst.executeUpdate() == 1) {
                flag = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉連接
            try {
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return flag;
    }

    @Override
    public List<User> findByName(String name) {
        // sql語句
        String sql = "SELECT * FROM user WHERE role = 1 AND name LIKE concat('%',?,'%') ORDER BY orderby";
        // 用來存放結果
        List<User> users = new ArrayList<>();
        try {
            connection = JdbcUtil.getConn();

            pst = connection.prepareStatement(sql);
            // 添加參數的值
            pst.setString(1, name);
            rs = pst.executeQuery();
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getString("id"));
                user.setName(rs.getString("name"));
                user.setPassword(rs.getString("password"));
                user.setRole(rs.getInt("role"));
                users.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return users;
    }
}
View Code

 

  2. 對歌曲的操作

   SongDao 介面

package shiyan6.dao;

import java.util.List;

import shiyan6.entity.Song;

/**
 * 對歌曲信息進行 
 *
 */
public interface SongDao {
    /**
     * 顯示所有歌曲
     * @return
     */
    List<Song> findAll();
    /**
     * 通過id查找信息
     * @return
     */
    Song findById(String id);
    /**
     * 按條件歌曲名查詢歌曲
     * @param condition
     * @return
     */
    List<Song> findByName(String name);
    /**
     * 按語言查詢歌曲
     * @param language
     * @return
     */
    List<Song> findBylanguage(String language);
    /**
     * 根據歌手來查詢歌曲
     * @param singer
     * @return
     */
    List<Song> findBySinger(String singer);
    /**
     * 格局歌曲類別來查詢歌曲
     * @param category
     * @return
     */
    List<Song> findByCategory(String category);
    
    /**
     * 刪除歌曲
     * @param id
     * @return
     */
    boolean deletSong(String id);
    /**
     * 添加歌曲
     * @param song
     * @return
     */
    boolean addSong(Song song);
    /**
     * 修改歌曲
     * @param song
     * @return
     */
    boolean updateSong(Song song);
}
View Code

  SongDaoImpl實現類

package shiyan6.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import shiyan6.entity.Song;
import shiyan6.util.JdbcUtil;

public class SongDaoImpl implements SongDao {
    // 獲取資料庫連接
    private Connection connection = null;
    // prestatement用來執行動態sql語句,比statement要好
    private PreparedStatement pst = null;
    // ResultSet 用來存放結果
    private ResultSet rs = null;

    @Override
    public List<Song> findAll() {
        // sql語句
        String sql = "SELECT * FROM song ORDER BY orderby";
        // 用來存放結果
        List<Song> songs = new ArrayList<>();
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            rs = pst.executeQuery();
            while (rs.next()) {
                Song song = new Song();
                song.setId(rs.getString("id"));
                song.setName(rs.getString("name"));
                song.setLanguage(rs.getString("language"));
                song.setCategory(rs.getString("category"));
                song.setSinger(rs.getString("singer"));
                songs.add(song);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return songs;
    }

    public Song findById(String id) {
        // sql語句
        String sql = "SELECT * FROM song WHERE id = ? ORDER BY orderby";
        // 用來存放結果
        try {
            connection = JdbcUtil.getConn();

            pst = connection.prepareStatement(sql);
            // 添加參數的值
            pst.setString(1, id);
            rs = pst.executeQuery();
            if (rs.next()) {
                Song song = new Song();
                song.setId(rs.getString("id"));
                song.setName(rs.getString("name"));
                song.setLanguage(rs.getString("language"));
                song.setCategory(rs.getString("category"));
                song.setSinger(rs.getString("singer"));
                return song;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return null;
    }

    @Override
    public List<Song> findByName(String name) {
        // sql語句
        String sql = "SELECT * FROM song WHERE name LIKE concat('%',?,'%') ORDER BY orderby";
        // 用來存放結果
        List<Song> songs = new ArrayList<>();
        try {
            connection = JdbcUtil.getConn();

            pst = connection.prepareStatement(sql);
            // 添加參數的值
            pst.setString(1, name);
            rs = pst.executeQuery();
            while (rs.next()) {
                Song song = new Song();
                song.setId(rs.getString("id"));
                song.setName(rs.getString("name"));
                song.setLanguage(rs.getString("language"));
                song.setCategory(rs.getString("category"));
                song.setSinger(rs.getString("singer"));
                songs.add(song);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return songs;
    }

    @Override
    public List<Song> findBylanguage(String language) {
        // sql語句
        String sql = "SELECT * FROM song WHERE language LIKE concat('%',?,'%') ORDER BY orderby";
        // 用來存放結果
        List<Song> songs = new ArrayList<>();
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            // 添加參數的值
            pst.setString(1, language);
            rs = pst.executeQuery();
            while (rs.next()) {
                Song song = new Song();
                song.setId(rs.getString("id"));
                song.setName(rs.getString("name"));
                song.setLanguage(rs.getString("language"));
                song.setCategory(rs.getString("category"));
                song.setSinger(rs.getString("singer"));
                songs.add(song);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return songs;
    }

    @Override
    public List<Song> findBySinger(String singer) {
        // sql語句
        String sql = "SELECT * FROM song WHERE singer LIKE concat('%',?,'%') ORDER BY orderby";
        // 用來存放結果
        List<Song> songs = new ArrayList<>();
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            // 添加參數的值
            pst.setString(1, singer);
            rs = pst.executeQuery();
            while (rs.next()) {
                Song song = new Song();
                song.setId(rs.getString("id"));
                song.setName(rs.getString("name"));
                song.setLanguage(rs.getString("language"));
                song.setCategory(rs.getString("category"));
                song.setSinger(rs.getString("singer"));
                songs.add(song);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                pst.close();
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return songs;
    }

    @Override
    public List<Song> findByCategory(String category) {
        // sql語句
        String sql = "SELECT * FROM song WHERE category LIKE concat('%',?,'%') ORDER BY orderby";
        // 用來存放結果
        List<Song> songs = new ArrayList<>();
        try {
            connection = JdbcUtil.getConn();
            pst = connection.prepareStatement(sql);
            // 添加參數的值
            pst.setString(1, category);
            rs = pst.executeQuery();
            while (rs.next()) {
                Song song = new Song();
   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 回顧 1、set集合的特點:去重,無序,可嵌套。2、函數:def,參數,名字,函數體,返回值。3、如果是定義函數,則函數體是不會執行的,只有在調用的時候才會執行。 參數的種類 a、普通參數:嚴格按照順序,將實際參數複製給形式參數。 b、預設參數:一定要放在參數列的最後(即普通參數後面)。 註意: 給 ...
  • 編程方法類型 1、面向對象:以類為主要思路,定義的關鍵字class 2、面向過程:以過程為主的思路,定義的關鍵字為def 3、函數式編程:(最早)以函數為主要思路,定義的關鍵字為def 註意:過程和函數的區別就是:過程沒有return 函數式編程的優勢 1、減少代碼的重覆使用: 2、方便代碼的可擴展 ...
  • 操作文件時,一般需要經歷如下步驟: 打開文件操作文件 一、打開文件: 註:python中打開文件有兩種方式,即:open(...) 和 file(...) ,本質上前者在內部會調用後者來進行文件操作,推薦使用 open。 打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄, ...
  • 1、引用數據類型 格式:數據類型 變數名 = new 數據類型(); 每個引用類型都有自己的功能,如何使用功能? 格式:變數.方法名,如sc.nextInt(); 接收鍵盤輸入,保證輸入的是整數,否則Exception(異常) Scanner的另外一個功能 next() 接收鍵盤輸入的字元串 ①Sc ...
  • 最近在網上找到一個逆向分析挑戰的網站,http://flare-on.com/。在這裡可以下載到該網站出的一系列的逆向分析的題目,我下載了2017年的練習,總共12道題目。最近想把這些題目的結題過程寫下來,當做一些積累吧。 第一道題目是一個網頁題目,開始就給了一個login.html文件 用文本編輯 ...
  • code: RX: 解決辦法: 將第十一行的代碼改為: ...
  • 由於工作需要。記錄了使用方法。理論等在後續補充。 本人對於selenium的理解:作為python的一個第三方庫,用於Web自動化處理的工具。 一、selenium元素定位 Selenium提供了8種定位方式。 id name class name tag name link text partia ...
  • 數據類型的種類 常用的:1、數字2、字元串3、列表4、元祖5、集合 不常用的:隊列有序字典預設字典 集合的特點 1、無序 2、去重(重要) 3、可嵌套 4、關係測試(重要) 創建集合 一、創建集合的註意事項: 1、無序,不重覆的序列 2、用“{}”來代替,裡面每個元素就是一個值,跟字典的區別就是無需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...