使用vue,mybatis,mysql,tomcat,axios實現簡單的登錄注冊功能

目錄

第一步環境搭建

后端:

前端:

第二步畫流程圖

web:

service:? ? ? ?

dao層:

?第三步前端代碼的實現

這是開始的頁面,接下來我們要到router路由下書寫#login的路徑?

路由中的component在我們自己創建的views書寫vue文件

#/success的success.vue文件

第四步:后端代碼的實現

web層loginServer類

web層registerServlet類

?service的userServiceImpl類

?dao層

第五步測試


我們現在要使用vue,mybatis,mysql實現一個簡單的登錄注冊頁面功能

使用的數據庫:

create table user(id int primary key auto_increment,username varchar(10) not null ,password varchar(20) not null
);
insert into user values (null,'zhangsan','1234'),(null,'hema','134'),(null,'wangu','456');

第一步環境搭建

后端:

在idea創建web工程

創建成功

創建成功后把pom.xml文件中關于junit的依賴全部刪除,我們不需要

接著在pom.xml中導入相關依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.hhh</groupId><artifactId>web4_zhuce</artifactId><version>1.0-SNAPSHOT</version><name>web4_zhuce</name><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.target>11</maven.compiler.target><maven.compiler.source>11</maven.compiler.source></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!-- mysql依賴 --><!--mysql 驅動--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency><!--mybatis依賴--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version></dependency><!--添加slf4j日志api--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.20</version></dependency><!--logback-classic依賴--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!--添加logback_core依賴--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin></plugins></build>
</project>

?接著在resource目錄下創建mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="jdbc.properties"></properties><environments default="development"><!--設置默認的環境development,也可以配置多環境開發--><environment id="development"><transactionManager type="JDBC"/><!--使用mybatis自帶的連接池POOLED--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--配置映射文件關聯的參數--><mappers><!--掃描mapper--><package name="com.hhh.dao"/></mappers>
</configuration>

創建jdbc.properties文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/day10
jdbc.username=root
jdbc.password=123456

創建logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--><property name="LOG_HOME" value="D:/log"/><!-- 控制臺輸出 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!-- 日志輸出編碼 --><Encoding>UTF-8</Encoding><layout class="ch.qos.logback.classic.PatternLayout"><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></layout></appender><!-- 按照每天生成日志文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><Encoding>UTF-8</Encoding><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件輸出的文件名--><FileNamePattern>hhh/mybatisTest.log.%d{yyyy-MM-dd}.log</FileNamePattern><MaxHistory>30</MaxHistory></rollingPolicy><layout class="ch.qos.logback.classic.PatternLayout"><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></layout><!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">222<MaxFileSize>1MB</MaxFileSize></triggeringPolicy></appender><!-- 日志輸出級別 --><root level="ALL"><!-- 注意:如果這里不配置關聯打印位置,該位置將不會記錄日志--><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/></root></configuration>

?

這樣一來我們后端的環境搭建好了,我們可以啟動一下,查看是否報錯

然后我們在java目錄中創建pojo包封裝數據庫表的類

在pojo包下創建出對應的類之后,把id的類型改成Long對象型?

前端:

?在vscode中創建vue工程

在終端命令中書寫

vue init webpack work

生成完成

?

然后在package.json中導入axios依賴

?npm install axios@^0.27.2

注意如果版本太高,npm run dev會報錯

?

 WAIT  Compiling...                                                                                                                                                              下午2:51:4294% asset optimizationERROR  Failed to compile with 2 errors                                                                                                                                          下午2:51:43error  in ./node_modules/axios/lib/platform/index.jsModule parse failed: Unexpected token (5:2)
