Initial commit: 小众厨房项目代码

Co-authored-by: Cursor <cursoragent@cursor.com>
这个提交包含在:
可乐加冰
2026-09-23 17:04:10 +08:00
当前提交 f7d3d7d1bd
共有 1761 个文件被更改,包括 453668 次插入 和 0 次删除

查看文件

@@ -0,0 +1,88 @@
<?php
namespace app\common\model;
use think\Cache;
use think\Model;
/**
* 地区数据模型
*/
class Area extends Model
{
/**
* 根据经纬度获取当前地区信息
*
* @param string $lng 经度
* @param string $lat 纬度
* @return Area 城市信息
*/
public static function getAreaFromLngLat($lng, $lat, $level = 3)
{
$namearr = [1 => 'geo:province', 2 => 'geo:city', 3 => 'geo:district'];
$rangearr = [1 => 15000, 2 => 1000, 3 => 200];
$geoname = $namearr[$level] ?? $namearr[3];
$georange = $rangearr[$level] ?? $rangearr[3];
// 读取范围内的ID
$redis = Cache::store('redis')->handler();
$georadiuslist = [];
if (method_exists($redis, 'georadius')) {
$georadiuslist = $redis->georadius($geoname, $lng, $lat, $georange, 'km', ['WITHDIST', 'COUNT' => 5, 'ASC']);
}
if ($georadiuslist) {
list($id, $distance) = $georadiuslist[0];
}
$id = isset($id) && $id ? $id : 3;
return self::get($id);
}
/**
* 根据经纬度获取省份
*
* @param string $lng 经度
* @param string $lat 纬度
* @return Area
*/
public static function getProvinceFromLngLat($lng, $lat)
{
$provincedata = null;
$citydata = self::getCityFromLngLat($lng, $lat);
if ($citydata) {
$provincedata = self::get($citydata['pid']);
}
return $provincedata;
}
/**
* 根据经纬度获取城市
*
* @param string $lng 经度
* @param string $lat 纬度
* @return Area
*/
public static function getCityFromLngLat($lng, $lat)
{
$citydata = null;
$districtdata = self::getDistrictFromLngLat($lng, $lat);
if ($districtdata) {
$citydata = self::get($districtdata['pid']);
}
return $citydata;
}
/**
* 根据经纬度获取地区
*
* @param string $lng 经度
* @param string $lat 纬度
* @return Area
*/
public static function getDistrictFromLngLat($lng, $lat)
{
$districtdata = self::getAreaFromLngLat($lng, $lat, 3);
return $districtdata;
}
}

查看文件

@@ -0,0 +1,101 @@
<?php
namespace app\common\model;
use think\Model;
class Attachment extends Model
{
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 定义字段类型
protected $type = [
];
protected $append = [
'thumb_style'
];
protected static function init()
{
// 如果已经上传该资源,则不再记录
self::beforeInsert(function ($model) {
if (self::where('url', '=', $model['url'])->where('storage', $model['storage'])->find()) {
return false;
}
});
self::beforeWrite(function ($row) {
if (isset($row['category']) && $row['category'] == 'unclassed') {
$row['category'] = '';
}
});
}
public function setUploadtimeAttr($value)
{
return is_numeric($value) ? $value : strtotime($value);
}
public function getCategoryAttr($value)
{
return $value == '' ? 'unclassed' : $value;
}
public function setCategoryAttr($value)
{
return $value == 'unclassed' ? '' : $value;
}
/**
* 获取云储存的缩略图样式字符
*/
public function getThumbStyleAttr($value, $data)
{
if (!isset($data['storage']) || $data['storage'] == 'local') {
return '';
} else {
$config = get_addon_config($data['storage']);
if ($config && isset($config['thumbstyle'])) {
return $config['thumbstyle'];
}
}
return '';
}
/**
* 获取Mimetype列表
* @return array
*/
public static function getMimetypeList()
{
$data = [
"image/*" => __("Image"),
"audio/*" => __("Audio"),
"video/*" => __("Video"),
"text/*" => __("Text"),
"application/*" => __("Application"),
"zip,rar,7z,tar" => __("Zip"),
];
return $data;
}
/**
* 获取定义的附件类别列表
* @return array
*/
public static function getCategoryList()
{
$data = config('site.attachmentcategory') ?? [];
if (is_string($data)) {
$data = (array)json_decode($data, true);
}
foreach ($data as $index => &$datum) {
$datum = __($datum);
}
$data['unclassed'] = __('Unclassed');
return $data;
}
}

查看文件

@@ -0,0 +1,98 @@
<?php
namespace app\common\model;
use think\Model;
class Attachment extends Model
{
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 定义字段类型
protected $type = [
];
protected $append = [
'thumb_style'
];
protected static function init()
{
// 如果已经上传该资源,则不再记录
self::beforeInsert(function ($model) {
if (self::where('url', '=', $model['url'])->where('storage', $model['storage'])->find()) {
return false;
}
});
self::beforeWrite(function ($row) {
if (isset($row['category']) && $row['category'] == 'unclassed') {
$row['category'] = '';
}
});
}
public function setUploadtimeAttr($value)
{
return is_numeric($value) ? $value : strtotime($value);
}
public function getCategoryAttr($value)
{
return $value == '' ? 'unclassed' : $value;
}
public function setCategoryAttr($value)
{
return $value == 'unclassed' ? '' : $value;
}
/**
* 获取云储存的缩略图样式字符
*/
public function getThumbStyleAttr($value, $data)
{
if (!isset($data['storage']) || $data['storage'] == 'local') {
return '';
} else {
$config = get_addon_config($data['storage']);
if ($config && isset($config['thumbstyle'])) {
return $config['thumbstyle'];
}
}
return '';
}
/**
* 获取Mimetype列表
* @return array
*/
public static function getMimetypeList()
{
$data = [
"image/*" => __("Image"),
"audio/*" => __("Audio"),
"video/*" => __("Video"),
"text/*" => __("Text"),
"application/*" => __("Application"),
"zip,rar,7z,tar" => __("Zip"),
];
return $data;
}
/**
* 获取定义的附件类别列表
* @return array
*/
public static function getCategoryList()
{
$data = config('site.attachmentcategory') ?? [];
foreach ($data as $index => &$datum) {
$datum = __($datum);
}
$data['unclassed'] = __('Unclassed');
return $data;
}
}

查看文件

