Index.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\admin\controller;
  4. use app\admin\model\Admin;
  5. use app\admin\model\Institution;
  6. use app\common\library\Gm;
  7. use ba\Random;
  8. use think\facade\Db;
  9. use Throwable;
  10. use ba\ClickCaptcha;
  11. use think\facade\Config;
  12. use think\facade\Validate;
  13. use app\common\facade\Token;
  14. use app\admin\model\AdminLog;
  15. use app\common\controller\Backend;
  16. use ba\Captcha;
  17. class Index extends Backend
  18. {
  19. protected array $noNeedLogin = ['logout', 'login','loginByToken','cs'];
  20. protected array $noNeedPermission = ['index','loginByToken','cs'];
  21. /**
  22. * 后台初始化请求
  23. * @return void
  24. * @throws Throwable
  25. */
  26. public function index(): void
  27. {
  28. $adminInfo = $this->auth->getInfo();
  29. $adminInfo['super'] = $this->auth->isSuperAdmin();
  30. unset($adminInfo['token'], $adminInfo['refresh_token']);
  31. $menus = $this->auth->getMenus();
  32. if (!$menus) {
  33. $this->error(__('No background menu, please contact super administrator!'));
  34. }
  35. foreach ($menus as $k=>$v) {
  36. foreach ($v as $kk=>$vv) {
  37. $menus[$k][strtolower($kk)] = $vv;
  38. if($kk == 'children') {
  39. continue;
  40. }
  41. unset($menus[$k][$kk]);
  42. }
  43. }
  44. foreach ($adminInfo as $k=>$v) {
  45. $adminInfo[strtolower($k)] = $v;
  46. unset($adminInfo[$k]);
  47. }
  48. $this->success('', [
  49. 'adminInfo' => $adminInfo,
  50. 'menus' => $menus,
  51. 'siteConfig' => [
  52. 'siteName' => get_sys_config('site_name'),
  53. 'version' => get_sys_config('version'),
  54. 'cdnUrl' => full_url(),
  55. 'apiUrl' => Config::get('buildadmin.api_url'),
  56. 'upload' => get_upload_config(),
  57. ],
  58. 'terminal' => [
  59. 'installServicePort' => Config::get('terminal.install_service_port'),
  60. 'npmPackageManager' => Config::get('terminal.npm_package_manager'),
  61. ]
  62. ]);
  63. }
  64. /**
  65. * 管理员登录
  66. * @return void
  67. * @throws Throwable
  68. */
  69. public function login()//: void
  70. {
  71. // 检查登录态
  72. if ($this->auth->isLogin()) {
  73. $this->error(__('You have already logged in. There is no need to log in again~'), [
  74. 'type' => $this->auth::LOGGED_IN
  75. ], $this->auth::LOGIN_RESPONSE_CODE);
  76. }
  77. $captchaSwitch = Config::get('buildadmin.admin_login_captcha');
  78. $captchaClickSwitch = Config::get('buildadmin.admin_login_click_captcha');
  79. // 检查提交
  80. if ($this->request->isPost()) {
  81. $username = $this->request->post('username');
  82. $password = $this->request->post('password');
  83. $keep = $this->request->post('keep');
  84. $rule = [
  85. 'username|' . __('Username') => 'require|length:3,30',
  86. 'password|' . __('Password') => 'require|regex:^(?!.*[&<>"\'\n\r]).{6,32}$',
  87. ];
  88. $data = [
  89. 'username' => $username,
  90. 'password' => $password,
  91. ];
  92. if ($captchaSwitch) {
  93. $rule['captcha_id|' . __('CaptchaId')] = 'require';
  94. $rule['captcha|' . __('Captcha')] = 'require';
  95. $data['captcha_id'] = $this->request->post('captcha_id');
  96. $data['captcha'] = $this->request->post('captcha');
  97. }
  98. if ($captchaClickSwitch) {
  99. $rule['captchaId|' . __('CaptchaId')] = 'require';
  100. $rule['captchaInfo|' . __('Captcha')] = 'require';
  101. $data['captchaId'] = $this->request->post('captchaId');
  102. $data['captchaInfo'] = $this->request->post('captchaInfo');
  103. }
  104. $validate = Validate::rule($rule);
  105. if (!$validate->check($data)) {
  106. $this->error($validate->getError());
  107. }
  108. if ($captchaSwitch) {
  109. $captchaObj = new Captcha();
  110. if (!$captchaObj->check($data['captcha'], $data['captcha_id'])) {
  111. $this->error(__('Captcha error'));
  112. }
  113. }
  114. if ($captchaClickSwitch) {
  115. $captchaObj = new ClickCaptcha();
  116. if (!$captchaObj->check($data['captchaId'], $data['captchaInfo'])) {
  117. $this->error(__('Captcha error'));
  118. }
  119. }
  120. AdminLog::instance()->setTitle(__('Login'));
  121. $force=0;
  122. $userId = '';
  123. $res = $this->auth->login($username, $password, (bool)$keep,$force,$userId);
  124. if ($res === true) {
  125. if($force == 1)
  126. {
  127. $this->error('当前密码为初始密码,为确保安全,请先修改密码',['force' => $force,'user'=>$userId]);
  128. }
  129. if($force == 2)
  130. {
  131. $this->error('密码超过90天未更改,为确保安全,请先修改密码',['force' => $force,'user'=>$userId]);
  132. }
  133. if($force == 3)
  134. {
  135. $this->error('当前密码为初始密码,请修改密码并重新登陆',['force' => $force,'user'=>$userId]);
  136. }
  137. $this->success(__('Login succeeded!'), [
  138. 'userInfo' => $this->auth->getInfo(),
  139. 'force' => $force
  140. ]);
  141. } else {
  142. $msg = $this->auth->getError();
  143. $msg = $msg ?: __('Incorrect user name or password!');
  144. $this->error($msg);
  145. }
  146. }
  147. $this->success('', [
  148. 'captcha' => $captchaSwitch,
  149. 'clickcaptcha' => $captchaClickSwitch
  150. ]);
  151. }
  152. public function loginByToken(): void
  153. {
  154. if ($this->request->isPost()) {
  155. $token = $this->request->post('token');
  156. $res = $this->auth->loginByToken($token);
  157. if ($res) {
  158. $this->success('success',$res);
  159. } else {
  160. $msg = $this->auth->getError();
  161. $this->error($msg);
  162. }
  163. }
  164. }
  165. /**
  166. * 管理员注销
  167. * @return void
  168. */
  169. public function logout(): void
  170. {
  171. if ($this->request->isPost()) {
  172. $refreshToken = $this->request->post('refreshToken', '');
  173. if ($refreshToken) Token::delete((string)$refreshToken);
  174. $this->auth->logout();
  175. $this->success();
  176. }
  177. }
  178. public function phpData()
  179. {
  180. phpinfo();
  181. }
  182. public function makeName()
  183. {
  184. $X = '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁';
  185. // 名字
  186. $M = '伟芳娜敏静丽强磊军洋杰瑞华文莉艳梅燕芬英杰萍芳芹丽娜宇轩成亮华敏娜思宇文静怡婷瑞雯佳欣雨婷玉莹嘉诚子涵思远文博雯丽雅静宇航浩然天宇俊杰文慧欣怡佳佳子轩晓东晓丽晓梅宇轩思远';
  187. // 随机生成姓氏
  188. $surname = mb_substr($X, mt_rand(0, mb_strlen($X, 'utf-8') - 1), 1);
  189. // 随机生成名字
  190. $givenName = mb_substr($M, mt_rand(0, mb_strlen($M, 'utf-8') - 1), 1);
  191. // 组合成完整的名字
  192. $i = rand(0,10);
  193. if($i > 5)
  194. {
  195. $fullName = $surname . $givenName;
  196. }else{
  197. $givenName2 = mb_substr($M, mt_rand(0, mb_strlen($M, 'utf-8') - 1), 1);
  198. $fullName = $surname . $givenName.$givenName2;
  199. }
  200. return $fullName;
  201. }
  202. public function makePhone()
  203. {
  204. $operators = array('134', '135', '136', '137', '138', '139', '147', '150', '151', '152', '157', '158', '159', '182', '183', '184', '187', '188', '198', '178', '130', '131', '132', '155', '156', '185', '186', '145', '176', '180', '181');
  205. // 随机选择一个运营商代码
  206. $operator = $operators[array_rand($operators)];
  207. // 生成地区代码(这里假设是随机的,实际上地区代码有固定的分配)
  208. $areaCode = str_pad((string)mt_rand(0, 9999), 4, '0', STR_PAD_LEFT);
  209. // 生成最后四位号码(随机)
  210. $lastFourDigits = str_pad((string)mt_rand(0, 9999), 4, '0', STR_PAD_LEFT);
  211. // 组合成完整的手机号码
  212. $phoneNumber = $operator . $areaCode . $lastFourDigits;
  213. return $phoneNumber;
  214. }
  215. public function curl_get($url)
  216. {
  217. //初始化
  218. $ch = curl_init();
  219. //设置选项,包括URL
  220. curl_setopt($ch, CURLOPT_URL, $url);
  221. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  222. curl_setopt($ch, CURLOPT_HEADER, 0);
  223. //执行并获取HTML文档内容
  224. $output = curl_exec($ch);
  225. //释放curl句柄
  226. curl_close($ch);
  227. //打印获得的数据
  228. return $output;
  229. }
  230. public function cs()
  231. {
  232. // var_dump(Gm::decrypt(Config::get('gm.key'), 'zn5B31gNjd4c055yucvnuW3bN+HnBJpxLpZrpWL34tU='));die;
  233. // report BG-JC-2024111478054679001
  234. // $key = 'zLxapoeqWYpoeqWY';
  235. // $arr = ['A'=>'371600199901105629','B'=>'BG-JY-2024110768407453001'];
  236. // $json = base64_encode(json_encode($arr));
  237. // $jm = Gm::encrypt($key,$json);
  238. // var_dump($jm);die;
  239. // $info = Gm::decrypt($key,$jm);
  240. // var_dump( json_decode(base64_decode($info),true));
  241. // die;
  242. //
  243. // $str = 'vvwwSfPoL5J1Tkq5BmRPiQ==';
  244. // $data = Gm::decrypt(Config::get('gm.key'),$str);
  245. // var_dump($data);die;
  246. // $data =[
  247. // ['suid'=>10001664,'uid'=>''],
  248. // ['suid'=>10002005,'uid'=>10000402],
  249. // ['suid'=>10002118,'uid'=>'']];
  250. //
  251. // $shop=array_column($data,'uid');
  252. // print_r($shop);
  253. // die;
  254. // set_time_limit(0);
  255. // $ins = Institution::select()->toArray();
  256. // foreach ($ins as $v)
  257. // {
  258. // for ($a=1;$a<50;$a++)
  259. // {
  260. // $salt = Random::build('alnum', 16);
  261. // $str = str_pad((string)$a, 4, "0", STR_PAD_LEFT);
  262. // $passwd = '123456';
  263. // $arr = [
  264. // 'username'=>'doctor'.$v['id'].$str,
  265. // 'nickname'=>$this->makeName(),
  266. // 'avatar'=>'/storage/default/20240918/8587087c718ab44a3b2a24b4584ff8321c7ecde8801f393.jpg',
  267. // 'mobile'=>$this->makePhone(),
  268. // 'salt'=>$salt,
  269. // 'password'=>encrypt_password($passwd, $salt),
  270. // 'admin_code'=>str_pad((string)$a, 4, "0", STR_PAD_LEFT),
  271. // 'institution_id'=>$v['id'],
  272. // 'institution'=>$v['name']
  273. // ];
  274. // Admin::insert($arr);
  275. // }
  276. // }
  277. // var_dump($ins);die;
  278. $image = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/attachment/lisi.pdf');
  279. echo ('data:application/pdf;base64,'.base64_encode($image));die;
  280. $str = '{
  281. "ID_CARDNUM": "230223199207293015",
  282. "ORGCODE": "BJ005",
  283. "ORGNAME": "检查名称",
  284. "DOCTORNAME": "医生名称",
  285. "DOCTORCODE": "医生编号"
  286. }';
  287. $key = 'zLxapoeqWYpoeqWY';
  288. $a = Gm::encrypt($key,(base64_encode($str)));
  289. $b = (Gm::decrypt(Config::get('gm.key'),'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'));
  290. $c = base64_decode($b);
  291. // var_dump($c);
  292. var_dump(json_decode($c,true));
  293. var_dump($a);die;
  294. // $arr = json_decode($str,true);
  295. // $data = $this->makeArr($arr);
  296. // echo (json_encode($data));
  297. }
  298. public function makeArr($data,$p=0)
  299. {
  300. $new = [];
  301. foreach ($data as $k=>$v)
  302. {
  303. if(is_array($v))
  304. {
  305. $arr = $this->makeArr($v[0],$k);
  306. $newK = Db::name('mapping')->where('action','jySave')->where('pKey',$p)->where('KEY',$k)->value('mKey');
  307. $new[$newK] = $arr;
  308. }else{
  309. $newK = Db::name('mapping')->where('action','jySave')->where('pKey',$p)->where('KEY',$k)->value('mKey');
  310. $new[$newK] = $v;
  311. }
  312. }
  313. return $new;
  314. }
  315. }