利用node.js搭配express框架寫后端接口(一)

Node.js 憑借其高效的非阻塞 I/O 操作、事件驅動架構以及輕量級的特點,成為了開發高性能服務器應用的熱門選擇。Express 框架作為 Node.js 上最流行的 Web 應用框架之一,以其簡潔的 API 和豐富的中間件生態系統,極大地簡化了 Web 后端開發流程。本文將引導你如何使用 Node.js 和 Express 框架構建一個簡單的后端接口。

目錄

一、初始化項目

1.創建項目

2.配置cors跨域

3.配置解析表單數據的中間件

4.初始化路由相關的文件夾

?5.初始化用戶路由模塊

6.抽離用戶路由模塊中的處理函數

二、新建數據庫表

1.新建數據庫

2.新建表

三、安裝并配置MySQL模塊

1.安裝MySQL模塊

2.連接數據庫

四、登錄、注冊

1.注冊

1.1檢測表單數據是否合法

1.2檢測用戶名是否被占用

1.3對密碼進行加密處理

1.4插入新用戶

1.5優化res.send()代碼

1.6優化表單數據驗證

2.登錄

?2.1檢測登錄表單的數據是否合法

2.2根據用戶名查詢用戶的數據

2.3判斷用戶輸入的密碼是否正確

2.4生成jwt的token字符串

2.5配置解析token的中間件


一、初始化項目

1.創建項目

新建一個文件夾作為項目的根目錄,并在項目根目錄中運行如下命令,初始化包的管理配置文件:

npm i express@4.17.1

然后在項目中新建app.js作為整個項目的入口文件,并初始化如下代碼:

//導入express
const express = require('express')
//創建服務器對象
const app = express() 
//啟動服務器
app.listen(3007, () => {console.log('api server htttp://127.0')
})

2.配置cors跨域

在文件夾的終端運行如下的命令,安裝cors中間件:

npm i cors@2.8.5

然后再app.js中導入并配置cors中間件:

//導入并配置cors中間件
const cors = require('cors')
app.use(cors())

3.配置解析表單數據的中間件

通過使用如下代碼,配置解析application/x-www-form-urlencoded格式的表單數據的中間件:

//配置解析表單數據的中間件--注意:只能解析application/x-www-from-urlencoded格式的表單數據的中間件
app.use(express.urlencoded({extended:false}))

4.初始化路由相關的文件夾

(1)在項目的根目錄中,新建router文件夾,用來存放所有的路由模塊。路由模塊中,只存放客戶端的請求與處理函數之間的映射關系。

?(2)在項目的根目錄中,新建router_handler文件夾,用來存放所有的路由處理函數模塊,這里專門負責存放每個路由對應的處理函數。

?5.初始化用戶路由模塊

在router文件夾中,新建user.js文件,作為用戶的路由模塊,代碼如下:

const express = require('express')
//創建路由對象
const router = express.Router()//注冊新用戶
router.post('/register', (req, res) => { res.send('注冊成功')
})//登錄
router.post('/login', (req, res) => { res.send('登錄成功')
})//導出路由對象
module.exports = router

在app.js中導入并使用該用戶路由模塊

//導入并注冊用戶路由模塊
const userRouter = require('./routes/user')
app.use('/api', userRouter)

6.抽離用戶路由模塊中的處理函數

為了保證路由模塊的純粹性,所有的路由處理函數,必須抽離到對應的路由處理函數模塊中。

在router_handler/user.js文件中,使用exports對象,分別向外共享如下兩個路由處理函數:

//注冊用戶的處理函數
exports.regUser = (req, res) => {res.send('注冊成功')
}
//登錄的處理函數
exports.login = (req, res) => {res.send('登錄成功')
}

將router/user.js文件中的代碼修改如下結構

const express = require('express')
//創建路由對象
const router = express.Router()//打入用戶路由處理函數模塊
const userHandler = require('./router_handler/user')//注冊新用戶---原
// router.post('/register', (req, res) => { 
//     res.send('注冊成功')
// })
//注冊新用戶--新
router.post('/register',userHandler.regUser )//登錄----原
// router.post('/login', (req, res) => { 
//     res.send('登錄成功')
// })
//登錄---新
router.post('/login',userHandler.login)//導出路由對象
module.exports = router

二、新建數據庫表

