Browse Source

项目初始化

linwu 2 years ago
commit
1748f2ed0e
100 changed files with 7817 additions and 0 deletions
  1. 10 0
      .idea/card.vip366.cc.iml
  2. 4 0
      .idea/encodings.xml
  3. 6 0
      .idea/misc.xml
  4. 8 0
      .idea/modules.xml
  5. 4 0
      .idea/php.xml
  6. 6 0
      .idea/vcs.xml
  7. 480 0
      .idea/workspace.xml
  8. BIN
      application/admin/.DS_Store
  9. 144 0
      application/admin/controller/Admin.php
  10. 188 0
      application/admin/controller/Article.php
  11. 117 0
      application/admin/controller/Card.php
  12. 106 0
      application/admin/controller/Config.php
  13. 220 0
      application/admin/controller/Coupon.php
  14. 106 0
      application/admin/controller/Customer.php
  15. 21 0
      application/admin/controller/File.php
  16. 51 0
      application/admin/controller/Index.php
  17. 52 0
      application/admin/controller/Log.php
  18. 121 0
      application/admin/controller/Login.php
  19. 150 0
      application/admin/controller/Navi.php
  20. 167 0
      application/admin/controller/Role.php
  21. 109 0
      application/admin/controller/Supplier.php
  22. 472 0
      application/admin/controller/User.php
  23. 133 0
      application/admin/controller/article/Type.php
  24. 136 0
      application/admin/controller/card/Number.php
  25. 286 0
      application/admin/controller/coupon/Code.php
  26. 175 0
      application/admin/controller/customer/Order.php
  27. 133 0
      application/admin/controller/goods/Type.php
  28. 66 0
      application/admin/view/admin/changepwd.html
  29. 91 0
      application/admin/view/article/add.html
  30. 94 0
      application/admin/view/article/edit.html
  31. 59 0
      application/admin/view/article/index.html
  32. 49 0
      application/admin/view/article/type/add.html
  33. 53 0
      application/admin/view/article/type/edit.html
  34. 52 0
      application/admin/view/article/type/index.html
  35. 33 0
      application/admin/view/card/index.html
  36. 67 0
      application/admin/view/card/number/index.html
  37. 81 0
      application/admin/view/config/app.html
  38. 41 0
      application/admin/view/config/express.html
  39. 41 0
      application/admin/view/config/invite.html
  40. 143 0
      application/admin/view/config/order.html
  41. 35 0
      application/admin/view/config/other.html
  42. 116 0
      application/admin/view/config/recharge.html
  43. 41 0
      application/admin/view/config/signin.html
  44. 101 0
      application/admin/view/config/site.html
  45. 56 0
      application/admin/view/config/sms.html
  46. 60 0
      application/admin/view/config/withdraw.html
  47. 87 0
      application/admin/view/coupon/add.html
  48. 85 0
      application/admin/view/coupon/code/add.html
  49. 86 0
      application/admin/view/coupon/code/edit.html
  50. 50 0
      application/admin/view/coupon/code/index.html
  51. 88 0
      application/admin/view/coupon/edit.html
  52. 46 0
      application/admin/view/coupon/index.html
  53. 57 0
      application/admin/view/customer/add.html
  54. 58 0
      application/admin/view/customer/edit.html
  55. 34 0
      application/admin/view/customer/index.html
  56. 138 0
      application/admin/view/customer/order/add.html
  57. 41 0
      application/admin/view/customer/order/index.html
  58. 49 0
      application/admin/view/goods/type/add.html
  59. 53 0
      application/admin/view/goods/type/edit.html
  60. 52 0
      application/admin/view/goods/type/index.html
  61. 56 0
      application/admin/view/index/console.html
  62. 136 0
      application/admin/view/index/index.html
  63. 26 0
      application/admin/view/log/index.html
  64. 24 0
      application/admin/view/log/params.html
  65. 84 0
      application/admin/view/login/forget.html
  66. 91 0
      application/admin/view/login/index.html
  67. 104 0
      application/admin/view/navi/add.html
  68. 97 0
      application/admin/view/navi/edit.html
  69. 66 0
      application/admin/view/navi/index.html
  70. 19 0
      application/admin/view/public/base.html
  71. 1 0
      application/admin/view/public/body.html
  72. 5 0
      application/admin/view/public/footer.html
  73. 17 0
      application/admin/view/public/head.html
  74. 1 0
      application/admin/view/public/header.html
  75. 11 0
      application/admin/view/public/var.html
  76. 55 0
      application/admin/view/role/add.html
  77. 43 0
      application/admin/view/role/auth.html
  78. 55 0
      application/admin/view/role/edit.html
  79. 38 0
      application/admin/view/role/index.html
  80. 57 0
      application/admin/view/supplier/add.html
  81. 58 0
      application/admin/view/supplier/edit.html
  82. 42 0
      application/admin/view/supplier/index.html
  83. 62 0
      application/admin/view/user/add.html
  84. 58 0
      application/admin/view/user/edit.html
  85. 103 0
      application/admin/view/user/index.html
  86. 45 0
      application/api/controller/Api.php
  87. 83 0
      application/api/controller/card/Number.php
  88. 57 0
      application/api/controller/card/number/Bill.php
  89. 95 0
      application/api/controller/coupon/Code.php
  90. 63 0
      application/api/controller/goods/Type.php
  91. 12 0
      application/command.php
  92. 404 0
      application/common.php
  93. BIN
      application/common/.DS_Store
  94. 19 0
      application/common/model/Advert.php
  95. 12 0
      application/common/model/AdvertPos.php
  96. 44 0
      application/common/model/Article.php
  97. 10 0
      application/common/model/Card.php
  98. 14 0
      application/common/model/Config.php
  99. 35 0
      application/common/model/Coupon.php
  100. 7 0
      application/common/model/Customer.php

+ 10 - 0
.idea/card.vip366.cc.iml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/thinkphp/library/think" isTestSource="false" packagePrefix="think\" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 4 - 0
.idea/encodings.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" addBOMForNewFiles="with NO BOM" />
+</project>

+ 6 - 0
.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/card.vip366.cc.iml" filepath="$PROJECT_DIR$/.idea/card.vip366.cc.iml" />
+    </modules>
+  </component>
+</project>

+ 4 - 0
.idea/php.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="PhpProjectSharedConfiguration" php_language_level="5.4.0" />
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 480 - 0
.idea/workspace.xml

@@ -0,0 +1,480 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="d6ac5846-52cb-4c4d-aaf9-1bde4b859996" name="Default Changelist" comment="" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="ComposerSettings" doNotAsk="true" synchronizationState="SYNCHRONIZE">
+    <pharConfigPath>$PROJECT_DIR$/thinkphp/composer.json</pharConfigPath>
+  </component>
+  <component name="FileEditorManager">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+      <file pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/application/admin/controller/coupon/Code.php">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="540">
+              <caret line="34" column="33" lean-forward="true" selection-start-line="34" selection-start-column="33" selection-end-line="34" selection-end-column="33" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>card.vip366.cc</find>
+      <find>h5.vip366.cc</find>
+      <find>$type</find>
+      <find>neq</find>
+      <find>$member_id</find>
+      <find>$card_number</find>
+      <find>$goods_type</find>
+      <find>verify</find>
+      <find>layui-btn</find>
+      <find>layui-btn-fluid</find>
+      <find>layui-btn-normal</find>
+      <find>LAY-login-submit</find>
+      <find>LAYTABLE_EXPORT</find>
+      <find>layui-add-store-type</find>
+      <find>store-type</find>
+      <find>券码不足</find>
+    </findStrings>
+    <dirStrings>
+      <dir>D:\wamp64\www\point_mall_card</dir>
+    </dirStrings>
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/public/.htaccess" />
+        <option value="$PROJECT_DIR$/public/index.php" />
+        <option value="$PROJECT_DIR$/application/admin/controller/Coupon.php" />
+        <option value="$PROJECT_DIR$/application/database.php" />
+        <option value="$PROJECT_DIR$/application/admin/controller/Login.php" />
+        <option value="$PROJECT_DIR$/application/api/controller/coupon/Code.php" />
+        <option value="$PROJECT_DIR$/application/common/model/mall/Storeclass.php" />
+        <option value="$PROJECT_DIR$/application/common.php" />
+        <option value="$PROJECT_DIR$/application/common/model/card/Number.php" />
+        <option value="$PROJECT_DIR$/application/common/model/customer/Order.php" />
+        <option value="$PROJECT_DIR$/application/api/controller/card/Number.php" />
+        <option value="$PROJECT_DIR$/public/admin/js/modules/card/number.js" />
+        <option value="$PROJECT_DIR$/application/admin/controller/customer/Order.php" />
+        <option value="$PROJECT_DIR$/application/config.php" />
+        <option value="$PROJECT_DIR$/application/admin/controller/card/Number.php" />
+        <option value="$PROJECT_DIR$/application/admin/view/customer/order/add.html" />
+        <option value="$PROJECT_DIR$/public/admin/js/modules/customer/order.js" />
+        <option value="$PROJECT_DIR$/application/admin/controller/coupon/Code.php" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectFrameBounds" extendedState="6">
+    <option name="x" value="-8" />
+    <option name="y" value="-8" />
+    <option name="width" value="1940" />
+    <option name="height" value="1100" />
+  </component>
+  <component name="ProjectView">
+    <navigator proportions="" version="1">
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="Scope" />
+      <pane id="ProjectPane">
+        <subPane>
+          <expand>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+              <item name="application" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+              <item name="application" type="462c0819:PsiDirectoryNode" />
+              <item name="admin" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+              <item name="application" type="462c0819:PsiDirectoryNode" />
+              <item name="admin" type="462c0819:PsiDirectoryNode" />
+              <item name="controller" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+              <item name="application" type="462c0819:PsiDirectoryNode" />
+              <item name="admin" type="462c0819:PsiDirectoryNode" />
+              <item name="controller" type="462c0819:PsiDirectoryNode" />
+              <item name="coupon" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+              <item name="application" type="462c0819:PsiDirectoryNode" />
+              <item name="admin" type="462c0819:PsiDirectoryNode" />
+              <item name="controller" type="462c0819:PsiDirectoryNode" />
+              <item name="customer" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+              <item name="application" type="462c0819:PsiDirectoryNode" />
+              <item name="admin" type="462c0819:PsiDirectoryNode" />
+              <item name="view" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+              <item name="application" type="462c0819:PsiDirectoryNode" />
+              <item name="admin" type="462c0819:PsiDirectoryNode" />
+              <item name="view" type="462c0819:PsiDirectoryNode" />
+              <item name="customer" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="point_mall_card" type="b2602c69:ProjectViewProjectNode" />
+              <item name="point_mall_card" type="462c0819:PsiDirectoryNode" />
+              <item name="application" type="462c0819:PsiDirectoryNode" />
+              <item name="admin" type="462c0819:PsiDirectoryNode" />
+              <item name="view" type="462c0819:PsiDirectoryNode" />
+              <item name="customer" type="462c0819:PsiDirectoryNode" />
+              <item name="order" type="462c0819:PsiDirectoryNode" />
+            </path>
+          </expand>
+          <select />
+        </subPane>
+      </pane>
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/../odd_job" />
+    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
+    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\wamp64\www\point_mall_card\application\common\model\mall" />
+      <recent name="D:\wamp64\www\TU\card.vip366.cc\public" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="d6ac5846-52cb-4c4d-aaf9-1bde4b859996" name="Default Changelist" comment="" />
+      <created>1639454198678</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1639454198678</updated>
+      <workItem from="1639454199814" duration="1916000" />
+      <workItem from="1639468816400" duration="625000" />
+      <workItem from="1639472792466" duration="1211000" />
+      <workItem from="1640657123422" duration="618000" />
+      <workItem from="1640742664960" duration="1035000" />
+      <workItem from="1640847886838" duration="3044000" />
+      <workItem from="1640912935576" duration="639000" />
+      <workItem from="1641284794284" duration="617000" />
+      <workItem from="1641430945584" duration="31000" />
+      <workItem from="1641430986798" duration="642000" />
+      <workItem from="1641774956102" duration="20000" />
+      <workItem from="1644399194747" duration="194000" />
+      <workItem from="1644569026341" duration="889000" />
+      <workItem from="1650090898960" duration="152000" />
+      <workItem from="1650783880022" duration="32000" />
+      <workItem from="1650784010911" duration="2828000" />
+      <workItem from="1650968748558" duration="641000" />
+      <workItem from="1653293714070" duration="1457000" />
+      <workItem from="1656983881601" duration="11580000" />
+      <workItem from="1657068675207" duration="4489000" />
+      <workItem from="1657526416214" duration="2761000" />
+      <workItem from="1662690531537" duration="1496000" />
+      <workItem from="1663055246374" duration="1797000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="38714000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
+    <layout>
+      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.18443497" />
+      <window_info id="Favorites" order="1" side_tool="true" />
+      <window_info anchor="bottom" id="Message" order="0" />
+      <window_info anchor="bottom" id="Find" order="1" />
+      <window_info anchor="bottom" id="Run" order="2" />
+      <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
+      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
+      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="6" />
+      <window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
+      <window_info anchor="bottom" id="Database Changes" order="8" />
+      <window_info anchor="bottom" id="Version Control" order="9" />
+      <window_info anchor="bottom" id="Terminal" order="10" />
+      <window_info anchor="bottom" id="Event Log" order="11" side_tool="true" />
+      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+      <window_info anchor="right" id="Structure" order="3" visible="true" weight="0.15191898" />
+      <window_info anchor="right" id="Database" order="4" />
+    </layout>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/public/.user.ini">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <caret column="59" selection-start-column="59" selection-end-column="59" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/Index.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="525">
+          <caret line="27" column="18" selection-start-line="27" selection-start-column="18" selection-end-line="27" selection-end-column="18" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/runtime/log/202112/30.log">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="629">
+          <caret line="362" column="65" lean-forward="true" selection-start-line="362" selection-start-column="65" selection-end-line="362" selection-end-column="65" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/.htaccess">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="150">
+          <caret line="6" column="47" selection-start-line="6" selection-start-column="47" selection-end-line="6" selection-end-column="47" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/api/controller/goods/Type.php">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/api/controller/Api.php">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/index.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="50">
+          <caret line="12" selection-start-line="12" selection-end-line="12" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/User.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="550">
+          <caret line="22" column="20" selection-start-line="22" selection-start-column="20" selection-end-line="22" selection-end-column="20" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/Coupon.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2550">
+          <caret line="102" column="37" selection-start-line="102" selection-start-column="37" selection-end-line="102" selection-end-column="37" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/api/controller/card/number/Bill.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="550">
+          <caret line="22" column="29" selection-start-line="22" selection-start-column="18" selection-end-line="22" selection-end-column="29" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common/model/goods/Type.php">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common/model/card/number/Bill.php">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common/model/SmsCode.php">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common/model/Config.php">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common/model/Article.php">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/goods/Type.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1000">
+          <caret line="40" column="20" selection-start-line="40" selection-start-column="20" selection-end-line="40" selection-end-column="20" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/database.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-175">
+          <caret line="19" column="30" selection-start-line="19" selection-start-column="30" selection-end-line="19" selection-end-column="30" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common/model/customer/Order.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="725">
+          <caret line="29" column="28" selection-start-line="29" selection-start-column="28" selection-end-line="29" selection-end-column="28" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common/model/card/Number.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="450">
+          <caret line="18" column="51" lean-forward="true" selection-start-line="18" selection-start-column="51" selection-end-line="18" selection-end-column="51" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common/model/mall/Storeclass.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="375">
+          <caret line="23" column="36" selection-start-line="23" selection-start-column="36" selection-end-line="23" selection-end-column="36" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/common.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="8650">
+          <caret line="354" column="46" selection-start-line="354" selection-start-column="46" selection-end-line="354" selection-end-column="46" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/view/customer/order/index.html">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/view/card/number/index.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="658">
+          <caret line="64" column="29" selection-start-line="64" selection-start-column="23" selection-end-line="64" selection-end-column="29" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/admin/js/modules/card/number.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="550">
+          <caret line="25" column="24" selection-start-line="25" selection-start-column="24" selection-end-line="25" selection-end-column="24" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/api/controller/card/Number.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1050">
+          <caret line="42" column="27" selection-start-line="42" selection-start-column="27" selection-end-line="42" selection-end-column="27" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/Admin.php">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/view/login/index.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="575">
+          <caret line="74" column="57" selection-start-line="74" selection-start-column="57" selection-end-line="74" selection-end-column="57" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/admin/js/lib/index.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-150" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/Login.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="440">
+          <caret line="21" column="23" selection-start-line="21" selection-start-column="18" selection-end-line="21" selection-end-column="23" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/view/customer/add.html">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/customer/Order.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1975">
+          <caret line="79" column="20" selection-start-line="79" selection-start-column="20" selection-end-line="79" selection-end-column="20" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/view/customer/order/add.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2250">
+          <caret line="90" column="102" selection-start-line="90" selection-start-column="92" selection-end-line="90" selection-end-column="102" />
+          <folding>
+            <element signature="n#style#0;n#div#1;n#div#5;n#form#0;n#div#0;n#div#0;n#div#0;n#!!top" expanded="true" />
+            <element signature="n#style#0;n#div#1;n#div#6;n#form#0;n#div#0;n#div#0;n#div#0;n#!!top" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/card/Number.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="375">
+          <caret line="15" column="20" selection-start-line="15" selection-start-column="20" selection-end-line="15" selection-end-column="20" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/static/plugins/layui/lay/modules/table.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="33150">
+          <caret line="1326" column="29" selection-start-line="1326" selection-start-column="14" selection-end-line="1326" selection-end-column="29" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/config.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="550">
+          <caret line="30" column="13" selection-start-line="30" selection-start-column="13" selection-end-line="30" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/public/admin/js/modules/customer/order.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="673">
+          <caret line="136" column="22" selection-start-line="136" selection-start-column="22" selection-end-line="136" selection-end-column="22" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/api/controller/coupon/Code.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="748">
+          <caret line="80" column="37" selection-start-line="80" selection-start-column="37" selection-end-line="80" selection-end-column="37" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/application/admin/controller/coupon/Code.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="540">
+          <caret line="34" column="33" lean-forward="true" selection-start-line="34" selection-start-column="33" selection-end-line="34" selection-end-column="33" />
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>

BIN
application/admin/.DS_Store


+ 144 - 0
application/admin/controller/Admin.php

@@ -0,0 +1,144 @@
+<?php
+namespace app\admin\controller;
+use think\Controller;
+
+/**
+*	管理父类
+*/
+class Admin extends Controller{
+	
+	protected $user = null;
+	protected function _initialize(){
+		$site = cnf('site');
+		$this->assign('site',$site);
+
+		$this->init();
+	}
+
+	public function init(){
+		if (!$this->user = is_login('admin')) {
+			$isAjax = $this->request->isAjax();
+			if($isAjax){
+				return json(['data'=>null,'code'=>1001,'msg'=>'登录超时,请重新登录']);
+			}else{
+	            $login_url = url("Login/index");
+	            $result =  redirect($login_url);
+	            $result->send();exit();
+			}
+        }
+        $this->assign('user',$this->user);
+        oplog('admin',$this->user['id']);
+	}
+
+	public function output($code,$msg,$data = [],$count = 0){
+	    try {
+	      // 返回JSON数据格式到客户端 包含状态信息
+	      $count = $count == 0?count($data):$count;
+	      $data = json_encode(['code'=>$code,'msg'=>$msg,'data'=>$data,'count'=>$count], JSON_UNESCAPED_UNICODE);
+	      if ($data === false) {
+	        throw new \InvalidArgumentException(json_last_error_msg());
+	      }
+
+	      header('Content-type: application/json');
+	      echo $data;exit();
+	    } catch (\Exception $e) {
+	      if ($e->getPrevious()) {
+	        throw $e->getPrevious();
+	      }
+	      throw $e;
+	    }
+  	}
+
+  	public function changepwd(){
+        if ($this->request->isPost()) {
+            $user_id = $this->user['id'];
+            $User = model('User');
+            $user = $User->where(['id'=>$user_id])->find();
+            if (!$user) {
+            	$this->output(1,'参数错误');
+            }
+            $password = input('post.password');
+            if (!empty($password)) {
+            	$oldpwd = input('post.oldpwd');
+	            $salt = $user['salt'];
+	            if ($user['password'] != md5(md5($oldpwd).$salt) ) {
+	            	$this->output(1,'登录旧密码错误');
+	            }
+	            $user->password = md5(md5($password).$salt);;
+            }
+            $mobile = input('post.mobile');
+            $user['mobile'] = $mobile;
+            $result = $user->save();
+            if (!$result) {
+            	$this->output(1,'修改失败');
+            }
+            $this->user['mobile'] = $mobile;
+	      	session('admin_auth', $this->user);
+
+            $this->output(0,'修改成功');
+        }else{
+        	$this->assign('mobile',$this->user['mobile']);
+            $this->assign('name',$this->user['name']);
+            $this->assign('meta_title','修改密码');
+            return $this->fetch();
+        }
+    }
+
+    public function sendsms(){
+	    $mobile = input('param.mobile');
+	    if (empty($mobile)) {
+	      $this->output(1,'手机不能为空');
+	    }
+
+	    $SmsCode = model('SmsCode');
+	    $code = $SmsCode->where(['mobile'=>$mobile,'state'=>0])->find();
+	    $time = $this->request->time();
+	    $value = rand(1000,9999);
+	    if ($code && $code['expire_time'] > $time) {
+	      $value = $code['value'];
+	      $create_time = strtotime($code['create_time']);
+	      if ($create_time + 60 >= $time) {
+	        $this->output(1,'请稍后重试');
+	      }
+	    }else{
+	      $SmsCode->value = $value;
+	      $SmsCode->expire_time = $time + 5 * 60;
+	      $SmsCode->mobile = $mobile;
+	      $SmsCode->state = 0;
+	      $SmsCode->save();
+	    }
+
+	    vendor('aliyun.Dysms');
+	    $result = \Dysms::send('帮帮福利网','SMS_224990133',$mobile,['code'=>$value]);
+	    // var_dump($result);exit();
+	    if ($result) {
+	      $this->output(0,'发送成功');
+	    }
+	    $this->output(1,'发送失败');
+	}
+
+	public function checksms($mobile,$output = false){
+	    $smscode = input('param.smscode');
+	    if (empty($smscode)) {
+	      $this->output(1,'验证码不能为空');
+	    }
+
+	    $SmsCode = model('SmsCode');
+	    $code = $SmsCode->where(['mobile'=>$mobile,'state'=>0])->order('id desc')->find();
+	    
+	    $time = $this->request->time();
+	    if (!$code || $code['expire_time'] < $time) {
+	      $this->output(1,'验证码已过期,请重新获取');
+	    }
+
+	    if ($code['value'] != $smscode) {
+	      $this->output(1,'验证码错误');
+	    }
+	    $code->state = 1;
+	    $code->save();
+	    if ($output) {
+	      $this->output(0,'验证码正确');
+	    }
+	    return true;
+  	}
+}

+ 188 - 0
application/admin/controller/Article.php

@@ -0,0 +1,188 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*   文章管理
+*/
+class Article extends Admin{
+    
+    protected $Article = null;
+    protected $ArticleType = null;
+    protected function _initialize(){
+        parent::_initialize();
+        $this->Article = model('Article');
+        $this->ArticleType = model('article.Type');
+    }
+
+    public function index(){
+        $types = $this->ArticleType->where(['pid'=>0])->order('sort asc,id asc')->select();
+        $this->assign('types',$types);
+
+        $this->assign('meta_title','文章列表');
+        return $this->fetch();
+    }
+
+    public function load(){
+        $page = input('get.page');
+        $limit = input('get.limit');
+        $where = [];
+        $type_id = input('get.type_id');
+        if (!empty($type_id)) {
+            $where['type_1'] = $type_id;
+        }
+        $title = input('get.title');
+        if (!empty($title)) {
+            $where['title'] = ['like',"%".$title."%"];
+        }
+        $list = $this->Article->where($where)->order('id desc')->paginate($limit,false,['page'=>$page]);
+        $data = [];
+        foreach ($list as $key => $value) {
+            $data[$key]['id'] = $value['id'];
+            $data[$key]['type1_name'] = $value['type1']['name'];
+            $data[$key]['type_cname'] = $value['type_cname'];
+            $data[$key]['cover'] = $value['cover'];
+            $data[$key]['title'] = $value['title'];
+            $data[$key]['state'] = $value['state'];
+            $data[$key]['recommend'] = $value['recommend'];
+            $data[$key]['update_time'] = $value['update_time'];
+        }
+        return json(['data'=>$data,'count'=>$list->total(), 'code'=>0,'msg'=>'加载成功']);
+    }
+
+    public function add(){
+        if ($this->request->isPost()) {
+            $this->Article->type_1 = input('post.type_1');
+            $this->Article->type_2 = input('post.type_2');
+            $this->Article->type_3 = input('post.type_3');
+            $this->Article->cover = input('post.cover');
+            $this->Article->name = input('post.name');
+            $this->Article->title = input('post.title');
+            $this->Article->keywords = input('post.keywords');
+            $this->Article->image = input('post.image');
+            $this->Article->description = input('post.description');
+            $this->Article->content = input('post.content');
+            $result = $this->Article->save();
+            if ($result) {
+                return json(['data'=>null,'code'=>0,'msg'=>'添加文章成功']);
+            }
+            return json(['data'=>null,'code'=>1,'msg'=>'添加文章失败']);
+        }else{
+            $Role = model('Role');
+            $roles = $Role->where(['pid'=>0,'id'=>['neq',1]])->select();
+            $this->assign('roles',$roles);
+
+            $this->assign('meta_title','添加文章');
+            return $this->fetch();
+        }
+    }
+
+    public function edit(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $article = $this->Article->where(['id'=>$id])->find();
+            if (!$article) {
+                $this->output(1,'参数错误');
+            }
+            $article->type_1 = input('post.type_1');
+            $article->type_2 = input('post.type_2');
+            $article->type_3 = input('post.type_3');
+            $article->cover = input('post.cover');
+            $article->name = input('post.name');
+            $article->title = input('post.title');
+            $article->keywords = input('post.keywords');
+            $article->image = input('post.image');
+            $article->description = input('post.description');
+            $article->content = input('post.content');
+            $result = $article->save();
+            if ($result) {
+                $this->output(0,'编辑文章成功');
+            }
+            $this->output(1,'编辑文章失败');
+        }else{
+            $id = input('get.id');
+            $article = $this->Article->where(['id'=>$id])->find();
+            if (!$article) {
+                $this->error('参数错误');
+            }
+            $this->assign('article',$article);
+            $this->assign('meta_title','添加文章');
+            return $this->fetch();
+        } 
+    }
+
+    public function delete(){
+        $id = input('post.id');
+        $result =  $this->Article->where(['id'=>$id])->delete();
+        if ($result) {
+            return json(['data'=>null,'code'=>0,'msg'=>'删除成功']);
+        }
+        return json(['data'=>null,'code'=>1,'msg'=>'删除失败']);
+    }
+
+    public function state(){
+        $id = input('post.id');
+        $state = input('post.state');
+        $state = $state == 'true'?1:0;
+        $result = $this->Article->where(['id'=>$id])->update(['state' => $state]);
+        if ($result) {
+            return json(['data'=>null,'code'=>0,'msg'=>'改变状态成功']);
+        }
+        return json(['data'=>null,'code'=>1,'msg'=>'改变状态失败']);
+    }
+
+    public function recommend(){
+        $id = input('post.id');
+        $recommend = input('post.recommend');
+        $recommend = $recommend == 'true'?1:0;
+        $result = $this->Article->where(['id'=>$id])->update(['recommend' => $recommend]);
+        if ($result) {
+            return json(['data'=>null,'code'=>0,'msg'=>'改变推荐成功']);
+        }
+        return json(['data'=>null,'code'=>1,'msg'=>'改变推荐失败']);
+    }
+
+    public function loadclassforselect(){
+        $pid = input('post.pid');
+        $list = $this->ArticleClass->where(['pid'=>$pid])->select();
+        $data = [];
+        foreach ($list as $key => $value) {
+            $data[$key]['id'] = $value['id'];
+            $data[$key]['cname'] = $value['cname'];
+        }
+        return json(['data'=>$data,'code'=>0,'msg'=>'加载分类成功']);
+    }
+
+    //文章详情
+    public function detail(){
+        $id = input('post.id');
+        $artcle = $this->Article->where(['id'=>$id])->find();
+        if ($artcle) {
+            //判断是否阅读
+            $this->read($id);
+
+            $data['id'] = $artcle['id'];
+            $data['cname'] = $artcle['cname'];
+            $data['content'] = $artcle['content'];
+            return json(['data'=>$data,'code'=>0,'msg'=>'获取成功']);
+        }else{
+            return json(['data'=>$id,'code'=>1,'msg'=>'参数错误']);
+        }
+    }
+
+    private function read($article_id){
+        $user_id = $this->user['id'];
+
+        $record = $this->ArticleRead->where(['article_id'=>$article_id,'user_id'=>$user_id])->find();
+        if (!$record) {
+            $this->ArticleRead->article_id = $article_id;
+            $this->ArticleRead->user_id = $user_id;
+            $this->ArticleRead->count = 1;
+            $this->ArticleRead->save();
+        }else{
+            $record->count = ['exp','count + 1'];
+            $record->save();
+        }
+    }
+
+    
+}

+ 117 - 0
application/admin/controller/Card.php

@@ -0,0 +1,117 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	发卡
+*/
+class Card extends Admin{
+
+	protected $Card = null;
+	protected function _initialize(){
+		parent::_initialize();
+		$this->Card = model('Card');
+	}
+
+	public function index(){
+		$this->assign('meta_title','卡片发行');
+
+		return $this->fetch();
+	}
+
+	public function load(){
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$where = [];
+		$list = $this->Card->where($where)->order('id desc')->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['year'] = $value['year'];
+			$data[$key]['start'] = $value['start'];
+			$data[$key]['end'] = $value['end'];
+			$data[$key]['num'] = $value['num'];
+			$data[$key]['create_time'] = $value['create_time'];
+		}
+
+		$this->output(0,'获取成功',$data,$list->total());
+	}
+
+	public function add(){
+		if ($this->request->isPost()) {
+			$num = input('post.num');
+			$num = intval($num);
+			if ($num <= 0) {
+				$this->output(1,'数量必须大于0');
+			}
+
+			$start = 1;
+			$last = $this->Card->order('id desc')->find();
+			if ($last) {
+				$CardNumber = model('card.Number');
+				$start += $CardNumber->max('id');
+			}
+
+			$this->Card->startTrans();
+			$this->Card->year = date('Y');
+			$this->Card->num = $num;
+			$this->Card->start = $start;
+			$this->Card->end = $start + $num - 1;
+			$result = $this->Card->save();
+			if (!$result) {
+				$this->Card->rollback();
+				$this->output(1,'保存失败');
+			}
+
+			$prefix = substr($this->Card->year ,-2,2);
+			$data= [];
+			for ($i=0; $i < $num; $i++) { 
+				$guid = md5(guid());
+				$no = preg_replace( '/[^0-9]/i', '', $guid);
+				$data[$i]['no'] = $prefix.substr($no,0,10);
+				$data[$i]['secret'] = substr($guid,8,8);
+				$data[$i]['state'] = 1;
+			}
+			$result = $this->Card->numbers()->saveAll($data);
+			if (!$result) {
+				$this->Card->rollback();
+				$this->output(1,'保存失败');
+			}
+			$this->Card->commit();
+			$this->output(0,'保存成功');
+		}
+	}
+
+	public function delete(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$card = $this->Card->where(['id'=>$id])->find();
+			if (!$card) {
+				$this->output(1,'参数错误');
+			}
+			$this->Card->startTrans();
+			$numbers = $card['numbers'];
+			if (count($numbers) >= 0) {
+				foreach ($numbers as $key => $value) {
+					if ($value['sale_time'] > 0 || $value['bind_time'] > 0) {
+						$this->Card->rollback();
+						$this->output(1,'存在已销售或已绑定卡号');
+					}
+					$result = $value->delete();
+					if (!$result) {
+						$this->Card->rollback();
+						$this->output(1,'删除卡号失败');
+					}
+				}
+			}
+			
+			$result = $card->delete();
+			if (!$result) {
+				$this->Card->rollback();
+				$this->output(1,'删除卡片失败');
+			}
+
+			$this->Card->commit();
+			$this->output(0,'删除成功');
+		}
+	}
+}

+ 106 - 0
application/admin/controller/Config.php

@@ -0,0 +1,106 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	站点管理
+*/
+class Config extends Admin{
+
+
+	protected $Config = null;
+	protected function _initialize(){
+		parent::_initialize();
+		$this->Config = model('Config');
+	}
+
+	public function save(){
+		if ($this->request->isPost()) {
+			$value = input('post.value/a',[]);
+			$key = input('post.key');
+			$result = cnf($key,$value);
+			if ($result) {
+				return json(['data'=>null,'code'=>0,'msg'=>'设置成功']);
+			}
+			return json(['data'=>$_POST,'code'=>1,'msg'=>'设置失败']);
+		}
+	}
+
+	public function site(){
+		$setting = $this->Config->where(['key'=>'site'])->find();
+		$site = $setting->value;
+		$this->assign('site',$site);
+		$this->assign('meta_title','站点设置');
+		return $this->fetch();
+
+	}
+
+	public function withdraw(){
+		$withdraw = cnf('withdraw');
+		$this->assign('withdraw',$withdraw);
+		$this->assign('meta_title','提现配置');
+		return $this->fetch();
+	}
+	
+	public function recharge(){
+		$recharge = cnf('recharge');
+		$this->assign('recharge',$recharge);
+		$this->assign('meta_title','充值配置');
+		return $this->fetch();
+	}
+	
+	public function sms(){
+		$sms = cnf('sms');
+		$this->assign('sms',$sms);
+		$this->assign('meta_title','短信配置');
+		return $this->fetch();
+	}
+
+	public function invite(){
+		$invite = cnf('invite');
+		$this->assign('invite',$invite);
+		$this->assign('meta_title','邀请配置');
+		return $this->fetch();
+	}
+
+	public function order(){
+		$order = cnf('order');
+		$this->assign('order',$order);
+		$this->assign('meta_title','订单配置');
+		return $this->fetch();
+	}
+
+	public function express(){
+		$express = cnf('express');
+		$this->assign('express',$express);
+		$this->assign('meta_title','快递配置');
+		return $this->fetch();
+	}
+
+	public function app(){
+		$app = cnf('app');
+		$this->assign('app',$app);
+		$this->assign('meta_title','APP配置');
+		return $this->fetch();
+	}
+
+	public function signin(){
+		$signin = cnf('signin');
+		$this->assign('signin',$signin);
+		$this->assign('meta_title','签到配置');
+		return $this->fetch();
+	}
+
+	public function other(){
+		$other = cnf('other');
+		$this->assign('other',$other);
+		$this->assign('meta_title','其他配置');
+		return $this->fetch();
+	}
+
+	
+}
+
+
+
+
+

+ 220 - 0
application/admin/controller/Coupon.php

@@ -0,0 +1,220 @@
+<?php
+
+namespace app\admin\controller;
+
+/**
+ *    券
+ */
+class Coupon extends Admin
+{
+
+    protected $Coupon = null;
+
+    public function init()
+    {
+        parent::init();
+        $this->Coupon = model('Coupon');
+    }
+
+    public function index()
+    {
+        $this->assign('meta_title', '电子券管理');
+        return $this->fetch();
+    }
+
+    public function load()
+    {
+        $page   = input('get.page');
+        $limit  = input('get.limit');
+        $where  = [];
+        $search = input('get.search');
+        if (!empty($search)) {
+            $where['cname|id'] = ['like', '%' . $search . '%'];
+        }
+
+        $list = $this->Coupon
+            ->where($where)->order('id desc')->paginate($limit, false, ['page' => $page]);
+        $data = [];
+        foreach ($list as $key => $value) {
+            $data[$key]['id']    = $value['id'];
+            $data[$key]['no']    = $value['no'];
+            $data[$key]['cname'] = $value['cname'];
+
+            $type                     = $value['type'];
+            $data[$key]['type_cname'] = $type['cname'];
+
+            $supplier               = $value['supplier'];
+            $data[$key]['supplier'] = $supplier['cname'] . '[' . $supplier['id'] . ']';
+
+            $data[$key]['supply_price'] = $value['supply_price'];
+            $data[$key]['sale_price']   = $value['sale_price'];
+            $data[$key]['total_num']    = $value['total_num'];
+            $data[$key]['sold_num']     = $value['sold_num'];
+            $data[$key]['unsold_num']   = $value['unsold_num'];
+            $data[$key]['sale_time']    = $value['sale_time'];
+            $data[$key]['create_time']  = $value['create_time'];
+            $data[$key]['state']        = $value['state'];
+        }
+        $this->output(0, '获取成功', $data, $list->total());
+    }
+
+    public function add()
+    {
+        if ($this->request->isPost()) {
+            $no = input('post.no');
+            if (empty($no)) {
+                $this->output(1, '编码不能为空');
+            }
+            $no_check = $this->Coupon->where('no', $no)->find();
+            if (!empty($no_check)) {
+                $this->output(1, '该编码已存在');
+            }
+            $cname = input('post.cname');
+            if (empty($cname)) {
+                $this->output(1, '名称不能为空');
+            }
+            $supply_price = input('post.supply_price');
+            $supply_price = floatval($supply_price);
+            if ($supply_price <= 0) {
+                $this->output(1, '请输入供应价');
+            }
+            $sale_price = input('post.sale_price');
+            $sale_price = floatval($sale_price);
+            if ($sale_price <= 0) {
+                $this->output(1, '请输入销售价');
+            }
+            $sale_time = input('post.sale_time');
+            list($sale_start_time, $sale_end_time) = explode('~', $sale_time);
+            if (strtotime($sale_end_time) < $this->request->time()) {
+                $this->output(1, '有效结束时间必须大于当期时间');
+            }
+
+            $this->Coupon->no           = $no;
+            $this->Coupon->cname        = $cname;
+            $this->Coupon->type_id      = input('post.type_id');
+            $this->Coupon->supplier_id  = input('post.supplier_id');
+            $this->Coupon->supply_price = $supply_price;
+            $this->Coupon->sale_price   = $sale_price;
+            $this->Coupon->sale_time    = $sale_time;
+            $result                     = $this->Coupon->save();
+            if (!$result) {
+                $this->output(1, '保存失败');
+            }
+            $this->output(0, '保存成功');
+        } else {
+            $CouponType = model('coupon.Type');
+            $types      = $CouponType->select();
+            $this->assign('types', $types);
+
+            $Supplier  = model('Supplier');
+            $suppliers = $Supplier->select();
+            $this->assign('suppliers', $suppliers);
+
+            $this->assign('meta_title', '添加券');
+            return $this->fetch();
+        }
+    }
+
+    public function edit()
+    {
+        if ($this->request->isPost()) {
+            $id     = input('post.id');
+            $coupon = $this->Coupon->where(['id' => $id])->find();
+            if (!$coupon) {
+                $this->error('参数错误');
+            }
+            $no = input('post.no');
+            if (empty($no)) {
+                $this->output(1, '编码不能为空');
+            }
+            $no_check = $this->Coupon->where('no', $no)->where('id', 'neq', $id)->find();
+            if (!empty($no_check)) {
+                $this->output(1, '该编码已存在');
+            }
+            $cname = input('post.cname');
+            if (empty($cname)) {
+                $this->output(1, '名称不能为空');
+            }
+            $supply_price = input('post.supply_price');
+            $supply_price = floatval($supply_price);
+            if ($supply_price <= 0) {
+                $this->output(1, '请输入供应价');
+            }
+            $sale_price = input('post.sale_price');
+            $sale_price = floatval($sale_price);
+            if ($sale_price <= 0) {
+                $this->output(1, '请输入销售价');
+            }
+            $sale_time = input('post.sale_time');
+            list($sale_start_time, $sale_end_time) = explode('~', $sale_time);
+            if (strtotime($sale_end_time) < $this->request->time()) {
+                $this->output(1, '有效结束时间必须大于当期时间');
+            }
+
+            $coupon->no           = $no;
+            $coupon->cname        = $cname;
+            $coupon->type_id      = input('post.type_id');
+            $coupon->supplier_id  = input('post.supplier_id');
+            $coupon->supply_price = $supply_price;
+            $coupon->sale_price   = $sale_price;
+            $coupon->sale_time    = $sale_time;
+            $result               = $coupon->save();
+            if (!$result) {
+                $this->output(1, '保存失败');
+            }
+            $this->output(0, '保存成功');
+        } else {
+            $id     = input('get.id');
+            $coupon = $this->Coupon->where(['id' => $id])->find();
+            if (!$coupon) {
+                $this->error('参数错误');
+            }
+            $this->assign('coupon', $coupon);
+
+            $CouponType = model('coupon.Type');
+            $types      = $CouponType->select();
+            $this->assign('types', $types);
+
+            $Supplier  = model('Supplier');
+            $suppliers = $Supplier->select();
+            $this->assign('suppliers', $suppliers);
+
+            $this->assign('meta_title', '添加券');
+            return $this->fetch();
+        }
+    }
+
+    public function delete()
+    {
+        if ($this->request->isPost()) {
+            $id     = input('post.id');
+            $coupon = $this->Coupon->where(['id' => $id])->find();
+            if (!$coupon) {
+                $this->output(1, '参数错误');
+            }
+            $result = $coupon->delete();
+            if (!$result) {
+                $this->output(1, '删除卡片失败');
+            }
+            $this->output(0, '删除成功');
+        }
+    }
+
+    public function state()
+    {
+        if ($this->request->isPost()) {
+            $id     = input('post.id');
+            $coupon = $this->Coupon->where(['id' => $id])->find();
+            if (!$coupon) {
+                $this->output(1, '参数错误');
+            }
+            $state         = input('post.state');
+            $coupon->state = $state == 'true' ? 1 : 0;
+            $result        = $coupon->save();
+            if (!$result) {
+                $this->output(1, '保存失败');
+            }
+            $this->output(0, '保存成功');
+        }
+    }
+}

+ 106 - 0
application/admin/controller/Customer.php

@@ -0,0 +1,106 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	管理用户
+*/
+class Customer extends Admin{
+
+    protected $Customer = null;
+    protected function _initialize(){
+        parent::_initialize();
+        $this->Customer = model('Customer');
+    }
+
+    public function index(){
+    	$this->assign('meta_title','客户列表');
+    	return $this->fetch();
+    }
+
+    public function load(){
+    	$where = [];
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$list = $this->Customer->where($where)->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['cname'] = $value['cname'];
+			$data[$key]['truename'] = $value['truename'];
+			$data[$key]['mobile'] = $value['mobile'];
+			$data[$key]['address'] = $value['address'];
+			$data[$key]['state'] = $value['state'];
+			$data[$key]['create_time'] = $value['create_time'];
+		}
+		$this->output(0,'获取成功',$data,$list->total());
+    }
+
+    public function add(){
+		if ($this->request->isPost()) {
+			$cname = input('post.cname');
+			if (empty($cname)) {
+				$this->output(1,'名称不能为空');
+			}
+			$this->Customer->cname = $cname;
+			$this->Customer->truename = input('post.truename');
+			$this->Customer->mobile = input('post.mobile');
+			$this->Customer->address = input('post.address');
+			$result = $this->Customer->save();
+			if (!$result) {
+				$this->output(1,'保存失败');
+			}
+			$this->output(0,'保存成功');
+		}else{
+			$this->assign('meta_title','添加客户');
+			return $this->fetch();
+		}
+	}
+
+    public function edit(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$customer = $this->Customer->where(['id'=>$id])->find();
+			if (!$customer) {
+				$this->output(1,'参数错误');
+			}
+			$cname = input('post.cname');
+			if (empty($cname)) {
+				$this->output(1,'名称不能为空');
+			}
+			$customer->cname = $cname;
+			$customer->truename = input('post.truename');
+			$customer->mobile = input('post.mobile');
+			$customer->address = input('post.address');
+			$result = $customer->save();
+			if (!$result) {
+				$this->output(1,'保存失败');
+			}
+			$this->output(0,'保存成功');
+		}else{
+			$id = input('get.id');
+			$customer = $this->Customer->where(['id'=>$id])->find();
+			if (!$customer) {
+				$this->error('参数错误');
+			}
+			$this->assign('customer',$customer);
+			$this->assign('meta_title','添加客户');
+			return $this->fetch();
+		}
+	}
+
+	public function delete(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$customer = $this->Customer->where(['id'=>$id])->find();
+			if (!$customer) {
+				$this->output(1,'参数错误');
+			}
+			$result = $customer->delete();
+			if (!$result) {
+				$this->output(1,'删除失败');
+			}
+			$this->output(0,'删除成功');
+		}
+	}
+
+}

+ 21 - 0
application/admin/controller/File.php

@@ -0,0 +1,21 @@
+<?php
+namespace app\admin\controller;
+use think\Controller;
+
+class File extends Controller{
+
+    public function upload(){
+        // 获取表单上传文件 例如上传了001.jpg
+        $file = $this->request->file('file');
+        // 移动到框架应用根目录/public/uploads/ 目录下
+        $file = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
+        if($file){
+            $name = $file->getInfo('name');
+            $src =  DS . 'uploads' .DS .$file->getSaveName();
+            return json(['code'=>0,'msg'=>'上传成功','data'=>['name'=>$name,'src'=>$src]]);
+            // 成功上传后 获取上传信息
+        }else{
+            return json(['data'=>'','code'=>0,'msg'=>$file->getError()]);
+        }
+    }
+}

+ 51 - 0
application/admin/controller/Index.php

@@ -0,0 +1,51 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	管理首页
+*/
+class Index extends Admin{
+	
+	//首页
+	public function index(){
+		$ids = [];
+		$role_id = $this->user['role']['id'];
+		if ($role_id != 1) {
+			$ids = explode(',',  $this->user['role']['navis']);
+		};
+
+		$Navi = model('Navi');
+		$navis = $Navi->navis(0,$this->request->module(),$ids);
+		$this->assign("navis",$navis);
+
+		$this->assign("user",$this->user);
+		$this->assign("meta_title",'管理后台');
+		return $this->fetch();
+	}
+
+
+	//控制台
+	public function console(){
+		$user_id = $this->user['id'];
+		$User = model('User');
+		$user = $User->where(['id'=>$user_id])->find();
+		$this->assign('user',$user);
+
+		$this->assign('meta_title','控制台');
+		return $this->fetch();
+	}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 52 - 0
application/admin/controller/Log.php

@@ -0,0 +1,52 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	日志
+*/
+class Log extends Admin{
+
+	protected $Log = null;
+	protected function _initialize(){
+		parent::_initialize();
+		$this->Log = model('Log');
+	}
+
+	public function index(){
+		$this->assign('meta_title','日志列表');
+		return $this->fetch();
+	}
+
+	public function load(){
+		$where = [];
+		$position = input('param.position');
+		$where['position'] = $position;
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$list = $this->Log->where($where)->order('create_time desc')->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+
+			$user = $value['user'];
+			$data[$key]['user'] = $user['name'].'['.$user['id'].']';
+
+			$data[$key]['action'] = $value['action'];
+			$data[$key]['action_text'] = $value['action_text'];
+			$data[$key]['create_time'] = $value['create_time'];
+		}
+		$this->output(0,'加载成功',$data,$list->total());
+	}
+
+	//
+	public function params(){
+		$id = input('get.id');
+		$log = $this->Log->where(['id'=>$id])->find();
+		if (!$log) {
+			$this->error('参数错误');
+		}
+		$this->assign('log',$log);
+		$this->assign('meta_title','查看参数');
+		return $this->fetch();
+	}
+}

+ 121 - 0
application/admin/controller/Login.php

@@ -0,0 +1,121 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	登录
+*/
+class Login extends Admin{
+
+  protected $User = null; 
+  protected $Role = null;
+  public function init(){
+    $this->User = model('User');
+    $this->Role = model('Role');
+  }
+
+  public function index(){
+    if($user = is_login('admin')){
+      session('admin_auth', null);
+    } 
+
+    $this->assign('meta_title','管理员登录');
+    return $this->fetch();
+  } 
+
+  public function check(){
+    if ($this->request->isPost()) {
+      if (config('captcha.on')) {
+        $vercode = input('post.vercode');
+        if(!captcha_check($vercode)){
+          return json(['data'=>$vercode,'code'=>1,'msg'=>'验证码错误']);
+        };
+      }
+
+      $adminrole = $this->Role->where(['name'=>'admin','state'=>1])->find();
+      if (!$adminrole) {
+        return json(['data'=>null,'code'=>1,'msg'=>'缺少管理员角色']);
+      }
+
+      $user_name = input('post.username');
+      $user_password = input('post.password');
+      $where = "u.name = '".$user_name."' and u.state = 1 and (r.pid = ".$adminrole['id']." or r.id = ".$adminrole['id'].")";
+      $user = $this->User->field('u.id,u.name,u.password,u.state,u.role_id,u.salt,u.mobile')
+              ->alias('u')
+              ->join('Role r','r.id = u.role_id')
+              ->where($where)->find();
+      if(!$user || 1 != $user['state']) {
+        output(1,'用户不存在或已被禁用');
+      }
+      $salt = $user['salt'];
+      $user_password = md5(md5($user_password).$salt);
+      if($user['password'] !== $user_password){
+        output(1,'密码错误');
+      }
+      if($this->updateInfo($user)){
+        $jump_url = url('admin/index/index');
+        return json(['data'=>['jump_url'=>$jump_url],'code'=>0,'msg'=>'登录成功']);
+      }else{
+        return json(['data'=>'','code'=>1,'msg'=>'登录失败']);
+      }
+    }
+  }
+
+    //更新用户登录信息
+  private function updateInfo($user){
+    /* 更新登录信息 */
+    $data = array(
+      'id'              => $user['id'],
+      'login_times'     => ['inc', 1],
+      'last_login_time' => $this->request->time(),
+      'last_login_ip'   => $this->request->ip(),
+    );
+
+    if($this->User->update($data)){
+      $auth['id'] = $user['id'];
+      $auth['name'] = $user['name'];
+      $auth['mobile'] = $user['mobile'];
+      $auth['role'] = $user['role']->toArray();
+      session('admin_auth', $auth);
+      return true;
+    }else{
+      return false;
+    }
+  }
+
+  public function forget(){
+    if($this->request->isPost()){
+      $username = input('post.username');
+      if (empty($username)) {
+        $this->output(1,'请输入用户名');
+      }
+      $user = $this->User->where(['name'=>$username])->find();
+      if(!$user){
+        $this->output(1,'用户名错误');
+      }
+      $mobile = input('post.mobile');
+      if (empty($mobile)) {
+        $this->output(1,'手机号码不能为空');
+      }
+      if($mobile != $user['mobile']){
+        $this->output(1,'手机号错误');
+      }
+      $password = input('post.password');
+      if (empty($password)) {
+        $this->output(1,'请输入新的密码');
+      }
+      $this->checksms($mobile);
+      $salt = $user['salt'];
+      $user->password = md5(md5($password).$salt);
+      $user->update_time = $this->request->time();
+      $result = $user->save();
+      if (!$result) {
+        $this->output(1,'保存失败');
+      }
+      $jump_url = url('login/index');
+      $this->output(0,'保存成功',['jump_url'=>$jump_url]);
+    }else{
+      $this->assign('meta_title','重置密码');
+      return $this->fetch();
+    }
+  }
+}

+ 150 - 0
application/admin/controller/Navi.php

@@ -0,0 +1,150 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	导航管理
+*/
+class Navi extends Admin{
+
+	protected $Navi = null;
+    protected function _initialize(){
+        parent::_initialize();
+        $this->Navi = model('Navi');
+    }
+
+	//导航列表
+	public function index(){
+		$pid = input('get.pid',0);
+		$pnavi = $this->Navi->where(['id'=>$pid])->find();
+		if ($pnavi) {
+			$position = $pnavi['position'];
+		}else{
+			$position = input('param.position','admin');
+		}
+		$this->assign('pnavi',$pnavi);
+		$this->assign('position',$position);
+
+		$this->assign('meta_title','导航列表');
+		return $this->fetch();
+	}
+
+	public function load(){
+		$role = $this->user['role'];
+		$Navi = model('Navi');
+		$level = input('get.level',3);
+		$pid = input('get.pid',0);
+		$pnavi = $this->Navi->get($pid);
+		if ($pnavi) {
+			$position = $pnavi['position'];
+		}else{
+			$position = input('get.position');
+		}
+		$list = $Navi->navis($pid,$position,[],$level);
+		return json(['data'=>$list,'code'=>0,'msg'=>'加载成功']);
+	}
+
+	//排序
+	public function sort(){
+		$id = input('post.id');
+		$navi = $this->Navi->get($id);
+		if ($navi) {
+			$sort = input('post.sort');
+			$navi->sort = $sort;
+			$result = $navi->save();
+			if ($result) {
+				return json(['data'=>null,'code'=>0,'msg'=>'排序成功']);
+			}
+		}	
+		return json(['data'=>$_POST,'code'=>1,'msg'=>'参数错误']);
+	}
+
+	public function add(){
+		if ($this->request->isPost()) {
+			$this->Navi->pid = input('post.pid');
+			$this->Navi->position = input('post.position');
+			$this->Navi->name = input('post.name');
+			$this->Navi->cname = input('post.cname');
+			$this->Navi->icon = input('post.icon');
+			$this->Navi->image = input('post.image');
+			$this->Navi->action = input('post.action');
+			$this->Navi->target = input('post.target');
+			$this->Navi->type = input('post.type');
+			$result = $this->Navi->save();
+			if ($result) {
+				return json(['data'=>$this->Navi->id,'code'=>0,'msg'=>'添加导航成功']);
+			}
+			return json(['data'=>$_POST,'code'=>1,'msg'=>'添加导航失败']);
+		}else{
+			$pid = input('param.pid');
+			$pnavi = $this->Navi->get($pid);
+			$this->assign('pnavi',$pnavi);
+
+			$position = input('param.position');
+			$this->assign('position',$position);
+
+			$this->assign('meta_title','添加菜单');
+			return $this->fetch();
+		}
+	}
+
+	public function edit(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$navi = $this->Navi->where(['id'=>$id])->find();
+			if ($navi) {
+				$navi->name = input('post.name');
+				$navi->cname = input('post.cname');
+				$navi->icon = input('post.icon');
+				$navi->image = input('post.image');
+				$navi->action = input('post.action');
+				$navi->target = input('post.target');
+				$navi->type = input('post.type');
+				$result = $navi->save();
+				if ($result) {
+					return json(['data'=>null,'code'=>0,'msg'=>'编辑导航成功']);
+				}
+				return json(['data'=>$_POST,'code'=>1,'msg'=>'编辑导航失败']);
+			}
+			return json(['data'=>$_POST,'code'=>1,'msg'=>'参数错误']);
+		}else{
+			$id = input('param.id');
+			$navi = $this->Navi->where(['id'=>$id])->find();
+			if (!$navi) {
+				$this->error('参数错误');
+			}
+			$this->assign('navi',$navi);
+			$this->assign('meta_title','删除菜单');
+			return $this->fetch();
+		}
+	}
+
+	public function delete(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$navi = $this->Navi->where(['id'=>$id])->find();
+			if (!$navi) {
+				return json(['data'=>null,'code'=>1,'msg'=>'参数错误']);
+			}
+			$result = $navi->delete();
+			if ($result) {
+				return json(['data'=>null,'code'=>0,'msg'=>'删除成功']);
+			}
+			return json(['data'=>null,'code'=>1,'msg'=>'删除失败']);
+		}
+	}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 167 - 0
application/admin/controller/Role.php

@@ -0,0 +1,167 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	角色管理
+*/
+class Role extends Admin{
+
+	private $Role = null;
+	protected function _initialize(){
+		parent::_initialize();
+		$this->Role = model('Role');
+	}
+
+	public function index(){
+		$role = $this->user['role'];
+		$this->assign('role',$role);
+		$this->assign('meta_title','角色列表');
+		return $this->fetch();
+	}
+
+	public function load(){
+		$where = [];
+		$role = $this->user['role'];
+		$where['pid'] = 1;
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$list = $this->Role->where($where)->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['name'] = $value['name'];
+			$data[$key]['cname'] = $value['cname'];
+			$data[$key]['description'] = $value['description'];
+		}
+		return json(['data'=>$data,'count'=>$list->total(), 'code'=>0,'msg'=>'加载成功']);
+	}
+
+	public function add(){
+		if ($this->request->isPost()) {
+			$role = $this->user['role'];
+			$this->Role->pid = $role['id'];
+			$this->Role->name = input('post.name');
+			$this->Role->cname = input('post.cname');
+			$this->Role->description = input('post.description');
+			$result = $this->Role->save();
+			if ($result) {
+				return json(['data'=>$this->Role->id,'code'=>0,'msg'=>'添加角色成功']);
+			}
+			return json(['data'=>$_POST,'code'=>1,'msg'=>'添加角色失败']);
+		}else{
+			$this->assign('meta_title','添加角色');
+			return $this->fetch();
+		}
+	}
+
+	public function edit(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$role = $this->Role->get($id);
+			if ($role) {
+				$role->name = input('post.name');
+				$role->cname = input('post.cname');
+				$role->description = input('post.description');
+				$result = $role->save();
+				if ($result) {
+					return json(['data'=>null,'code'=>0,'msg'=>'编辑角色成功']);
+				}
+				return json(['data'=>$_POST,'code'=>1,'msg'=>'编辑角色失败']);
+			}else{
+				return json(['data'=>$_POST,'code'=>1,'msg'=>'参数错误']);
+			}
+		}else{
+			$id = input('param.id');
+			$role = $this->Role->where(['id'=>$id])->find();
+			$this->assign('role',$role);
+
+			$this->assign('meta_title','编辑角色');
+			return $this->fetch();
+		}
+	}
+
+	public function delete(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$role = $this->Role->where(['id'=>$id])->find();
+			if (!$role) {
+				return json(['data'=>$_POST,'code'=>1,'msg'=>'参数错误']);
+			}
+			$result = $role->delete();
+			if ($result) {
+				return json(['data'=>null,'code'=>0,'msg'=>'删除成功']);
+			}
+			return json(['data'=>null,'code'=>1,'msg'=>'删除失败']);
+		}
+	}
+
+	public function loadnavis(){
+		$role_id = input('get.role_id');
+		$role = $this->Role->where(['id'=>$role_id])->find();
+		if (!$role) {
+			$this->error('参数错误');
+		}
+		$navis = $role['navis'];
+		$navis_arr = [];
+		if (!empty($navis)) {
+			$navis_arr = explode(',', $navis);
+		}
+		$Navi = model('Navi');
+		$pid = input('get.pid',0);
+		$level = input('get.level',3);
+
+		
+		$list = model('Navi')->tree($pid,$this->user['role']['name'],[],$level);
+		foreach ($list as $key => $value) {
+			if (in_array($value['id'], $navis_arr)) {
+				$list[$key]['checked'] = true;
+			}
+		}
+		return json(['data'=>$list,'code'=>0,'msg'=>'加载成功']);
+	}
+
+	public function auth(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$role = $this->Role->where(['id'=>$id])->find();
+			if (!$role) {
+				return json(['data'=>$_POST,'code'=>1,'msg'=>'参数错误']);
+			}
+
+			$navis = input('navis/a',[]);
+			$ids = [];
+			$func = function($arr) use(&$func,&$ids){
+				foreach ($arr as $key => $value) {
+					$id = $value['id'];
+					array_push($ids, $id);
+					if (isset($value['children'])) {
+						$func($value['children']);
+					}
+				}
+			};
+			$func($navis);
+			$ids_str = implode(',', $ids);
+			$role->navis = $ids_str;
+			$result = $role->save();
+			if ($result) {
+				return json(['data'=>null,'code'=>0,'msg'=>'授权成功']);
+			}
+			return json(['data'=>$ids_str,'code'=>1,'msg'=>'授权失败']);
+		}else{
+			$role = $this->user['role'];
+			$Navi = model('Navi');
+			$navis = $Navi->navis(0,$role['name'],[]);
+			$this->assign('navis',$navis);
+
+			$id = input('param.id');
+			$role = $this->Role->where(['id'=>$id])->find();
+			if (!$role) {
+				$this->error('参数错误');
+			}
+			$this->assign('role',$role);
+
+			$this->assign('meta_title','角色授权');
+			return $this->fetch();
+		}
+	}
+}

+ 109 - 0
application/admin/controller/Supplier.php

@@ -0,0 +1,109 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	供应商
+*/
+class Supplier extends Admin{
+
+	protected $Supplier = null;
+	public function init(){
+		parent::init();
+		$this->Supplier = model('Supplier');
+	}
+
+	public function index(){
+		$this->assign('meta_title','供应商管理');
+		return $this->fetch();
+	}
+
+	public function load(){
+		$where = [];
+		$search = input('get.search');
+		if (!empty($search)) {
+			$where['cname|id'] = ['like','%'.$search.'%'];
+		}
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$list = $this->Supplier->where($where)->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['cname'] = $value['cname'];
+			$data[$key]['truename'] = $value['truename'];
+			$data[$key]['mobile'] = $value['mobile'];
+			$data[$key]['address'] = $value['address'];
+			$data[$key]['state'] = $value['state'];
+			$data[$key]['create_time'] = $value['create_time'];
+		}
+		$this->output(0,'获取成功',$data,$list->total());
+	}
+
+	 public function add(){
+		if ($this->request->isPost()) {
+			$cname = input('post.cname');
+			if (empty($cname)) {
+				$this->output(1,'名称不能为空');
+			}
+			$this->Supplier->cname = $cname;
+			$this->Supplier->truename = input('post.truename');
+			$this->Supplier->mobile = input('post.mobile');
+			$this->Supplier->address = input('post.address');
+			$result = $this->Supplier->save();
+			if (!$result) {
+				$this->output(1,'保存失败');
+			}
+			$this->output(0,'保存成功');
+		}else{
+			$this->assign('meta_title','添加客户');
+			return $this->fetch();
+		}
+	}
+
+    public function edit(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$supplier = $this->Supplier->where(['id'=>$id])->find();
+			if (!$supplier) {
+				$this->output(1,'参数错误');
+			}
+			$cname = input('post.cname');
+			if (empty($cname)) {
+				$this->output(1,'名称不能为空');
+			}
+			$supplier->cname = $cname;
+			$supplier->truename = input('post.truename');
+			$supplier->mobile = input('post.mobile');
+			$supplier->address = input('post.address');
+			$result = $supplier->save();
+			if (!$result) {
+				$this->output(1,'保存失败');
+			}
+			$this->output(0,'保存成功');
+		}else{
+			$id = input('get.id');
+			$supplier = $this->Supplier->where(['id'=>$id])->find();
+			if (!$supplier) {
+				$this->error('参数错误');
+			}
+			$this->assign('supplier',$supplier);
+			$this->assign('meta_title','添加客户');
+			return $this->fetch();
+		}
+	}
+
+	public function delete(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$supplier = $this->Supplier->where(['id'=>$id])->find();
+			if (!$supplier) {
+				$this->output(1,'参数错误');
+			}
+			$result = $supplier->delete();
+			if (!$result) {
+				$this->output(1,'删除失败');
+			}
+			$this->output(0,'删除成功');
+		}
+	}
+}

+ 472 - 0
application/admin/controller/User.php

@@ -0,0 +1,472 @@
+<?php
+namespace app\admin\controller;
+
+/**
+*	管理用户
+*/
+class User extends Admin{
+
+    protected $User = null;
+    protected function _initialize(){
+        parent::_initialize();
+        $this->User = model('User');
+    }
+
+
+
+    public function index(){
+        $this->assign("meta_title","用户列表");
+        return $this->fetch();
+    }
+
+    public function load(){
+        $where = [];
+        $rpid = input('param.rpid');
+        if (!empty($rpid)) {
+            $where['r.pid'] = $rpid;
+        }else{
+            $where['r.name'] = ['eq','user'];
+        }
+        $user = input('param.user');
+        if (!empty($user)) {
+            $where['u.id|u.name'] = $user;
+        }
+        $page = input('get.page');
+        $limit = input('get.limit');
+        $list = $this->User->field('u.*')->alias('u')
+        ->join('Role r','r.id = u.role_id')
+        ->where($where)->order('u.id desc')->paginate($limit,false,['page'=>$page]);
+        $data = [];
+        foreach ($list as $key => $value) {
+            $data[$key]['id'] = $value['id'];
+            $data[$key]['name'] = $value['name'];
+            $data[$key]['state'] = $value['state'];
+        }
+        $this->output(0,'加载成功',$data,$list->total());
+    }
+
+    public function add(){
+        if($this->request->isPost()){
+            $name = input('post.name');
+            $user = $this->User->where(['name'=>$name])->find();
+            if ($user) {
+                return json(['data'=>null,'code'=>1,'msg'=>'用户名已经存在']);
+            }
+
+            $role_id = input('post.role_id');
+            $where['id'] = $role_id;
+            $Role = model('Role');
+            $role = $Role->where($where)->find();
+            if (!$role) {
+                return json(['data'=>null,'code'=>1,'msg'=>'请选择角色']);
+            }
+
+            $password = input('post.password');
+            if (empty($password)) {
+                return json(['data'=>null,'code'=>1,'msg'=>'密码不能为空']);
+            }
+            
+            $this->User->name= $name;
+            $salt = getNonceStr(4);
+            $this->User->password = md5(md5($password).$salt);
+            $this->User->salt = $salt;
+            $this->User->role_id = $role_id;
+            $result = $this->User->save();
+            if (!$result) {
+                output(1,'添加失败');
+            }
+
+            output(0,'添加成功');
+        }else{
+            $rpid = input('get.rpid');
+            if (empty($rpid)) {
+                $where['name'] = 'user';
+            }else{
+                $where['pid'] = $rpid;
+            }
+            $Role = model('Role');
+            $roles = $Role->where($where)->select();
+            $this->assign('roles',$roles);
+            
+            $this->assign('meta_title','添加用户');
+            return $this->fetch();
+        }
+    }
+
+    public function edit(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $name = input('post.name');
+            if (!empty($name)) {
+                $user = $this->User->where(['name'=>$name])->find();
+                if ($user && $user['id'] != $id) {
+                    return json(['data'=>null,'code'=>1,'msg'=>'用户名已经存在']);
+                }
+            }
+
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                return json(['data'=>null,'code'=>1,'msg'=>'参数错误']);
+            }
+
+            $role_id = input('post.role_id');
+            $where['id'] = $role_id;
+            $Role = model('Role');
+            $role = $Role->where($where)->find();
+            if (!$role) {
+                return json(['data'=>null,'code'=>1,'msg'=>'请选择角色']);
+            }
+
+            $password = input('post.password');
+            if (!empty($password)) {
+                $salt = $user['salt'];
+                $user->password = md5(md5($password).$salt);
+            }
+
+            $oppwd = input('post.oppwd');
+            if (!empty($oppwd)) {
+                $user->oppwd = $oppwd;
+            }
+
+            $user->name= $name;
+            $user->role_id = $role_id;
+            $result = $user->save();
+            if ($result) {
+                return json(['data'=>null,'code'=>0,'msg'=>'编辑成功']);
+            }
+            return json(['data'=>null,'code'=>1,'msg'=>'编辑成功']);
+        }else{
+            $id = input('get.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            $this->assign('user',$user);
+
+            $role = $user['role'];
+            if ($role['name'] == 'user') {
+                $where['name'] = ['eq','user']; 
+            }else{
+                $where['name'] = ['not in',['user','admin']]; 
+            }
+            $Role = model('Role');
+            $roles = $Role->where($where)->select();
+            $this->assign('roles',$roles);
+
+            $id = input('get.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            $this->assign('user',$user);
+
+            $this->assign('meta_title','编辑用户');
+            return $this->fetch();
+        }
+    }
+
+    public function center(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                $this->output(1,'参数错误');
+            }
+            $center = input('post.center');
+            $user->center = $center == 'true'?1:0;
+            $result = $user->save();
+            if ($result) {
+                $this->output(0,'编辑成功');
+            }
+            $this->output(1,'编辑失败');
+        }
+    }
+
+    public function active(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                $this->output(1,'参数错误');
+            }
+            $active = input('post.active');
+            $user->active = $active == 'true'?1:0;
+            $result = $user->save();
+            if ($result) {
+                $this->output(0,'编辑成功');
+            }
+            $this->output(1,'编辑失败');
+        }
+    }
+
+    public function state(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                $this->output(1,'参数错误');
+            }
+            $state = input('post.state');
+            $user->state = $state == 'true'?1:0;
+            $result = $user->save();
+            if ($result) {
+                $this->output(0,'编辑成功');
+            }
+            $this->output(1,'编辑失败');
+        }
+    }
+
+    public function level(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                output(1,'参数错误');
+            }
+            $UserLevel = model('user.Level');
+            $level = input('post.level');
+            $data = [];
+            for ($i=0; $i <= $level; $i++) { 
+                $userlevel = $UserLevel->where(['user_id'=>$user['id'],'level'=>$i])->find();
+                if (!$userlevel) {
+                    $data[$i]['user_id'] = $user['id'];
+                    $data[$i]['level'] = $i;
+                }
+            }
+            $UserLevel->where(['user_id'=>$user['id'],'level'=>['gt',$level]])->delete();
+            if (count($data) > 0) {
+                $UserLevel->saveAll($data);
+            }
+            $user->level = $level;
+            $result = $user->save();
+            if ($result) {
+                output(0,'编辑成功',['level_text'=>$user['level_text']]);
+            }
+            output(1,'编辑失败');
+        }
+    }
+
+    public function balance(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                output(1,'参数错误');
+            }
+            $balance = input('post.balance');
+            $balance = floatval($balance);
+            $this->User->startTrans();
+            $user['balance'] += $balance;
+            $result = $user->save();
+            if (!$result) {
+                $this->User->rollback();
+                $this->output(1,'编辑失败');
+            }
+
+            $billdata = [];
+            $i = 0;
+            $billdata[$i]['user_id'] = $user['id'];
+            $billdata[$i]['amount'] = $user['balance'];
+            $billdata[$i]['value'] = $balance;
+            $billdata[$i]['fee'] = 0;
+            $billdata[$i]['type'] = 1;
+            $billdata[$i]['account'] = 'balance';
+            $Bill = model('Bill');
+            $result = $Bill->saveAll($billdata);
+            if (!$result) {
+                $this->User->rollback();
+                $this->output(1,'账单保存失败');
+            }
+
+            $this->User->commit();
+            $this->output(0,'编辑成功',['balance'=>$user['balance']]);
+            
+        }
+    }
+
+    public function coin(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                output(1,'参数错误');
+            }
+            $coin = input('post.coin');
+            $coin = floatval($coin);
+            $user['coin'] += $coin;
+            $result = $user->save();
+            if ($result) {
+                output(0,'编辑成功',['coin'=>$user['coin']]);
+            }
+            output(1,'编辑失败');
+        }
+    }
+
+    public function points(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                $this->output(1,'参数错误');
+            }
+            $points = input('post.points');
+            $points = floatval($points);
+            $user['points'] += $points;
+            $result = $user->save();
+            if (!$result) {
+                $this->User->rollback();
+                $this->output(1,'编辑失败');
+            }
+
+            $billdata = [];
+            $i = 0;
+            $billdata[$i]['user_id'] = $user['id'];
+            $billdata[$i]['amount'] = $user['points'];
+            $billdata[$i]['value'] = $points;
+            $billdata[$i]['fee'] = 0;
+            $billdata[$i]['type'] = 1;
+            $billdata[$i]['account'] = 'points';
+            $Bill = model('Bill');
+            $result = $Bill->saveAll($billdata);
+            if (!$result) {
+                $this->User->rollback();
+                $this->output(1,'账单保存失败');
+            }
+
+            $this->User->commit();
+            $this->output(0,'编辑成功',['points'=>$user['points']]);
+
+            output(1,'编辑失败');
+        }
+    }
+
+    public function remark(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                output(1,'参数错误');
+            }
+            $value = input('post.value');
+            $user->remark = $value;
+            $result = $user->save();
+            if ($result) {
+                output(0,'编辑成功');
+            }
+            output(1,'编辑失败');
+        }
+    }
+
+    public function forbid(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                $this->output(1,'参数错误');
+            }
+            $options = input('options/a','');
+            $user->forbid = $options;
+            $result = $user->save();
+            if (!$result) {
+                $this->output(1,'保存失败');
+            }
+            $this->output(0,'保存成功');
+        }else{
+            $id = input('get.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                $this->error('参数错误');
+            }
+            $this->assign('user',$user);
+            $this->assign('meta_title','禁止用户');
+            return $this->fetch();
+        }
+    }
+
+    public function delete(){
+        if ($this->request->isPost()) {
+            $id = input('post.id');
+            $user = $this->User->where(['id'=>$id])->find();
+            if (!$user) {
+                $this->output(1,'参数错误');
+            }
+            $Tree = model('Tree');
+            $tree = $Tree->where(['user_id'=>$user['id'],'layer'=>1])->find();
+            if ($tree) {
+                $Tree->where(['node_id'=>$user['id']])->update(['node_id'=>$tree['node_id']]);
+            }
+            $result = $user->delete();
+            if (!$result) {
+                $this->output(1,'删除失败');
+            }
+            $this->output(0,'删除成功');
+        }
+    }
+
+    public function team(){
+        $id = input('get.id');
+        $user = $this->User->where(['id'=>$id])->find();
+        if (!$user) {
+            $this->error('参数错误');
+        }
+        $this->assign('user',$user);
+        $this->assign('meta_title','团队');
+        return $this->fetch();
+    }
+
+    public function loadusers(){;
+        $pid = input('get.pid',0);
+        $level = input('get.level',9999);
+
+        $list = $this->User->tree($pid,$level);
+        $this->output(0,'加载成功',$list);
+    }
+
+    public function fans(){
+        $id = input('get.id');
+        $user = $this->User->where(['id'=>$id])->find();
+        if (!$user) {
+            $this->error('参数错误');
+        }
+        $this->assign('user',$user);
+        $this->assign('meta_title','粉丝团');
+        return $this->fetch();
+    }
+
+    public function loadfans(){;
+        $pid = input('get.pid',0);
+        $level = input('get.level',9999);
+
+        $list = $this->User->fans($pid,$level);
+        $this->output(0,'加载成功',$list);
+    }
+
+    public function getinfobyname(){
+        $name = input('post.name');
+        $user = $this->User->where(['name'=>$name,'state'=>1])->find();
+        if ($user) {
+            return json(['data'=>$user,'code'=>0,'msg'=>'获取成功']);
+        }
+        return json(['data'=>null,'code'=>1,'msg'=>'获取失败']);
+    }
+
+    public function getinfobyno(){
+        $no = input('post.no');
+        $user = $this->User->where(['no'=>$no,'state'=>1])->find();
+        if ($user) {
+            $data['id'] = $user['id'];
+            $data['no'] = $user['no'];
+
+            $role = $user['role'];
+            $data['role_name'] = $role['name'];
+
+            $company = $user['company'];
+            $data['company_cname'] = $company['cname'];
+            return json(['data'=>$data,'code'=>0,'msg'=>'获取成功']);
+        }
+        return json(['data'=>null,'code'=>1,'msg'=>'获取失败']);
+    }
+
+    public function getinfobyid(){
+        $id = input('post.id');
+        $user = $this->User->where(['id'=>$id,'state'=>1])->find();
+        if ($user) {
+            return json(['data'=>$user,'code'=>0,'msg'=>'获取成功']);
+        }
+        return json(['data'=>null,'code'=>1,'msg'=>'获取失败']);
+    }
+}

+ 133 - 0
application/admin/controller/article/Type.php

@@ -0,0 +1,133 @@
+<?php
+namespace app\admin\controller\article;
+
+use app\admin\controller\Admin;
+
+/**
+*	分类
+*/
+class Type extends Admin{
+
+	protected $ArticleType = null;
+	protected function _initialize(){
+		parent::_initialize();
+		$this->ArticleType = model('article.Type');
+	}
+
+	public function index(){
+		$pid = input('get.pid');
+		$parent = $this->ArticleType->where(['id'=>$pid])->find();
+		$this->assign('parent',$parent);
+		$this->assign('meta_title','文章类型');
+		return $this->fetch();
+	}
+
+	public function load(){
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$where['pid'] = input('get.pid',0);
+		$list = $this->ArticleType->where($where)->order('sort asc')->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['cname'] = $value['cname'];
+			$data[$key]['sort'] = $value['sort'];
+			$data[$key]['state'] = $value['state'];
+			$data[$key]['children'] = $value['children'];
+		}
+		$this->output(0,'加载成功',$data,$list->total());
+	}
+
+	public function loadforselect(){
+		$pid = input('post.pid');
+		$list = $this->ArticleType->where(['pid'=>$pid])->select();
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['cname'] = $value['cname'];
+		}
+		$this->output(0,'加载成功',$data);
+	}
+
+	public function add(){
+		if ($this->request->isPost()) {
+			$this->ArticleType->pid = input('post.pid');
+			$this->ArticleType->name = input('post.name');
+			$this->ArticleType->cname = input('post.cname');
+			$result = $this->ArticleType->save();
+			if (!$result) {
+				$this->output(1,'添加失败');
+			}
+			$this->output(0,'添加成功');
+		}else{
+			$pid = input('get.pid');
+			$parent = $this->ArticleType->where(['id'=>$pid])->find();
+			$this->assign('parent',$parent);
+			$this->assign('meta_title','添加类型');
+			return $this->fetch();
+		}
+	}
+
+	public function edit(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$type = $this->ArticleType->where(['id'=>$id])->find();
+			if (!$type) {
+				$this->output(1,'参数错误');
+			}
+			$type->name = input('post.name');
+			$type->cname = input('post.cname');
+			$result = $type->save();
+			if (!$result) {
+				$this->output(1,'编辑失败');
+			}
+			$this->output(0,'添加成功');
+		}else{
+			$id = input('get.id');
+			$type = $this->ArticleType->where(['id'=>$id])->find();
+			$this->assign('type',$type);
+			$this->assign('meta_title','编辑类型');
+			return $this->fetch();
+		}
+	}
+
+	public function sort(){
+		$id = input('post.id');
+		$type = $this->ArticleType->get($id);
+		if ($type) {
+			$sort = input('post.sort');
+			$type->sort = $sort;
+			$result = $type->save();
+			if ($result) {
+				$this->output(0,'排序成功');
+			}
+		}   
+		$this->output(1,'排序失败');
+	}
+
+	public function state(){
+		$id = input('post.id');
+		$type = $this->ArticleType->where(['id'=>$id])->find();
+		if (!$type) {
+			$this->output(1,'参数错误');
+		}
+		$state = input('post.state');
+		$type->state = $state == 'true'?1:0;
+		$result = $type->save();
+		if ($result) {
+			$this->output(1,'改变状态成功');
+		}
+		$this->output(0,'改变状态失败');
+	}
+
+
+	public function delete(){
+		$id = input('post.id');
+		$result =  $this->ArticleType->where(['id'=>$id])->delete();
+		if ($result) {
+			$this->output(0,'删除成功');
+			return json(['data'=>null,'code'=>0,'msg'=>'删除成功']);
+		}
+		$this->output(1,'删除失败');
+	}
+}

+ 136 - 0
application/admin/controller/card/Number.php

@@ -0,0 +1,136 @@
+<?php
+namespace app\admin\controller\card;
+use app\admin\controller\Admin;
+
+/**
+*	发卡
+*/
+class Number extends Admin{
+
+	protected $CardNumber = null;
+	protected function _initialize(){
+		parent::_initialize();
+		$this->CardNumber = model('card.Number');
+	}
+
+	public function index(){
+		$this->assign('meta_title','卡号管理');
+		$maxid = $this->CardNumber->max('id');
+		$this->assign('maxid',$maxid);
+		return $this->fetch();
+	}
+
+	public function load(){
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$where = [];
+		$is_bind = input('get.is_bind');
+		if ($is_bind === 0) {
+			$where['bind_time'] = 0;
+		}else if($is_bind == 1){
+			$where['bind_time'] = ['neq',0];
+		}
+		$no = input('param.no');
+		if (!empty($no)) {
+			$where['no'] = $no;
+		}
+		$search = input('get.search');
+		if (!empty($search)) {
+			$where['c.cname|c.id'] = ['like','%'.$search.'%'];
+		}
+		$start_id = input('get.start_id');
+		$end_id = input('get.end_id');
+		if (!empty($start_id) ) {
+			if (empty($end_id)) {
+				$where['cn.id'] = ['egt',$start_id];
+			}else{
+				$where['cn.id'] = ['between',[$start_id,$end_id]];
+			}
+		}else if (!empty($end_id)) {
+			$where['cn.id'] = ['elt',$end_id];
+		}
+
+		$list = $this->CardNumber->field('cn.*')
+					->alias('cn')
+					->join('Customer c','c.id = cn.customer_id','left')
+					->where($where)->order('cn.id desc')->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['no'] = $value['no']."\t";
+			$data[$key]['secret'] = $value['secret'];
+			$data[$key]['denomination'] = $value['denomination'];
+			$data[$key]['balance'] = $value['balance'];
+			if (!empty($value['expire_start_time'])) {
+				$data[$key]['expire_start_time'] = date('Y-m-d',$value['expire_start_time']);
+			}else{
+			    $data[$key]['expire_start_time'] = '';
+			}
+			if (!empty($value['expire_end_time'])) {
+				$data[$key]['expire_end_time'] = date('Y-m-d',$value['expire_end_time']);
+			}else{
+			    $data[$key]['expire_end_time'] = '';
+			}
+			if (!empty($value['sale_time'])) {
+				$data[$key]['sale_time'] = date('Y-m-d H:i:s',$value['sale_time']);
+			}else{
+			    $data[$key]['sale_time'] = '';
+			}
+			if (!empty($value['bind_time'])) {
+				$data[$key]['bind_time'] = date('Y-m-d H:i:s',$value['bind_time']);
+			}else{
+			    $data[$key]['bind_time'] = '';
+			}
+			$data[$key]['state'] = $value['state'];
+			$data[$key]['create_time'] = $value['create_time'];
+
+			$customer = $value['customer'];
+			if ($customer) {
+				$data[$key]['customer'] = $customer['cname'].'['.$customer['id'].']';
+			}else{
+			    $data[$key]['customer'] = '';
+			}
+			$goods_type = $value['goods_type'];
+			if ($goods_type) {
+				$goods_type_str = '';
+				foreach ($goods_type as $k => $val) {
+					$goods_type_str .= '【'.$val['cname'].'】';
+				}
+				$data[$key]['goods_type'] = $goods_type_str;
+			}else{
+				$data[$key]['goods_type'] = '全品类';
+			}
+            $store_type = $value['store_type'];
+            if ($store_type) {
+                $store_type_str = '';
+                foreach ($store_type as $k => $val) {
+                    $store_type_str .= '【'.$val['cname'].'】';
+                }
+                $data[$key]['store_type'] = $store_type_str;
+            }else{
+                $data[$key]['store_type'] = '全品类';
+            }
+
+			$url = "https://mall-h5.jucai.gov.cn/member/bind_card?card_no=".$value['no']."&card_pwd=".$value['secret'];
+			$data[$key]['qrcode'] = createqrcode($url);
+		}
+		$this->output(0,'获取成功',$data,$list->total());
+	}
+
+	public function state(){
+		if($this->request->isPost()){
+			$id = input('post.id');
+			$number = $this->CardNumber->where(['id'=>$id])->find();
+			if (!$number) {
+				$this->output(1,'参数错误');
+			}
+	        $state = input('post.state');
+	        $number->state = $state == 'true'?1:0;
+	        $result = $number->save();
+	        if (!$result) {
+	        	$this->output(1,'保存失败');
+	        }
+	        $this->output(0,'保存成功');
+		}
+	}
+}

+ 286 - 0
application/admin/controller/coupon/Code.php

@@ -0,0 +1,286 @@
+<?php
+namespace app\admin\controller\coupon;
+use app\admin\controller\Admin;
+
+/**
+*	码
+*/
+class Code extends Admin{
+
+	protected $CouponCode = null;
+	protected function _initialize(){
+		parent::_initialize();
+		$this->CouponCode = model('coupon.Code');
+	}
+
+	public function index(){
+		$this->assign('meta_title','券码管理');
+
+		return $this->fetch();
+	}
+
+	public function load(){
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$where = [];
+		$no = input('param.no');
+		if (!empty($no)) {
+			$where['cc.no|cc.secret'] = $no;
+		}
+		$search = input('get.search');
+		if (!empty($search)) {
+			$where['c.cname|c.id'] = ['like','%'.$search.'%'];
+		}
+		$list = $this->CouponCode->field('cc.*')
+					->alias('cc')
+					->join('Coupon c','c.id = cc.coupon_id')
+					->where($where)->order('id desc')->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+
+			$coupon = $value['coupon'];
+			$data[$key]['coupon'] = $coupon['cname'].'['.$coupon['id'].']';
+			$coupon_type = $coupon['type'];
+			$data[$key]['type'] = $coupon_type['cname'];
+			$data[$key]['sale_price'] = $coupon['sale_price'];
+
+			$data[$key]['no'] = $value['no'];
+			$data[$key]['secret'] = $value['secret'];
+			$data[$key]['qrcode'] = '<img src="'.$value['qrcode'].'">';
+			$data[$key]['barcode'] = '<img src="'.$value['barcode'].'">';
+			$data[$key]['url'] = $value['url'];
+			$data[$key]['expire_time'] = $value['expire_time'];
+			$data[$key]['state'] = $value['state'];
+			$data[$key]['state_text'] = $value['state_text'];
+			$data[$key]['sale_time'] = date('Y-m-d H:i:s',$value['sale_time']);
+			$data[$key]['create_time'] = $value['create_time'];
+		}
+		$this->output(0,'获取成功',$data,$list->total());
+	}
+
+	public function add(){
+		if($this->request->isPost()) {
+			$coupon_id = input('post.coupon_id');
+			if (empty($coupon_id)) {
+				$this->output(1,'请选择电子券');
+			}
+			$Coupon = model('Coupon');
+			$coupon = $Coupon->where(['id'=>$coupon_id])->find();
+			if (!$coupon) {
+				$this->output(1,'参数错误');
+			}
+			$coupon_type = $coupon['type'];
+			$type_name = $coupon_type['name'];
+			$type_value = input('post.'.$type_name);
+			if (empty($type_value)) {
+				$this->output(1,'请输入'.$type['cname']);
+			}
+			if ($type_name == 'secret') {
+				$no = input('post.no');
+				if (empty($no)) {
+					$this->output(1,'请输入卡号');
+				}
+				$this->CouponCode->no = $no;
+			}
+			$expire_time = input('post.expire_time');
+			list($expire_start_time,$expire_end_time) = explode('~',$expire_time);
+			if (strtotime($expire_end_time) < $this->request->time()) {
+				$this->output(1,'有效结束时间必须大于当期时间');
+			}
+			$this->CouponCode->coupon_id = $coupon['id'];
+			$this->CouponCode->$type_name = $type_value;
+			$this->CouponCode->expire_time = $expire_time;
+			$result = $this->CouponCode->save();
+			if (!$result) {
+				$this->output(1,'保存失败');
+			}
+			$this->output(0,'保存成功');
+
+		}else{
+			$Coupon = model('Coupon');
+			$coupons = $Coupon->where(['state'=>1])->select();
+			$coupon_group = [];
+			foreach ($coupons as $key => $value) {
+				$supplier = $value['supplier'];
+				$coupon_group[$supplier['id']]['cname'] = $supplier['cname'];
+
+				$option['id'] = $value['id'];
+				$option['cname'] = $value['cname'];
+				$option['type_name'] = $value['type']['name'];
+				$coupon_group[$supplier['id']]['options'][] = $option;
+			}
+			$this->assign('coupon_group',$coupon_group);
+
+			$this->assign('meta_title','添加券码');
+			return $this->fetch();
+		}
+	}
+
+	public function edit(){
+		if($this->request->isPost()) {
+			$id = input('post.id');
+			$code = $this->CouponCode->where(['id'=>$id])->find();
+			if (!$code) {
+				$this->output(1,'参数错误');
+			}
+			$coupon_id = input('post.coupon_id');
+			if (empty($coupon_id)) {
+				$this->output(1,'请选择电子券');
+			}
+			$Coupon = model('Coupon');
+			$coupon = $Coupon->where(['id'=>$coupon_id])->find();
+			if (!$coupon) {
+				$this->output(1,'参数错误');
+			}
+			$coupon_type = $coupon['type'];
+			$type_name = $coupon_type['name'];
+			if ($type_name == 'secret') {
+				$no = input('post.no');
+				if (empty($no)) {
+					$this->output(1,'请输入卡号');
+				}
+				$code->no = $no;
+			}
+			$type_value = input('post.'.$type_name);
+			if (empty($type_value)) {
+				$this->output(1,'请输入'.$type['cname']);
+			}
+			$expire_time = input('post.expire_time');
+			list($expire_start_time,$expire_end_time) = explode('~',$expire_time);
+			if (strtotime($expire_end_time) < $this->request->time()) {
+				$this->output(1,'有效结束时间必须大于当期时间');
+			}
+			$code->coupon_id = $coupon['id'];
+			$code->$type_name = $type_value;
+			$code->expire_time = $expire_time;
+			$result = $code->save();
+			if (!$result) {
+				$this->output(1,'保存失败');
+			}
+			$this->output(0,'保存成功');
+
+		}else{
+			$id = input('get.id');
+			$code = $this->CouponCode->where(['id'=>$id])->find();
+			if (!$code) {
+				$this->output(1,'参数错误');
+			}
+			$this->assign('code',$code);
+
+			$Coupon = model('Coupon');
+			$coupons = $Coupon->where(['state'=>1])->group('supplier_id')->select();
+			$coupon_group = [];
+			foreach ($coupons as $key => $value) {
+				$supplier = $value['supplier'];
+				$coupon_group[$supplier['id']]['cname'] = $supplier['cname'];
+
+				$option['id'] = $value['id'];
+				$option['cname'] = $value['cname'];
+				$option['type_name'] = $value['type']['name'];
+				$coupon_group[$supplier['id']]['options'][] = $option;
+			}
+			$this->assign('coupon_group',$coupon_group);
+
+			$this->assign('meta_title','编辑券码');
+			return $this->fetch();
+		}
+	}
+
+	public function state(){
+		if($this->request->isPost()){
+			$id = input('post.id');
+			$code = $this->CouponCode->where(['id'=>$id])->find();
+			if (!$code) {
+				$this->output(1,'参数错误');
+			}
+	        $state = input('post.state');
+	        $code->state = $state == 'true'?1:0;
+	        $result = $code->save();
+	        if (!$result) {
+	        	$this->output(1,'保存失败');
+	        }
+	        $this->output(0,'保存成功');
+		}
+	}
+
+	public function delete(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$code = $this->CouponCode->where(['id'=>$id])->find();
+			if (!$code) {
+				$this->output(1,'参数错误');
+			}
+
+			$result = $code->delete();
+			if (!$result) {
+				$this->output(1,'删除失败');
+			}
+
+			$this->output(0,'删除成功');
+		}
+	}
+
+	public function import(){
+		vendor('PHPExcel.PHPExcel');
+
+		$path = input('param.path');
+		if (empty($path)) {
+			$this->output(1,'文件地址不能为空');
+		}
+		$path_arr = explode('.',$path);
+		$exts = $path_arr[count($path_arr) - 1];
+
+		//导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
+        vendor('PHPExcel.PHPExcel');
+        //创建PHPExcel对象,注意,不能少了\
+        $PHPExcel = new \PHPExcel();
+        //如果excel文件后缀名为.xls,导入这个类
+        if ($exts == 'xls') {
+            Vendor('PHPExcel.PHPExcel.Reader.Excel5');
+            $PHPReader = new \PHPExcel_Reader_Excel5();
+        } else if ($exts == 'xlsx') {
+            Vendor('PHPExcel.PHPExcel.Reader.Excel2007');
+            $PHPReader = new \PHPExcel_Reader_Excel2007();
+        }
+ 
+ 
+        //载入文件
+        $PHPExcel = $PHPReader->load(ROOT_PATH.'public'.$path);
+        //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
+        $currentSheet = $PHPExcel->getSheet(0);
+        //获取总列数
+        $allColumn = $currentSheet->getHighestColumn();
+        //获取总行数
+        $allRow = $currentSheet->getHighestRow();
+        $fields = ['A'=>'coupon_id','B'=>'no','C'=>'secret','D'=>'qrcode','E'=>'barcode','F'=>'expire_time'];
+        //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
+        $data = [];
+        for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
+            //从哪列开始,A表示第一列
+            for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) {
+                //数据坐标
+                $address = $currentColumn . $currentRow;
+                //读取到的数据,保存到数组$data中
+                $cell = $currentSheet->getCell($address)->getValue();
+ 				
+                if ($cell instanceof PHPExcel_RichText) {
+                    $cell = $cell->__toString();
+                }
+                if (!isset($fields[$currentColumn])) {
+                	break;
+                }
+                $field = $fields[$currentColumn];
+                $data[$currentRow - 1][$field] = $cell;
+                //  print_r($cell);
+            }
+ 
+        }
+        var_dump($data);exit();
+        $count = count($data);
+        if ($count > 0) {
+        	$this->CouponCode->saveAll($data);
+        }
+        $this->output(0,'导入成功 条数:'.$count);
+	}
+}

+ 175 - 0
application/admin/controller/customer/Order.php

@@ -0,0 +1,175 @@
+<?php
+
+namespace app\admin\controller\customer;
+
+use app\admin\controller\Admin;
+
+/**
+ *    订单
+ */
+class Order extends Admin
+{
+
+    protected $CustomerOrder = null;
+
+    public function init()
+    {
+        parent::init();
+        $this->CustomerOrder = model('customer.Order');
+    }
+
+    public function index()
+    {
+        $this->assign('meta_title', '销售记录');
+        return $this->fetch();
+    }
+
+    public function load()
+    {
+        $page   = input('get.page');
+        $limit  = input('get.limit');
+        $where  = [];
+        $search = input('get.search');
+        if (!empty($search)) {
+            $where['c.cname|c.id'] = ['like', '%' . $search . '%'];
+        }
+
+        $list = $this->CustomerOrder->field('co.*')
+            ->alias('co')
+            ->join('Customer c', 'c.id = co.customer_id')
+            ->where($where)->order('co.id desc')->paginate($limit, false, ['page' => $page]);
+        $data = [];
+        foreach ($list as $key => $value) {
+            $data[$key]['id'] = $value['id'];
+
+            $customer               = $value['customer'];
+            $data[$key]['customer'] = $customer['cname'] . '[' . $customer['id'] . ']';
+
+            $data[$key]['denomination'] = $value['denomination'];
+            $data[$key]['pay_amount']   = $value['pay_amount'];
+            $data[$key]['num']          = $value['num'];
+            $data[$key]['discount']     = $value['discount'];
+            $data[$key]['expire_time']  = $value['expire_time'];
+
+            $card_number     = $value['card_number'];
+            $card_number_str = '';
+            foreach ($card_number as $k => $val) {
+                $card_number_str .= $val['start'] . '~' . $val['end'] . '<br>';
+            }
+            $data[$key]['card_number'] = $card_number_str;
+
+            $goods_type     = $value['goods_type'];
+            $goods_type_str = '';
+            foreach ($goods_type as $k => $val) {
+                $goods_type_str .= '【' . $val['cname'] . '】';
+            }
+            $data[$key]['goods_type'] = empty($goods_type_str) ? '全品类' : $goods_type_str;
+
+            $store_type = $value['store_type'];
+            $store_type_str = '';
+            foreach ($store_type as $k => $val) {
+                $store_type_str .= '【' . $val['cname'] . '】';
+            }
+            $data[$key]['store_type'] = empty($store_type_str) ? '全品类' : $store_type_str;
+
+            $data[$key]['create_time'] = $value['create_time'];
+        }
+        $this->output(0, '获取成功', $data, $list->total());
+    }
+
+    public function add()
+    {
+        if ($this->request->isPost()) {
+            $customer_id = input('post.customer_id');
+            if (empty($customer_id)) {
+                $this->output(1, '参数错误');
+            }
+            $num = input('post.num');
+            $num = intval($num);
+            if ($num <= 0) {
+                $this->output(1, '数量必须大于o');
+            }
+            $expire_time = input('post.expire_time');
+            if (empty($expire_time)) {
+                $this->output(1, '有效期不能为空');
+            }
+            list($expire_start_time, $expire_end_time) = explode('~', $expire_time);
+            if (strtotime($expire_end_time) < $this->request->time()) {
+                $this->output(1, '有效结束时间必须大于当期时间');
+            }
+            $denomination = input('post.denomination');
+            $denomination = floatval($denomination);
+            if ($denomination <= 0) {
+                $this->output(1, '请输入面值');
+            }
+            $pay_amount = input('post.pay_amount');
+            $pay_amount = floatval($pay_amount);
+            if ($pay_amount <= 0) {
+                $this->output(1, '请输入实付金额');
+            }
+            $goods_type      = input('post.goods_type/a', []);
+            $store_type      = input('post.store_type/a', []);
+            $card_number_arr = input('post.card_number/a', []);
+            $total_num       = array_sum(array_column($card_number_arr, 'num'));
+            if ($total_num != $num) {
+                $this->output(1, '卡号数量和销售数量不相等');
+            }
+            $this->CustomerOrder->startTrans();
+            $CardNumber = model('card.Number');
+            foreach ($card_number_arr as $key => $value) {
+                for ($i = $value['start']; $i <= $value['end']; $i++) {
+                    $card_number = $CardNumber->where(['id' => $i, 'customer_id' => 0])->find();
+                    if (!$card_number) {
+                        $this->CustomerOrder->rollback();
+                        $this->output(1, '序号[' . $i . ']已经售出');
+                    }
+                    $card_number->customer_id       = $customer_id;
+                    $card_number->goods_type        = $goods_type;
+                    $card_number->store_type        = $store_type;
+                    $card_number->denomination      = $denomination;
+                    $card_number->balance           = $denomination;
+                    $card_number->expire_start_time = strtotime($expire_start_time);
+                    $card_number->expire_end_time   = strtotime($expire_end_time);
+                    $card_number->sale_time         = $this->request->time();
+                    $result                         = $card_number->save();
+                    if (!$result) {
+                        $this->CustomerOrder->rollback();
+                        $this->output(1, '卡号失败');
+                    }
+                }
+            }
+
+            $this->CustomerOrder->customer_id  = $customer_id;
+            $this->CustomerOrder->num          = $total_num;
+            $this->CustomerOrder->expire_time  = $expire_time;
+            $this->CustomerOrder->denomination = $denomination;
+            $this->CustomerOrder->pay_amount   = $pay_amount;
+            $this->CustomerOrder->discount     = round($pay_amount / $denomination, 2) * 100;
+            $this->CustomerOrder->goods_type   = $goods_type;
+            $this->CustomerOrder->store_type   = $store_type;
+            $this->CustomerOrder->card_number  = $card_number_arr;
+            $result                            = $this->CustomerOrder->save();
+            if (!$result) {
+                $this->CustomerOrder->rollback();
+                $this->output(1, '保存失败');
+            }
+            $this->CustomerOrder->commit();
+            $this->output(0, '保存成功');
+        } else {
+            //用户信息
+            $Customer    = model('Customer');
+            $customers   = $Customer->select();
+            $this->assign('customers', $customers);
+
+            //店铺分类
+            $checkHost   = config('mall_url');
+            $url         = $checkHost . 'api/store/get_store_class';
+            $store_class = common_curl($url, []);
+            $store_class = $store_class['result']['store_class'];
+            $this->assign('store_class',$store_class);
+
+            $this->assign('meta_title', '添加订单');
+            return $this->fetch();
+        }
+    }
+}

+ 133 - 0
application/admin/controller/goods/Type.php

@@ -0,0 +1,133 @@
+<?php
+namespace app\admin\controller\goods;
+
+use app\admin\controller\Admin;
+
+/**
+*	分类
+*/
+class Type extends Admin{
+
+	protected $GoodsType = null;
+	protected function _initialize(){
+		parent::_initialize();
+		$this->GoodsType = model('goods.Type');
+	}
+
+	public function index(){
+		$pid = input('get.pid');
+		$parent = $this->GoodsType->where(['id'=>$pid])->find();
+		$this->assign('parent',$parent);
+		$this->assign('meta_title','商品类型');
+		return $this->fetch();
+	}
+
+	public function load(){
+		$page = input('get.page');
+		$limit = input('get.limit');
+		$where['pid'] = input('get.pid',0);
+		$list = $this->GoodsType->where($where)->order('sort asc')->paginate($limit,false,['page'=>$page]);
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['cname'] = $value['cname'];
+			$data[$key]['sort'] = $value['sort'];
+			$data[$key]['state'] = $value['state'];
+			$data[$key]['children'] = $value['children'];
+		}
+		$this->output(0,'加载成功',$data,$list->total());
+	}
+
+	public function loadforselect(){
+		$pid = input('post.pid');
+		$list = $this->GoodsType->where(['pid'=>$pid])->select();
+		$data = [];
+		foreach ($list as $key => $value) {
+			$data[$key]['id'] = $value['id'];
+			$data[$key]['cname'] = $value['cname'];
+		}
+		$this->output(0,'加载成功',$data);
+	}
+
+	public function add(){
+		if ($this->request->isPost()) {
+			$this->GoodsType->pid = input('post.pid');
+			$this->GoodsType->name = input('post.name');
+			$this->GoodsType->cname = input('post.cname');
+			$result = $this->GoodsType->save();
+			if (!$result) {
+				$this->output(1,'添加失败');
+			}
+			$this->output(0,'添加成功');
+		}else{
+			$pid = input('get.pid');
+			$parent = $this->GoodsType->where(['id'=>$pid])->find();
+			$this->assign('parent',$parent);
+			$this->assign('meta_title','添加类型');
+			return $this->fetch();
+		}
+	}
+
+	public function edit(){
+		if ($this->request->isPost()) {
+			$id = input('post.id');
+			$type = $this->GoodsType->where(['id'=>$id])->find();
+			if (!$type) {
+				$this->output(1,'参数错误');
+			}
+			$type->name = input('post.name');
+			$type->cname = input('post.cname');
+			$result = $type->save();
+			if (!$result) {
+				$this->output(1,'编辑失败');
+			}
+			$this->output(0,'添加成功');
+		}else{
+			$id = input('get.id');
+			$type = $this->GoodsType->where(['id'=>$id])->find();
+			$this->assign('type',$type);
+			$this->assign('meta_title','编辑类型');
+			return $this->fetch();
+		}
+	}
+
+	public function sort(){
+		$id = input('post.id');
+		$type = $this->GoodsType->get($id);
+		if ($type) {
+			$sort = input('post.sort');
+			$type->sort = $sort;
+			$result = $type->save();
+			if ($result) {
+				$this->output(0,'排序成功');
+			}
+		}   
+		$this->output(1,'排序失败');
+	}
+
+	public function state(){
+		$id = input('post.id');
+		$type = $this->GoodsType->where(['id'=>$id])->find();
+		if (!$type) {
+			$this->output(1,'参数错误');
+		}
+		$state = input('post.state');
+		$type->state = $state == 'true'?1:0;
+		$result = $type->save();
+		if ($result) {
+			$this->output(1,'改变状态成功');
+		}
+		$this->output(0,'改变状态失败');
+	}
+
+
+	public function delete(){
+		$id = input('post.id');
+		$result =  $this->GoodsType->where(['id'=>$id])->delete();
+		if (!$result) {
+			$this->output(1,'删除失败');
+		}
+		$this->output(0,'删除成功');
+		
+	}
+}

+ 66 - 0
application/admin/view/admin/changepwd.html

@@ -0,0 +1,66 @@
+{extend name="public:base" /}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<label class="layui-form-label">账号</label>
+					<div class="layui-input-inline">
+						<input type="text" name="name" value="{$name}" disabled="" class="layui-input" readonly="">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">手机号码</label>
+					<div class="layui-input-inline">
+						<input type="text" name="mobile"  value="{$mobile}"  autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">旧登录密码</label>
+					<div class="layui-input-inline">
+						<input type="password" name="oldpwd"  autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">新登录密码</label>
+					<div class="layui-input-inline">
+						<input type="text" name="password"  autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;z-index: 9999;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-btn-changepwd">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+	}).extend({
+		index: 'lib/index'
+	}).use(['index','form'],function(){
+  		var s = layui.$,
+  		form = layui.form;
+  		form.on('submit(LAY-btn-changepwd)',function(data){
+			s.post('changepwd.html',data.field,function(r){
+				layer.msg(r.msg,{time:1000,end:function(){
+					if (!r.code) {
+						var index = parent.layer.getFrameIndex(window.name);
+						parent.layer.close(index);
+					}
+				}});
+			})
+			return false;
+		})
+  });
+</script>
+{/block}

+ 91 - 0
application/admin/view/article/add.html

