# SellBookMiniProgram
**Repository Path**: xgguo2/SellBookMiniProgram
## Basic Information
- **Project Name**: SellBookMiniProgram
- **Description**: ThinkPHP5实现校园二手书微信小程序,python网络爬虫实现模拟登录
- **Primary Language**: PHP
- **License**: LGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2019-10-13
- **Last Updated**: 2024-06-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SellBookMiniProgram
#### 介绍
项目主要实现功能:学生学号登录(python爬虫模拟登录,在教务系统抓取用户基本信息)、微信授权登录获取用户openid、使用令牌方式实现用户三天免登录、书籍管理、购物车管理、订单管理、商品分类搜索。
#### 软件架构
前端:微信小程序
后端:ThinkPHP5、Python(爬虫脚本:FlaskScse.py)
数据库E-R图(这里只画出主要的实体和属性):
#### 小程序端页面展示
**1. 微信授权界面**
**2. 用户拒绝授权和学号登录**
**3. 授权成功后,获取openid和爬取用户信息存MySQL**
> 微信小程序的授权登录功能,拿到了用户的openid并存到数据库,返回用户3rd_session令牌
当用户用学号/密码登录成功后把3rd_session存到本地缓存中,把用户学号,密码,等个人信息存到数据库,当用户第二次打开时,首先验证用户3rd_session是否有效,有效->进入主页,无效->重新授权登录,校验数据库中的学号密码。3rd_session有效期是3天(实现3天免登陆)
**4. 用户输入学号密码,发送到python flask接口,执行爬虫**
**5. 小程序首页,请求加载json数据功能实现**
**6. 小程序首页和商品分类功能实现**
**7. 书籍发布功能实现**
**8. 书籍发布功能实现**
#### 使用说明
> 本项目是本人在选修微信小程序课程后做的第一个小项目,**已经不再维护**,而且腾讯云服务器已经不再租用了。所以,项目服务端已经跑不起来,只能用作展示。小程序端勉强能跑起来,但获取不到后台数据,想要学习界面制作、网络爬虫模拟登录的可以下载参考。
#### 小程序登录授权、商品发布、多图片上传主要代码
```javascript
// pages/puslish/publish.js
import {Publish} from './publish-model.js';
var publish = new Publish();
import { Config } from '../../utils/config.js';
var dominate = Config.dominate;
Page({
/**
* 页面的初始数据
*/
data: {
bookType: [],
hx_index:0,
goods_isbn:'',
isHidden: true,
Hidden: false,
imagesUrl: [],
image_url:[]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function(options) {
this.loadData();
var str = wx.getStorageSync('token');
this.setData({
token:str.token
})
},
PickerTypeChange: function(e) {
var index = parseInt(e.detail.value);
console.log('图书类型:', this.data.bookType[index].type_name)
this.setData({
hx_index: index
})
},
canIsbnCode: function(e) {
var that = this;
wx.scanCode({
onlyFromCamera: true,
success: function(res) {
// console.log(res);
that.setData({
goods_isbn:res.result
})
},
fail:function(err){
console.log('无效的ISBN')
}
})
},
//图片选择事件处理
uploadImg: function() {
var that = this;
wx.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success: function(res) {
// tempFilePath可以作为img标签的src属性显示图片
const tempFilePaths = res.tempFilePaths
// console.log(res);
var list = that.data.imagesUrl;
list.push({
url: tempFilePaths
}); //把选择到的图片路径添加到数组
if (list.length >= 4) {
that.setData({
Hidden: true
})
}
that.setData({
isHidden: false,
imagesUrl: list //把数组重新赋值遍历渲染
})
},
})
},
// 删除图片
delImg:function(e){
var that = this;
var imageArray = that.data.imagesUrl;
var index = e.target.dataset.index;
// console.log(e)
wx.showModal({
title: '提示',
content: '你要删除此图片吗?',
success:function(res){
// console.log(res)
if(res.confirm){
imageArray.splice(index,1)//删除数组中图片
that.setData({
Hidden:false,
imagesUrl:imageArray
})
}else{
console.log("没删除图片")
}
}
})
},
//执行提交操作:上传图片,提交数据
publishSubmit:function(form){
// console.log(res)
var that = this;
var imageArray = that.data.imagesUrl;//本地临时url数组
if (imageArray.length != 0) {
//上传图片
that.doUploadImage(imageArray,(res)=>{
// console.log(that.data.image_url)
// //提交表单
form.detail.value['type_id'] = that.data.hx_index + 2;
form.detail.value['images'] = JSON.stringify(that.data.image_url);//把数组转换成字符串
// console.log(form.detail.value)
console.log(form)
publish.submitForm(form.detail.value, (res) => {
console.log(res)
//上传完毕,清空数据
that.setData({
imagesUrl: []
})
if(res.data.code==200){
wx.showToast({
title: '发布成功',
icon: 'success',
duration: 2000
})
wx.switchTab({
url: '/pages/classify/classify',
})
}else(
wx.showModal({
title: '提示',
content: '上传失败!',
success(res) {
if (res.confirm) {
console.log('用户点击确定')
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})
)
})
});
} else {
console.log("你还没选择图片!")
}
},
doUploadImage: function (imageArray,callBack){
var that = this;
var flag = 0;
//图片上传
for (var i = 0; i < imageArray.length; i++) {
wx.uploadFile({
// url: 'http://test.xgguo.com/api/v1/upload/wxUpload',//本地调试
url: 'http://pk.xgguo.win/api/v1/upload/wxUpload',//腾讯云
filePath: imageArray[i]['url'][0],
name: 'file',
success(res) {
console.log(res)
var arr_res = JSON.parse(res.data);
console.log("上传成功!");
var str = arr_res.url;
var url = dominate + "uploads/index/images/" + str.replace("\\", "/");
that.data.image_url.push({
image_url: url
})
flag++;
// console.log(that.data.image_url)
if(flag==imageArray.length){
typeof callBack == "function" && callBack(res);
}
},
fail(err) {
console.log(err, "上传失败!")
}
})
}
},
// 加载书籍类型
loadData:function(res){
var that = this;
var data = publish.getBookList((res)=>{
// console.log(res)
res.data.splice(0,1);//删除第一条记录
that.setData({
bookType: res.data
})
// console.log(that.data.bookType)
})
},
```
#### 技术交流与分享
1. 关注我CSDN博客:[https://blog.csdn.net/weixin_41835653](https://blog.csdn.net/weixin_41835653)
2. 我的码云:[https://gitee.com/xgguo2](https://gitee.com/xgguo2)
3. 我的微信公众号: