Просмотр исходного кода

feat:餐饮公司和食堂绑定

lizhi 3 месяцев назад
Родитель
Сommit
6e3f36dbe9
100 измененных файлов с 346 добавлено и 37 удалено
  1. 1 0
      assets/404-DZIpZTml.js
  2. 1 0
      assets/ArtUploadImgs.vue_vue_type_script_setup_true_lang-D8q0C5aF.js
  3. 147 0
      assets/FollowDialog.vue_vue_type_script_setup_true_lang-DfpJd6HP.js
  4. BIN
      assets/FollowDialog.vue_vue_type_script_setup_true_lang-DfpJd6HP.js.gz
  5. 1 0
      assets/FollowDrawer-DKP4CdqQ.js
  6. 1 0
      assets/LoginLeftView-B5JX9Eg4.js
  7. 1 0
      assets/canteenApi-DfYwW3JF.js
  8. 1 0
      assets/companyApi-Ulg6zLYX.js
  9. 1 0
      assets/edit-BS2zvGZs.js
  10. 1 0
      assets/edit-D5lDfm1c.js
  11. 1 0
      assets/edit-a25GPdmd.js
  12. 1 0
      assets/followApi-6LfrtKsT.js
  13. 1 0
      assets/index-0Mygocou.js
  14. 1 0
      assets/index-2nse6zli.js
  15. 1 0
      assets/index-36VrAgpq.js
  16. 1 0
      assets/index-B1BlgNhU.js
  17. 1 0
      assets/index-B88XqoY5.css
  18. 1 0
      assets/index-BF0hblkn.css
  19. 1 0
      assets/index-BtKePhm1.js
  20. 1 0
      assets/index-ByM6e8Ue.js
  21. BIN
      assets/index-ByM6e8Ue.js.gz
  22. 1 0
      assets/index-CPoaUgqv.js
  23. 1 0
      assets/index-CSNLX16x.js
  24. 36 0
      assets/index-Cf-Us86_.js
  25. BIN
      assets/index-Cf-Us86_.js.gz
  26. 1 0
      assets/index-Cstj7Qzp.css
  27. 1 0
      assets/index-CzSo7Ru7.css
  28. 1 0
      assets/index-D23UTSNz.js
  29. 1 0
      assets/index-D7CZli1R.css
  30. 1 0
      assets/index-DGVogfZO.js
  31. 1 0
      assets/index-DSmTZU3a.js
  32. 1 0
      assets/index-DnIFkhts.js
  33. 1 0
      assets/index-Dv41wSye.js
  34. 1 0
      assets/index-SKorT4No.js
  35. 1 0
      assets/index-VPXNnZJq.js
  36. BIN
      assets/index-VPXNnZJq.js.gz
  37. 1 0
      assets/index-Y4p9KeN-.js
  38. 1 0
      assets/index-ZFEhoDei.js
  39. 1 0
      assets/index-cA7j7rMR.css
  40. BIN
      assets/index-cA7j7rMR.css.gz
  41. 1 0
      assets/index-pe3jx9Gp.css
  42. 1 0
      assets/index-pizsP2Ov.js
  43. 1 0
      assets/index-qmIh3EzD.js
  44. 1 0
      assets/info-70Hc7tuO.js
  45. 1 0
      assets/info-B-_0eXsl.js
  46. 1 0
      assets/info-BV5Rxyg1.js
  47. 1 0
      assets/info-BmLacyYR.css
  48. 1 0
      assets/info-BxWsadiQ.css
  49. 1 0
      assets/info-CDJdd1c7.js
  50. 1 0
      assets/info-CYOggkt2.css
  51. 1 0
      assets/info-Cp5hJ8Uf.js
  52. 1 0
      assets/info-DbJNlSd2.css
  53. 1 0
      assets/info-DfNCY75P.css
  54. 1 0
      assets/info-DsXuXMGb.css
  55. 1 0
      assets/info-SK03JiD2.js
  56. 1 0
      assets/schoolApi-D0CZluX9.js
  57. 7 0
      assets/useTable-DllZVeJ1.js
  58. BIN
      assets/useTable-DllZVeJ1.js.gz
  59. 1 0
      assets/user-dialog-BmWeEKeb.js
  60. 1 0
      assets/user-dialog-DqlS4ilA.js
  61. 1 0
      assets/user-dialog-LDaxG2Gp.js
  62. 1 0
      assets/user-dialog.vue_vue_type_script_setup_true_lang-B9MtsWWc.js
  63. 1 0
      assets/user-dialog.vue_vue_type_script_setup_true_lang-DQfZqXbV.js
  64. 1 0
      assets/user-dialog.vue_vue_type_script_setup_true_lang-kdeFVofN.js
  65. 1 0
      assets/user-search-B7s-Q5Hi.js
  66. 1 0
      assets/user-search-BGJVWm7q.js
  67. 1 0
      assets/user-search-Bh1GMoI4.js
  68. 1 0
      assets/user-search-Bj0p19nS.js
  69. 1 0
      assets/user-search-CN69sa0H.js
  70. 1 0
      assets/user-search-CYmSuBxJ.js
  71. 1 0
      assets/user-search-CiwEMnvA.js
  72. 1 0
      assets/user-search-CmJ0vwM8.js
  73. 1 0
      assets/user-search-DZkeK2iC.js
  74. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-1_KW_Xwe.js
  75. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-BJH48ZAa.js
  76. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-Bytju0rB.js
  77. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-C23XWAYt.js
  78. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-CInpL8A4.js
  79. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-CcWaXS0G.js
  80. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-IN3KeChY.js
  81. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-Nc4-FRuq.js
  82. 1 0
      assets/user-search.vue_vue_type_script_setup_true_lang-URtE9-73.js
  83. 1 1
      index.html
  84. 7 3
      protected/components/DB.php
  85. 34 10
      protected/controllers/CanteenController.php
  86. 8 1
      protected/controllers/CommonController.php
  87. 2 2
      web/src/api/commonApi.ts
  88. 0 2
      web/src/components/custom/ArtUploadImgs.vue
  89. 6 0
      web/src/typings/api.d.ts
  90. 1 0
      web/src/typings/form.d.ts
  91. 0 1
      web/src/utils/http/index.ts
  92. 1 1
      web/src/views/auth/register/index.vue
  93. 20 7
      web/src/views/canteen/edit.vue
  94. 0 1
      web/src/views/canteen/follow/info.vue
  95. 0 2
      web/src/views/canteen/follow/modules/user-search.vue
  96. 0 1
      web/src/views/canteen/info.vue
  97. 0 1
      web/src/views/canteen/list/index.vue
  98. 0 2
      web/src/views/canteen/list/user-search.vue
  99. 3 2
      web/src/views/company/edit.vue
  100. 0 0
      web/src/views/company/follow/info.vue

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/404-DZIpZTml.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/ArtUploadImgs.vue_vue_type_script_setup_true_lang-D8q0C5aF.js


