day01-項目介紹+SSM環境搭建

来源:https://www.cnblogs.com/liyuelian/archive/2023/03/04/17179551.html
-Advertisement-
Play Games

項目介紹+SSM環境搭建 1.項目功能/界面 SSM整合項目界面:使用Vue完成 技術棧:前後端分離開發,前端框架Vue3+後端框架SSM 前端框架-Vue3 後端框架-SSM(SpringMVC+Spring+MyBatis) 資料庫-MySQL 項目依賴管理-Maven 分頁-pagehelpe ...


項目介紹+SSM環境搭建

1.項目功能/界面

  • SSM整合項目界面:使用Vue完成
  • 技術棧:前後端分離開發,前端框架Vue3+後端框架SSM
    1. 前端框架-Vue3
    2. 後端框架-SSM(SpringMVC+Spring+MyBatis)
    3. 資料庫-MySQL
    4. 項目依賴管理-Maven
    5. 分頁-pagehelper
    6. 逆向工程-MyBatis Generator
    7. 其他...

2.項目基礎環境搭建

2.1創建項目

(1)創建maven項目(註意配置maven的倉庫鏡像,不然創建的時候會很慢),File--New--Project--Maven

image-20230304172237626 image-20230304172539061 image-20230304172819654 image-20230304173104025

(2)手動創建java和test相關目錄

image-20230304173352899

(3)pom.xml文件中引入項目基本的jar包

<!--部分-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!--引入SpringMVC,也會自動導入spring的庫-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.8</version>
    </dependency>

    <!--引入spring-jdbc,支持事務相關-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.8</version>
    </dependency>

    <!--引入spring aspect-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.3.8</version>
    </dependency>

    <!--引入mybatis庫-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
    </dependency>

    <!--引入druid資料庫連接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.6</version>
    </dependency>

    <!--mysql的驅動-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.49</version>
    </dependency>
  </dependencies>

(4)給項目配置Tomcat

image-20230304174635512 image-20230304174646954

(5)啟動tomcat,測試成功

image-20230304174914717

2.2項目全局配置web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>

    <display-name>Archetype Created Web Application</display-name>
    <!--(1)配置啟動Spring容器:主要配置和業務邏輯相關的,比如數據源,事務控制等-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!--指定文件位置-->
        <param-value>classpath:applictionContext.xml</param-value>
    </context-param>

    <!--(2)ContextLoaderListener 監聽器,它的作用:
          1.當啟動web容器時,自動裝配 applictionContext的配置信息
          2.它實現了ServletContextListener 介面,
          啟動容器時,ContextLoaderListener自動會讀取名為“contextConfigLocation”的參數配置
          -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--(3)配置SpringMVC的前端控制器,攔截所有的請求
        因為這裡沒有指定SpringMVC的配置文件,這裡就會按照servlet-name-servlet.xml的方式來獲取
    -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--3.1如果我們沒有配置contextConfigLocation,
        就預設按照預設機制/WEB-INF/springDispatcherServlet-servlet.xml去找-->
        <!--3.2在web項目啟動時,就自動地載入DispatcherServlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--(4)配置spring提供的字元編碼過濾器,解決中文編碼問題-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <!--過濾器會執行request.setCharacterEncoding(encoding)-->
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <!--過濾器會執行response.setCharacterEncoding(encoding)-->
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--(5)配置HiddenHttpMethodFilter,使用rest風格的url,
           作用是把以post請求提交的delete和put請求進行轉換-->
    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

如果web.xml的<web-app>報紅,選擇只是高亮syntax即可,本身是沒有問題的,只是DTD本身的約束

image-20230304184136178

2.3SpringMVC配置

WEB-INF 目錄下創建SpringMVC的配置文件 springDispatcherServlet-servlet.xml

