宠物门店小程序源码 宠物门店小程序源码怎么弄

小编 10-02 9

创建一个宠物门店小程序需要考虑多个方面,包括用户界面设计、功能实现、数据库设计、安全性等,以下是一个简单的宠物门店小程序的源码示例,使用微信小程序框架进行开发。

宠物门店小程序源码 宠物门店小程序源码怎么弄

1. 小程序配置文件(app.json)

{
  "pages": [
    "pages/index/index",
    "pages/products/products",
    "pages/details/details",
    "pages/cart/cart",
    "pages/orders/orders",
    "pages/profile/profile"
  ],
  "window": {
    "navigationBarTitleText": "宠物门店",
    "navigationBarBackgroundColor": "#ffffff",
    "navigationBarTextStyle": "black"
  },
  "style": "v2",
  "sitemapLocation": "sitemap.json"
}

2. 首页(pages/index/index.wxml)

<view class="container">
  <view class="banner">
    <image src="/images/banner.jpg" mode="aspectFill"></image>
  </view>
  <view class="category">
    <view class="category-item" wx:for="{{categories}}" wx:key="id" data-id="{{item.id}}" bindtap="goToProducts">
      <image src="{{item.image}}" mode="aspectFill"></image>
      <text>{{item.name}}</text>
    </view>
  </view>
</view>

3. 首页样式(pages/index/index.wxss)

.container {
  padding: 20px;
}
.banner image {
  width: 100%;
  height: auto;
}
.category {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}
.category-item {
  width: 48%;
  margin-bottom: 10px;
}
.category-item image {
  width: 100%;
  height: auto;
}

4. 产品列表页面(pages/products/products.wxml)

<view class="container">
  <view class="product-list">
    <view class="product-item" wx:for="{{products}}" wx:key="id" data-id="{{item.id}}" bindtap="goToDetails">
      <image src="{{item.image}}" mode="aspectFill"></image>
      <text>{{item.name}}</text>
      <text>¥{{item.price}}</text>
    </view>
  </view>
</view>

5. 产品列表样式(pages/products/products.wxss)

.container {
  padding: 20px;
}
.product-list {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}
.product-item {
  width: 48%;
  margin-bottom: 10px;
  padding: 10px;
  background-color: #f8f8f8;
  border-radius: 10px;
}
.product-item image {
  width: 100%;
  height: auto;
}

6. 产品详情页面(pages/details/details.wxml)

<view class="container">
  <view class="product-detail">
    <image src="{{product.image}}" mode="aspectFill"></image>
    <text>{{product.name}}</text>
    <text>¥{{product.price}}</text>
    <button bindtap="addToCart">加入购物车</button>
  </view>
</view>

7. 产品详情样式(pages/details/details.wxss)

.container {
  padding: 20px;
}
.product-detail {
  padding: 20px;
  background-color: #f8f8f8;
  border-radius: 10px;
}
.product-detail image {
  width: 100%;
  height: auto;
}

8. 购物车页面(pages/cart/cart.wxml)

<view class="container">
  <view class="cart-list">
    <view class="cart-item" wx:for="{{cart}}" wx:key="id">
      <image src="{{item.image}}" mode="aspectFill"></image>
      <text>{{item.name}}</text>
      <text>¥{{item.price}}</text>
      <view class="cart-quantity">
        <button bindtap="decreaseQuantity" data-id="{{item.id}}">-</button>
        <text>{{item.quantity}}</text>
        <button bindtap="increaseQuantity" data-id="{{item.id}}">+</button>
      </view>
    </view>
  </view>
  <view class="cart-total">
    <text>总计:¥{{total}}</text>
    <button bindtap="goToOrders">去结算</button>
  </view>
</view>

9. 购物车样式(pages/cart/cart.wxss)

.container {
  padding: 20px;
}
.cart-list {
  margin-bottom: 50px;
}
.cart-item {
  display: flex;
  align-items: center;
  padding: 10px;
  background-color: #f8f8f8;
  border-radius: 10px;
  margin-bottom: 10px;
}
.cart-item image {
  width: 60px;
  height: 60px;
  margin-right: 10px;
}
.cart-quantity {
  display: flex;
  align-items: center;
  margin-left: auto;
}
.cart-quantity button {
  margin: 0 5px;
}
.cart-total {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 10px;
  background-color: #ffffff;
  text-align: right;
}
.cart-total button {
  margin-left: 10px;
}

10. 订单页面(pages/orders/orders.wxml)