Разница между файлами не показана из-за своего большого размера
+ 147 - 0
assets/FollowDialog.vue_vue_type_script_setup_true_lang-DfpJd6HP.js


BIN
assets/FollowDialog.vue_vue_type_script_setup_true_lang-DfpJd6HP.js.gz


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/FollowDrawer-DKP4CdqQ.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/LoginLeftView-B5JX9Eg4.js


+ 1 - 0
assets/canteenApi-DfYwW3JF.js

@@ -0,0 +1 @@
+import{f as t}from"./index-Cf-Us86_.js";class a{static list(a){return t.post({url:"canteen/list",params:a})}static info(a){return t.post({url:"canteen/info",params:{id:a}})}static add(a){return t.post({url:"canteen/add",params:a})}static updateAttr(a){return t.post({url:"canteen/updateAttr",params:a})}static edit(a){return t.post({url:"canteen/edit",params:a})}static delete(a){return t.post({url:"canteen/delete",params:a})}}export{a as c};

+ 1 - 0
assets/companyApi-Ulg6zLYX.js

@@ -0,0 +1 @@
+import{f as t}from"./index-Cf-Us86_.js";class a{static list(a){return t.post({url:"company/list",params:a})}static info(a){return t.post({url:"company/info",params:{id:a}})}static add(a){return t.post({url:"company/add",params:a})}static updateAttr(a){return t.post({url:"company/updateAttr",params:a})}static edit(a){return t.post({url:"company/edit",params:a})}static delete(a){return t.post({url:"company/delete",params:a})}}export{a as c};

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/edit-BS2zvGZs.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/edit-D5lDfm1c.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/edit-a25GPdmd.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/followApi-6LfrtKsT.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-0Mygocou.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-2nse6zli.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-36VrAgpq.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-B1BlgNhU.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-B88XqoY5.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-BF0hblkn.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-BtKePhm1.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-ByM6e8Ue.js


