React Native 項目實戰 —— 記賬本應用開發指南

React Native 項目實戰 —— 記賬本應用開發指南

  • 項目概述:本文將指導您使用 React Native 開發一個簡單的記賬本應用,幫助用戶記錄收入和支出。
  • 核心內容:我們將分析功能模塊、設計接口、劃分組件結構、管理數據流、實現頁面跳轉,并處理跨平臺兼容性。
  • 適用人群:適合初學者和有一定經驗的開發者,需具備 React Native 基礎知識。
  • 技術棧:使用 React Navigation、React Native Paper、Context API 和 AsyncStorage。
項目簡介

記賬本應用是一個實用的移動應用,允許用戶跟蹤個人財務,包括添加交易、查看歷史記錄和分類管理。它是學習 React Native 的理想項目,涵蓋了從 UI 設計到數據管理的多個開發環節。React Native 的跨平臺特性使我們能夠以單一代碼庫構建同時運行在 iOS 和 Android 上的應用。

功能模塊與實現

您將學習如何將應用分解為模塊(如認證、交易管理)、設計用戶界面(如主屏幕、添加交易屏幕)、組織組件、管理狀態、設置導航,并確保應用在不同平臺上表現一致。以下是主要步驟:

  • 功能分析:定義用戶登錄、交易管理等模塊。
  • 接口設計:使用 React Native Paper 創建直觀界面。
  • 組件劃分:構建可復用組件,如交易卡片。
  • 數據流:通過 Context API 和 AsyncStorage 管理交易數據。
  • 導航:使用 React Navigation 實現屏幕切換。
  • 跨平臺:處理 iOS 和 Android 的差異。

React Native 是一個強大的跨平臺移動應用開發框架,允許開發者使用 JavaScript 和 React 構建同時運行在 iOS 和 Android 上的應用。本文是 React Native 開發系列的第 8 篇,專注于通過一個實際項目——記賬本應用,深入探索功能模塊分析、接口設計、頁面組件結構劃分、數據流管理、頁面跳轉和跨平臺兼容處理技巧。本文將提供詳細的代碼示例和最佳實踐,幫助初學者和有經驗的開發者掌握 React Native 的核心開發技能。目標是構建一個簡單的記賬本應用,用戶可以記錄收入和支出、查看交易歷史并按類別管理交易。

1. 引言:記賬本應用與 React Native

記賬本應用是一個實用的移動應用,旨在幫助用戶跟蹤個人財務。它涵蓋了 React Native 開發的多個關鍵方面,包括用戶界面設計、狀態管理、導航和跨平臺兼容性。通過這個項目,您將學習如何將復雜需求分解為可管理的模塊,設計直觀的界面,組織組件結構,管理數據流,并確保應用在 iOS 和 Android 上表現一致。

1.1 應用簡介

記賬本應用允許用戶:

  • 記錄交易:添加收入或支出交易,包括金額、日期、類別和描述。
  • 查看歷史:瀏覽交易列表,支持按日期或類別過濾。
  • 管理類別:創建和編輯交易類別,如“餐飲”或“交通”。
  • 查看摘要:顯示總收入和支出的概覽。

為簡化開發,本文將重點實現以下功能:

  • 用戶登錄(模擬認證)
  • 主屏幕,顯示交易摘要和最近交易列表
  • 添加交易屏幕
  • 交易詳情屏幕,支持編輯和刪除

1.2 為什么選擇 React Native?

React Native 的跨平臺特性使其成為開發記賬本應用的理想選擇:

  • 單一代碼庫:一套代碼同時支持 iOS 和 Android,減少開發和維護成本。
  • 組件化架構:React 的組件模型適合模塊化開發,便于復用代碼。
  • 豐富的生態系統:支持如 React Navigation 和 React Native Paper 的庫,加速開發。
  • 接近原生性能:通過橋接調用原生組件,確保流暢的用戶體驗。

1.3 技術棧

我們將使用以下工具和技術:

工具/庫用途
React Navigation頁面導航
React Native PaperUI 組件和 Material Design 風格
Context API狀態管理
AsyncStorage本地數據持久化

2. 項目設置