@@ -0,0 +1,91 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.file{   border: 1px solid #D2D2D2;width: 128px;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<label class="layui-form-label">文章类型</label>
+					<div class="layui-input-block">
+						<div class="layui-input-inline">
+							<select name="type_1" lay-verify="required" lay-filter="type">
+								<option value="0">一级类型</option>
+							</select>
+						</div>
+						<div class="layui-input-inline">
+							<select name="type_2" lay-filter="type">
+								<option value="0">二级类型</option>
+							</select>
+						</div>
+						<div class="layui-input-inline">
+							<select name="type_3" >
+								<option value="0">三级类型</option>
+							</select>
+						</div>
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">封面</label>
+					<div class="layui-input-block">
+						<input type="hidden" name="cover" value="">
+						<img src="__STATIC__/images/default_image.gif" class="file" data-name="cover">
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">标识</label>
+					<div class="layui-input-block">
+						<input type="text" name="name" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">名称</label>
+					<div class="layui-input-block">
+						<input type="text" name="title" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">关键词</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords"  class="layui-input" placeholder="请输入文章关键词,以‘,’隔开">
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">描述</label>
+					<div class="layui-input-block">
+						<textarea name="description" placeholder="请输入文章描述" class="layui-textarea"></textarea>
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">内容</label>
+					<div class="layui-input-block">
+						<script type="text/plain" style="width: 100%;height: 400px;" id="content" name="content"></script>
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;z-index: 9999;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-article-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'article']);
+</script>
+{/block}

+ 94 - 0
application/admin/view/article/edit.html

@@ -0,0 +1,94 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.file{   border: 1px solid #D2D2D2;width: 128px;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="id" value="{$article.id}">
+				<div class="layui-form-item">
+					<label class="layui-form-label">文章分类</label>
+					<div class="layui-input-block">
+						<div class="layui-input-inline">
+							<select name="type_1" data-selected="{$article.type_1}" lay-verify="required" lay-filter="type">
+								<option value="0">一级分类</option>
+							</select>
+						</div>
+						<div class="layui-input-inline">
+							<select name="type_2" data-selected="{$article.type_2}"  lay-filter="type">
+								<option value="0">二级分类</option>
+							</select>
+						</div>
+						<div class="layui-input-inline">
+							<select name="type_3" data-selected="{$article.type_3}"  >
+								<option value="0">三级分类</option>
+							</select>
+						</div>
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">封面</label>
+					<div class="layui-input-block">
+						<input type="hidden" name="cover" value="">
+						<img src="__STATIC__/images/default_image.gif" class="file" data-name="cover">
+					</div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">标识</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="name" value="{$article.name}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="title" value="{$article.title}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+                    <label class="layui-form-label">关键词</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="keywords" value="{$article.keywords}"  class="layui-input" placeholder="请输入文章关键词,以‘,’隔开">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">描述</label>
+                    <div class="layui-input-block">
+                        <textarea name="description" placeholder="请输入文章描述" class="layui-textarea">{$article.description}</textarea>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">内容</label>
+                    <div class="layui-input-block">
+                    	<script type="text/plain" style="width: 100%;height: 400px;" id="content" name="content">
+                    		{$article.content}
+                    	</script>
+                    </div>
+                </div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;z-index: 9999">
+							<button class="layui-btn" lay-submit lay-filter="LAY-article-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'article']);
+</script>
+{/block}

+ 59 - 0
application/admin/view/article/index.html

@@ -0,0 +1,59 @@
+{extend name="public:base" /}
+
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" style="margin-bottom: 10px;">
+				<div class="layui-inline" style="width: 100px;">
+			    	<select name="type_id" lay-filter="type" >
+					  {volist name="types" id="type"}
+					  <option value="{$type.id}" >{$type.cname}</option>
+					  {/volist}
+					</select>     
+			    </div>
+			    <div class="layui-inline">
+			    	<input type="text" name="keyword"  placeholder="标题模糊搜索" autocomplete="off" class="layui-input">  
+			    </div>
+			    <div class="layui-inline">
+			    	<button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="search">搜索</button>
+			    </div>
+			</form>
+			<div id="article-table" lay-filter="article"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+  	<div class="layui-btn-container">
+  		<button class="layui-btn layui-btn-sm layui-btn-primary" lay-event="add">添加</button>
+  	</div>
+</script>
+
+<script type="text/html" id="switchState">
+	<input type="checkbox" name="state" value="1" lay-skin="switch" lay-text="发布|草稿" lay-filter="state" data-id="{{ d.id }}" {{ d.state == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="switchRecommend">
+	<input type="checkbox" name="recommend" value="1" lay-skin="switch" lay-text="是|否" lay-filter="recommend" data-id="{{ d.id }}" {{ d.recommend == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="rowToolbar">
+	{{# if(d.type1_name == 'user'){ }}
+	<a class="layui-btn layui-btn-xs layui-btn-primary" lay-event="comment">评论</a>
+	<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="report">举报</a>
+	{{# } }}
+  	<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'article']);
+</script>
+{/block}

+ 49 - 0
application/admin/view/article/type/add.html

@@ -0,0 +1,49 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<input type="hidden" name="pid" value="{$parent.id}">
+				    <label class="layui-form-label">上级分类</label>
+				    <div class="layui-form-mid layui-word-aux">{$parent.cname|default='无'}</div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">标识</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="name" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="cname"  lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-type-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'article/type']);
+</script>
+{/block}

+ 53 - 0
application/admin/view/article/type/edit.html

@@ -0,0 +1,53 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.btn-group{margin-bottom: 10px;}
+	.collapse-link{float: right;cursor: pointer;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="id" value="{$type.id}">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">上级分类</label>
+				    <div class="layui-form-mid layui-word-aux">{$type.parent.cname|default='无'}</div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">标识</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="name" value="{$type.name}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="cname" value="{$type.cname}" lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-type-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'article']);
+</script>
+{/block}

+ 52 - 0
application/admin/view/article/type/index.html

@@ -0,0 +1,52 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.toolbar{margin-bottom: 10px;}
+	.collapse-link{float: right;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">
+			类型设置{if condition="!empty($parent)"} > {$parent['cname']}
+			<a class="collapse-link" onclick="history.go(-1)">返回</a>
+			{/if}
+		</div>
+		<div class="layui-card-body">
+			<input type="hidden" name="pid" value="{$parent['id']|default=0}">
+			<div id="type-table" lay-filter="type"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="switchState">
+  <input type="checkbox" name="state" value="1" lay-skin="switch" lay-text="正常|禁用" lay-filter="state" data-id="{{ d.id }}" {{ d.state == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="topToolbar">
+  	<div class="layui-btn-container">
+	    <button class="layui-btn layui-btn-sm layui-btn-primary" lay-event="add">添加</button>
+  	</div>
+</script>
+
+<script type="text/html" id="rowToolbar">
+	{{# if(d.children.length > 0){ }}
+	<a class="layui-btn layui-btn-xs" lay-event="children">子分类</a>
+	{{# }else{ }}
+	<a class="layui-btn layui-btn-xs" lay-event="add">添加</a>
+	{{# } }}
+  	<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'article/type']);
+</script>
+{/block}

+ 33 - 0
application/admin/view/card/index.html

@@ -0,0 +1,33 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<div id="card-table" lay-filter="card"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container">
+		<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="add">添加</a>
+	</div>
+</script>
+
+<script type="text/html" id="rowToolbar">
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'card']);
+</script>
+{/block}

+ 67 - 0
application/admin/view/card/number/index.html

@@ -0,0 +1,67 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-btn-container{font-size: 15px;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" style="margin-bottom: 10px;">
+				<div class="layui-inline" style="width: 100px;">
+			    	<select name="is_bind" lay-filter="bind" >
+			    		<option value="" >全部</option>
+						<option value="1" >已绑定</option>
+						<option value="0" >未绑定</option>
+					</select>     
+			    </div>
+				<div class="layui-inline">
+					<input type="text" name="no"  placeholder="卡号、序列号" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					<input type="text" name="search"  placeholder="关键词检索" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					<input type="text" name="start_id"  placeholder="起始序列号" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					~
+				</div>
+				<div class="layui-inline">
+					<input type="text" name="end_id"  placeholder="结束序列号" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn layui-btn-primary layui-btn-sm" lay-submit lay-filter="LAY-number-search">搜索</button>
+				</div>
+			</form>
+			<div id="number-table" lay-filter="number"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container">
+		当前最大序号:{$maxid}
+	</div>
+</script>
+
+<script type="text/html" id="switchState">
+	<input type="checkbox" name="state" value="1" lay-skin="switch" lay-text="正常|冻结" lay-filter="state" data-id="{{ d.id }}" {{ d.state == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="rowToolbar">
+  	<a class="layui-btn layui-btn-normal layui-btn-xs " lay-event="qrcode">二维码</a>
+</script>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'card/number']);
+</script>
+{/block}

+ 81 - 0
application/admin/view/config/app.html

@@ -0,0 +1,81 @@
+{extend name="public:base" /}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card layui-form">
+		<input type="hidden" name="key" value="app">
+		<div class="layui-tab layui-tab-brief">
+			<ul class="layui-tab-title">
+				<li class="layui-this">Android</li>
+				<!-- <li >IOS</li> -->
+				
+			</ul>
+			<div class="layui-tab-content">
+				<div class="layui-tab-item layui-show">
+					<div class="layui-form-item layui-form-text">
+					    <label class="layui-form-label">更新内容</label>
+					    <div class="layui-input-block">
+					      <textarea name="value[android][version][desc]" placeholder="请输入内容" class="layui-textarea">{$app.android.version.desc|default=''}</textarea>
+					    </div>
+					</div>
+					<div class="layui-form-item">
+					    <label class="layui-form-label">版本号</label>
+					    <div class="layui-input-inline">
+					     	<input type="text" name="value[android][version][name]" value="{$app.android.version.name|default=''}"  autocomplete="off" class="layui-input">
+					    </div>
+					</div>
+					<div class="layui-form-item">
+					    <label class="layui-form-label">热更新</label>
+					    <div class="layui-input-block">
+					     	<input type="text" name="value[android][wgt]" value="{$app.android.version.cname|default=''}"  autocomplete="off" class="layui-input">
+					    </div>
+					</div>
+					<div class="layui-form-item">
+					    <label class="layui-form-label">下载地址</label>
+					    <div class="layui-input-block">
+					      <input type="text" name="value[android][download]" value="{$app.android.download|default=''}"  autocomplete="off" class="layui-input">
+					    </div>
+					</div>
+				</div>
+				<div class="layui-tab-item ">
+					<div class="layui-form-item">
+					    <label class="layui-form-label">版本名称</label>
+					    <div class="layui-input-inline">
+					     	<input type="text" name="value[ios][version][cname]" value="{$app.ios.version.cname|default=''}"   autocomplete="off" class="layui-input">
+					    </div>
+					</div>
+					<div class="layui-form-item">
+					    <label class="layui-form-label">版本号</label>
+					    <div class="layui-input-inline">
+					     	<input type="text" name="value[ios][version][name]" value="{$app.ios.version.name|default=''}"   autocomplete="off" class="layui-input">
+					    </div>
+					</div>
+					<div class="layui-form-item">
+					    <label class="layui-form-label">下载地址</label>
+					    <div class="layui-input-block">
+					      <input type="text" name="value[ios][download]" value="{$app.ios.download|default=''}"  autocomplete="off" class="layui-input">
+					    </div>
+					</div>
+				</div>
+				
+			</div>
+			<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+    base: '__JS__/' //静态资源所在路径
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'config']);
+</script>
+{/block}

+ 41 - 0
application/admin/view/config/express.html

@@ -0,0 +1,41 @@
+{extend name="public:base" /}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="key" value="express">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">Customer</label>
+				    <div class="layui-input-block">
+				      <input type="text" name="value[customer]" value="{$other.customer|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">Key</label>
+				    <div class="layui-input-inline">
+				      <input type="text" name="value[key]" value="{$other.key|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' //静态资源所在路径
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'config']);
+</script>
+{/block}

+ 41 - 0
application/admin/view/config/invite.html

@@ -0,0 +1,41 @@
+{extend name="public:base" /}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="key" value="invite">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">分享地址</label>
+				    <div class="layui-input-block">
+				      <input type="text" name="value[share]" value="{$invite.share|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">下载地址</label>
+				    <div class="layui-input-block">
+				      <input type="text" name="value[download]" value="{$invite.download|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'config']);
+</script>
+{/block}

+ 143 - 0
application/admin/view/config/order.html

@@ -0,0 +1,143 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-form-label{width: 90px;}
+	.layui-input-block{    margin-left: 120px;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="key" value="order">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">直推奖励</label>
+				    <div class="layui-inline">报单</div>
+				    <div class="layui-inline">
+				    	<input type="text" name="value[direct][report]" value="{$order.direct.report|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				    <div class="layui-inline">复购</div>
+				    <div class="layui-inline">
+				    	<input type="text" name="value[direct][repeat]" value="{$order.direct.repeat|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				
+				<div class="layui-form-item">
+					<label class="layui-form-label">级别</label>
+					<div class="layui-input-block">
+						<table class="layui-table level">
+							<thead>
+								<tr >
+									<th colspan="12">
+										<a href="javascript:;" class="layui-btn layui-btn-xs layui-level-add">添加</a>
+									</th>
+								</tr>
+								<tr>
+									<th rowspan="2">等级</th>
+									<th rowspan="2">名称</th>
+									<th colspan="3">升级条件</th>
+									<th colspan="2">奖励</th>
+									<th colspan="4">分红</th>
+									<th rowspan="2">操作</th>
+								</tr>
+								<tr>
+									<th >直推</th>
+									<th >团队</th>
+									<th >下级</th>
+									<th >报单</th>
+									<th >复购</th>
+									<th >报单</th>
+									<th >复购</th>
+									<th >人数</th>
+									<th >金额</th>
+									
+								</tr>
+							</thead>
+							<tbody>
+								{if condition="isset($order['level'])"}
+								{php}$level = $order['level'];{/php}
+								{volist name="level" id="item"}
+								<tr>
+									<td><input type="text" name="value[level][{$key}][num]" value="{$item['num']}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][cname]" value="{$item['cname']}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][direct]" value="{$item['direct']|default='0'}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][team]" value="{$item['team']|default='0'}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][lower]" value="{$item['lower']}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][reward][report]" value="{$item['reward']['report']|default='0'}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][reward][repeat]" value="{$item['reward']['repeat']|default='0'}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][bonus][report]" value="{$item['bonus']['report']|default='0'}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][bonus][repeat]" value="{$item['bonus']['repeat']|default='0'}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][bonus][num]" value="{$item['bonus']['num']|default='0'}" class="layui-input"></td>
+									<td><input type="text" name="value[level][{$key}][bonus][amount]" value="{$item['bonus']['amount']|default='0'}" class="layui-input"></td>
+									<td><a href="javascript:;" class="layui-btn layui-btn-danger layui-btn-sm" onclick="layui.$(this).parents('tr').remove()">删除</a></td>
+								</tr>
+								{/volist}
+								{/if}
+							</tbody>
+						</table>
+					</div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">服务中心</label>
+				    <div class="layui-input-block">
+				    	<table class="layui-table">
+				    		<thead>
+				    			<tr>
+									<th >报单</th>
+									<th >复购</th>
+									<th >提现(%)</th>
+								</tr>
+				    		</thead>
+				    		<tbody>
+				    			<td><input type="text" name="value[center][report]" value="{$order['center']['report']|default='0'}" class="layui-input"></td>
+				    			<td><input type="text" name="value[center][repeat]" value="{$order['center']['repeat']|default='0'}" class="layui-input"></td>
+				    			<td><input type="text" name="value[center][withdraw]" value="{$order['center']['withdraw']|default='0'}" class="layui-input"></td>
+				    		</tbody>
+				    	</table>
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">用户分红</label>
+				    <div class="layui-input-block">
+				    	<table class="layui-table">
+				    		<thead>
+				    			<tr>
+									<th >报单</th>
+									<th >复购</th>
+									<th >封顶</th>
+									<th >累计</th>
+								</tr>
+				    		</thead>
+				    		<tbody>
+				    			<td><input type="text" name="value[bonus][report]" value="{$order['bonus']['report']|default='0'}" class="layui-input"></td>
+				    			<td><input type="text" name="value[bonus][repeat]" value="{$order['bonus']['repeat']|default='0'}" class="layui-input"></td>
+				    			<td><input type="text" name="value[bonus][limit]" value="{$order['bonus']['limit']|default='0'}" class="layui-input"></td>
+				    			<td><input type="text" name="value[bonus][amount]" value="{$order['bonus']['amount']|default='0'}" class="layui-input"></td>
+				    		</tbody>
+				    	</table>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+		,version:true
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'config']);
+</script>
+{/block}

+ 35 - 0
application/admin/view/config/other.html

@@ -0,0 +1,35 @@
+{extend name="public:base" /}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="key" value="other">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">客服微信</label>
+				    <div class="layui-input-inline">
+				      <input type="text" name="value[kefu][weixin]" value="{$other.kefu.weixin|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' //静态资源所在路径
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'config']);
+</script>
+{/block}

+ 116 - 0
application/admin/view/config/recharge.html

@@ -0,0 +1,116 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.file {border-width: 0px; width: auto; height: auto; margin-right: 10px;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="key" value="recharge">
+				<div class="layui-form-item">
+					<div class="layui-inline">
+						<label class="layui-form-label">限时</label>
+						<div class="layui-input-inline">
+							<input type="text" name="value[time_range]"  value="{$recharge.time_range|default=''}" autocomplete="off" class="layui-input">
+						</div>
+					</div>
+				</div>
+					<div class="layui-form-item">
+					<label class="layui-form-label">套餐</label>
+					<div class="layui-input-block">
+						<table class="layui-table package">
+							<thead>
+								<tr >
+									<th colspan="4">
+										<a href="javascript:;" class="layui-btn layui-btn-xs layui-package-add">添加</a>
+									</th>
+								</tr>
+								<tr>
+									<th>名称</th>
+									<th>充值金额</th>
+									<th>赠送金额</th>
+									<th>操作</th>
+								</tr> 
+							</thead>
+							<tbody>
+								{if condition="isset($recharge['package'])"}
+								{php}$package = $recharge['package'];{/php}
+								{volist name="package" id="item"}
+								<tr>
+								<td><input type="text" name="value[package][{$key}][cname]" value="{$item['cname']}" class="layui-input"></td>
+								<td><input type="text" name="value[package][{$key}][amount]" value="{$item['amount']}" class="layui-input"></td>
+								<td><input type="text" name="value[package][{$key}][give_amount]" value="{$item['give_amount']}" class="layui-input"></td>
+								<td><a href="javascript:;" class="layui-btn layui-btn-danger layui-btn-sm" onclick="layui.$(this).parents('tr').remove()">删除</a></td>
+								</tr>
+								{/volist}
+								{/if}
+							</tbody>
+						</table>
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">账户</label>
+					<div class="layui-input-block">
+						<table class="layui-table account">
+							<thead>
+								<tr >
+									<th colspan="4">
+										<a href="javascript:;" class="layui-btn layui-btn-xs layui-account-add">添加</a>
+									</th>
+								</tr>
+								<tr>
+									<th>名称</th>
+									<th>地址</th>
+									<th>操作</th>
+								</tr> 
+							</thead>
+							<tbody>
+								{if condition="isset($recharge['account'])"}
+								{php}$account = $recharge['account'];{/php}
+								{volist name="account" id="item"}
+								<tr>
+								<td><input type="text" name="value[account][{$i - 1}][cname]" value="{$item['cname']}" class="layui-input"></td>
+								<td><input type="text" name="value[account][{$i - 1}][qrcode]" value="{$item['qrcode']}" class="layui-input"></td>
+								<td>
+									<a href="javascript:;" class="layui-btn layui-btn-sm file" data-name="value[account][{$i - 1}][qrcode]">上传</a>
+									<a href="javascript:;" class="layui-btn layui-btn-danger layui-btn-sm" onclick="layui.$(this).parents('tr').remove()">删除</a>
+								</td>
+								</tr>
+								{/volist}
+								{/if}
+							</tbody>
+						</table>
+					</div>
+				</div>
+				<div class="layui-form-item layui-form-text">
+				    <label class="layui-form-label">提示</label>
+				    <div class="layui-input-block">
+				      <textarea name="value[tips]" placeholder="请输入内容" class="layui-textarea">{$recharge.tips|default=''}</textarea>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+		,version:true
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'config']);
+</script>
+{/block}

+ 41 - 0
application/admin/view/config/signin.html

@@ -0,0 +1,41 @@
+{extend name="public:base" /}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="key" value="signin">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">奖励</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="value[reward][single]" value="{$signin.reward.single|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item layui-form-text">
+				    <label class="layui-form-label">规则</label>
+				    <div class="layui-input-block">
+				      <textarea name="value[desc]" placeholder="请输入内容" class="layui-textarea">{$signin.desc|default=''}</textarea>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' //静态资源所在路径
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'config']);
+</script>
+{/block}

+ 101 - 0
application/admin/view/config/site.html

@@ -0,0 +1,101 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.file{   border: 1px solid #D2D2D2;width: 128px;height: 128px;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">站点设置</div>
+		<div class="layui-card-body">
+			<form class="layui-form" lay-filter="LAY-site-edit">
+				<input type="hidden" name="key" value="site">
+				<div class="layui-form-item">
+					<label class="layui-form-label">首页LOGO</label>
+					<div class="layui-input-block">
+						<input type="hidden" name="value[logo]" value="{$site.logo|default=''}">
+						{if condition="empty($site['logo'])"}
+						<img src="__STATIC__/images/default_image.gif" class="file" data-name="value[logo]">
+						{else /}
+						<img src="{$site.logo}" class="file" data-name="value[logo]">
+						{/if}
+					</div>
+				</div>
+			  	<div class="layui-form-item">
+				    <label class="layui-form-label">站点名称</label>
+				    <div class="layui-input-inline">
+				      	<input type="text" name="value[cname]" value="{$site.cname}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+			  	</div>
+			  	<div class="layui-form-item">
+				    <label class="layui-form-label">站点简称</label>
+				    <div class="layui-input-inline">
+				      	<input type="text" name="value[sname]" value="{$site.sname}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+			  	</div>
+			  	<div class="layui-form-item">
+				    <label class="layui-form-label">站点简述</label>
+				    <div class="layui-input-block">
+				      	<input type="text" name="value[sdesc]" value="{$site.sdesc|default=''}" autocomplete="off" class="layui-input">
+				    </div>
+			  	</div>
+			  	<div class="layui-form-item layui-form-text">
+				    <label class="layui-form-label">META关键词</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="value[keywords]" value="{$site.keywords}" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item layui-form-text">
+				    <label class="layui-form-label">META描述</label>
+				    <div class="layui-input-block">
+				      <textarea name="value[description]" class="layui-textarea">{$site.description}</textarea>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-form-text">
+				    <label class="layui-form-label">版权信息</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="value[copyright]" value="{$site.copyright}"  autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item layui-form-text">
+				    <label class="layui-form-label">工信部备案</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="value[beian]" value="{$site.beian}"  autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item layui-form-text">
+				    <label class="layui-form-label">公安部备案</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="value[beian1]" value="{$site.beian1|default=''}"  autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item layui-form-text">
+				    <label class="layui-form-label">隐藏代码</label>
+				    <div class="layui-input-block">
+				      <textarea name="value[hidden]" class="layui-textarea">{$site.hidden|default=''}</textarea>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'config']);
+</script>
+{/block}

+ 56 - 0
application/admin/view/config/sms.html

@@ -0,0 +1,56 @@
+{extend name="public:base" /}
+
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" >
+				<input type="hidden" name="key" value="sms">
+				<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+					<ul class="layui-tab-title">
+						<li class="layui-this">手机短信</li>
+					</ul>
+					<div class="layui-tab-content">
+						<div class="layui-tab-item layui-show">
+							<div class="layui-form-item">
+								<label class="layui-form-label">签名</label>
+								<div class="layui-input-inline">
+									<input type="text" name="value[mobile][sign]" value="{$sms.mobile.sign|default=''}" autocomplete="off" class="layui-input">
+								</div>
+							</div>
+							<div class="layui-form-item">
+								<label class="layui-form-label">随机码</label>
+								<div class="layui-input-inline">
+									<input type="text" name="value[mobile][code]" value="{$sms.mobile.code|default=''}" autocomplete="off" class="layui-input">
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+		,version:true
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'config']);
+</script>
+{/block}

+ 60 - 0
application/admin/view/config/withdraw.html

@@ -0,0 +1,60 @@
+{extend name="public:base" /}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="key" value="withdraw">
+				<div class="layui-form-item">
+					<label class="layui-form-label">开放时间</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="value[open][time]" value="{$withdraw.open.time|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+				    </div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">手续费率</label>
+					<div class="layui-input-inline">
+						<input type="text" name="value[fee_rate]" value="{$withdraw.fee_rate|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+					</div>
+					<div class="layui-form-mid layui-word-aux">%</div>
+				</div>
+				<div class="layui-form-item">
+					<div class="layui-inline">
+						<label class="layui-form-label">限额 </label>
+						<div class="layui-input-inline" style="width: 100px;">
+							<input type="text" name="value[min]" placeholder="¥" value="{$withdraw.min|default=''}" autocomplete="off" class="layui-input">
+						</div>
+						<div class="layui-form-mid">-</div>
+						<div class="layui-input-inline" style="width: 100px;">
+							<input type="text" name="value[max]" placeholder="¥" value="{$withdraw.max|default=''}" autocomplete="off" class="layui-input">
+						</div>
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">倍数</label>
+					<div class="layui-input-inline">
+						<input type="text" name="value[bei]" value="{$withdraw.bei|default=''}"  lay-verify="required" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-config-save">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'config']);
+</script>
+{/block}

+ 87 - 0
application/admin/view/coupon/add.html

