Miniapp.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 应用管理
  7. */
  8. namespace app\system\controller\admin;
  9. use app\common\event\Admin;
  10. use app\common\model\SystemMember;
  11. use app\common\model\SystemMiniapp;
  12. use app\common\model\SystemMemberMiniapp;
  13. use app\common\model\SystemMemberMiniappOrder;
  14. use app\common\model\SystemUser;
  15. use app\common\model\SystemMemberBank;
  16. use app\common\model\SystemMemberBankBill;
  17. use app\system\event\AppConfig;
  18. use app\system\event\Install;
  19. use think\facade\Config;
  20. use think\facade\Request;
  21. use think\Validate;
  22. use think\Db;
  23. use Exception;
  24. class Miniapp extends Common{
  25. public function initialize(){
  26. parent::initialize();
  27. $this->assign('pathMaps', [['name'=>'应用管理','url'=>url("system/admin.miniapp/index")]]);
  28. }
  29. /**
  30. * 应用列表
  31. * @access public
  32. */
  33. public function index(){
  34. $view['list'] = SystemMiniapp::order('id desc')->paginate(10);
  35. $install_app = array_diff(Install::getDir(PATH_APP,['system','common','install']),SystemMiniapp::column('miniapp_dir')); //返回差集
  36. $i = 0;
  37. $app = [];
  38. foreach ($install_app as $value) {
  39. $app[$i] = AppConfig::version($value);
  40. $app[$i]['miniapp_dir'] = $value;
  41. $app[$i]['is_diyapp'] = $app[$i]['is_diyapp'] ?? 0;
  42. $i++;
  43. }
  44. $view['diff'] = $app;
  45. return view()->assign($view);
  46. }
  47. /**
  48. * @param $dir
  49. * @return \think\response\Json
  50. * 安装程序
  51. */
  52. public function install(){
  53. try {
  54. $dir = $this->request->param('dir');
  55. if(empty($dir)){
  56. return json(['code' => 0, 'msg' => '未找到应用']);
  57. }
  58. $param = AppConfig::version($dir);
  59. if(empty($param)){
  60. return json(['code' => 0, 'msg' => '未找到应用配置']);
  61. }
  62. $app = SystemMiniapp::column('miniapp_dir');
  63. if(in_array($dir,$app)){
  64. return json(['code' => 0, 'msg' => '应用已安装,禁止重复安装']);
  65. }
  66. //插入一条数据
  67. $data = [
  68. 'types' => $param['types'],
  69. 'title' => $param['name'],
  70. 'version' => $param['version'],
  71. 'is_manage' => $param['is_manage'],
  72. 'is_wechat_pay' => $param['is_wechat_pay'],
  73. 'is_alipay_pay' => $param['is_alipay_pay'],
  74. 'is_openapp' => $param['is_openapp'],
  75. 'is_diyapp' => 0,
  76. 'describe' => $param['describe'],
  77. 'view_pic' => Request::root(true)."/static/{$dir}/logo.png",
  78. 'style_pic' => [Request::root(true)."/static/{$dir}/logo.png"],
  79. 'content' => $param['describe'],
  80. 'expire_day' => 0,
  81. 'sell_price' => 0,
  82. 'market_price' => 0,
  83. 'miniapp_dir' => $dir,
  84. 'template_id' => 0,
  85. 'qrcode' => ''
  86. ];
  87. $validate = $this->validate($data,'miniapp.add');
  88. if(true !== $validate){
  89. return json(['code'=>0,'msg'=>$validate]);
  90. }
  91. $file = PATH_APP.$dir.'/install.sql';
  92. if (file_exists($file)) {
  93. $array = Install::get_sql_array($file,Config::get('database.prefix'));
  94. foreach ($array as $sql) {
  95. Db::query($sql);
  96. }
  97. SystemMiniapp::edit($data);
  98. return json(['code' => 200, 'msg' => '操作成功']);
  99. }else{
  100. return json(['code' => 0, 'msg' => '未找到数据库脚本']);
  101. }
  102. } catch (Exception $e) {
  103. return json(['code' => 0,'msg' =>$e->getMessage()]);
  104. }
  105. }
  106. /**
  107. * 用户列表
  108. */
  109. public function select(){
  110. $keyword = $this->request->param('keyword');
  111. if(!empty($keyword)){
  112. $condition['phone_id'] = $keyword;
  113. }else{
  114. $condition = [];
  115. }
  116. $view['keyword'] = $this->request->param('keyword');
  117. $view['input'] = $this->request->param('input');
  118. $view['list'] = SystemMiniapp::where($condition)->order('id desc')->paginate(10);
  119. return view()->assign($view);
  120. }
  121. /**
  122. * 切换应用管理
  123. * */
  124. public function manage(){
  125. $info = SystemMiniapp::where(['id' => $this->request->param('id/d')])->find();
  126. if(!$info){
  127. return json(['code'=>0,'msg'=>'操作失败']);
  128. }
  129. if($info['is_manage'] == 0){
  130. return json(['code'=>0,'msg'=>'当前应用没有独立管理中心']);
  131. }
  132. Admin::clearMiniapp();
  133. Admin::setMiniapp($info->id);
  134. return json(['code'=>200,'msg'=>'操作成功','url'=>url('system/admin.index/index')]);
  135. }
  136. /**
  137. * 列表
  138. * @access public
  139. */
  140. public function add(){
  141. if(request()->isAjax()){
  142. $data = [
  143. 'types' => $this->request->param('types/s'),
  144. 'title' => $this->request->param('title/s'),
  145. 'view_pic' => $this->request->param('view_pic/s'),
  146. 'style_pic' => $this->request->param('imgs/a'),
  147. 'version' => $this->request->param('version/s'),
  148. 'expire_day' => $this->request->param('expire_day/d'),
  149. 'sell_price' => $this->request->param('sell_price/f',0),
  150. 'market_price' => $this->request->param('market_price/f',0),
  151. 'is_manage' => $this->request->param('is_manage/d',0),
  152. 'is_diyapp' => $this->request->param('is_diyapp/d',0),
  153. 'is_wechat_pay' => $this->request->param('is_wechat_pay/d'),
  154. 'is_alipay_pay' => $this->request->param('is_alipay_pay/d'),
  155. 'miniapp_dir' => $this->request->param('miniapp_dir/s'),
  156. 'is_openapp' => $this->request->param('is_openapp/d'),
  157. 'template_id' => $this->request->param('template_id/d'),
  158. 'describe' => $this->request->param('describe/s'),
  159. 'qrcode' => $this->request->param('qrcode/s'),
  160. 'content' => $this->request->param('content/s')
  161. ];
  162. $validate = $this->validate($data,'miniapp.add');
  163. if(true !== $validate){
  164. return json(['code'=>0,'msg'=>$validate]);
  165. }
  166. $result = SystemMiniapp::edit($data);
  167. if(!$result){
  168. return json(['code'=>0,'msg'=>'操作失败']);
  169. }else{
  170. return json(['code'=>200,'msg'=>'操作成功','url'=>url('system/admin.miniapp/index')]);
  171. }
  172. }else{
  173. return view();
  174. }
  175. }
  176. /**
  177. * 编辑用户
  178. */
  179. public function edit(){
  180. if(request()->isAjax()){
  181. $data = [
  182. 'id' => $this->request->param('id/s'),
  183. 'types' => $this->request->param('types/s'),
  184. 'title' => $this->request->param('title/s'),
  185. 'view_pic' => $this->request->param('view_pic/s'),
  186. 'style_pic' => $this->request->param('imgs/a'),
  187. 'version' => $this->request->param('version/s'),
  188. 'expire_day' => $this->request->param('expire_day/d'),
  189. 'sell_price' => $this->request->param('sell_price/f',0),
  190. 'market_price' => $this->request->param('market_price/f',0),
  191. 'is_manage' => $this->request->param('is_manage/d',0),
  192. 'is_diyapp' => $this->request->param('is_diyapp/d',0),
  193. 'is_wechat_pay' => $this->request->param('is_wechat_pay/d'),
  194. 'is_alipay_pay' => $this->request->param('is_alipay_pay/d'),
  195. 'miniapp_dir' => $this->request->param('miniapp_dir/s'),
  196. 'is_openapp' => $this->request->param('is_openapp/d'),
  197. 'template_id' => $this->request->param('template_id/d'),
  198. 'describe' => $this->request->param('describe/s'),
  199. 'qrcode' => $this->request->param('qrcode/s'),
  200. 'content' => $this->request->param('content/s')
  201. ];
  202. $validate = $this->validate($data,'miniapp.edit');
  203. if(true !== $validate){
  204. return json(['code'=>0,'msg'=>$validate]);
  205. }
  206. $result = SystemMiniapp::edit($data);
  207. if(!$result){
  208. return json(['code'=>0,'msg'=>'操作失败']);
  209. }else{
  210. return json(['code'=>200,'msg'=>'操作成功','url'=>url('system/admin.miniapp/index')]);
  211. }
  212. }else{
  213. $id = $this->request->param('id/d');
  214. $info = SystemMiniapp::where(['id' => $id])->find();
  215. if(!$info){
  216. return $this->error("404 NOT FOUND");
  217. }
  218. $info['style_pic'] = empty($info['style_pic']) ? json_decode('[]',true):json_decode($info['style_pic'],true);
  219. $view['info'] = $info;
  220. return view()->assign($view);
  221. }
  222. }
  223. /**
  224. * 锁定
  225. * @param integer $id 用户ID
  226. */
  227. public function islock(int $id){
  228. $result = SystemMiniapp::lock($id);
  229. if(!$result){
  230. return json(['code'=>0,'message'=>'操作失败']);
  231. }else{
  232. return json(['code'=>200,'message'=>'操作成功']);
  233. }
  234. }
  235. /**
  236. * [删除]
  237. * @access public
  238. * @return bool
  239. */
  240. public function delete(int $id){
  241. $member = SystemMemberMiniapp::where(['miniapp_id' => $id])->count();
  242. if($member){
  243. return json(['code' => 0,'msg'=>'用户已开通当前应用,建议禁用']);
  244. }
  245. $result = SystemMiniapp::destroy($id);
  246. if(!$result){
  247. return json(['code' => 0,'msg'=>'操作失败']);
  248. }else{
  249. return json(['code' =>200,'msg'=>'操作成功']);
  250. }
  251. }
  252. /**
  253. * 授权管理
  254. * @access public
  255. * @return bool
  256. */
  257. public function authorizar(int $types = 0,int $miniapp_id = 0){
  258. $types = $types ? 1 : 0;
  259. $condition = [];
  260. $condition[] = ['is_lock','=',$types];
  261. $keyword = $this->request->param('keyword');
  262. if(!empty($keyword)){
  263. $data['keyword'] = $keyword;
  264. $is_mobile = Validate::make()->rule('keyword','mobile')->check($data);
  265. if($is_mobile){
  266. $member = SystemMember::where(['phone_id' => $keyword])->field('id')->find();
  267. $condition[] = ['member_id','=',$member ? $member->id : 0];
  268. }else{
  269. $condition[] = ['appname','like','%'.$keyword.'%'];
  270. }
  271. }
  272. if($miniapp_id){
  273. $condition[] = ['miniapp_id','=',$miniapp_id];
  274. }
  275. $view['keyword'] = $this->request->param('keyword');
  276. $view['list'] = SystemMemberMiniapp::where($condition)->order('id desc')->paginate(10,false,['query' =>['types' => $types]]);
  277. $apps = [];
  278. foreach ($view['list'] as $key => $value) {
  279. $apps[$key] = $value;
  280. switch ($value->miniapp->types) {
  281. case 'mp':
  282. $head_img = $value->mp_head_img;
  283. break;
  284. case 'program':
  285. $head_img = $value->miniapp_head_img;
  286. break;
  287. case 'app':
  288. $head_img = $value->head_img;
  289. break;
  290. default:
  291. $head_img = empty($value->mp_head_img) ? $value->miniapp_head_img : $value->mp_head_img;
  292. break;
  293. }
  294. $apps[$key]['logo'] = empty($head_img) ? "/static/{$value->miniapp->miniapp_dir}/logo.png" : $head_img;
  295. }
  296. $view['apps'] = $apps;
  297. $view['miniapp_num'] = SystemMiniapp ::where(['is_lock' => 0])->count();
  298. $view['member_miniapp_num'] = SystemMemberMiniapp ::where(['is_lock' => 0])->count();
  299. $view['consume'] = SystemMemberBankBill::where(['state' => 1])->sum('money');
  300. $view['money'] = SystemMemberBank ::sum('money');
  301. $view['consume'] = SystemMemberBankBill::where(['state' => 1])->sum('money');
  302. $view['types'] = $types;
  303. $view['miniapp_id'] = $miniapp_id;
  304. return view()->assign($view);
  305. }
  306. /**
  307. * 添加授权
  308. * @access public
  309. */
  310. public function addAuthorizar(){
  311. if(request()->isAjax()){
  312. $data = [
  313. 'member_id' => $this->request->param('member_id/d'),
  314. 'miniapp_id' => $this->request->param('miniapp_id/d'),
  315. 'appname' => $this->request->param('appname/s'),
  316. ];
  317. $validate = $this->validate($data,'miniapp.addAuthorizar');
  318. if(true !== $validate){
  319. return json(['code'=>0,'msg'=>$validate]);
  320. }
  321. //新增购买列表
  322. $miniapp = SystemMiniapp::where(['id' => $data['miniapp_id']])->find();
  323. $order['member_id'] = $data['member_id'];
  324. $order['miniapp_id'] = $data['miniapp_id'];
  325. $order['start_time'] = time();
  326. $order['end_time'] = time()+31536000;
  327. $order['is_lock'] = 1;
  328. $data['miniapp_order_id'] = SystemMemberMiniappOrder::insertGetId($order);
  329. if($data['miniapp_order_id']){
  330. $result = SystemMemberMiniapp::edit($data);
  331. if($result){
  332. return json(['code'=>200,'msg'=>'操作成功','url'=>url('system/admin.miniapp/Authorizar')]);
  333. }
  334. }
  335. return json(['code'=>0,'msg'=>'操作失败']);
  336. }else{
  337. return view();
  338. }
  339. }
  340. /**
  341. * 编辑授权
  342. */
  343. public function editAuthorizar(){
  344. if(request()->isAjax()){
  345. $data = [
  346. 'id' => $this->request->param('id/d'),
  347. 'uid' => $this->request->param('uid/d'),
  348. 'navbar_color' => $this->request->param('navbar_color/s','','filter\Filter::filter_escape'),
  349. 'navbar_style' => $this->request->param('navbar_style/s','','filter\Filter::filter_escape'),
  350. ];
  351. $validate = $this->validate($data,'miniapp.editAuthorizar');
  352. if(true !== $validate){
  353. return json(['code'=>0,'msg'=>$validate]);
  354. }
  355. $result = SystemMemberMiniapp::where(['id'=>$data['id']])->update($data);
  356. if(!$result){
  357. return json(['code'=>0,'msg'=>'操作失败']);
  358. }else{
  359. return json(['code'=>200,'msg'=>'操作成功','url'=>url('system/admin.miniapp/editAuthorizar',['id' => $data['id']])]);
  360. }
  361. }else{
  362. $id = $this->request->param('id/d');
  363. $info = SystemMemberMiniapp::where(['id' => $id])->find();
  364. if(!$info){
  365. return $this->error("404 NOT FOUND");
  366. }
  367. $view['info'] = $info;
  368. $view['user'] = SystemUser::where(['id' => $info->uid])->find();
  369. $view['miniapp'] = SystemMiniapp::where(['id' => $info->miniapp_id])->find();
  370. return view()->assign($view);
  371. }
  372. }
  373. /**
  374. * 锁定授权
  375. * @param integer $id 用户ID
  376. */
  377. public function islockAuthorizar(int $id){
  378. $result = SystemMemberMiniapp::lock($id);
  379. if($result){
  380. return enjson(200);
  381. }
  382. return enjson(0,'解锁失败,请先解除用户锁定。');
  383. }
  384. /**
  385. * 读取应用所属微信(属于前台管理员)
  386. * @return void
  387. */
  388. public function selectWechatUser(){
  389. $keyword = $this->request->param('keyword');
  390. $view['keyword'] = $this->request->param('keyword');
  391. $view['input'] = $this->request->param('input');
  392. $view['id'] = $this->request->param('id');
  393. $view['list'] = [];
  394. if(!empty($keyword)){
  395. $view['list'] = SystemUser::where(['member_miniapp_id' => $view['id']])->whereLike('nickname','%'.$keyword.'%')->order('id desc')->limit(10)->select();
  396. }
  397. return view()->assign($view);
  398. }
  399. }