BIN
assets/index-ByM6e8Ue.js.gz


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-CPoaUgqv.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-CSNLX16x.js


Разница между файлами не показана из-за своего большого размера
+ 36 - 0
assets/index-Cf-Us86_.js


BIN
assets/index-Cf-Us86_.js.gz


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-Cstj7Qzp.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-CzSo7Ru7.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-D23UTSNz.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-D7CZli1R.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-DGVogfZO.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-DSmTZU3a.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-DnIFkhts.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-Dv41wSye.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-SKorT4No.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-VPXNnZJq.js


BIN
assets/index-VPXNnZJq.js.gz


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-Y4p9KeN-.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-ZFEhoDei.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-cA7j7rMR.css


BIN
assets/index-cA7j7rMR.css.gz


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-pe3jx9Gp.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-pizsP2Ov.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/index-qmIh3EzD.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/info-70Hc7tuO.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/info-B-_0eXsl.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/info-BV5Rxyg1.js


+ 1 - 0
assets/info-BmLacyYR.css

@@ -0,0 +1 @@
+.detail{&[data-v-f08da61b]{padding-top:20px;font-size:14px}.el-col{&[data-v-f08da61b]{margin-bottom:30px}label[data-v-f08da61b]{font-weight:700;margin-right:10px}}}

+ 1 - 0
assets/info-BxWsadiQ.css

@@ -0,0 +1 @@
+.detail{&[data-v-daf47579]{padding-top:20px;font-size:14px}.el-col{&[data-v-daf47579]{margin-bottom:30px}label[data-v-daf47579]{font-weight:700;margin-right:10px}}}

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/info-CDJdd1c7.js


+ 1 - 0
assets/info-CYOggkt2.css

@@ -0,0 +1 @@
+.detail{&[data-v-ffe2b4f4]{padding-top:20px;font-size:14px}.el-col{&[data-v-ffe2b4f4]{margin-bottom:30px}label[data-v-ffe2b4f4]{font-weight:700;margin-right:10px}}}

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/info-Cp5hJ8Uf.js


+ 1 - 0
assets/info-DbJNlSd2.css

@@ -0,0 +1 @@
+.detail{&[data-v-63c757c6]{padding-top:20px;font-size:14px}.el-col{&[data-v-63c757c6]{margin-bottom:30px}label[data-v-63c757c6]{font-weight:700;margin-right:10px}}}

+ 1 - 0
assets/info-DfNCY75P.css

@@ -0,0 +1 @@
+.detail{&[data-v-986701a5]{padding-top:20px;font-size:14px}.el-col{&[data-v-986701a5]{margin-bottom:30px}label[data-v-986701a5]{font-weight:700;margin-right:10px}}}

+ 1 - 0
assets/info-DsXuXMGb.css

@@ -0,0 +1 @@
+.detail{&[data-v-52e98547]{padding-top:20px;font-size:14px}.el-col{&[data-v-52e98547]{margin-bottom:30px}label[data-v-52e98547]{font-weight:700;margin-right:10px}}}

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/info-SK03JiD2.js


+ 1 - 0
assets/schoolApi-D0CZluX9.js

@@ -0,0 +1 @@
+import{f as t}from"./index-Cf-Us86_.js";class s{static list(s){return t.post({url:"school/list",params:s})}static info(s){return t.post({url:"school/info",params:{id:s}})}static add(s){return t.post({url:"school/add",params:s})}static updateAttr(s){return t.post({url:"school/updateAttr",params:s})}static edit(s){return t.post({url:"school/edit",params:s})}static delete(s){return t.post({url:"school/delete",params:s})}}export{s};