在創建庫表之前確保已經安裝了數據庫。

1.新建數據庫

2.新建表

在新建的test_mysql數據庫中,新建ev_users表?。點擊新建查詢,輸入一下SQL語句

use test_mysql;
CREATE TABLE ev_users
(id INT NOT NULL AUTO_INCREMENT,username VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,nickname VARCHAR(255),email VARCHAR(255),user_pic TEXT,PRIMARY KEY (id)
)

然后點擊旁邊的運行,下方如果出現OK,就表示創建成功

?然后在表那邊點擊刷新就可以看見新創建的表了

三、安裝并配置MySQL模塊

在api接口項目中,需要安裝并配置MySQL這個第三方模塊,倆連接和操作MySQL數據庫

1.安裝MySQL模塊

在根目錄的終端中運行如下命令:

npm i mysql@2.18.1

2.連接數據庫

在項目中的根目錄下新建db文件夾,并在其下方新建index.js文件,在此文件中創建數據庫的連接對象

//導入MySQL模塊
const mysql = require('mysql')
//創建數據庫連接對象
const db = mysql.createPool({host: '127.0.0.1',       // 數據庫主機名user: '你的數據庫用戶名',            // 數據庫用戶名password: '你的數據庫密碼', // 數據庫密碼database: 'test_mysql' // 數據庫名
})
// 導出連接池
module.exports = db;

四、登錄、注冊

1.注冊

1.1檢測表單數據是否合法

在router_handle/user.js這個文件中判斷用戶名和密碼是否為空,具體代碼如下:

//注冊用戶的處理函數
exports.regUser = (req, res) => {//獲取客戶端提交到服務器的用戶信息const userInfo = req.body// console.log(userInfo, '這個信息是:')//對表單中的數據,進行合法的校驗if (!userInfo.username || !userInfo.password) {return res.send({code: 404,message: 'fail',detail:'用戶名或密碼不合法'})}
}

1.2檢測用戶名是否被占用

(1)導入數據庫操作模塊

在router_handle/user.js這個文件中導入數據庫模塊

//導入數據庫
const db = require('../db/index')

(2)定義SQL語句

//定義SQL語句,查詢用戶名是否被占用const sqlStr='select * from ev_users where username=?'

(3)執行SQL語句并根據結果判斷用戶名是否被占用