在開始開發之前,需要設置 React Native 項目環境。以下是初始化項目的步驟:

2.1 初始化項目

運行以下命令創建新項目:

npx react-native init BookkeepingApp
cd BookkeepingApp

2.2 安裝依賴

安裝必要的庫:

npm install @react-navigation/native @react-navigation/stack react-native-paper @react-native-async-storage/async-storage

對于 iOS,還需安裝 CocoaPods 依賴:

cd ios && pod install && cd ..

2.3 項目結構

建議采用以下目錄結構:

BookkeepingApp/
├── src/
│   ├── components/
│   ├── context/
│   ├── navigation/
│   ├── screens/
│   └── styles/
├── App.js
└── package.json

3. 功能模塊分析

為了系統地開發應用,我們將功能分解為以下模塊:

3.1 認證模塊

  • 功能:用戶登錄和注冊(本文模擬登錄,無需真實后端)。
  • 需求
    • 登錄屏幕:輸入用戶名和密碼。
    • 注冊屏幕:輸入用戶名、郵箱和密碼。
    • 保存用戶狀態以保持登錄。

3.2 交易管理模塊

  • 功能:添加、編輯、刪除和查看交易。
  • 需求
    • 添加交易:輸入金額、日期、類別、描述和類型(收入/支出)。
    • 交易列表:顯示所有交易,支持點擊查看詳情。
    • 交易詳情:顯示詳細信息,支持編輯或刪除。

3.3 分類管理模塊

  • 功能:管理交易類別。
  • 需求
    • 默認類別:如“餐飲”、“交通”、“娛樂”。
    • 添加新類別:輸入類別名稱。
    • 編輯或刪除類別。

3.4 報告模塊

  • 功能:生成收入和支出摘要。
  • 需求
    • 顯示總收入和支出。
    • 支持按日期或類別過濾。

為簡化,本文將實現認證(模擬)、交易管理和基本報告功能。

4. 接口設計

用戶界面是應用成功的關鍵。我們將使用 React Native Paper 提供 Material Design 風格的組件,確保界面美觀且一致。

4.1 屏幕設計

以下是主要屏幕的布局:

  1. 登錄屏幕

    • 標題:應用名稱
    • 輸入字段:用戶名、密碼
    • 按鈕:登錄、注冊鏈接
  2. 主屏幕

    • 頭部:顯示總收入和支出摘要
    • 列表:最近交易
    • 浮動按鈕:添加新交易
  3. 添加交易屏幕

    • 表單:金額、日期、類別(下拉菜單)、描述、收入/支出開關
    • 按鈕:保存、取消
  4. 交易詳情屏幕

    • 顯示:交易詳細信息
    • 按鈕:編輯、刪除、返回

4.2 設計原則

  • 簡潔性:界面清晰,避免過多元素。
  • 一致性:使用 React Native Paper 的主題確保風格統一。
  • 可訪問性:為按鈕和輸入字段添加 accessibilityLabel

5. 頁面組件結構劃分

React Native 的組件化開發要求我們為每個屏幕設計合理的組件層次結構。以下是主要屏幕的組件劃分:

5.1 主屏幕

組件名稱描述
Header顯示應用名稱和用戶問候
SummaryCard顯示總收入和支出
TransactionList使用 FlatList 顯示最近交易
TransactionItem單個交易卡片,顯示金額、類別等
FAB浮動動作按鈕,跳轉到添加交易屏幕

5.2 添加交易屏幕

組件名稱描述
TransactionForm包含所有輸入字段的表單
TextInput輸入金額和描述
Picker選擇類別
DatePicker選擇日期
Switch切換收入/支出
Button保存或取消

5.3 交易詳情屏幕

組件名稱描述
DetailCard顯示交易詳細信息
Button編輯、刪除、返回

5.4 可復用組件

  • CustomTextInput:帶標簽和錯誤提示的輸入框。
  • CustomButton:統一樣式的按鈕。

6. 數據流管理

數據流管理是記賬本應用的核心。我們將使用 Context API 管理全局狀態,并結合 AsyncStorage 實現數據持久化。

6.1 數據模型

模型屬性
用戶id, username, email
交易id, amount, date, category, description, type (income/expense)
類別id, name, icon

