初始上传

This commit is contained in:
2026-04-04 17:27:12 +08:00
parent 4d80d28eb4
commit b7e11774ee
11191 changed files with 1588469 additions and 0 deletions

824
app/model/system/User.php Executable file
View File

@@ -0,0 +1,824 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace app\model\system;
use app\model\store\Store;
use think\facade\Session;
use app\model\BaseModel;
/**
* 管理员模型
*/
class User extends BaseModel
{
/*******************************************************************用户 编辑查询 start*****************************************************/
/**
* 添加用户
* @param $data
* @param int $store_id
* @param string $source_type register 注册 add 添加
* @return array
*/
public function addUser($data, $store_id = 0, $source_type = 'register')
{
$site_id = $data[ 'site_id' ] ?? '';
$app_module = $data[ 'app_module' ] ?? '';
$member_id = $data[ 'member_id' ] ?? 0;
if ($site_id === '') return $this->error('', 'REQUEST_SITE_ID');
if ($app_module === '') return $this->error('', 'REQUEST_APP_MODULE');
if (empty($data[ "username" ])) return $this->error('', '用户名不能为空');
if (empty($data[ "password" ])) return $this->error('', '密码不能为空');
//判断 用户名 是否存在
$user_info = model('user')->getInfo(
[
[ 'username', "=", $data[ "username" ] ],
[ 'site_id', '=', $site_id ],
[ 'app_module', '=', $app_module ]
]
);
if ($source_type == 'add') {
if (!empty($user_info)) {
return $this->error('', '账号已存在');
}
} else {
if (!empty($user_info)) {
if (data_md5($data[ "password" ]) == $user_info[ 'password' ]) {
return $this->success(2);
} else {
return $this->error('', '账号已存在');
}
}
}
if ($member_id > 0) {
$temp_condition = array (
"app_module" => $data[ "app_module" ],
"member_id" => $member_id
);
$temp_count = model('user')->getCount($temp_condition, 'uid');
if ($temp_count > 0) {
return $this->error('', 'USERNAME_EXISTED');
}
}
$group_id = $data[ 'group_id' ] ?? 0;
$data[ "group_name" ] = '';
if ($group_id > 0) {
$group_model = new Group();
$group_info = $group_model->getGroupInfo([ [ "group_id", "=", $group_id ], [ "site_id", "=", $site_id ], [ "app_module", "=", $app_module ] ], "group_name")[ 'data' ];
$data[ "group_name" ] = $group_info[ "group_name" ] ?? '';
}
$data[ "password" ] = data_md5($data[ "password" ]);
$data[ "create_time" ] = time();
//记录创建用户信息
if($source_type == 'add' && isset($data['create_uid'])){
$user_info = model('user')->getInfo([['uid', '=', $data['create_uid']]], 'uid,username,create_user_data');
$create_user_data = json_decode($user_info['create_user_data'], true);
$create_user_data[] = ['id' => (string)$user_info['uid'], 'name' => $user_info['username']];
$data['create_user_data'] = json_encode($create_user_data, JSON_UNESCAPED_UNICODE);
}
model("user")->startTrans();
try {
$uid = model("user")->add($data);
if ($uid === false) {
model("user")->rollback();
return $this->error('', 'UNKNOW_ERROR');
}
if (isset($data[ 'store' ]) && !empty($data[ 'store' ])) {
$store_user_list = [];
foreach ($data[ 'store' ] as $item) {
if (empty($item[ 'store_id' ])) {
model("user")->rollback();
return $this->error('', '门店id不能为空');
}
if (empty($item[ 'group_id' ])) {
model("user")->rollback();
return $this->error('', '门店角色不能为空');
}
array_push($store_user_list, [
'uid' => $uid,
'site_id' => $data[ 'site_id' ],
'store_id' => $item[ 'store_id' ],
'group_id' => $item[ 'group_id' ],
'create_time' => time(),
'app_module' => 'store'
]);
}
model('user_group')->addList($store_user_list);
}
model("user")->commit();
return $this->success($uid);
} catch (\Exception $e) {
model("user")->rollback();
return $this->error('', '用户添加失败');
}
}
public function getUserColumn($condition = [], $field = '')
{
$res = model('user')->getColumn($condition, $field);
return $res;
}
/**
* 编辑用户
* @param $data
* @param $condition
* @param int $store_id
* @return array
*/
public function editUser($data, $condition, $store_id = 0)
{
$check_condition = array_column($condition, 2, 0);
$site_id = $check_condition[ 'site_id' ] ?? '';
$app_module = $check_condition[ 'app_module' ] ?? '';
$uid = $check_condition[ 'uid' ] ?? '';
if ($uid === '') {
return $this->error('', '缺少必须参数UID');
}
if ($site_id === '') {
return $this->error('', 'REQUEST_SITE_ID');
}
if ($app_module === '') {
return $this->error('', 'REQUEST_APP_MODULE');
}
$group_id = $data[ 'group_id' ] ?? 0;
$data[ "group_name" ] = '';
if ($group_id > 0) {
$group_model = new Group();
$group_info = $group_model->getGroupInfo([ [ "group_id", "=", $group_id ], [ "site_id", "=", $site_id ], [ 'app_module', '=', $app_module ] ], "group_name")[ 'data' ];
$data[ "group_name" ] = $group_info[ "group_name" ] ?? '';
}
model('user')->startTrans();
try {
$res = model("user")->update($data, $condition);
if ($res === false) {
model('user')->rollback();
return $this->error('', 'UNKNOW_ERROR');
}
model('user_group')->delete([ [ 'site_id', '=', $site_id ], [ 'uid', '=', $uid ], [ 'app_module', '=', 'store' ] ]);
if (isset($data[ 'store' ]) && !empty($data[ 'store' ])) {
$store_user_list = [];
foreach ($data[ 'store' ] as $item) {
if (empty($item[ 'store_id' ])) {
model("user")->rollback();
return $this->error('', '门店id不能为空');
}
if (empty($item[ 'group_id' ])) {
model("user")->rollback();
return $this->error('', '门店角色不能为空');
}
array_push($store_user_list, [
'uid' => $uid,
'site_id' => $site_id,
'store_id' => $item[ 'store_id' ],
'group_id' => $item[ 'group_id' ],
'create_time' => time(),
'app_module' => 'store'
]);
}
model('user_group')->addList($store_user_list);
}
model("user")->commit();
return $this->success($res);
} catch (\Exception $e) {
model("user")->rollback();
return $this->error('', '用户编辑失败');
}
}
/**
* 编辑用户状态
* @param $status
* @param $condition
* @return array
*/
public function modifyUserStatus($status, $condition)
{
$check_condition = array_column($condition, 2, 0);
$site_id = $check_condition[ 'site_id' ] ?? '';
if ($site_id === '') {
return $this->error('', 'REQUEST_SITE_ID');
}
$data = array (
"status" => $status,
"update_time" => time()
);
$res = model('user')->update($data, $condition);
if ($res === false) {
return $this->error('', 'UNKNOW_ERROR');
}
return $this->success($res);
}
/**
* 重置密码
* @param $password
* @param $condition
* @return array
*/
public function modifyUserPassword($password, $condition)
{
$res = model('user')->update([ 'password' => data_md5($password) ], $condition);
if ($res === false) {
return $this->error('', 'RESULT_ERROR');
}
return $this->success($res);
}
/**
* 系统用户修改密码
* @param $condition
* @param $new_password
* @return array
*/
public function modifyAdminUserPassword($condition, $new_password)
{
if (addon_is_exit("demo")) {
return $this->error('', '权限不足,请联系客服');
}
$res = model('user')->getInfo($condition, "uid,password");
if (!empty($res)) {
$data = array (
'password' => data_md5($new_password)
);
$res = model('user')->update($data, $condition);
return $this->success($res, 'SUCCESS');
} else {
return $this->error('', 'PASSWORD_ERROR');
}
}
/**
* 删除用户
* @param $condition
* @return array
*/
public function deleteUser($condition)
{
$check_condition = array_column($condition, 2, 0);
$app_module = $check_condition[ 'app_module' ] ?? '';
$uid = $check_condition[ 'uid' ] ?? '';
if ($uid === '') {
return $this->error('', '缺少必须参数UID');
}
if ($app_module === '') {
return $this->error('', 'REQUEST_APP_MODULE');
}
//自己和下属都删除
$uid_arr = model('user')->getColumn([['create_user_data', 'like', '%"'.$uid.'"%']], 'uid');
$uid_arr[] = $uid;
$res = model('user')->delete([['uid', 'in', $uid_arr]]);
if ($res === false) {
return $this->error('', 'UNKNOW_ERROR');
}
//用户组也删除
model('user_group')->delete([ [ 'uid', 'in', $uid_arr ] ]);
model('group')->delete([['create_uid', 'in', $uid_arr]]);
if(addon_is_exit('cashier')){
model('cashier_auth_group')->delete([['create_uid', 'in', $uid_arr]]);
}
return $this->success($res);
}
/**
* 清除后台所有用户的登录信息
* @param $app_module
* @param $site_id
* @return array
*/
public function deleteUserLoginInfo($app_module, $site_id)
{
$dir = './runtime/session';
$this->deldir($dir);
Session::delete($app_module . "_" . $site_id . ".uid");
return $this->success();
}
/**
* @param $dir
*/
public function deldir($dir)
{
//先删除目录下的文件:
$dh = opendir($dir);
while ($file = readdir($dh)) {
if ($file != "." && $file != "..") {
$fullpath = $dir . "/" . $file;
if (!is_dir($fullpath)) {
unlink($fullpath);
} else {
$this->deldir($fullpath);
}
}
}
closedir($dh);
}
/**
* 获取用户信息
* @param $condition
* @param string $field
* @return array
*/
public function getUserInfo($condition, $field = "uid, app_module, site_id, group_id, group_name, username, member_id, create_time, update_time, status, login_time, login_ip, is_admin")
{
$info = model('user')->getInfo($condition, $field);
if (!empty($info)) {
if (isset($info[ 'uid' ])) {
if(isset($info['is_admin']) && isset($info['site_id']) && $info['is_admin'] == 1 && addon_is_exit('cashier', $info['site_id'])){
//如果是超级管理员,默认有所有门店的管理员角色
$join = [
[ 'cashier_auth_group g', "g.keyword = 'admin'", 'inner' ],
];
$info[ 'user_group_list' ] = model('store')->getList([ [ 's.site_id', '=', $info[ 'site_id' ] ],['s.is_frozen', '=', 0] ], 's.store_id,s.store_name,g.group_id,g.menu_array', 's.is_default desc,store_id desc', 's', $join);
}else{
$join = [
[ 'store s', 's.store_id = ug.store_id', 'inner' ],
[ 'cashier_auth_group g', 'g.group_id = ug.group_id', 'inner' ]
];
$info[ 'user_group_list' ] = model('user_group')->getList([ [ 'ug.uid', '=', $info[ 'uid' ] ],['s.is_frozen', '=', 0] ], 's.store_id,s.store_name,g.group_id,g.menu_array', 's.is_default desc,store_id desc', 'ug', $join);
}
}
}
return $this->success($info);
}
/**
* 获取用户列表
* @param array $condition
* @param string $field
* @param string $order
* @param null $limit
* @return array
*/
public function getUserList($condition = [], $field = 'uid, app_module, site_id, group_id, username, member_id, create_time, update_time, status, login_time, login_ip, is_admin, group_name', $order = '', $limit = null)
{
$list = model('user')->getList($condition, $field, $order, '', '', '', $limit);
return $this->success($list);
}
/**
* 获取会员分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @return array
*/
public function getUserPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = 'uid, app_module, site_id, group_id, username, member_id, create_time, update_time, status, login_time, login_ip, is_admin, group_name, login_time')
{
$list = model('user')->pageList($condition, $field, $order, $page, $page_size);
return $this->success($list);
}
/**
* 获取站点用户分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @return array
*/
public function getSiteUserPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '')
{
$field = ' nu.uid, nu.app_module, nu.app_group,
nu.is_admin, nu.site_id, nu.group_id, nu.group_name, nu.username, nu.member_id, nu.create_time,
nu.update_time, nu.status, nu.login_time, nu.login_ip, ns.site_name,';
$alias = 'nu';
$join = [
[
'shop ns',
'nu.site_id = ns.site_id',
'left'
],
];
$list = model("user")->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
return $this->success($list);
}
/**
* 检测权限success通过error拒绝
* @param $url
* @param $app_module
* @param $group_info
* @param string $addon
* @return array
*/
public function checkAuth($url, $app_module, $group_info, $addon = '')
{
$auth_control = event("AuthControl", [ 'url' => $url, 'app_module' => $app_module ], 1);
if (!empty($auth_control)) {
if ($auth_control[ 'code' ] < 0) {
return $this->error();
}
}
// 权限组
if (empty($group_info)) {
return $this->error();
}
if ($group_info[ 'is_system' ] == 1) {
return $this->success();
}
$menu_model = new Menu();
$menu_info = $menu_model->getMenuInfoByUrl($url, $app_module, $addon)[ 'data' ];
if (!empty($menu_info)) {
if ($menu_info[ 'is_control' ] == 0) {
return $this->success();
}
if (strpos(',' . $group_info[ 'menu_array' ] . ',', ',' . $menu_info[ 'name' ] . ',') !== false) {
return $this->success();
} else {
return $this->error($menu_info);
}
} else {
$count = $menu_model->getMenuCount([ [ 'url', '=', $url ] ])['data'];
if ($count > 0) {
return $this->error();
}
return $this->success();
}
}
/**
* 检测和获取重定向信息
* @param $url_param
* @param $group_info
* @return array
*/
public function checkAndGetRedirectUrl($url_param, $group_info)
{
//静态处理不用重复查询
static $menu_tree_data = null;
static $menu_tree_md5 = '';
$res = [
'is_auth' => false,
'redirect_url' => '',
];
$menu_model = new Menu();
//链接对应的菜单
$menu_info = $menu_model->getMenuList([
['url', '=', $url_param['url']],
['app_module', '=', $url_param['app_module']],
], '*', 'level desc')[ 'data' ][0] ?? null;
//1、菜单不存在默认可以访问
if(empty($menu_info)){
$res['is_auth'] = true;
return $res;
}
//2、菜单不控制权限可以访问
if($menu_info['is_control'] == 0){
$res['is_auth'] = true;
return $res;
}
//菜单路径
$crumbs = [$menu_info];
while ($menu_info['parent']){
$menu_info = $menu_model->getMenuInfo([
['name', '=', $menu_info['parent']],
['app_module', '=', $url_param['app_module']],
])[ 'data' ];
array_unshift($crumbs, $menu_info);
}
//权限树
if(is_null($menu_tree_data) || md5($group_info[ 'menu_array' ]) != $menu_tree_md5){
$menu_tree_md5 = md5($group_info[ 'menu_array' ]);
$menu_array = "'".str_replace(',',"','", $group_info[ 'menu_array' ])."'";
$menu_list = $menu_model->getMenuList([
[ 'app_module', '=', $url_param['app_module'] ],
['', 'exp', \think\facade\Db::raw("name in ({$menu_array}) or is_control = 0")]
], '*', 'level asc,sort asc,id asc')['data'];
$menu_tree_data = list_to_tree($menu_list, 'name', 'parent', 'child_list', '');
}
$menu_tree = $menu_tree_data;
//菜单路径和权限树进行比对,如果比对到最后则说明有权限,没有比对到最后要看产生分歧的分支的首个有权限菜单
$is_to_last = true;
foreach($crumbs as $menu_info){
if(isset($menu_tree[$menu_info['name']])){
$menu_tree = $menu_tree[$menu_info['name']]['child_list'];
}else{
$is_to_last = false;
break;
}
}
//3、在权限集中可以访问
if($is_to_last){
$res['is_auth'] = true;
return $res;
}
//4、查找重定向链接重定向访问
$is_continue = true;
while ($is_continue){
$is_continue = false;
foreach($menu_tree as $menu_info){
if($menu_info['type'] == 'page'){
$real_menu_info = $menu_info;
$menu_tree = $menu_info['child_list'];
$is_continue = true;
break;
}
}
}
if(!empty($real_menu_info)){
if(strtolower($real_menu_info['url']) != strtolower($url_param['url'])){
$res['redirect_url'] = $real_menu_info['url'];
return $res;
}
}
return $res;
}
/*******************************************************************用户 编辑查询 end*****************************************************/
/*******************************************************************用户注册登录 start*****************************************************/
/**
* 用户登录
* @param $username
* @param $password
* @param string $app_module
* @param int $site_id
* @return array
*/
public function login($username, $password, $app_module = 'shop', $site_id = 0)
{
$user_condition = [
[ 'username', '=', $username ],
[ 'app_module', '=', $app_module ],
[ 'site_id', '=', $site_id ]
];
// if ($app_module == 'shop') $user_condition[] = [ 'group_id', '>', 0 ];
$user_info = model('user')->getInfo($user_condition);
if (empty($user_info)) {
return $this->error('', 'USER_LOGIN_ERROR');
}
if ($user_info[ 'password' ] != data_md5($password)) {
return $this->error('', 'USER_LOGIN_ERROR');
}
if ($user_info[ 'status' ] !== 1) {
return $this->error([], 'USER_IS_LOCKED');
}
// 检查是否有权限登录
if ($app_module == 'shop' && $user_info[ 'group_id' ] == 0) {
return $this->error('', 'PERMISSION_DENIED');
}
$this->initLogin($user_info);
return $this->success();
}
/**
* 初始化登录
* @param $user_info
*/
private function initLogin($user_info)
{
$time = time();
//初始化登录信息
$auth = array (
'uid' => $user_info[ 'uid' ],
'username' => $user_info[ 'username' ],
'create_time' => $user_info[ 'create_time' ],
'status' => $user_info[ 'status' ],
'group_id' => $user_info[ "group_id" ],
'site_id' => $user_info[ "site_id" ],
'app_group' => $user_info[ "app_group" ],
'is_admin' => $user_info[ 'is_admin' ],
'login_time' => $time,
'login_ip' => request()->ip(),
'sys_uid' => $user_info[ 'sys_uid' ],
'password' => $user_info[ 'password' ],
'app_module' => $user_info[ 'app_module' ]
);
//更新登录记录
$data = [
'login_time' => time(),
'login_ip' => request()->ip(),
];
model('user')->update($data, [ [ 'uid', "=", $user_info[ 'uid' ] ] ]);
Session::set($user_info[ 'app_module' ] . "_" . $user_info[ 'site_id' ] . ".uid", $user_info[ 'uid' ]);
Session::set($user_info[ 'app_module' ] . "_" . $user_info[ 'site_id' ] . ".user_info", $auth);
Session::set('app_module' . "_" . $user_info[ 'site_id' ] . ".login_module", $user_info[ 'app_module' ]);
$this->addUserLog($user_info[ 'uid' ], $user_info[ 'username' ], $user_info[ 'site_id' ], "用户登录", []);//添加日志
}
/**
* uni-app端用户登录
* @param $username
* @param $password
* @param $app_module
* @return array
*/
public function uniAppLogin($username, $password, $app_module)
{
$time = time();
// 验证参数 预留
$user_info = $this->getUserInfo([ [ 'username', "=", $username ] ], 'uid,app_module,site_id,group_id,group_name,username,status,is_admin,password')[ 'data' ];
if (empty($user_info)) {
return $this->error('', 'USER_LOGIN_ERROR');
} else if (data_md5($password) !== $user_info[ 'password' ]) {
return $this->error([], 'PASSWORD_ERROR');
} else if ($user_info[ 'status' ] !== 1) {
return $this->error([], 'USER_IS_LOCKED');
}
// 检查是否有权限登录
if ($app_module == 'shop' && $user_info[ 'group_id' ] == 0) {
return $this->error('', 'PERMISSION_DENIED');
}
//更新登录记录
$data = [
'login_time' => $time,
'login_ip' => request()->ip(),
];
model('user')->update($data, [ [ 'uid', "=", $user_info[ 'uid' ] ] ]);
$this->addUserLog($user_info[ 'uid' ], $user_info[ 'username' ], $user_info[ 'site_id' ], "用户登录", []); //添加日志
unset($user_info[ 'password' ]);
return $this->success($user_info);
}
/**
* 获取当前登录uid
* @param $app_module
* @param int $site_id
* @return mixed
*/
public function uid($app_module, $site_id = 0)
{
return Session::get($app_module . "_" . $site_id . ".uid");
}
/**
* 登录模块
* @param $site_id
* @return mixed|string
*/
public function loginModule($site_id)
{
$login_module = Session::get('app_module' . "_" . $site_id . ".login_module");
if (empty($login_module) || !strstr($_SERVER[ "REQUEST_URI" ], 'store/store')) {
return 'shop';
} else {
return $login_module;
}
}
/**
* 获取当前登录管理员信息
* @param $app_module
* @param int $site_id
* @return mixed
*/
public function userInfo($app_module, $site_id = 0)
{
return Session::get($app_module . "_" . $site_id . ".user_info");
}
/**
* 设置当前登录管理员信息
* @param $user_info
*/
public function setUserInfo($user_info)
{
Session::set($user_info[ 'app_module' ] . "_" . $user_info[ 'site_id' ] . ".user_info", $user_info);
}
/**
* 检测当前登录管理员密码是否正确
* @param $user_info
* @param $app_module
* @param int $site_id
* @return int|mixed
*/
public function checkPassword($user_info, $app_module, $site_id = 0)
{
// 兼容v5.2.0版本,下个版本可以移除
if (empty($user_info[ 'password' ])) {
return 1;
}
$count = model('user')->getCount([
[ 'site_id', '=', $site_id ],
[ 'app_module', '=', $app_module ],
[ 'uid', '=', $user_info[ 'uid' ] ],
[ 'username', '=', $user_info[ 'username' ] ],
[ 'password', '=', $user_info[ 'password' ] ]
]);
return $count;
}
/**
* 清除登录信息
*/
public function clearLogin($app_module, $site_id = 0)
{
Session::delete($app_module . "_" . $site_id);
}
/*******************************************************************用户注册登录 end*****************************************************/
/*******************************************************************用户日志 start*****************************************************/
/**
* 添加用户日志
* @param $uid
* @param $username
* @param $site_id
* @param $action_name
* @param array $data
* @return array
*/
public function addUserLog($uid, $username, $site_id, $action_name, $data = [])
{
$url = request()->parseUrl();
$ip = request()->ip();
$log = array (
"uid" => $uid,
"username" => $username,
"site_id" => $site_id,
"url" => $url,
"ip" => $ip,
"data" => json_encode($data),
"action_name" => $action_name,
"create_time" => time(),
);
$res = model("user_log")->add($log);
if ($res === false) {
return $this->error('', 'UNKNOW_ERROR');
}
return $this->success($res);
}
/**
* 删除用户日志
* @param $condition
* @return array
*/
public function deleteUserLog($condition)
{
$check_condition = array_column($condition, 2, 0);
$site_id = $check_condition[ 'site_id' ] ?? '';
if ($site_id === '') {
return $this->error('', 'REQUEST_SITE_ID');
}
$res = model("user_log")->delete($condition);
if ($res === false) {
return $this->error('', 'UNKNOW_ERROR');
}
return $this->success($res);
}
/**
* 获用户员日志分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @return array
*/
public function getUserLogPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = 'username, site_id, url, id, uid, data, ip, action_name, create_time')
{
$list = model('user_log')->pageList($condition, $field, $order, $page, $page_size);
return $this->success($list);
}
/*******************************************************************用户日志 end*****************************************************/
}