db.query(sqlStr, userInfo.username, (err, results) => {//執行SQL語句失敗if (err) {return res.send({code:500,message: 'fail',detail:err.message})}//判斷用戶名是否被占用if (results.length > 0) {return res.send({code:409,message: 'fail',detail:'用戶名被占用,請更換其他用戶名'})}})

1.3對密碼進行加密處理

為了保證密碼的安全性,不建議在數據庫以明文的形式保存用戶密碼,推薦對密碼進行加密存儲。

在當前所做項目中,使用bcryptjs對用戶密碼進行加密,優點在于:

  • 加密之后的密碼,無法被逆向破解;
  • 同一明文密碼多次加密,得到的加密結果各不相同,保證了安全性。

(1)安裝bcryptjs

在項目終端運行如下命令:

npm i bcryptjs@2.4.3

?(2)導入bcryptjs

在router_handle/user.js這個文件中導入bcryptjs

//導入bcryptjs
const bcrypt=require('bcryptjs')

(3)使用bcryptjs

在注冊用戶的處理函數中,確認用戶名可用之后,調用bcrypt.hashSync(明文密碼,隨機鹽的長度)方法,對用戶的密碼進行加密處理:

//調用bcryptjs-hashSync()對密碼進行加密console.log(userInfo,'加密前:')userInfo.password = bcrypt.hashSync(userInfo.password, 10)console.log(userInfo,'加密后:')

1.4插入新用戶

(1)定義插入用戶的SQL語句

 //定義插入新用戶的SQL語句const sql='insert into ev_users set ?'

(2)調用db.query()執行SQL語句,插入新用戶

//調用db.query()執行SQL語句db.query(sql, { username: userInfo.username, password: userInfo.password }, (err, results) => {//判斷SQL語句是否執行成功if (err) {return res.send({code:500,message: 'fail',detail:err.message})}//判斷影響函數是否為1if (results.affectedRows != 1) {return res.send({code: 500,message: 'fail',detail:'注冊用戶失敗,請稍后再試'})} else {return res.send({code: 200,message: 'success',detail:'注冊成功'})}})

1.5優化res.send()代碼

在以上的處理函數中我們可以發現,需要多次調用到res.send()向客戶端響應處理失敗的結果,為了簡化以上代碼,這里重新封裝了一個res.trans()函數。

在app.js中,所有路由之前,聲明一個全局中間件,為res對象掛載一個res.trans()函數

//封裝res.trans
app.use((req, res, next) => {//code默認值為500,表示失敗的情況//err可能是一個錯誤對象,也可能是一個錯誤的描述字符串res.trans = (err,code=500) => {res.send({code,message: 'fail',detail:err instanceof Error?err.detail:err})}next()
})

在router_handle/user.js這個文件中有關注冊這個處理函數進行重新修改

//注冊用戶的處理函數
exports.regUser = (req, res) => {//獲取客戶端提交到服務器的用戶信息const userInfo = req.body// console.log(userInfo, '這個信息是:')//對表單中的數據,進行合法的校驗if (!userInfo.username || !userInfo.password) {// return res.send({//     code: 400,//     message: 'fail',//     detail: '用戶名或密碼不合法'// })return res.trans('用戶名或密碼不合法',400)}// } else {//     return res.send({//         code: 200,//         message: 'success',//         detail:''//     })// }//定義SQL語句,查詢用戶名是否被占用const sqlStr='select * from ev_users where username=?'db.query(sqlStr, userInfo.username, (err, results) => {//執行SQL語句失敗if (err) {//原--未封裝// return res.send({//     code:500,//     message: 'fail',//     detail:err.message// })//現--分裝后return res.trans(err)}//判斷用戶名是否被占用if (results.length > 0) {//原--未封裝// return res.send({//     code:409,//     message: 'fail',//     detail:'用戶名被占用,請更換其他用戶名'// })//現--分裝后return res.trans('用戶名被占用,請更換其他用戶名',409)}//調用bcryptjs-hashSync()對密碼進行加密// console.log(userInfo,'加密前:')userInfo.password = bcrypt.hashSync(userInfo.password, 10)// console.log(userInfo, '加密后:')//定義插入新用戶的SQL語句const sql = 'insert into ev_users set ?'//調用db.query()執行SQL語句db.query(sql, { username: userInfo.username, password: userInfo.password }, (err, results) => {//判斷SQL語句是否執行成功if (err) {// return res.send({//     code:500,// message: 'fail',// detail:err.message// })//現--分裝后return res.trans(err)}//判斷影響函數是否為1if (results.affectedRows != 1) {// return res.send({//     code: 500,//     message: 'fail',//     detail:'注冊用戶失敗,請稍后再試'// })//現--分裝后return res.trans('注冊用戶失敗,請稍后再試')} else {return res.send({code: 200,message: 'success',detail:'注冊成功'})}})})
}

1.6優化表單數據驗證

表單驗證的原則:前端驗證為輔,后端驗證為主,后端不能相信前端提交過來的任何內容。在實際開發中,前后端都需要對表單的數據進行合法性的驗證,而且,后端做為數據合法性驗證的最后一個關口,在攔截非法數據方面,起到了至關重要的作用。
單純的使用 if...e1se...的形式對數據合法性進行驗證,效率低下、出錯率高、維護性差。因此,推薦使用第三方數據驗證模塊,來降低出錯率、提高驗證的效率與可維護性,讓后端程序員把更多的精力放在核心業務邏輯的處理上。

(1)安裝joi包,為表單中攜帶的每個數據項,定義驗證規則

npm i joi

(2)安裝@escook/express-joi中間件,來實現自動對表單數據進行驗證的功能

npm i @escook/express-joi

(3)新建/schema/user.js用戶信息驗證規則模塊,并初始化代碼

//導入joi
const joi = require('joi')
/*** string 值必須是字符串* alphanum 值只能是包含a-zA-Z0-9的字符串* min(length)最小長度* max(length)最大長度* required() 值是必填項,不能為undefined* pattern(正則表達式) 值必須符合正則表達式的規則*/
//定義用戶名和密碼的驗證
const username = joi.string().alphanum().min(1).max(10).required()
const password = joi.string().pattern(/^[\S]{6,12}$/).required()//定義驗證注冊和登錄表單數據的規則對象
exports.reg_login_schema = {body: {username,password}
}

(4)修改router/user.js中的代碼

const express = require('express')
//創建路由對象
const router = express.Router()//打入用戶路由處理函數模塊
const userHandler = require('../router_handler/user')//導入驗證數據的中間件
const expressJoi = require('@escook/express-joi')
//導入需要的驗證規則對象
const {reg_login_schema} = require('../schema/user')//注冊新用戶--新
//1.在注冊新用戶的路由中,聲明局部中間件,對當前請求中攜帶的數據進行驗證
//2.數據驗證通過后,會把這次請求流轉給后面的路由處理函數
//3.數據驗證失敗后,終止后端代碼的執行,并拋出一個全局的error錯誤,進入全局錯誤級別中間件中進行處理
router.post('/register',expressJoi(reg_login_schema),userHandler.regUser )//登錄---新
router.post('/login',userHandler.login)//導出路由對象
module.exports = router

(5)在app.js的全局錯誤級別中間件中,捕獲驗證失敗的錯誤,并把驗證失敗的結果響應給客戶端

//導入joi
const joi = require('joi')
//中間部分的省略//定義錯誤級別的中間件
app.use((err, req, res) => {//驗證失敗導致的錯誤if (err instanceof joi.ValidationError) {return res.trans(err)}//未知的錯誤res.trans(err)})

(6)在router_handler/user.js文件中,注冊用戶處理函數這一塊注釋掉下面的代碼

// if (!userInfo.username || !userInfo.password) {//     return res.trans('用戶名或密碼不合法',400)// }

2.登錄

2.1檢測登錄表單的數據是否合法

將router/user.js中登錄的路由代碼修改如下

//登錄---新
router.post('/login',expressJoi(reg_login_schema),userHandler.login)

2.2根據用戶名查詢用戶的數據

(1)接收表單數據

//獲取客戶端提交到服務器的用戶信息const userInfo = req.body

(2)定義SQL語句

//定義SQL語句,查詢用戶名是否被占用const sqlStr='select * from ev_users where username=?'

(3)執行SQL語句,查詢用戶的數據

db.query(sqlStr, userInfo.username, (res, results) => {//執行SQL語句失敗if (err) {return res.trans(err)}//執行SQL語句成功,但是查詢到數據條數不等于1if (results.length != 1) {return res.trans('登錄失敗')}})

2.3判斷用戶輸入的密碼是否正確

核心:調用bcrypt.compareSync(用戶提交的密碼,數據庫中的密碼)方法比較密碼是否一致。

 db.query(sqlStr, userInfo.username, (err, results) => {//執行SQL語句失敗if (err) {return res.trans(err)}//執行SQL語句成功,但是查詢到數據條數不等于1if (results.length != 1) {return res.trans('登錄失敗',405)}//用戶輸入的密碼和數據庫中存儲的密碼進行對比const compareResult = bcrypt.compareSync(userInfo.password, results[0].password)console.log('這是:',compareResult,results[0].password,userInfo.password)//如果對比的結果等于false,則證明用戶輸入的密碼錯誤if (!compareResult) {return res.trans('登錄失敗',400)} res.send('ok')})

2.4生成jwt的token字符串

注意:在生成token字符串的時候,一定要提出密碼和頭像的值

(1)通過es6的高級語法,快速剔除密碼和頭像的值,該代碼書寫于上述對比輸入密碼語句之后

//在服務器端生成token字符串const user = { ...results[0] ,password:'',user_pic:''}console.log(user,'這是:')

(2)安裝生成token字符串的包

npm i jsonwebtoken

(3)在router_handler/user.js文件的頭部區域,導入jsonwebtoken包

//導入生成的token包
const jwt=require('jsonwebtoken')

(4)創建config.js文件,并向外共享加密和還原token的jwtSecretKey字符串

module.exports = {//加密和解密的token密鑰jwtSecretKey: 'test',//token有效期expiresIn:'10h'
}

(5)將用戶信息對象加密成token字符串

//導入密鑰配置文件
const config=require('../config.js')//對用戶的信息進行加密,生成token字符串
const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
console.log('這是:', tokenStr)

(6)將生成的token字符串響應給客戶端

 //調用res.send()將token響應給客戶端res.send({code: 200,message: 'success',token: 'Bearer '+tokenStr,detail:'登
})

2.5配置解析token的中間件

(1)安裝解析token的中間件

npm i express-jwt@5.3.3

(2)在app.js中注冊路由之前,配置解析token的中間件

//一定要在路由之前配置解析token的中間件
const { expressJwt } = require('express-jwt')
const config = require('./config')
app.use(expressJwt({ secret: config.jwtSecretKey}).unless({path:[/^\/api/]}))

(3)在app.js中的錯誤級別中間件中,鋪貨并處理token認證失敗后的錯誤

//定義錯誤級別的中間件---暫不使用
app.use((err, req, res,next) => {//驗證失敗導致的錯誤// if (err instanceof joi.ValidationError) return res.trans(err)if(err.name==='UnauthorizedError') return res.trans('身份認證失敗',401)// //未知的錯誤res.trans(err)    
})

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

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

相關文章

【小白數學】為什么可以用拉格朗日乘子法求函數的極值【二】

我們在上一篇【小白數學】- 為什么可以用拉格朗日乘子法求函數的極值【一】已經介紹了一種較為“嚴謹“的方法來說明為什么拉格朗日乘子法可以幫助我們求具有等式約束條件下的函數的極值。雖然在我們的例子中”等式約束“中只有一個等式。但其實很容易推廣到多個等式約束的情況…

JAVA面試_進階部分_netty面試題

1.BIO、NIO 和 AIO 的區別? BIO:一個連接一個線程,客戶端有連接請求時服務器端就需要啟動一個線程進行處理。線程開銷大。 偽異步 IO:將請求連接放入線程池,一對多,但線程還是很寶貴的資源。 NIO&#x…

考研出分24小時,人類精神狀態圖鑒

2月24日,上午10點起,各省考研初試成績陸續公布,考生們或緊張的輸入準考證號,或抱團等待“審判”。然而更魔幻的還在后頭——下午4點,教育部竟在同一天直接發布了《2025年研考國家分數線》。 不少網友表示:…

川翔云電腦優勢總結

在數字化時代,川翔云電腦依托云計算技術,為用戶解決硬件性能瓶頸問題。川翔云電腦使用云渲碼:【2355】 卓越硬件配置:配備 RTX 3090、48G 顯存的 RTX 4090plus,支持 1 - 8 卡機配置,多卡并行計算能力強&am…

DeepSeek開源周Day4:三連發!突破 AI 訓練瓶頸的立體解決方案,并行計算三劍客DualPipe、EPLB與Profile-data

項目地址: https://github.com/deepseek-ai/DualPipehttps://github.com/deepseek-ai/eplbhttps://github.com/deepseek-ai/profile-data 開源日歷:2025-02-24起 每日9AM(北京時間)更新,持續五天 (4/5)! ? ? 一、背景概述 …

基于W2605C語音識別合成芯片的智能語音交互鬧鐘方案-AI對話享受智能生活

隨著科技的飛速發展,智能家居產品正逐步滲透到我們的日常生活中,其中智能鬧鐘作為時間管理的得力助手,也在不斷進化。基于W2605C語音識別與語音合成芯片的智能語音交互鬧鐘,憑借其強大的聯網能力、自動校時功能、實時天氣獲取、以…

Vite與Turbopack現代構建工具架構解析:秒級構建的性能奧秘

引言:傳統構建工具的效能瓶頸 Shopify將前端倉庫遷移至Vite后,HMR更新時間從Webpack的4.2秒縮短至48毫秒。Turbopack在Vercel生產環境測試中,增量構建速度較Webpack快700%。ChromeOS團隊采用Vite后,生產構建從Webpack的17分鐘優化…

網絡基礎知識-2

N個節點完全互聯的網型網即N個節點的無向完全圖,無向完全圖的邊數計算如下:每個節點都要指向其他N-1個節點,但是因為無向兩個節點之間的邊會重復,因此有N(N-1)/2條邊HDLC(高級數據鏈路控制協議)是一種面向比…

視頻級虛擬試衣技術在淘寶的產品化實踐

作為一種新的商品表現形態,內容幾乎存在于手淘用戶動線全流程,例如信息流種草內容、搜索消費決策內容、詳情頁種草內容等。通過低成本、高時效的AIGC內容生成能力,能夠從供給端緩解內容生產成本高的問題,通過源源不斷的低成本供給…

藍橋備賽(三)- 條件判斷與循環(下)

一、for循環 1.1 for 循環語法形式 for 循環是三種循環中使用最多的 , for 循環的語法形式如下: 1.2 執行流程 for 循環中 , 表達式1(初始化)只執行一次 ! 1.3 實踐 練習:使用 for 循環在屏幕…

VMware Fusion 虛擬機Mac版 安裝CentOS 7 系統

介紹 CentOS是Community Enterprise Operating System的縮寫,也叫做社區企業操作系統。是企業Linux發行版領頭羊Red Hat Enterprise Linux的再編譯版本(是一個再發行版本),而且在RHEL的基礎上修正了不少已知的 Bug ,相…

如果更換ip地址會怎么樣?網絡ip地址怎么更換

IP地址,作為網絡設備的數字身份證,其穩定性和安全性對于網絡通訊至關重要。然而,在某些特定情況下,我們可能需要更換設備的IP地址,以滿足安全、隱私或網絡管理的需求。那么,如果更換IP地址會怎么樣&#xf…

網絡通信/IP網絡劃分/子網掩碼的概念和使用

文章目錄 概述子網的考題子網掩碼的歷史有/無類地址子網劃分!子網掩碼超網技術/CIDR子網掩碼和路由IP子網掩碼定義 網絡規劃網絡規劃-拆子網網絡規劃-組超網子網劃分案例 區分于其他特殊IP地址IP地址和網絡地址子網掩碼和網絡地址子網掩碼和廣播地址 子網間的通信其他 概述 本…

評估自動駕駛(AD)策略性能的關鍵指標

以下是針對自動駕駛(AD)策略性能評測指標的詳細解讀,結合其物理意義與工程價值: 核心評測指標分類與含義 1. 安全性指標(Safety) 動態碰撞率(Dynamic Collision Ratio, DCR) 定義&a…

C++11相較于C++98的新特性介紹:列表初始化,右值引用與移動語義

一,列表初始化 1.1C98中傳統的{} C98中一般數組和結構體可以使用{}進行初始化: struct Date {int _year;int _month;int _day; };int main() {int a[] { 1,2,3,4,5 };Date _date { 2025,2,27 };return 0; } 1.2C11中的{} C11以后想統一初始化方式&…

序列化是什么?常見的序列化方式有哪些?什么時候我們會用到序列化?

序列化(Serialization)是指將對象的狀態信息轉換為可以存儲或傳輸的形式(如字節序列、XML 文檔、JSON 字符串等)的過程。反序列化則是序列化的逆過程,它將存儲或接收到的字節序列、XML 文檔、JSON 字符串等轉換回對象的…

Python解決“比賽配對”問題

Python解決“比賽配對”問題 問題描述測試樣例解決思路代碼 問題描述 小R正在組織一個比賽,比賽中有 n 支隊伍參賽。比賽遵循以下獨特的賽制: 如果當前隊伍數為 偶數,那么每支隊伍都會與另一支隊伍配對。總共進行 n / 2 場比賽,…

uniapp中使用leaferui使用Canvas繪制復雜異形表格的實現方法

需求: 如下圖,要實現左圖的樣式,先實現框架,文字到時候 往里填就行了,原來的解決方案是想用css,html來實現,發現實現起來蠻麻煩的。我也沒找到合適的實現方法,最后換使用canvas來實現&#xff…

大模型與呼叫中心融合:未來發展的潛力何在?

大模型與呼叫中心的結合,為企業帶來了前所未有的發展機遇。通過提升服務效率、優化營銷效果、降低運營成本、增強數據管理與分析能力、提升客戶體驗以及推動行業創新與變革,大模型呼叫中心正在重塑客戶服務與營銷的未來。 大模型與呼叫中心的結合具有巨…

vue3+ts+uniapp+unibest 微信小程序(第二篇)—— 圖文詳解自定義背景圖頁面布局、普通頁面布局、分頁表單頁面布局

文章目錄 簡介一、自定義背景圖布局1.1 效果預覽1.2 實現思路1.3 custom-page 組件全量代碼1.4 頁面使用 二、普通頁面布局2.1 效果預覽2.2 實現思路2.3 公共樣式部分2.4 頁面使用 三、分頁表單頁面布局3.1 效果預覽3.2 實現思路3.3 頁面代碼 簡介 開發工具:VsCode…