【学习记录】微信小程序: 后端开发
服务端后台接口开发实战
推荐工具
- 代码编辑器:Sublime
- 本地运行环境:phpstudy (windows)
- 接口测试工具:postman
- 线上服务器:新浪云 SAE
- 代码版本控制器:tortoise svn、PHP storm
IntelliJ IDEA设置TortoiseSVN插件(Cannot run program “svn”)
使用Mac系统的朋友可以自行探索~
微信小程序的后台需要设置支持https,并且认证过的服务器域名。
网络请求基本知识
MySQL
登录MySQL
mysql -h localhost -u root -p
mysql -uroot -p
后面就跟着视频建表~
php
thinkPHP
所有的代码都是首先经过index.php文件,然后再由这个文件分发到具体的文件夹。
- ThinkPHP是一个类库
- Public是公共文件
- Application是应用(自己写的代码)
- Common公共
- Common
- function.php里可以定义一些公共的函数
- Conf
- config.php公共配置
- Common
- Home模块
- Common放模块下面的一些公共代码
- Conf放文件夹的配置文件,以数组的形式进行配置
- config.php放Home模块独有的配置
- Controller文件夹里面可以写各种类,每一种类里面可以写很多方式
- Model文件夹里面放一些模型文件
- View放一些HTML文档,用于网站开发
- Common公共
自己要写的是Application->Home->Controller模块
Controller里面所有的类文件,固定的写法都必须是IndexController.class.php
Controller.class.php是固定的写法,只有Index是我们自己命名的。
访问方法:localhost/treehole/index.php/Home/Index/test
Home表示属于哪个模块
Index表示属于哪个类文件
test表示属于哪个fanction函数
若操作成功,返回新增数据的id。
操作数据库前,先修改配置文件。
后台接口
测试接口
<?php
namespace Home\Controller; //命名空间
use Think\Controller; //使用了什么样的类
class TestController extends BaseController
{ //TestController是当前代码的名字
public function test()
{
echo 123;
}
public function insert_test()
{
//实例化数据表
$Message = M(\'Message\');
//组装插入的数据
$data = array(); //声明一个空数组
$data[\'user_id\'] = 5;
$data[\'username\'] = \'小明\';
$data[\'face_url\'] = \'xxx.jpg\';
$data[\'content\'] = \'今天是晴天。\';
$data[\'total_likes\'] = 0;
$data[\'send_timestamp\'] = time();
//插入数据
$result = $Message->add($data); //add函数是封装好的
var_dump($Message->getLastSql()); //打印SQL语句
var_dump($result);
}
public function select_test()
{
//实例化数据库表
$Message = M(\'Message\');
//设置查询条件
$where = array();
$where[\'user_id\'] = 5;
//查询数据
$all_messages = $Message->where($where)->select();
//箭头的意思是调用它的函数
//thinkPHP可以连续调用函数
// var_dump($all_messages);
dump($all_messages);
//只打印id和username
$all_messages = $Message->where($where)->field(\'id,username\')->select();
dump($all_messages);
dump($Message->getLastSql());
}
public function find_test()
{
//实例化数据库表
$Message = M(\'Message\');
//设置查询条件
$where = array();
$where[\'user_id\'] = 5;
//查询数据
$all_messages = $Message->where($where)->select();
dump($all_messages);
dump($Message->getLastSql());
$all_messages = $Message->where($where)->find();
dump($all_messages);
dump($Message->getLastSql());
}
public function save_test()
{
//实例化数据表
$Message = M(\'Message\');
//设置要修改的条件
$where = array();
$where[\'id\'] = 4;
//要保存的数据
$data = array();
$data[\'total_likes\'] = 123;
//保存
$result = $Message->where($where)->save($data);
dump($result);
}
public function delete_test()
{
//实例化数据表
$Message = M(\'Message\');
//设置条件
$where = array();
$where[\'id\'] = 4;
// $where[\'user_id\'] = 3;
//删除
$result = $Message->where($where)->delete();
dump($result);
dump($Message->getLastSql());
}
}
用户的注册接口
- 接收数据
- 校验数据
- 查询数据库
- 插入数据库
- 组装数据
- 返回数据
class UserController extends BaseController
{ //UserController是当前代码的名字
/**
*
* 用户注册
* @return [type] [description]
*/
public function sign()
{
// 校验参数是否存在
if (!$_POST[\'username\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: username\';
//msg是给前端开发人员看的,告诉开发人员每个数字代表什么意思
$this->ajaxReturn($return_data);
//如果要把数据返回给前端,都需要用$this->ajaxReturn
//ajaxReturn意思是以ajax的方式把数据返回前端去
}
if (!$_POST[\'phone\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: phone\';
$this->ajaxReturn($return_data);
}
if (!$_POST[\'password\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: password\';
$this->ajaxReturn($return_data);
}
if (!$_POST[\'password_again\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: password_again\';
$this->ajaxReturn($return_data);
}
// 检验两次密码是否输入一致
if ($_POST[\'password\'] != $_POST[\'password_again\']) {
$return_data = array();
$return_data[\'error_code\'] = 2;
$return_data[\'msg\'] = \'两次密码不一致\';
$this->ajaxReturn($return_data);
}
// 检验手机号是否已经被注册
$User = M(\'User\');
// 构造查询条件
$where = array();
$where[\'phone\'] = $_POST[\'phone\'];
//因为只需要查出一个,所以用find比较好
$user = $User->where($where)->find();
if ($user) {
// 如果存在该手机号的用户,则提示
// 不再允许重复注册该手机号
$return_data = array();
$return_data[\'error_code\'] = 3;
$return_data[\'msg\'] = \'该手机号已被注册\';
$this->ajaxReturn($return_data);
} else {
// 如果用户尚未注册,则注册
// 构建插入的数据
$data = array();
$data[\'username\'] = $_POST[\'username\'];
$data[\'phone\'] = $_POST[\'phone\'];
// $data[\'password\'] = md5($_POST[\'password\']);
// 密码,用md5函数进行加密,得到32位字符串
$data[\'password\'] = $_POST[\'password\'];
$data[\'face_url\'] = $_POST[\'face_url\'];
// dump($data);
// 插入数据
$result = $User->add($data); // add函数添加数据成功之后,返回的就是该条数据的id
if ($result) { //if语句中只要$result有值,就是非零非空
// 插入数据成功
$return_data = array();
$return_data[\'error_code\'] = 0;
$return_data[\'msg\'] = \'注册成功\';
$return_data[\'data\'][\'user_id\'] = $result;
$return_data[\'data\'][\'username\'] = $_POST[\'username\'];
$return_data[\'data\'][\'phone\'] = $_POST[\'phone\'];
$return_data[\'data\'][\'face_url\'] = $_POST[\'face_url\'];
$this->ajaxReturn($return_data);
} else {
// 插入数据执行失败
$return_data = array();
$return_data[\'error_code\'] = 4;
$return_data[\'msg\'] = \'注册失败\';
$this->ajaxReturn($return_data);
}
}
// dump($_POST);
}
使用postman测试该接口,传参数是在Body->form-data
用户的登录接口
- 接收数据
- 处理数据
- 返回结果
/**
* 用户登录
* @return [type] [description]
*/
public function login()
{
// 校验参数是否存在
if (!$_POST[\'phone\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: phone\';
$this->ajaxReturn($return_data);
}
if (!$_POST[\'password\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: password\';
$this->ajaxReturn($return_data);
}
// 查询用户
$User = M(\'User\');
$where = array();
$where[\'phone\'] = $_POST[\'phone\'];
$user = $User->where($where)->find();
if ($user) {
// 如果查询到该手机号用户
// dump($user);
// if (md5($_POST[\'password\']) != $user[\'password\']) {
if($_POST[\'password\'] != $user[\'password\']){
$return_data = array();
$return_data[\'error_code\'] = 3;
$return_data[\'msg\'] = \'密码不正确,请重新输入\';
$this->ajaxReturn($return_data);
} else {
// 如果密码一样
$return_data = array();
$return_data[\'error_code\'] = 0;
$return_data[\'msg\'] = \'登陆成功\';
$return_data[\'data\'][\'user_id\'] = $user[\'id\'];
$return_data[\'data\'][\'username\'] = $user[\'username\'];
$return_data[\'data\'][\'phone\'] = $user[\'phone\'];
$return_data[\'data\'][\'face_url\'] = $user[\'face_url\'];
$this->ajaxReturn($return_data);
}
} else {
$return_data = array();
$return_data[\'error_code\'] = 2;
$return_data[\'msg\'] = \'不存在该手机号用户,请注册\';
$this->ajaxReturn($return_data);
}
dump($_POST);
}
发布新树洞接口
/**
* 发布新树洞
* @return [type] [description]
*/
public function publish_new_message()
{
// 校验参数是否存在
if (!$_POST[\'user_id\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: user_id\';
$this->ajaxReturn($return_data);
}
if (!$_POST[\'username\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: username\';
$this->ajaxReturn($return_data);
}
if (!$_POST[\'face_url\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: face_url\';
$this->ajaxReturn($return_data);
}
if (!$_POST[\'content\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: content\';
$this->ajaxReturn($return_data);
}
$Message = M(\'Message\');
// 设置要插入的数据
$data = array();
$data[\'user_id\'] = $_POST[\'user_id\'];
$data[\'username\'] = $_POST[\'username\'];
$data[\'face_url\'] = $_POST[\'face_url\'];
$data[\'content\'] = $_POST[\'content\'];
$data[\'total_likes\'] = 0;
$data[\'send_timestamp\'] = time();
//插入数据
$result = $Message->add($data);
if ($result) {
$return_data = array();
$return_data[\'error_code\'] = 0;
$return_data[\'msg\'] = \'数据添加成功\';
$this->ajaxReturn($return_data);
} else {
$return_data = array();
$return_data[\'error_code\'] = 2;
$return_data[\'msg\'] = \'数据添加失败\';
$this->ajaxReturn($return_data);
}
}
获取所有树洞接口
/**
* 得到所有树洞
* @return [type] [description]
*/
public function get_all_messages()
{
// 实例化数据表
$Message = M(\'Message\');
// 设置查询条件
// 按照时间倒序获取所有树洞
// 这里的时间和id是同一个
//desc递减
//asc递增
$all_messages = $Message->order(\'id desc\')->select();
// dump($all_messages);
// 将所有的时间戳转换为2021-03-13 08:38:53
// php里面的循环使用foreach
foreach ($all_messages as $key => $message) {
$all_messages[$key][\'send_timestamp\'] = date(\'Y-m-d H:i:s\', $message[\'send_timestamp\']);
}
$return_data = array();
$return_data[\'error_code\'] = 0;
$return_data[\'msg\'] = \'数据获取成功\';
$return_data[\'data\'] = $all_messages;
$this->ajaxReturn($return_data);
// dump($all_messages);
}
得到某一用户的所有树洞
/**
* 得到某一用户的所有树洞
* @return [type] [description]
*/
public function get_one_user_all_messages()
{
// 校验参数是否存在
if (!$_POST[\'user_id\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: user_id\';
$this->ajaxReturn($return_data);
}
// 实例化数据表
$Message = M(\'Message\');
// 设置查询条件
$where = array();
$where[\'user_id\'] = $_POST[\'user_id\'];
$message = $Message->where($where)->select();
if (!$message) {
$return_data = array();
$return_data[\'error_code\'] = 2;
$return_data[\'msg\'] = \'数据获取失败\';
$this->ajaxReturn($return_data);
} else {
$return_data = array();
$return_data[\'error_code\'] = 0;
$return_data[\'msg\'] = \'数据获取成功\';
$return_data[\'data\'] = $message;
$this->ajaxReturn($return_data);
}
}
点赞接口
/**
* 点赞数增加
* @return [type] [description]
*/
public function do_like()
{
// 校验参数
if (!$_POST[\'message_id\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: message_id\';
$this->ajaxReturn($return_data);
}
if (!$_POST[\'user_id\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: user_id\';
$this->ajaxReturn($return_data);
}
// dump($_POST);
$Message = M(\'Message\');
// 查询条件
$where = array();
$where[\'id\'] = $_POST[\'message_id\'];
$message = $Message->where($where)->find();
// 判断是否存在该条树洞
if (!$message) {
$return_data = array();
$return_data[\'error_code\'] = 2;
$return_data[\'msg\'] = \'指定的树洞不存在\';
$this->ajaxReturn($return_data);
}
// dump($message);
$data = array();
$data[\'total_likes\'] = $message[\'total_likes\'] + 1;
// 构造要保存的条件
$where = array();
$where[\'id\'] = $_POST[\'message_id\'];
$result = $Message->where($where)->save($data);
if ($result) {
$return_data = array();
$return_data[\'error_code\'] = 0;
$return_data[\'msg\'] = \'数据保存成功\';
$return_data[\'data\'][\'message_id\'] = $_POST[\'message_id\'];
$return_data[\'data\'][\'total_likes\'] = $data[\'total_likes\'];
$this->ajaxReturn($return_data);
} else {
$return_data = array();
$return_data[\'error_code\'] = 2;
$return_data[\'msg\'] = \'数据保存失败\';
$this->ajaxReturn($return_data);
}
}
删除指定树洞接口
/**
* 删除指定树洞接口
* @return [type] [description]
*/
public function delete_message()
{
// 校验参数
if (!$_POST[\'message_id\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: message_id\';
$this->ajaxReturn($return_data);
}
if (!$_POST[\'user_id\']) {
$return_data = array();
$return_data[\'error_code\'] = 1;
$return_data[\'msg\'] = \'参数不足: user_id\';
$this->ajaxReturn($return_data);
}
$Message = M(\'Message\');
//设置条件
$where = array();
$where[\'id\'] = $_POST[\'message_id\'];
$where[\'user_id\'] = $_POST[\'user_id\'];
$message = $Message->where($where)->find();
if (!$message) {
$return_data = array();
$return_data[\'error_code\'] = 2;
$return_data[\'msg\'] = \'指定的数据查询不存在\';
$this->ajaxReturn($return_data);
} else {
$message_id = $message[\'id\'];
$message = $Message->where($where)->delete();
$return_data = array();
$return_data[\'error_code\'] = 0;
$return_data[\'msg\'] = \'数据删除成功\';
$return_data[\'message_id\'] = $message_id;
$this->ajaxReturn($return_data);
}
}
SVN
一种代码版本控制器,可以多人协作开发。
- 进到这里,获取SVN仓库地址
- 打开网站根目录
- 右键,点击SVN检出,将刚才获取到的地址粘贴到这
- 点击确定,就把代码从新浪云更新到本地了
- 成功后,文件前面都有一个绿色的对号
- 输入
http://zzdxyyf.saelinzi.com/zzdxyyf/1/treehole1/index.php/Home/Index/test
,输出int(666)
- 修改本地代码,看到文件夹图标上有个警告,右键文件夹,点击SVN提交。
- 可以看到修改前后的变化
- 点击确定,提交完成,刷新网页,看到输出变为
int(999)
微信小程序API补充
配置服务器域名
服务器域名保存成功之后,小程序就可以和服务器进行通信了。
对接注册接口
这部分内容,由于没有购买域名,目前也没有精力继续搞了,所以先把一些课程的知识点记录一下。
- 数据传递
- API调用发起网络请求
- 接口回调处理
- 全局数据交互
postman
- 在POST方式下参数要写在Body中
- 在GET方式下参数要写在Params中
线上服务器的域名最好保存在全局变量中。
“=”赋值的方式,并不会触发前端页面的刷新。
测试、上传、发布