【最新版】西陆健身系统源码全开源+uniapp前端

一.系统介绍

一款基于Uniapp+ThinkPHP开发健身系统,支持多城市、多门店,包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型,支持在线排课。私教可以通过上课获得收益,在线申请提现功能,无加密源代码

二.搭建环境

系统环境:CentOS、

运行环境:宝塔 Linux

网站环境:Nginx 1.26 + MySQL 5.7.46 + PHP-74

常见插件:fileinfo ; redis

系统搭建测试(图片仅供参考,无实际运营)

 

---教练端----

 

 

 

 

 

 

 

 

 

系统源码全开源,可二次开发。后端common/api文件代码:

<?phpnamespace app\common\controller;use app\common\library\Auth;
use think\Config;
use think\exception\HttpResponseException;
use think\exception\ValidateException;
use think\Hook;
use think\Lang;
use think\Loader;
use think\Request;
use think\Response;
use think\Route;
use think\Validate;/*** API控制器基类*/
class Api
{/*** @var Request Request 实例*/protected $request;/*** @var bool 验证失败是否抛出异常*/protected $failException = false;/*** @var bool 是否批量验证*/protected $batchValidate = false;/*** @var array 前置操作方法列表*/protected $beforeActionList = [];/*** 无需登录的方法,同时也就不需要鉴权了* @var array*/protected $noNeedLogin = [];/*** 无需鉴权的方法,但需要登录* @var array*/protected $noNeedRight = [];/*** 权限Auth* @var Auth*/protected $auth = null;/*** 默认响应输出类型,支持json/xml* @var string*/protected $responseType = 'json';/*** 构造方法* @access public* @param Request $request Request 对象*/public function __construct(Request $request = null){$this->request = is_null($request) ? Request::instance() : $request;// 控制器初始化$this->_initialize();// 前置操作方法if ($this->beforeActionList) {foreach ($this->beforeActionList as $method => $options) {is_numeric($method) ?$this->beforeAction($options) :$this->beforeAction($method, $options);}}}/*** 初始化操作* @access protected*/protected function _initialize(){//跨域请求检测check_cors_request();// 检测IP是否允许check_ip_allowed();//移除HTML标签$this->request->filter('trim,strip_tags,htmlspecialchars');$this->auth = Auth::instance();$modulename = $this->request->module();$controllername = Loader::parseName($this->request->controller());$actionname = strtolower($this->request->action());// token$token = $this->request->server('HTTP_TOKEN', $this->request->request('token', \think\Cookie::get('token')));$path = str_replace('.', '/', $controllername) . '/' . $actionname;// 设置当前请求的URI$this->auth->setRequestUri($path);// 检测是否需要验证登录if (!$this->auth->match($this->noNeedLogin)) {//初始化$this->auth->init($token);//检测是否登录if (!$this->auth->isLogin()) {$this->error(__('Please login first'), null, 401);}// 判断是否需要验证权限if (!$this->auth->match($this->noNeedRight)) {// 判断控制器和方法判断是否有对应权限if (!$this->auth->check($path)) {$this->error(__('You have no permission'), null, 403);}}} else {// 如果有传递token才验证是否登录状态if ($token) {$this->auth->init($token);}}$upload = \app\common\model\Config::upload();// 上传信息配置后Hook::listen("upload_config_init", $upload);Config::set('upload', array_merge(Config::get('upload'), $upload));// 加载当前控制器语言包$this->loadlang($controllername);}/*** 加载语言文件* @param string $name*/protected function loadlang($name){$name = Loader::parseName($name);$name = preg_match("/^([a-zA-Z0-9_\.\/]+)\$/i", $name) ? $name : 'index';$lang = $this->request->langset();$lang = preg_match("/^([a-zA-Z\-_]{2,10})\$/i", $lang) ? $lang : 'zh-cn';Lang::load(APP_PATH . $this->request->module() . '/lang/' . $lang . '/' . str_replace('.', '/', $name) . '.php');}/*** 操作成功返回的数据* @param string $msg    提示信息* @param mixed  $data   要返回的数据* @param int    $code   错误码,默认为1* @param string $type   输出类型* @param array  $header 发送的 Header 信息*/protected function success($msg = '', $data = null, $code = 1, $type = null, array $header = []){$this->result($msg, $data, $code, $type, $header);}/*** 操作失败返回的数据* @param string $msg    提示信息* @param mixed  $data   要返回的数据* @param int    $code   错误码,默认为0* @param string $type   输出类型* @param array  $header 发送的 Header 信息*/protected function error($msg = '', $data = null, $code = 0, $type = null, array $header = []){$this->result($msg, $data, $code, $type, $header);}/*** 返回封装后的 API 数据到客户端* @access protected* @param mixed  $msg    提示信息* @param mixed  $data   要返回的数据* @param int    $code   错误码,默认为0* @param string $type   输出类型,支持json/xml/jsonp* @param array  $header 发送的 Header 信息* @return void* @throws HttpResponseException*/protected function result($msg, $data = null, $code = 0, $type = null, array $header = []){$result = ['code' => $code,'msg'  => $msg,'time' => Request::instance()->server('REQUEST_TIME'),'data' => $data,];// 如果未设置类型则使用默认类型判断$type = $type ? : $this->responseType;if (isset($header['statuscode'])) {$code = $header['statuscode'];unset($header['statuscode']);} else {//未设置状态码,根据code值判断$code = $code >= 1000 || $code < 200 ? 200 : $code;}$response = Response::create($result, $type, $code)->header($header);throw new HttpResponseException($response);}/*** 前置操作* @access protected* @param string $method  前置操作方法名* @param array  $options 调用参数 ['only'=>[...]] 或者 ['except'=>[...]]* @return void*/protected function beforeAction($method, $options = []){if (isset($options['only'])) {if (is_string($options['only'])) {$options['only'] = explode(',', $options['only']);}if (!in_array($this->request->action(), $options['only'])) {return;}} elseif (isset($options['except'])) {if (is_string($options['except'])) {$options['except'] = explode(',', $options['except']);}if (in_array($this->request->action(), $options['except'])) {return;}}call_user_func([$this, $method]);}/*** 设置验证失败后是否抛出异常* @access protected* @param bool $fail 是否抛出异常* @return $this*/protected function validateFailException($fail = true){$this->failException = $fail;return $this;}/*** 验证数据* @access protected* @param array        $data     数据* @param string|array $validate 验证器名或者验证规则数组* @param array        $message  提示信息* @param bool         $batch    是否批量验证* @param mixed        $callback 回调方法(闭包)* @return array|string|true* @throws ValidateException*/protected function validate($data, $validate, $message = [], $batch = false, $callback = null){if (is_array($validate)) {$v = Loader::validate();$v->rule($validate);} else {// 支持场景if (strpos($validate, '.')) {list($validate, $scene) = explode('.', $validate);}$v = Loader::validate($validate);!empty($scene) && $v->scene($scene);}// 批量验证if ($batch || $this->batchValidate) {$v->batch(true);}// 设置错误信息if (is_array($message)) {$v->message($message);}// 使用回调验证if ($callback && is_callable($callback)) {call_user_func_array($callback, [$v, &$data]);}if (!$v->check($data)) {if ($this->failException) {throw new ValidateException($v->getError());}return $v->getError();}return true;}/*** 刷新Token*/protected function token(){$token = $this->request->param('__token__');//验证Tokenif (!Validate::make()->check(['__token__' => $token], ['__token__' => 'require|token'])) {$this->error(__('Token verification error'), ['__token__' => $this->request->token()]);}//刷新Token$this->request->token();}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

济南国网数字化培训班学习笔记-第二组-6-输电线路现场教学

输电线路现场教学 杆塔组装 角钢塔 角钢-连扳-螺栓 螺栓&#xff08;M&#xff09;&#xff1a; 脚钉-螺栓&#xff08;螺栓头-无扣长-螺纹-螺帽&#xff09;-垫片-螺帽/防盗帽/防松帽M20*45 表示直径20mm&#xff0c;长度45mm螺栓级别由一个类似浮点数表示&#xff0c;如…

抖音的逆向工程获取弹幕(websocket和protobuf解析)

目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…

反射,枚举,lambda表达式

目录 反射枚举的使用Lambda表达式函数式接口语法Lambda表达式语法精简 变量捕获Lambda在集合List中的使用 反射 作用&#xff1a;在Java代码中&#xff0c;让一个对象认识到自己 比如一个类的名字&#xff0c;里面的方法&#xff0c;属性等 让程序运行的过程&#xff0c;某个对…

鸿蒙移动应用开发--渲染控制实验

任务&#xff1a;使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识&#xff0c;实现生效抽奖卡案例。如图1所示&#xff1a; 图1 生肖抽奖卡实例图 图1(a)中有6张生肖卡可以抽奖&#xff0c;每抽中一张&#xff0c;会通过弹层显示出来&#xf…

webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化&#xff08;单独提取css代码&#xff09;7、优化&#xff08;压缩过程&#xff09;8、打包less代码9、打包图片10、搭建开发环境&#xff08;webpack-dev-server&#xf…

Java快速上手之实验4(接口回调)

1&#xff0e;编写接口程序RunTest.java&#xff0c;通过接口回调实现多态性。解释【代码4】和【代码6】的执行结果为何不同&#xff1f; interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("猫急上树.."…

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;的蓬勃发展&#xff0c;其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任务固有的复杂依…

Qwen2.5简要全流程以及QA

1 输入prompt 得到input id input id&#xff1a; [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 进入Transformer层 先通过linear层得到shape不变的 QKV 多头注意力 分割Dimension &#xff0c; kv变成 [B,H,L,head_dim] h是…

爬虫学习——Item封装数据与Item Pipeline处理数据

一、Item封装数据 对于有字段的数据&#xff0c;最好的数据结构维护方法为字典类型(dict)&#xff0c;但是由于字典不便于携带元数据和传递给其他组件使用&#xff0c;故可以使用Item类封装爬取到的数据。 这里涉及两个类&#xff1a;Item基类和Field类 两者的使用关系如下&…

【React】状态管理 Context API \ MobX \ Redux

Context APIMobXRedux React有自己状态管理&#xff0c;周边生态也有很多状态管理 Context API 直接从react中引入并调用即可&#xff0c;context包含两个东西&#xff1a; Provider&#xff1a;提供商&#xff08;翻译&#xff09;&#xff0c;提供数据&#xff1b;属性&…

RK3588上编译opencv 及基于c++实现图像的读入

参考博文&#xff1a; https://blog.csdn.net/qq_47432746/article/details/147203889 一、安装依赖包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…

MATLAB 训练CNN模型 yolo v4

学生对小车控制提出了更好的要求&#xff0c;能否加入深度学习模型。 考虑到小车用matlab来做&#xff0c;yolo v5及以上版本都需要在pytorch下训练&#xff0c;还是用早期版本来演示。 1 yolov4 调用 参考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…

Windows下使用 VS Code + g++ 开发 Qt GUI 项目的完整指南

&#x1f680; 使用 VS Code g 开发 Qt GUI 项目的完整指南&#xff08;Windows MSYS2&#xff09; 本指南帮助你在 Windows 下使用 VS Code g CMake Qt6 快速搭建 Qt GUI 项目&#xff0c;适合熟悉 Visual Studio 的开发者向跨平台 VS Code 工具链迁移。 &#x1f6e0;️…

开源漏洞扫描器:OpenVAS

一、OpenVAS介绍 OpenVAS (Open Vulnerability Assessment System) 是一款功能强大的开源漏洞扫描器。它由 Greenbone Networks 开发和维护&#xff0c;是 Greenbone 安全管理器 (GSM) 产品的基础&#xff0c;同时也有免费的社区版本&#xff08;Greenbone Community Edition&…

Redis Pipeline 详解

Redis Pipeline 详解 Redis 无 Pipeline 耗时情况 : #mermaid-svg-8RIiJyeBO0uIrWjr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8RIiJyeBO0uIrWjr .error-icon{fill:#552222;}#mermaid-svg-8RIiJyeBO0uIrWjr .…

2025.04.24【3D】3D绘图入门指南

Nifty graph A contribution by Matt Asher. 3D animation A 3D animated scatterplot made with R and rgl. 文章目录 Nifty graph3D animation 2025.04.24【3D】| 3D绘图入门指南什么是3D绘图&#xff1f;为什么使用3D绘图&#xff1f;如何在R中进行3D绘图&#xff1f;安装…

[特殊字符] 分布式事务中,@GlobalTransactional 与 @Transactional 到底怎么配合用?

在微服务架构中&#xff0c;随着系统模块的拆分&#xff0c;单体应用中的本地事务已经无法满足跨服务的数据一致性需求。此时&#xff0c;我们就需要引入分布式事务解决方案&#xff0c;比如 Seata。在使用 Seata 的过程中&#xff0c;很多人会遇到一个常见的疑问&#xff1a; …

TDengine 集群高可用方案设计(二)

四、TDengine 集群高可用方案设计 4.1 硬件与网络架构设计 服务器选型&#xff1a;选择配置高、稳定性强的服务器&#xff0c;如戴尔 PowerEdge R740xd、华为 RH2288H V5 等。以戴尔 PowerEdge R740xd 为例&#xff0c;它配备英特尔至强可扩展处理器&#xff0c;具备高性能计…

从对数变换到深度框架:逻辑回归与交叉熵的数学原理及PyTorch实战

目录 前言 一、连乘变连加二、最小化损失函数2.1交叉熵2.2 二分类交叉熵2.3 多分类交叉熵三、逻辑回归与二分类3.1 逻辑回归与二分类算法理论讲解3.1.1 散点输入3.1.2 前向计算3.1.3 Sigmoid函数引入3.1.4 参数初始化3.1.5 损失函数3.1.6 开始迭代3.1.7 梯度下降显示四、基于框…

高企复审奖补!2025年合肥市高新技术企业重新认定奖励补贴政策及申报条件

一、合肥市高新技术企业重新认定奖励补贴政策 &#xff08;一&#xff09;高新区高新技术企业重新认定复审补贴奖励 重新认定为国家高新技术企业的给予5万元一次性奖励。 &#xff08;二&#xff09;经开区高新技术企业重新认定复审补贴奖励 对重新认定的企业&#xff0c;给…