6.2 Context API 設置

創建一個 TransactionContext 管理交易數據:

import React, { createContext, useState, useEffect } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';export const TransactionContext = createContext();export const TransactionProvider = ({ children }) => {const [transactions, setTransactions] = useState([]);const [categories, setCategories] = useState([{ id: 1, name: '餐飲', icon: 'food' },{ id: 2, name: '交通', icon: 'car' },{ id: 3, name: '娛樂', icon: 'movie' },]);useEffect(() => {const loadTransactions = async () => {try {const storedTransactions = await AsyncStorage.getItem('transactions');if (storedTransactions) {setTransactions(JSON.parse(storedTransactions));}} catch (error) {console.error('加載交易失敗', error);}};loadTransactions();}, []);const addTransaction = async (transaction) => {const newTransactions = [...transactions, { id: Date.now(), ...transaction }];setTransactions(newTransactions);try {await AsyncStorage.setItem('transactions', JSON.stringify(newTransactions));} catch (error) {console.error('保存交易失敗', error);}};const updateTransaction = async (id, updatedTransaction) => {const newTransactions = transactions.map((t) =>t.id === id ? { ...updatedTransaction, id } : t);setTransactions(newTransactions);try {await AsyncStorage.setItem('transactions', JSON.stringify(newTransactions));} catch (error) {console.error('更新交易失敗', error);}};const deleteTransaction = async (id) => {const newTransactions = transactions.filter((t) => t.id !== id);setTransactions(newTransactions);try {await AsyncStorage.setItem('transactions', JSON.stringify(newTransactions));} catch (error) {console.error('刪除交易失敗', error);}};return (<TransactionContext.Providervalue={{ transactions, categories, addTransaction, updateTransaction, deleteTransaction }}>{children}</TransactionContext.Provider>);
};

6.3 數據持久化

AsyncStorage 用于將交易數據保存到設備上,確保應用關閉后數據不丟失。每次添加、更新或刪除交易時,更新 AsyncStorage。

6.4 最佳實踐

  • 最小化狀態:僅存儲必要數據。
  • 錯誤處理:捕獲 AsyncStorage 操作的錯誤。
  • 性能優化:避免頻繁讀寫 AsyncStorage,考慮批量操作。

7. 頁面導航

我們將使用 React Navigation 實現頁面跳轉,結合堆棧導航器(Stack Navigator)管理屏幕。

7.1 導航設置

創建一個 AppNavigator.js

import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import LoginScreen from '../screens/LoginScreen';
import HomeScreen from '../screens/HomeScreen';
import AddTransactionScreen from '../screens/AddTransactionScreen';
import TransactionDetailScreen from '../screens/TransactionDetailScreen';const Stack = createStackNavigator();const AppNavigator = () => {return (<NavigationContainer><Stack.Navigator initialRouteName="Login"><Stack.Screen name="Login" component={LoginScreen} /><Stack.Screen name="Home" component={HomeScreen} /><Stack.Screen name="AddTransaction" component={AddTransactionScreen} /><Stack.Screen name="TransactionDetail" component={TransactionDetailScreen} /></Stack.Navigator></NavigationContainer>);
};export default AppNavigator;

7.2 屏幕實現

