家庭记账本小程序开发第四天

今天对家庭记账本添加了删除功能,并对账单页面的格局进行了改动,我觉得变得更好看了。

连接了Java后台数据库。

起初遇到的问题是想实现左滑删除这一事件,尝试了Slideview组件和利用touch事件进行,但没有取得很好的进展,于是我在查看别人的案例的时候,尝试了使用movable-view组件和删除按钮绑定事件,最后成功了。

如下图:

 

改动后的js

// pages/B/index.js
const app = getApp()
Page({

  /**
   * 页面的初始数据
   */
  data: {
    date:'',
    money:'',
    type:'',
    style:'',
    ty:[{}],

  },
  onLoad: function (option) {
    var that = this;
    wx.request({
      url: 'http://localhost:8080/Tally/WXServletShow',
      data: {
        username: '刘子煜',
        password: '123'
      },
      method: 'POST',
      header: {
        //'content-type': 'application/json' // 默认值
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      success: function (res) {
        console.log(res.data);
        var ty1 = res.data.data;
        that.setData({
          ty: ty1

        });
        // console.log(ty[0].date);
      },
      fail: function (res) {
        console.log(".....fail.....");
      }
    })

    console.log(option.query)
    const eventChannel = this.getOpenerEventChannel()
    eventChannel.emit('acceptDataFromOpenedPage', { data: 'test' });
    eventChannel.emit('someEvent', { data: 'test' });
    // 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
    eventChannel.on('acceptDataFromOpenerPage', function (data) {
      console.log(data)
    })
  },
  delete: function(e){
    console.log(e)
  },

  /**
   * 显示删除按钮
   */
  showDeleteButton: function (e) {
    let productIndex = e.currentTarget.dataset.productindex
    this.setXmove(productIndex, -65)
  },

  /**
   * 隐藏删除按钮
   */
  hideDeleteButton: function (e) {
    let productIndex = e.currentTarget.dataset.productindex

    this.setXmove(productIndex, 0)
  },

  /**
   * 设置movable-view位移
   */
  setXmove: function (productIndex, xmove) {
    let ty = this.data.ty
    ty[productIndex].xmove = xmove

    this.setData({
      ty: ty
    })
  },

  /**
   * 处理movable-view移动事件
   */
  handleMovableChange: function (e) {
    if (e.detail.source === 'friction') {
      if (e.detail.x < -30) {
        this.showDeleteButton(e)
      } else {
        this.hideDeleteButton(e)
      }
    } else if (e.detail.source === 'out-of-bounds' && e.detail.x === 0) {
      this.hideDeleteButton(e)
    }
  },

  /**
   * 处理touchstart事件
   */
  handleTouchStart(e) {
    this.startX = e.touches[0].pageX
  },

  /**
   * 处理touchend事件
   */
  handleTouchEnd(e) {
    if (e.changedTouches[0].pageX < this.startX && e.changedTouches[0].pageX - this.startX <= -30) {
      this.showDeleteButton(e)
    } else if (e.changedTouches[0].pageX > this.startX && e.changedTouches[0].pageX - this.startX < 30) {
      this.showDeleteButton(e)
    } else {
      this.hideDeleteButton(e)
    }
  },

  /**
   * 删除产品
   */
  handleDeleteProduct: function ({ currentTarget: { dataset: { date ,money ,type,style} } }) {
    let ty = this.data.ty
    let productIndex = ty.findIndex(item => item.date === date)

    ty.splice(productIndex, 1)

    this.setData({
      ty
    })
    if (ty[productIndex]) {
      this.setXmove(productIndex, 0)
    }
    console.log({ currentTarget: { dataset: { date, money, type, style} } })
    var that = this;
    wx.request({
      url: 'http://localhost:8080/Tally/WXServletDelete',
      data: {
        index: that.data.index,
        date: { currentTarget: { dataset: { date, money, type, style } } }.currentTarget.dataset.date,
        money: { currentTarget: { dataset: { date, money, type, style } } }.currentTarget.dataset.money,
        type: { currentTarget: { dataset: { date, money, type, style } } }.currentTarget.dataset.type,
        style: { currentTarget: { dataset: { date, money, type, style } } }.currentTarget.dataset.style
      },
      method: 'POST',
      header: {
        //'content-type': 'application/json' // 默认值
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      success: function (res) {
        console.log(res.data);
        wx.showToast({
          title: '删除成功!',
        })
        that.setData({
          error: ""
        })
      },
      fail: function (res) {
        console.log(".....fail.....");
        // that.setData({
        //   error: res.data.msg
        // });
      }
    })
  },
})

改动后的wxml:

<!--pages/B/index.wxml-->
<view class="container">
<view class="product-list">
<view wx:for="{{ty}}" wx:for-index="index" wx:key="{{item.date}}" class="product-item">
<movable-area>
<movable-view out-of-bounds="true" direction="horizontal" x="{{item.xmove}}" 
inertia="true"
data-productIndex="{{index}}"
bindtouchstart="handleTouchStart"
bindtouchend="handleTouchEnd"
bindchange="handleMovableChange">

<view class="product-item-wrap bg-g" wx:if="{{index % 2 == 0}}">
<view class="product-movable-item">
<view class="product-movable-item-style">{{item.style}}</view>
<view class="product-movable-item-date">{{item.date}}</view>
</view>
<view class="product-movable-item product-movable-item-amount">
<text class="type">{{item.type}}</text>
<text class="money">{{item.money}}</text>
</view>
</view>

<view class="product-item-wrap" wx:else>
<view class="product-movable-item">
<view class="product-movable-item-style">{{item.style}}</view>
<view class="product-movable-item-date">{{item.date}}</view>
</view>
<view class="product-movable-item product-movable-item-amount">
<text class="type">{{item.type}}</text>
<text class="money">{{item.money}}</text>
</view>
</view>
</movable-view>
</movable-area>
<view class="delete-btn" data-date="{{item.date}}" data-money="{{item.money}}" data-type="{{item.type}}"  data-style="{{item.style}}"       bindtap="handleDeleteProduct">删除</view>
</view>
</view>
</view>

改动后的wxss:

/* pages/B/index.wxss */
.bg-g{
  background: #E6F3F9;
}
.product-list .product-item {
  position: relative;
  width: 100vw;
  border-bottom: 2rpx solid #E9E9E9;
  box-sizing: border-box;
  background: #fff;
  z-index: 999;
}

.product-list .product-item movable-area {
  height: 120rpx;
  width: calc(100vw - 120rpx);
}

.product-list .product-item movable-view {
  height: 120rpx;
  width: 100vw;
  background: #fff;
  z-index: 999;
}

.product-list .product-item .delete-btn {
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0; 
  width: 120rpx;
  font-family: PingFangSC-Regular;
  font-size: 24rpx;
  color: #FFFFFF;
  line-height: 120rpx;
  z-index: 1;
  background: #E66671;
  text-align: center;
}

.product-list .product-item-wrap {
  position: relative;
  display: flex;
  align-items: center;
  padding: 8rpx 0 20rpx 20rpx;
  box-sizing: border-box;
}

.product-list .product-item-wrap .product-movable-item {
  flex: 1;
  overflow: hidden;
}

.product-list .product-item-wrap .product-movable-item-style {
  font-family: PingFangSC-Regular;
  font-size: 28rpx;
  color: #71747A;
  line-height: 60rpx;
  margin-right: 10rpx;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.product-list .product-item-wrap .product-movable-item-date {
  font-family: PingFangSC-Regular;
  font-size: 24rpx;
  color: #969AA3;
}

.product-list .product-item-wrap .product-movable-item-amount {
  flex: 0 0 auto;
  padding-right: 80rpx;
  position: relative;
}

.product-list .product-item-wrap .product-movable-item-amount .type {
  width: 120rpx;
  font-size: 28rpx;
  color: #383A3D;
  line-height: 60rpx;
}

.product-list .product-item-wrap .product-movable-item-amount .money {
  position: absolute;
  top: 0;
  right: 30rpx;
  font-size: 28rpx;
  color: #969AA3;
  line-height: 60rpx;
}

新增的删除servlet:

package controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;

import java.io.PrintWriter;
import java.io.Writer;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import dao.deletedao;
import bean.tally;
import util.DBUtil;

/**
 * Servlet implementation class WXServletDelete
 */
@WebServlet("/WXServletDelete")
public class WXServletDelete extends HttpServlet {
    private static final long serialVersionUID = 1L;
//       用于删除
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WXServletDelete() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求编码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        /* 设置响应头允许ajax跨域访问 */
        response.setHeader("Access-Control-Allow-Origin", "*");
        /* 星号表示所有的异域请求都可以接受, */
        response.setHeader("Access-Control-Allow-Methods", "GET,POST");

        tally tally = new tally();
        //获取微信小程序get的参数值并打印
        String date = request.getParameter("date");
        String money=request.getParameter("money");
        String type=request.getParameter("type");
        String style=request.getParameter("style");
        tally.setDate(request.getParameter("date"));
        tally.setMoney(request.getParameter("money"));
        tally.setType(request.getParameter("type"));
        tally.setStyle(request.getParameter("style"));
        System.out.println("date="+tally.getDate()+" ,money="+tally.getMoney()+",type="+tally.getType()+",style="+tally.getStyle());
        Connection conn = DBUtil.getConn();
        Statement state = null;
        ResultSet rs = null;
        deletedao sd = new deletedao();
        
        try {
            state = conn.createStatement();
            sd.delete(date,money,type,style);
            
          //转成json数据
            Map<String, Object> result = new HashMap<String, Object>();
           
            result.put("data", tally);
            result.put("msg", "删除成功");
            
            //使用Gson类需要导入gson-2.8.0.jar
            String json = new Gson().toJson(result);

            //返回值给微信小程序
            Writer out = response.getWriter();
            out.write(json);
            out.flush();
        }catch(Exception e) {
            System.out.println("删除失败");
            e.printStackTrace();
        }
        
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

新增的删除dao:

package dao;
import java.sql.Connection;
import java.sql.SQLException;

import com.mysql.jdbc.PreparedStatement;
import util.DBUtil;
public class deletedao {
    Connection conn = DBUtil.getConn(); //连接数据库
    
    public boolean delete(String date,String money,String type,String style) {
        boolean flag=false;
        try {
            String sql="delete from tally where date='"+date+"' and money='"+money+"' and type='"+type+"' and style='"+style+"'";
            PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);
            int i = pstmt.executeUpdate();
            pstmt.close();
            conn.close();
            if(i>0) flag = true;
        }catch(SQLException e) {
            System.out.println("删除失败");    
            e.printStackTrace();
        }

        return flag;

        }
}

 

posted @ 2020-02-08 17:51  ziyuliu  阅读(206)  评论(0编辑  收藏  举报