Merge branch 'develop' of https://gitee.com/Tyssen/yi-shi into develop
# Conflicts: # Server/.env # Server/application/common/model/CompanyAccountModel.php # Server/application/common/model/DeviceModel.php # Server/application/common/model/WechatAccountModel.php
This commit is contained in:
@@ -1,11 +0,0 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
|
||||
use think\Model;
|
||||
|
||||
class DeviceGroupModel extends Model {
|
||||
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class ProductGroupModel extends Model {
|
||||
|
||||
/**
|
||||
* 获取关联数组
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
static public function assoc() {
|
||||
$assoc = NULL;
|
||||
if (is_null($assoc)) {
|
||||
$assoc = [];
|
||||
foreach (static::where(1)
|
||||
->order('id', 'DESC')
|
||||
->select() as $model) {
|
||||
$assoc[$model->getAttr('id')] = $model->getAttr('name');
|
||||
}
|
||||
}
|
||||
return $assoc;
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品数量
|
||||
*
|
||||
* @return ProductModel
|
||||
*/
|
||||
public function productNum() {
|
||||
return ProductModel::where(1)
|
||||
->where('group_id', $this->getAttr('id'))
|
||||
->count();
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class ProductModel extends Model {
|
||||
|
||||
const IS_USED_NO = 0;
|
||||
const IS_USED_YES = 10;
|
||||
|
||||
protected $json = ['cb', 'images', 'labels', 'themes', 'opts'];
|
||||
protected $jsonAssoc = TRUE;
|
||||
|
||||
/**
|
||||
* 获取是否使用
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
static public function isUsedAssoc() {
|
||||
return [
|
||||
static::IS_USED_NO => '未使用',
|
||||
static::IS_USED_YES => '已使用',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class TaskDetailModel extends Model {
|
||||
|
||||
const STATUS_AWAIT = 0;
|
||||
const STATUS_RUNNING = 10;
|
||||
const STATUS_SUCC = 20;
|
||||
const STATUS_FAIL = 99;
|
||||
|
||||
protected $json = ['params', 'info'];
|
||||
protected $jsonAssoc = TRUE;
|
||||
}
|
||||
@@ -1,159 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class TaskModel extends Model {
|
||||
|
||||
const PLATFORM_XIANYU = 'XIANYU';
|
||||
|
||||
const TYPE_PRODUCT_RELEASE = 'PRODUCT_RELEASE';
|
||||
const TYPE_PRODUCT_POLISH = 'PRODUCT_POLISH';
|
||||
const TYPE_PRODUCT_ON = 'PRODUCT_ON';
|
||||
const TYPE_PRODUCT_OFF = 'PRODUCT_OFF';
|
||||
const TYPE_COIN_SIGN = 'COIN_SIGN';
|
||||
const TYPE_COIN_DEDUCT = 'COIN_DEDUCT';
|
||||
const TYPE_PRICE_CUT = 'PRICE_CUT';
|
||||
const TYPE_COMMENT_REMOVE = 'COMMENT_REMOVE';
|
||||
const TYPE_PRODUCT_RE_RELEASE = 'PRODUCT_RE_RELEASE';
|
||||
const TYPE_RAISE_XY = 'RAISE_XY';
|
||||
const TYPE_RAISE_XY_TZ = 'RAISE_XY_TZ';
|
||||
const TYPE_RAISE_XY_UNITY = 'RAISE_XY_UNITY';
|
||||
const TYPE_SYNC_USER = 'SYNC_USER';
|
||||
const TYPE_SYNC_SHOP = 'SYNC_SHOP';
|
||||
const TYPE_UPDATE_USER = 'UPDATE_USER';
|
||||
const TYPE_PRODUCT_WELFARE = 'PRODUCT_WELFARE';
|
||||
const TYPE_MESSAGE_REPLY = 'MESSAGE_REPLY';
|
||||
|
||||
const RUN_TYPE_ONCE = 'ONCE';
|
||||
const RUN_TYPE_TIMER = 'TIMER';
|
||||
const RUN_TYPE_DAILY = 'DAILY';
|
||||
|
||||
const STATUS_AWAIT = 0;
|
||||
const STATUS_ALLOC = 10;
|
||||
const STATUS_COMPLETE = 20;
|
||||
|
||||
const IS_DELETED_NO = 0;
|
||||
const IS_DELETED_YES = 10;
|
||||
|
||||
protected $json = ['params'];
|
||||
protected $jsonAssoc = TRUE;
|
||||
|
||||
/**
|
||||
* 获取类型
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
static public function typeAssoc() {
|
||||
return [
|
||||
static::TYPE_PRODUCT_RELEASE => '[闲鱼]发布商品',
|
||||
static::TYPE_PRODUCT_POLISH => '[闲鱼]擦亮商品',
|
||||
static::TYPE_PRODUCT_ON => '[闲鱼]上架商品',
|
||||
static::TYPE_PRODUCT_OFF => '[闲鱼]下架商品',
|
||||
static::TYPE_COIN_SIGN => '[闲鱼]签到鱼币',
|
||||
static::TYPE_COIN_DEDUCT => '[闲鱼]鱼币抵扣',
|
||||
static::TYPE_PRICE_CUT => '[闲鱼]一键降价',
|
||||
static::TYPE_COMMENT_REMOVE => '[闲鱼]删除留言',
|
||||
static::TYPE_PRODUCT_RE_RELEASE => '[闲鱼]编辑重复',
|
||||
static::TYPE_RAISE_XY => '[闲鱼]养号',
|
||||
static::TYPE_RAISE_XY_UNITY => '[闲鱼]互助养号',
|
||||
static::TYPE_RAISE_XY_TZ => '[闲鱼]会玩养号',
|
||||
static::TYPE_SYNC_USER => '[闲鱼]采集账号信息',
|
||||
static::TYPE_SYNC_SHOP => '[闲鱼]采集店铺信息',
|
||||
static::TYPE_UPDATE_USER => '[闲鱼]修改账号信息',
|
||||
static::TYPE_PRODUCT_WELFARE => '[闲鱼]公益宝贝',
|
||||
static::TYPE_MESSAGE_REPLY => '[闲鱼]消息回复',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取状态
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
static public function statusAssoc() {
|
||||
return [
|
||||
static::STATUS_AWAIT => '加入队列',
|
||||
static::STATUS_ALLOC => '准备运行',
|
||||
static::STATUS_COMPLETE => '运行成功',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取执行方式
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
static public function runTypeAssoc() {
|
||||
return [
|
||||
static::RUN_TYPE_ONCE => '立刻执行',
|
||||
static::RUN_TYPE_TIMER => '定时执行',
|
||||
static::RUN_TYPE_DAILY => '每天执行',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 平台
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
static public function platformAssoc() {
|
||||
return [
|
||||
static::PLATFORM_XIANYU => '闲鱼',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务类
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
static public function taskClasses() {
|
||||
return [
|
||||
static::TYPE_PRODUCT_RELEASE => '\app\common\task\ProductReleaseTask',
|
||||
static::TYPE_PRODUCT_POLISH => '\app\common\task\ProductPolishTask',
|
||||
static::TYPE_PRODUCT_ON => '\app\common\task\ProductOnTask',
|
||||
static::TYPE_PRODUCT_OFF => '\app\common\task\ProductOffTask',
|
||||
static::TYPE_COIN_SIGN => '\app\common\task\CoinSignTask',
|
||||
static::TYPE_COIN_DEDUCT => '\app\common\task\CoinDeductTask',
|
||||
static::TYPE_PRICE_CUT => '\app\common\task\PriceCutTask',
|
||||
static::TYPE_COMMENT_REMOVE => '\app\common\task\CommentRemoveTask',
|
||||
static::TYPE_PRODUCT_RE_RELEASE => '\app\common\task\ProductReReleaseTask',
|
||||
static::TYPE_RAISE_XY => '\app\common\task\RaiseXyTask',
|
||||
static::TYPE_RAISE_XY_UNITY => '\app\common\task\RaiseXyUnityTask',
|
||||
static::TYPE_RAISE_XY_TZ => '\app\common\task\RaiseXyTzTask',
|
||||
static::TYPE_SYNC_USER => '\app\common\task\SyncUserTask',
|
||||
static::TYPE_SYNC_SHOP => '\app\common\task\SyncShopTask',
|
||||
static::TYPE_UPDATE_USER => '\app\common\task\UpdateUserTask',
|
||||
static::TYPE_PRODUCT_WELFARE => '\app\common\task\ProductWelfareTask',
|
||||
static::TYPE_MESSAGE_REPLY => '\app\common\task\MessageReplyTask',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 分配到详情
|
||||
*
|
||||
* @param TaskModel $model
|
||||
* @return bool
|
||||
*/
|
||||
static public function toDetail(TaskModel $model) {
|
||||
$detail = new TaskDetailModel();
|
||||
$detail->setAttr('task_id', $model->getAttr('id'));
|
||||
$detail->setAttr('device_id', $model->getAttr('device_id'));
|
||||
$detail->setAttr('platform', $model->getAttr('platform'));
|
||||
$detail->setAttr('type', $model->getAttr('type'));
|
||||
$detail->setAttr('params', $model->getAttr('params'));
|
||||
$detail->setAttr('info', new \stdClass());
|
||||
return $detail->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取设备
|
||||
*
|
||||
* @return DeviceModel
|
||||
*/
|
||||
public function device() {
|
||||
return DeviceModel::get($this->getAttr('device_id'));
|
||||
}
|
||||
}
|
||||
163
Server/application/common/model/User.php
Normal file
163
Server/application/common/model/User.php
Normal file
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
use think\model\concern\SoftDelete;
|
||||
|
||||
class User extends Model
|
||||
{
|
||||
use SoftDelete;
|
||||
|
||||
/**
|
||||
* 数据表名
|
||||
* @var string
|
||||
*/
|
||||
protected $table = 'tk_users';
|
||||
|
||||
/**
|
||||
* 主键
|
||||
* @var string
|
||||
*/
|
||||
protected $pk = 'id';
|
||||
|
||||
/**
|
||||
* 自动写入时间戳
|
||||
* @var bool
|
||||
*/
|
||||
protected $autoWriteTimestamp = true;
|
||||
|
||||
/**
|
||||
* 创建时间字段
|
||||
* @var string
|
||||
*/
|
||||
protected $createTime = 'create_at';
|
||||
|
||||
/**
|
||||
* 更新时间字段
|
||||
* @var string
|
||||
*/
|
||||
protected $updateTime = 'update_at';
|
||||
|
||||
/**
|
||||
* 软删除字段
|
||||
* @var string
|
||||
*/
|
||||
protected $deleteTime = 'delete_at';
|
||||
|
||||
/**
|
||||
* 隐藏属性
|
||||
* @var array
|
||||
*/
|
||||
protected $hidden = ['password', 'delete_at'];
|
||||
|
||||
/**
|
||||
* 获取管理员用户信息
|
||||
* @param string $username 用户名
|
||||
* @param string $password 密码(可能是加密后的)
|
||||
* @param bool $isEncrypted 密码是否已加密
|
||||
* @return array|null
|
||||
*/
|
||||
public static function getAdminUser($username, $password, $isEncrypted = false)
|
||||
{
|
||||
// 查询用户
|
||||
$user = self::where('username', $username)->find();
|
||||
|
||||
if (!$user) {
|
||||
// 记录日志
|
||||
\think\facade\Log::info('用户不存在', ['username' => $username]);
|
||||
return null;
|
||||
}
|
||||
|
||||
// 记录密码验证信息
|
||||
\think\facade\Log::info('密码验证', [
|
||||
'username' => $username,
|
||||
'input_password' => $password,
|
||||
'stored_hash' => $user->password,
|
||||
'is_encrypted' => $isEncrypted,
|
||||
'password_info' => password_get_info($user->password)
|
||||
]);
|
||||
|
||||
// 验证密码
|
||||
$isValid = false;
|
||||
|
||||
if ($isEncrypted) {
|
||||
// 前端已加密,直接比较哈希值
|
||||
// 注意:这里需要确保前端和后端使用相同的加密算法和盐值
|
||||
$storedHash = self::getStoredHash($user->password);
|
||||
$isValid = hash_equals($storedHash, $password);
|
||||
|
||||
\think\facade\Log::info('加密密码验证', [
|
||||
'username' => $username,
|
||||
'stored_hash' => $storedHash,
|
||||
'input_hash' => $password,
|
||||
'is_valid' => $isValid
|
||||
]);
|
||||
} else {
|
||||
// 未加密,使用password_verify验证
|
||||
$isValid = password_verify($password, $user->password);
|
||||
}
|
||||
|
||||
\think\facade\Log::info('密码验证结果', [
|
||||
'username' => $username,
|
||||
'is_valid' => $isValid,
|
||||
'is_encrypted' => $isEncrypted
|
||||
]);
|
||||
|
||||
if (!$isValid) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $user->id,
|
||||
'username' => $user->username,
|
||||
'name' => $user->username, // 暂时使用username作为name
|
||||
'role' => 'admin', // 暂时固定为admin角色
|
||||
'permissions' => ['*'], // 暂时拥有所有权限
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取存储的哈希值
|
||||
* 用于前端加密密码的验证
|
||||
* @param string $bcryptHash 数据库中存储的bcrypt哈希值
|
||||
* @return string 用于前端验证的哈希值
|
||||
*/
|
||||
protected static function getStoredHash($bcryptHash)
|
||||
{
|
||||
// 这里需要实现与前端相同的加密算法
|
||||
// 例如,如果前端使用SHA256加盐,这里需要提取原始密码并进行相同的处理
|
||||
// 注意:这只是一个示例,实际实现可能需要根据您的具体需求调整
|
||||
|
||||
// 假设我们能够从bcrypt哈希中提取原始密码(实际上这是不可能的,这里只是示例)
|
||||
// 在实际应用中,您需要在用户注册或修改密码时同时存储前端加密的哈希值
|
||||
$originalPassword = '123456'; // 这里应该是从数据库中获取的原始密码
|
||||
$salt = 'yishi_salt_2024'; // 与前端相同的盐值
|
||||
|
||||
// 使用与前端相同的算法
|
||||
return hash('sha256', $originalPassword . $salt);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过手机号获取用户信息
|
||||
* @param string $mobile 手机号
|
||||
* @return array|null
|
||||
*/
|
||||
public static function getUserByMobile($mobile)
|
||||
{
|
||||
// 查询用户
|
||||
$user = self::where('mobile', $mobile)->find();
|
||||
|
||||
if (!$user) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $user->id,
|
||||
'username' => $user->username,
|
||||
'name' => $user->username, // 暂时使用username作为name
|
||||
'mobile' => $user->mobile,
|
||||
'role' => 'user', // 暂时固定为user角色
|
||||
'permissions' => ['user'], // 暂时拥有用户权限
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class UserModel extends Model {
|
||||
|
||||
const STATUS_ACTIVE = 0; // 正常
|
||||
const STATUS_DISABLE = 99; // 禁用
|
||||
|
||||
/**
|
||||
* 获取状态
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
public static function statusAssoc() {
|
||||
return [
|
||||
static::STATUS_ACTIVE => '正常',
|
||||
static::STATUS_DISABLE => '禁用',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 只读
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $readonly = ['username'];
|
||||
|
||||
/**
|
||||
* JSON 字段
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $json = ['roles'];
|
||||
|
||||
protected $jsonAssoc = TRUE;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class UserTokenModel extends Model {
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
|
||||
use think\Model;
|
||||
|
||||
class WechatFriendModel extends Model {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user