<view class="container">
  <view class="order-form">
    <view class="form-group">
      <text>收货人:</text>
      <input type="text" placeholder="请输入收货人姓名" value="{{order.name}}" bindinput="onNameInput"/>
    </view>
    <view class="form-group">
      <text>联系电话:</text>
      <input type="text" placeholder="请输入联系电话" value="{{order.phone}}" bindinput="onPhoneInput"/>
    </view>
    <view class="form-group">
      <text>收货地址:</text>
      <input type="text" placeholder="请输入收货地址" value="{{order.address}}" bindinput="onAddressInput"/>
    </view>
    <button bindtap="submitOrder">提交订单</button>
  </view>
</view>

11. 订单样式(pages/orders/orders.wxss)

.container {
  padding: 20px;
}
.order-form {
  padding: 20px;
  background-color: #f8f8f8;
  border-radius: 10px;
}
.form-group {
  display: flex;
  align-items: center;
  margin-bottom: 10px;
}
.form-group text {
  width: 80px;
}
.form-group input {
  flex: 1;
  padding: 10px;
  background-color: #ffffff;
  border-radius: 5px;
  border: 1px solid #cccccc;
}

12. 用户信息页面(pages/profile/profile.wxml)

<view class="container">
  <view class="user-info">
    <text>您好,{{userInfo.name}}</text>
  </view>
</view>

13. 用户信息样式(pages/profile/profile.wxss)

.container {
  padding: 20px;
}
.user-info {
  padding: 20px;
  background-color: #f8f8f8;
  border-radius: 10px;
  text-align: center;
}

14. 小程序逻辑(pages/index/index.js)

Page({
  data: {
    categories: [
      { id: 1, name: '宠物食品', image: '/images/category1.jpg' },
      { id: 2, name: '宠物用品', image: '/images/category2.jpg' }
    ]
  },
  onLoad: function() {
    this.getProducts();
  },
  getProducts: function() {
    const products = [
      { id: 1, name: '猫粮', price: 100, image: '/images/product1.jpg' },
      { id: 2, name: '狗粮', price: 120, image: '/images/product2.jpg' }
    ];
    this.setData({ products });
  },
  goToProducts: function(e) {
    const categoryId = e.currentTarget.dataset.id;
    wx.navigateTo({
      url: /pages/products/products?id=${categoryId}
    });
  }
});

15. 产品列表逻辑(pages/products/products.js)

Page({
  data: {
    products: []
  },
  onLoad: function(options) {
    this.getProducts(options.id);
  },
  getProducts: function(categoryId) {
    const products = [
      { id: 1, name: '猫粮', price: 100, image: '/images/product1.jpg' },
      { id: 2, name: '狗粮', price: 120, image: '/images/product2.jpg' }
    ].filter(item => item.id === categoryId);
    this.setData({ products });
  },
  goToDetails: function(e) {
    const productId = e.currentTarget.dataset.id;
    wx.navigateTo({
      url: /pages/details/details?id=${productId}
    });
  }
});

16. 产品详情逻辑(pages/details/details.js)

Page({
  data: {
    product: {}
  },
  onLoad: function(options) {
    this.getProduct(options.id);
  },
  getProduct: function(productId) {
    const product = {
      id: 1,
      name: '猫粮',
      price: 100,
      image: '/images/product1.jpg'
    };
    this.setData({ product });
  },
  addToCart: function() {
    const cart = wx.getStorageSync('cart') || [];
    const product = this.data.product;
    const index = cart.findIndex(item => item.id === product.id);
    if (index > -1) {
      cart[index].quantity += 1;
    } else {
      product.quantity = 1;
      cart.push(product);
    }
    wx.setStorageSync('cart', cart);
    wx.showToast({
      title: '已加入购物车',
      icon: 'success'
    });
  }
});

17. 购物车逻辑(pages/cart/cart.js)

Page({
  data: {
    cart: [],
    total: 0
  },
  onLoad: function() {
    this.getCart();
  },
  getCart: function() {
    const cart = wx.getStorageSync('cart') || [];
    const total = cart.reduce((sum, item) => sum + item.price * item.quantity, 0);
    this.setData({ cart, total });
  },
  decreaseQuantity: function(e) {
    const cart = this.data.cart;
    const index = e.currentTarget.dataset.id;
    const item = cart[index];
    if (item.quantity > 1) {
      item.quantity -= 1;
    } else {
      cart.splice(index, 1);
    }
    wx.setStorageSync('cart', cart);
    this.setData({ cart });
    this.getCart();
  },
  increaseQuantity: function(e) {
    const cart = this.data.cart;
    const index = e.currentTarget.dataset.id;
    const item = cart[index];
    item.quantity += 1;
    wx.setStorageSync('cart', cart);
    this.setData({ cart });
    this.getCart();
  },
  goToOrders: function() {
    wx.navigateTo({
      url: '/pages/orders/orders'
    });
  }
});