You may need an appropriate loader to handle this file type.
| 
| export default {
|   ...utils,
|   ...platform
| }@ ./node_modules/axios/lib/defaults/index.js 8:0-44@ ./node_modules/axios/lib/axios.js@ ./node_modules/axios/index.js@ ./src/main.js@ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./src/main.jserror  in ./node_modules/axios/lib/core/mergeConfig.jsModule parse failed: Unexpected token (6:69)
You may need an appropriate loader to handle this file type.
| import AxiosHeaders from "./AxiosHeaders.js";
|
| const headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;
|
| /**@ ./node_modules/axios/lib/axios.js 6:0-48@ ./node_modules/axios/index.js@ ./src/main.js@ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./src/main.js

之后再vue文件中使用axios時,需要在<script></script>?中加上import axios from 'axios';?

把前端的端口號改成8090,不然于tomcat服務器沖突?

這樣一來我們的環境已經搭建完成

第二步畫流程圖

實現登錄功能

?我們會在瀏覽器頁面輸入http://localhost:8090來訪問前端服務器,接著前端服務器使用axios把從瀏覽器接收的數據發送給后端服務器(一次請求和響應),再tomcat服務器中使用三層架構模型(web,service,dao)

web:

  1. ? ? ? ? 解決post請求的中文亂碼問題
  2. ? ? ? ? 接收來自前端提交的請求參數
  3. ? ? ? ? 將請求參數封裝到User實體類-->user
  4. ? ? ? ? 創建業務層對象service對象
  5. ? ? ? ? 使用業務層對象調用業務層的登錄方法(login)-->User u=userService.login(user)
  6. ? ? ? ? 判斷u是否為null
  7. ? ? ? ? 如果u=null,說明沒有查到用戶,登陸失敗,響應給前端一個false
  8. ? ? ? ? 如果u不為null,說明查到用戶,登錄成功,響應true

service:
? ? ? ?

  1. ????????定義登錄方法接收web傳遞的user對象,并返回給web層一個新的對象
  2. ? ? ? ? 在登錄方法中根據MybatisUtil工具類獲取mybatis會話對象
  3. ? ? ? ? 使用會話對象調用方法獲取dao層的接口代理對象
  4. ? ? ? ? 使用接口代理對象調用接口的登錄方法(會返回一個User對象),user作為參數傳遞
  5. ? ? ? ? 釋放資源
  6. ? ? ? ? 直接返回查詢到的User對象

dao層:

  1. ? ? ? ? 創建接口
  2. ? ? ? ? 在接口中定義登錄方法
  3. ? ? ? ? 在方法上使用注解查詢數據

? ? ? ??

?第三步前端代碼的實現

?

這是開始的頁面,接下來我們要到router路由下書寫#login的路徑?

注意:在路由的路徑不用寫#?

路由中的component在我們自己創建的views書寫vue文件

?

login.vue代碼

<template><div id="app"><!-- v-model與user的username屬性雙向綁定 --><span id="err" style="display: none">用戶名或者密碼錯誤</span><input type="text" name="username" v-model="user.username"> <br>
//使用雙向綁定把表單數據與data中的user的username綁定<input type="password" name="password" v-model="user.password"> <br><button @click="send">登錄</button></div>
</template><script>
//導入axios
import axios from 'axios';
export default {data() {return {user:{username:'',password:''},            };},methods: {send() {   //后端服務器的路徑let url="http://localhost:8080/loginServlet";let params=`username=${this.user.username}&password=${this.user.password}`;
//使用重音符,進行字符串拼接請求參數
//使用axios的post請求,將服務器地址,請求參數axios.post(url, params).then(res => {//console.log(res.data);if(res.data){location.href="#/success"  //跳轉到成功的頁面}else{document.getElementById("err").style.display="block";document.getElementById("err").style.color="red";}});//    .catch(error => {//        console.error(error);//    });}}}
</script><style></style>

?

啟動前端項目

?可以發現username的數據已經與表單數據關聯,注意username是data中的username

?點擊登錄,并查看抓包

注意:抓包的username是?let params=`username=${this.user.username}&password=${this.user.password}`;

axios的請求參數左邊的usernmae?

后端使用request接收前端的數據就要使用username來獲取?

#/success的success.vue文件

?

?#/register的register.vue文件

<template><div id="app"><!-- v-model與user的username屬性雙向綁定 --><span id="err" style="display:none">該用已經存在,注冊失敗</span><span id="su" style="display:none">注冊成功</span><input type="text" name="username" v-model="user.username"> <br><input type="password" name="password" v-model="user.password"> <br><button @click="send">注冊</button></div>
</template><script>
import axios from 'axios';
export default {data() {return {user:{username:'',password:''},            };},methods: {send() {   //在config-index.js中已經配置了服務器的三要素let url="http://localhost:8080/registerServlet";let params=`username=${this.user.username}&password=${this.user.password}`;axios.post(url, params).then(res => {if(res.data){document.getElementById("su").style.display="block";document.getElementById("su").style.color="green";//location.href="#/success";}else{document.getElementById("err").style.display="block";document.getElementById("err").style.color="red";}}).catch(error => {console.error(error);});}}}
</script><style></style>

第四步:后端代碼的實現

先實現? ? ?//后端服務器的路徑
? ? ? ? ? ? ? ? let url="http://localhost:8080/loginServlet";

web層loginServer類

@WebServlet("/loginServlet")//要與前端的axios路徑一致
public class loginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解決中文亂碼問題request.setCharacterEncoding("utf-8");//接收前端提交的請求參數String username = request.getParameter("username");String password = request.getParameter("password");//封裝成對象User user = new User();user.setUsername(username);user.setPassword(password);//創建業務層service層對象UserServiceImpl userService=new  UserServiceImpl();//使用業務層對象調用業務層的登錄方法User u=userService.login(user);//判斷u是否為空if(u==null) {response.addHeader(  "Access-Control-Allow-Origin","*");//允許所有來源訪同response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允許訪問的方式//u為null,說明沒有查到用戶,登陸失敗,響應給前端一個falseresponse.getWriter().print(false);} else{response.addHeader(  "Access-Control-Allow-Origin","*");//允許所有來源訪同response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允許訪問的方式//n不為null,說明存在用戶,登錄成功,響應一個trueresponse.getWriter().print(true);//會被axios的res對象的data接收}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

?? response.addHeader( ?"Access-Control-Allow-Origin","*");//允許所有來源訪同
? ? ? ? ? ? response.addHeader( ?"Access-Control-Allow-Method","POST,GET");//允許訪問的方式

這兩行十分重要,不然會報錯:

Access to XMLHttpRequest at ‘http://localhost:8080/xxx’ from origin ‘http://localhost:63342’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

web層registerServlet類

@WebServlet("/registerServlet")
public class registerServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//處理中文請求亂碼問題request.setCharacterEncoding("utf-8");//接收參數String password = request.getParameter("password");String username = request.getParameter("username");//封裝成對象User user = new User();user.setUsername(username);user.setPassword(password);//創建業務層對象UserServiceImpl userService = new UserServiceImpl();//調用業務層對象的注冊方法boolean result=userService.register(user);//判斷結果對錯if(result){response.addHeader(  "Access-Control-Allow-Origin","*");//允許所有來源訪同response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允許訪問的方式response.getWriter().print(true);}else{response.addHeader(  "Access-Control-Allow-Origin","*");//允許所有來源訪同response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允許訪問的方式response.getWriter().print(false);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

?

?service的userServiceImpl類

public class UserServiceImpl {//定義登錄方法public User login(User user) {//獲取MybatisUtil工具類SqlSession sqlSession = MybatisUtil.openSession();//使用會話對象調用方法獲取dao層的接口代理對象UserMapper mapper=sqlSession.getMapper(UserMapper.class);//使用接口代理對象調用方法User u=mapper.login(user);//釋放資源MybatisUtil.closeSqlSession(sqlSession);//直接返回User對象return u;}public boolean register(User user) {SqlSession sqlSession=null;try {//獲取MybatisUtil工具類sqlSession = MybatisUtil.openSession();//使用會話對象調用方法或缺dao層的代理對象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//使用接口代理對象調用方法User u=userMapper.queryUserByUserName(user.getUsername());//返回結果if(u==null) {//沒有改用戶,可以注冊userMapper.register(user);//提交事務sqlSession.commit();//返回結果return true;}else{return false;}} finally {//防止空指針重復釋放if(sqlSession!=null){//釋放資源MybatisUtil.closeSqlSession(sqlSession);}}}
}

?dao層

//創建接口
public interface UserMapper {//在接口中定義登錄方法//在方法使用注解/*username=#{username}左邊的是數據庫的字段名右邊是User類的成員變量*/@Select("select * from user where username=#{username} and password=#{password}")User login(User user);@Insert("insert into user(username, password) values (#{username},#{password});")int register(User user);/*關于mybatis入參:1.如果方法只有一個非pojo Map類型參數,mybatis底層沒有處理,我們在#{}中的獲取數據可以隨便寫,所以建議使用注解@Param("標識符")修飾參數,那么此時#{}的大括號只能書寫@Param("標識符")的標識符*/@Select("select * from user where username=#{username}")User queryUserByUserName(@Param("username") String username);
}