@@ -0,0 +1,87 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.goods-type {    clear: both; margin-top: 10px;}
+	.goods-type  .item{display: inline-block;border: 1px solid #d6d6d6;margin-right: 5px;}
+	.goods-type  .item span{    padding: 0px 10px; border-right: 1px solid #d6d6d6;}
+	.goods-type  .layui-icon-close{cursor: pointer;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<label class="layui-form-label">编码</label>
+					<div class="layui-input-inline">
+						<input type="text" name="no" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">名称</label>
+					<div class="layui-input-inline">
+						<input type="text" name="cname" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">类型</label>
+					<div class="layui-input-inline">
+						<select name="type_id" lay-verify="" lay-search>
+							{volist name="types" id="type"}
+							<option value="{$type.id}">{$type.cname}</option>
+							{/volist}
+						</select>       
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">供应商</label>
+					<div class="layui-input-inline">
+						<select name="supplier_id" lay-verify="" lay-search>
+							{volist name="suppliers" id="supplier"}
+							<option value="{$supplier.id}">{$supplier.cname}</option>
+							{/volist}
+						</select>       
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">供应价</label>
+					<div class="layui-input-inline">
+						<input type="number" name="supply_price" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">销售价</label>
+					<div class="layui-input-inline">
+						<input type="number" name="sale_price" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">销售时间</label>
+					<div class="layui-input-inline" style="width:300px;">
+						<input type="text" name="sale_time" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-coupon-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+		,version:true
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'coupon']);
+</script>
+{/block}

+ 85 - 0
application/admin/view/coupon/code/add.html

@@ -0,0 +1,85 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<label class="layui-form-label">电子券</label>
+					<div class="layui-input-inline">
+						<select name="coupon_id" lay-search lay-filter="coupon">
+							<option value="">请选择</option>
+							{volist name="coupon_group" id="group"}
+							<optgroup label="{$group.cname}">
+								{volist name="group.options" id="coupon"}
+								<option value="{$coupon.id}" data-type-name="{$coupon.type_name}">{$coupon.cname}</option>
+								{/volist}
+							</optgroup>
+							{/volist}
+						</select>       
+					</div>
+				</div>
+				<div class="layui-form-item type no" style="display:none;">
+					<label class="layui-form-label">卡号</label>
+					<div class="layui-input-inline">
+						<input type="text" name="no" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item type secret" style="display:none;">
+					<label class="layui-form-label">卡密</label>
+					<div class="layui-input-inline">
+						<input type="text" name="secret" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item type qrcode" style="display:none;">
+					<label class="layui-form-label">二维码</label>
+					<div class="layui-input-inline">
+						<input type="hidden" name="qrcode" value="">
+						<img src="__STATIC__/images/default_image.gif" class="file" data-name="qrcode"> 
+					</div>
+				</div>
+				<div class="layui-form-item type barcode" style="display:none;">
+					<label class="layui-form-label">二维码</label>
+					<div class="layui-input-inline">
+						<input type="hidden" name="barcode" value="">
+						<img src="__STATIC__/images/default_image.gif" class="file" data-name="barcode"> 
+					</div>
+				</div>
+				<div class="layui-form-item type url" style="display:none;">
+					<label class="layui-form-label">链接</label>
+					<div class="layui-input-block">
+						<input type="text" name="url" autocomplete="off" class="layui-input">   
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">有效期</label>
+					<div class="layui-input-inline" style="width:300px;">
+						<input type="text" name="expire_time" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-code-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+		,version:true
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'coupon/code']);
+</script>
+{/block}

+ 86 - 0
application/admin/view/coupon/code/edit.html

@@ -0,0 +1,86 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="id" value="{$code.id}">
+				<div class="layui-form-item">
+					<label class="layui-form-label">电子券</label>
+					<div class="layui-input-inline">
+						<select name="coupon_id" lay-search lay-filter="coupon">
+							<option value="">请选择</option>
+							{volist name="coupon_group" id="group"}
+							<optgroup label="{$group.cname}">
+								{volist name="group.options" id="coupon"}
+								<option value="{$coupon.id}" data-type-name="{$coupon.type_name}" {if condition="$code['coupon']['id'] eq $coupon['id']"}selected{/if}>{$coupon.cname}</option>
+								{/volist}
+							</optgroup>
+							{/volist}
+						</select>       
+					</div>
+				</div>
+				<div class="layui-form-item type no" {if condition="$code['coupon']['type']['name'] neq 'no' && $code['coupon']['type']['name'] neq 'secret'"}style="display:none;"{/if}>
+					<label class="layui-form-label">卡号</label>
+					<div class="layui-input-inline">
+						<input type="text" name="no" value="{$code.no}" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item type secret" {if condition="$code['coupon']['type']['name'] neq 'secret'"}style="display:none;"{/if}>
+					<label class="layui-form-label">卡密</label>
+					<div class="layui-input-inline">
+						<input type="text" name="secret" value="{$code.secret}" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item type qrcode" {if condition="$code['coupon']['type']['name'] neq 'qrcode'"}style="display:none;"{/if}>
+					<label class="layui-form-label">二维码</label>
+					<div class="layui-input-inline">
+						<input type="hidden" name="qrcode" value="{$code.qrcode}">
+						<img src="{:empty($code.qrcode)?'__STATIC__/images/default_image.gif':$code.qrcode}" class="file" data-name="qrcode"> 
+					</div>
+				</div>
+				<div class="layui-form-item type barcode" {if condition="$code['coupon']['type']['name'] neq 'barcode'"}style="display:none;"{/if}>
+					<label class="layui-form-label">二维码</label>
+					<div class="layui-input-inline">
+						<input type="hidden" name="barcode" value="{$code.barcode}">
+						<img src="{:empty($code.barcode)?'__STATIC__/images/default_image.gif':$code.barcode}" class="file" data-name="barcode"> 
+					</div>
+				</div>
+				<div class="layui-form-item type url" {if condition="$code['coupon']['type']['name'] neq 'url'"}style="display:none;"{/if}>
+					<label class="layui-form-label">链接</label>
+					<div class="layui-input-block">
+						<input type="text" name="url" value="{$code.url}" autocomplete="off" class="layui-input">   
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">有效期</label>
+					<div class="layui-input-inline" style="width:300px;">
+						<input type="text" name="expire_time" value="{$code.expire_time}" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-code-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+		,version:true
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'coupon/code']);
+</script>
+{/block}

+ 50 - 0
application/admin/view/coupon/code/index.html

@@ -0,0 +1,50 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" style="margin-bottom: 10px;">
+				<div class="layui-inline">
+					<input type="text" name="no"  placeholder="卡号、卡密" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					<input type="text" name="search"  placeholder="关键词检索" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn layui-btn-primary layui-btn-sm" lay-submit lay-filter="LAY-code-search">搜索</button>
+				</div>
+			</form>
+			<div id="code-table" lay-filter="code"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container">
+		<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="add">添加</a>
+		<a class="layui-btn layui-btn-normal layui-btn-sm import">导入</a>
+	</div>
+</script>
+
+<script type="text/html" id="switchState">
+	<input type="checkbox" name="state" value="1" lay-skin="switch" lay-text="上架|下架" lay-filter="state" data-id="{{ d.id }}" {{ d.state == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="rowToolbar">
+	<a class="layui-btn layui-btn-normal layui-btn-xs " lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'coupon/code']);
+</script>
+{/block}

+ 88 - 0
application/admin/view/coupon/edit.html

@@ -0,0 +1,88 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.goods-type {    clear: both; margin-top: 10px;}
+	.goods-type  .item{display: inline-block;border: 1px solid #d6d6d6;margin-right: 5px;}
+	.goods-type  .item span{    padding: 0px 10px; border-right: 1px solid #d6d6d6;}
+	.goods-type  .layui-icon-close{cursor: pointer;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="id" value="{$coupon.id}">
+				<div class="layui-form-item">
+					<label class="layui-form-label">编码</label>
+					<div class="layui-input-inline">
+						<input type="text" name="no" value="{$coupon.no}" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">名称</label>
+					<div class="layui-input-inline">
+						<input type="text" name="cname" value="{$coupon.cname}" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">类型</label>
+					<div class="layui-input-inline">
+						<select name="type_id" lay-verify="" lay-search>
+							{volist name="types" id="type"}
+							<option value="{$type.id}" {if condition="$coupon['type']['id'] eq $type['id']"}selected{/if}>{$type.cname}</option>
+							{/volist}
+						</select>       
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">供应商</label>
+					<div class="layui-input-inline">
+						<select name="supplier_id" lay-verify="" lay-search>
+							{volist name="suppliers" id="supplier"}
+							<option value="{$supplier.id}" {if condition="$coupon['supplier']['id'] eq $supplier['id']"}selected{/if}>{$supplier.cname}</option>
+							{/volist}
+						</select>       
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">供应价</label>
+					<div class="layui-input-inline">
+						<input type="number" name="supply_price" value="{$coupon.supply_price}"  autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">销售价</label>
+					<div class="layui-input-inline">
+						<input type="number" name="sale_price" value="{$coupon.sale_price}"  autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">销售时间</label>
+					<div class="layui-input-inline" style="width:300px;">
+						<input type="text" name="sale_time" value="{$coupon.sale_time}"  autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-coupon-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+		,version:true
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'coupon']);
+</script>
+{/block}

+ 46 - 0
application/admin/view/coupon/index.html

@@ -0,0 +1,46 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" style="margin-bottom: 10px;">
+				<div class="layui-inline">
+					<input type="text" name="search"  placeholder="关键词检索" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn layui-btn-primary layui-btn-sm" lay-submit lay-filter="LAY-coupon-search">搜索</button>
+				</div>
+			</form>
+			<div id="coupon-table" lay-filter="coupon"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container">
+		<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="add">添加</a>
+	</div>
+</script>
+
+<script type="text/html" id="switchState">
+	<input type="checkbox" name="state" value="1" lay-skin="switch" lay-text="上架|下架" lay-filter="state" data-id="{{ d.id }}" {{ d.state == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="rowToolbar">
+	<a class="layui-btn layui-btn-normal layui-btn-xs " lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'coupon']);
+</script>
+{/block}

+ 57 - 0
application/admin/view/customer/add.html

@@ -0,0 +1,57 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="cname" lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系人</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="truename" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系电话</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="mobile" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系地址</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="addess" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-customer-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'customer']);
+</script>
+{/block}

+ 58 - 0
application/admin/view/customer/edit.html

@@ -0,0 +1,58 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="id" value="{$customer.id}">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="cname" value="{$customer.cname}" lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系人</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="truename" value="{$customer.truename}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系电话</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="mobile" value="{$customer.mobile}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系地址</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="addess" value="{$customer.address}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-customer-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'customer']);
+</script>
+{/block}

+ 34 - 0
application/admin/view/customer/index.html

@@ -0,0 +1,34 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<div id="customer-table" lay-filter="customer"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container">
+		<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="add">添加</a>
+	</div>
+</script>
+
+<script type="text/html" id="rowToolbar">
+  	<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' 
+    ,version: true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'customer']);
+</script>
+{/block}

+ 138 - 0
application/admin/view/customer/order/add.html

@@ -0,0 +1,138 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.goods-type {    clear: both; margin-top: 10px;}
+	.goods-type  .item{display: inline-block;border: 1px solid #d6d6d6;margin-right: 5px;}
+	.goods-type  .item span{    padding: 0px 10px; border-right: 1px solid #d6d6d6;}
+	.goods-type  .layui-icon-close{cursor: pointer;}
+
+	.store-type {    clear: both; margin-top: 10px;}
+	.store-type  .item{display: inline-block;border: 1px solid #d6d6d6;margin-right: 5px;}
+	.store-type  .item span{    padding: 0px 10px; border-right: 1px solid #d6d6d6;}
+	.store-type  .layui-icon-close{cursor: pointer;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<label class="layui-form-label">客户名称</label>
+					<div class="layui-input-inline">
+						<select name="customer_id" lay-verify="" lay-search>
+							{volist name="customers" id="customer"}
+							<option value="{$customer.id}">{$customer.cname}</option>
+							{/volist}
+						</select>       
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">销售数量</label>
+					<div class="layui-input-inline">
+						<input type="number" name="num" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">面值</label>
+					<div class="layui-input-inline">
+						<input type="number" name="denomination" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">实付金额</label>
+					<div class="layui-input-inline">
+						<input type="number" name="pay_amount" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">有效期</label>
+					<div class="layui-input-inline" style="width:300px;">
+						<input type="text" name="expire_time" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">可用品类</label>
+					<div class="layui-input-block">
+						<div class="layui-input-inline">
+							<select name="goods_type_1" lay-verify="required" lay-filter="goods-type">
+								<option value="0">一级品类</option>
+							</select>
+						</div>
+						<div class="layui-input-inline">
+							<select name="goods_type_2"  lay-filter="goods-type">
+								<option value="0">二级品类</option>
+							</select>
+						</div>
+						<div class="layui-input-inline">
+							<select name="goods_type_3"  >
+								<option value="0">三级品类</option>
+							</select>
+						</div>
+						<div class="layui-input-inline">
+							<a href="javascript:;" class="layui-btn layui-btn-sm  layui-add-goods-type" style="    margin-top: 5px;">添加</a>
+						</div>
+					</div>
+					<div class="layui-input-block goods-type" style="display: none;">
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">店铺分类</label>
+					<div class="layui-input-block">
+						<div class="layui-input-inline">
+							<select name="store_type_1" lay-verify="required" lay-filter="store-type">
+								<option value="0">请选择分类</option>
+								{volist name="store_class" id="class"}
+									<option value="{$class.storeclass_id}">{$class.storeclass_name}</option>
+								{/volist}
+							</select>
+						</div>
+						<div class="layui-input-inline">
+							<a href="javascript:;" class="layui-btn layui-btn-sm  layui-add-store-type" style="    margin-top: 5px;">添加</a>
+						</div>
+					</div>
+					<div class="layui-input-block store-type" style="display: none;">
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<table class="layui-table card-number-ids">
+						<thead>
+							<tr >
+								<th colspan="10">
+									<a href="javascript:;" class="layui-btn layui-btn-xs layui-card-number-ids-add">添加</a>
+								</th>
+							</tr>
+							<tr>
+								<th >起始序号</th>
+								<th >结束序号</th>
+								<th >数量</th>
+								<th >操作</th>
+							</tr>
+						</thead>
+						<tbody >
+						</tbody>
+					</table>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-order-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+		base: '__JS__/'
+		,version:true
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'customer/order']);
+</script>
+{/block}

+ 41 - 0
application/admin/view/customer/order/index.html

@@ -0,0 +1,41 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" style="margin-bottom: 10px;">
+				<div class="layui-inline">
+					<input type="text" name="search"  placeholder="关键词检索" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn layui-btn-primary layui-btn-sm" lay-submit lay-filter="LAY-order-search">搜索</button>
+				</div>
+			</form>
+			<div id="order-table" lay-filter="order"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+  	<div class="layui-btn-container">
+	    <button class="layui-btn layui-btn-sm layui-btn-primary" lay-event="add">添加</button>
+  	</div>
+</script>
+
+<script type="text/html" id="rowToolbar">
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'customer/order']);
+</script>
+{/block}

+ 49 - 0
application/admin/view/goods/type/add.html

@@ -0,0 +1,49 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<input type="hidden" name="pid" value="{$parent.id}">
+				    <label class="layui-form-label">上级分类</label>
+				    <div class="layui-form-mid layui-word-aux">{$parent.cname|default='无'}</div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">标识</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="name" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="cname"  lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-type-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'article/type']);
+</script>
+{/block}

+ 53 - 0
application/admin/view/goods/type/edit.html

@@ -0,0 +1,53 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.btn-group{margin-bottom: 10px;}
+	.collapse-link{float: right;cursor: pointer;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="id" value="{$type.id}">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">上级分类</label>
+				    <div class="layui-form-mid layui-word-aux">{$type.parent.cname|default='无'}</div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">标识</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="name" value="{$type.name}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="cname" value="{$type.cname}" lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-type-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'article']);
+</script>
+{/block}

+ 52 - 0
application/admin/view/goods/type/index.html

