MemberService.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services\Api;
  12. use App\Helpers\Jwt;
  13. use App\Models\MemberModel;
  14. use App\Services\BaseService;
  15. use App\Services\RedisService;
  16. use phpQrcode\QRcode;
  17. /**
  18. * 会员管理-服务类
  19. * @author laravel开发员
  20. * @since 2020/11/11
  21. * Class MemberService
  22. * @package App\Services\Api
  23. */
  24. class MemberService extends BaseService
  25. {
  26. // 静态对象
  27. protected static $instance = null;
  28. /**
  29. * 构造函数
  30. * @author laravel开发员
  31. * @since 2020/11/11
  32. * MemberService constructor.
  33. */
  34. public function __construct()
  35. {
  36. $this->model = new MemberModel();
  37. }
  38. /**
  39. * 静态入口
  40. * @return MemberService|static|null
  41. */
  42. public static function make()
  43. {
  44. if (!self::$instance) {
  45. self::$instance = new static();
  46. }
  47. return self::$instance;
  48. }
  49. /**
  50. * 账号登录
  51. * @param $params
  52. * @return array|false
  53. */
  54. public function login($params)
  55. {
  56. // 账号登录
  57. $username = isset($params['username']) ? $params['username'] : '';
  58. $password = isset($params['password']) ? $params['password'] : '';
  59. if (empty($params) || empty($username) || empty($password)) {
  60. $this->error = 2014;
  61. return false;
  62. }
  63. // 验证是否注册,没有则注册
  64. $data = $this->model->where(['username' => $username, 'mark' => 1])->select(['id', 'username','user_type','password','stock_id', 'parent_id','nickname', 'code', 'status'])->first();
  65. $data = $data ? $data->toArray() : [];
  66. $userId = isset($data['id']) ? $data['id'] : 0;
  67. $status = isset($data['status']) ? $data['status'] : 0;
  68. $userType = isset($data['user_type']) ? $data['user_type'] : 0;
  69. $userPassword = isset($data['password']) ? $data['password'] : '';
  70. if (empty($data) || $userId<=0) {
  71. $this->error = 2014;
  72. return false;
  73. }
  74. if ($status != 1) {
  75. $this->error = 2015;
  76. return false;
  77. }
  78. if (!in_array($userType,[1,2,4])) {
  79. $this->error = 2016;
  80. return false;
  81. }
  82. // 验证登录密码
  83. if(empty($userPassword) || $userPassword != get_password($password)){
  84. $this->error = 2017;
  85. return false;
  86. }
  87. // 获取登录授权token
  88. $jwt = new Jwt('jwt_yd_app');
  89. $token = $jwt->getToken($userId);
  90. // 结果返回
  91. $result = [
  92. 'access_token' => $token,
  93. 'info' => ['uid' => $userId,'code'=>$data['code'],'nickname'=>$data['nickname'], 'username' => $data['username']],
  94. ];
  95. // 用户缓存信息
  96. $this->error = 2019;
  97. $data['token'] = $token;
  98. unset($data['password']);
  99. RedisService::set("auths:info:{$userId}", $data, 3 * 24 * 3600);
  100. return $result;
  101. }
  102. /**
  103. * 列表数据
  104. * @param $params
  105. * @param int $pageSize
  106. * @return array
  107. */
  108. public function getDataList($params, $pageSize = 12, $field=[])
  109. {
  110. $cacheKey ="caches:member:index:{$pageSize}_".($params? md5(json_encode($params)) : 0);
  111. $datas = RedisService::get($cacheKey);
  112. if(empty($datas)){
  113. $query = $this->getQuery($params);
  114. $list = $query->select($field?$field:['a.id','a.username','a.realname','a.nickname','a.mobile','a.stock_id','a.parent_id','a.line_id'])
  115. ->paginate($pageSize > 0 ? $pageSize : 9999999);
  116. $list = $list? $list->toArray() :[];
  117. if($list){
  118. foreach ($list['data'] as &$item){
  119. $item['username_text'] = format_mobile($item['username']);
  120. }
  121. $datas = [
  122. 'pageSize'=> $pageSize,
  123. 'total'=>isset($list['total'])? $list['total'] : 0,
  124. 'list'=> isset($list['data'])? $list['data'] : []
  125. ];
  126. RedisService::set($cacheKey, $datas, rand(5,10));
  127. }
  128. }
  129. return $datas;
  130. }
  131. /**
  132. * 查询条件
  133. * @param $params
  134. * @return mixed
  135. */
  136. public function getQuery($params)
  137. {
  138. $where = ['a.status'=>1,'a.mark' => 1];
  139. $status = isset($params['status'])? $params['status'] : 1;
  140. if($status>0){
  141. $where['a.status'] = $status;
  142. }else{
  143. unset($where['a.status']);
  144. }
  145. $model = $this->model->with(['stock','line'])
  146. ->from('member as a')
  147. ->where($where)
  148. ->where(function($query) use($params){
  149. // 仓库
  150. $stockId = isset($params['stock_id'])? $params['stock_id'] : 0;
  151. if($stockId){
  152. $query->where('a.stock_id', $stockId);
  153. }
  154. // 线路
  155. $lineId = isset($params['line_id'])? $params['line_id'] : 0;
  156. if($lineId && is_array($lineId)){
  157. $query->whereIn('a.line_id', $lineId);
  158. }else if($lineId>0){
  159. $query->where('a.line_id', $lineId);
  160. }
  161. // 业务员
  162. $parentId = isset($params['parent_id'])? $params['parent_id'] : 0;
  163. if($parentId>0){
  164. $query->where('a.parent_id', $parentId);
  165. }
  166. $userType = isset($params['user_type'])? $params['user_type'] : 0;
  167. if($userType && is_array($userType)){
  168. $query->whereIn('a.user_type', $userType);
  169. }else if($userType>0){
  170. $query->where('a.user_type', $userType);
  171. }
  172. })
  173. ->where(function ($query) use($params){
  174. $keyword = isset($params['keyword'])? $params['keyword'] : '';
  175. if($keyword){
  176. if(preg_match("/^1[0-9]{10}$/", $keyword)){
  177. $query->where(function ($query) use ($keyword){
  178. $query->where('a.username','=',$keyword);
  179. });
  180. }
  181. else if(preg_match("/^1[0-9]{4,10}$/", $keyword)){
  182. $query->where(function ($query) use ($keyword){
  183. $query->where('a.username','=',$keyword)
  184. ->orWhere('a.username','like',"%{$keyword}%")
  185. ->orWhere('a.mobile','like',"%{$keyword}%");
  186. });
  187. }else{
  188. $query->where(function ($query) use ($keyword){
  189. $query->where('a.username','like',"%{$keyword}%")
  190. ->orWhere('a.nickname','like',"%{$keyword}%")
  191. ->orWhere('a.mobile','like',"%{$keyword}%");
  192. });
  193. }
  194. }
  195. });
  196. return $model;
  197. }
  198. /**
  199. * 获取资料详情
  200. * @param $where
  201. * @param array $field
  202. */
  203. public function getInfo($where, array $field = [])
  204. {
  205. $defaultField = ['id', 'username','user_type', 'realname','mobile', 'nickname', 'code', 'parent_id', 'openid', 'status', 'avatar'];
  206. $field = $field ? $field : $defaultField;
  207. if (is_array($where)) {
  208. $info = $this->model->with(['parent','line'])->where(['mark'=>1])->where($where)->select($field)->first();
  209. } else {
  210. $info = $this->model->with(['parent','line'])->where(['mark'=>1])->where(['id' => (int)$where])->select($field)->first();
  211. }
  212. $info = $info ? $info->toArray() : [];
  213. if ($info) {
  214. if(isset($info['avatar'])){
  215. $info['avatar'] = $info['avatar'] ? get_image_url($info['avatar']) : '';
  216. }
  217. if(isset($info['parent'])){
  218. $info['parent'] = $info['parent']? $info['parent'] : [];
  219. }
  220. if(isset($info['mobile'])){
  221. $info['mobile'] = $info['mobile']? format_mobile($info['mobile']) : '';
  222. }
  223. }
  224. return $info;
  225. }
  226. /**
  227. * 生成普通参数二维码
  228. * @param $str 参数
  229. * @param bool $refresh 是否重新生成
  230. * @return bool
  231. */
  232. public function makeQrcode($str, $refresh = false, $size = 4, $margin = 2, $level = 2)
  233. {
  234. $basePath = base_path() . '/public';
  235. $qrFile = '/images/qrcode/';
  236. if (!is_dir($basePath . '/uploads' . $qrFile)) {
  237. @mkdir($basePath . '/uploads' . $qrFile, 0755, true);
  238. }
  239. $key = date('Ymd') . strtoupper(md5($str . '_' . $size . $margin . $level));
  240. $qrFile = $qrFile . "C_{$key}.png";
  241. $cacheKey = "caches:qrcodes:member_" . $key;
  242. if (RedisService::get($cacheKey) && is_file($basePath . '/uploads' . $qrFile) && !$refresh) {
  243. return $qrFile;
  244. }
  245. QRcode::png($str, $basePath . '/uploads' . $qrFile, $level, $size, $margin);
  246. if (!file_exists($basePath . '/uploads' . $qrFile)) {
  247. return false;
  248. }
  249. RedisService::set($cacheKey, ['str' => $str, 'qrcode' => $qrFile, 'date' => date('Y-m-d H:i:s')], 7 * 24 * 3600);
  250. return $qrFile;
  251. }
  252. /**
  253. * 修改头像
  254. * @param $userId
  255. * @param $avatar
  256. * @return mixed
  257. */
  258. public function saveAvatar($userId, $avatar)
  259. {
  260. $oldAvatar = $this->model->where(['id' => $userId])->value('avatar');
  261. if ($this->model->where(['id' => $userId])->update(['avatar' => $avatar, 'update_time' => time()])) {
  262. if ($oldAvatar && file_exists(ATTACHMENT_PATH . $oldAvatar)) {
  263. @unlink(ATTACHMENT_PATH . $oldAvatar);
  264. }
  265. return true;
  266. }
  267. return false;
  268. }
  269. /**
  270. * 修改账号信息
  271. * @param $userId
  272. * @param $params
  273. * @return bool
  274. */
  275. public function modify($userId, $params)
  276. {
  277. // 用户验证
  278. $info = $this->model->where(['id' => $userId, 'mark' => 1])
  279. ->select(['id', 'status'])
  280. ->first();
  281. if (!$info || $info['status'] != 1) {
  282. $this->error = 1029;
  283. return false;
  284. }
  285. // 密码校验
  286. $data = ['update_time' => time()];
  287. // 修改数据
  288. $nickname = isset($params['nickname']) ? $params['nickname'] : '';
  289. if (isset($params['nickname']) && $nickname) {
  290. $data['nickname'] = $nickname;
  291. }
  292. // 头像
  293. $avatar = isset($params['avatar']) ? $params['avatar'] : '';
  294. if (isset($params['avatar']) && $avatar) {
  295. $data['avatar'] = get_image_path($avatar);
  296. }
  297. if (!$this->model->where(['id' => $userId])->update($data)) {
  298. $this->error = 1014;
  299. return false;
  300. }
  301. $oldAvatar = isset($info['avatar'])? $info['avatar'] : '';
  302. if ($avatar && $oldAvatar && ($avatar != $oldAvatar) && file_exists(ATTACHMENT_PATH . $oldAvatar)) {
  303. @unlink(ATTACHMENT_PATH . $oldAvatar);
  304. }
  305. $this->error = 1013;
  306. return true;
  307. }
  308. }