国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻

這篇具有很好參考價值的文章主要介紹了SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、項目演示

項目演示地址: 視頻地址

二、項目介紹

項目描述:這是一個基于SpringBoot+Vue框架開發(fā)的高校圖書館管理系統(tǒng)。首先,這是一個前后端分離的項目,代碼簡潔規(guī)范,注釋說明詳細,易于理解和學習。其次,這項目功能豐富,具有一個高校圖書館管理系統(tǒng)該有的所有功能。

項目功能:此項目分為兩個角色:學生管理員。學生有登錄注冊、管理個人信息、瀏覽座位信息、預(yù)約選座、瀏覽圖書信息、借閱圖書、瀏覽借閱信息、管理預(yù)約信息等等功能。管理員有管理所有用戶新息、管理所有座位信息、管理所有時刻信息、管理所有信譽積分信息、管理所有圖書信息、管理所有預(yù)約選座、借閱信息等等功能。

應(yīng)用技術(shù):SpringBoot + Vue + MySQL + MyBatis + Redis + ElementUI

運行環(huán)境:IntelliJ IDEA2019.3.5 + MySQL5.7(項目壓縮包中自帶) + Redis5.0.5(項目壓縮包中自帶) + JDK1.8 + Gradle5.6.4(項目壓縮包中自帶)+ Node14.16.1(項目壓縮包中自帶)

三、項目運行截圖

項目運行截圖:
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻
SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻

四、主要代碼

1.前端預(yù)約選座頁面代碼:

<template>
    <div>
        <!-- 面包屑導航 -->
        <el-breadcrumb separator-class="el-icon-arrow-right">
            <el-breadcrumb-item :to="{ path: '/home/dash-board' }">首頁</el-breadcrumb-item>
            <el-breadcrumb-item>選座頁面</el-breadcrumb-item>
        </el-breadcrumb>
        <!-- 搜索篩選 -->
        <el-form :inline="true" :model="searchParams" class="user-search">
            <el-form-item label="搜索:">
                <el-date-picker
                        value-format="yyyy-MM-dd"
                        format="yyyy-MM-dd"
                        size="small"
                        v-model="searchParams.openTime"
                        type="date"
                        :picker-options="pickerOptions"
                        :clearable="false"
                        :editable="false">
                </el-date-picker>
            </el-form-item>
            <el-form-item>
                <el-select v-model="searchParams.scheduleId" size="small" placeholder="請選擇時刻">
                    <el-option v-for="(item, index) in scheduleList" :key="index" :label="item.name + '(' + item.rangeTime + ')'" :value="item.id"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-button size="small" type="primary" icon="el-icon-search" @click="searchByTime">搜索</el-button>
                <el-button size="small" v-if="loginUser.roleId === 1" type="primary" icon="el-icon-date" @click="pickOrderSeat">預(yù)約</el-button>
            </el-form-item>
        </el-form>
        <el-table :key="index" v-if="seat.row !== 0 && seat.col !== 0" size="small" :data="tableData" v-loading="loading" border element-loading-text="拼命加載中" style="width: 100%;">
            <el-table-column width="55">
                <template slot-scope="scope">
                    <span style="color: #909399; font-weight: bold;">第{{scope.$index + 1}}行</span>
                </template>
            </el-table-column>
            <el-table-column :width="seat.col > 9 ? 150 : ''" v-for="n in seat.col" :key="n"  align="center" :label="'第' + n + '列'" >
                <template slot-scope="scope">

                    <el-badge v-if="scope.row.picked[n-1] === 0" type="danger" value="占座" style="margin-top: 10px">
                        <img style="width: 30px; height: 30px; margin-top: 10px"
                             src="../../assets/img/sold_seat.jpg" />
                        <div>第{{scope.$index + 1}}行第{{n}}列</div>
                    </el-badge>
                    <el-badge v-else-if="scope.row.picked[n-1] === 1" type="primary" value="可選" style="margin-top: 10px">
                        <div @click="pickSeat(scope.$index, n-1)">
                            <img style="width: 30px; height: 30px; margin-top: 10px"
                                 src="../../assets/img/selectable_seat.jpg" />
                            <div>第{{scope.$index + 1}}行第{{n}}列</div>
                        </div>
                    </el-badge>
                    <el-badge v-else-if="scope.row.picked[n-1] === 2" type="success" value="選中" style="margin-top: 10px">
                        <div @click="cancelSeat(scope.$index + 1, n)">
                            <img style="width: 30px; height: 30px; margin-top: 10px"
                                 src="../../assets/img/selected_seat.jpg" />
                            <div>第{{scope.$index + 1}}行第{{n}}列</div>
                        </div>
                    </el-badge>
                </template>
            </el-table-column>
        </el-table>

        <el-empty v-else :image-size="200"></el-empty>
    </div>
