module.mod.php 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493
  1. <?php
  2. /**
  3. * [WeEngine System] Copyright (c) 2014 WE7.CC
  4. * WeEngine is NOT a free software, it under the license terms, visited http://www.we7.cc/ for more details.
  5. */
  6. defined('IN_IA') or exit('Access Denied');
  7. function module_system() {
  8. return array(
  9. 'basic', 'news', 'music', 'service', 'userapi', 'recharge', 'images', 'video', 'voice', 'wxcard',
  10. 'custom', 'chats', 'paycenter', 'keyword', 'special', 'welcome', 'default', 'apply', 'reply', 'core', 'wxapp'
  11. );
  12. }
  13. function module_types() {
  14. static $types = array(
  15. 'business' => array(
  16. 'name' => 'business',
  17. 'title' => '主要业务',
  18. 'desc' => ''
  19. ),
  20. 'customer' => array(
  21. 'name' => 'customer',
  22. 'title' => '客户关系',
  23. 'desc' => ''
  24. ),
  25. 'activity' => array(
  26. 'name' => 'activity',
  27. 'title' => '营销及活动',
  28. 'desc' => ''
  29. ),
  30. 'services' => array(
  31. 'name' => 'services',
  32. 'title' => '常用服务及工具',
  33. 'desc' => ''
  34. ),
  35. 'biz' => array(
  36. 'name' => 'biz',
  37. 'title' => '行业解决方案',
  38. 'desc' => ''
  39. ),
  40. 'enterprise' => array(
  41. 'name' => 'enterprise',
  42. 'title' => '企业应用',
  43. 'desc' => ''
  44. ),
  45. 'h5game' => array(
  46. 'name' => 'h5game',
  47. 'title' => 'H5游戏',
  48. 'desc' => ''
  49. ),
  50. 'other' => array(
  51. 'name' => 'other',
  52. 'title' => '其他',
  53. 'desc' => ''
  54. )
  55. );
  56. return $types;
  57. }
  58. function module_support_type() {
  59. $module_support_type = array(
  60. 'wxapp_support' => array(
  61. 'type' => WXAPP_TYPE_SIGN,
  62. 'type_name' => '微信小程序',
  63. 'support' => MODULE_SUPPORT_WXAPP,
  64. 'not_support' => MODULE_NONSUPPORT_WXAPP,
  65. ),
  66. 'account_support' => array(
  67. 'type' => ACCOUNT_TYPE_SIGN,
  68. 'type_name' => '公众号',
  69. 'support' => MODULE_SUPPORT_ACCOUNT,
  70. 'not_support' => MODULE_NONSUPPORT_ACCOUNT,
  71. ),
  72. 'welcome_support' => array(
  73. 'type' => WELCOMESYSTEM_TYPE_SIGN,
  74. 'type_name' => '系统首页',
  75. 'support' => MODULE_SUPPORT_SYSTEMWELCOME,
  76. 'not_support' => MODULE_NONSUPPORT_SYSTEMWELCOME,
  77. ),
  78. 'webapp_support' => array(
  79. 'type' => WEBAPP_TYPE_SIGN,
  80. 'type_name' => 'PC',
  81. 'support' => MODULE_SUPPORT_WEBAPP,
  82. 'not_support' => MODULE_NOSUPPORT_WEBAPP,
  83. ),
  84. 'phoneapp_support' => array(
  85. 'type' => PHONEAPP_TYPE_SIGN,
  86. 'type_name' => 'APP',
  87. 'support' => MODULE_SUPPORT_PHONEAPP,
  88. 'not_support' => MODULE_NOSUPPORT_PHONEAPP,
  89. ),
  90. 'aliapp_support' => array(
  91. 'type' => ALIAPP_TYPE_SIGN,
  92. 'type_name' => '支付宝小程序',
  93. 'support' => MODULE_SUPPORT_ALIAPP,
  94. 'not_support' => MODULE_NOSUPPORT_ALIAPP,
  95. ),
  96. 'baiduapp_support' => array(
  97. 'type' => BAIDUAPP_TYPE_SIGN,
  98. 'type_name' => '百度小程序',
  99. 'support' => MODULE_SUPPORT_BAIDUAPP,
  100. 'not_support' => MODULE_NOSUPPORT_BAIDUAPP,
  101. ),
  102. 'toutiaoapp_support' => array(
  103. 'type' => TOUTIAOAPP_TYPE_SIGN,
  104. 'type_name' => '抖音小程序',
  105. 'support' => MODULE_SUPPORT_TOUTIAOAPP,
  106. 'not_support' => MODULE_NOSUPPORT_TOUTIAOAPP,
  107. )
  108. );
  109. return $module_support_type;
  110. }
  111. function module_entries($name, $types = array(), $rid = 0, $args = null) {
  112. load()->func('communication');
  113. global $_W;
  114. $ts = array('rule', 'cover', 'menu', 'home', 'profile', 'shortcut', 'function', 'mine', 'system_welcome');
  115. if (empty($types)) {
  116. $types = $ts;
  117. } else {
  118. $types = array_intersect($types, $ts);
  119. }
  120. $bindings = pdo_getall('modules_bindings', array('module' => $name, 'entry' => $types), array(), '', 'displayorder DESC, multilevel DESC, eid ASC');
  121. $entries = array();
  122. $cache_key = cache_system_key('module_entry_call', array('module_name' => $name, 'uniacid' => $_W['uniacid']));
  123. $entry_call = cache_load($cache_key);
  124. if (empty($entry_call)) {
  125. $entry_call = array();
  126. }
  127. foreach ($bindings as $bind) {
  128. if (!empty($bind['call'])) {
  129. if (empty($entry_call[$bind['entry']])) {
  130. $call_url = url('utility/bindcall', array('modulename' => $bind['module'], 'callname' => $bind['call'], 'args' => $args, 'uniacid' => $_W['uniacid']));
  131. $response = ihttp_request($call_url);
  132. if (is_error($response) || $response['code'] != 200) {
  133. $response = ihttp_request($_W['siteroot'] . 'web/' . $call_url);
  134. if (is_error($response) || $response['code'] != 200) {
  135. continue;
  136. }
  137. }
  138. $response = json_decode($response['content'], true);
  139. $ret = empty($response['message']['message']) ? '' : $response['message']['message'];
  140. if (is_array($ret)) {
  141. foreach ($ret as $i => $et) {
  142. if (empty($et['url'])) {
  143. continue;
  144. }
  145. $urlinfo = url_params($et['url']);
  146. $et['do'] = empty($et['do']) ? $urlinfo['do'] : $et['do'];
  147. $et['url'] = $et['url'] . '&__title=' . urlencode($et['title']);
  148. $entry_call[$bind['entry']][] = array('eid' => 'user_' . $i, 'title' => $et['title'], 'do' => $et['do'], 'url' => $et['url'], 'from' => 'call', 'icon' => $et['icon'], 'displayorder' => $et['displayorder']);
  149. }
  150. }
  151. cache_write($cache_key, $entry_call, 300);
  152. }
  153. $entries[$bind['entry']] = empty($entry_call[$bind['entry']]) ? array() : $entry_call[$bind['entry']];
  154. } else {
  155. if (in_array($bind['entry'], array('cover', 'home', 'profile', 'shortcut'))) {
  156. $url = murl('entry', array('eid' => $bind['eid']));
  157. }
  158. if (in_array($bind['entry'], array('menu', 'system_welcome'))) {
  159. $url = wurl("site/entry", array('eid' => $bind['eid']));
  160. }
  161. if ($bind['entry'] == 'mine') {
  162. $url = $bind['url'];
  163. }
  164. if ($bind['entry'] == 'rule') {
  165. $par = array('eid' => $bind['eid']);
  166. if (!empty($rid)) {
  167. $par['id'] = $rid;
  168. }
  169. $url = wurl("site/entry", $par);
  170. }
  171. if (empty($bind['icon'])) {
  172. $bind['icon'] = 'wi wi-appsetting';
  173. }
  174. if (!defined('SYSTEM_WELCOME_MODULE') && $bind['entry'] == 'system_welcome') {
  175. continue;
  176. }
  177. $entries[$bind['entry']][] = array(
  178. 'eid' => $bind['eid'],
  179. 'title' => $bind['title'],
  180. 'do' => $bind['do'],
  181. 'url' => !$bind['multilevel'] ? $url : '',
  182. 'from' => 'define',
  183. 'icon' => $bind['icon'],
  184. 'displayorder' => $bind['displayorder'],
  185. 'direct' => $bind['direct'],
  186. 'multilevel' => $bind['multilevel'],
  187. 'parent' => $bind['parent'],
  188. );
  189. }
  190. }
  191. return $entries;
  192. }
  193. function module_app_entries($name, $types = array(), $args = null) {
  194. global $_W;
  195. $ts = array('rule', 'cover', 'menu', 'home', 'profile', 'shortcut', 'function');
  196. if (empty($types)) {
  197. $types = $ts;
  198. } else {
  199. $types = array_intersect($types, $ts);
  200. }
  201. $bindings = pdo_getall('modules_bindings', array('module' => $name, 'entry' => $types));
  202. $entries = array();
  203. foreach ($bindings as $bind) {
  204. if (!empty($bind['call'])) {
  205. $extra = array();
  206. $extra['Host'] = $_SERVER['HTTP_HOST'];
  207. load()->func('communication');
  208. $urlset = parse_url($_W['siteurl']);
  209. $urlset = pathinfo($urlset['path']);
  210. $response = ihttp_request($_W['sitescheme'] . $extra['Host'] . $urlset['dirname'] . '/' . url('utility/bindcall', array('modulename' => $bind['module'], 'callname' => $bind['call'], 'args' => $args, 'uniacid' => $_W['uniacid'])), array('W' => base64_encode(iserializer($_W))), $extra);
  211. if (is_error($response)) {
  212. continue;
  213. }
  214. $response = json_decode($response['content'], true);
  215. $ret = $response['message']['message'];
  216. if (is_array($ret)) {
  217. foreach ($ret as $et) {
  218. $et['url'] = $et['url'] . '&__title=' . urlencode($et['title']);
  219. $entries[$bind['entry']][] = array('title' => $et['title'], 'url' => $et['url'], 'from' => 'call');
  220. }
  221. }
  222. } else {
  223. if ($bind['entry'] == 'cover') {
  224. $url = murl("entry", array('eid' => $bind['eid']));
  225. }
  226. if ($bind['entry'] == 'home') {
  227. $url = murl("entry", array('eid' => $bind['eid']));
  228. }
  229. if ($bind['entry'] == 'profile') {
  230. $url = murl("entry", array('eid' => $bind['eid']));
  231. }
  232. if ($bind['entry'] == 'shortcut') {
  233. $url = murl("entry", array('eid' => $bind['eid']));
  234. }
  235. $entries[$bind['entry']][] = array('title' => $bind['title'], 'do' => $bind['do'], 'url' => $url, 'from' => 'define');
  236. }
  237. }
  238. return $entries;
  239. }
  240. function module_entry($eid) {
  241. $sql = "SELECT * FROM " . tablename('modules_bindings') . " WHERE `eid`=:eid";
  242. $pars = array();
  243. $pars[':eid'] = $eid;
  244. $entry = pdo_fetch($sql, $pars);
  245. if (empty($entry)) {
  246. return error(1, '模块菜单不存在');
  247. }
  248. $module = module_fetch($entry['module']);
  249. if (empty($module)) {
  250. return error(2, '模块不存在');
  251. }
  252. $querystring = array(
  253. 'do' => $entry['do'],
  254. 'm' => $entry['module'],
  255. );
  256. if (!empty($entry['state'])) {
  257. $querystring['state'] = $entry['state'];
  258. }
  259. $entry['url'] = murl('entry', $querystring);
  260. $entry['url_show'] = murl('entry', $querystring, true, true);
  261. return $entry;
  262. }
  263. function module_build_form($name, $rid, $option = array()) {
  264. $rid = intval($rid);
  265. $m = WeUtility::createModule($name);
  266. if (!empty($m)) {
  267. return $m->fieldsFormDisplay($rid, $option);
  268. } else {
  269. return null;
  270. }
  271. }
  272. function module_save_group_package($package) {
  273. global $_W;
  274. load()->model('user');
  275. load()->model('cache');
  276. if (empty($package['name'])) {
  277. return error(-1, '请输入套餐名');
  278. }
  279. if (!empty($package['modules'])) {
  280. $package['modules'] = iserializer($package['modules']);
  281. }
  282. if (!empty($package['templates'])) {
  283. $templates = array();
  284. foreach ($package['templates'] as $id) {
  285. $templates[] = $id;
  286. }
  287. $package['templates'] = iserializer($templates);
  288. }
  289. if (!empty($package['id'])) {
  290. $name_exist = pdo_get('uni_group', array('uniacid' => 0, 'id <>' => $package['id'], 'name' => $package['name']));
  291. } else {
  292. $name_exist = pdo_get('uni_group', array('uniacid' => 0, 'name' => $package['name']));
  293. }
  294. if (!empty($name_exist)) {
  295. return error(-1, '套餐名已存在');
  296. }
  297. if (!empty($package['id'])) {
  298. pdo_update('uni_group', $package, array('id' => $package['id']));
  299. cache_build_account_modules();
  300. } else {
  301. pdo_insert('uni_group', $package);
  302. $uni_group_id = pdo_insertid();
  303. if (user_is_vice_founder()) {
  304. $table = table('users_founder_own_uni_groups');
  305. $table->addOwnUniGroup($_W['uid'], $uni_group_id);
  306. }
  307. }
  308. cache_build_uni_group();
  309. return error(0, '添加成功');
  310. }
  311. function module_fetch($name, $enabled = true) {
  312. global $_W;
  313. $cachekey = cache_system_key('module_info', array('module_name' => $name));
  314. $module = cache_load($cachekey);
  315. if (empty($module)) {
  316. $module_info = table('modules')->getByName($name);
  317. if (empty($module_info)) {
  318. return array();
  319. }
  320. $module_info['isdisplay'] = 1;
  321. $module_info['logo'] = tomedia($module_info['logo']);
  322. $module_info['preview'] = tomedia(IA_ROOT . '/addons/' . $module_info['name'] . '/preview.jpg', '', true);
  323. if (file_exists(IA_ROOT . '/addons/' . $module_info['name'] . '/preview-custom.jpg')) {
  324. $module_info['preview'] = tomedia(IA_ROOT . '/addons/' . $module_info['name'] . '/preview-custom.jpg', '', true);
  325. }
  326. if (APPLICATION_TYPE_TEMPLATES == $module_info['application_type']) {
  327. $module_info['preview'] = tomedia(IA_ROOT . '/app/themes/' . $module_info['name'] . '/preview-custom.jpg', '', true);
  328. }
  329. $modules_plugin = table('modules_plugin')->getAllByNameOrMainModule($module_info['name']);
  330. $main_module = array_column($modules_plugin, 'main_module');
  331. if (in_array($module_info['name'], $main_module)) {
  332. $module_info['plugin_list'] = array_column($modules_plugin, 'name');
  333. } else {
  334. $module_info['main_module'] = current($main_module);
  335. if (!empty($module_info['main_module'])) {
  336. $main_module_info = module_fetch($module_info['main_module'], false);
  337. if (empty($main_module_info)) {
  338. $main_module_info = pdo_get('modules_cloud', array('name' => $module_info['main_module']));
  339. }
  340. $module_info['main_module_logo'] = $main_module_info['logo'];
  341. $module_info['main_module_title'] = $main_module_info['title'];
  342. }
  343. }
  344. $module_receive_ban = (array)setting_load('module_receive_ban');
  345. if (is_array($module_receive_ban['module_receive_ban']) && in_array($name, $module_receive_ban['module_receive_ban'])) {
  346. $module_info['is_receive_ban'] = true;
  347. }
  348. $module_ban = (array)setting_load('module_ban');
  349. if (is_array($module_ban['module_ban']) && in_array($name, $module_ban['module_ban'])) {
  350. $module_info['is_ban'] = true;
  351. }
  352. $module_upgrade = (array)setting_load('module_upgrade');
  353. if (is_array($module_upgrade['module_upgrade']) && in_array($name, array_keys($module_upgrade['module_upgrade']))) {
  354. $module_info['is_upgrade'] = true;
  355. }
  356. $module_info['recycle_info'] = array();
  357. $recycle_info = table('modules_recycle')->getByName($name);
  358. if (!empty($recycle_info)) {
  359. $is_delete = true;
  360. foreach (module_support_type() as $support => $value) {
  361. if (!empty($recycle_info[MODULE_RECYCLE_UNINSTALL_IGNORE][$support])) {
  362. $module_info['recycle_info'][$support] = MODULE_RECYCLE_UNINSTALL_IGNORE;
  363. } else {
  364. $module_info['recycle_info'][$support] = empty($recycle_info[MODULE_RECYCLE_INSTALL_DISABLED][$support]) ? 0 : MODULE_RECYCLE_INSTALL_DISABLED;
  365. }
  366. if ($module_info[$support] == $value['support'] && empty($module_info['recycle_info'][$support])) {
  367. $is_delete = false;
  368. }
  369. }
  370. $module_info['is_delete'] = $is_delete;
  371. }
  372. $module = $module_info;
  373. cache_write($cachekey, $module_info);
  374. }
  375. if (!empty($enabled)) {
  376. if (!empty($module['is_delete'])) {
  377. return array();
  378. }
  379. }
  380. if (!empty($module) && !empty($_W['uniacid'])) {
  381. $setting_cachekey = cache_system_key('module_setting', array('module_name' => $name, 'uniacid' => $_W['uniacid']));
  382. $setting = cache_load($setting_cachekey);
  383. if (empty($setting)) {
  384. $setting = table('uni_account_modules')->getByUniacidAndModule($name, $_W['uniacid']);
  385. $setting = empty($setting) ? array('module' => $name) : $setting;
  386. cache_write($setting_cachekey, $setting);
  387. }
  388. $module['config'] = empty($setting['settings']) ? '' : $setting['settings'];
  389. $module['enabled'] = $module['issystem'] || !isset($setting['enabled']) ? 1 : $setting['enabled'];
  390. $module['displayorder'] = empty($setting['displayorder']) ? '' : $setting['displayorder'];
  391. $module['shortcut'] = empty($setting['shortcut']) ? '' : $setting['shortcut'];
  392. $module['module_shortcut'] = empty($setting['module_shortcut']) ? '' : $setting['module_shortcut'];
  393. }
  394. return $module;
  395. }
  396. function module_main_info($module_name) {
  397. $cachekey = cache_system_key('module_main_info', array('module_name' => $module_name));
  398. $module = cache_load($cachekey);
  399. if (empty($module)) {
  400. $fileds = array('name', 'title', 'version', 'logo', 'account_support', 'wxapp_support', 'webapp_support', 'phoneapp_support', 'aliapp_support', 'baiduapp_support', 'toutiaoapp_support', 'welcome_support');
  401. $module_info = pdo_get('modules', array('name' => $module_name), $fileds);
  402. if (empty($module_info)) {
  403. return array();
  404. }
  405. $module_info['logo'] = tomedia($module_info['logo']);
  406. $module = $module_info;
  407. cache_write($cachekey, $module_info);
  408. }
  409. return $module;
  410. }
  411. function module_permission_fetch($name) {
  412. $module = module_fetch($name);
  413. $data = array();
  414. if ($module['settings']) {
  415. $data[] = array('title' => '参数设置', 'permission' => $name . '_settings');
  416. }
  417. if ($module['isrulefields']) {
  418. $data[] = array('title' => '回复规则列表', 'permission' => $name . '_rule');
  419. }
  420. $entries = module_entries($name);
  421. if (!empty($entries['home'])) {
  422. $data[] = array('title' => '微站首页导航', 'permission' => $name . '_home');
  423. }
  424. if (!empty($entries['profile'])) {
  425. $data[] = array('title' => '个人中心导航', 'permission' => $name . '_profile');
  426. }
  427. if (!empty($entries['shortcut'])) {
  428. $data[] = array('title' => '快捷菜单', 'permission' => $name . '_shortcut');
  429. }
  430. if (!empty($entries['cover'])) {
  431. foreach ($entries['cover'] as $cover) {
  432. $data[] = array('title' => $cover['title'], 'permission' => $name . '_cover_' . $cover['do']);
  433. }
  434. }
  435. if (!empty($entries['menu'])) {
  436. foreach ($entries['menu'] as $menu) {
  437. if (!empty($menu['multilevel'])) {
  438. continue;
  439. }
  440. $data[$menu['do']] = array('title' => $menu['title'], 'permission' => $name . '_menu_' . $menu['do']);
  441. }
  442. }
  443. unset($entries);
  444. if (!empty($module['permissions'])) {
  445. $module['permissions'] = (array)iunserializer($module['permissions']);
  446. foreach ($module['permissions'] as $permission) {
  447. if (!empty($permission['parent']) && !empty($data[$permission['parent']])) {
  448. $sub_permission = array(
  449. 'title' => $permission['title'],
  450. 'permission' => $name . '_menu_' . $permission['parent'] . '_' . $permission['permission'],
  451. );
  452. if (empty($data[$permission['parent']]['sub_permission'])) {
  453. $data[$permission['parent']]['sub_permission'] = array($sub_permission);
  454. } else {
  455. array_push($data[$permission['parent']]['sub_permission'], $sub_permission);
  456. }
  457. }
  458. $data[] = array('title' => $permission['title'], 'permission' => $name . '_permission_' . $permission['permission']);
  459. }
  460. }
  461. return $data;
  462. }
  463. function module_get_plugin_list($module_name) {
  464. $module_info = module_fetch($module_name);
  465. if (!empty($module_info['plugin_list']) && is_array($module_info['plugin_list'])) {
  466. $plugin_list = array();
  467. foreach ($module_info['plugin_list'] as $plugin) {
  468. $plugin_info = module_fetch($plugin);
  469. if (!empty($plugin_info)) {
  470. $plugin_list[$plugin] = $plugin_info;
  471. }
  472. }
  473. return $plugin_list;
  474. } else {
  475. return array();
  476. }
  477. }
  478. function module_status($module) {
  479. load()->model('cloud');
  480. $result = array(
  481. 'upgrade' => array(
  482. 'has_upgrade' => false,
  483. ),
  484. 'ban' => false,
  485. );
  486. $module_cloud_info = table('modules_cloud')->getByName($module);
  487. if (!empty($module_cloud_info['has_new_version']) || !empty($module_cloud_info['has_new_branch'])) {
  488. $result['upgrade'] = array(
  489. 'has_upgrade' => true,
  490. 'name' => $module_cloud_info['title'],
  491. 'version' => $module_cloud_info['version'],
  492. );
  493. }
  494. if (!empty($module_cloud_info['is_ban'])) {
  495. $result['ban'] = true;
  496. }
  497. return $result;
  498. }
  499. function module_exist_in_account($module_name, $uniacid) {
  500. load()->model('user');
  501. $module_name = trim($module_name);
  502. $uniacid = intval($uniacid);
  503. if (empty($module_name) || empty($uniacid)) {
  504. return false;
  505. }
  506. $result = table('uni_modules')->where(array('uniacid' => $uniacid, 'module_name' => $module_name))->getcolumn('id');
  507. return $result ? true : false;
  508. }
  509. function module_get_user_account_list($uid, $module_name) {
  510. $accounts_list = array();
  511. $uid = intval($uid);
  512. $module_name = trim($module_name);
  513. if (empty($uid) || empty($module_name)) {
  514. return $accounts_list;
  515. }
  516. $module_info = module_fetch($module_name);
  517. if (empty($module_info)) {
  518. return $accounts_list;
  519. }
  520. $account_users_info = table('account')->userOwnedAccount($uid);
  521. if (empty($account_users_info)) {
  522. return $accounts_list;
  523. }
  524. foreach ($account_users_info as $account) {
  525. if (empty($account['uniacid'])) {
  526. continue;
  527. }
  528. $uniacid = 0;
  529. if (($account['type'] == ACCOUNT_TYPE_OFFCIAL_NORMAL || $account['type'] == ACCOUNT_TYPE_OFFCIAL_AUTH) && $module_info[MODULE_SUPPORT_ACCOUNT_NAME] == MODULE_SUPPORT_ACCOUNT) {
  530. $uniacid = $account['uniacid'];
  531. } elseif ($account['type'] == ACCOUNT_TYPE_APP_NORMAL && $module_info['wxapp_support'] == MODULE_SUPPORT_WXAPP) {
  532. $uniacid = $account['uniacid'];
  533. } elseif (($account['type'] == ACCOUNT_TYPE_WEBAPP_NORMAL && $module_info[MODULE_SUPPORT_WEBAPP_NAME] == MODULE_SUPPORT_WEBAPP)) {
  534. $uniacid = $account['uniacid'];
  535. } elseif (($account['type'] == ACCOUNT_TYPE_PHONEAPP_NORMAL && $module_info[MODULE_SUPPORT_PHONEAPP_NAME] == MODULE_SUPPORT_PHONEAPP)) {
  536. $uniacid = $account['uniacid'];
  537. } elseif (($account['type'] == ACCOUNT_TYPE_ALIAPP_NORMAL && $module_info[MODULE_SUPPORT_ALIAPP_NAME] == MODULE_SUPPORT_ALIAPP)) {
  538. $uniacid = $account['uniacid'];
  539. }
  540. if (!empty($uniacid)) {
  541. if (module_exist_in_account($module_name, $uniacid)) {
  542. $accounts_list[$uniacid] = $account;
  543. }
  544. }
  545. }
  546. return $accounts_list;
  547. }
  548. function module_link_uniacid_fetch($uid, $module_name) {
  549. load()->model('phoneapp');
  550. $result = array();
  551. $uid = intval($uid);
  552. $module_name = trim($module_name);
  553. if (empty($uid) || empty($module_name)) {
  554. return $result;
  555. }
  556. $accounts_list = module_get_user_account_list($uid, $module_name);
  557. if (empty($accounts_list)) {
  558. return $result;
  559. }
  560. $accounts_link_result = array();
  561. foreach ($accounts_list as $key => $account_value) {
  562. $account_info = uni_fetch($account_value['uniacid']);
  563. if ($account_info->supportVersion) {
  564. if ($account_value['type'] == ACCOUNT_TYPE_PHONEAPP_NORMAL) {
  565. $account_value['versions'] = phoneapp_version_all($account_value['uniacid']);
  566. } else {
  567. $account_value['versions'] = miniapp_version_all($account_value['uniacid']);
  568. }
  569. if (empty($account_value['versions'])) {
  570. $accounts_link_result[$key] = $account_value;
  571. continue;
  572. }
  573. foreach ($account_value['versions'] as $version_key => $version_value) {
  574. if (empty($version_value['modules'])) {
  575. continue;
  576. }
  577. $version_module_names = array_column($version_value['modules'], 'name');
  578. if (!in_array($module_name, $version_module_names)) {
  579. continue;
  580. }
  581. if (empty($version_value['modules'][0]['account']) || !is_array($version_value['modules'][0]['account'])) {
  582. $accounts_link_result[$key] = $account_value;
  583. continue;
  584. }
  585. if (!empty($version_value['modules'][0]['account']['uniacid'])) {
  586. $accounts_link_result[$version_value['modules'][0]['account']['uniacid']][] = array(
  587. 'uniacid' => $key,
  588. 'version' => $version_value['version'],
  589. 'version_id' => $version_value['id'],
  590. 'name' => $account_value['name'],
  591. );
  592. unset($account_value['versions'][$version_key]);
  593. }
  594. }
  595. } elseif ($account_value['type'] == ACCOUNT_TYPE_OFFCIAL_NORMAL || $account_value['type'] == ACCOUNT_TYPE_OFFCIAL_AUTH) {
  596. if (empty($accounts_link_result[$key])) {
  597. $accounts_link_result[$key] = $account_value;
  598. } else {
  599. $link_wxapp = $accounts_link_result[$key];
  600. $accounts_link_result[$key] = $account_value;
  601. $accounts_link_result[$key]['link_wxapp'] = $link_wxapp;
  602. }
  603. } else {
  604. if (empty($accounts_link_result[$key])) {
  605. $accounts_link_result[$key] = $account_value;
  606. }
  607. }
  608. }
  609. if (!empty($accounts_link_result)) {
  610. foreach ($accounts_link_result as $link_key => $link_value) {
  611. if (in_array($link_value['type'], array(ACCOUNT_TYPE_OFFCIAL_NORMAL, ACCOUNT_TYPE_OFFCIAL_AUTH))) {
  612. $link_value['type_name'] = ACCOUNT_TYPE_SIGN;
  613. } elseif (in_array($link_value['type'], array(ACCOUNT_TYPE_APP_NORMAL, ACCOUNT_TYPE_APP_AUTH))) {
  614. $link_value['type_name'] = WXAPP_TYPE_SIGN;
  615. } elseif ($link_value['type'] == ACCOUNT_TYPE_WEBAPP_NORMAL) {
  616. $link_value['type_name'] = WEBAPP_TYPE_SIGN;
  617. } elseif ($link_value['type'] == ACCOUNT_TYPE_PHONEAPP_NORMAL) {
  618. $link_value['type_name'] = PHONEAPP_TYPE_SIGN;
  619. } elseif ($link_value['type'] == ACCOUNT_TYPE_ALIAPP_NORMAL) {
  620. $link_value['type_name'] = ALIAPP_TYPE_SIGN;
  621. }
  622. if (in_array($link_value['type'], array(ACCOUNT_TYPE_OFFCIAL_NORMAL, ACCOUNT_TYPE_OFFCIAL_AUTH)) && !empty($link_value['link_wxapp']) && is_array($link_value['link_wxapp'])) {
  623. foreach ($link_value['link_wxapp'] as $value) {
  624. $result[] = array(
  625. 'app_name' => $link_value['name'],
  626. 'wxapp_name' => $value['name'] . ' ' . $value['version'],
  627. 'uniacid' => $link_value['uniacid'],
  628. 'version_id' => $value['version_id'],
  629. 'type_name' => $link_value['type_name'],
  630. 'account_name' => $link_value['name'],
  631. 'type' => $link_value['type'],
  632. 'logo' => to_global_media('headimg_' . $link_value['acid'] . '.jpg') . '?time=' . time(),
  633. );
  634. }
  635. } elseif ($link_value['type'] == ACCOUNT_TYPE_APP_NORMAL && !empty($link_value['versions']) && is_array($link_value['versions'])) {
  636. foreach ($link_value['versions'] as $value) {
  637. $result[] = array(
  638. 'app_name' => '',
  639. 'wxapp_name' => $link_value['name'] . ' ' . $value['version'],
  640. 'uniacid' => $link_value['uniacid'],
  641. 'version_id' => $value['id'],
  642. 'type_name' => $link_value['type_name'],
  643. 'account_name' => $link_value['name'],
  644. 'type' => $link_value['type'],
  645. 'logo' => to_global_media('headimg_' . $link_value['acid'] . '.jpg') . '?time=' . time(),
  646. );
  647. }
  648. } else {
  649. $result[] = array(
  650. 'app_name' => $link_value['name'],
  651. 'wxapp_name' => '',
  652. 'uniacid' => $link_value['uniacid'],
  653. 'version_id' => '',
  654. 'type_name' => $link_value['type_name'],
  655. 'account_name' => $link_value['name'],
  656. 'type' => $link_value['type'],
  657. 'logo' => to_global_media('headimg_' . $link_value['acid'] . '.jpg') . '?time=' . time(),
  658. );
  659. }
  660. }
  661. }
  662. return $result;
  663. }
  664. function module_clerk_info($module_name) {
  665. $user_permissions = array();
  666. $module_name = trim($module_name);
  667. if (empty($module_name)) {
  668. return $user_permissions;
  669. }
  670. $user_permissions = table('users_permission')->getClerkPermission($module_name);
  671. if (!empty($user_permissions)) {
  672. foreach ($user_permissions as $key => $value) {
  673. $user_permissions[$key]['user_info'] = user_single($value['uid']);
  674. }
  675. }
  676. return $user_permissions;
  677. }
  678. function module_installed_list($type = '') {
  679. global $_W;
  680. $module_list = array();
  681. $user_has_module = user_modules($_W['uid']);
  682. if (empty($user_has_module)) {
  683. return $module_list;
  684. }
  685. if ($type == 'all') {
  686. return $user_has_module;
  687. }
  688. foreach ($user_has_module as $modulename => $module) {
  689. if ((!empty($module['issystem']) && $module['name'] != 'we7_coupon')) {
  690. continue;
  691. }
  692. foreach (module_support_type() as $support_name => $support) {
  693. if ($module[$support_name] == $support['support'] && (empty($module['recycle_info']) || empty($module['recycle_info'][$support_name]))) {
  694. $module_list[$support['type']][$modulename] = $module;
  695. }
  696. }
  697. }
  698. if (!empty($type)) {
  699. return (array)$module_list[$type];
  700. } else {
  701. return $module_list;
  702. }
  703. }
  704. function module_uninstall_list() {
  705. $uninstall_modules = table('modules_cloud')->getUninstallModule();
  706. $recycle = table('modules_recycle')->where('type', 2)->where('name', array_keys($uninstall_modules))->getall('name');
  707. if (!empty($uninstall_modules)) {
  708. foreach ($uninstall_modules as $name => &$module) {
  709. if (!empty($recycle[$name])) {
  710. foreach (module_support_type() as $support => $value) {
  711. if ($module[$support] == $value['support'] && $recycle[$name][$support] == 1) {
  712. $module[$support] = $value['not_support'];
  713. }
  714. }
  715. }
  716. $need_install = false;
  717. foreach (module_support_type() as $support => $value) {
  718. if ($module[$support] == MODULE_SUPPORT_ACCOUNT) {
  719. $need_install = true;
  720. $module['link'] = '';
  721. break;
  722. }
  723. }
  724. if (!$need_install) {
  725. unset($module);
  726. }
  727. }
  728. }
  729. return $uninstall_modules;
  730. }
  731. function module_uninstall_total($type) {
  732. global $_W;
  733. $type_list = module_support_type();
  734. if (!isset($type_list["{$type}_support"]) && $type != 'all') {
  735. return 0;
  736. }
  737. if (!empty($_W['config']['setting']['local_dev'])) {
  738. $total = table('modules_cloud')->where('install_status', MODULE_LOCAL_UNINSTALL)->getcolumn('count(*)');
  739. } else {
  740. if ($type == 'all') {
  741. $total = table('modules_cloud')->searchUninstallWithOutWelcome()->getcolumn('count(*)');
  742. } else {
  743. $total = table('modules_cloud')->searchUninstallSupport("{$type}_support")->getcolumn('count(*)');
  744. }
  745. }
  746. return intval($total);
  747. }
  748. function module_upgrade_list() {
  749. global $_W;
  750. $result = array();
  751. $module_list = user_modules($_W['uid']);
  752. if (empty($module_list)) {
  753. return $result;
  754. }
  755. $modules_cloud_table = table('modules_cloud');
  756. $modules_cloud_table->orderby('buytime', 'desc');
  757. $modules_cloud_table->orderby('lastupdatetime', 'asc');
  758. $upgrade_modules = $modules_cloud_table->getUpgradeByModuleNameList(array_keys($module_list));
  759. if (empty($upgrade_modules)) {
  760. return $result;
  761. }
  762. $modules_ignore = table('modules_ignore')->where('name', array_keys($upgrade_modules))->getall('name');
  763. foreach ($upgrade_modules as $modulename => &$module) {
  764. if (!empty($modules_ignore[$modulename])) {
  765. if (ver_compare($modules_ignore[$modulename]['version'], $module['version']) >= 0) {
  766. $module['is_ignore'] = 1;
  767. }
  768. }
  769. if (!empty($module_list[$modulename]) && $module['title'] != $module_list[$modulename]['title']) {
  770. $module['title'] = $module_list[$modulename]['title'];
  771. }
  772. $module['link'] = '';
  773. }
  774. unset($module);
  775. return $upgrade_modules;
  776. }
  777. function module_upgrade_total($type) {
  778. $type_list = module_support_type();
  779. if (!isset($type_list["{$type}_support"])) {
  780. return 0;
  781. }
  782. $modules = table('modules_cloud')->getUpgradeModulesBySupportType($type);
  783. return count($modules);
  784. }
  785. function module_upgrade_info($modulelist = array()) {
  786. global $_W;
  787. load()->model('cloud');
  788. load()->model('extension');
  789. $result = array();
  790. $module_support_type = module_support_type();
  791. $manifest_cloud_list = array();
  792. cloud_prepare();
  793. $cloud_m_query_module_pageinfo = cloud_m_query(array(), 1, false);
  794. if (is_error($cloud_m_query_module_pageinfo)) {
  795. return $cloud_m_query_module_pageinfo;
  796. }
  797. $cloud_module_code_query = cloud_m_code_query(false);
  798. if (is_error($cloud_module_code_query)) {
  799. return $cloud_module_code_query;
  800. }
  801. $cloud_module_code_query = array_column($cloud_module_code_query, null, 'name');
  802. $cloud_t_query_module = cloud_t_query();
  803. if (is_error($cloud_t_query_module)) {
  804. return $cloud_t_query_module;
  805. }
  806. $cloud_m_query_module = $cloud_m_query_module_pageinfo['data'];
  807. if ($cloud_m_query_module_pageinfo['page'] > 1) {
  808. for ($i = 2;$i <= $cloud_m_query_module_pageinfo['page']; $i++) {
  809. $cloud_m_query_module_i = cloud_m_query(array(), $i, false);
  810. $cloud_m_query_module = array_merge($cloud_m_query_module, $cloud_m_query_module_i['data']);
  811. }
  812. }
  813. $pirate_apps = $cloud_m_query_module['pirate_apps'];
  814. unset($cloud_m_query_module['pirate_apps']);
  815. foreach ($cloud_t_query_module as $template_name => $template_manifest_cloud) {
  816. if (empty($template_manifest_cloud) || !is_array($template_manifest_cloud)) {
  817. continue;
  818. }
  819. $template_manifest = array(
  820. 'application' => array(
  821. 'name' => $template_name,
  822. 'title' => $template_manifest_cloud['title'],
  823. 'version' => $template_manifest_cloud['version'],
  824. 'logo' => $template_manifest_cloud['logo'],
  825. 'last_upgrade_time' => $template_manifest_cloud['last_upgrade_time'],
  826. ),
  827. 'platform' => array(
  828. 'supports' => array('account')
  829. ),
  830. );
  831. $template_manifest['branches'] = $template_manifest_cloud['branches'];
  832. $template_manifest['site_branch'] = array(
  833. 'id' => $template_manifest_cloud['branch'],
  834. 'name' => $template_manifest_cloud['title'],
  835. 'version' => $template_manifest_cloud['version'],
  836. 'app_support' => MODULE_SUPPORT_ACCOUNT,
  837. 'bought' => array('app'),
  838. );
  839. $template_manifest['cloud_id'] = $template_manifest_cloud['id'];
  840. $template_manifest['buytime'] = empty($template_manifest_cloud['buytime']) ? '' : $template_manifest_cloud['buytime'];
  841. $template_manifest['system_shutdown'] = empty($template_manifest_cloud['system_shutdown']) ? '' : $template_manifest_cloud['system_shutdown'];
  842. $template_manifest['system_shutdown_delay_time'] = $template_manifest_cloud['system_shutdown_delay_time'];
  843. $template_manifest['can_update'] = $template_manifest_cloud['can_update'];
  844. $template_manifest['service_expiretime'] = empty($template_manifest_cloud['service_expiretime']) ? 0 : $template_manifest_cloud['service_expiretime'];
  845. $template_manifest['application_type'] = APPLICATION_TYPE_TEMPLATES;
  846. $template_manifest['label'] = empty($template_manifest_cloud['label']) ? '' : iserializer($template_manifest_cloud['label']);
  847. $manifest_cloud_list[$template_name] = $template_manifest;
  848. }
  849. foreach ($cloud_m_query_module as $modulename => $manifest_cloud) {
  850. if (empty($manifest_cloud) || empty($manifest_cloud['site_branch'])) {
  851. continue;
  852. }
  853. $manifest = array(
  854. 'application' => array(
  855. 'name' => $modulename,
  856. 'title' => $manifest_cloud['title'],
  857. 'version' => $manifest_cloud['version'],
  858. 'logo' => $manifest_cloud['thumb'],
  859. 'last_upgrade_time' => empty($manifest_cloud['last_upgrade_time']) ? '' : $manifest_cloud['last_upgrade_time'],
  860. ),
  861. 'platform' => array(
  862. 'supports' => array()
  863. ),
  864. );
  865. foreach ($module_support_type as $support_key => $support_value) {
  866. if ($support_key == 'account_support' && $manifest_cloud['site_branch']['app_support'] == $support_value['support']) {
  867. $manifest['platform']['supports'][] = $support_value['type'];
  868. continue;
  869. }
  870. if ($support_key == 'phoneapp_support' && ($manifest_cloud['site_branch']['android_support'] == $support_value['support'] || $manifest_cloud['site_branch']['ios_support'] == $support_value['support'])) {
  871. $manifest['platform']['supports'][] = $support_value['type'];
  872. continue;
  873. }
  874. if ($support_key == 'welcome_support' && $manifest_cloud['site_branch']['system_welcome_support'] == $support_value['support']) {
  875. $manifest['platform']['supports'][] = $support_value['type'];
  876. continue;
  877. }
  878. $manifest_cloud['site_branch'][$support_key] = empty($manifest_cloud['site_branch'][$support_key]) ? '' : $manifest_cloud['site_branch'][$support_key];
  879. if ($manifest_cloud['site_branch'][$support_key] == $support_value['support']) {
  880. $manifest['platform']['supports'][] = $support_value['type'];
  881. }
  882. }
  883. if (empty($manifest['platform']['supports'])) {
  884. continue;
  885. }
  886. $manifest['status'] = $manifest_cloud['status'];
  887. $manifest['branches'] = $manifest_cloud['branches'];
  888. $manifest['site_branch'] = $manifest_cloud['site_branch'];
  889. $manifest['cloud_id'] = $manifest_cloud['id'];
  890. $manifest['buytime'] = $manifest_cloud['buytime'];
  891. $manifest['system_shutdown'] = $manifest_cloud['system_shutdown'];
  892. $manifest['system_shutdown_delay_time'] = $manifest_cloud['system_shutdown_delay_time'];
  893. $manifest['can_update'] = $manifest_cloud['can_update'];
  894. $manifest['service_expiretime'] = empty($manifest_cloud['service_expiretime']) ? 0 : $manifest_cloud['service_expiretime'];
  895. $manifest['application_type'] = APPLICATION_TYPE_MODULE;
  896. $manifest['label'] = empty($manifest_cloud['label']) ? '' : iserializer($manifest_cloud['label']);
  897. $manifest['main_module'] = $manifest_cloud['main_module'];
  898. $manifest['version_upgrade_major'] = $manifest_cloud['version_upgrade_major'];
  899. $manifest_cloud_list[$modulename] = $manifest;
  900. }
  901. $del_cache = STATUS_OFF;
  902. if (empty($modulelist)) {
  903. $modulelist = pdo_getall('modules', array('issystem !=' => 1));
  904. $modulelist = array_column($modulelist, null, 'name');
  905. }
  906. foreach ($modulelist as $modulename => $module) {
  907. if (!empty($cloud_module_code_query[$modulename])) {
  908. unset($cloud_module_code_query[$modulename]);
  909. }
  910. if ('cloud_test' == $module['from'] && !empty($manifest_cloud_list[$modulename])) {
  911. pdo_update('modules', array('from' => 'cloud'), array('mid' => $module['mid']));
  912. $del_cache = STATUS_ON;
  913. }
  914. $module_upgrade_data = array(
  915. 'name' => $modulename,
  916. 'has_new_version' => 0,
  917. 'has_new_branch' => 0,
  918. );
  919. if (!empty($pirate_apps) && in_array($modulename, $pirate_apps)) {
  920. $module_upgrade_data['is_ban'] = 1;
  921. }
  922. if (APPLICATION_TYPE_TEMPLATES == $module['application_type']) {
  923. $module_upgrade_data['application_type'] = APPLICATION_TYPE_TEMPLATES;
  924. $manifest = ext_template_manifest($modulename, false);
  925. } else {
  926. $module_upgrade_data['application_type'] = APPLICATION_TYPE_MODULE;
  927. $manifest = ext_module_manifest($modulename);
  928. }
  929. if (!empty($manifest) && empty($manifest_cloud_list[$modulename])) {
  930. $module_upgrade_data['install_status'] = MODULE_LOCAL_INSTALL;
  931. } elseif ($manifest_cloud_list[$modulename]) {
  932. $module_upgrade_data['install_status'] = MODULE_CLOUD_INSTALL;
  933. $manifest = $manifest_cloud_list[$modulename];
  934. } else {
  935. $module_upgrade_data['install_status'] = MODULE_LOCAL_INSTALL;
  936. }
  937. $module_upgrade_data['logo'] = !empty($module['logo']) ? tomedia($module['logo']) : $manifest['application']['logo'];
  938. $module_upgrade_data['version'] = $manifest['application']['version'];
  939. $module_upgrade_data['title'] = $manifest['application']['title'];
  940. $module_upgrade_data['title_initial'] = get_first_pinyin($manifest['application']['title']);
  941. $module_upgrade_data['buytime'] = $manifest_cloud_list[$modulename]['buytime'];
  942. $module_upgrade_data['label'] = $manifest_cloud_list[$modulename]['label'];
  943. $module_upgrade_data['main_module_name'] = $manifest_cloud_list[$modulename]['main_module'];
  944. $module_upgrade_data['modified_time'] = $manifest_cloud_list[$modulename]['site_branch']['modified_time'];
  945. $status = empty($manifest_cloud_list[$modulename]['status']) || empty($manifest_cloud_list[$modulename]['site_branch']['status']) || ($manifest_cloud_list[$modulename]['system_shutdown_delay_time'] && TIMESTAMP > $manifest_cloud_list[$modulename]['system_shutdown_delay_time']) ? STATUS_OFF : STATUS_ON;
  946. $module_upgrade_data['service_expire_time'] = $manifest_cloud_list[$modulename]['service_expiretime'];
  947. $module_upgrade_data['system_shutdown_time'] = $manifest_cloud_list[$modulename]['system_shutdown_delay_time'];
  948. $module_upgrade_data['status'] = $status;
  949. $module_upgrade_data['cloud_id'] = $manifest_cloud_list[$modulename]['cloud_id'];
  950. pdo_update('modules', array('label' => $module_upgrade_data['label'], 'status' => $status), array('mid' => $module['mid']));
  951. unset($manifest_cloud_list[$modulename]);
  952. $result[$modulename] = array(
  953. 'name' => $modulename,
  954. 'best_version' => $manifest['application']['version'],
  955. 'modified_time' => empty($manifest['site_branch']['modified_time']) ? '' : date('Y-m-d H:i:s', $manifest['site_branch']['modified_time'])
  956. );
  957. $result[$modulename]['new_version'] = STATUS_OFF;
  958. if (version_compare($module['version'], $manifest['application']['version']) == '-1') {
  959. $module_upgrade_data['has_new_version'] = 1;
  960. $module_upgrade_data['lastupdatetime'] = TIMESTAMP;
  961. $result[$modulename]['new_version'] = STATUS_ON;
  962. }
  963. if ($module_upgrade_data['install_status'] == MODULE_LOCAL_INSTALL && empty($module_upgrade_data['has_new_version'])) {
  964. continue;
  965. }
  966. if (!empty($manifest['system_shutdown'])) {
  967. $result[$modulename]['system_shutdown'] = $manifest['system_shutdown'];
  968. $result[$modulename]['system_shutdown_delay_time'] = date('Y-m-d', $manifest['system_shutdown_delay_time']);
  969. }
  970. $result[$modulename]['can_update'] = $manifest['can_update'] ? 1 : 0;
  971. if (!empty($manifest['service_expiretime'])) {
  972. $result[$modulename]['service_expiretime'] = date('Y-m-d H:i:s', $manifest['service_expiretime']);
  973. if ($manifest['service_expiretime'] < time()) {
  974. $result[$modulename]['service_expire'] = STATUS_ON;
  975. }
  976. } else {
  977. $result[$modulename]['service_expire'] = STATUS_ON;
  978. }
  979. if (!$manifest['status'] || $manifest['system_shutdown'] == 2) {
  980. $result[$modulename]['offsell'] = STATUS_ON;
  981. } else {
  982. $result[$modulename]['offsell'] = STATUS_OFF;
  983. }
  984. if (!empty($manifest['platform']['supports'])) {
  985. foreach ($module_support_type as $support_key => $support_value) {
  986. if (in_array($support_value['type'], $manifest['platform']['supports'])) {
  987. $module_upgrade_data[$support_key] = $support_value['support'];
  988. } else {
  989. $module_upgrade_data[$support_key] = $support_value['not_support'];
  990. }
  991. }
  992. }
  993. if (STATUS_ON == $result[$modulename]['new_version'] && 'local' != $module['from']) {
  994. $result[$modulename]['new_version'] = empty($status) || TIMESTAMP > $manifest['service_expiretime'] || !empty($manifest['system_shutdown']) && 1 < $manifest['system_shutdown'] ? STATUS_OFF : STATUS_ON;
  995. }
  996. if (!empty($manifest['version_upgrade_major']) && (((substr($module['version'], 0, 1) < $manifest['version_upgrade_major']) || substr($manifest['application']['version'], 0, 1) == $manifest['version_upgrade_major']) && version_compare($module['version'], $manifest['application']['version']) == '-1')) {
  997. $result[$modulename]['new_version'] = STATUS_ON;
  998. $result[$modulename]['version_upgrade_major'] = $manifest['version_upgrade_major'];
  999. } else {
  1000. $result[$modulename]['version_upgrade_major'] = 0;
  1001. }
  1002. $module_cloud_upgrade = table('modules_cloud')->getByName($modulename);
  1003. if (empty($module_cloud_upgrade)) {
  1004. pdo_insert('modules_cloud', $module_upgrade_data);
  1005. } else {
  1006. pdo_update('modules_cloud', $module_upgrade_data, array('name' => $modulename));
  1007. }
  1008. }
  1009. if ($del_cache) {
  1010. cache_delete(cache_system_key('cloud_expired_modules'));
  1011. }
  1012. if (!empty($manifest_cloud_list)) {
  1013. foreach ($manifest_cloud_list as $modulename => $manifest) {
  1014. $module_upgrade_data = array(
  1015. 'name' => $modulename,
  1016. 'application_type' => $manifest['application_type'],
  1017. 'has_new_version' => 0,
  1018. 'has_new_branch' => 0,
  1019. 'install_status' => MODULE_CLOUD_UNINSTALL,
  1020. 'logo' => $manifest['application']['logo'],
  1021. 'version' => $manifest['application']['version'],
  1022. 'title' => $manifest['application']['title'],
  1023. 'title_initial' => get_first_pinyin($manifest['application']['title']),
  1024. 'lastupdatetime' => $manifest['application']['last_upgrade_time'],
  1025. 'modified_time' => empty($manifest['site_branch']['modified_time']) ? '' : $manifest['site_branch']['modified_time'],
  1026. 'buytime' => $manifest['buytime'],
  1027. 'cloud_id' => $manifest['cloud_id'],
  1028. 'label' => $manifest['label'],
  1029. 'main_module_name' => empty($manifest['main_module']) ? '' : $manifest['main_module'],
  1030. 'service_expire_time' => $manifest['service_expiretime'],
  1031. 'system_shutdown_time' => $manifest['system_shutdown_delay_time'],
  1032. 'status' => empty($manifest['status']) || empty($manifest['site_branch']['status']) || ($manifest['system_shutdown_delay_time'] && TIMESTAMP > $manifest['system_shutdown_delay_time']) ? STATUS_OFF : STATUS_ON,
  1033. );
  1034. if (!empty($manifest['platform']['supports'])) {
  1035. foreach ($module_support_type as $support_key => $support_value) {
  1036. if (in_array($support_value['type'], $manifest['platform']['supports'])) {
  1037. $module_upgrade_data[$support_key] = $support_value['support'];
  1038. } else {
  1039. $module_upgrade_data[$support_key] = $support_value['not_support'];
  1040. }
  1041. }
  1042. }
  1043. $module_recycle_info = table('modules_recycle')->searchWithNameType($modulename, MODULE_RECYCLE_UNINSTALL_IGNORE)->get();
  1044. if (!empty($module_recycle_info)) {
  1045. foreach ($module_support_type as $support => $value) {
  1046. if ($module_recycle_info[$support] == 1) {
  1047. $module_upgrade_data[$support] = $value['not_support'];
  1048. }
  1049. }
  1050. }
  1051. $module_cloud_upgrade = table('modules_cloud')->getByName($modulename);
  1052. if (empty($module_cloud_upgrade)) {
  1053. pdo_insert('modules_cloud', $module_upgrade_data);
  1054. } else {
  1055. pdo_update('modules_cloud', $module_upgrade_data, array('name' => $modulename));
  1056. }
  1057. }
  1058. }
  1059. if (!empty($cloud_module_code_query)) {
  1060. foreach ($cloud_module_code_query as $item) {
  1061. if (!empty($cloud_m_query_module[$item['name']])) {
  1062. continue;
  1063. }
  1064. $module_cloud_upgrade = table('modules_cloud')->getByName($item['name']);
  1065. $module_upgrade_data = array(
  1066. 'name' => $item['name'],
  1067. 'title' => $item['title'],
  1068. 'logo' => $item['logo'],
  1069. 'version' => $item['version'],
  1070. 'has_new_version' => 0,
  1071. 'has_new_branch' => 0,
  1072. 'install_status' => MODULE_CLOUD_UNINSTALL,
  1073. 'application_type' => 1,
  1074. 'title_initial' => get_first_pinyin($item['title']),
  1075. 'status' => STATUS_ON,
  1076. 'account_support' => MODULE_SUPPORT_ACCOUNT,
  1077. 'cloud_id' => -1,
  1078. );
  1079. if (empty($module_cloud_upgrade)) {
  1080. pdo_insert('modules_cloud', $module_upgrade_data);
  1081. } else {
  1082. pdo_update('modules_cloud', $module_upgrade_data, array('name' => $item['name']));
  1083. }
  1084. }
  1085. }
  1086. return $result;
  1087. }
  1088. function module_check_notinstalled_support($module, $manifest_support) {
  1089. if (empty($manifest_support)) {
  1090. return array();
  1091. }
  1092. $has_notinstalled_support = false;
  1093. $notinstalled_support = array();
  1094. $module_support_type = module_support_type();
  1095. foreach ($manifest_support as $support) {
  1096. if ($support == 'app') {
  1097. $support = 'account';
  1098. } elseif ($support == 'system_welcome') {
  1099. $support = 'welcome';
  1100. } elseif ($support == 'android' || $support == 'ios') {
  1101. $support = 'phoneapp';
  1102. }
  1103. $support .= '_support';
  1104. if (!in_array($support, array_keys($module_support_type))) {
  1105. continue;
  1106. }
  1107. if ($module[$support] != $module_support_type[$support]['support']) {
  1108. $has_notinstalled_support = true;
  1109. $notinstalled_support[$support] = $module_support_type[$support]['support'];
  1110. } else {
  1111. $notinstalled_support[$support] = $module_support_type[$support]['not_support'];
  1112. }
  1113. }
  1114. if ($has_notinstalled_support) {
  1115. return $notinstalled_support;
  1116. } else {
  1117. return array();
  1118. }
  1119. }
  1120. function module_add_to_uni_group($module, $uni_group_id, $support) {
  1121. if (!in_array($support, array_keys(module_support_type()))) {
  1122. return error(1, '支持类型不存在');
  1123. }
  1124. if (empty($module[$support]) || $module[$support] != MODULE_SUPPORT_ACCOUNT) {
  1125. return error(1, '模块支持不存在');
  1126. }
  1127. $unigroup_table = table('uni_group');
  1128. $uni_group = $unigroup_table->getById($uni_group_id);
  1129. if (empty($uni_group)) {
  1130. return error(1, '应用权限组不存在');
  1131. }
  1132. if (!empty($uni_group['modules'])) {
  1133. $uni_group['modules'] = iunserializer($uni_group['modules']);
  1134. }
  1135. $update_data = $uni_group['modules'];
  1136. $key = str_replace('_support', '', $support);
  1137. $key = $key == 'account' ? 'modules' : $key;
  1138. if (!in_array($module['name'], $update_data[$key])) {
  1139. $update_data[$key][] = $module['name'];
  1140. }
  1141. return $unigroup_table->fill('modules', iserializer($update_data))->where('id', $uni_group_id)->save();
  1142. }
  1143. function module_recycle($modulename, $type, $support) {
  1144. global $_W;
  1145. $module_support_types = module_support_type();
  1146. $module_support_type = $module_support_types[$support]['type'];
  1147. $all_support = array_keys($module_support_types);
  1148. if ($type == MODULE_RECYCLE_INSTALL_DISABLED) {
  1149. table('system_welcome_binddomain')->where(array('module_name' => $modulename))->delete();
  1150. $uni_modules_table = table('uni_modules');
  1151. $uni_accounts = $uni_modules_table->where('module_name', $modulename)->getall('uniacid');
  1152. if (!empty($uni_accounts)) {
  1153. foreach ($uni_accounts as $uni_account_val) {
  1154. $account_info = uni_fetch($uni_account_val['uniacid']);
  1155. if ($account_info['type_sign'] == $module_support_type) {
  1156. $uni_modules_table->deleteUniModules($modulename, $uni_account_val['uniacid']);
  1157. }
  1158. }
  1159. }
  1160. $lastuse_table = table('users_lastuse');
  1161. $lastuse_accounts = switch_getall_lastuse_by_module($modulename);
  1162. if (!empty($lastuse_accounts)) {
  1163. foreach ($lastuse_accounts as $lastuse_account_val) {
  1164. $lastuse_account_info = uni_fetch($lastuse_account_val['uniacid']);
  1165. if ($lastuse_account_info['type_sign'] == $module_support_type) {
  1166. $lastuse_table->searchWithUid($_W['uid']);
  1167. $lastuse_table->searchWithUniacid($lastuse_account_val['uniacid']);
  1168. $lastuse_table->searchWithModule($modulename);
  1169. $lastuse_table->delete();
  1170. }
  1171. }
  1172. }
  1173. }
  1174. if (!in_array($support, $all_support)) {
  1175. return false;
  1176. }
  1177. if ($type == MODULE_RECYCLE_UNINSTALL_IGNORE) {
  1178. table('modules_cloud')->fill(array($support => 1, 'module_status' => MODULE_CLOUD_UNINSTALL_NORMAL))->where('name', $modulename)->save();
  1179. }
  1180. $module_recycle = table('modules_recycle');
  1181. $record = $module_recycle->searchWithNameType($modulename, $type)->get();
  1182. if (empty($record)) {
  1183. return $module_recycle->fill(array('name' => $modulename, 'type' => $type, $support => 1))->save();
  1184. } else {
  1185. $record[$support] = 1;
  1186. return $module_recycle->where('id', $record['id'])->fill($record)->save();
  1187. }
  1188. }
  1189. function module_cancel_recycle($modulename, $type, $support) {
  1190. $all_support = array_keys(module_support_type());
  1191. if (!in_array($support, $all_support)) {
  1192. return false;
  1193. }
  1194. $module_recycle = table('modules_recycle');
  1195. $record = $module_recycle->searchWithNameType($modulename, $type)->get();
  1196. if (empty($record)) {
  1197. return true;
  1198. }
  1199. $record[$support] = 0;
  1200. $is_update = false;
  1201. foreach ($all_support as $s) {
  1202. if ($record[$s] == 1) {
  1203. $is_update = true;
  1204. }
  1205. }
  1206. if ($type == MODULE_RECYCLE_UNINSTALL_IGNORE) {
  1207. table('modules_cloud')->fill(array($support => 2, 'module_status' => MODULE_CLOUD_UNINSTALL_NORMAL))->where('name', $modulename)->save();
  1208. }
  1209. if ($is_update) {
  1210. return $module_recycle->where('id', $record['id'])->fill($record)->save();
  1211. } else {
  1212. return $module_recycle->where('id', $record['id'])->delete();
  1213. }
  1214. }
  1215. function module_expire_notice() {
  1216. $module_expire = setting_load('module_expire');
  1217. $module_expire = !empty($module_expire['module_expire']) ? $module_expire['module_expire'] : array();
  1218. foreach ($module_expire as $value) {
  1219. if ($value['status'] == 1) {
  1220. $expire_notice = $value['notice'];
  1221. break;
  1222. }
  1223. }
  1224. if (empty($expire_notice)) {
  1225. $system_module_expire = setting_load('system_module_expire');
  1226. $expire_notice = !empty($system_module_expire['system_module_expire']) ? $system_module_expire['system_module_expire'] : '您访问的功能模块不存在,请重新进入';
  1227. }
  1228. return $expire_notice;
  1229. }
  1230. function module_expired_list() {
  1231. return array();
  1232. $cachekey = cache_system_key('expired_modules');
  1233. $expired_modules_cache = cache_load($cachekey);
  1234. if (!empty($expired_modules_cache)) {
  1235. return $expired_modules_cache;
  1236. }
  1237. $cloud_m_query_module_pageinfo = cloud_m_query(array(), 1);
  1238. if (is_error($cloud_m_query_module_pageinfo)) {
  1239. return array();
  1240. }
  1241. $cloud_m_query_module = $cloud_m_query_module_pageinfo['data'];
  1242. if ($cloud_m_query_module_pageinfo['page'] > 1) {
  1243. for ($i = 2;$i <= $cloud_m_query_module_pageinfo['page']; $i++) {
  1244. $cloud_m_query_module_i = cloud_m_query(array(), $i);
  1245. $cloud_m_query_module = array_merge($cloud_m_query_module, $cloud_m_query_module_i['data']);
  1246. }
  1247. }
  1248. $module_list = pdo_getall('modules', array('issystem !=' => 1, 'status' => 1), array('name'));
  1249. $expired_modules = array();
  1250. if (!empty($module_list)) {
  1251. foreach ($module_list as $module_name) {
  1252. $module = $cloud_m_query_module[$module_name['name']];
  1253. if (empty($module) || empty($module['site_branch']['status']) || !empty($module['system_shutdown_delay_time'])) {
  1254. continue;
  1255. }
  1256. if (!empty($module['service_expiretime']) && $module['service_expiretime'] < TIMESTAMP && $module['site_branch']['status']) {
  1257. $expired_modules[] = $module_name['name'];
  1258. }
  1259. }
  1260. }
  1261. cache_write($cachekey, $expired_modules);
  1262. return $expired_modules;
  1263. }
  1264. function module_expired_diff($module_expired_list, $modules_name) {
  1265. $expired_modules = array_intersect($module_expired_list, $modules_name);
  1266. if ($expired_modules) {
  1267. $expired_modules = pdo_getall('modules', array('name IN' => $expired_modules), array('title'), 'title');
  1268. $expired_modules_name = implode(',', array_column($expired_modules, 'title'));
  1269. return $expired_modules_name;
  1270. }
  1271. return '';
  1272. }
  1273. function module_name_list($group_id = array()) {
  1274. $module_name_list = array();
  1275. if (empty($group_id)) {
  1276. return $module_name_list;
  1277. }
  1278. if (!is_array($group_id)) {
  1279. $group_id = explode(',', $group_id);
  1280. }
  1281. $group_module = pdo_getall('uni_group', array('id IN ' => $group_id), array('modules'));
  1282. if (empty($group_module)) {
  1283. return $module_name_list;
  1284. }
  1285. foreach ($group_module as $modules) {
  1286. if (empty($modules['modules'])) {
  1287. continue;
  1288. }
  1289. $modules_name = array_reduce(iunserializer($modules['modules']), 'array_merge', array());
  1290. $module_name_list = array_merge($module_name_list, $modules_name);
  1291. }
  1292. return array_unique($module_name_list);
  1293. }
  1294. function module_permission_check($message_type = '') {
  1295. global $_W,$controller,$action,$do;
  1296. $api_whitelist = array(
  1297. 'c=cloud&a=newprocess&do=module_build',
  1298. 'c=module&a=group&do=save',
  1299. 'c=utility&a=group&do=get_module_group_detail_info',
  1300. 'c=module&a=group&do=del',
  1301. 'c=account&a=post&do=',
  1302. 'c=account&a=post&do=modules_tpl',
  1303. 'c=account&a=post-user&do=edit',
  1304. 'c=account&a=post-user&do=set_manager',
  1305. 'c=miniapp&a=manage&do=display',
  1306. 'c=utility&a=modules&do=modules',
  1307. 'c=user&a=edit&do=',
  1308. 'c=user&a=create&do=check_user_info',
  1309. 'c=utility&a=group&do=get_user_group_detail_info',
  1310. 'c=user&a=group&do=save',
  1311. 'c=module&a=welcome&do=',
  1312. 'c=site&a=entry&do='
  1313. );
  1314. $cado = 'c=' . $controller . '&a=' . $action . '&do=' . $do;
  1315. if (!empty($_W['config']['setting']['local_dev']) || !in_array($cado, $api_whitelist)) {
  1316. return true;
  1317. }
  1318. $cloud_modules_cachekey = cache_system_key('cloud_expired_modules');
  1319. $cloud_module_cache = cache_load($cloud_modules_cachekey);
  1320. if (empty($cloud_module_cache) && !empty($_SERVER['HTTP_SEC_FETCH_DEST']) && 'iframe' == $_SERVER['HTTP_SEC_FETCH_DEST']) {
  1321. $cloud_module_cache = module_cloud_expired_list();
  1322. }
  1323. $local_modules_cachekey = cache_system_key('local_dev_modules');
  1324. $local_module_cache = cache_load($local_modules_cachekey);
  1325. if (empty($local_module_cache)) {
  1326. $local_module = pdo_get('modules', array('issystem' => '0', 'from' => 'local', 'createtime >' => 1632647471));
  1327. $local_module_cache = empty($local_module) ? STATUS_OFF : STATUS_ON;
  1328. cache_write($local_modules_cachekey, $local_module_cache);
  1329. }
  1330. if (!empty($_W['uid']) && ($local_module_cache || $cloud_module_cache)) {
  1331. $message = empty($_W['isw7_request']) ? '运营模式下请联系管理员卸载本地应用!' : '打开开发模式进入应用管理-需卸载应用列表,卸载完毕后关闭开发模式,恢复正常使用!';
  1332. if (!empty($cloud_module_cache)) {
  1333. $message = $cloud_module_cache . ' 应用测试码已过期,请尽快卸载!';
  1334. }
  1335. switch ($message_type) {
  1336. case 'message':
  1337. message($message);
  1338. break;
  1339. case 'itoast':
  1340. itoast($message);
  1341. break;
  1342. case 'iajax':
  1343. iajax(-1, $message);
  1344. break;
  1345. default:
  1346. empty($_W['isajax']) ? itoast($message) : iajax(-1, $message);
  1347. break;
  1348. }
  1349. }
  1350. return true;
  1351. }
  1352. function module_cloud_expired_list() {
  1353. $cachekey = cache_system_key('cloud_expired_modules');
  1354. $cloud_module_cache = cache_load($cachekey);
  1355. if (!empty($cloud_module_cache)) {
  1356. return $cloud_module_cache;
  1357. }
  1358. $cloud_expired_modules = '';
  1359. $modules = pdo_getall('modules', array('from' => 'cloud_test'), array('code'));
  1360. if (!empty($modules)) {
  1361. $codes = array_column($modules, 'code');
  1362. $result = cloud_m_code_available($codes);
  1363. if (is_error($result)) {
  1364. return $result;
  1365. }
  1366. $available_codes = empty($result) ? array() : array_keys($result);
  1367. $module_codes = array_diff($codes, $available_codes);
  1368. if (!empty($module_codes)) {
  1369. $module_titles = pdo_getall('modules', array('from' => 'cloud_test', 'code IN' => $module_codes), array('title'));
  1370. $cloud_expired_modules = implode(',', array_column($module_titles, 'title'));
  1371. }
  1372. }
  1373. cache_write($cachekey, $cloud_expired_modules);
  1374. return $cloud_expired_modules;
  1375. }