@@ -0,0 +1,52 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.toolbar{margin-bottom: 10px;}
+	.collapse-link{float: right;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">
+			类型设置{if condition="!empty($parent)"} > {$parent['cname']}
+			<a class="collapse-link" onclick="history.go(-1)">返回</a>
+			{/if}
+		</div>
+		<div class="layui-card-body">
+			<input type="hidden" name="pid" value="{$parent['id']|default=0}">
+			<div id="type-table" lay-filter="type"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="switchState">
+  <input type="checkbox" name="state" value="1" lay-skin="switch" lay-text="正常|禁用" lay-filter="state" data-id="{{ d.id }}" {{ d.state == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="topToolbar">
+  	<div class="layui-btn-container">
+	    <button class="layui-btn layui-btn-sm layui-btn-primary" lay-event="add">添加</button>
+  	</div>
+</script>
+
+<script type="text/html" id="rowToolbar">
+	{{# if(d.children.length > 0){ }}
+	<a class="layui-btn layui-btn-xs" lay-event="children">子分类</a>
+	{{# }else{ }}
+	<a class="layui-btn layui-btn-xs" lay-event="add">添加</a>
+	{{# } }}
+  	<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'goods/type']);
+</script>
+{/block}

+ 56 - 0
application/admin/view/index/console.html

@@ -0,0 +1,56 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	h3{font-weight: 600;}
+	em{font-style: normal;color: red;}
+	.layui-quote-nm{background: #fff;}
+	div[carousel-item] div{padding-left: 10px;}
+	.layadmin-text-center{text-align: center;}
+	.layadmin-text-center img {max-width: 80%;border-radius: 50%;margin-top: 5px;}
+	.statistics h3{font-size: 12px;}
+	.statistics li a{  display: block; padding: 10px 15px; background-color: #f8f8f8;  color: #999;border-radius: 2px;  transition: all .3s; -webkit-transition: all .3s;}
+	.statistics p cite { font-style: normal; font-size: 30px; font-weight: 300;color: #009688;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15 statistics">
+		<div class="layui-col-md6" style="padding-left: 0px;">
+			<div class="layui-card" style="height: 176px;">
+				<div class="layui-card-header">账户信息</div>
+				<div class="layui-card-body">
+					<div class="layui-row">
+						<div class="layui-col-md2 layui-col-sm3">
+							<div class="layadmin-text-center">
+								<img src="__IMAGES__/character.jpg">
+							</div>
+						</div>
+						<div class="layui-col-md8 layadmin-padding-left20 layui-col-sm6">
+							<h3 class="layadmin-title">
+								<strong>{$user['name']}</strong>
+							</h3>
+							<div class="layadmin-address">
+								登录次数:{$user['login_times']}
+								<br/>
+								最后登陆IP:{$user['last_login_ip']}
+								<br/>
+								最后登陆时间:{$user['last_login_time']|date="Y-m-d H:m:i",###}
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index','console']);
+</script>
+{/block}

+ 136 - 0
application/admin/view/index/index.html

@@ -0,0 +1,136 @@
+{extend name="public:base" /}
+{block name="body"}
+<div id="LAY_app">
+	<div class="layui-layout layui-layout-admin">
+		<div class="layui-header">
+			<!-- 头部区域 -->
+			<ul class="layui-nav layui-layout-left">
+				<li class="layui-nav-item layadmin-flexible" lay-unselect="">
+					<a href="javascript:;" layadmin-event="flexible" title="侧边伸缩">
+						<i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
+					</a>
+				</li>
+				<li class="layui-nav-item layui-hide-xs" lay-unselect="">
+					<a href="{:url('index/index/index')}" target="_blank" title="前台">
+						<i class="layui-icon layui-icon-website"></i>
+					</a>
+				</li>
+				<li class="layui-nav-item" lay-unselect="">
+					<a href="javascript:;" layadmin-event="refresh" title="刷新">
+						<i class="layui-icon layui-icon-refresh-3"></i>
+					</a>
+				</li>
+			</ul>
+			<ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
+				<li class="layui-nav-item layui-hide-xs" lay-unselect="">
+					<a href="javascript:;" layadmin-event="fullscreen">
+						<i class="layui-icon layui-icon-screen-full"></i>
+					</a>
+				</li>
+				<li class="layui-nav-item" lay-unselect="">
+					<a href="javascript:;">
+						<cite>{$user['name']}</cite>
+						<span class="layui-nav-more"></span>
+					</a>
+					<dl class="layui-nav-child">
+						<dd><a href="javascript:;" class="lay-btn-changepwd">编辑信息</a></dd>
+						<hr>
+						<dd style="text-align: center;"><a href="{:url('admin/login/index')}">退出</a></dd>
+					</dl>
+					<
+				</li>
+
+				<li class="layui-nav-item layui-hide-xs" lay-unselect="">
+					<a href="javascript:;"><i class="layui-icon layui-icon-more-vertical"></i></a>
+				</li>
+			</ul>
+		</div>
+		<!-- 侧边菜单 -->
+		<div class="layui-side layui-side-menu">
+			<div class="layui-side-scroll">
+				<div class="layui-logo" lay-href="{:url('admin/index/console')}">
+		            <span>{$site.sname}</span>
+		        </div>
+		        <ul id="LAY-system-side-menu" class="layui-nav layui-nav-tree" lay-shrink="all" lay-filter="layadmin-system-side-menu">
+		        	{volist name="navis" id="navi"}
+					<li data-name="home" class="layui-nav-item" style="">
+						{php}$children = $navi['children'];{/php}
+						{if condition="count($children) > 0"}
+		              	<a href="javascript:;" lay-tips="{$navi.cname}" lay-direction="2">
+			                <i class="layui-icon layui-icon-{$navi.icon}"></i>
+			                <cite>{$navi.cname}</cite>
+			              	<span class="layui-nav-more"></span>
+		              	</a>
+		              	<dl class="layui-nav-child">
+		              		{volist name="children" id="subnavi"}
+			                <dd data-name="console" class="">
+			                  <a lay-href="{$subnavi.url}">{$subnavi.cname}</a>
+			                </dd>
+			                {/volist}
+		              	</dl>
+		              	{else /}
+		              	<a href="javascript:;" lay-href="{$navi.url}" lay-tips="{$navi.cname}" lay-direction="2">
+			                <i class="layui-icon layui-icon-{$navi.icon}"></i>
+			                <cite>{$navi.cname}</cite>
+		              	</a>
+		              	{/if}
+		            </li>
+		            {/volist}
+		        </ul>
+			</div>
+		</div>
+		<!-- 页面标签 -->
+		<div id="LAY_app_tabs" class="layadmin-pagetabs">
+			<div class="layui-icon layadmin-tabs-control layui-icon-prev" layadmin-event="leftPage"></div>
+			<div class="layui-icon layadmin-tabs-control layui-icon-next" layadmin-event="rightPage"></div>
+			<div class="layui-icon layadmin-tabs-control layui-icon-down">
+	          	<ul class="layui-nav layadmin-tabs-select" lay-filter="layadmin-pagetabs-nav">
+		            <li class="layui-nav-item" lay-unselect="">
+		              <a href="javascript:;"><span class="layui-nav-more"></span></a>
+		              <dl class="layui-nav-child layui-anim-fadein">
+		                <dd layadmin-event="closeThisTabs"><a href="javascript:;">关闭当前标签页</a></dd>
+		                <dd layadmin-event="closeOtherTabs"><a href="javascript:;">关闭其它标签页</a></dd>
+		                <dd layadmin-event="closeAllTabs"><a href="javascript:;">关闭全部标签页</a></dd>
+		              </dl>
+		            </li>
+			        <span class="layui-nav-bar"></span>
+		      	</ul>
+	        </div>
+	        <div class="layui-tab" lay-unauto lay-allowclose="true" lay-filter="layadmin-layout-tabs">
+				<ul class="layui-tab-title" id="LAY_app_tabsheader">
+	            	<li lay-id="{:url('admin/index/console')}" lay-attr="{:url('admin/index/console')}" class="layui-this" style="">
+	            		<i class="layui-icon layui-icon-console"></i><i class="layui-icon layui-unselect layui-tab-close"></i></li>
+	          	</ul>
+			</div>
+		</div>
+		<!--  主体内容  -->
+		<div id="LAY_app_body" class="layui-body">
+			<div class="layadmin-tabsbody-item layui-show">
+				<iframe class="layadmin-iframe" src="{:url('admin/index/console')}" frameborder="0"></iframe>
+			</div>
+		</div>
+	</div>	
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+  layui.config({
+    base: '__JS__/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+  }).use(['index','layim'],function(){
+  	var s = layui.$,
+  	layim = layui.layim;
+  		s('.lay-btn-changepwd').on('click',function(){
+			layer.open({
+				type: 2,
+				title: '修改密码',
+				shadeClose: true,
+				shade: true,
+				area: ['500px', '80%'],
+				content: '{:url("admin/changepwd")}'
+			});
+  		})
+  });
+</script>
+{/block}

+ 26 - 0
application/admin/view/log/index.html

@@ -0,0 +1,26 @@
+{extend name="public:base" /}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<input type="hidden" name="position" value="{:input('param.position')}">
+			<div id="log-table" lay-filter="log"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="rowToolbar">
+  	<a class="layui-btn layui-btn-xs" lay-event="params">查看参数</a>
+</script>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/',
+    version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'log']);
+</script>
+{/block}

+ 24 - 0
application/admin/view/log/params.html

@@ -0,0 +1,24 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-fluid{padding: 0;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<pre class="layui-code">{$log['params']}</pre>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'log']);
+</script>
+{/block}

+ 84 - 0
application/admin/view/login/forget.html

@@ -0,0 +1,84 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+#LAY_app,body,html {height:100%}
+body{background-image: url('__IMAGES__/login_bg.jpg');background-size: 100% 100%;}
+.layadmin-user-login {position:relative;left:0;top:0;padding:110px 0;min-height:100%;box-sizing:border-box}
+.layadmin-user-login-main {width:375px;margin:0 auto;box-sizing:border-box;    background-color: #fff;   opacity: 0.9;}
+.layadmin-user-login-box {padding:20px}
+.layadmin-user-login-header {text-align:center}
+.layadmin-user-login-header h2 {margin-bottom:10px;font-weight:300; font-size:30px;color:#000}
+.layadmin-user-login-header p {font-weight:300;color:#999}
+.layadmin-user-login-body .layui-form-item {position:relative}
+.layadmin-user-login-icon {position:absolute;left:1px;top:1px;width:38px;line-height:36px;text-align:center;color:#d2d2d2}
+.layadmin-user-login-body .layui-form-item .layui-input {padding-left:38px}
+.layadmin-user-login-codeimg {height:38px;width:100%;cursor:pointer;box-sizing:border-box}
+.layadmin-user-login-other {position:relative;font-size:0;line-height:38px;padding-top:20px}
+.layadmin-user-login-other>* {display:inline-block;vertical-align:middle;margin-right:10px;font-size:14px}
+.layadmin-user-login-other .layui-icon {position:relative;top:2px;font-size:26px}
+.layadmin-user-login-other a:hover {opacity:.8}
+.layadmin-user-jump-change {float:right}
+.layadmin-user-login-footer {position:absolute;left:0;bottom:0;width:100%;line-height:30px;padding:20px;text-align:center;box-sizing:border-box;color:rgba(0,0,0,.5)}
+.layadmin-user-login-footer span {padding:0 5px}
+.layadmin-user-login-footer a {padding:0 5px;color:rgba(0,0,0,.5)}
+.layadmin-user-login-footer a:hover {color:rgba(0,0,0,1)}
+.layadmin-user-login-main[bgimg] {background-color:#fff;box-shadow:0 0 5px rgba(0,0,0,.05)}
+.ladmin-user-login-theme {position:fixed;bottom:0;left:0;width:100%;text-align:center}
+.ladmin-user-login-theme ul {display:inline-block;padding:5px;background-color:#fff}
+.ladmin-user-login-theme ul li {display:inline-block;vertical-align:top;width:64px;height:43px;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;background-color:#f2f2f2}
+.ladmin-user-login-theme ul li:hover {opacity:.9}
+@media screen and (max-width:768px) {
+	.layadmin-user-login {padding-top:60px}
+	.layadmin-user-login-main {width:300px}
+	.layadmin-user-login-box {padding:10px}
+}
+
+</style>
+{/block}
+{block name="body"}
+<div class="layadmin-user-login" id="LAY-user-login">
+
+	<div class="layadmin-user-login-main">
+		<div class="layadmin-user-login-box layadmin-user-login-body layui-form">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<label class="layadmin-user-login-icon layui-icon layui-icon-username"></label>
+					<input name="username" lay-verify="required" placeholder="用户名" class="layui-input" type="text">
+				</div>
+				<div class="layui-form-item">
+					<label class="layadmin-user-login-icon layui-icon layui-icon-password"></label>
+					<input name="password" lay-verify="required" placeholder="新的密码" class="layui-input" type="password">
+				</div>
+				<div class="layui-form-item">
+					<label class="layadmin-user-login-icon layui-icon layui-icon-cellphone"></label>
+					<input name="mobile" lay-verify="required" placeholder="手机号" class="layui-input" type="text">
+				</div>
+				<div class="layui-form-item ">
+						<div class="layui-row">
+							<div class="layui-col-xs7">
+								<label class="layadmin-user-login-icon layui-icon layui-icon-vercode"></label>
+								<input type="text" name="smscode" id="LAY-user-login-vercode"  placeholder="请输入验证码" class="layui-input">
+							</div>
+							<div class="layui-col-xs5">
+								<a href="javascript:;"  class="layui-btn  layui-btn-normal layui-btn-fluid btn-sendsms">获取验证码</a>
+							</div>
+						</div>
+				</div>
+				<div class="layui-form-item">
+					<a class="layui-btn layui-btn-fluid layui-btn-normal" lay-submit="" lay-filter="LAY-login-forget">重 置</a>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'login']);
+</script>
+{/block}

+ 91 - 0
application/admin/view/login/index.html

@@ -0,0 +1,91 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+#LAY_app,body,html {height:100%}
+body{background-image: url('__IMAGES__/login_bg.jpg');background-size: 100% 100%;}
+.layadmin-user-login {position:relative;left:0;top:0;padding:110px 0;min-height:100%;box-sizing:border-box}
+.layadmin-user-login-main {width:375px;margin:0 auto;box-sizing:border-box;    background-color: #fff;   opacity: 0.9;}
+.layadmin-user-login-box {padding:20px}
+.layadmin-user-login-header {text-align:center}
+.layadmin-user-login-header h2 {margin-bottom:10px;font-weight:300; font-size:30px;color:#000}
+.layadmin-user-login-header p {font-weight:300;color:#999}
+.layadmin-user-login-body .layui-form-item {position:relative}
+.layadmin-user-login-icon {position:absolute;left:1px;top:1px;width:38px;line-height:36px;text-align:center;color:#d2d2d2}
+.layadmin-user-login-body .layui-form-item .layui-input {padding-left:38px}
+.layadmin-user-login-codeimg {height:38px;width:100%;cursor:pointer;box-sizing:border-box}
+.layadmin-user-login-other {position:relative;font-size:0;line-height:38px;padding-top:20px}
+.layadmin-user-login-other>* {display:inline-block;vertical-align:middle;margin-right:10px;font-size:14px}
+.layadmin-user-login-other .layui-icon {position:relative;top:2px;font-size:26px}
+.layadmin-user-login-other a:hover {opacity:.8}
+.layadmin-user-jump-change {float:right}
+.layadmin-user-login-footer {position:absolute;left:0;bottom:0;width:100%;line-height:30px;padding:20px;text-align:center;box-sizing:border-box;color:rgba(0,0,0,.5)}
+.layadmin-user-login-footer span {padding:0 5px}
+.layadmin-user-login-footer a {padding:0 5px;color:rgba(0,0,0,.5)}
+.layadmin-user-login-footer a:hover {color:rgba(0,0,0,1)}
+.layadmin-user-login-main[bgimg] {background-color:#fff;box-shadow:0 0 5px rgba(0,0,0,.05)}
+.ladmin-user-login-theme {position:fixed;bottom:0;left:0;width:100%;text-align:center}
+.ladmin-user-login-theme ul {display:inline-block;padding:5px;background-color:#fff}
+.ladmin-user-login-theme ul li {display:inline-block;vertical-align:top;width:64px;height:43px;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;background-color:#f2f2f2}
+.ladmin-user-login-theme ul li:hover {opacity:.9}
+@media screen and (max-width:768px) {
+	.layadmin-user-login {padding-top:60px}
+	.layadmin-user-login-main {width:300px}
+	.layadmin-user-login-box {padding:10px}
+}
+
+</style>
+{/block}
+{block name="body"}
+<div class="layadmin-user-login" id="LAY-user-login">
+
+	<div class="layadmin-user-login-main">
+		<div class="layadmin-user-login-box layadmin-user-login-header">
+			<h2>{$site.sname}</h2>
+			<p>管理中心</p>
+		</div>
+		<div class="layadmin-user-login-box layadmin-user-login-body layui-form">
+			<form class="layui-form">
+				<div class="layui-form-item">
+					<label class="layadmin-user-login-icon layui-icon layui-icon-username"></label>
+					<input name="username" lay-verify="required" placeholder="用户名" class="layui-input" type="text">
+				</div>
+				<div class="layui-form-item">
+					<label class="layadmin-user-login-icon layui-icon layui-icon-password"></label>
+					<input name="password" lay-verify="required" placeholder="密码" class="layui-input" type="password">
+				</div>
+				{if condition="config('captcha.on')"}
+				<div class="layui-form-item">
+					<div class="layui-row">
+						<div class="layui-col-xs7">
+							<label class="layadmin-user-login-icon layui-icon layui-icon-vercode"></label>
+							<input name="vercode" lay-verify="required" placeholder="图形验证码" class="layui-input" type="text">
+						</div>
+						<div class="layui-col-xs5">
+							<div style="margin-left: 10px;">
+								<img src="{:captcha_src()}" class="layadmin-user-login-codeimg" id="LAY-get-vercode">
+							</div>
+						</div>
+					</div>
+				</div>
+				{/if}
+				<div class="layui-form-item">
+					<a href="{:url('login/forget')}">忘记密码</a>
+				</div>
+				<div class="layui-form-item">
+					<a class="layui-btn layui-btn-fluid layui-btn-normal" lay-submit="" lay-filter="LAY-login-submit">登 录</a>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+    base: '__JS__/' //静态资源所在路径
+    ,version: true
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'login']);
+</script>
+{/block}

+ 104 - 0
application/admin/view/navi/add.html

@@ -0,0 +1,104 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+.layui-fluid{padding: 0;}
+.btn-group{margin-bottom: 10px;}
+.collapse-link{float: right;cursor: pointer;}
+	#banners .layui-col-md3{padding-right: 7.5px;}
+	#banners img{width: 100%;}
+	#banners i{position: absolute;color: #fff;right: 12px;top: 5px;background-color: #ff5722;border-radius: 50%;width: 16px;height: 16px;text-align: center;line-height: 16px;top: 5px;
+	}
+	#banner{   border: 1px solid #D2D2D2;width: 128px !important}
+	.layui-row::after, .layui-row::before {display: none;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" lay-filter="LAY-navi-add">
+				{if condition="empty($pnavi)"}
+				<input type="hidden" name="position" value="{$position}">
+				{else /}
+				<input type="hidden" name="position" value="{$pnavi.position}">
+				{/if}
+				<div class="layui-form-item">
+					<input type="hidden" name="pid" value="{$pnavi.id}">
+					<label class="layui-form-label">上级菜单</label>
+					<div class="layui-form-mid layui-word-aux">{$pnavi.cname|default='无'}</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">标识</label>
+					<div class="layui-input-inline">
+						<input type="text" name="name" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">名称</label>
+					<div class="layui-input-block">
+						<input type="text" name="cname"  lay-verify="required" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">图标</label>
+					<div class="layui-input-inline">
+						<input type="text" name="icon" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">图片</label>
+					<div class="layui-input-block">
+						<input type="hidden" name="image" value="">
+						<img src="__STATIC__/images/default_image.gif" class="file" data-name="image">
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">动作</label>
+					<div class="layui-input-block">
+						<input type="text" name="action" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">参数</label>
+					<div class="layui-input-block">
+						<input type="text" name="params" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">打开方式</label>
+					<div class="layui-input-block">
+						<input type="radio" name="target" value="_self" title="默认方式" checked>
+						<input type="radio" name="target" value="_blank" title="新选项卡">
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">类型</label>
+					<div class="layui-input-block">
+						<input type="radio" name="type" value="1" title="菜单" checked>
+						<input type="radio" name="type" value="2" title="权限" >
+						<input type="radio" name="type" value="3" title="菜单+权限" >
+					</div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-navi-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+	layui.config({
+    base: '__JS__/' //静态资源所在路径
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'navi']);
+</script>
+{/block}

+ 97 - 0
application/admin/view/navi/edit.html

@@ -0,0 +1,97 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-fluid{padding: 0;}
+	.btn-group{margin-bottom: 10px;}
+	.collapse-link{float: right;cursor: pointer;}
+	#banners .layui-col-md3{padding-right: 7.5px;}
+	#banners img,#banners video{width: 100%;}
+	#banners i{position: absolute;color: #fff;right: 12px;top: 5px;background-color: #ff5722;border-radius: 50%;width: 16px;height: 16px;text-align: center;line-height: 16px;top: 5px;
+	}
+	#banner{   border: 1px solid #D2D2D2;width: 128px !important}
+	.layui-row::after, .layui-row::before {display: none;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" lay-filter="LAY-navi-edit">
+				<input type="hidden" name="id" value="{$navi.id}">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">上级导航</label>
+				    <div class="layui-form-mid layui-word-aux">{$navi['pnavi']['cname']|default='无'}</div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">标识</label>
+					<div class="layui-input-inline">
+						<input type="text" name="name" value="{$navi.name}" autocomplete="off" class="layui-input">     
+					</div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="cname" value="{$navi.cname}"  lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">图标</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="icon" value="{$navi.icon}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+					<label class="layui-form-label">图片</label>
+					<div class="layui-input-block">
+						<input type="hidden" name="image" value="{$navi.image}">
+						{if condition="empty($navi['image'])"}
+						<img src="__STATIC__/images/default_image.gif" class="file" data-name="image">
+						{else /}
+						<img src="{$navi.image}" class="file" data-name="image">
+						{/if}
+					</div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">动作</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="action" value="{$navi.action}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">打开方式</label>
+				    <div class="layui-input-block">
+				      <input type="radio" name="target" value="_self" title="默认方式" {if condition="empty($navi['target']) || $navi['target'] eq '_self'"} checked {/if}>
+				      <input type="radio" name="target" value="_blank" {if condition="$navi['target'] eq '_blank'"} checked {/if} title="新选项卡">
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">类型</label>
+				    <div class="layui-input-block">
+				      <input type="radio" name="type" value="1" title="导航" {if condition="$navi['type'] eq '1'"} checked {/if}>
+				      <input type="radio" name="type" value="2" title="权限" {if condition="$navi['type'] eq '2'"} checked {/if}>
+				      <input type="radio" name="type" value="3" title="导航+权限" {if condition="$navi['type'] eq '3'"} checked {/if}>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-navi-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' //静态资源所在路径
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'navi']);
+</script>
+{/block}

+ 66 - 0
application/admin/view/navi/index.html

@@ -0,0 +1,66 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	input,dl{font-size: 14px;}
+	.layui-input{height: 30px !important;}
+	.toolbar{margin-bottom: 10px;}
+	.pl16{padding-left: 16px;}
+	.w16{width: 16px;display: inline-block;}
+	.collapse-link{float: right;cursor: pointer;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">
+			{if condition="isset($pnavi['cname'])"}
+			{$pnavi['cname']} > 
+			{/if}
+			导航权限
+			{if condition="!empty($pnavi)"}
+			<a class="collapse-link" onclick="history.go(-1)">返回</a>
+			{/if}
+		</div>
+		<div class="layui-card-body">
+			<input type="hidden" name="pid" value="{$pnavi['id']|default='0'}">
+			<div id="navi-table" lay-filter="navi"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container layui-form">
+		<div class="layui-inline">
+			<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="add" style="margin-bottom: 0px;">添加</a>
+		</div>
+		{if condition="empty($pnavi)"}
+		<div class="layui-inline">
+			<select name="position" lay-filter="position">
+		        <option value="admin" {{# if(d.where.position == 'admin' ){ }}selected{{# } }}>后台</option>
+		        <option value="mobile-top" {{# if(d.where.position == 'mobile-top' ){ }}selected{{# } }}>移动端 - 顶部</option>
+		    </select>
+	    </div>
+	    {/if}
+	</div>
+</script>
+
+<script type="text/html" id="toolbar">
+	{{# if(d.children.length > 0){ }}
+	<a class="layui-btn layui-btn-xs" lay-event="children">子导航</a>
+	{{# }else{ }}
+	<a class="layui-btn layui-btn-xs" lay-event="add">添加</a>
+	{{# } }}
+  	<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/',
+    version:false
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'navi']);
+</script>
+{/block}

+ 19 - 0
application/admin/view/public/base.html

@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+	{include file="public/head"/}
+</head>
+<body>
+	<!-- 头部 -->
+	{include file="public/header"/}
+	<!-- /头部 -->
+	
+	<!-- 主体 -->
+	{include file="public/body"/}
+	<!-- /主体 -->
+
+	<!-- 底部 -->
+	{include file="public/footer"/}
+	<!-- /底部 -->
+</body>
+</html>

+ 1 - 0
application/admin/view/public/body.html

@@ -0,0 +1 @@
+{block name="body"}{/block}

+ 5 - 0
application/admin/view/public/footer.html

@@ -0,0 +1,5 @@
+{include file="public/var"/}
+{block name="script"}{/block} 
+<div class="hidden"><!-- 用于加载统计代码等隐藏元素 -->
+	{block name="hidden"}{/block}
+</div>

+ 17 - 0
application/admin/view/public/head.html

@@ -0,0 +1,17 @@
+<meta charset="utf-8">
+<title>{$meta_title} - {$site['cname']}</title>
+<meta name="renderer" content="webkit">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+<link rel="stylesheet" type="text/css" href="__STATIC__/plugins/layui/css/layui.css">
+<link rel="stylesheet" href="__CSS__/admin.css" media="all">
+<style type="text/css">
+	.file{   border: 1px solid #D2D2D2;width: 128px;height: 128px;}
+	.images .image{position: relative;display: inline-block;}
+	.images img{width: 200px; height: 200px;border: 1px solid #e6e6e6;}
+	.images i{    position: absolute;right: 10px;color: #fff;top: 10px;cursor: pointer;background-color: #ea5353;}
+	.edui-editor{z-index: 1 !important;}
+</style>
+{block name="style"}{/block}
+
+<script type="text/javascript" src="__STATIC__/plugins/layui/layui.js"></script>

+ 1 - 0
application/admin/view/public/header.html

@@ -0,0 +1 @@
+{block name="header"}{/block}

+ 11 - 0
application/admin/view/public/var.html

@@ -0,0 +1,11 @@
+<script type="text/javascript">
+(function(){
+	var Think = window.Think = {
+		"ROOT"    :"<?php echo config('domain.root') ?>",
+		"ADMIN"    :"<?php echo config('domain.admin') ?>",
+		"API"    :"<?php echo config('domain.api') ?>",
+		"MODULE" : "<?php echo request()->module();?>",
+		"DEEP"	  :"{$Think.config.pathinfo_depr}"
+	}
+})();
+</script>

+ 55 - 0
application/admin/view/role/add.html

@@ -0,0 +1,55 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-fluid{padding: 0;}
+	.btn-group{margin-bottom: 10px;}
+	.collapse-link{float: right;cursor: pointer;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" lay-filter="LAY-role-add">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">标识</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="name" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="cname" lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">描述</label>
+				    <div class="layui-input-block">
+				    	<textarea class="layui-textarea" name="description"></textarea>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-role-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' //静态资源所在路径
+    ,version: '20180608'
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'role']);
+</script>
+{/block}

+ 43 - 0
application/admin/view/role/auth.html

@@ -0,0 +1,43 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-fluid{padding: 0px;}
+	.layui-tree-spread{width: 16px;}
+	.layui-form-part-checked i{
+		border-color: #5FB878  !important;;
+	}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" lay-filter="LAY-role-oauth">
+				<input type="hidden" name="id" value="{$role.id}">
+				<ul id="navi-tree" class="layui-box layui-tree">
+					
+				</ul>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-role-auth">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' //静态资源所在路径
+    ,version: '20180607'
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'role']);
+</script>
+{/block}

+ 55 - 0
application/admin/view/role/edit.html

@@ -0,0 +1,55 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.btn-group{margin-bottom: 10px;}
+	.collapse-link{float: right;cursor: pointer;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" lay-filter="LAY-role-edit">
+				<input type="hidden" name="id" value="{$role.id}">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">标识</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="name" value="{$role.name}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="cname" value="{$role.cname}"  lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">描述</label>
+				    <div class="layui-input-block">
+				    	<textarea class="layui-textarea" name="description">{$role.description}</textarea>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-role-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' //静态资源所在路径
+    ,version: '20180607'
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'role']);
+</script>
+{/block}

+ 38 - 0
application/admin/view/role/index.html

@@ -0,0 +1,38 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.toolbar{margin-bottom: 10px;}
+</style>
+{/block}`1	
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">角色设置</div>
+		<div class="layui-card-body">
+			<div id="role-table" lay-filter="role"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container">
+		<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="add">添加</a>
+	</div>
+</script>
+
+<script type="text/html" id="rowToolbar">
+  	<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="auth">授权</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' //静态资源所在路径
+    ,version: '20180604'
+}).extend({
+    index: 'lib/index' //主入口模块
+}).use(['index', 'role']);
+</script>
+{/block}

+ 57 - 0
application/admin/view/supplier/add.html

@@ -0,0 +1,57 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="cname" lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系人</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="truename" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系电话</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="mobile" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系地址</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="addess" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-supplier-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'supplier']);
+</script>
+{/block}

+ 58 - 0
application/admin/view/supplier/edit.html

@@ -0,0 +1,58 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="id" value="{$supplier.id}">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">名称</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="cname" value="{$supplier.cname}" lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系人</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="truename" value="{$supplier.truename}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系电话</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="mobile" value="{$supplier.mobile}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">联系地址</label>
+				    <div class="layui-input-block">
+				    	<input type="text" name="addess" value="{$supplier.address}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-supplier-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version: true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'supplier']);
+</script>
+{/block}

+ 42 - 0
application/admin/view/supplier/index.html

@@ -0,0 +1,42 @@
+{extend name="public:base" /}
+{block name="style"}
+
+{/block}
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form" style="margin-bottom: 10px;">
+				<div class="layui-inline">
+					<input type="text" name="search"  placeholder="关键词检索" autocomplete="off" class="layui-input">
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn layui-btn-primary layui-btn-sm" lay-submit lay-filter="LAY-supplier-search">搜索</button>
+				</div>
+			</form>
+			<div id="supplier-table" lay-filter="supplier"></div>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container">
+		<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="add">添加</a>
+	</div>
+</script>
+
+<script type="text/html" id="rowToolbar">
+  	<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/' 
+    ,version: true
+}).extend({
+    index: 'lib/index' 
+}).use(['index', 'supplier']);
+</script>
+{/block}

+ 62 - 0
application/admin/view/user/add.html

@@ -0,0 +1,62 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-fluid{padding: 0;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				{php}$rpid = input('param.rpid');{/php}
+				<div class="layui-form-item">
+				    <label class="layui-form-label">用户名</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="name" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">登录密码</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="password" lay-verify="required" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">角色</label>
+				    <div class="layui-input-inline">
+					    <select name="role_id">
+					    	{if condition="empty($roles)"}
+					    	<option value="">请先添加一个角色</option>
+					    	{else /}
+					    	{volist name="roles" id="role"}
+					        <option value="{$role.id}">{$role.cname}</option>
+					    	{/volist}
+					    	{/if}
+					    </select>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-user-add">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'user']);
+</script>
+{/block}

+ 58 - 0
application/admin/view/user/edit.html

@@ -0,0 +1,58 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-fluid{padding: 0;}
+</style>
+{/block}
+{block name="body"}
+<div class="layui-fluid">	
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<form class="layui-form">
+				<input type="hidden" name="id" value="{$user.id}">
+				<div class="layui-form-item">
+				    <label class="layui-form-label">用户名</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="name" value="{$user.name}" autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">登录密码</label>
+				    <div class="layui-input-inline">
+				    	<input type="text" name="password"  autocomplete="off" class="layui-input">     
+				    </div>
+				</div>
+				<div class="layui-form-item">
+				    <label class="layui-form-label">角色</label>
+				    <div class="layui-input-inline">
+					    <select name="role_id">
+					    	{volist name="roles" id="role"}
+					        <option value="{$role.id}" {if condition="$role['id'] eq $user['role_id']"}selected{/if}>{$role.cname}</option>
+					    	{/volist}
+					    </select>
+				    </div>
+				</div>
+				<div class="layui-form-item layui-layout-admin">
+					<div class="layui-input-block">
+						<div class="layui-footer" style="left: 0;">
+							<button class="layui-btn" lay-submit lay-filter="LAY-user-edit">立即提交</button>
+							<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+						</div>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'user']);
+</script>
+{/block}

+ 103 - 0
application/admin/view/user/index.html

@@ -0,0 +1,103 @@
+{extend name="public:base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-table-cell{height: auto;}
+</style>
+{/block}`1	
+{block name="body"}
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			{php}$rpid = input('param.rpid');{/php}
+			<input type="hidden" name="rpid" value="{$rpid}">
+			{if condition="empty($rpid)"}
+			<form class="layui-form" style="margin-bottom: 10px;">
+			    <div class="layui-inline">
+			    	 <input type="text" name="user"  placeholder="手机号码/ID/用户名" autocomplete="off" class="layui-input">
+			    </div>
+			    <div class="layui-inline">
+			    	 <input type="text" name="inviter"  placeholder="邀请者手机号码/ID" autocomplete="off" class="layui-input">
+			    </div>
+			    <div class="layui-inline">
+			    	 <input type="text" name="level"  placeholder="市场级别(数字)" autocomplete="off" class="layui-input">
+			    </div>
+			    <div class="layui-inline">
+			    	 <input type="text" name="remark"  placeholder="备注" autocomplete="off" class="layui-input">
+			    </div>
+			    <div class="layui-inline">
+			    	<a href="javascript:;" class="layui-btn layui-btn-sm" lay-submit lay-filter="layui-search-user">搜索</a>
+			    </div>
+			</form>
+			{/if}
+			<table class="layui-table" lay-data="{height:'auto',url:'load.html?rpid={$rpid}',cellMinWidth:80,totalRow:true,page:true,limits:[10,50,100,500,1000],toolbar:'#topToolbar',id:'user-table'}" lay-filter="user">
+			  	<thead>
+			    <tr>
+	      			<th lay-data="{field:'id'}">ID</th>
+	      			{if condition="!empty($rpid)"}
+	      			<th lay-data="{field:'name'}">用户名</th>
+	      			{else /}
+			      	<th lay-data="{field:'mobile'}">手机号码</th>
+			      	<th lay-data="{field:'balance',totalRow:true}" >账户余额</th>
+			      	<th lay-data="{field:'points' ,totalRow:true}">账户积分</th>
+			      	<th lay-data="{field:'level_text'}">市场级别</th>
+			      	<th lay-data="{field:'inviter'}">邀请者</th>
+			      	<th lay-data="{field:'invite_num'}">直推人数</th>
+			      	<th lay-data="{field:'team_num'}">团队人数</th>
+			      	<th lay-data="{field:'active' ,templet:'#switchActive'}">激活</th>
+			      	<th lay-data="{field:'center',templet:'#switchCenter'}">服务中心</th>
+			      	<th lay-data="{field:'create_time'}">注册时间</th>
+			      	<th lay-data="{field:'state_text',templet:'#switchState'}">状态</th>
+			      	<th lay-data="{field:'remark',edit:'text'}">备注</th>
+			      	{/if}
+			      	<th lay-data="{fixed: 'right', width:300, align:'center', toolbar: '#rowToolbar'}">操作</th>
+			    </tr>
+			  	</thead>
+			</table>
+		</div>
+	</div>
+</div>
+
+<script type="text/html" id="switchCenter">
+	<input type="checkbox" name="center" value="1" lay-skin="switch" lay-text="是|否" lay-filter="center" data-id="{{ d.id }}" {{ d.center == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="switchActive">
+	<input type="checkbox" name="active" value="1" lay-skin="switch" lay-text="是|否" lay-filter="active" data-id="{{ d.id }}" {{ d.active == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="switchState">
+	<input type="checkbox" name="state" value="1" lay-skin="switch" lay-text="是|否" lay-filter="state" data-id="{{ d.id }}" {{ d.state == 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/html" id="topToolbar">
+	<div class="layui-btn-container">
+		<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="add">添加</a>
+	</div>
+</script>
+
+<script type="text/html" id="rowToolbar">
+  	<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="delete">删除</a>
+  	{if condition="empty($rpid)"}
+  	<a class="layui-btn layui-btn-danger layui-btn-xs " lay-event="forbid">禁用</a>
+  	<br>
+  	<a class="layui-btn layui-btn-xs" lay-event="level">等级</a>
+  	<a class="layui-btn layui-btn-xs" lay-event="team">团队</a>
+  	{if condition="$user['role']['name'] eq 'admin'"}
+  	<br>
+  	<a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="balance">余额</a>
+  	<a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="points">积分</a>
+  	{/if}
+  	{/if}
+</script>
+{/block}
+{block name="script"}
+<script type="text/javascript">
+layui.config({
+    base: '__JS__/'
+    ,version:true
+}).extend({
+    index: 'lib/index'
+}).use(['index', 'user']);
+</script>
+{/block}

+ 45 - 0
application/api/controller/Api.php

@@ -0,0 +1,45 @@
+<?php
+namespace app\api\controller;
+use think\Controller;
+
+/**
+* 接口父类
+*/
+class Api extends Controller{
+
+  protected function _initialize(){
+    $this->header();
+    $this->init();
+  }
+
+  protected function header(){
+    header('Access-Control-Allow-Origin:*');
+    header('Content-type: application/json;chartset=uft-8');
+    if( $_SERVER['REQUEST_METHOD'] == 'OPTIONS'){
+      exit;
+    }
+  }
+
+  protected function init(){
+    
+  }
+
+  public function output($code,$msg,$data = [],$count = 0){
+      try {
+        // 返回JSON数据格式到客户端 包含状态信息
+        $count = $count == 0?count($data):$count;
+        $data = json_encode(['code'=>$code,'msg'=>$msg,'data'=>$data,'count'=>$count], JSON_UNESCAPED_UNICODE);
+        if ($data === false) {
+          throw new \InvalidArgumentException(json_last_error_msg());
+        }
+
+        header('Content-type: application/json');
+        echo $data;exit();
+      } catch (\Exception $e) {
+        if ($e->getPrevious()) {
+          throw $e->getPrevious();
+        }
+        throw $e;
+      }
+    } 
+}

+ 83 - 0
application/api/controller/card/Number.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace app\api\controller\card;
+
+use app\api\controller\Api;
+
+/**
+ *    卡片
+ */
+class Number extends Api
+{
+
+    protected $CardNumber = null;
+
+    protected function init()
+    {
+        parent::init();
+        $this->CardNumber = model('card.Number');
+    }
+
+    public function verify()
+    {
+        $no = input('param.cardNo');
+        if (empty($no)) {
+            $this->output(0, '卡号不能为空');
+        }
+        $secret = input('param.cardPassword');
+        if (empty($no)) {
+            $this->output(0, '卡密不能为空');
+        }
+
+        $where              = [];
+        $where['no']        = $no;
+        $where['secret']    = $secret;
+        $where['sale_time'] = ['neq', 0];
+        $where['bind_time'] = 0;
+        $where['state']     = 1;
+        $number             = $this->CardNumber->where($where)->find();
+        if (!$number) {
+            $this->output(1, '卡号或卡密错误');
+        }
+
+        $member_id = input('param.userId');
+        if (empty($member_id)) {
+            $this->output(1, '用户ID不能为空');
+        }
+        $number->member_id = $member_id;
+        $number->bind_time = $this->request->time();
+        $result            = $number->save();
+        if (!$result) {
+            $this->output(1, '保存失败');
+        }
+
+        $data                  = [];
+        $data['amount']        = $number['denomination'];
+        $data['balance']       = $number['balance'];
+        $data['startDateTime'] = date('Y-m-d', $number['expire_start_time']);
+        $data['endDateTime']   = date('Y-m-d', $number['expire_end_time']);
+        $goods_type            = $number['goods_type'];
+        if (!empty($goods_type)) {
+            $goods_type_ids = [];
+            foreach ($goods_type as $key => $value) {
+                $goods_type_ids[] = $value['id'];
+            }
+            $data['goodsClassIds'] = implode('|', $goods_type_ids);
+        } else {
+            $data['goodsClassIds'] = '';
+        }
+        $store_type = $number['store_type'];
+        if (!empty($store_type)) {
+            $store_type_ids = [];
+            foreach ($store_type as $value) {
+                $store_type_ids[] = $value['id'];
+
+            }
+            $data['storeClassIds'] = implode(',', $store_type_ids);
+        } else {
+            $data['storeClassIds'] = '';
+        }
+
+        $this->output(0, '保存成功', $data);
+    }
+}

+ 57 - 0
application/api/controller/card/number/Bill.php

@@ -0,0 +1,57 @@
+<?php
+namespace app\api\controller\card\number;
+use app\api\controller\Api;
+
+/**
+*	账单
+*/
+class Bill extends Api{
+
+	protected $CardNumberBill = null;
+	protected function init(){
+		parent::init();
+		$this->CardNumberBill = model('card.number.bill');
+	}
+
+	public function add(){
+		$no = input('param.cardNo');
+		if (empty($no)) {
+			$this->output(1,'卡号不能为空');
+		}
+		$member_id = input('param.memberId');
+		$CardNumber = model('card.Number');
+		$number = $CardNumber->where(['no'=>$no,'member_id'=>$member_id])->find();
+		if (!$number) {
+			$this->output(1,'未找到该卡');
+		}
+		$amount = input('param.amount');
+		$amount = floatval($amount);
+		if ($amount > 0) {
+			if ($number['balance'] < $amount) {
+				$this->output(1,'卡余额不足');
+			}
+		}
+
+		$this->CardNumberBill->startTrans();
+		$number['balance'] -= $amount;
+		$result = $number->save();
+		if (!$result) {
+			$this->CardNumberBill->rollback();
+			$this->output(1,'保存失败');
+		}
+
+		$this->CardNumberBill->card_id = $number['card_id'];
+		$this->CardNumberBill->number_id = $number['id'];
+		$this->CardNumberBill->member_id = $member_id;
+		$this->CardNumberBill->amount = $amount * -1;
+		$this->CardNumberBill->order_no = input('param.orderNo');
+		$this->CardNumberBill->is_vir = input('param.is_vir');
+		$result = $this->CardNumberBill->save();
+		if (!$result) {
+			$this->CardNumberBill->rollback();
+			$this->output(1,'保存失败');
+		}
+		$this->CardNumberBill->commit();
+		$this->output(0,'保存成功');
+	}
+}

+ 95 - 0
application/api/controller/coupon/Code.php

@@ -0,0 +1,95 @@
+<?php
+
+namespace app\api\controller\coupon;
+
+use app\api\controller\Api;
+
+/**
+ *    券码
+ */
+class Code extends Api
+{
+
+    protected $CouponCode = null;
+
+    protected function init()
+    {
+        parent::init();
+        $this->CouponCode = model('coupon.Code');
+    }
+
+    public function load()
+    {
+        $coupon_no = input('param.coupon_no');
+        if (empty($coupon_no)) {
+            $this->output(1, '券号不能为空');
+        }
+        $Coupon = model('Coupon');
+        $coupon = $Coupon->where(['no' => $coupon_no])->find();
+        if (!$coupon) {
+            $this->output(1, '未找到券');
+        }
+        $quantity = input('param.quantity');
+        $quantity = intval($quantity);
+        if ($quantity <= 0) {
+            $this->output(1, '数量不能小于0');
+        }
+        $member_id = input('param.userId');
+        $list      = $this->CouponCode->where(['coupon_id' => $coupon['id'], 'state' => 0])->limit($quantity)->select();
+        if (count($list) < $quantity) {
+            $this->output(1, '券码不足');
+        }
+        $data   = [];
+        $time   = $this->request->time();
+        $domain = $this->request->domain();
+        foreach ($list as $key => $value) {
+            $data[$key]['id']     = $value['id'];
+            $data[$key]['cname']  = $coupon['cname'];
+            $data[$key]['type']   = $coupon['type']['name'];
+            $data[$key]['no']     = $value['no'];
+            $data[$key]['secret'] = $value['secret'];
+            if (!empty($value['qrcode'])) {
+                $value['qrcode'] = $domain . $value['qrcode'];
+            }
+            $data[$key]['qrcode'] = $value['qrcode'];
+            if (!empty($value['barcode'])) {
+                $value['barcode'] = $domain . $value['barcode'];
+            }
+            $data[$key]['barcode'] = $value['barcode'];
+            $data[$key]['url']     = $value['url'];
+            $data[$key]['state']   = $value['state'];
+
+            $expire_time = $value['expire_time'];
+            list($startdate, $enddate) = explode('~', $expire_time);
+            $data[$key]['start_time'] = strtotime($startdate);
+            $data[$key]['end_time']   = strtotime($enddate);
+
+            $this->CouponCode->where(['id' => $value['id']])->update(['state' => 1, 'sale_time' => $time, 'member_id' => $member_id]);
+        }
+        $this->output(0, '加载成功', $data);
+    }
+
+    public function check()
+    {
+        $coupon_no = input('param.coupon_no');
+        if (empty($coupon_no)) {
+            $this->output(1, '券号不能为空');
+        }
+        $Coupon = model('Coupon');
+        $coupon = $Coupon->where(['no' => $coupon_no])->find();
+        if (!$coupon) {
+            $this->output(1, '未找到券');
+        }
+        $quantity = input('param.quantity');
+        $quantity = intval($quantity);
+        if ($quantity <= 0) {
+            $this->output(1, '数量不能小于0');
+        }
+        $list = $this->CouponCode->where(['coupon_id' => $coupon['id'], 'state' => 0])->limit($quantity)->select();
+        if (count($list) < $quantity) {
+            $this->output(1, '券码不足');
+        }
+
+        $this->output(0, '券码充足');
+    }
+}

+ 63 - 0
application/api/controller/goods/Type.php

@@ -0,0 +1,63 @@
+<?php
+namespace app\api\controller\goods;
+use app\api\controller\Api;
+
+/**
+*	类型
+*/
+class Type extends Api{
+
+	protected $GoodsType = null;
+	protected function init(){
+		parent::init();
+		$this->GoodsType = model('goods.Type');
+	}
+
+	public function edit(){
+		$id = input('param.id');
+		$type = $this->GoodsType->where(['id'=>$id])->find();
+		if (!$type) {
+			$this->output(1,'参数错误');
+		}
+		$cname = input('param.cname');
+		if (empty($cname)) {
+			$this->output(1,'名称不能为空');
+		}
+		$type->cname = $cname;
+		$result = $type->save();
+		if (!$result) {
+			$this->output(1,'保存失败');
+		}
+		$this->output(0,'保存成功');
+	}
+
+	public function add(){
+		$cname = input('param.cname');
+		if (empty($cname)) {
+			$this->output(1,'名称不能为空');
+		}
+		$id = input('param.id',0);
+		$pid = input('param.pid',0);
+		$this->GoodsType->id = $id;
+		$this->GoodsType->cname = $cname;
+		$this->GoodsType->pid = $pid;
+		$result = $this->GoodsType->save();
+		if (!$result) {
+			$this->output(1,'保存失败');
+		}
+		$this->output(0,'保存成功');
+	}
+
+	public function delete(){
+		$id = input('param.id');
+		$type = $this->GoodsType->where(['id'=>$id])->find();
+		if (!$type) {
+			$this->output(1,'参数错误');
+		}
+		$result = $type->delete();
+		if (!$result) {
+			$this->output(1,'删除失败');
+		}
+		$this->output(0,'删除成功');
+	}
+}

+ 12 - 0
application/command.php

@@ -0,0 +1,12 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: yunwuxin <448901948@qq.com>
+// +----------------------------------------------------------------------
+
+return [];

+ 404 - 0
application/common.php

@@ -0,0 +1,404 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: 流年 <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+// 应用公共文件
+/*
+*   用户是否登录
+*/
+function is_login($type){
+	$user = session($type.'_auth');
+	if (empty($user)) {
+		return false;
+	}
+	return $user;
+}
+
+function is_admin(){
+	$user = is_login('admin');
+	$role_id = $user['role']['id'];
+	if ($role_id == 1) {
+		return true;
+	}
+	return false;
+}
+
+/**
+*	获取本站token
+*/
+function getlocaltoken($name){
+	$where['name'] = $name;
+	$user = $User->where($where)->find();
+	if (!$user) {
+		return false;
+	}
+
+	$time = $this->request->time();
+	$token_expire = $user['token_expire'];
+	if (!empty($token_expire)) {
+		list($token,$expire) = explode('|', $token_expire);
+		if ($time < $expire) {
+			return $token;
+		}
+	}
+
+	$token = md5(guid());
+	$expire = $this->request->time() + 7200;
+	$user->token = $token .'|'.$expire;
+	$user->save();
+
+	return $token;
+}
+
+/**
+* 是否是微信浏览器
+* @return bool
+*/
+function isWxClient(){
+	return strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false;
+}
+
+/**
+* 判断是否支付宝内置浏览器访问
+* @return bool
+*/
+function isAliClient(){
+	return strpos($_SERVER['HTTP_USER_AGENT'], 'Alipay') !== false;
+}
+
+/**
+*	远程获取数据
+*/
+function curl($url, $data = '',$headers = [],$timeout = 60,$issplit = false) {
+	$ch = curl_init();
+	curl_setopt($ch, CURLOPT_URL,$url);
+	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+	@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
+	curl_setopt($ch, CURLOPT_HEADER, 0);
+	@curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
+
+	if ($data) {
+		curl_setopt($ch, CURLOPT_POST, 1);
+		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+	}
+
+	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
+	curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+	curl_setopt($ch, CURLOPT_SSLVERSION, 1);
+
+	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1");
+	if (!empty($headers) && is_array($headers)) {
+		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+	}
+	ob_start();
+	$res = curl_exec($ch);
+	$headersize =  curl_getinfo($ch, CURLINFO_HEADER_SIZE);
+	$header = substr($res, 0, $headersize);
+	$body = substr($res, $headersize);
+	ob_end_clean();
+	curl_close($ch);
+	unset($ch);
+
+	if ($issplit) {
+		return ['header'=>$header,'body'=>$body];
+	}
+	return $res;
+}
+
+/**
+*       获取随机数
+*/
+function random($length, $numeric = FALSE) {
+	$seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
+	$seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
+	if ($numeric) {
+		$hash = '';
+	} else {
+		$hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);
+		$length--;
+	}
+	$max = strlen($seed) - 1;
+	for ($i = 0; $i < $length; $i++) {
+		$hash .= $seed{mt_rand(0, $max)};
+	}
+	$hash=strtoupper($hash);
+	return $hash;
+}
+
+function getNonceStr($length = 32) {
+	$chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
+	$str ="";
+	for ( $i = 0; $i < $length; $i++ )  {  
+		$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
+	} 
+	return $str;
+}
+
+/*生成全球唯一标识*/
+function guid($fix=true){
+	$left=$fix?chr(123):'';
+	$right=$fix?chr(125):'';
+	if (function_exists('com_create_guid')){
+		$uuid=com_create_guid();
+		if(!$fix){
+			$uuid=substr($uuid,1,-1);
+		}
+		return $uuid;
+	}else{
+		mt_srand((double)microtime()*10000);
+		$charid = strtoupper(md5(uniqid(rand(), true)));
+		$hyphen = chr(45);
+		$uuid = $left
+		.substr($charid, 0, 8).$hyphen
+		.substr($charid, 8, 4).$hyphen
+		.substr($charid,12, 4).$hyphen
+		.substr($charid,16, 4).$hyphen
+		.substr($charid,20,12)
+		.$right;
+		return $uuid;
+	}
+} 
+
+//生成二维码
+function createqrcode($data,$level = 'L',$size=4){
+	$name = md5($data);
+	vendor("phpqrcode.phpqrcode");
+	$relativePath =  'uploads'.DS.date('Ymd',request()->time());
+	$absolutePath = ROOT_PATH.'public'.DS. $relativePath;
+	$file = $absolutePath.DS.$name.".png";
+	if (!is_file($file)) {
+		is_dir($absolutePath)?'':mkdir($absolutePath, 0755, true);
+		$object = new \QRcode();
+		$object->png($data,$file, 'L',6); 
+	}
+	return  request()->domain(). DS.$relativePath.DS.$name.".png";
+}
+
+//redis连接
+function redis_connect(){
+	vendor("Predis.autoload");
+	$redis = new \Predis\Client(array(
+		'scheme' => 'tcp',
+		'host'   => '127.0.0.1',
+		'port'   => 6379,
+	));
+	$password =  \think\Config::get('redis.password');
+	if (!empty($password)) {
+		$redis->auth($password);  
+	}
+	return $redis;
+}
+
+/**
+*   自增长单号
+*/
+function aino($prefix='',$format='Ymd',$length=3){;
+	$redis = redis_connect();
+	$date = empty($format)?'':date($format);
+	$key = $prefix.$date;
+	$no = $redis->incr($key);
+	if ($no == 1) {
+		$redis->expireat($key,strtotime($date) + 86400);
+	}
+
+	$no = str_pad($no,$length,"0",STR_PAD_LEFT);
+	$no = $key.$no;
+	return $no;
+}
+
+/**
+*   获取文件路径
+*/
+function getfileurl($id){
+	$File = model('File');
+	$file = $File->where(['id'=>$id])->find();
+	return DS. 'public' . DS . 'uploads' .DS .$file['name'];
+}
+
+
+/**
+*   获取配置信息
+*/
+function cnf($key,$value = null){
+	if (is_null($value) && is_string($key)) {
+		$value = model('Config')->where(['key'=>$key])->value("value");
+		$value = json_decode($value,true); 
+		return $value;
+	} else {
+		$value = json_encode($value,JSON_UNESCAPED_UNICODE);
+		return model('Config')->where(['key'=>$key])->update(["value"=>$value]);
+	}
+}
+
+/**
+ * 字符串截取,支持中文和其他编码
+ * @static
+ * @access public
+ * @param string $str 需要转换的字符串
+ * @param string $start 开始位置
+ * @param string $length 截取长度
+ * @param string $charset 编码格式
+ * @param string $suffix 截断显示字符
+ * @return string
+ */
+function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) {
+	if(function_exists("mb_substr"))
+		$slice = mb_substr($str, $start, $length, $charset);
+	elseif(function_exists('iconv_substr')) {
+		$slice = iconv_substr($str,$start,$length,$charset);
+		if(false === $slice) {
+			$slice = '';
+		}
+	}else{
+		$re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
+		$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
+		$re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
+		$re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
+		preg_match_all($re[$charset], $str, $match);
+		$slice = join("",array_slice($match[0], $start, $length));
+	}
+	return $suffix ? $slice.'...' : $slice;
+}
+
+function amount_format($amount){
+	$amount = trim($amount);
+	return sprintf("%.2f",substr(sprintf("%.3f", $amount), 0, -1)); 
+}
+
+function sendtomobile($mobile,$content,$ajax = true){
+
+}
+
+function sendtoemail($email,$content,$ajax = true){
+	$sms_cnf = cnf('sms');
+	$email_cnf = $sms_cnf['mobile'];
+
+	require_once VENDOR_PATH.'PHPMailer/src/Exception.php';
+	require_once VENDOR_PATH.'PHPMailer/src/PHPMailer.php';
+	require_once VENDOR_PATH.'PHPMailer/src/SMTP.php';
+
+    $mail = new \PHPMailer\PHPMailer\PHPMailer(true); //实例化
+    try {
+    	$sms_cnf = cnf('sms');
+    	$email_cnf = $sms_cnf['email'];
+
+    	$mail->isSMTP();
+    	$mail->CharSet = "UTF-8";
+    	$mail->Host = $email_cnf['smtp']; 
+    	$mail->Port = 465;
+    	$mail->SMTPAuth = true;  
+    	$mail->SMTPSecure = "ssl";   
+    	$mail->CharSet = "UTF-8"; 
+    	$mail->Encoding = "base64"; 
+    	$mail->Username = $email_cnf['account'];  
+    	$mail->Password =  $email_cnf['password']; 
+
+    	$mail->From = $email_cnf['account']; 
+    	$mail->FromName = $email_cnf['from']; 
+
+    	$mail->AddAddress($email, "Hello");
+    	$mail->IsHTML(true); 
+    	$mail->Subject = '【'.$email_cnf['from'].'】';
+    	$mail->Body = $content; 
+
+    	$mail->Send();
+    	if ($ajax) {
+    		output(0,'发送成功');
+    	}
+    	return true;
+    }catch (\PHPMailer\PHPMailer\Exception $e) {
+    	output(1,'发送失败1');
+    }
+}
+
+function output($code,$msg,$data = [],$count = 0,$pages = 1){
+	try {
+	      // 返回JSON数据格式到客户端 包含状态信息
+		$count = $count == 0?count($data):$count;
+		$data = json_encode(['code'=>$code,'msg'=>$msg,'data'=>$data,'count'=>$count,'pages'=>$pages], JSON_UNESCAPED_UNICODE);
+		if ($data === false) {
+			throw new \InvalidArgumentException(json_last_error_msg());
+		}
+
+		header('Content-type: application/json');
+		echo $data;exit();
+	} catch (\Exception $e) {
+		if ($e->getPrevious()) {
+			throw $e->getPrevious();
+		}
+		throw $e;
+	}
+}
+
+function oplog($position,$user_id){
+	$request = request();
+	$Log = model('Log');
+	$Log->user_id = $user_id;
+	$Log->action = $request->module() . '/' . $request->controller() . '/' . $request->action();
+	$Log->params = $request->param();
+	$Log->position = $position;
+	$Log->save();
+}
+
+function common_curl($url, $param, $dataType = 0, $header = [])
+{
+    $headers = [
+        "Content-type:application/json;charset=utf-8",
+        "Accept:*/*",
+        "Connection:close",
+        "User-Agent:DSMall/6.1.0;PHP-Curl",
+    ];
+
+
+    //dataType 1是 x-www-form形式   0是默认的json形式
+    if ($dataType == 1) {
+        $post_data = http_build_query($param);//重点
+        $curl      = curl_init();
+        curl_setopt($curl, CURLOPT_URL, $url);
+//        curl_setopt($curl, CURLOPT_HEADER, 0);//不抓取头部信息。只返回数据
+        curl_setopt($curl, CURLOPT_TIMEOUT, (int)10);//超时设置
+        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//1表示不返回bool值
+        curl_setopt($curl, CURLOPT_POST, 1);
+        curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);//重点
+        curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
+//        curl_setopt(curl,CURLOPTHTTPHEADER,$header);
+        $result = curl_exec($curl);
+        curl_close($curl);
+        $result = json_decode($result, 1);
+        return $result;
+    } else {
+        $ch = curl_init($url);
+        curl_setopt($ch, CURLOPT_HEADER, 0);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($param));
+        $result = curl_exec($ch);
+        if (curl_errno($ch)) $result = curl_error($ch);
+        curl_close($ch);
+        $result = json_decode($result, 1);
+        return $result;
+    }
+}
+
+
+
+
+
+
+
+
+

BIN
application/common/.DS_Store


+ 19 - 0
application/common/model/Advert.php

@@ -0,0 +1,19 @@
+<?php
+namespace app\common\model;
+use think\Model;
+
+class Advert extends Model{
+
+	public function position(){
+		return $this->belongsTo('AdvertPos','pos_id');
+	}
+
+	public function getFullPathAttr($value,$data){
+		$value = $data['path'];
+		if (!empty($value)) {
+			return  request()->domain().$value;
+		}
+		return $value;
+	}
+
+}

+ 12 - 0
application/common/model/AdvertPos.php

@@ -0,0 +1,12 @@
+<?php
+namespace app\common\model;
+use think\Model;
+
+class AdvertPos extends Model{
+
+    public function getTypeTextAttr($value,$data){
+        $text = ['1'=>'图片','2'=>'视频'];
+        $type = $data['type'];
+        return isset($text[$type])?$text[$type]:$type;
+    }
+}

+ 44 - 0
application/common/model/Article.php

@@ -0,0 +1,44 @@
+<?php
+namespace app\common\model;
+use think\Model;
+use traits\model\SoftDelete;
+
+class Article extends Model{
+
+	use SoftDelete;
+	public function getTypeIdAttr($value,$data){
+		return $data['type_3'] == 0?($data['type_2'] == 0?$data['type_1']:$data['type_2']):$data['type_3'];
+	}
+
+	public function getTypeCnameAttr($value,$data){
+		$cname = '';
+		if ($this['type1']) {
+			$cname .= $this['type1']['cname'];
+			if ($this['type2']) {
+				$cname .= '->'.$this['type2']['cname'];
+				if ($this['type3']) {
+					$cname .= '->'.$this['type3']['cname'];
+				}
+			}
+		}
+		return $cname;
+	}
+
+	public function type1(){
+		return $this->belongsTo('app\common\model\article\Type','type_1');
+	}
+
+	public function type2(){
+		return $this->belongsTo('app\common\model\article\Type','type_2');
+	}
+
+	public function type3(){
+		return $this->belongsTo('app\common\model\article\Type','type_3');
+	}
+
+	public function getStateTextAttr($value,$data){
+		$state = $data['state'];
+		$text = ['0'=>'草稿','1'=>'发布'];
+		return $text[$state];
+	}
+}

+ 10 - 0
application/common/model/Card.php

@@ -0,0 +1,10 @@
+<?php
+namespace app\common\model;
+use think\Model;
+
+class Card extends Model{
+
+	public function numbers(){
+		return $this->hasMany('app\common\model\card\Number');
+	}
+}

+ 14 - 0
application/common/model/Config.php

@@ -0,0 +1,14 @@
+<?php
+namespace app\common\model;
+use think\Model;
+
+class Config extends Model{
+
+	public function getValueAttr($value,$data){
+		return json_decode($value,true);
+	}
+
+	public function setValueAttr($value){
+		return json_encode($value,JSON_UNESCAPED_UNICODE);
+	}
+}

+ 35 - 0
application/common/model/Coupon.php

@@ -0,0 +1,35 @@
+<?php
+namespace app\common\model;
+use think\Model;
+
+class Coupon extends Model{
+
+	public function codes(){
+		return $this->hasMany('app\common\model\coupon\Code');
+	}
+
+	public function type(){
+		return $this->belongsTo('app\common\model\coupon\Type');
+	}
+
+	public function supplier(){
+		return $this->belongsTo('app\common\model\Supplier');
+	}
+
+	public function getTotalNumAttr($value,$data){
+		return count($this['codes']);
+	}
+
+	public function getSoldNumAttr($value,$data){
+		$CouponCode = model('coupon.Code');
+		return $CouponCode->where(['state'=>1,'coupon_id'=>$data['id']])->count();
+	}
+
+	public function getUnsoldNumAttr($value,$data){
+		$total_num = $this['total_num'];
+		$sold_num = $this['sold_num'];
+		return $total_num - $sold_num;
+	}
+
+
+}

+ 7 - 0
application/common/model/Customer.php

@@ -0,0 +1,7 @@
+<?php
+namespace app\common\model;
+use think\Model;
+
+class Customer extends Model{
+
+}

Some files were not shown because too many files changed in this diff