</template>

<script>
    export default {
        name: 'PickList',
        data() {
            return {
                pickerOptions: {
                    disabledDate: (time) => {
                        return time.getTime() < Date.now() - 8.64e7
                    }
                },
                searchParams: {
                    openTime: '',
                    scheduleId: ''
                },
                seat: {
                    row: 0,
                    col: 0
                },
                scheduleList: [],
                loading: false,
                tableData: [],
                pickSeatList: [],
                seatItemList: [],
                index: 0,
                loginUser: {}
            }
        },
        created() {
            this.searchParams.openTime = this.getNowDay();
            this.getLoginUser();
            this.getAllScheduleList();
        },
        methods: {
            getNowDay() {
                let date = new Date();
                let y = date.getFullYear();
                let m = date.getMonth() + 1;
                m = m < 10 ? ('0' + m) : m;
                let d = date.getDate();
                d = d < 10 ? ('0' + d) : d;
                return  y + '-' + m + '-' + d;
            },
            getLoginUser() {
                this.$ajax.post("/user/getLoginUser", {token: Tool.getLoginUser()}).then((response)=>{
                    let resp = response.data;
                    if(resp.code === 0){
                        if(resp.data) {
                            this.loginUser = resp.data;
                        } else {
                            this.$message.error(resp.msg);
                            this.$router.push("/login");
                        }
                    }
                });
            },
            pickSeat(row, col) {
                if(this.pickSeatList.length >= 1) {
                    this.$message.warning("一次最多只能選1個座位!");
                    return false;
                }
                this.tableData[row].picked[col] = 2;
                // 動態(tài)刷新表格
                this.index = this.index + 1;
                this.pickSeatList.push({row: row + 1, col: col + 1});
            },
            cancelSeat(row, col) {
                this.tableData[row-1].picked[col-1] = 1;
                // 動態(tài)刷新表格
                this.index = this.index + 1;
                let nowSeatList = [];
                this.pickSeatList.forEach(item => {
                    if(item.col !== col || item.row !== row) {
                        nowSeatList.push(item);
                    }
                });
                this.pickSeatList = nowSeatList;
            },
            getSeatBySearch() {
                this.loading = true;
                this.$ajax.post("/seat/getByTime", this.searchParams).then((response)=>{
                    let resp = response.data;
                    if(resp.code === 0){
                        if(resp.data) {
                            this.seat = resp.data;
                            this.getSeatItem();
                        } else {
                            this.seat = {row: 0, col: 0};
                        }
                    }
                });
            },
            initSeatDetailList() {
                this.tableData = [];
                for(let i=1; i<=this.seat.row; i++) {
                    let item = {picked: []};
                    for(let j=1; j<=this.seat.col; j++) {
                        item.picked.push(this.isPicked(i, j));
                    }
                    this.tableData.push(item);
                }
                this.loading = false;
            },
            isPicked(row, col) {
                let result = 1;
                this.seatItemList.forEach(item => {
                    if(item.row === row && item.col === col) {
                        result =  0; // 已被占座
                    }
                });
                return result; // 未被占座
            },
            getSeatItem() {
                this.$ajax.post("/seat/getItemBySeatId", {id: this.seat.id}).then((response)=>{
                    let resp = response.data;
                    if(resp.code === 0){
                        this.seatItemList = resp.data;
                        this.initSeatDetailList();
                    } else {
                        this.$message.error(resp.msg);
                    }
                });
            },
            pickOrderSeat() {
                 if(this.pickSeatList.length === 0) {
                     this.$message.warning("請至少選擇一個座位!");
                     return false;
                 }
                 let seat = this.pickSeatList[0];
                 this.$confirm('確定要預(yù)約第'+ seat.row +'行第'+ seat.col +'列的座位?', '提示', {
                    confirmButtonText: '確定',
                    cancelButtonText: '取消',
                    type: 'warning'
                 }).then(() => {
                     this.$ajax.post("/seat/pick", {...seat, seatId: this.seat.id, userId: this.loginUser.id}).then((response)=>{
                         let resp = response.data;
                         if(resp.code === 0){
                             this.$message.success(resp.msg);
                             this.getSeatBySearch();
                             this.pickSeatList = [];
                         } else {
                             this.$message.error(resp.msg);
                         }
                     });
                 });
            },
            searchByTime() {
                this.$confirm('搜索將導致當前選中的記錄丟失,確認繼續(xù)此操作?', '提示', {
                    confirmButtonText: '確定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    this.pickSeatList = [];
                    this.getSeatBySearch();
                });
            },
            getAllScheduleList() {
                this.$ajax.post("/schedule/all").then((response)=>{
                    let resp = response.data;
                    if(resp.code === 0){
                        this.scheduleList = resp.data;
                        this.searchParams.scheduleId = this.scheduleList[0] ? this.scheduleList[0].id : '';
                        this.getSeatBySearch();
                    }
                });
            }
        }
    }