文件的命名要根據上面web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--(1)配置自動掃描com.li.furn包-->
    <context:component-scan base-package="com.li.furn">
        <!--springmvc只掃描Controller-->
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--(2)配置預設視圖解析器,指定頁面返回-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置屬性 suffix(尾碼) 和 prefix(首碼)-->
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".html"/>
        <property name="order" value="10"/>
    </bean>

    <!--(3)加入兩個常規配置-->
    <!--支持SpringMVC的高級功能,比如:JSR303校驗,映射動態請求-->
    <mvc:annotation-driven/>
    <!--將SpringMVC不能處理的請求,交給tomcat處理,比如css,js-->
    <mvc:default-servlet-handler/>
</beans>

2.4配置Spring和MyBatis,並完成整合

(1)在resource目錄下創建jdbc.properties,配置連接mysql的信息

# The key value is arbitrary
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/furn_ssm?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8
jdbc.user=root
jdbc.pwd=123456

(2)在pom.xml文件引入mybatis整合spring的適配包

<!--引入mybatis整合spring的適配包-->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.6</version>
</dependency>

(3)在resource目錄下創建 Spring 的配置文件 applicationContext.xml

右鍵-->New-->XML Configuration-->Spring Config

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--spring的配置文件:主要配置和業務邏輯有關的,比如數據源,事務控制等-->

    <!--(1)配置掃描com.li.furn包(控制器除外,它由springmvc管理)-->
    <context:component-scan base-package="com.li.furn">
        <!--排除掃描 @Controller註解-->
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--(2)配置數據源-->
    <!--2.1引入外部的屬性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--2.2配置數據源對象-DataSource-->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="pooledDataSource">
        <!--給數據源對象配置屬性值-->
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.pwd}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
    </bean>

    <!--!!(3)配置spring和mybatis的整合
        3.1在項目中要引入mybatis整合到spring的適配庫 mybatis-spring-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <!--指定mybatis的全局配置文件mybatis-config.xml-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--指定數據源-->
        <property name="dataSource" ref="pooledDataSource"/>
        <!--指定mybatis的 mapper.xml文件的位置
            我們在開發中通常把 mapper.xml放在類路徑下 resource/mapper
            所以這裡指定的value是 classpath:mapper/*.xml-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!--(4)配置掃描器,將mybatis介面的實現加入到ioc容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--掃描所有的dao介面的實現,將入到ioc容器中,這裡的dao介面就是mapper介面
        (mapper介面放在com.li.furn.dao下,因為mybatis處於DAO層,用於操作資料庫)-->
        <property name="basePackage" value="com.li.furn.dao"/>
    </bean>

    <!--(5)配置事務管理器對象-->
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
          id="transactionManager">
        <property name="dataSource" ref="pooledDataSource"/>
    </bean>

    <!--(6)配置開啟基於註解的事務(這裡使用xml+切入表達式),並指定切入點-->
    <!--6.1指定事務規則,即指定事務如何切入-->
    <tx:advice id="txAdvice">
        <tx:attributes>
            <!--*代表所有方法都是事務方法-->
            <tx:method name="*"/>
            <!--以get開頭的所有方法,我們認為是只讀的,進行調優-->
            <tx:method name="get*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <!--6.2配置切入表表達式,引用上面的事務規則,即在匹配切入表達的方法中使用上述的事務規則-->
    <aop:config>
        <!--切入表達式-->
        <aop:pointcut id="txPoint" expression="execution(* com.li.furn.service..*(..))"/>
        <!--配置事務規則,使用上面的txAdvice,指定規則對txPoint進行切入-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
    </aop:config>

</beans>

(4)在resource目錄下創建mapper目錄,存放xxxMapper.xml文件

(5)在resource目錄下創建mybatis的配置文件 mybatis-config.xml(原因和上面一致,因為在spring配置文件中指定了路徑)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--暫時為空-->
</configuration>

2.5創建表,使用逆向工程生成Bean、XxMapper和XxMapper.xml

(1)創建資料庫和表

-- 創建資料庫
CREATE DATABASE furn_ssm;
USE furn_ssm;
-- 創建家居表
CREATE TABLE furn(
`id` INT(11) PRIMARY KEY AUTO_INCREMENT, #id
`name` VARCHAR(64) NOT NULL, #家居名
`maker` VARCHAR(64) NOT NULL, #廠商
`price` DECIMAL(11,2) NOT NULL, #價格
`sales` INT(11) NOT NULL, #銷量
`stock` INT(11) NOT NULL, #庫存
`img_path` VARCHAR(256) NOT NULL #照片路徑
);
-- 初始化家居數據
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) 
VALUES(NULL , '北歐風格小桌子' , '熊貓家居' , 180 , 666 , 7 , 'assets/images/product-image/6.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) 
VALUES(NULL , '簡約風格小椅子' , '熊貓家居' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) 
VALUES(NULL , '典雅風格小臺燈' , '螞蟻家居' , 180 , 666 , 7 , 'assets/images/product-image/14.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) 
VALUES(NULL , '溫馨風格盆景架' , '螞蟻家居' , 180 , 666 , 7 , 'assets/images/product-image/16.jpg');

SELECT * FROM furn;
image-20230304222051514

(2)使用MyBatis Generator 逆向生成bean mapper介面和mapper.xml

如果逆向工程生成的代碼不能滿足需求,再自己編寫

2.1)修改Mybatis-config.xml,增加typeAliases別名配置,配置日誌輸出

<configuration>
    <!--配置mybatis自帶的日誌輸出,查看原生的sql-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases>
        <!--直接引入包,包下麵的所有類名都可以作為別名使用-->
        <package name="com.li.furn.bean"/>
    </typeAliases>
</configuration>

2.2)在pom.xml引入MyBatis Generator包

<!--引入mybatis逆向工程的依賴包-->
<dependency>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-core</artifactId>
  <version>1.4.0</version>
</dependency>

2.3)在項目目錄下創建mbg.xml(mybatis generator),並參考文檔進行配置

文檔和模板:MyBatis Generator Core – MyBatis Generator XML Configuration File Reference

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="DB2Tables" targetRuntime="MyBatis3">

        <!--生成沒有註釋的 bean-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--配置資料庫連接信息,按照你的實際情況配置-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/furn_ssm?characterEncoding=utf8"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--指定Javabean生成的位置
        targetPackage 是包名,targetProject是包所在的路徑-->
        <javaModelGenerator targetPackage="com.li.furn.bean" 
                            targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!--指定sql映射文件(xml文件)生成的位置-->
        <sqlMapGenerator targetPackage="mapper"  targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!--指定dao介面生成的位置,也就是mapper介面-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.li.furn.dao" 
                             targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!--指定要逆向生成的表和生成策略
        tableName是資料庫的表名,domainObjectName是生成的Javabean的類名-->
        <table tableName="furn" domainObjectName="Furn"/>
    </context>
</generatorConfiguration>

2.4)在test目錄下創建一個MBGTest.java,該文件可以生成相關bean、mapper介面和mapper.xml

文件模板:MyBatis Generator Core – Running MyBatis Generator With Java

package com.li.furn.test;

import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 李
 * @version 1.0
 */
