控制台应用,yzncms本身基于tp5.1框架,里面的队列用不了,bug,坑
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

add.html 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. {extend name="index_layout"/}
  2. {block name="main"}
  3. <style type="text/css">
  4. legend {
  5. padding-bottom: 5px;
  6. font-size: 14px;
  7. font-weight: 600;
  8. }
  9. label {
  10. display: block;
  11. max-width: 100%;
  12. margin-bottom: 5px;
  13. }
  14. </style>
  15. <div class="layui-tab">
  16. <div class="alert alert-success-light">注意事项:<br>在线命令行使用<b>删除模式</b>需要同时勾选<b>强制覆盖模式</b>才会执行</div>
  17. <ul class="layui-tab-title">
  18. <li class="layui-this">一键生成CRUD</li>
  19. <li lay-id="22">一键生成菜单</li>
  20. </ul>
  21. <div class="layui-tab-content">
  22. <div class="layui-tab-item layui-show">
  23. <form class="layui-form" method="post">
  24. <input type="hidden" name="commandtype" value="crud" />
  25. <div class="layui-form-item">
  26. <span lay-tips="选中后,将同时生成后台菜单规则">
  27. <input type="checkbox" name="menu" title="生成菜单" value="1">
  28. </span>
  29. <span lay-tips="当前只支持生成1对1关联模型,选中后请配置关联表和字段">
  30. <input type="checkbox" name="isrelation" title="关联模型" value="1" lay-filter="isrelation-filter">
  31. </span>
  32. <span lay-tips="默认模型生成在application/admin/model目录下,选中后将生成在application/common/model目录下">
  33. <input type="checkbox" name="local" title="全局模型类" value="0">
  34. </span>
  35. <span lay-tips="删除CRUD生成的相关文件">
  36. <input type="checkbox" name="delete" title="删除模式" value="1">
  37. </span>
  38. <span lay-tips="选中后,如果已经存在同名文件将被覆盖。如果是删除将不再提醒">
  39. <input type="checkbox" name="force" title="强制覆盖模式" value="1">
  40. </span>
  41. </div>
  42. <hr>
  43. <div class="layui-form-item">
  44. <legend>主表设置</legend>
  45. <div class="layui-row layui-col-space10">
  46. <div class="layui-col-xs6">
  47. <label>请选择主表</label>
  48. <select name="table" lay-filter="table-filter" lay-search>
  49. {volist name="tableList" id="vo"}
  50. <option value="{$vo}">{$vo}</option>
  51. {/volist}
  52. </select>
  53. </div>
  54. <div class="layui-col-xs6">
  55. <label>自定义控制器名</label>
  56. <input type="text" class="layui-input" name="controller" data-toggle="tooltip" title="默认根据表名自动生成,如果需要放在二级目录请手动填写" placeholder="支持目录层级,以/分隔">
  57. </div>
  58. <div class="layui-col-xs6">
  59. <label>自定义模型名</label>
  60. <input type="text" class="layui-input" name="model" data-toggle="tooltip" title="默认根据表名自动生成" placeholder="不支持目录层级">
  61. </div>
  62. <div class="layui-col-xs6">
  63. <label>显示字段(默认全部)</label>
  64. <div id="fields"></div>
  65. </div>
  66. </div>
  67. </div>
  68. <hr>
  69. <div class="layui-hide" id="relation-zone">
  70. <div class="layui-form-item">
  71. <legend>关联表设置</legend>
  72. <div class="layui-row" style="margin-top:15px;">
  73. <a href="javascript:;" class="layui-btn btn-newrelation" data-index="1">追加关联模型</a>
  74. </div>
  75. </div>
  76. <hr>
  77. </div>
  78. <div class="layui-form-item">
  79. <legend>生成命令行</legend>
  80. <textarea class="layui-textarea" rel=command style="min-height: 25px;" placeholder="请点击生成命令行" lay-tips="如果在线执行命令失败,可以将命令复制到命令行进行执行"></textarea>
  81. </div>
  82. <hr>
  83. <div class="layui-form-item">
  84. <legend>返回结果</legend>
  85. <textarea class="layui-textarea" rel="result" rows="3" placeholder="请点击立即执行"></textarea>
  86. </div>
  87. <div class="layui-form-item">
  88. <button class="layui-btn layui-bg-blue" lay-submit lay-filter="btn-command">生成命令行</button>
  89. <button class="layui-btn btn-execute">立即执行</button>
  90. </div>
  91. {:token()}
  92. </form>
  93. </div>
  94. <div class="layui-tab-item">
  95. <form class="layui-form" method="post">
  96. <input type="hidden" name="commandtype" value="menu" />
  97. <div class="layui-form-item">
  98. <span lay-tips="删除控制器菜单规则">
  99. <input type="checkbox" name="delete" title="删除模式" value="1">
  100. </span>
  101. <span lay-tips="如果菜单规则已经存在则覆盖">
  102. <input type="checkbox" name="force" title="强制覆盖模式" value="1">
  103. </span>
  104. </div>
  105. <hr>
  106. <div class="layui-form-item" id="controller">
  107. <legend>控制器设置</legend>
  108. <input type="text" class="layui-input selectpage" data-source="{:url('get_controller_list')}" data-multiple="true" name="controllerfile" placeholder="请选择控制器" />
  109. </div>
  110. <hr>
  111. <div class="layui-form-item">
  112. <legend>生成命令行</legend>
  113. <textarea class="layui-textarea" rel=command style="min-height: 25px;" placeholder="请点击生成命令行" lay-tips="如果在线执行命令失败,可以将命令复制到命令行进行执行"></textarea>
  114. </div>
  115. <hr>
  116. <div class="layui-form-item">
  117. <legend>返回结果</legend>
  118. <textarea class="layui-textarea" rel="result" rows="3" placeholder="请点击立即执行"></textarea>
  119. </div>
  120. <div class="layui-form-item">
  121. <button class="layui-btn layui-bg-blue" lay-submit lay-filter="btn-command">生成命令行</button>
  122. <button class="layui-btn btn-execute">立即执行</button>
  123. </div>
  124. {:token()}
  125. </form>
  126. </div>
  127. </div>
  128. </div>
  129. <script id="relationtpl" type="text/html">
  130. <div class="layui-row layui-col-space10 relation-item">
  131. <div class="layui-col-xs2">
  132. <label>请选择关联表</label>
  133. <select name="relation[{{d.index}}][relation]" data-index="{{d.index}}" class="relationtable" lay-filter="relationtable-filter" lay-search></select>
  134. </div>
  135. <div class="layui-col-xs2">
  136. <label>请选择关联类型</label>
  137. <select name="relation[{{d.index}}][relationmode]" class="relationmode" lay-filter="relationmode-filter"></select>
  138. </div>
  139. <div class="layui-col-xs2">
  140. <label>关联外键</label>
  141. <select name="relation[{{d.index}}][relationforeignkey]" class="relationforeignkey"></select>
  142. </div>
  143. <div class="layui-col-xs2">
  144. <label>关联主键</label>
  145. <select name="relation[{{d.index}}][relationprimarykey]" class="relationprimarykey"></select>
  146. </div>
  147. <div class="layui-col-xs3">
  148. <label>请选择显示字段</label>
  149. <div class="relationfields" id="relationfields{{d.index}}" name="relation[{{d.index}}][relationfields][]"></div>
  150. </div>
  151. <div class="layui-col-xs1">
  152. <label>&nbsp;</label>
  153. <button type="button" class="layui-btn layui-btn-danger btn-removerelation">移除</button>
  154. </div>
  155. </div>
  156. </script>
  157. {/block}
  158. {block name="script"}
  159. <script type="text/javascript">
  160. layui.use(['yznForm','yzn','xmSelect'], function() {
  161. var yznForm = layui.yznForm,
  162. yzn = layui.yzn,
  163. form = layui.form,
  164. xmselect = layui.xmSelect,
  165. laytpl = layui.laytpl;
  166. var maintable = [];
  167. var mainfields = [];
  168. var relationmode = ["belongsto", "hasone"];
  169. $("select[name=table] option").each(function () {
  170. maintable.push($(this).val());
  171. });
  172. var renderselect = function (select, data,name) {
  173. var newArr = [];
  174. $.each(data, function(i, j) {
  175. var vote = {};
  176. vote.value = j;
  177. vote.name = j;
  178. newArr.push(vote);
  179. })
  180. xmSelect.render({
  181. el: select,
  182. name:name,
  183. data: newArr
  184. })
  185. };
  186. function buildOptions(select,data,render=true){
  187. var html = [];
  188. for (var i = 0; i < data.length; i++) {
  189. html.push("<option value='" + data[i] + "'>" + data[i] + "</option>");
  190. }
  191. $(select).html(html.join(""));
  192. render && form.render();
  193. select.siblings("div.layui-form-select").find("dd:first").click();
  194. };
  195. $(document).on('click', ".btn-removerelation", function () {
  196. $(this).closest(".layui-row").remove();
  197. });
  198. //主表关联
  199. form.on('select(table-filter)', function(data){
  200. yzn.request.post({
  201. url: "{:url('get_field_list')}",
  202. data: {table: data.value},
  203. }, function (data, ret) {
  204. mainfields = data.fieldlist;
  205. $("#relation-zone .relation-item").remove();
  206. renderselect("#fields", mainfields,'fields');
  207. });
  208. return false;
  209. });
  210. $("select[name='table']").siblings("div.layui-form-select").find("dd:first").click();
  211. //点击显示关联表
  212. form.on('checkbox(isrelation-filter)', function(data){
  213. var elem = data.elem;
  214. $("#relation-zone").toggleClass("layui-hide", !elem.checked);
  215. });
  216. //点击动态追加关联表
  217. $(document).on('click', "a.btn-newrelation", function () {
  218. var that = this;
  219. var index = parseInt($(that).data("index")) + 1;
  220. var content = laytpl($("#relationtpl").html()).render({index: index});
  221. content = $(content.replace(/\[index\]/, index));
  222. $(this).data("index", index);
  223. $(content).insertBefore($(that).closest(".layui-row"));
  224. var exists = [$("select[name='table']").val()];
  225. $("select.relationtable").each(function () {
  226. exists.push($(this).val());
  227. });
  228. relationtable = [];
  229. $.each(maintable, function (i, j) {
  230. if ($.inArray(j, exists) < 0) {
  231. relationtable.push(j);
  232. }
  233. });
  234. buildOptions($("select.relationtable", content), relationtable);
  235. });
  236. form.on('select(relationmode-filter)', function(data){
  237. var table = $("select.relationtable", $(this).closest(".layui-row")).val();
  238. var that = this;
  239. var value = data.value;
  240. yzn.request.post({
  241. url: "{:url('get_field_list')}",
  242. data: {table: table},
  243. }, function (data, ret) {
  244. buildOptions($(that).closest(".layui-row").find("select.relationprimarykey"), value == 'belongsto' ? data.fieldlist : mainfields,false);
  245. buildOptions($(that).closest(".layui-row").find("select.relationforeignkey"), value == 'hasone' ? data.fieldlist : mainfields,false);
  246. form.render();
  247. });
  248. return false;
  249. });
  250. //关联表下拉追加字段
  251. form.on('select(relationtable-filter)', function(data){
  252. var that = this;
  253. var index = $(data.elem).data('index');
  254. var fieldsObj = $(that).closest(".layui-row").find("div.relationfields");
  255. var name = fieldsObj.attr('name');
  256. yzn.request.post({
  257. url: "{:url('get_field_list')}",
  258. data: {table: data.value},
  259. }, function (data, ret) {
  260. buildOptions($(that).closest(".layui-row").find("select.relationmode"), relationmode);
  261. renderselect('#relationfields'+index, data.fieldlist,name)
  262. });
  263. return false;
  264. });
  265. form.on('submit(btn-command)', function(data){
  266. var field = data.field;
  267. var elemForm = data.form;
  268. var textarea = $("textarea[rel=command]", elemForm);
  269. textarea.val('');
  270. yzn.request.post({
  271. url: "{:url('command')}?action=command",
  272. data: field,
  273. }, function (data, ret) {
  274. textarea.val(data.command);
  275. });
  276. return false;
  277. });
  278. $(document).on('click', ".btn-execute", function () {
  279. var form = $(this).closest("form");
  280. var textarea = $("textarea[rel=result]", form);
  281. textarea.val('');
  282. yzn.request.post({
  283. url: "{:url('command')}?action=execute",
  284. data: form.serialize(),
  285. }, function (data, ret) {
  286. window.parent.$('[data-table-refresh]').trigger('click');
  287. textarea.val(data.result);
  288. }, function (data,ret) {
  289. window.parent.$('[data-table-refresh]').trigger('click');
  290. yzn.msg.error(ret.msg);
  291. });
  292. return false;
  293. });
  294. yznForm.events.selectpage($("form.layui-form"));
  295. //yznForm.bindevent($("form.layui-form"));
  296. });
  297. </script>
  298. {/block}