</script>

<style scoped>
    .user-search {
        margin-top: 20px;
    }
    /deep/ .el-table tbody tr:hover>td {
        background-color:unset !important
    }
</style>

2.借閱圖書業(yè)務(wù)邏輯代碼:

	/**
     * 借閱圖書操作
     * @param rentalItemDTO
     * @return
     */
    @Override
    public ResponseDTO<Boolean> rentalBook(RentalItemDTO rentalItemDTO) {
        // 進行統(tǒng)一表單驗證
        CodeMsg validate = ValidateEntityUtil.validate(rentalItemDTO);
        if(!validate.getCode().equals(CodeMsg.SUCCESS.getCode())){
            return ResponseDTO.errorByMsg(validate);
        }
        User user = userMapper.selectByPrimaryKey(rentalItemDTO.getUserId());
        if(user == null) {
            return ResponseDTO.errorByMsg(CodeMsg.USER_NOT_EXIST);
        }
        if (user.getCreditRate() < 80) {
            return ResponseDTO.errorByMsg(CodeMsg.CREDIT_RENTAL_ERROR);
        }
        Book book = bookMapper.selectByPrimaryKey(rentalItemDTO.getBookId());
        if(book == null) {
            return ResponseDTO.errorByMsg(CodeMsg.BOOK_NOT_EXIST);
        }
        if(CommonUtil.differentDaysByMillisecond(new Date(), rentalItemDTO.getPredictTime()) > 180) {
            return  ResponseDTO.errorByMsg(CodeMsg.BOOK_RENTAL_TIME_OVER);
        }
        // 修改圖書狀態(tài) 樂觀鎖控制
        BookExample bookExample = new BookExample();
        bookExample.createCriteria().andIdEqualTo(book.getId()).andVersionEqualTo(book.getVersion());
        book.setState(BookStateEnum.RENTAL.getCode());
        book.setVersion(book.getVersion() + 1);
        if(bookMapper.updateByExampleSelective(book, bookExample) == 0) {
            return ResponseDTO.errorByMsg(CodeMsg.BOOK_EDIT_ERROR);
        }
        // 寫入借閱詳情信息
        RentalItem rentalItem = CopyUtil.copy(rentalItemDTO, RentalItem.class);
        rentalItem.setId(UuidUtil.getShortUuid());
        rentalItem.setCreateTime(new Date());
        rentalItem.setBookName(book.getName());
        rentalItem.setBookPhoto(book.getPhoto());
        rentalItem.setState(RentalItemStateEnum.RENTAL.getCode());
        if(rentalItemMapper.insertSelective(rentalItem) == 0) {
            throw new RuntimeException(CodeMsg.BOOK_RENTAL_ERROR.getMsg());
        }
        return ResponseDTO.successByMsg(true, "借閱成功!");
    }