@@ -0,0 +1,216 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 附件模型
* Class AttachmentModel
* @package app\common\model
*/
class AttachmentModel extends Model
{
protected $name = 'attachment';
/**
* 获取列表
* @param $params
* @param int $rows
* @param int $page
* @param string $fields
* @return array
* @throws \think\exception\DbException
*/
public function getLists($params, $rows = 20, $page = 1, $fields = '*')
{
// 条件搜索
if (!empty($params['where'])) {
$this->where($params['where']);
} else {
if (!empty($params['keyword'])) {
switch ($params['type']) {
case 1 :
$this->where(['filename' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
}
}
if (!empty($params['nav'])) {
if (count($params['nav']) == 1) {
$this->where(['one_id' => $params['nav'][0], 'two_id' => 0]);
} else {
$this->where(['one_id' => $params['nav'][0], 'two_id' => $params['nav'][1]]);
}
} else {
$this->where(['one_id' => 0, 'two_id' => 0]);
}
if (isset($params['is_del'])) {
$this->where(['is_del' => $params['is_del']]);
}
if (!empty($params['category'])) {
$this->where(['category' => $params['category']]);
}
if (!empty($params['mimetype'])) {
$this->where(['mimetype' => ['LIKE', '' . $params['mimetype'] . '%']]);
}
// 时间范围查询
if (!empty($params['start_time'])) {
$this->where('createtime', '>=', $params['start_time']);
}
if (!empty($params['end_time'])) {
$this->where('createtime', '<=', $params['end_time']);
}
}
// 排序
$order = 'id DESC';
if (!empty($params['order'])) {
switch ($params['order']) {
case 1 :
$order = 'id ASC';
break;
case 2 :
$order = 'id DESC';
break;
case 3 :
$order = 'filename ASC';
break;
case 4 :
$order = 'filename DESC';
break;
}
}
$result = $this
->field($fields)
->order($order)
->paginate($rows, false, [
'page' => $page
]);
$arr = [
'list' => [],
'total' => 0,
'page' => 1,
'pageSize' => $rows
];
// 格式化数据信息
if (!$result->isEmpty()) {
$arr = [
'list' => $result->items(),
'total' => $result->total(),
'page' => $result->currentPage(),
'pageSize' => $result->listRows()
];
}
return $arr;
}
/**
* 归类
* @param $data
* @return bool|mixed
*/
public function nav($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($data) {
foreach ($data['ids'] as $v) {
$oneId = $data['nav'][0];
$twoId = !empty($data['nav'][1]) ? $data['nav'][1] : 0;
$this->update([
'id' => $v,
'one_id' => $oneId,
'two_id' => $twoId,
]);
}
return true;
});
}
/**
* 添加
* @param $data
* @return bool|int|string
*/
public function add($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
if ($this->insertGetId($data)) {
return true;
} else {
$this->error = '添加出错了,请重新尝试。';
return false;
}
}
/**
* 获取某条记录
* @param $where
* @return array|bool|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getItem($where)
{
if (empty($where)) {
$this->error = '参数不正确。';
return false;
}
if (floor($where) > 0) {
$where = ['id' => $where];
}
return $this->where($where)->find();
}
/**
* 编辑
* @param $data
* @return bool
*/
public function edit($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
if ($this->update($data)) {
return true;
} else {
$this->error = '编辑出错了,请重新尝试。';
return false;
}
}
// 删除
public function del($where)
{
if (empty($where)) {
$this->error = '参数不正确';
return false;
}
if ($this->where($where)->delete()) {
return true;
} else {
$this->error = '删除出错了,请重新尝试。';
return false;
}
}
}

查看文件

@@ -0,0 +1,219 @@
<?php
namespace app\common\model;
use think\Db;
use think\Model;
/**
* 附件分类模型
* Class AttachmentNavModel
* @package app\common\model
*/
class AttachmentNavModel extends Model
{
protected $name = 'attachment_nav';
/**
* 获取全部分类
* @return false|\PDOStatement|string|\think\Collection
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getNavList()
{
$field = ['id' => 'value', 'name' => 'label'];
$navList = Db::name('attachment_nav')
->where(['pid' => 0, 'status' => 1])
->field($field)
->select();
if (!empty($navList)) {
foreach ($navList as &$v) {
$v['children'] = Db::name('attachment_nav')
->where(['pid' => $v['value'], 'status' => 1])
->field($field)
->select();
}
}
return $navList;
}
/**
* 搜索栏目
* @param $keyword
* @return array|false|\PDOStatement|string|\think\Collection
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function searchNav($keyword)
{
if (empty($keyword)) {
return [];
}
$field = ['id' => 'value', 'name' => 'label'];
$navList = Db::name('attachment_nav')
->where(['name' => ['LIKE', '%' . $keyword . '%'], 'status' => 1])
->field($field)
->select();
if (!empty($navList)) {
foreach ($navList as &$v) {
$v['children'] = Db::name('attachment_nav')
->where(['pid' => $v['value'], 'status' => 1])
->field($field)
->select();
}
}
return $navList;
}
/**
* 获取列表
* @param $params
* @param int $rows
* @param int $page
* @param string $fields
* @return array
* @throws \think\exception\DbException
*/
public function getLists($params, $rows = 20, $page = 1, $fields = '*')
{
// 条件搜索
if (!empty($params['where'])) {
$this->where($params['where']);
} else {
if (!empty($params['keyword'])) {
switch ($params['type']) {
case 1 :
$this->where(['name' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
}
}
if (!empty($params['status'])) {
$this->where(['status' => $params['status']]);
}
// 时间范围查询
if (!empty($params['start_time'])) {
$this->where('createtime', '>=', $params['start_time']);
}
if (!empty($params['end_time'])) {
$this->where('createtime', '<=', $params['end_time']);
}
}
// 排序
$order = !empty($params['order']) ? $params['order'] : 'id DESC';
$result = $this
->field($fields)
->order($order)
->paginate($rows, false, [
'page' => $page
]);
$arr = [
'list' => [],
'total' => 0,
'page' => 1,
'pageSize' => $rows
];
// 格式化数据信息
if (!$result->isEmpty()) {
$arr = [
'list' => $result->items(),
'total' => $result->total(),
'page' => $result->currentPage(),
'pageSize' => $result->listRows()
];
}
return $arr;
}
/**
* 添加
* @param $data
* @return bool|int|string
*/
public function add($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($data) {
$id = $this->insertGetId($data);
if (empty($data['sort'])) {
$this->update([
'id' => $id,
'sort' => $id
]);
}
return $id;
});
}
/**
* 获取某条记录
* @param $where
* @return array|bool|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getItem($where)
{
if (empty($where)) {
$this->error = '参数不正确。';
return false;
}
if (floor($where) > 0) {
$where = ['id' => $where];
}
return $this->where($where)->find();
}
/**
* 编辑
* @param $data
* @return bool
*/
public function edit($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
if ($this->update($data)) {
return true;
} else {
$this->error = '编辑出错了,请重新尝试。';
return false;
}
}
// 删除
public function del($where)
{
if (empty($where)) {
$this->error = '参数不正确';
return false;
}
if ($this->where($where)->delete()) {
return true;
} else {
$this->error = '删除出错了,请重新尝试。';
return false;
}
}
}

查看文件

@@ -0,0 +1,87 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 分类模型
*/
class Category extends Model
{
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 追加属性
protected $append = [
'type_text',
'flag_text',
];
protected static function init()
{
self::afterInsert(function ($row) {
$row->save(['weigh' => $row['id']]);
});
}
public function setFlagAttr($value, $data)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 读取分类类型
* @return array
*/
public static function getTypeList()
{
$typeList = config('site.categorytype');
foreach ($typeList as $k => &$v) {
$v = __($v);
}
return $typeList;
}
public function getTypeTextAttr($value, $data)
{
$value = $value ? $value : $data['type'];
$list = $this->getTypeList();
return $list[$value] ?? '';
}
public function getFlagList()
{
return ['hot' => __('Hot'), 'index' => __('Index'), 'recommend' => __('Recommend')];
}
public function getFlagTextAttr($value, $data)
{
$value = $value ? $value : $data['flag'];
$valueArr = explode(',', $value);
$list = $this->getFlagList();
return implode(',', array_intersect_key($list, array_flip($valueArr)));
}
/**
* 读取分类列表
* @param string $type 指定类型
* @param string $status 指定状态
* @return array
*/
public static function getCategoryArray($type = null, $status = null)
{
$list = collection(self::where(function ($query) use ($type, $status) {
if (!is_null($type)) {
$query->where('type', '=', $type);
}
if (!is_null($status)) {
$query->where('status', '=', $status);
}
})->order('weigh', 'desc')->select())->toArray();
return $list;
}
}

查看文件

@@ -0,0 +1,227 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 配置模型
*/
class Config extends Model
{
// 表名,不含前缀
protected $name = 'config';
// 自动写入时间戳字段
protected $autoWriteTimestamp = false;
// 定义时间戳字段名
protected $createTime = false;
protected $updateTime = false;
// 追加属性
protected $append = [
'extend_html'
];
protected $type = [
'setting' => 'json',
];
/**
* 读取配置类型
* @return array
*/
public static function getTypeList()
{
$typeList = [
'string' => __('String'),
'password' => __('Password'),
'text' => __('Text'),
'editor' => __('Editor'),
'number' => __('Number'),
'date' => __('Date'),
'time' => __('Time'),
'datetime' => __('Datetime'),
'datetimerange' => __('Datetimerange'),
'select' => __('Select'),
'selects' => __('Selects'),
'image' => __('Image'),
'images' => __('Images'),
'file' => __('File'),
'files' => __('Files'),
'switch' => __('Switch'),
'checkbox' => __('Checkbox'),
'radio' => __('Radio'),
'city' => __('City'),
'selectpage' => __('Selectpage'),
'selectpages' => __('Selectpages'),
'array' => __('Array'),
'custom' => __('Custom'),
];
return $typeList;
}
public static function getRegexList()
{
$regexList = [
'required' => '必选',
'digits' => '数字',
'letters' => '字母',
'date' => '日期',
'time' => '时间',
'email' => '邮箱',
'url' => '网址',
'qq' => 'QQ号',
'IDcard' => '身份证',
'tel' => '座机电话',
'mobile' => '手机号',
'zipcode' => '邮编',
'chinese' => '中文',
'username' => '用户名',
'password' => '密码'
];
return $regexList;
}
public function getExtendHtmlAttr($value, $data)
{
$result = preg_replace_callback("/\{([a-zA-Z]+)\}/", function ($matches) use ($data) {
if (isset($data[$matches[1]])) {
return $data[$matches[1]];
}
}, $data['extend']);
return $result;
}
/**
* 读取分类分组列表
* @return array
*/
public static function getGroupList()
{
$groupList = config('site.configgroup');
foreach ($groupList as $k => &$v) {
$v = __($v);
}
return $groupList;
}
public static function getArrayData($data)
{
if (!isset($data['value'])) {
$result = [];
foreach ($data as $index => $datum) {
$result['field'][$index] = $datum['key'];
$result['value'][$index] = $datum['value'];
}
$data = $result;
}
$fieldarr = $valuearr = [];
$field = $data['field'] ?? ($data['key'] ?? []);
$value = $data['value'] ?? [];
foreach ($field as $m => $n) {
if ($n != '') {
$fieldarr[] = $field[$m];
$valuearr[] = $value[$m];
}
}
return $fieldarr ? array_combine($fieldarr, $valuearr) : [];
}
/**
* 将字符串解析成键值数组
* @param string $text
* @return array
*/
public static function decode($text, $split = "\r\n")
{
$content = explode($split, $text);
$arr = [];
foreach ($content as $k => $v) {
if (stripos($v, "|") !== false) {
$item = explode('|', $v);
$arr[$item[0]] = $item[1];
}
}
return $arr;
}
/**
* 将键值数组转换为字符串
* @param array $array
* @return string
*/
public static function encode($array, $split = "\r\n")
{
$content = '';
if ($array && is_array($array)) {
$arr = [];
foreach ($array as $k => $v) {
$arr[] = "{$k}|{$v}";
}
$content = implode($split, $arr);
}
return $content;
}
/**
* 本地上传配置信息
* @return array
*/
public static function upload()
{
$uploadcfg = config('upload');
$uploadurl = request()->module() ? $uploadcfg['uploadurl'] : ($uploadcfg['uploadurl'] === 'ajax/upload' ? 'index/' . $uploadcfg['uploadurl'] : $uploadcfg['uploadurl']);
if (!preg_match("/^((?:[a-z]+:)?\/\/)(.*)/i", $uploadurl) && substr($uploadurl, 0, 1) !== '/') {
$uploadurl = url($uploadurl, '', false);
}
$uploadcfg['fullmode'] = isset($uploadcfg['fullmode']) && $uploadcfg['fullmode'];
$uploadcfg['thumbstyle'] = $uploadcfg['thumbstyle'] ?? '';
$upload = [
'cdnurl' => $uploadcfg['cdnurl'],
'uploadurl' => $uploadurl,
'bucket' => 'local',
'maxsize' => $uploadcfg['maxsize'],
'mimetype' => $uploadcfg['mimetype'],
'chunking' => $uploadcfg['chunking'],
'chunksize' => $uploadcfg['chunksize'],
'savekey' => $uploadcfg['savekey'],
'multipart' => [],
'multiple' => $uploadcfg['multiple'],
'fullmode' => $uploadcfg['fullmode'],
'thumbstyle' => $uploadcfg['thumbstyle'],
'storage' => 'local'
];
return $upload;
}
/**
* 刷新配置文件
*/
public static function refreshFile()
{
//如果没有配置权限无法进行修改
if (!\app\admin\library\Auth::instance()->check('general/config/edit')) {
return false;
}
$config = [];
$configList = self::all();
foreach ($configList as $k => $v) {
$value = $v->toArray();
if (in_array($value['type'], ['selects', 'checkbox', 'images', 'files'])) {
$value['value'] = explode(',', $value['value']);
}
if ($value['type'] == 'array') {
$value['value'] = (array)json_decode($value['value'], true);
}
$config[$value['name']] = $value['value'];
}
file_put_contents(
CONF_PATH . 'extra' . DS . 'site.php',
'<?php' . "\n\nreturn " . var_export_short($config) . ";\n"
);
return true;
}
}

查看文件

@@ -0,0 +1,21 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 邮箱验证码
*/
class Ems extends Model
{
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = false;
// 追加属性
protected $append = [
];
}

查看文件

@@ -0,0 +1,137 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 消息通知模型
* Class MessageModel
* @package app\common\model
*/
class MessageModel extends Model
{
protected $name = 'message';
/**
* 获取列表
* @param $params
* @param int $rows
* @param int $page
* @param string $fields
* @return array
* @throws \think\exception\DbException
*/
public function getLists($params, $rows = 20, $page = 1, $fields = '*')
{
// 当前模型表名
$tableName = $this->getQuery()->getTable();
// 条件搜索
if (!empty($params['where'])) {
$this->where($params['where']);
} else {
// 搜索参数
$search = $params['search'];
if (!empty($search['content'])) {
$this->where(['content' => ['LIKE', '%' . $search['content'] . '%']]);
}
if (!empty($search['status'])) {
$this->where('status', '=', $search['status']);
}
// 创建时间范围查询
if (!empty($search['dateTime'])) {
$startTime = strtotime($search['dateTime'][0]);
$endTime = strtotime($search['dateTime'][1]);
$this->where("create_time BETWEEN {$startTime} AND {$endTime}");
}
}
// 排序
$order = !empty($params['order']) ? $params['order'] : 'id DESC';
$result = $this
->field($fields)
->order($order)
->paginate($rows, false, [
'page' => $page
]);
$arr = [
'list' => [],
'total' => 0,
'page' => 1,
'pageSize' => $rows,
'totalSize' => 0
];
// 格式化数据信息
if (!$result->isEmpty()) {
$arr = [
'list' => $result->items(),
'total' => $result->total(),
'page' => $result->currentPage(),
'pageSize' => $result->listRows(),
'totalSize' => $result->lastPage()
];
}
return $arr;
}
/**
* 获取某条记录
* @param $where
* @return array|bool|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getItem($where, $fields = '*')
{
if (empty($where)) {
$this->error = '参数不正确。';
return false;
}
if (floor($where) > 0) {
$where = ['id' => $where];
}
return $this
->where($where)
->field($fields)
->find();
}
/**
* 编辑
* @param $data
* @return bool
*/
public function edit($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
if ($this->update($data)) {
return true;
} else {
$this->error = '编辑出错了,请重新尝试。';
return false;
}
}
// 删除
public function del($id)
{
if (empty($id)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($id) {
return $this->where(['id' => $id])->delete();
});
}
}

查看文件

@@ -0,0 +1,23 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 会员余额日志模型
*/
class MoneyLog extends Model
{
// 表名
protected $name = 'user_money_log';
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = '';
// 追加属性
protected $append = [
];
}

查看文件

@@ -0,0 +1,159 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 公告模型
* Class NoticeModel
* @package app\common\model
*/
class NoticeModel extends Model
{
protected $name = 'notice';
/**
* 获取列表
* @param $params
* @param int $rows
* @param int $page
* @param string $fields
* @return array
* @throws \think\exception\DbException
*/
public function getLists($params, $rows = 20, $page = 1, $fields = '*')
{
// 条件搜索
if (!empty($params['where'])) {
$this->where($params['where']);
} else {
$search = $params['search'];
if (!empty($search['status'])) {
$this->where('status', '=', $search['status']);
}
if (!empty($search['type'])) {
$this->where('type', '=', $search['type']);
}
if (!empty($search['title'])) {
$this->where('title', 'LIKE', '%' . $search['title'] . '%');
}
if (!empty($search['desc'])) {
$this->where('desc', 'LIKE', '%' . $search['desc'] . '%');
}
if (!empty($search['content'])) {
$this->where('content', 'LIKE', '%' . $search['content'] . '%');
}
// 时间范围查询
if (!empty($search['dateTime'])) {
$startTime = strtotime($search['dateTime'][0]);
$endTime = strtotime($search['dateTime'][1]);
$this->where("create_time BETWEEN {$startTime} AND {$endTime}");
}
}
// 排序
$order = !empty($params['order']) ? $params['order'] : 'id DESC';
$result = $this
->field($fields)
->order($order)
->paginate($rows, false, [
'page' => $page
]);
$arr = [
'list' => [],
'total' => 0,
'page' => 1,
'pageSize' => $rows,
'totalSize' => 0
];
// 格式化数据信息
if (!$result->isEmpty()) {
$arr = [
'list' => $result->items(),
'total' => $result->total(),
'page' => $result->currentPage(),
'pageSize' => $result->listRows(),
'totalSize' => $result->lastPage()
];
}
return $arr;
}
/**
* 添加
* @param $data
* @return bool|int|string
*/
public function add($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($data) {
$id = $this->insertGetId($data);
return $id;
});
}
/**
* 获取某条记录
* @param $where
* @return array|bool|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getItem($where, $fields = '*')
{
if (empty($where)) {
$this->error = '参数不正确。';
return false;
}
if (floor($where) > 0) {
$where = ['id' => $where];
}
return $this->where($where)->field($fields)->find();
}
/**
* 编辑
* @param $data
* @return bool
*/
public function edit($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($data) {
$res = $this->update($data);
return $res;
});
}
// 删除
public function del($id)
{
if (empty($id)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($id) {
return $this->where(['id' => $id])->delete();
});
}
}