public class MBGTest {
    @Test
    public void generator() throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        //這裡根據自己的情況指定配置的 mbg.xml文件
        //如果下麵這樣訪問,需要將文件放在項目目錄下
        File configFile = new File("mbg.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = 
            new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

運行上述方法後,可以看到成功生成了指定的文件:這樣我們就可以直接使用逆向工程成功的方法操作資料庫,而不必在介面和映射文件來回編寫代碼。

image-20230304230157966

(3)使用Junit測試Spring和MyBatis是否整合成功,能否通過MyBatis添加furn到資料庫

3.1)修改bean:Furn.java,分別添加全參和無參構造器(略)

3.2)在test目錄下增加測試文件,測試逆向工程生成的方法是否可用。

@Test
public void insertSelective() {
    //初始化spring容器
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("applicationContext.xml");
    //獲取到 FurnMapper的代理對象(類型=class com.sun.proxy.$Proxy17)
    FurnMapper furnMapper = ioc.getBean(FurnMapper.class);
    //添加數據
    Furn furn = new Furn(null, "小電燈", "一等家居",
            new BigDecimal(66), 123, 45,
            "/assets/images/product-image/1.jpg");
    int affected = furnMapper.insertSelective(furn);
    System.out.println("操作影響行數=" + affected + ",操作成功!");
}