第五步測試

?注冊功能

登錄:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15904.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單日收益1000+看了就會的項目,最新靈異短視頻項目,簡單好上手可放大操作

各位好友&#xff0c;佳哥在此與大伙兒聊聊一項神秘莫測的短視頻項目。你或許會想&#xff0c;“又是一個視頻創作項目&#xff1f;” 但別急&#xff0c;這個項目與眾不同&#xff0c;日入千元不再是夢&#xff0c;而且它的易用性讓人驚喜&#xff0c;無論你是初學者還是資深玩…

春秋云境CVE-2018-7422

簡介 WordPress Plugin Site Editor LFI 正文 1.進入靶場 2.漏洞利用 /wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path/../../../../../../flag看別人wp做的。不懂怎么弄的&#xff0c;有沒有大佬講一下的

沒有電商經驗的人去操作抖音小店,難度大不大?好操作嗎?

大家好&#xff0c;我是電商小V 很多新手小伙伴想去操作抖音小店項目&#xff0c;咨詢的最多的問題就是我沒有電商運營的經驗可以去操作嗎&#xff1f; 當然是可以操作的&#xff0c;抖音小店項目對于新手來說是一個非常友好的項目&#xff0c;很多小伙伴都是感覺沒有電商經驗去…

數據庫攻防之MySQL