3.用戶登錄業(yè)務(wù)邏輯代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-425895.html

 	/**
     * 用戶登錄操作
     * @param userDTO
     * @return
     */
    @Override
    public ResponseDTO<UserDTO> login(UserDTO userDTO) {
        // 進行是否為空判斷
        if(CommonUtil.isEmpty(userDTO.getUsername())){
            return ResponseDTO.errorByMsg(CodeMsg.USERNAME_EMPTY);
        }
        if(CommonUtil.isEmpty(userDTO.getPassword())){
            return ResponseDTO.errorByMsg(CodeMsg.PASSWORD_EMPTY);
        }
        if(CommonUtil.isEmpty(userDTO.getCaptcha())){
            return ResponseDTO.errorByMsg(CodeMsg.CAPTCHA_EMPTY);
        }
        if(CommonUtil.isEmpty(userDTO.getCorrectCaptcha())){
            return ResponseDTO.errorByMsg(CodeMsg.CAPTCHA_EXPIRED);
        }
        // 比對驗證碼是否正確
        String value = stringRedisTemplate.opsForValue().get((userDTO.getCorrectCaptcha()));
        if(CommonUtil.isEmpty(value)){
            return ResponseDTO.errorByMsg(CodeMsg.CAPTCHA_EXPIRED);
        }
        if(!value.toLowerCase().equals(userDTO.getCaptcha().toLowerCase())){
            return ResponseDTO.errorByMsg(CodeMsg.CAPTCHA_ERROR);
        }
        // 對比昵稱和密碼是否正確
        UserExample userExample = new UserExample();
        // select * from user where username = ? and password = ?
        userExample.createCriteria().andUsernameEqualTo(userDTO.getUsername()).andPasswordEqualTo(userDTO.getPassword());
        List<User> userList = userMapper.selectByExample(userExample);
        if(userList == null || userList.size() != 1){
            return ResponseDTO.errorByMsg(CodeMsg.USERNAME_PASSWORD_ERROR);
        }
        // 生成登錄token并存入Redis中
        UserDTO selectedUserDto = CopyUtil.copy(userList.get(0), UserDTO.class);
        String token = UuidUtil.getShortUuid();
        selectedUserDto.setToken(token);
        //把token存入redis中 有效期1小時
        stringRedisTemplate.opsForValue().set("USER_" + token, JSON.toJSONString(selectedUserDto), 3600, TimeUnit.SECONDS);
        return ResponseDTO.successByMsg(selectedUserDto, "登錄成功!");
    }