查看文件

@@ -0,0 +1,171 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 参数模板模型
* Class ParamsModel
* @package app\common\model
*/
class ParamsModel extends Model
{
protected $name = 'shopro_goods_params';
/**
* 获取列表
* @param $params
* @param int $rows
* @param int $page
* @param string $fields
* @return array
* @throws \think\exception\DbException
*/
public function getLists($params, $rows = 20, $page = 1, $fields = '*')
{
// 条件搜索
if (!empty($params['where'])) {
$this->where($params['where']);
} else {
if (!empty($params['keyword'])) {
switch ($params['type']) {
case 1 :
$this->where(['name' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
}
}
if (!empty($params['status'])) {
$this->where('status', '>=', $params['status']);
}
// 时间范围查询
if (!empty($params['start_time'])) {
$this->where('create_time', '>=', $params['start_time']);
}
if (!empty($params['end_time'])) {
$this->where('create_time', '<=', $params['end_time']);
}
}
// 排序
$order = !empty($params['order']) ? $params['order'] : 'id DESC';
$result = $this
->field($fields)
->order($order)
->paginate($rows, false, [
'page' => $page
]);
$arr = [
'list' => [],
'total' => 0,
'page' => 1,
'pageSize' => $rows,
'totalSize' => 0
];
// 格式化数据信息
if (!$result->isEmpty()) {
$arr = [
'list' => $result->items(),
'total' => $result->total(),
'page' => $result->currentPage(),
'pageSize' => $result->listRows(),
'totalSize' => $result->lastPage()
];
}
return $arr;
}
/**
* 复制模板
* @param $id
* @return int|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function copy($id)
{
$params = $this->getItem($id);
return $this->insertGetId([
'title' => $params->title,
'params' => $params->params,
'status' => $params->status,
'create_time' => time()
]);
}
/**
* 添加
* @param $data
* @return bool|int|string
*/
public function add($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($data) {
$id = $this->insertGetId($data);
return $id;
});
}
/**
* 获取某条记录
* @param $where
* @return array|bool|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getItem($where, $fields = '*')
{
if (empty($where)) {
$this->error = '参数不正确。';
return false;
}
if (floor($where) > 0) {
$where = ['id' => $where];
}
return $this->where($where)->field($fields)->find();
}
/**
* 编辑
* @param $data
* @return bool
*/
public function edit($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($data) {
$res = $this->update($data);
return $res;
});
}
// 删除
public function del($id)
{
if (empty($id)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($id) {
return $this->where(['id' => $id])->delete();
});
}
}

