Model.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <?php
  2. namespace app\admin\controller;
  3. use app\admin\controller\Base;
  4. use think\Request;
  5. use think\Db;
  6. use think\facade\Env;
  7. use think\Config;
  8. // 新建模型
  9. class Model extends Base
  10. {
  11. public static function connect()
  12. {
  13. return Db::connect();
  14. }
  15. public function index(){
  16. $list = Db::name('model')->paginate(25);
  17. return view('index',['list'=>$list]);
  18. }
  19. public function edit(Request $request){
  20. if($request->isAjax()){
  21. $data = $request->param();
  22. $tabst = "false";
  23. $mode = Db::name("model")->find($data["id"]);
  24. $models = Db::name("model")->select();
  25. foreach($models as $v){
  26. if($v['id'] != $data['id']){
  27. if($data["tablename"] == $v["tablename"]){
  28. return jsonmsg(0,'模型标识重复,请更正!');
  29. }
  30. }
  31. }
  32. $res = Db::name('model')->update($data);
  33. if($res){
  34. if($mode["tablename"] != $data["tablename"]){
  35. Db::query("RENAME TABLE ".config("database.prefix").$mode["tablename"]." TO ".config("database.prefix").$data["tablename"]."");
  36. Db::query("RENAME TABLE ".config("database.prefix").$mode["tablename"]."_data TO ".config("database.prefix").$data["tablename"]."_data");
  37. }
  38. return jsonmsg(1,'编辑成功');
  39. }else{
  40. return jsonmsg(0,'编辑失败');
  41. }
  42. }
  43. $list = Db::name("model")->where("id",$request->param('id'))->find();
  44. return view('edit_model',['list'=>$list]);
  45. }
  46. public function add(Request $request){
  47. if($request->isAjax()){
  48. $db = self::connect();
  49. $data = $request->param();
  50. $data['create_time'] = time();
  51. $tabname = config("database.prefix") . $data['tablename'];
  52. $tab = Db::name("model")->where("tablename",$data['tablename'])->find();
  53. if($tab){
  54. return jsonmsg(0,'模型标识已存在!');
  55. false;
  56. }
  57. $res = Db::name('model')->insert($data);
  58. $moid = Db::name('model')->getLastInsID();
  59. if($res){
  60. $sql =modsql($tabname);
  61. $db->query($sql);
  62. $datatab = $tabname."_data";
  63. $datasql = datasql($datatab);
  64. $db->query($datasql);
  65. $fietab = config("database.prefix") . "modfiel";
  66. $field = fiesql($fietab,$moid);
  67. $db->query($field);
  68. return jsonmsg(1,'创建成功');
  69. }else{
  70. return jsonmsg(0,'创建失败');
  71. }
  72. }
  73. return view('add_model');
  74. }
  75. public function modelst(Request $request){
  76. if($request->isPost()){
  77. $model = Db::name('model')->where('id',$request->param('id'))->find();
  78. $res = false;
  79. if($model['status'] == 1){
  80. Db::name('model')->where('id',$request->param('id'))->update(['status'=>0]);
  81. }else{
  82. Db::name('model')->where('id',$request->param('id'))->update(['status'=>1]);
  83. $res = true;
  84. }
  85. if($res){
  86. return jsonmsg(1,'已启用');
  87. }else{
  88. return jsonmsg(1,'已禁用');
  89. }
  90. }
  91. return jsonmsg(500,'非法操作');
  92. }
  93. public function moddel(Request $request){
  94. if($request->isPost()){
  95. $db = self::connect();
  96. $data = $request->param("delid");
  97. $cate = Db::name("category")->where("modid","in",$data)->select()->toArray();
  98. if(!empty($cate)){
  99. return jsonmsg(0,'删除失败,当前模型下存在栏目数据!');
  100. }
  101. $tab = Db::name("model")->where("id","in",$data)->field("tablename")->select();
  102. $res = Db::name("model")->delete($data);
  103. if($res != 0 && $res >= 1){
  104. foreach($tab as $v){
  105. $db->query("DROP TABLE ".config("database.prefix").$v['tablename']."");
  106. $db->query("DROP TABLE ".config("database.prefix").$v['tablename']."_data");
  107. }
  108. Db::name("modfiel")->where('modid',$data)->delete();
  109. return jsonmsg(1,'删除成功');
  110. }else{
  111. return jsonmsg(0,'删除失败');
  112. }
  113. }
  114. return jsonmsg(500,'非法操作');
  115. }
  116. //模型的导出
  117. public function educemodl(Request $request){
  118. if($request->isAjax()){
  119. $data = $request->param();
  120. if(empty($data)){
  121. return jsonmsg(0,"缺少必要参数");
  122. }
  123. if(!array_key_exists("modid",$data) || !array_key_exists("tablename",$data) || !array_key_exists("tabst",$data)){
  124. return jsonmsg(0,"缺少必要参数,中断操作!");
  125. }
  126. if(!is_dir(Env::get("root_path")."public/model/".$data['tablename'])){
  127. mkdir(Env::get("root_path")."public/model/".$data['tablename'], 0755, true);
  128. }
  129. $fielnams = $data['tablename'].mt_rand(0,1000).time();
  130. $fiename = Env::get("root_path")."public/model/".$data['tablename']."/".$fielnams;
  131. $sqltabname = array($data["tablename"],$data["tablename"]."_data");
  132. foreach($sqltabname as $tabss){
  133. if($data['tabst'] == 1){//获取当前模型标识表结构 tabst=1备份数据tabst=0只备份表结构
  134. $result = Db::query("SHOW CREATE TABLE `".config("database.prefix").$tabss."`");
  135. $sql = "\n";
  136. $sql .= "DROP TABLE IF EXISTS `#__".$tabss."`;\n";
  137. $sqls = str_replace("\r", "\n", str_replace(config("database.prefix"),'#__' , $result[0]['Create Table']));
  138. $sql .= trim($sqls) . ";\n\n";
  139. if (false === file_put_contents($fiename.".model",$sql, FILE_APPEND | LOCK_EX)) {
  140. return jsonmsg(0,"导出文件失败");
  141. false;
  142. }
  143. $tabnum = Db::query("SELECT COUNT(*) AS count FROM `".config("database.prefix").$tabss."`");//查询当前模型标识数据总数
  144. $count = $tabnum['0']['count'];
  145. if ($count) {
  146. //备份数据记录
  147. $list = Db::query("SELECT * FROM `".config("database.prefix").$tabss."` LIMIT 0, 1000");
  148. $result = Db::query("SHOW COLUMNS FROM `".config("database.prefix").$tabss."`");
  149. foreach ($list as $row) {
  150. $sss = 0;
  151. $rowsql = '';
  152. foreach($row as $v){
  153. if(strpos($result[$sss]["Type"],'int') !== false || strpos($result[$sss]["Type"],'varchar') || strpos($result[$sss]["Type"],'tinyint') !== false){
  154. if($v === NULL){
  155. $rowsql .= "NULL, ";
  156. }else{
  157. $rowsql .= "$v, ";
  158. }
  159. }else{
  160. $rowsql .= "'$v', ";
  161. }
  162. $sss++;
  163. }
  164. $rowsql = substr($rowsql, 0, -2);
  165. $sql = "INSERT INTO `#__".$tabss."` VALUES (" . $rowsql . ");\n\n";
  166. if (false === file_put_contents($fiename.".model",$sql, FILE_APPEND | LOCK_EX)) {
  167. return jsonmsg(0,"导出文件失败");
  168. false;
  169. }
  170. }
  171. }
  172. }elseif($data['tabst'] == 0){
  173. $result = Db::query("SHOW CREATE TABLE `".config("database.prefix").$tabss."`");
  174. $sql = "\n";
  175. $sql .= "DROP TABLE IF EXISTS `#__".$tabss."`;\n";
  176. $sqls = str_replace("\r", "\n", str_replace(config("database.prefix"),'#__' , $result[0]['Create Table']));
  177. $sql .= trim($sqls) . ";\n\n";
  178. if (false === file_put_contents($fiename.".model",$sql, FILE_APPEND | LOCK_EX)) {
  179. return jsonmsg(0,"导出文件失败");
  180. false;
  181. }
  182. }
  183. }
  184. $mods = Db::query("SELECT * FROM `".config("database.prefix")."model` WHERE id='".$data["modid"]."' LIMIT 1");//获取当前备份模型数据
  185. $modelin = Db::query("SHOW COLUMNS FROM `".config("database.prefix")."model`");
  186. foreach($mods as $mod){
  187. $rowsql = substr($this->echosql($mod,$modelin), 0, -2);
  188. $sql = "INSERT INTO `#__model` VALUES (" . $rowsql . ");\n\n";
  189. if (false === file_put_contents($fiename.".model",$sql, FILE_APPEND | LOCK_EX)) {
  190. return jsonmsg(0,"导出文件失败");
  191. false;
  192. }
  193. }
  194. $fieldnum = Db::query("SELECT COUNT(modid) AS count FROM `".config("database.prefix")."modfiel` WHERE modid='".$data["modid"]."'");//查询当前模型字段总数
  195. $count = $fieldnum['0']['count'];
  196. if ($count) {
  197. //备份数据记录
  198. $list = Db::query("SELECT * FROM `".config("database.prefix")."modfiel` WHERE modid='".$data["modid"]."'");
  199. $result = Db::query("SHOW COLUMNS FROM `".config("database.prefix")."modfiel`");
  200. foreach ($list as $row) {
  201. $rowsql = substr($this->echosql($row,$result), 0, -2);
  202. $sql = "INSERT INTO `#__modfiel` VALUES (" . $rowsql . ");\n\n";
  203. if (false === file_put_contents($fiename.".model",$sql, FILE_APPEND | LOCK_EX)) {
  204. return jsonmsg(0,"导出文件失败");
  205. false;
  206. }
  207. }
  208. }
  209. $url = $request->scheme()."://".$request->host()."/public/model/".$data['tablename']."/".$fielnams.".model";
  210. return json(["code"=>1,"msg"=>"导出模型成功","modurl"=>$url,"fiename"=>$fielnams.".model","yurl"=>"public/model/".$data['tablename']."/".$fielnams.".model"]);
  211. }
  212. return jsonmsg([404,"非法操作"]);
  213. }
  214. public function echosql($row,$result){
  215. $sss = 0;
  216. $rowsql = '';
  217. foreach($row as $v){
  218. if(strpos($result[$sss]["Type"],'int') !== false || strpos($result[$sss]["Type"],'varchar') || strpos($result[$sss]["Type"],'tinyint') !== false){
  219. if($v === NULL){
  220. $rowsql .= "NULL, ";
  221. }else{
  222. $rowsql .= "$v, ";
  223. }
  224. }else{
  225. $rowsql .= "'$v', ";
  226. }
  227. $sss++;
  228. }
  229. return $rowsql;
  230. }
  231. //模型导入
  232. public function importdata(Request $request){
  233. //接收上传的文件
  234. $file = request()->file('modata');
  235. if($file){
  236. $fileinfo = $file->getInfo();
  237. $res = file_get_contents($fileinfo['tmp_name']);
  238. $sql = str_replace("\r\n", "\n", $res);
  239. if(!isset($sql) || empty($sql)) return;
  240. $sql = str_replace("\r", "\n", str_replace('#__', config("database.prefix"), $sql));
  241. $ret = array();
  242. $num = 0;
  243. foreach(explode(";\n", trim($sql)) as $query) {
  244. $ret[$num] = '';
  245. $queries = explode("\n", trim($query));
  246. foreach($queries as $query) {
  247. $ret[$num] .= (isset($query[0]) && $query[0] == '#') || (isset($query[1]) && isset($query[1]) && $query[0].$query[1] == '--') ? '' : $query;
  248. }
  249. $num++;
  250. }
  251. unset($sql);
  252. foreach($ret as $query) {
  253. $query = trim($query);
  254. if($query) {
  255. if(substr($query, 0, 12) == 'CREATE TABLE') {
  256. $line = explode('`',$query);
  257. $data_name = $line[1];
  258. $musql = Db::query("SHOW TABLES LIKE '".$data_name."'");
  259. if(!empty($musql)){
  260. return jsonmsg(0,"当前导入模型标识表已存在!");
  261. false;
  262. }
  263. Db::query($query);
  264. unset($line,$data_name,$musql);
  265. } else {
  266. $line = explode('`',$query);
  267. $data_name = $line[1];
  268. if(substr($data_name, -5) == "model"){
  269. $fina = explode("', '",$query);
  270. $musql = Db::name("model")->where("tablename",$fina[2])->find();
  271. if(!empty($musql)){
  272. return jsonmsg(0,"当前导入模型数据已存在!");
  273. false;
  274. }
  275. }
  276. Db::query($query);
  277. unset($line,$data_name);
  278. }
  279. }
  280. }
  281. return jsonmsg(1,"导入操作执行完成");
  282. }
  283. }
  284. //更新需要 只针对版本性更新
  285. public function updatemodel(){
  286. if(config("databaseoff.updatemodeloff") === "0111"){
  287. $tablename = Db::name("model")->field("tablename")->select();
  288. foreach($tablename as $val){
  289. if(isset($val['tablename'])){
  290. $res = Db::query("Describe ".config("database.prefix").$val['tablename']." maturl");
  291. $ress = Db::query("Describe ".config("database.prefix").$val['tablename']." matpattern");
  292. if(empty($ress)){
  293. Db::query("ALTER TABLE ".config("database.prefix").$val['tablename']." ADD matpattern tinyint(1) NOT NULL DEFAULT '1' COMMENT '文章是否静态'");
  294. }
  295. if(empty($res)){
  296. $matur = Db::query("ALTER TABLE ".config("database.prefix").$val['tablename']." ADD maturl char(100) NOT NULL COMMENT '文章url'");
  297. $arrays = Db::name($val['tablename'])->select();
  298. foreach($arrays as $v){
  299. Db::name($val['tablename'])->update(['id'=>$v['id'],'maturl'=>'/matcont_'.$v['id'].'.html']);
  300. }
  301. }else{
  302. $arrays = Db::name($val['tablename'])->select();
  303. foreach($arrays as $v){
  304. Db::name($val['tablename'])->update(['id'=>$v['id'],'maturl'=>'/matcont_'.$v['id'].'.html']);
  305. }
  306. }
  307. }
  308. }
  309. $array = ["updatemodeloff"=>"0000"];
  310. $storsing = editconfig($array,"databaseoff");
  311. return jsonmsg(1,"适配完成");
  312. }else{
  313. return jsonmsg(0,"无需操作");
  314. }
  315. }
  316. }