7.2.1 登錄屏幕
import React, { useState } from 'react';
import { View, StyleSheet } from 'react-native';
import { TextInput, Button, Title } from 'react-native-paper';const LoginScreen = ({ navigation }) => {const [username, setUsername] = useState('');const [password, setPassword] = useState('');const handleLogin = () => {// 模擬登錄navigation.replace('Home');};return (<View style={styles.container}><Title style={styles.title}>記賬本</Title><TextInputlabel="用戶名"value={username}onChangeText={setUsername}style={styles.input}/><TextInputlabel="密碼"value={password}onChangeText={setPassword}secureTextEntrystyle={styles.input}/><Button mode="contained" onPress={handleLogin} style={styles.button}>登錄</Button><Button onPress={() => navigation.navigate('Home')}>跳過注冊</Button></View>);
};const styles = StyleSheet.create({container: {flex: 1,padding: 16,justifyContent: 'center',},title: {fontSize: 24,textAlign: 'center',marginBottom: 24,},input: {marginBottom: 16,},button: {marginTop: 16,},
});export default LoginScreen;
7.2.2 主屏幕
import React, { useContext } from 'react';
import { View, Text, FlatList, StyleSheet } from 'react-native';
import { Card, Title, Paragraph, FAB } from 'react-native-paper';
import { TransactionContext } from '../context/TransactionContext';const HomeScreen = ({ navigation }) => {const { transactions } = useContext(TransactionContext);const totalIncome = transactions.filter((t) => t.type === 'income').reduce((sum, t) => sum + t.amount, 0);const totalExpense = transactions.filter((t) => t.type === 'expense').reduce((sum, t) => sum + t.amount, 0);return (<View style={styles.container}><Title style={styles.title}>財務概覽</Title><Card style={styles.summaryCard}><Card.Content><Paragraph>總收入: ${totalIncome}</Paragraph><Paragraph>總支出: ${totalExpense}</Paragraph><Paragraph>凈額: ${totalIncome - totalExpense}</Paragraph></Card.Content></Card><Text style={styles.subtitle}>最近交易</Text><FlatListdata={transactions}keyExtractor={(item) => item.id.toString()}renderItem={({ item }) => (<Cardstyle={styles.card}onPress={() => navigation.navigate('TransactionDetail', { transaction: item })}><Card.Title title={item.description} subtitle={item.category} /><Card.Content><Paragraph>{item.type === 'income' ? '+' : '-'} ${item.amount}</Paragraph><Paragraph>{item.date}</Paragraph></Card.Content></Card>)}/><FABstyle={styles.fab}icon="plus"onPress={() => navigation.navigate('AddTransaction')}/></View>);
};const styles = StyleSheet.create({container: {flex: 1,padding: 16,},title: {fontSize: 24,marginBottom: 16,},subtitle: {fontSize: 18,marginVertical: 8,},summaryCard: {marginBottom: 16,},card: {marginBottom: 8,},fab: {position: 'absolute',margin: 16,right: 0,bottom: 0,},
});export default HomeScreen;
7.2.3 添加交易屏幕
import React, { useState, useContext } from 'react';
import { View, StyleSheet } from 'react-native';
import { TextInput, Button, Switch, Picker } from 'react-native-paper';
import { TransactionContext } from '../context/TransactionContext';const AddTransactionScreen = ({ navigation }) => {const { categories, addTransaction } = useContext(TransactionContext);const [amount, setAmount] = useState('');const [date, setDate] = useState(new Date().toISOString().split('T')[0]);const [category, setCategory] = useState(categories[0]?.name || '');const [description, setDescription] = useState('');const [isIncome, setIsIncome] = useState(true);const handleSave = () => {if (!amount || !category) {alert('請填寫金額和類別');return;}addTransaction({amount: parseFloat(amount),date,category,description,type: isIncome ? 'income' : 'expense',});navigation.goBack();};return (<View style={styles.container}><TextInputlabel="金額"value={amount}onChangeText={setAmount}keyboardType="numeric"style={styles.input}/><TextInputlabel="日期"value={date}onChangeText={setDate}style={styles.input}/><PickerselectedValue={category}onValueChange={setCategory}style={styles.input}>{categories.map((cat) => (<Picker.Item key={cat.id} label={cat.name} value={cat.name} />))}</Picker><TextInputlabel="描述"value={description}onChangeText={setDescription}style={styles.input}/><View style={styles.switchContainer}><Text>{isIncome ? '收入' : '支出'}</Text><Switch value={isIncome} onValueChange={setIsIncome} /></View><Button mode="contained" onPress={handleSave} style={styles.button}>保存</Button><Button onPress={() => navigation.goBack()} style={styles.button}>取消</Button></View>);
};const styles = StyleSheet.create({container: {flex: 1,padding: 16,},input: {marginBottom: 16,},switchContainer: {flexDirection: 'row',alignItems: 'center',marginBottom: 16,},button: {marginTop: 8,},
});export default AddTransactionScreen;
7.2.4 交易詳情屏幕
import React, { useContext } from 'react';
import { View, StyleSheet } from 'react-native';
import { Card, Title, Paragraph, Button } from 'react-native-paper';
import { TransactionContext } from '../context/TransactionContext';const TransactionDetailScreen = ({ route, navigation }) => {const { transaction } = route.params;const { deleteTransaction } = useContext(TransactionContext);const handleDelete = () => {deleteTransaction(transaction.id);navigation.goBack();};return (<View style={styles.container}><Card style={styles.card}><Card.Title title={transaction.description} subtitle={transaction.category} /><Card.Content><Paragraph>{transaction.type === 'income' ? '+' : '-'} ${transaction.amount}</Paragraph><Paragraph>日期: {transaction.date}</Paragraph><Paragraph>描述: {transaction.description}</Paragraph></Card.Content><Card.Actions><Button onPress={() => navigation.navigate('AddTransaction', { transaction })}>編輯</Button><Button onPress={handleDelete}>刪除</Button></Card.Actions></Card></View>);
};const styles = StyleSheet.create({container: {flex: 1,padding: 16,},card: {marginBottom: 16,},
});export default TransactionDetailScreen;

7.3 導航參數

通過 route.params 傳遞交易數據到詳情屏幕或編輯屏幕,確保數據流暢。

8. 數據持久化

AsyncStorage 用于持久化交易數據。TransactionContext 已實現保存和加載功能,確保數據在應用重啟后保留。

8.1 最佳實踐

  • 序列化數據:使用 JSON 存儲復雜對象。
  • 錯誤處理:捕獲 AsyncStorage 操作的錯誤。
  • 限制數據量:AsyncStorage 適合小型數據(<1MB)。

9. 跨平臺兼容處理技巧

React Native 提供了跨平臺支持,但仍需處理 iOS 和 Android 的差異。

9.1 平臺特定代碼

使用 Platform 模塊處理平臺差異:

import { Platform } from 'react-native';const styles = StyleSheet.create({container: {paddingTop: Platform.OS === 'ios' ? 20 : 0,},
});

9.2 樣式差異

  • 陰影:iOS 使用 shadow 屬性,Android 使用 elevation
  • 鍵盤處理:使用 KeyboardAvoidingView 確保輸入框不被鍵盤遮擋。
import { KeyboardAvoidingView, Platform } from 'react-native';const AddTransactionScreen = () => (<KeyboardAvoidingViewbehavior={Platform.OS === 'ios' ? 'padding' : 'height'}style={styles.container}>{/* 表單內容 */}</KeyboardAvoidingView>
);

9.3 組件差異

  • Picker:React Native Paper 的 Picker 在 iOS 和 Android 上表現不同,需測試。
  • 日期選擇器:考慮使用 @react-native-community/datetimepicker 確保一致性。

9.4 測試

  • 在 iOS 和 Android 模擬器上測試。
  • 使用真機驗證觸摸交互和性能。
  • 推薦使用 Detox 進行端到端測試。

10. 結論

通過開發記賬本應用,您掌握了 React Native 的核心技能,包括功能模塊分析、接口設計、組件結構劃分、數據流管理、頁面跳轉和跨平臺兼容處理。這個項目展示了如何將理論知識應用于實踐,構建一個功能完整的移動應用。

10.1 挑戰與解決方案

  • 挑戰:管理復雜狀態。
    • 解決方案:使用 Context API 和 AsyncStorage。
  • 挑戰:跨平臺樣式差異。
    • 解決方案:使用 Platform 模塊和 React Native Paper。
  • 挑戰:導航參數傳遞。
    • 解決方案:通過 React Navigation 的 route.params。

10.2 進一步學習

  • 擴展功能:添加圖表(如 react-native-chart-kit)、真實后端(如 Firebase)。
  • 優化性能:使用 useMemouseCallback 減少重新渲染。
  • 深入文檔:參考 React Navigation 和 React Native Paper。

通過不斷實踐,您將能夠構建更復雜、用戶體驗更佳的 React Native 應用!

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

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

相關文章

從 PPO、DPO 到 GRPO:大語言模型策略優化算法解析

從 PPO、DPO 到 GRPO&#xff1a;大語言模型策略優化算法解析 背景與簡介 大語言模型&#xff08;LLM&#xff09;的訓練通常分為預訓練和后訓練兩個階段。預訓練階段&#xff0c;模型在海量文本上學習下一詞預測的能力&#xff1b;后訓練階段&#xff0c;我們希望進一步對齊…

React中使用Day.js指南

文章目錄 引言什么是Day.js&#xff1f;Day.js的核心特性 安裝和基礎配置安裝Day.js基礎導入和使用 在React中的基礎使用1. 顯示格式化日期2. 實時時鐘組件 常用插件配置1. 相對時間插件2. 高級格式化插件3. 時區處理插件 實戰案例&#xff1a;博客文章時間組件高級應用場景1. …

【系統設計【1】】系統設計面試方法論:從0到百萬用戶的需求到架構的推演

文章目錄 一、系統設計面試的底層邏輯&#xff1a;從需求到架構的推演&#xff08;一&#xff09;需求澄清&#xff1a;界定問題邊界&#xff08;二&#xff09;分層設計&#xff1a;從單節點到分布式的演進1. Web層&#xff1a;無狀態化與負載均衡2. 數據層&#xff1a;數據庫…

京津冀城市群13城市空間權重0-1矩陣

京津冀城市群13城市空間權重0-1矩陣 1、數據說明&#xff1a;京津冀13個城市&#xff1a;北京市、保定市、滄州市、承德市、邯鄲市、衡水市、廊坊市、秦皇島市、石家莊市、唐山市、邢臺市、張家口市、天津市、 2、指標解釋&#xff1a;空間權重矩陣是一種用于表征空間表達式的…

七大技術路線解析:自動駕駛如何被數據重新定義

自動駕駛技術從實驗室的算法驗證走向大規模量產應用&#xff0c;是一場充滿挑戰的征程。這段征程的核心驅動力&#xff0c;不僅是芯片和傳感器的升級&#xff0c;更是一場關于數據的“喂養”競賽——從簡單的像素標注到多模態大模型的理解&#xff0c;數據需求的演變悄然推動著…

計網復習知識(16)傳輸層及其協議功能

目錄 考研大綱 1.傳輸層概述 端口號 有連接/無連接傳輸 可靠/不可靠傳輸 2.UDP協議 2.1 udp數據報 2.2 udp檢驗 3.TCP協議 3.1 TCP協議的框架梳理 3.2 TCP報文段**** 3.3 三次握手與四次揮手 三次握手 四次揮手 3.4 可靠傳輸與流量控制 流量控制&#xff1a;滑動…

每天一個前端小知識 Day 1

語義化 HTML&#xff08;Semantic HTML&#xff09; 1. 什么是語義化 HTML&#xff1f; 語義化 HTML 指的是使用符合內容含義的標簽&#xff0c;而不僅僅為了布局或樣式。例如&#xff1a; <article>…</article> <nav>…</nav> <header>…&l…

在docker中部署mysql

部署 MySQL&#xff08;端口 9006&#xff09; 1. 創建數據目錄 mkdir -p ~/qihuang/mysql/data2. 啟動 MySQL 容器 docker run -d \--name mysql-qihuang \-p 9006:3306 \-v ~/qihuang/mysql/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORDroot \-e MYSQL_DATABASEqihuangdb…

JavaScript基礎-事件對象

一、前言 在前端開發中&#xff0c;用戶與頁面的交互行為&#xff08;如點擊按鈕、輸入文本、滾動頁面等&#xff09;都會觸發相應的事件。而這些事件發生時&#xff0c;瀏覽器會自動創建一個 事件對象&#xff08;Event Object&#xff09;&#xff0c;它包含了當前事件的所有…

藍橋杯_染色_bfs_Java

臨時抱抱佛腳&#xff0c;太浮躁了&#xff0c;藍橋杯已經快1個半月沒做題了。 本人比較菜&#xff0c;感覺這個時間節點也只能把暴力題給盡量多做做&#xff0c;找找做題手感&#xff0c;其他就純憑運氣了吧。T-T。 題目 問題描述 小藍有一個 n 行 m 列的白色棋盤, 棋盤的每一…

MySQL 究極奧義·動態乾坤大挪移·無敵行列轉換術

導入大SQL文件 [mysqld] # 大批量導入優化 bulk_insert_buffer_size1G max_allowed_packet1G innodb_autoextend_increment512M innodb_buffer_pool_size4G innodb_log_buffer_size4G innodb_log_file_size4G動態行列轉換 DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_sco…

Excel大廠自動化報表實戰(互聯網金融-數據分析周報制作中)

這是Excel大廠自動化報表實戰第三期--互聯網金融-數據分析周報制作中 數據資源已經與這篇博客捆綁&#xff0c;有需要者可以下載通過網盤分享的文件&#xff1a;2.4自動化報表-8月成交數據.xlsx&#xff0c;2.4自動化報表-8月獲客數據.csv等2個文件 鏈接: https://pan.baidu.c…

langchain從入門到精通(七)——利用回調功能調試鏈應用 - 讓過程更透明

1. Callback 功能介紹 Callback 是 LangChain 提供的回調機制&#xff0c;允許我們在 LLM 應用程序的各個階段使用 hook &#xff08;鉤子&#xff09;。鉤子的含義也非常簡單&#xff0c;我們把應用程序看成一個一個的處理邏輯&#xff0c;從開始到結束&#xff0c;鉤子就是在…

如何使用Postman做接口自動化測試

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文適合已經掌握 Postman 基本用法的讀者&#xff0c;即對接口相關概念有一定了解、已經會使用 Postman 進行模擬請求等基本操作。 工作環境與版本&#xff1a; …

ELK日志文件分析系統——E(Elasticsearch)

目錄 基本概念 一、架構設計 二、核心原理 三、關鍵特性 四、應用意義 部署步驟 ?一、環境準備? ?二、安裝 Elasticsearch? ?三、關鍵配置&#xff08;elasticsearch.yml&#xff09;? ?四、啟動與驗證? ?五、集群擴展&#xff08;新增節點&#xff09;? …

融智學教育觀及其數學公式體系凝練匯總

摘要&#xff1a;本文系統闡述了鄒曉輝教授的融智學教育觀&#xff0c;通過原創數學公式體系構建了人機協同教育模型。核心內容包括&#xff1a;認知本體論&#xff08;文明智慧當量方程&#xff09;、方法論&#xff08;七遍通訓練算子&#xff09;、生態位控制論&#xff08;…

互聯網大廠Java求職面試:AI大模型應用實踐中的架構挑戰與實戰

互聯網大廠Java求職面試&#xff1a;AI大模型應用實踐中的架構挑戰與實戰 引言 在當今技術飛速發展的時代&#xff0c;AI大模型已成為企業數字化轉型的重要引擎。無論是內容生成、智能客服、個性化推薦&#xff0c;還是知識圖譜構建和語義理解&#xff0c;大模型的應用場景正在…

龜兔賽跑算法(Floyd‘s Cycle-Finding Algorithm)尋找重復數

龜兔賽跑算法&#xff08;Floyd’s Cycle-Finding Algorithm&#xff09;尋找重復數 問題描述 給定一個長度為 N1 的數組 nums&#xff0c;其中每個元素的值都在 [1, N] 范圍內。根據鴿巢原理&#xff0c;至少有一個數字是重復的。請找出這個重復的數字。 要求&#xff1a; …

紫光展銳T8300以創新音頻技術重塑感知世界

數字化時代&#xff0c;從語音通話到智能交互&#xff0c;從聆聽音樂到創作Vlog&#xff0c;聲音已成為隱形的基礎措施。日益發展的音頻技術正在重構用戶感知世界的方式&#xff0c;重塑用戶的聽覺體驗。 T8300是紫光展銳專為全球主流用戶打造的5G SoC&#xff0c;采用了紫光展…

寫作詞匯積累(A):頗有微詞、微妙(“微”字的學習理解)

一、頗有微詞 1、基本介紹 【頗有微詞】指對某人或某事有輕微的批評、不滿或不同意見&#xff0c;但表達得含蓄委婉 【頗】表示程度較深&#xff0c;【微詞】表示隱晦的批評 【微】表示隱晦的、不直白的&#xff0c;強調批評的委婉性 2、使用實例 1、盡管公司的新考勤制度…