查看文件

@@ -0,0 +1,153 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 订单报修模型
* Class ReportModel
* @package app\common\model
*/
class ReportModel extends Model
{
protected $name = 'report';
/**
* 获取列表
* @param $params
* @param int $rows
* @param int $page
* @param string $fields
* @return array
* @throws \think\exception\DbException
*/
public function getLists($params, $rows = 20, $page = 1, $fields = '*')
{
// 当前模型表名
$tableName = $this->getQuery()->getTable();
// 条件搜索
if (!empty($params['where'])) {
$this->where($params['where']);
} else {
// 搜索参数
$search = $params['search'];
if (!empty($search['content'])) {
$this->where(['content' => ['LIKE', '%' . $search['content'] . '%']]);
}
if (!empty($search['name'])) {
$this->where(['name' => ['LIKE', '%' . $search['name'] . '%']]);
}
if (!empty($search['phone'])) {
$this->where(['phone' => ['LIKE', '%' . $search['phone'] . '%']]);
}
if (!empty($search['address'])) {
$this->where(['address' => ['LIKE', '%' . $search['address'] . '%']]);
}
if (!empty($search['status'])) {
$this->where('status', '=', $search['status']);
}
if (!empty($search['user_id'])) {
$this->where('user_id', '=', $search['user_id']);
}
if (!empty($search['order_id'])) {
$this->where('order_id', '=', $search['order_id']);
}
// 创建时间范围查询
if (!empty($search['dateTime'])) {
$startTime = strtotime($search['dateTime'][0]);
$endTime = strtotime($search['dateTime'][1]);
$this->where("create_time BETWEEN {$startTime} AND {$endTime}");
}
}
// 排序
$order = !empty($params['order']) ? $params['order'] : 'id DESC';
$result = $this
->field($fields)
->order($order)
->paginate($rows, false, [
'page' => $page
]);
$arr = [
'list' => [],
'total' => 0,
'page' => 1,
'pageSize' => $rows,
'totalSize' => 0
];
// 格式化数据信息
if (!$result->isEmpty()) {
$arr = [
'list' => $result->items(),
'total' => $result->total(),
'page' => $result->currentPage(),
'pageSize' => $result->listRows(),
'totalSize' => $result->lastPage()
];
}
return $arr;
}
/**
* 获取某条记录
* @param $where
* @return array|bool|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getItem($where, $fields = '*')
{
if (empty($where)) {
$this->error = '参数不正确。';
return false;
}
if (floor($where) > 0) {
$where = ['id' => $where];
}
return $this
->where($where)
->field($fields)
->find();
}
/**
* 编辑
* @param $data
* @return bool
*/
public function edit($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
if ($this->update($data)) {
return true;
} else {
$this->error = '编辑出错了,请重新尝试。';
return false;
}
}
// 删除
public function del($id)
{
if (empty($id)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($id) {
return $this->where(['id' => $id])->delete();
});
}
}