Разница между файлами не показана из-за своего большого размера
+ 7 - 0
assets/useTable-DllZVeJ1.js


BIN
assets/useTable-DllZVeJ1.js.gz


+ 1 - 0
assets/user-dialog-BmWeEKeb.js

@@ -0,0 +1 @@
+import{_ as t}from"./user-dialog.vue_vue_type_script_setup_true_lang-DQfZqXbV.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                   *//* empty css                  *//* empty css                *//* empty css               *//* empty css                  *//* empty css                     */import"./el-form-item-l0sNRNKZ.js";/* empty css                 */export{t as default};

+ 1 - 0
assets/user-dialog-DqlS4ilA.js

@@ -0,0 +1 @@
+import{_ as t}from"./user-dialog.vue_vue_type_script_setup_true_lang-kdeFVofN.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                   *//* empty css                  *//* empty css                *//* empty css               *//* empty css                  *//* empty css                     */import"./el-form-item-l0sNRNKZ.js";/* empty css                 */export{t as default};

+ 1 - 0
assets/user-dialog-LDaxG2Gp.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-dialog.vue_vue_type_script_setup_true_lang-B9MtsWWc.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                   *//* empty css                  *//* empty css                *//* empty css               *//* empty css                  *//* empty css                     */import"./el-form-item-l0sNRNKZ.js";/* empty css                 *//* empty css                   */export{e as default};

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-dialog.vue_vue_type_script_setup_true_lang-B9MtsWWc.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-dialog.vue_vue_type_script_setup_true_lang-DQfZqXbV.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-dialog.vue_vue_type_script_setup_true_lang-kdeFVofN.js


+ 1 - 0
assets/user-search-B7s-Q5Hi.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-BJH48ZAa.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";import"./city-zj5gw6l3.js";export{e as default};

+ 1 - 0
assets/user-search-BGJVWm7q.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-Bytju0rB.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";export{e as default};

+ 1 - 0
assets/user-search-Bh1GMoI4.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-IN3KeChY.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";export{e as default};

+ 1 - 0
assets/user-search-Bj0p19nS.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-URtE9-73.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";export{e as default};

+ 1 - 0
assets/user-search-CN69sa0H.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-1_KW_Xwe.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";export{e as default};

+ 1 - 0
assets/user-search-CYmSuBxJ.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-CInpL8A4.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";export{e as default};

+ 1 - 0
assets/user-search-CiwEMnvA.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-CcWaXS0G.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";import"./city-zj5gw6l3.js";export{e as default};

+ 1 - 0
assets/user-search-CmJ0vwM8.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-C23XWAYt.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";export{e as default};

+ 1 - 0
assets/user-search-DZkeK2iC.js

@@ -0,0 +1 @@
+import{_ as e}from"./user-search.vue_vue_type_script_setup_true_lang-Nc4-FRuq.js";import"./index-qmIh3EzD.js";import"./index-Cf-Us86_.js";import"./vendor-C0fQtjEp.js";/* empty css                 */import"./index-DSmTZU3a.js";import"./_plugin-vue_export-helper-BCo6x5W8.js";export{e as default};

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-1_KW_Xwe.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-BJH48ZAa.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-Bytju0rB.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-C23XWAYt.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-CInpL8A4.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-CcWaXS0G.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-IN3KeChY.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-Nc4-FRuq.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
assets/user-search.vue_vue_type_script_setup_true_lang-URtE9-73.js


+ 1 - 1
index.html

@@ -9,7 +9,7 @@
       content="逐趣CRM - A modern admin dashboard template built with Vue 3, TypeScript, and Element Plus."
     />
     <link rel="shortcut icon" type="image/x-icon" href="/assets/favicon-B33nFcrs.ico" />
-    <script type="module" crossorigin src="/assets/index-LUnPR-eV.js"></script>
+    <script type="module" crossorigin src="/assets/index-Cf-Us86_.js"></script>
     <link rel="modulepreload" crossorigin href="/assets/vendor-C0fQtjEp.js">
     <link rel="stylesheet" crossorigin href="/assets/index-D7z-dQEN.css">
   </head>