18. 订单逻辑(pages/orders/orders.js)

Page({
  data: {
    order: {}
  },
  onLoad: function() {
    this.setData({ order: wx.getStorageSync('order') || {} });
  },
  onNameInput: function(e) {
    this.setData({
      order: {
        ...this.data.order,
        name: e.detail.value
      }
    });
    wx.setStorageSync('order', this.data.order);
  },
  onPhoneInput: function(e) {
    this.setData({
      order: {
        ...this.data.order,
        phone: e.detail.value
      }
    });
    wx.setStorageSync('order', this.data.order);
  },
  onAddressInput: function(e) {
    this.setData({
      order: {
        ...this.data.order,
        address: e.detail.value
      }
    });
    wx.setStorageSync('order', this.data.order);
  },
  submitOrder: function() {
    const { name, phone, address } = this.data.order;
    if (!name || !phone || !address) {
      wx.showToast({
        title: '请填写完整的收货信息',
        icon: 'none'
      });
      return;
    }
    wx.request({
      url: 'https://example.com/api/orders',
      method: 'POST',
      data: {
        order: this.data.order,
        cart: wx.getStorageSync('cart')
      },
      success: function(res) {
        wx.showToast({
          title: '订单提交成功',
          icon: 'success'
        });
        wx.removeStorageSync('cart');
        wx.removeStorageSync('order');
        wx.reLaunch({
          url: '/pages/index/index'
        });
      },
      fail: function() {
        wx.showToast({
          title: '订单提交失败',
          icon: 'none'
        });
      }
    });
  }
});

19. 用户信息逻辑(pages/profile/profile.js)

Page({
  data: {
    userInfo: {}
  },
  onLoad: function() {
    this.setData({ userInfo: wx.getStorageSync('userInfo') || {} });
  }
});

20. 小程序入口文件(app.js)

App({
  onLaunch: function() {
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力');
    } else {
      wx.cloud.init({
        env: 'your-env-id',
        traceUser: true,
      });
    }
  },
  globalData: {
    userInfo: null
  }
});

21. 数据库设计(假设使用微信云开发)

1. 用户表(users)

字段 类型 描述
id String 用户ID
name String 用户名
phone String 联系电话

2. 订单表(orders)

字段 类型 描述
id String 订单ID
userId String 用户ID
products Array 购买的产品列表
name String 收货人姓名
phone String 联系电话
address String 收货地址
status String 订单状态

22. 安全性考虑

1、数据加密:敏感信息如订单信息、用户信息等需要进行加密存储。

2、权限验证:确保只有授权用户才能访问和修改自己的数据。

3、输入验证:对用户输入进行验证,防止SQL注入等攻击。

4、HTTPS:确保所有数据传输都通过HTTPS进行,防止数据被截获。

23. 性能优化

1、缓存:使用小程序的wx.setStorageSyncwx.getStorageSync进行数据缓存,减少数据库访问。

2、分页加载:对于产品列表等大量数据,使用分页加载,避免一次性加载过多数据导致卡顿。

3、懒加载:对于图片等资源,使用懒加载,只有当用户滚动到相应位置时才加载资源。

24. 用户体验

1、界面设计:简洁明了的界面设计,方便用户快速找到所需信息。

2、操作反馈:每次操作后给予用户明确的反馈,如加入购物车后显示提示信息。

3、错误处理:对可能出现的错误进行处理,并给用户友好的错误提示。

25. 测试

1、单元测试:对每个函数进行单元测试,确保其按预期工作。

2、集成测试:测试各个页面和功能之间的交互是否正常。

3、性能测试:测试小程序在不同设备和网络环境下的性能表现。

26. 部署与维护

1、代码版本控制:使用Git进行代码版本控制,方便追踪更改和回滚。

2、自动化部署:使用CI/CD工具进行自动化部署,减少人为错误。

3、监控与日志:监控小程序的运行状态,记录日志以便分析问题。

通过以上步骤,可以构建一个基本的宠物门店小程序,根据实际需求,可以进一步扩展功能和优化体验。

The End
微信