查看文件

@@ -0,0 +1,23 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 会员积分日志模型
*/
class ScoreLog extends Model
{
// 表名
protected $name = 'user_score_log';
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = '';
// 追加属性
protected $append = [
];
}

查看文件

@@ -0,0 +1,21 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 短信验证码
*/
class Sms extends Model
{
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = false;
// 追加属性
protected $append = [
];
}

查看文件

@@ -0,0 +1,169 @@
<?php
namespace app\common\model;
use think\Model;
/**
* app版本模型
* Class UpgradeModel
* @package app\common\model
*/
class UpgradeModel extends Model
{
protected $name = 'upgrade';
/**
* 格式化更新内容
* @param $value
* @param $data
* @return mixed
*/
public function getContentAttr($value, $data)
{
return json_decode($value, true);
}
/**
* 获取列表
* @param $params
* @param int $rows
* @param int $page
* @param string $fields
* @return array
* @throws \think\exception\DbException
*/
public function getLists($params, $rows = 20, $page = 1, $fields = '*')
{
// 条件搜索
if (!empty($params['where'])) {
$this->where($params['where']);
} else {
if (!empty($params['keyword'])) {
switch ($params['type']) {
case 1 :
$this->where(['name' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
case 2 :
$this->where(['code' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
case 3 :
$this->where(['content' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
}
}
if (!empty($params['status'])) {
$this->where('status', '=', $params['status']);
}
// 时间范围查询
if (!empty($params['start_time'])) {
$this->where('create_time', '>=', $params['start_time']);
}
if (!empty($params['end_time'])) {
$this->where('create_time', '<=', $params['end_time']);
}
}
// 排序
$order = !empty($params['order']) ? $params['order'] : 'id DESC';
$result = $this
->field($fields)
->order($order)
->paginate($rows, false, [
'page' => $page
]);
$arr = [
'list' => [],
'total' => 0,
'page' => 1,
'pageSize' => $rows,
'totalSize' => 0
];
// 格式化数据信息
if (!$result->isEmpty()) {
$arr = [
'list' => $result->items(),
'total' => $result->total(),
'page' => $result->currentPage(),
'pageSize' => $result->listRows(),
'totalSize' => $result->lastPage()
];
}
return $arr;
}
/**
* 添加
* @param $data
* @return bool|int|string
*/
public function add($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($data) {
$id = $this->insertGetId($data);
return $id;
});
}
/**
* 获取某条记录
* @param $where
* @return array|bool|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getItem($where, $fields = '*')
{
if (empty($where)) {
$this->error = '参数不正确。';
return false;
}
if (floor($where) > 0) {
$where = ['id' => $where];
}
return $this->where($where)->field($fields)->find();
}
/**
* 编辑
* @param $data
* @return bool
*/
public function edit($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
if ($this->update($data)) {
return true;
} else {
$this->error = '编辑出错了,请重新尝试。';
return false;
}
}
// 删除
public function del($id)
{
if (empty($id)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($id) {
return $this->where(['id' => $id])->delete();
});
}
}

查看文件

@@ -0,0 +1,151 @@
<?php
namespace app\common\model;
use think\Db;
use think\Model;
/**
* 会员模型
*/
class User extends Model
{
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 追加属性
protected $append = [
'url',
];
/**
* 获取个人URL
* @param string $value
* @param array $data
* @return string
*/
public function getUrlAttr($value, $data)
{
return "/u/" . $data['id'];
}
/**
* 获取头像
* @param string $value
* @param array $data
* @return string
*/
public function getAvatarAttr($value, $data)
{
if (!$value) {
//如果不需要启用首字母头像,请使用
//$value = '/assets/img/avatar.png';
$value = letter_avatar($data['nickname']);
}
return $value;
}
/**
* 获取会员的组别
*/
public function getGroupAttr($value, $data)
{
return UserGroup::get($data['group_id']);
}
/**
* 获取验证字段数组值
* @param string $value
* @param array $data
* @return object
*/
public function getVerificationAttr($value, $data)
{
$value = array_filter((array)json_decode($value, true));
$value = array_merge(['email' => 0, 'mobile' => 0], $value);
return (object)$value;
}
/**
* 设置验证字段
* @param mixed $value
* @return string
*/
public function setVerificationAttr($value)
{
$value = is_object($value) || is_array($value) ? json_encode($value) : $value;
return $value;
}
/**
* 变更会员余额
* @param int $money 余额
* @param int $user_id 会员ID
* @param string $memo 备注
*/
public static function money($money, $user_id, $memo)
{
Db::startTrans();
try {
$user = self::lock(true)->find($user_id);
if ($user && $money != 0) {
$before = $user->money;
//$after = $user->money + $money;
$after = function_exists('bcadd') ? bcadd($user->money, $money, 2) : $user->money + $money;
//更新会员信息
$user->save(['money' => $after]);
//写入日志
MoneyLog::create(['user_id' => $user_id, 'money' => $money, 'before' => $before, 'after' => $after, 'memo' => $memo]);
}
Db::commit();
} catch (\Exception $e) {
Db::rollback();
}
}
/**
* 变更会员积分
* @param int $score 积分
* @param int $user_id 会员ID
* @param string $memo 备注
*/
public static function score($score, $user_id, $memo)
{
Db::startTrans();
try {
$user = self::lock(true)->find($user_id);
if ($user && $score != 0) {
$before = $user->score;
$after = $user->score + $score;
$level = self::nextlevel($after);
//更新会员信息
$user->save(['score' => $after, 'level' => $level]);
//写入日志
ScoreLog::create(['user_id' => $user_id, 'score' => $score, 'before' => $before, 'after' => $after, 'memo' => $memo]);
}
Db::commit();
} catch (\Exception $e) {
Db::rollback();
}
}
/**
* 根据积分获取等级
* @param int $score 积分
* @return int
*/
public static function nextlevel($score = 0)
{
$lv = array(1 => 0, 2 => 30, 3 => 100, 4 => 500, 5 => 1000, 6 => 2000, 7 => 3000, 8 => 5000, 9 => 8000, 10 => 10000);
$level = 1;
foreach ($lv as $key => $value) {
if ($score >= $value) {
$level = $key;
}
}
return $level;
}
}

查看文件

@@ -0,0 +1,21 @@
<?php
namespace app\common\model;
use think\Model;
class UserGroup extends Model
{
// 表名
protected $name = 'user_group';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 追加属性
protected $append = [
];
}

查看文件

@@ -0,0 +1,21 @@
<?php
namespace app\common\model;
use think\Model;
class UserRule extends Model
{
// 表名
protected $name = 'user_rule';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 追加属性
protected $append = [
];
}

查看文件

@@ -0,0 +1,50 @@
<?php
namespace app\common\model;
use think\Model;
class Version extends Model
{
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 定义字段类型
protected $type = [
];
/**
* 检测版本号
*
* @param string $version 客户端版本号
* @return array
*/
public static function check($version)
{
$versionlist = self::where('status', 'normal')->cache('__version__')->order('weigh desc,id desc')->select();
foreach ($versionlist as $k => $v) {
// 版本正常且新版本号不等于验证的版本号且找到匹配的旧版本
if ($v['status'] == 'normal' && $v['newversion'] !== $version && \fast\Version::check($version, $v['oldversion'])) {
$updateversion = $v;
break;
}
}
if (isset($updateversion)) {
$search = ['{version}', '{newversion}', '{downloadurl}', '{url}', '{packagesize}'];
$replace = [$version, $updateversion['newversion'], $updateversion['downloadurl'], $updateversion['downloadurl'], $updateversion['packagesize']];
$upgradetext = str_replace($search, $replace, $updateversion['content']);
return [
"enforce" => $updateversion['enforce'],
"version" => $version,
"newversion" => $updateversion['newversion'],
"downloadurl" => $updateversion['downloadurl'],
"packagesize" => $updateversion['packagesize'],
"upgradetext" => $upgradetext
];
}
return null;
}
}

查看文件

@@ -0,0 +1,165 @@
<?php
namespace app\common\model;
use think\Model;
/**
* 视频管理模型
* Class VideoModel
* @package app\common\model
*/
class VideoModel extends Model
{
protected $name = 'video';
/**
* 获取列表
* @param $params
* @param int $rows
* @param int $page
* @param string $fields
* @return array
* @throws \think\exception\DbException
*/
public function getLists($params, $rows = 20, $page = 1, $fields = '*')
{
// 条件搜索
if (!empty($params['where'])) {
$this->where($params['where']);
} else {
if (!empty($params['keyword'])) {
switch ($params['type']) {
case 1 :
$this->where(['title' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
case 2 :
$this->where(['desc' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
case 3 :
$this->where(['content' => ['LIKE', '%' . $params['keyword'] . '%']]);
break;
}
}
if (!empty($params['status'])) {
$this->where('status', '=', $params['status']);
}
// 时间范围查询
if (!empty($params['start_time'])) {
$this->where('create_time', '>=', $params['start_time']);
}
if (!empty($params['end_time'])) {
$this->where('create_time', '<=', $params['end_time']);
}
}
// 排序
$order = !empty($params['order']) ? $params['order'] : 'id DESC';
$result = $this
->field($fields)
->order($order)
->paginate($rows, false, [
'page' => $page
]);
$arr = [
'list' => [],
'total' => 0,
'page' => 1,
'pageSize' => $rows,
'totalSize' => 0
];
// 格式化数据信息
if (!$result->isEmpty()) {
$arr = [
'list' => $result->items(),
'total' => $result->total(),
'page' => $result->currentPage(),
'pageSize' => $result->listRows(),
'totalSize' => $result->lastPage()
];
}
return $arr;
}
/**
* 添加
* @param $data
* @return bool|int|string
*/
public function add($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($data) {
$id = $this->insertGetId($data);
if (empty($data['sort'])) {
$this->update([
'id' => $id,
'sort' => $id,
]);
}
return $id;
});
}
/**
* 获取某条记录
* @param $where
* @return array|bool|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getItem($where, $fields = '*')
{
if (empty($where)) {
$this->error = '参数不正确。';
return false;
}
if (floor($where) > 0) {
$where = ['id' => $where];
}
return $this->where($where)->field($fields)->find();
}
/**
* 编辑
* @param $data
* @return bool
*/
public function edit($data)
{
if (empty($data) || !is_array($data)) {
$this->error = '参数不正确';
return false;
}
if ($this->update($data)) {
return true;
} else {
$this->error = '编辑出错了,请重新尝试。';
return false;
}
}
// 删除
public function del($id)
{
if (empty($id)) {
$this->error = '参数不正确';
return false;
}
return $this->transaction(function () use ($id) {
return $this->where(['id' => $id])->delete();
});
}
}