測試成功:

image-20230304234527249

2.6註意事項和細節說明

關於逆向生成的方法中,insertSelective() 和 insert() 方法的區別:

  1. insertSelective-選擇性保存數據

比如User中有三個欄位:id,name,age,但是在插入數據時只設置了name欄位:

User u = new User();
u.setName("張三")
insertSelective(u);

它在底層發出的sql語句為:insert into db_user (id,name) value (null,"張三");,也就是說生成的sql的欄位是有選擇性的,會根據你設置的值來生成(ps:這裡的id是自增長的)

  1. insert 則是無論設置多少個欄位,統一都要添加一遍,即使是一個。如:
User u = new User();
u.setName("張三")
insert(u);

底層生成的sql語句為:insert into db_user (id,name,age) value (null,'張三',null,null)

因此在使用insert方法時要註意,如果表的欄位不允許為null,調用方法時又沒有設置值,就會出錯。通常情況下推薦使用 insertSelective() 方法。


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

-Advertisement-
Play Games
更多相關文章
  • 前言 本文展示了一個比較完整的企業項目級別的Makefile文件,包括了:文件調用,源文件、頭文件、庫文件指定,軟體版本號、巨集定義,編譯時間,自動目錄等內容。 1、目錄架構 本文中所採用的目錄架構,在企業項目開發中十分常見:源文件都放在src目錄中,頭文件都放在inc目錄中,並且這兩個目錄都可以有對 ...
  • 1602LCD 是工業上常用的模塊, 在工廠交通運輸設備上經常能見到. 驅動晶元為 HD44780, 1602LCD 的字元顯示為兩行, 每行16個字元, 字元基於5×8的像素矩陣 ...
  • 1、工作應用場景 統計得到每個小時的UV、PV、IP的個數,構建如下表結構: 但是表中數據的存儲格式不利於直接查詢展示,需要進行調整:(以時間分區,去重、聚合等……對結果進行行列轉換) 2、行轉列 (1)多行轉多列 case when函數 功能:用於實現對數據的判斷,根據條件,不同的情況返回不同的結 ...
  • 1、全局排序(Order by) 功能:全局排序,只有1個reducer(用1個Reduce Task完成全局排序,與設置的Reduce Task個數無關) 參數:ASC:升序(預設) DESC:降序 使用:order by放在select語句的結尾 例如: --查詢員工信息按工資降序排列 sele ...
  • 前言 本文是關於使用flutter_download_manager下載功能的實踐和探索。我們將基於flutter_download_manager的功能擴展,改造成自己想要的樣子。在閱讀本文之前,建議先瞭解前兩篇文章: Flutter 下載篇 - 壹 | flutter_download_mana ...
  • 需求背景 繼上篇《Flutter 下載篇 - 壹 | flutter_download_manager 源碼解析》中詳細介紹了 flutter_download_manager 用法和原理。在優缺點中提到,該庫純 Dart 實現,支持下載管理,暫停,恢復,取消和斷點續傳。其中有個缺點是網路庫與 di ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在開發管理後臺過程中,一定會遇到不少了增刪改查頁面,而這些頁面的邏輯大多都是相同的,如獲取列表數據,分頁,篩選功能這些基本功能。而不同的是呈現出來的數據項。還有一些操作按鈕。 對於剛開始只有 1,2 個頁面的時候大多數開發者可能會直 ...
  • 本文檔是從官網文檔中摘錄的一些重點內容,以及加入了自己的一些調整和對官網內容的理解和解釋。適合新手學習,有一定技術水平的寶子,建議直接查看 [NUXT英文官網] ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...