MySQL 是最流行的關系型數據庫&#xff0c;與此同時也是 web 應用中最好的關系型數據庫管理應用軟件。我們在滲透過程中碰到的 PHP 站點大部分都會搭配 MySQL 數據庫&#xff0c;因此它是紅隊攻防中最常遇到的數據庫。 0x01 MySQL簡介 MySQL 是典型的關系型數據庫&#xff0c;…

YOLOv10 | 無NMS的YOLO | 實時端到端目標檢測的新突破

過去幾年里&#xff0c;YOLOs因在計算成本和檢測性能之間實現有效平衡而成為實時目標檢測領域的主流范式。研究人員針對YOLOs的結構設計、優化目標、數據增強策略等進行了深入探索&#xff0c;并取得了顯著進展。然而&#xff0c;對非極大值抑制&#xff08;NMS&#xff09;的后…

redis--消息隊列

分類 生產者消費模式 發布者訂閱模式 生產者消費模式 在生產者消費者(Producer/Consumer)模式下&#xff0c;上層應用接收到的外部請求后開始處理其當前步驟的操作&#xff0c;在執行完成后將已經完成的操作發送至指定的頻道(channel)當中&#xff0c;并由其下層的應用監聽…

【Chrono Engine學習總結】6-創建自定義場景-6.2-chrono中的光線設置

由于Chrono的官方教程在一些細節方面解釋的并不清楚&#xff0c;自己做了一些嘗試&#xff0c;做學習總結。 上一篇文章中&#xff0c;自己【用sketchup重建了三維場景】&#xff0c;但導入chrono中顏色很不正確&#xff0c;幾乎都是白色的&#xff0c;但也不是完全白色。經過…

IDE上傳本地倉庫到GitHub

IDE上傳本地倉庫到GitHub 1、選擇遠程倉庫平臺2、下載安裝Git3、IDE集成Git4、本地項目上傳GitHub 1、選擇遠程倉庫平臺 1.1、注冊遠程倉庫平臺 常見的遠程倉庫托管平臺有&#xff1a; 1&#xff09;GitHub 域名&#xff1a;https://github.com 介紹&#xff1a;GitHub是全球最…

Java訂餐系統源碼 springboot點菜系統源碼

Java訂餐系統源碼 springboot點菜系統源碼 源碼下載地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89341358 功能介紹&#xff1a; 前臺登錄&#xff1a;前臺登錄&#xff1a; ①首頁&#xff1a;菜品信息推薦、菜品信息展示、查看更多 ②菜品信息&…

Stanford斯坦福 CS 224R: 深度強化學習 (3)

基于模型的強化學習 強化學習(RL)旨在讓智能體通過與環境互動來學習最優策略,從而最大化累積獎勵。傳統的強化學習方法如Q-learning、策略梯度等,通過大量的試錯來學習值函數或策略,樣本效率較低。而基于模型的強化學習(MBRL)則利用對環境的預測模型來加速學習過程,大大提高了…

