記《高校考勤系統》小程序(2)

這是其餘幾篇的地址:
記《高校考勤系統》小程序(1)
記《高校考勤系統》小程序(2)
記《高校考勤系統》小程序(3)
html

前面講了用戶註冊和首頁天氣功能,下面講講課程表頁的實現.

五.課程表頁

  • 這裏參考了簡書上面 軒轅夜空 位做者的案例,以及其參考 極樂叔 的課程表的思路.
  • 一樣製做課程表須要用到雲開發來存儲數據,以及結合雲函數對數據的修改,後面會講到爲何要用到雲函數.

先來看看完成後的效果圖

  • 1.先搭建總體結構
    • 頭部和左側由於樣式是同樣的,能夠將數據寫入data中,再經過for循環渲染出來,這裏就直接展現了.(偷個懶😊😊)
    <!-- 星期 -->
    <view class="top">  
        <view class="top-text">
            <text>節\日</text>
        </view>
        <view class="top-text">
            <text>一</text>
        </view>
        <view class="top-text">
            <text>二</text>
        </view>
        <view class="top-text">
            <text>三</text>
        </view>
        <view class="top-text">
            <text>四</text>
        </view>
        <view class="top-text">
            <text>五</text>
        </view>
        <view class="top-text">
            <text>六</text>
        </view>
        <view class="top-text">
            <text>日</text>
        </view>
    </view>
    <!-- 課程 -->
    <view class="cont">
        <view class="cont-left">
            <view class="left"> 1 </view>
            <view class="left"> 2 </view>
            <view class="left"> 3 </view>
            <view class="left"> 4 </view>
            <view class="left"> 5 </view>
            <view class="left"> 6 </view>
            <view class="left"> 7 </view>
            <view class="left"> 8 </view>
        </view>
        <view class="cont-right">
        </view>
    </view>
    <view class="bottom">
        ————<text>讀萬卷書 行萬里路</text>————
    </view>
    複製代碼
    點擊查看wxss代碼
    page {
        width: 100%;
        height: 100%;
        position: relative;
    }
    .top {
        padding: 16rpx 0;
        border-top: 1px solid #e9e9e9;
        border-bottom: 1px dashed #d3d3d3;
        display: flex;
        justify-content: flex-start;
    }
    .top-text {
        width: 12.5%;
        text-align: center;
        font-size: 32rpx;
        font-weight: 600;
        align-items: center;
    }
    .top .top-text {
        border-left: 1px dashed #d3d3d3;
    }
    .top .top-text:nth-child(1) {
        font-size: 24rpx;
        border-left: none;
        line-height: 46rpx;
    }
    .cont {
        display: flex;
        justify-content: start;
    }
    .cont-left {
        display: inline-block;
    }
    .left {
        width: 90rpx;
        height: 120rpx;
        justify-content: center;
        display: flex;
        align-items: center;
        border-bottom: 1px dashed #d3d3d3;
        box-sizing: border-box;
        color: #666;
        font-size: 28rpx;
        font-weight: 600;
    }
    .cont-right {
        width: calc(100% - 90rpx);
    }
    .bottom {
        width: 100%;
        text-align: center;
        position: absolute;
        bottom: 20rpx;
        font-size: 24rpx;
        color: #ddd;
        display: inline-block;
    }
    .bottom text {
        margin-left: 20rpx;
        margin-right: 20rpx;
        color: #9b9b9b;
    }
    複製代碼

  • 2.結合雲開發編寫課程表.
    • 這裏須要考慮到雲開發中單次獲取數據上限是20條,因此我將課程表數據分爲兩部分(上午和下午),固然你能夠直接使用雲函數來提升獲取數據的上限,在後面會有介紹,這裏就先不作過多的解釋了,上代碼.

    單個數據結構數據庫

    {
        //"_id": "296065c95da529b2055b57301b5afa75",  雲開發導入數據會直接生成_id,這裏不用本身編寫
        "data_name": "Java高級開發技術(JavaEE)",  //課程名
        "address": "@康莊行知樓301",              //地點
        "weekNum": "10-15周",                     //週數
        "pitchNum": "3-4",                        //節數
        "teacher": "趙老師",                      //任課老師
        "_openid": "oQnNa5NJfKqSZntKFLGZWnZuXNbo"  //修改者的openid,原本是想作判斷,後面使用了雲函數,發現無關緊要
    }
    複製代碼
    • 下面是從雲開發數據庫中獲取咱們編寫好的課程表數據,若是對操做不熟悉能夠查看 官方文檔 .
      1.打開雲開發控制檯.
      2.建立兩個集合對應上午下午課程表.
      3.導入咱們已經編寫好的數據 (一個星期早上和下午的課程分別爲14節,因此導入數據時須要注意,若是想要當前課程沒有信息,也是須要導入空的字段數據來佔一格).
      4.打開權限管理.
      5.選中第一個.
    • 其中最後兩個步驟必定不能忘記!

    點擊查看js代碼
    data: {
        colorArr: ["rgb(229,188,76, 0.8)", "rgb(104,172,246, 0.8)", "rgb(183,135,242, 0.8)", "rgb(149,226,48, 0.8)", "#ff7070",
            "#e54d42", "#0081ff", "#7DC67D", "#E17572", "#C35CFF", "#33BCBA", "#FF8533", "#6E6E6E", "#ebd4ef",
            "#428BCA", "#39b54a", "#FF674F", "#e03997", "#00CED1", "#9F79EE", "#FFC125", "#32CD32", "#00BFFF", "#8799a3","#FF69B4"
        ],
        // 存儲隨機顏色
        randomColorArr: [],
        randomColorArr2: [],
        i: 25,
        random: '',
        random2: '',
    },
    onLoad: function(options) {
        this.data.randomColorArr = [] // 重置顏色數組1爲空
        this.data.randomColorArr2 = [] // 重置顏色數組2爲空
        const db = wx.cloud.database({
            env: '*****'  //你的雲開發環境名
        })
    
        //獲取課程表上午數據
        db.collection('數據集合中你的表名').get().then((res) => {
            this.kechengbiao = res.data
            for (let j = 0; j <= 13; j++) { //for循環判斷課名和地名爲空則不加顏色
                if (this.kechengbiao[j].data_name == '' && this.kechengbiao[j].address == '') {
                    this.random = 'none'
                    this.data.randomColorArr.push(this.random)
                } else {
                    this.random = this.data.colorArr[Math.floor(Math.random() * this.data.i)] //隨機顏色
                    this.data.randomColorArr.push(this.random)
                }
            }
            this.setData({
                loding: true,
                kechengbiao: this.kechengbiao,
                randomColorArr: this.data.randomColorArr
            })
        })
        //獲取課程表下午
        db.collection('數據集合中你的表名').get().then((res) => {
            this.kechengbiao2 = res.data
            for (let j = 0; j <= 13; j++) { //for循環判斷課名和地名爲空則不加顏色
                if (this.kechengbiao2[j].data_name == '' && this.kechengbiao2[j].address == '') {
                    this.random2 = 'none'
                    this.data.randomColorArr2.push(this.random2)
                } else {
                    this.random2 = this.data.colorArr[Math.floor(Math.random() * this.data.i)] //隨機顏色
                    this.data.randomColorArr2.push(this.random2)
                }
            }
            this.setData({
                kechengbiao2: this.kechengbiao2,
                randomColorArr2: this.data.randomColorArr2
            })
        })
    },
    複製代碼
    <view class="cont-right">
        <view>
            <view class='appointent-date'>  //上午
                <view class="appointent-date-div" bindtap="select_date" wx:for="{{kechengbiao}}" wx:key="{{index}}" data-key='{{index}}' style="background-color:{{randomColorArr[index]}}">
                    <view class="flex-item" >
                        <text class='data_name'>{{item.data_name}}</text>
                        <text class='address'>{{item.address}}</text>
                    </view>
                </view>
            </view>
            <view class='appointent-date'>  //下午
                <view class="appointent-date-div" bindtap="select_date2" wx:for="{{kechengbiao2}}" wx:key="{{index}}" data-key='{{index}}' style="background-color:{{randomColorArr2[index]}}">
                    <view class="flex-item">
                        <text class='data_name'>{{item.data_name}}</text>
                        <text class='address'>{{item.address}}</text>
                </view>
            </view>
        </view>
    </view>
    複製代碼
    點擊查看wxss代碼
    .appointent-date {
        display: flex;
        justify-content: space-around;
        flex-wrap: wrap;
    }
    .appointent-date-div {
        height: 236rpx;
        border-radius: 10rpx;
        margin-bottom: 6rpx;
        color: white;
    }
    .flex-item {
        display: flex;
        justify-content: flex-start;
        flex-direction: column;
        width: 76rpx;
        height: 212rpx;
        font-size: 24rpx;
        padding: 6rpx;
        border: 1rpx solid transparent;
        text-align: left;
        border-radius: 10rpx;
        cursor: pointer;
        overflow: hidden;
    }
    .data_name {
        display: inline-block;
    }
    .address {
        display: inline-block;
    }
    複製代碼

  • 3.對課程實現增刪改查
    • 首先來作最簡單的 吧,咱們須要在for循環中加入 data-='{{index}}' ,如上代碼所示👆我加了data-key='{{index}}',其中key能夠自定義,目的是爲了在點擊課程時,能夠獲取相循環中對應的下標,這樣我就能夠在數據庫中搜索到當前點擊的數據並渲染出來.

    //點擊課程內容彈出詳細框
    select_date: function(e) {
      this.id = e.currentTarget.dataset.key //獲取當前點擊課程的下標
      const db = wx.cloud.database({
        env: '****'
      })
      db.collection('***').get().then(res => {
        console.log(res.data[this.id])   //獲取點擊時課程表數據
      })
    },
    複製代碼

    • 獲取到數據後咱們能夠根據本身的需求渲染在頁面上,這裏我結合了vant的tab組件,左上角爲返回,右上角爲刪除課程表信息,下面就講 除課程信息.
    • 這裏的刪除不是說真的將數據從咱們的數據庫中刪除,而是將數據賦值爲「」也就是空值,這樣就作到了刪除的功能,在此結合 雲函數 來實現,由於雲開發中的操做權限沒法知足咱們對數據操做的要求.

    首先咱們在雲函數中建立一個新的 雲函數 ,修改index.js文件小程序

    • 這裏會有一個問題也就是爲何咱們要使用雲函數,而不直接用雲開發對數據進行處理,是由於雲開發中的操做權限只能對本身提交到數據庫中的數據進行修改,若是是別人那麼就沒法修改.正常狀況下,管理員確定不止一位,因此對數據操做不能只限定一我的.
    //修改課程表
    const cloud = require('wx-server-sdk')
    cloud.init({
        env: '***',//你的開發環境
        traceUser: true
    })
    const db = cloud.database();
    exports.main = async (event, context) => { // 雲函數入口函數
        try {
            return await db.collection('***').doc(event.id).update({  //須要修改的數據庫
                data: {
                    data_name: event.data_name,
                    address: event.address,
                    weekNum: event.weekNum,
                    pitchNum: event.pitchNum,
                    teacher: event.teacher
              },
            })
        } catch (e) {
            console.error(e)
        }
        return {
            event,
            openid: wxContext.OPENID,
            appid: wxContext.APPID,
            unionid: wxContext.UNIONID,
        }
    }
    複製代碼

    而後在js文件中編寫對應的代碼數組

    tapDialogButton(e) { //從課表刪除課程
        wx.cloud.callFunction({
            name: '***',// 你的雲函數名稱
            data: {
              id: this._id,  //將數據進行空值賦值
              data_name: "",
              address: "",
              weekNum: "",
              pitchNum: "",
              teacher: ""
            },
            success: res => {
              // 關閉當前點擊課程詳情
            }
        })
    },
    複製代碼

    改,增

    • 作完了刪其實對改和增的實現應該也變得相對簡單,這裏也是須要用到雲函數,道理和上面講的一致.
    • 在獲取當前點擊的數據時先將此條數據存儲在 data 中,須要修改時,能夠將數據賦值給 inputvalue ,在經過雲函數來修改數據庫中對應的數據.增也是一樣的道理.這裏就拿改成例.

    wxml數據結構

    <!-- 編輯頁 -->
    <view class="edit" hidden="{{ editShow }}">
        <van-nav-bar title="編輯課程" right-text="完成" left-arrow bind:click-left="editLeft" bind:click-right="editRight" />
        <view class="label className">
            <text>課名</text>
            <input  value="{{ nowClass.data_name }}" bindinput="bindKeyInput1"></input>
        </view>
        <view class="label">
            <text>教室</text>
            <input  value="{{ nowClass.address }}" bindinput="bindKeyInput2"></input>
        </view>
        <view class="label">
            <text>週數</text>
            <input  value="{{ nowClass.weekNum }}" bindinput="bindKeyInput3"></input>
        </view>
        <view class="label">
            <text>節數</text>
            <input  value="{{ nowClass.pitchNum }}" bindinput="bindKeyInput4"></input>
        </view>
        <view class="label">
            <text>老師</text>
            <input  value="{{ nowClass.teacher }}" bindinput="bindKeyInput5"></input>
        </view>
    </view>
    複製代碼

    新建修改課程表數據的雲函數app

    //修改課程表
    const cloud = require('wx-server-sdk')
    cloud.init({
        env: '***',//你的開發環境
        traceUser: true
    })
    const db = cloud.database();
    exports.main = async (event, context) => { // 雲函數入口函數
        try {
            return await db.collection('***').doc(event.id).update({  //你要操做的數據庫
                data: {
                    data_name: event.data_name,
                    address: event.address,
                    weekNum: event.weekNum,
                    pitchNum: event.pitchNum,
                    teacher: event.teacher
                },
            })
        } catch (e) {
            console.error(e)
        }
        return {
            event,
            openid: wxContext.OPENID,
            appid: wxContext.APPID,
            unionid: wxContext.UNIONID,
        }
    }
    複製代碼

    jsdom

    //  1.首先獲取輸入框的值,存在data中
    bindKeyInput1(e) { //課名
        this.editClassName = e.detail.value
    },
    bindKeyInput2(e) { //教室
        this.editAddress = e.detail.value
    },
    bindKeyInput3(e) { //週數
        this.editWeekNum = e.detail.value
    },
    bindKeyInput4(e) { //節數
        this.editPitchNum = e.detail.value
    },
    bindKeyInput5(e) { //老師
        this.editTeacher = e.detail.value
    },
    editRight() { //  2.編輯完成,點擊提交按鈕時將輸入框的值賦值給對應的字段名
      wx.cloud.callFunction({
        name: '***',// 修改課程表數據的雲函數名稱
        data: {
          id: this._id,
          data_name: this.editClassName,
          address: this.editAddress,
          weekNum: this.editWeekNum,
          pitchNum: this.editPitchNum,
          teacher: this.editTeacher
        },
        success: res => {
        },
        fail: console.error
      })
    
    },
    複製代碼

到這裏課程表功能就作完了,若是有什麼不懂得地方歡迎留言,或者寫的很差的地方,請你們指出一塊兒探討,以後會繼續分享後面的內容。你們也能夠提早掃碼查看小程序,歡迎指出不足,謝謝 🌞😃😃😃

相關文章
相關標籤/搜索