+ 7 - 3
protected/components/DB.php

@@ -348,7 +348,7 @@ class DB
         }
         $condition = trim($condition, 'AND');
         $condition = trim($condition);
-
+        Logger::info($condition);
         return $command->delete($tableName, $condition, $params);
     }
 
@@ -437,7 +437,7 @@ class DB
         $retData['records'] = $build->queryAll() ?: [];
 
         // debug
-        if ($criteria->getDebugMode() || LWM_ENV != 'prod') {
+        if ($criteria->getDebugMode()) {
             Logger::info(
                 json_encode(
                     [
@@ -462,6 +462,9 @@ class DB
     public static function getInfoWithCriteria(string $table_name, DbCriteria $criteria)
     {
         $table_name = self::formTableName($table_name);
+        if ($criteria->alias) {
+            $table_name .= ' as '.$criteria->alias;
+        }
         // 指定索引
         if (!empty($criteria->forceIndex)) {
             $table_name .= " FORCE INDEX (`{$criteria->forceIndex}`)";
@@ -475,9 +478,10 @@ class DB
         !empty($criteria->group) && $build->group($criteria->group);
         !empty($criteria->having) && $build->having($criteria->having);
         !empty($criteria->order) && $build->order($criteria->order);
+        !empty($criteria->join) && $build->setJoin($criteria->join);
 
         // debug
-        if ($criteria->getDebugMode() || LWM_ENV != 'prod') {
+        if ($criteria->getDebugMode()) {
             Logger::info(
                 json_encode(
                     [

+ 34 - 10
protected/controllers/CanteenController.php

@@ -18,8 +18,13 @@ class CanteenController extends Controller
         }
         $data['stall_imgs'] = Helper::formatImgsFiled($data['stall_imgs']);
         $school = DB::getInfoById('school', $data['school_id'], 'name');
-        $company = DB::getInfoById('company', $data['company_id'], 'name');
-        $data['company_name'] = $company['name']?? '';
+        $cri = DbCriteria::simpleCompare(['t.canteen_id' => $id])
+            ->setSelect('c.name,c.id')
+            ->setAlias('t')
+            ->setJoin('left join wx_company c on c.id=t.company_id');
+        $companyInfo = DB::getInfoWithCriteria('company_canteen_relation', $cri);
+        $data['company_name'] = $companyInfo['name']?? '';
+        $data['company_id'] = $companyInfo['id']?? '';
         $data['school_name'] = $school['name']?? '';
         Helper::ok($data);
     }
@@ -57,18 +62,28 @@ class CanteenController extends Controller
         $data = DB::getListWithCriteria(self::$table, $cri);
         if (!empty($data['records'])) {
             $users = Helper::arrayColumn(
-                DB::getListWithCriteria('useradmin', DbCriteria::simpleCompare([])->setSelect('id, username')),
+                DB::getListWithCriteria('useradmin', DbCriteria::simpleCompare(['id' => array_column($data['records'], 'last_user_id')])->setSelect('id, username')),
                 'username',
                 'id'
             );
             $schools = Helper::arrayColumn(
-                DB::getListWithCriteria('school', DbCriteria::simpleCompare([])->setSelect('id, name')),
+                DB::getListWithCriteria('school', DbCriteria::simpleCompare(['id' => array_column($data['records'], 'school_id')])->setSelect('id, name')),
                 'name',
                 'id'
             );
-            $data['records'] = array_map(function ($item) use ($users, $schools) {
+            $cri = DbCriteria::simpleCompare([['t.canteen_id' => array_column($data['records'], 'id')]])
+                ->setSelect('c.name,t.canteen_id')
+                ->setAlias('t')
+                ->setJoin('left join wx_company c on c.id=t.company_id');
+            $relations = Helper::arrayColumn(
+                DB::getListWithCriteria('company_canteen_relation', $cri),
+                'name',
+                'canteen_id'
+            );
+            $data['records'] = array_map(function ($item) use ($users, $schools, $relations) {
                 $item['last_user_name'] = $users[$item['last_user_id']] ?? '-';
                 $item['school_name'] = $schools[$item['school_id']] ?? '-';
+                $item['company_name'] = $relations[$item['id']] ?? '-';
                 $item['stall_imgs'] = Helper::formatImgsFiled($item['stall_imgs']);
                 return $item;
             }, $data['records']);
@@ -123,7 +138,7 @@ class CanteenController extends Controller
         ];
 
         $notNullField = ["school_id","name","stall_num","is_direct","username","phone","weixin"];
-        $allowEmptyField = ["school_id","stall_num","is_direct"];
+        $allowEmptyField = ["stall_num","is_direct"];
 
         // 空字段检测
         if (!Helper::checkEmptyKey($data, $notNullField, $allowEmptyField)) {
@@ -141,10 +156,19 @@ class CanteenController extends Controller
         }
         $data['stall_imgs'] = $data['stall_imgs'] ? implode(',', $data['stall_imgs']) : '';
 
-        if ($id) {
-            DB::updateById(self::$table, $data, $id);
-        } else {
-            DB::addData(self::$table, $data);
+        $trans = \Yii::app()->db->beginTransaction();
+        try {
+            if ($id) {
+                DB::updateById(self::$table, $data, $id);
+            } else {
+                DB::addData(self::$table, $data);
+            }
+            Db::deleteByCondition('company_canteen_relation', ['canteen_id' => $id]);
+            Db::addData('company_canteen_relation', ['canteen_id' => $id, 'company_id' => $data['school_id'], 'school_id' => $data['school_id']]);
+            $trans->commit();
+        } catch (\Exception $e) {
+            $trans->rollback();
+            Helper::error($e->getMessage());
         }
         Helper::ok();
     }

+ 8 - 1
protected/controllers/CommonController.php

@@ -91,13 +91,20 @@ class CommonController extends Controller
                     break;
                 case 'school_canteen':
                     $filter = ['is_del' => 0, 'id' => $this->getSchoolFilter()];
+                    $company_id = Helper::getPostInt('company_id');
+                    $exclude_canteen_ids = [];
+                    if ($company_id) {
+                        $exclude_canteen_ids = Helper::arrayColumn(DB::getListWithCriteria('company_canteen_relation', DbCriteria::simpleCompare(['company_id' => '!=' . $company_id])), 'canteen_id');
+                    }
                     $cri = DbCriteria::simpleCompare($filter)->setSelect('id, name');
                     $schools = Helper::arrayColumn(DB::getListWithCriteria('school', $cri), null, 'id');
                     if (empty($schools)) {
                         $ret['school_canteen'] = [];
                         break;
                     }
-                    $cri1 = DbCriteria::simpleCompare(['is_del' => 0, 'school_id' => array_keys($schools)])->setSelect('id, name, school_id as parent_id');
+                    $cri1 = DbCriteria::simpleCompare(['is_del' => 0, 'school_id' => array_keys($schools)])
+                        ->setSelect('id, name, school_id as parent_id')
+                        ->addNotInCondition('id', $exclude_canteen_ids);
                     $relations = DB::getListWithCriteria('canteen', $cri1);
                     $ret['school_canteen'] = $this->formatRelationList($relations['records'], $schools);
                     break;

+ 2 - 2
web/src/api/commonApi.ts

@@ -45,10 +45,10 @@ export class commonApi {
   }
 
   // 下拉列表
-  static selectList(types: Api.SelectTypeArray) {
+  static selectList(types: Api.SelectTypeArray, selectListParams?:Api.Common.selectListParams) {
     return request.post<Api.Common.SelectList>({
       url: 'common/getSelectList',
-      params: { types },
+      params: { types, ...selectListParams },
       showErrorMessage: false // 不显示错误消息
     })
   }

+ 0 - 2
web/src/components/custom/ArtUploadImgs.vue

@@ -69,7 +69,6 @@
         url: item
       }
     })
-    console.log(`%c fileList == `, 'background:#41b883 ; padding:1px; color:#fff', fileList.value);
   }, { immediate: true })
   
   const dialogImageUrl = ref('')
@@ -78,7 +77,6 @@
   const handleRemove: UploadProps['onRemove'] = (uploadFile: UploadFile) => {
     const response = uploadFile.response as {data:any}
     let upName = response ? response.data.name : uploadFile.name
-    console.log(`%c upName == `, 'background:#41b883 ; padding:1px; color:#fff', upName);
     commonApi.delImg(upName)
     for (let i = 0; i < props.imgs.length; i++) {
       if (props.imgs[i] === upName) {

+ 6 - 0
web/src/typings/api.d.ts

@@ -47,6 +47,12 @@ declare namespace Api {
       total: number
     }
 
+    interface selectListParams {
+      company_id?: number
+      id?: number
+      school_id?: number
+    }
+
     interface relation {
       id: number
       name: string // 联系人名称

+ 1 - 0
web/src/typings/form.d.ts

@@ -90,6 +90,7 @@ declare namespace Form {
   interface Canteen {
     id: number
     school_id: number // 学校ID
+    company_id: number // 学校ID
     name: string // 名称
     stall_num: number // 档口数量
     is_direct: 0|1 // 是否直营

+ 0 - 1
web/src/utils/http/index.ts

@@ -219,7 +219,6 @@ function getSign(formData: FormData) {
       params[key] = value
     }
   });
-  console.log(`%c params == `, 'background:#41b883 ; padding:1px; color:#fff', params);
   const sortedKeys = Object.keys(params).sort()
   const queryString = sortedKeys.map((key) => {
     if (Array.isArray(params[key])) {

+ 1 - 1
web/src/views/auth/register/index.vue

@@ -158,7 +158,7 @@
         toLogin()
       }, 1000)
     } catch (error) {
-      console.log('验证失败', error)
+      console.error('验证失败', error)
     }
   }
 

+ 20 - 7
web/src/views/canteen/edit.vue

@@ -30,7 +30,7 @@
         <ElFormItem label="学校(校区)" prop="school_id">
           <ElSelect style="max-width: 200px" v-model="formData.school_id" placeholder="请选择" :empty-values="[0]" :value-on-clear="0">
             <ElOption
-              v-for="item in selectList"
+              v-for="item in schoolList"
               :key="item.id"
               :value="item.id"
               :label="item.name"
@@ -39,8 +39,15 @@
         </ElFormItem>
       </el-col>
       <el-col>
-        <ElFormItem label="餐饮公司" prop="school_id">
-          <ElInput style="max-width: 400px" v-model="formData.school_id" type="number" />
+        <ElFormItem label="餐饮公司" prop="company_id">
+          <ElSelect style="max-width: 200px" v-model="formData.company_id" placeholder="请选择" :empty-values="[0]" :value-on-clear="0">
+            <ElOption
+                v-for="item in companyList"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+            />
+          </ElSelect>
         </ElFormItem>
       </el-col>
       <el-col>
@@ -91,6 +98,7 @@
   import { ElMessageBox } from 'element-plus'
   import { RoutesAlias } from '@/router/routesAlias'
   import {commonApi} from "@/api/commonApi";
+  import {useWorktabStore} from "@/store/modules/worktab";
 
   // 表单实例
   const formRef = ref<FormInstance>()
@@ -98,6 +106,7 @@
   const DefaultData = <Form.Canteen>{
     id: 0,
     school_id: 0,
+    company_id: 0,
     name: '',
     stall_num: 0,
     is_direct: 0,
@@ -115,7 +124,8 @@
 
   // 表单验证规则
   const rules: FormRules = {
-    school_id: [{ required: true, message: '请输入学校ID', trigger: 'blur' }],
+    school_id: [{ required: true, message: '请选择学校', trigger: 'blur' }],
+    company_id: [{ required: true, message: '请选择餐饮公司', trigger: 'blur' }],
     name: [
       { required: true, message: '请输入名称', trigger: 'blur' },
       { max: 20, message: '长度最多20个字符', trigger: 'blur' }
@@ -154,10 +164,12 @@
     }
   }
 
-  const selectList = ref<Api.Common.SelectInfo[]>([])
+  const schoolList = ref<Api.Common.SelectInfo[]>([])
+  const companyList = ref<Api.Common.SelectInfo[]>([])
   const getSelectList = async () => {
-    await commonApi.selectList(['school']).then(res => {
-      selectList.value = res.school || []
+    await commonApi.selectList(['school', 'company']).then(res => {
+      schoolList.value = res.school || []
+      companyList.value = res.company || []
     })
   }
 
@@ -178,6 +190,7 @@
     })
       .then(() => {
         router.push({ path: RoutesAlias.CanteenList })
+        useWorktabStore().removeTab(route.path)
       })
       .catch(() => {
         // ... do nothing

+ 0 - 1
web/src/views/canteen/follow/info.vue

@@ -68,7 +68,6 @@ const info = reactive<Api.Follow.FollowInfo>({ ...DefaultData })
 onMounted(() => {
   followApi.canteenInfo(parseInt(useRoute().query.id as string)).then((res) => {
     Object.assign(info, res)
-    console.log(`%c info == `, 'background:#41b883 ; padding:1px; color:#fff', info);
   })
 })
 </script>

+ 0 - 2
web/src/views/canteen/follow/modules/user-search.vue

@@ -68,13 +68,11 @@ const formItems = computed(() => [
 
 // 事件
 function handleReset() {
-  console.log('重置表单')
   emit('reset')
 }
 
 async function handleSearch() {
   await searchBarRef.value.validate()
   emit('search', formData.value)
-  console.log('表单数据', formData.value)
 }
 </script>

+ 0 - 1
web/src/views/canteen/info.vue

@@ -79,7 +79,6 @@ const info = reactive<Api.Canteen.Info>({ ...DefaultData })
 onMounted(() => {
   canteenApi.info(parseInt(useRoute().query.id as string)).then((res) => {
     Object.assign(info, res)
-    console.log(`%c info == `, 'background:#41b883 ; padding:1px; color:#fff', info);
   })
 })
 </script>

+ 0 - 1
web/src/views/canteen/list/index.vue

@@ -310,7 +310,6 @@ onMounted(() => {
 })
 
 const doUpdateAttr = (scope: any) => {
-  console.log(`%c scope == `, 'background:#41b883 ; padding:1px; color:#fff', scope)
   if (!scope.row.id || !isMounted.value) {
     return
   }

+ 0 - 2
web/src/views/canteen/list/user-search.vue

@@ -79,13 +79,11 @@
 
   // 事件
   function handleReset() {
-    console.log('重置表单')
     emit('reset')
   }
 
   async function handleSearch() {
     await searchBarRef.value.validate()
     emit('search', formData.value)
-    console.log('表单数据', formData.value)
   }
 </script>

+ 3 - 2
web/src/views/company/edit.vue

@@ -73,6 +73,7 @@
   import { ElMessageBox } from 'element-plus'
   import { RoutesAlias } from '@/router/routesAlias'
   import {commonApi} from "@/api/commonApi";
+  import {useWorktabStore} from "@/store/modules/worktab";
 
   const casProps = { multiple: true }
 
@@ -128,7 +129,7 @@
   const selectList = ref<Api.Common.SelectVlaueRelationInfo[]>([])
   const users = ref<Api.Common.SelectInfo[]>([])
   const getSelectList = async () => {
-    await commonApi.selectList(['school_canteen', 'user']).then(res => {
+    await commonApi.selectList(['school_canteen', 'user'], {company_id:id}).then(res => {
       let list = res.school_canteen.map(item => ({
         value: item.id,
         label: item.name,
@@ -138,7 +139,6 @@
         }))
       }))
       selectList.value = list.filter(item => item.children?.length)
-      console.log(`%c selectList.value == `, 'background:#41b883 ; padding:1px; color:#fff', selectList.value);
       users.value = res.user || []
     })
   }
@@ -160,6 +160,7 @@
     })
       .then(() => {
         router.push({ path: RoutesAlias.CompanyList })
+        useWorktabStore().removeTab(route.path)
       })
       .catch(() => {
         // ... do nothing

+ 0 - 0
web/src/views/company/follow/info.vue


Некоторые файлы не были показаны из-за большого количества измененных файлов