參數的本質:詳解 JavaScript 函數的參數

文章導讀&#xff1a;AI 輔助學習前端&#xff0c;包含入門、進階、高級部分前端系列內容&#xff0c;當前是 JavaScript 的部分&#xff0c;瑤琴會持續更新&#xff0c;適合零基礎的朋友&#xff0c;已有前端工作經驗的可以不看&#xff0c;也可以當作基礎知識回顧。 上篇文章…

地理信息系統(GIS)軟件開發

地理信息系統&#xff08;GIS&#xff09;軟件開發是一項復雜且系統性很強的工程&#xff0c;涉及空間數據的采集、管理、分析和展示。以下是一個典型的GIS軟件開發流程&#xff0c;包括各個步驟的詳細說明。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#…

面向對象------多態

1.多態的定義 通俗來說&#xff0c;當同一種行為或者事情發生在不同的對象上&#xff0c;這些行為或者事情最終得到的結果不同。 注意&#xff1a;多態要發生在繼承的基礎上。 例如&#xff1a;彩色打印機和黑白打印機。 彩色打印機和黑白打印機是不同的對象&#xff0c;但…

詳細分析Element中的MessageBox基本知識(附Demo)

目錄 前言1. 基本知識2. Demo2.1 確認框2.2 警告框2.3 對話框 3. this.$confirm 前言 詳細知識推薦閱讀&#xff1a;詳細分析Element Plus中的ElMessageBox彈窗用法&#xff08;附Demo及模版&#xff09; MessageBox則常用于Vue2 1. 基本知識 MessageBox 是 Element UI 提供…

Liunx學習隨筆

Linux學習隨筆 一.前期準備1.安裝Vmware Workstation軟件2.下載linux鏡像3.安裝操作系統 夕陽無限好&#xff0c;只是近黃昏&#xff0c;時隔一年&#xff0c;重新提筆 沒有比腳更遠的路&#xff0c;沒有比人更高的山 一.前期準備 1.安裝Vmware Workstation軟件 下載地址&am…

加載頁面 跳轉 新頁面 vue

通常&#xff0c;我們點頁面上的詳情&#xff0c;或者編輯&#xff0c;需要加載一個新的頁面出來。 vue中加載頁面的方法&#xff1a; 在父頁面中&#xff08;通常是某個模塊目錄下的index.vue&#xff09;&#xff0c;先寫這行代碼&#xff1a; import AddEditForm from ./…

南京觀海微電子----升壓和降壓模塊電路解析

(一)升壓模塊 1. 如果是交流電壓升壓&#xff0c;那非常簡單&#xff0c;只要選擇變比合適的變壓器就行(1:3和1:4.17); 2. 如果是直流電壓升壓&#xff0c;從12v升到36v也很容易&#xff0c;可選擇用的開關穩壓器很多&#xff0c;例如 :Cs5171.Cs5172.Cs5173.Cs5174.Mc33063.…

SQLAlchemy備忘

orm備忘 upsert&#xff0c;存在及更新&#xff0c;不存在則插入 from sqlalchemy.dialects.mysql import insertinsert_stmt insert(FileModule).values(file_pathpar_dict.file, module_keypar_dict.module_key,module_namepar_dict.module_name, project_idpar_dict.proj…

【調和級數】100321. 優質數對的總數 II

本文涉及知識點 調和級數 質數、最大公約數、菲蜀定理 LeetCode100321. 優質數對的總數 II 給你兩個整數數組 nums1 和 nums2&#xff0c;長度分別為 n 和 m。同時給你一個正整數 k。 如果 nums1[i] 可以被 nums2[j] * k 整除&#xff0c;則稱數對 (i, j) 為 優質數對&#…

[Android]在后臺線程執行耗時操作,然后在主線程更新UI

1.Coroutines&#xff08;官方推薦&#xff09; Coroutines 提供了一種輕量級的線程管理方式&#xff0c;使得在后臺線程執行任務和在主線程更新 UI 變得簡單。以下是如何在 Kotlin 中使用 Coroutines 來處理耗時邏輯并更新 UI 的步驟&#xff1a; 添加 Coroutines 依賴: 首…