到了這里,關(guān)于SpringBoot+Vue實現(xiàn)的高校圖書館管理系統(tǒng) 附帶詳細運行指導視頻的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 基于高校圖書館的用戶畫像、可視化、模型預(yù)測、推薦算法項目實現(xiàn)

    基于高校圖書館的用戶畫像、可視化、模型預(yù)測、推薦算法項目實現(xiàn)

    需要本項目的可以私信博主獲取源碼及項目?。?! 本研究基于高校圖書館的借閱信息、館藏圖書信息、讀者入館信息、用戶信息等多維度的數(shù)據(jù)表,首先將不同年份的數(shù)據(jù)拼接在一起,按照時間維度進行整合,并保證數(shù)據(jù)維度字段一致性。然后對數(shù)據(jù)進行清洗,其中包括空值

    2024年02月12日
    瀏覽(21)
  • Java 實現(xiàn)圖書館管理系統(tǒng)

    Java 實現(xiàn)圖書館管理系統(tǒng)

    目錄 一:創(chuàng)建對象 1.學生類對象Student?: 2.圖書類對象book : 3.管理員類對象OP: 二.創(chuàng)建主要交互界面MainMenu,并實現(xiàn)主界面功能 1.創(chuàng)建交互界面: 2.實現(xiàn)主界面功能: 三:創(chuàng)建OP管理界面: 1.創(chuàng)建主要交互界面及實現(xiàn)\\\"管理學生\\\"功能OPmenu: (1).交互界面: (2):實現(xiàn)\\\"管理學生\\\"功能: 2.實現(xiàn)\\\"管理

    2024年02月12日
    瀏覽(29)
  • 用C++實現(xiàn)圖書館管理系統(tǒng)

    該程序包含一個 `Book` 類,代表圖書館中的書籍,具有標題、作者、出版商、出版年份和可用性屬性。程序中還定義了一個 `bookList` 向量,用于存儲圖書館中的所有書籍。 程序的 `main` 函數(shù)通過循環(huán)顯示菜單,然后根據(jù)用戶的選擇調(diào)用相應(yīng)的函數(shù)。用戶可以選擇添加新書籍、

    2024年02月12日
    瀏覽(19)
  • 用C++實現(xiàn)一個圖書館管理系統(tǒng)

    用C++實現(xiàn)一個圖書館管理系統(tǒng)

    下圖為普通讀者的功能 下圖為圖書館管理員所擁有的功能 圖中所示功能均已實現(xiàn),不再一一展示,文末有項目源碼 1 、 用戶進入系統(tǒng) 用戶進入系統(tǒng)的前提是必須先登錄或者注冊 2、 不同身份有不同功能的使用權(quán) 普通讀者權(quán)限較小,圖書管理者擁有較高權(quán)限,還設(shè)有高級管

    2023年04月13日
    瀏覽(23)
  • 基于JAVA圖書館管理系統(tǒng)設(shè)計與實現(xiàn)

    基于JAVA圖書館管理系統(tǒng)設(shè)計與實現(xiàn)

    【后臺管理員功能】 廣告管理:設(shè)置小程序首頁輪播圖廣告和鏈接 留言列表:所有用戶留言信息列表,支持刪除 會員列表:查看所有注冊會員信息,支持刪除 資訊分類:錄入、修改、查看、刪除資訊分類 錄入資訊:錄入資訊標題、內(nèi)容等信息 管理資訊:查看已錄入資訊列

    2024年02月13日
    瀏覽(31)
  • 學校圖書館管理系統(tǒng)的架構(gòu)設(shè)計與實現(xiàn)

    學校圖書館管理系統(tǒng)的架構(gòu)設(shè)計與實現(xiàn)

    隨著大學生越來越多,學校圖書館的管理變得愈發(fā)復雜。為了更好地管理和服務(wù)于學生和教職工,學校需要建立一個高效的圖書館管理系統(tǒng)。本文將介紹學校圖書館管理系統(tǒng)的架構(gòu)設(shè)計與實現(xiàn)。 1. 架構(gòu)設(shè)計 學校圖書館管理系統(tǒng)的架構(gòu)設(shè)計主要分為三個部分: 展示層:展示層

    2024年02月22日
    瀏覽(29)
  • 基于SpringBoot+Vue+uniapp微信小程序的圖書館自習室座位預(yù)約管理的詳細設(shè)計和實現(xiàn)

    基于SpringBoot+Vue+uniapp微信小程序的圖書館自習室座位預(yù)約管理的詳細設(shè)計和實現(xiàn)

    ?? 博主介紹 :?全網(wǎng)粉絲10W+,CSDN特邀作者、博客專家、CSDN新星計劃導師、全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優(yōu)質(zhì)作者、專注于Java、小程序技術(shù)領(lǐng)域和畢業(yè)項目實戰(zhàn)??? ???? 精彩專欄 推薦訂閱 ???? 2023-2024年最值得選的微信小程序畢業(yè)設(shè)

    2024年04月25日
    瀏覽(24)
  • 【HTML】原生js實現(xiàn)的圖書館管理系統(tǒng)

    【HTML】原生js實現(xiàn)的圖書館管理系統(tǒng)

    1、引言 設(shè)計結(jié)課作業(yè),課程設(shè)計無處下手,網(wǎng)頁要求的總數(shù)量太多?沒有合適的模板?數(shù)據(jù)庫,java,python,vue,html作業(yè)復雜工程量過大?畢設(shè)毫無頭緒等等一系列問題。你想要解決的問題,在微信公眾號“coding加油站”中全部會得到解決 2、作品介紹 原生js實現(xiàn)的圖書館管理

    2024年02月06日
    瀏覽(22)
  • 33基于Java簡單實現(xiàn)圖書館借書管理系統(tǒng)設(shè)計與實現(xiàn)

    33基于Java簡單實現(xiàn)圖書館借書管理系統(tǒng)設(shè)計與實現(xiàn)

    本章節(jié)給大家介紹一個基于Java簡單實現(xiàn)圖書館借書管理系統(tǒng)的設(shè)計與實現(xiàn) 項目總體分為倆種角色,分別是管理員和閱讀者,管理員可以登錄系統(tǒng)中,進行圖書管理,上架下架圖書,對用戶進行管理、對讀者進行管理、查看借閱記錄管理等,讀者角色可以登錄系統(tǒng)查詢圖書信息

    2024年02月03日
    瀏覽(26)
  • Java連接數(shù)據(jù)庫實現(xiàn)圖書館管理系統(tǒng)(詳細教程)

    Java連接數(shù)據(jù)庫實現(xiàn)圖書館管理系統(tǒng)(詳細教程)

    該功能用到的軟件為 IDEA 、Navicat 、云服務(wù)器(非必須) 源碼下載 https://www.aliyundrive.com/s/UTz8pNxobGK 在自己的服務(wù)器或者電腦本機安裝數(shù)據(jù)庫系統(tǒng),本次系統(tǒng)演示的數(shù)據(jù)庫版本為5.6。 1.創(chuàng)建圖書管理數(shù)據(jù)庫library 字符集為:utf8 -utf8_general_ci 2.設(shè)計好將要使用的sql語句 視圖、存儲

    2024年02月06日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包