PC-202203141647\Administrator 3 years ago
parent
commit
d3ff4ab584

+ 9 - 0
app/BaseController.php

@@ -12,6 +12,15 @@ use think\Validate;
  */
 abstract class BaseController
 {
+
+    protected function ok($data = null) {
+        return json(['code' => 200, 'message' => null, 'data' => $data]);
+    }
+
+    protected function fail($message) {
+        return json(['code' => 205, 'message' => $message, "data" => null]);
+    }
+
     /**
      * Request实例
      * @var \think\Request

+ 3 - 3
app/BaseService.php

@@ -8,10 +8,10 @@ class BaseService
 {
 
     protected function success($data = null) {
-        return ['code' => 200, 'msg' => null, 'data' => $data];
+        return ['code' => 200, 'message' => null, 'data' => $data];
     }
 
-    protected function fail($msg) {
-        return ['code' => 205, 'msg' => $msg, "data" => null];
+    protected function fail($message) {
+        return ['code' => 205, 'message' => $message, "data" => null];
     }
 }

+ 34 - 2
app/admin/controller/Auth.php

@@ -1,14 +1,46 @@
 <?php
 
-
 namespace app\admin\controller;
 
+use app\common\model\AuthGroupModel;
+use app\common\model\AuthRuleModel;
+use think\App;
+use app\BaseController;
+
 
-class Auth extends \app\BaseController
+class Auth extends BaseController
 {
 
+    private $authGroupModel;
+    private $authGroupAccessModel;
+    private $authRuleModel;
+
+    public function __construct(App $app)
+    {
+        $this->authGroupAccessModel = new AuthGroupModel();
+        $this->authGroupModel = new AuthGroupModel();
+        $this->authRuleModel = new AuthRuleModel();
+        parent::__construct($app);
+    }
+
     public function index()
     {
         return view();
     }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 }

+ 48 - 6
app/admin/controller/Customer.php

@@ -6,29 +6,71 @@ namespace app\admin\controller;
 
 use app\BaseController;
 use app\common\model\CustomerModel;
+use app\common\model\StoreModel;
 use think\App;
 use think\facade\View;
 use think\Request;
 
 class Customer extends BaseController
 {
-    private  $model;
+    private $customerModel;
+    private $storeModel;
 
     public function __construct(App $app)
     {
         parent::__construct($app);
-        $this->model = new CustomerModel();
+        $this->customerModel = new CustomerModel();
+        $this->storeModel = new StoreModel();
     }
 
+    /**
+     * @param Request $request
+     * @return \think\response\View
+     * @throws \think\db\exception\DbException
+     */
     public function index(Request $request) {
         $params = $request->param();
-        $params['name'] = '3';
-        dump($params);
         View::assign([
-            'list' => $this->model->findCustomerPage($params),
-            'params' => $params
+            'list' => $this->customerModel->findCustomerPage($params),
+            'params' => [
+                'name' => format_string($params['name'] ?? null),
+                'mobile' => format_string($params['mobile'] ?? null),
+            ]
         ]);
         return view();
     }
 
+    public function add(Request $request) {
+        if($request->isAjax()) {
+            $params = $request->param();
+            $isExist = $this->customerModel->doesItExist($params['mobile']);
+            if($isExist) return $this->fail(lang("Fail to add. Data duplication"));
+            $this->customerModel->save();
+            return $this->ok(true);
+        } else {
+            View::assign('stores', $this->storeModel->findAllStore());
+            return view();
+        }
+    }
+
+    public function edit(Request $request) {
+        $params = $request->param();
+        if(!isset($params['id']))
+            return $this->fail(lang('ID not exist'));
+        $this->customerModel->findById($params['id']);
+//        View::assign();
+    }
+
+    public function delete(Request $request) {
+        $params = $request->param();
+        if(!isset($params['ids']))
+            return $this->fail(lang("Please select the data you want to delete"));
+        $this->customerModel->deleteByIds(explode(',',$params['ids']));
+        return $this->ok();
+    }
+
+
+
+
+
 }

+ 39 - 2
app/admin/controller/Index.php

@@ -3,13 +3,50 @@ declare (strict_types = 1);
 namespace app\admin\controller;
 
 use app\BaseController;
+use app\common\model\AuthGroupAccessModel;
+use app\common\model\AuthGroupModel;
+use app\common\model\AuthRuleModel;
+use app\Request;
+use think\App;
 use think\facade\View;
 
 class Index extends BaseController
 {
-    public function index()
+    private $authGroupModel;
+    private $authGroupAccessModel;
+    private $authRuleModel;
+
+    public function __construct(App $app)
+    {
+        $this->authGroupModel = new AuthGroupModel();
+        $this->authGroupAccessModel = new AuthGroupAccessModel();
+        $this->authRuleModel = new AuthRuleModel();
+        parent::__construct($app);
+    }
+
+    private function loadRuleTreeByAdminId(int $adminId) {
+        $access = $this->authGroupAccessModel->where('uid',$adminId)->find();
+        if ($access->group_id > 0) {
+            $group = $this->authGroupModel->where('id',$access->group_id)->find();
+            if ($group) {
+                $rules_str = $group->rules;
+                $rules = [];
+                if($rules_str == "*"){
+                    $rules = $this->authRuleModel->select();
+                } else {
+                    $rules = $this->authRuleModel->select(explode(',',$rules_str));
+                }
+                return $rules;
+            }
+        }
+        return [];
+    }
+
+    public function index(Request $request)
     {
-        View::assign('first', '1');
+        $adminId = 10000; //$request->param(['adminId']);
+        $rules = $this->loadRuleTreeByAdminId($adminId);
+        View::assign('rules',recursion($rules,0));
         return view();
     }
 

+ 1 - 1
app/admin/controller/Login.php

@@ -32,7 +32,7 @@ class Login extends BaseController
     public function login(Request $request) {
         $params = (new LoginValidate())->requestBodyCheck($request);
         $body = $this->service->login($params['username'], $params['password']);
-        predicate($body['code'] == 200, $body['msg']);
+        predicate($body['code'] == 200, $body['message']);
         return json($body);
     }
 

+ 57 - 0
app/admin/lang/en-us.php

@@ -0,0 +1,57 @@
+<?php
+
+
+return [
+    'yuan_zhong_xiu' => 'YUAN ZHONG XIU',
+    // 侧边栏
+    'home' => 'Home',
+    'customer_management' => 'Customer Manage',
+    'customer_communication' => 'Customer linkup',
+    'commodity_management' => 'Commodity Manage',
+    'product_list' => 'Product List',
+    'commodity_classification' => 'Product classify',
+    'Sale_and_Storage_of_Commodity' => 'IERP Manage',
+    'order_management' => 'Order Manage',
+    'stock_control' => 'Stock Control',
+    'management_of_Buddhism' => 'Buddhism Manage',
+    'store_management' => 'Store Manage',
+    'store_list' => 'Store List',
+    'e_commerce'    => 'E commerce',
+    'staff_management'    => 'Staff Manage',
+    'financial_management'    => 'Financial Manage',
+    'account_management'    => 'Account Manage',
+    'division_management'    => 'Division Manage',
+    'authority_management'    => 'Authority Manage',
+    'system_settings'    => 'System Settings',
+    'collection_channel_management'    => 'Collection channel Manage',
+    'yu_long_bi_management'    => 'YULONGBI Manage',
+
+    'unfold_search' => 'Unfold Search',
+    'condition' => 'Condition',
+    'add'    => 'Add',
+    'delete'    => 'Delete',
+    'edit'      => 'Edit',
+    'search'    => 'Search',
+    'operation' => 'Operation',
+    'select'    => 'Select',
+
+    'delete_time' => 'Delete At',
+    'create_time' => 'Create At',
+    'update_time' => 'Create At',
+
+    'id' => 'ID',
+    'name' => 'Name',
+    'mobile'     => 'Mobile',
+    'sex'     => 'Sex',
+    'sun_calendar' => 'Sun calendar',
+    'lunar_calendar' => 'Lunar calendar',
+    'follow_user_id' => 'Follow User ID',
+    'follow_username' => 'Follow Username',
+    'linkman' => 'Linkman',
+    'relation' => 'Relation',
+    'address' => 'Address',
+    'email' => 'Email',
+    'store_id'=>'Store ID',
+    'store_abbr' => 'Store Addr',
+
+];

+ 86 - 0
app/admin/lang/zh-cn.php

@@ -0,0 +1,86 @@
+<?php
+
+return [
+    'yuan_zhong_xiu' => '缘中秀',
+    // 侧边栏
+    'home' => '后台首页',
+    'customer_management' => '客户管理',
+    'customer_communication' => '客户沟通',
+    'commodity_management' => '商品管理',
+    'product_list' => '商品列表',
+    'commodity_classification' => '商品分类',
+    'Sale_and_Storage_of_Commodity' => '进销存管理',
+    'order_management' => '订单管理',
+    'stock_control' => '库存管理',
+    'management_of_Buddhism' => '佛教管理',
+    'store_management' => '门店管理',
+    'store_list' => '门店列表',
+    'e_commerce'    => '电子商务',
+    'staff_management'    => '员工管理',
+    'financial_management'    => '财务管理',
+    'account_management'    => '账号管理',
+    'division_management'    => '部门管理',
+    'authority_management'    => '权限管理',
+    'system_settings'    => '系统设置',
+    'collection_channel_management'    => '收款渠道管理',
+    'yu_long_bi_management'    => '御龙币管理',
+
+
+    'add'       => '新增',
+    'delete'    => '删除',
+    'edit'      => '编辑',
+    'condition' => '条件',
+    'search'    => '搜索',
+    'operation' => '操作',
+    'select'    => '查看',
+    'Reset'     => '重置',
+    'Confirm'   => '确定',
+    'Submit'    => '提交',
+    'Succeed'   => '成功',
+    'unfold_search' => '展开搜索',
+    'Please fill in' => '请填写',
+    'Fail to add. Data duplication' => '添加失败,数据重复!',
+    'Please select the data you want to delete' => '请选择您要删除的数据!',
+    'Check at least one box' => '至少需要勾选一条进行删除',
+    'ID not exist' => 'ID不存在!',
+
+
+
+
+
+
+
+
+
+
+
+
+    'delete_time' => '删除时间',
+    'create_time' => '创建时间',
+    'update_time' => '修改时间',
+
+    'Man' => '男',
+    'Woman' => '女',
+    'Unknown' => '未知',
+
+    'id' => 'ID',
+    'name_zh' => '中文名',
+    'name_en' => '英文名',
+    'name' => '名称',
+    'mobile'     => '电话',
+    'sex'     => '性别',
+    'sun_calendar' => '阳历',
+    'lunar_calendar' => '阴历',
+    'follow_user_id' => '跟进人ID',
+    'follow_username' => '跟进人姓名',
+    'linkman' => '联系人',
+    'relation' => '关系',
+    'address' => '地址',
+    'email' => '邮箱',
+    'Store' => '门店',
+    'store_id'=>'门店ID',
+    'store_abbr' => '门店简称',
+
+
+
+];

+ 1 - 0
app/admin/middleware.php

@@ -8,4 +8,5 @@ return [
     // Session初始化
     // \think\middleware\SessionInit::class
 //    \app\common\middleware\VerifyToken::class,
+    \think\middleware\LoadLangPack::class
 ];

+ 1 - 1
app/admin/view/common/_js_css.html

@@ -11,4 +11,4 @@
 <!-- 引入 layui.js -->
 <script src="//unpkg.com/layui@2.7.6/dist/layui.js"></script>
 <!--引入请求类-->
-<script type="text/javascript" src="__JS__/request.js"></script>
+<script type="text/javascript" src="__JS__/common.js"></script>

+ 153 - 0
app/admin/view/customer/add.html

@@ -0,0 +1,153 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+  <div class="lyear-layout-container">
+    <!--页面主要内容-->
+    <main>
+      <div class="container-fluid">
+        <div class="row">
+          <div class="col-lg-12">
+            <div class="card">
+              <div class="card-body">
+                <form class="layui-form" action="">
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("name_zh")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="name_zh" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("name_en")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="name_en" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                      <label class="layui-form-label">{:lang("mobile")}</label>
+                      <div class="layui-input-block">
+                        <input type="tel" name="mobile" lay-verify="required|phone" autocomplete="off" class="layui-input demo-phone layui-form-danger">
+                      </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang('sex')}</label>
+                    <div class="layui-input-block">
+                      <select name="sex" lay-filter="required">
+                        <option value="1">{:lang('Man')}</option>
+                        <option value="2">{:lang('Woman')}</option>
+                        <option value="3">{:lang('Unknown')}</option>
+                      </select>
+                    </div>
+                  </div>
+
+                  <div class="layui-inline">
+                    <label class="layui-form-label">{:lang("sun_calendar")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="sun_calendar" id="sun_calendar" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
+                    </div>
+                  </div>
+
+                  <div class="layui-inline">
+                    <label class="layui-form-label">{:lang("lunar_calendar")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="lunar_calendar" id="lunar_calendar" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("follow_user_id")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="follow_user_id" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("linkman")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="linkman" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("relation")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="relation" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("address")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="address" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <div class="layui-inline">
+                      <label class="layui-form-label">{:lang("email")}</label>
+                      <div class="layui-input-block">
+                        <input type="text" name="email" lay-verify="email" autocomplete="off" class="layui-input">
+                      </div>
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang('Store')}</label>
+                    <div class="layui-input-block">
+                      <select name="store_id" lay-filter="required">
+                        {volist name="stores" id="item"}
+                        <option value="{$item.id}">{$item.name}</option>
+                        {/volist}
+                      </select>
+                    </div>
+                  </div>
+                  <div class="layui-form-item">
+                    <div class="layui-input-block">
+                      <button type="submit" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
+                      <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                    </div>
+                  </div>
+                </form>
+
+              </div>
+            </div>
+          </div>
+
+        </div>
+
+      </div>
+    </main>
+    <!--End 页面主要内容-->
+  </div>
+</div>
+<script>
+  //当你在iframe页面关闭自身时
+  var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
+  // parent.layer.close(index); //再执行关闭
+
+  layui.use(['laydate','form'], () => {
+    const laydate = layui.laydate;
+    const form = layui.form;
+
+    form.on('submit(caviar_submit_btn)', (data) =>{
+      const response = request('/admin/customer/add',data.field)
+      response.then((res) => {
+          res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
+            location.reload();
+          }) : layer.msg(res.message,{icon: 5})
+      })
+      return false;
+    });
+
+
+    laydate.render({
+      elem: '#sun_calendar' //指定元素
+    });
+    laydate.render({
+      elem: '#lunar_calendar' //指定元素
+    });
+  });
+</script>

+ 153 - 0
app/admin/view/customer/edit.html

@@ -0,0 +1,153 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+  <div class="lyear-layout-container">
+    <!--页面主要内容-->
+    <main>
+      <div class="container-fluid">
+        <div class="row">
+          <div class="col-lg-12">
+            <div class="card">
+              <div class="card-body">
+                <form class="layui-form" action="">
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("name_zh")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="name_zh" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("name_en")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="name_en" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                      <label class="layui-form-label">{:lang("mobile")}</label>
+                      <div class="layui-input-block">
+                        <input type="tel" name="mobile" lay-verify="required|phone" autocomplete="off" class="layui-input demo-phone layui-form-danger">
+                      </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang('sex')}</label>
+                    <div class="layui-input-block">
+                      <select name="sex" lay-filter="required">
+                        <option value="1">{:lang('Man')}</option>
+                        <option value="2">{:lang('Woman')}</option>
+                        <option value="3">{:lang('Unknown')}</option>
+                      </select>
+                    </div>
+                  </div>
+
+                  <div class="layui-inline">
+                    <label class="layui-form-label">{:lang("sun_calendar")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="sun_calendar" id="sun_calendar" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
+                    </div>
+                  </div>
+
+                  <div class="layui-inline">
+                    <label class="layui-form-label">{:lang("lunar_calendar")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="lunar_calendar" id="lunar_calendar" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("follow_user_id")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="follow_user_id" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("linkman")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="linkman" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("relation")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="relation" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("address")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="address" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <div class="layui-inline">
+                      <label class="layui-form-label">{:lang("email")}</label>
+                      <div class="layui-input-block">
+                        <input type="text" name="email" lay-verify="email" autocomplete="off" class="layui-input">
+                      </div>
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang('Store')}</label>
+                    <div class="layui-input-block">
+                      <select name="store_id" lay-filter="required">
+                        {volist name="stores" id="item"}
+                        <option value="{$item.id}">{$item.name}</option>
+                        {/volist}
+                      </select>
+                    </div>
+                  </div>
+                  <div class="layui-form-item">
+                    <div class="layui-input-block">
+                      <button type="submit" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
+                      <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                    </div>
+                  </div>
+                </form>
+
+              </div>
+            </div>
+          </div>
+
+        </div>
+
+      </div>
+    </main>
+    <!--End 页面主要内容-->
+  </div>
+</div>
+<script>
+  //当你在iframe页面关闭自身时
+  var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
+  // parent.layer.close(index); //再执行关闭
+
+  layui.use(['laydate','form'], () => {
+    const laydate = layui.laydate;
+    const form = layui.form;
+
+    form.on('submit(caviar_submit_btn)', (data) =>{
+      const response = request('/admin/customer/add',data.field)
+      response.then((res) => {
+          res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
+            location.reload();
+          }) : layer.msg(res.message,{icon: 5})
+      })
+      return false;
+    });
+
+
+    laydate.render({
+      elem: '#sun_calendar' //指定元素
+    });
+    laydate.render({
+      elem: '#lunar_calendar' //指定元素
+    });
+  });
+</script>

+ 70 - 107
app/admin/view/customer/index.html

@@ -4,73 +4,31 @@
     <div class="row">
         <div class="col-lg-12">
             <div class="card" id="select_card_caviar"  style="display: none">
-                <div class="card-header">搜索条件</div>
+                <div class="card-header">{$Think.lang.condition}</div>
                 <div class="card-body">
                     <form action="{:url('admin/customer/index')}" method="post" class="form-horizontal form-search">
                         <div class="row">
                             <div class="col-md-4">
                                 <div class="form-group">
-                                    <label class="w-120 pull-left control-label"><span class="text-danger">*</span> 客户名称</label>
+                                    <label class="w-120 pull-left control-label">{$Think.lang.name}</label>
                                     <div class="pull-left w-120-calc">
-                                        <input type="text" class="form-control pull-left" name="name" value="" placeholder="客户名称" />
+                                        <input type="text" class="form-control pull-left" name="name" value="{$params.name}" placeholder="{$Think.lang.name}" />
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-4">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("phone")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <input type="text" class="form-control pull-left" name="mobile" value="{$params.mobile}" placeholder="{:lang('mobile')}" />
                                     </div>
                                 </div>
                             </div>
-<!--                            <div class="col-md-4">-->
-<!--                                <div class="form-group">-->
-<!--                                    <label class="w-120 pull-left control-label"><span class="text-danger">*</span> 任务类型</label>-->
-<!--                                    <div class="pull-left w-120-calc">-->
-<!--                                        <select name="type" class="form-control" id="type">-->
-<!--                                            <option value="1">小说</option>-->
-<!--                                            <option value="2">古籍</option>-->
-<!--                                            <option value="3">专辑</option>-->
-<!--                                            <option value="4">自传</option>-->
-<!--                                        </select>-->
-<!--                                    </div>-->
-<!--                                </div>-->
-<!--                            </div>-->
-<!--                            <div class="col-md-4">-->
-<!--                                <div class="form-group">-->
-<!--                                    <label class="w-120 pull-left control-label">任务描述</label>-->
-<!--                                    <div class="pull-left w-120-calc">-->
-<!--                                        <input type="text" class="form-control pull-left" name="name" value="" placeholder="任务描述" />-->
-<!--                                    </div>-->
-<!--                                </div>-->
-<!--                            </div>-->
-<!--                            <div class="col-md-4">-->
-<!--                                <div class="form-group">-->
-<!--                                    <label class="w-120 pull-left control-label"><span class="text-danger">*</span> 责任人</label>-->
-<!--                                    <div class="pull-left w-120-calc">-->
-<!--                                        <input type="text" class="form-control pull-left" name="name" value="" placeholder="责任人" />-->
-<!--                                    </div>-->
-<!--                                </div>-->
-<!--                            </div>-->
-<!--                            <div class="col-md-4">-->
-<!--                                <div class="form-group">-->
-<!--                                    <label class="w-120 pull-left control-label"><span class="text-danger">*</span> 提醒时间</label>-->
-<!--                                    <div class="pull-left w-120-calc">-->
-<!--                                        <input class="form-control js-datepicker" type="text" name="example-datepicker" placeholder="yyyy-mm-dd" value="" data-date-format="yyyy-mm-dd" />-->
-<!--                                    </div>-->
-<!--                                </div>-->
-<!--                            </div>-->
-<!--                            <div class="col-md-4">-->
-<!--                                <div class="form-group">-->
-<!--                                    <label class="w-120 pull-left control-label">执行人</label>-->
-<!--                                    <div class="pull-left w-120-calc">-->
-<!--                                        <select name="type" class="form-control">-->
-<!--                                            <option value="1">马小云</option>-->
-<!--                                            <option value="2">马小腾</option>-->
-<!--                                            <option value="3">张小阳</option>-->
-<!--                                            <option value="4">唐小磊</option>-->
-<!--                                        </select>-->
-<!--                                    </div>-->
-<!--                                </div>-->
-<!--                            </div>-->
                             <div class="col-md-4">
                                 <div class="form-group">
                                     <label class="w-120 pull-left control-label"></label>
                                     <div class="pull-left w-120-calc">
-                                        <button class="btn btn-success m-r-5" id="caviar_send_btn" type="submit" href="#">搜索</button>
+                                        <button class="btn btn-success m-r-5" id="caviar_send_btn" type="submit" href="#">{:lang('search')}</button>
                                     </div>
                                 </div>
                             </div>
@@ -82,9 +40,9 @@
             <div class="card">
                 <div class="card-toolbar clearfix">
                     <div class="toolbar-btn-action">
-                        <a class="btn btn-success m-r-5" id="caviar_search_btn" href="#!" onclick="select_card_switch()">展开搜索</a>
-                        <a class="btn btn-primary m-r-5" href="#!" onclick="add()"><i class="mdi mdi-plus"></i> 新增</a>
-                        <a class="btn btn-danger" href="#!"><i class="mdi mdi-window-close"></i> 删除</a>
+                        <a class="btn btn-success m-r-5" id="caviar_search_btn" href="#!" onclick="select_card_switch()">{$Think.lang.unfold_search}</a>
+                        <a class="btn btn-primary m-r-5" href="#!" onclick="add('{:url(\'admin/customer/add\')}')"><i class="mdi mdi-plus"></i> {:lang('add')}</a>
+                        <a class="btn btn-danger" href="#!" onclick="caviar_delete()"><i class="mdi mdi-window-close"></i> {:lang('delete')}</a>
                     </div>
                 </div>
                 <div class="card-body">
@@ -97,17 +55,19 @@
                                         <input type="checkbox" id="check-all" onclick="checkbox()"><span></span>
                                     </label>
                                 </th>
-                                <th>客户ID</th>
-                                <th>客户名称</th>
-                                <th>手机号码</th>
-                                <th>性别</th>
-                                <th>阳历</th>
-                                <th>阴历</th>
-                                <th>跟进人</th>
-                                <th>地址</th>
-                                <th>邮箱</th>
-                                <th>门店ID</th>
-                                <th>操作</th>
+                                <th>{$Think.lang.ID}</th>
+                                <th>{$Think.lang.name_zh}</th>
+                                <th>{$Think.lang.name_en}</th>
+                                <th>{:lang('phone')}</th>
+                                <th>{:lang('sex')}</th>
+                                <th>{:lang('sun_calendar')}</th>
+                                <th>{:lang('lunar_calendar')}</th>
+                                <th>{:lang('follow_user_id')}/{:lang('follow_username')}</th>
+                                <th>{:lang('address')}</th>
+                                <th>{:lang('email')}</th>
+                                <th>{:lang('store_id')}/{:lang('store_abbr')}</th>
+                                <th>{:lang('create_time')}</th>
+                                <th>{:lang('operation')}</th>
                             </tr>
                             </thead>
                             <tbody>
@@ -119,20 +79,22 @@
                                     </label>
                                 </td>
                                 <td>{$item.id}</td>
-                                <td>{$item.name}</td>
+                                <td>{$item.name_zh}</td>
+                                <td>{$item.name_en}</td>
                                 <td>{$item.mobile}</td>
                                 <td>{$item.sex}</td>
                                 <td>{$item.sun_calendar}</td>
                                 <td>{$item.lunar_calendar}</td>
-                                <td>【{$item.user_id}】 {$item.username}</td>
+                                <td>【{$item.follow_user_id}】{$item.follow_username}</td>
                                 <td>{$item.address}</td>
                                 <td>{$item.email}</td>
-                                <td>{$item.store_id}</td>
+                                <td>【{$item.store_id}】/{$item.store_abbr}</td>
+                                <td>{$item.create_time}</td>
                                 <td>
                                     <div class="btn-group">
-                                        <a class="btn btn-xs btn-default" href="#!" title="编辑" data-toggle="tooltip"><i class="mdi mdi-pencil"></i></a>
-                                        <a class="btn btn-xs btn-default" href="#!" title="查看" data-toggle="tooltip"><i class="mdi mdi-eye"></i></a>
-                                        <a class="btn btn-xs btn-default" href="#!" title="删除" data-toggle="tooltip"><i class="mdi mdi-window-close"></i></a>
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('edit')}" data-toggle="tooltip"><i class="mdi mdi-pencil"></i></a>
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('select')}" data-toggle="tooltip"><i class="mdi mdi-eye"></i></a>
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('delete')}" data-toggle="tooltip"><i class="mdi mdi-window-close"></i></a>
                                     </div>
                                 </td>
                             </tr>
@@ -140,9 +102,7 @@
                             </tbody>
                         </table>
                     </div>
-                    <ul class="pagination">
-                        {$list|raw}
-                    </ul>
+                    {$list|raw}
                 </div>
             </div>
         </div>
@@ -151,38 +111,41 @@
 
 <script type="text/javascript">
 
-    console.log("{$params.name}")
-
-    // 搜索开关
-    function select_card_switch() {
-        const element = $('#select_card_caviar')
-        console.log(element.css('display'))
-        if(element.css('display') === 'none') {
-            element.css('display','block');
-            $("#caviar_search_btn").val("关闭搜索")
-        } else {
-            element.css('display','none');
-            $("#caviar_search_btn").val("展开搜索")
-        }
+    if(check_params(["{$params.name}", "{$params.mobile}"])) {
+        $('#select_card_caviar').css('display','block');
     }
 
-    function checkbox() {
-        const isSelect = $("#check-all").is(":checked")
-        isSelect ? $("input[class='checkbox_caviar']").each(function(i,n){
-            n.checked = true;
-        }) : $("input[class='checkbox_caviar']").each(function(i,n){
-            n.checked = false;
-        })
+    async function caviar_delete() {
+        const ids = $('.checkbox_caviar:checkbox:checked').map((index,el) => {
+            return $(el).val();
+        }).get();
+        if(ids.length === 0) {
+            layer.msg("{:lang('Check at least one box')}",{icon: 5})
+            return false;
+        }
+        const response = await request('{:url("admin/customer/delete")}', {ids:ids.join(',')});
+        response.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
+            location.reload();
+        }) : layer.msg(res.message,{icon: 5})
+        console.log(response)
     }
 
-    function add() {
-        layui.use('layer', function(){
-            var layer = layui.layer;
-            layer.open({
-                type: 2,
-                content: '{:url("admin/admin/add")}',// [ 'no'],
-                area: ['1000px','600px']
-            });
-        });
-    }
 </script>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 12 - 48
app/admin/view/index/index.html

@@ -3,7 +3,7 @@
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
-    <title>后台管理系统模板</title>
+        <title>{$Think.lang.yuan_zhong_xiu}</title>
     <link rel="icon" href="favicon.ico" type="image/ico">
     <link href="__CSS__/bootstrap.min.css" rel="stylesheet">
     <link href="__CSS__/materialdesignicons.min.css" rel="stylesheet">
@@ -19,62 +19,26 @@
 
             <!-- logo -->
             <div id="logo" class="sidebar-header">
-                <a href="index.html" style="padding-top: 11%"><h3>缘中秀后台</h3></a>
+                <a href="index.html" style="padding-top: 11%"><h3>{$Think.lang.yuan_zhong_xiu}</h3></a>
             </div>
             <div class="lyear-layout-sidebar-scroll">
 
                 <nav class="sidebar-main">
                     <ul class="nav nav-drawer">
-                        <li class="nav-item active"> <a class="multitabs" href="{:url('admin/index/home')}"><i class="mdi mdi-home"></i> <span>后台首页</span></a></li>
-                        <li class="nav-item active"> <a class="multitabs" href="{:url('admin/customer/index')}"><i class="mdi mdi-home"></i> <span>客户管理</span></a></li>
-                        <li class="nav-item active"> <a class="multitabs" href="#"><i class="mdi mdi-home"></i> <span>客户沟通</span></a></li>
-
-
-                        <li class="nav-item nav-item-has-subnav">
-                            <a href="javascript:void(0)"><i class="mdi mdi-format-align-justify"></i> <span>商品管理</span></a>
-                            <ul class="nav nav-subnav">
-                                <li> <a class="multitabs" href="#">商品列表</a> </li>
-                                <li> <a class="multitabs" href="#">商品分类</a> </li>
-                            </ul>
-                        </li>
-
-                        <li class="nav-item nav-item-has-subnav">
-                            <a href="javascript:void(0)"><i class="mdi mdi-account-key"></i> 进销存管理</a>
-                            <ul class="nav nav-subnav">
-                                <li> <a class="multitabs" href="#"> 订单管理</a> </li>
-                                <li> <a class="multitabs" href="#"> 库存管理</a> </li>
-                            </ul>
-                        </li>
-                        <li class="nav-item active"> <a class="multitabs" href="#"><i class="mdi mdi-home"></i> <span>佛教管理</span></a></li>
-
-                        <li class="nav-item nav-item-has-subnav">
-                            <a href="javascript:void(0)"><i class="mdi mdi-account-key"></i> 门店管理</a>
-                            <ul class="nav nav-subnav">
-                                <li> <a class="multitabs" href="#"> 门店列表</a> </li>
-                                <li> <a class="multitabs" href="#"> 电子商务</a> </li>
-                            </ul>
-                        </li>
-
-                        <li class="nav-item">
-                            <a class="multitabs" href="#"><i class="mdi mdi-home"></i>员工管理</a>
-                        </li>
-                        <li class="nav-item">
-                            <a class="multitabs" href="#"><i class="mdi mdi-home"></i>财务管理</a>
-                        </li>
-                        <li class="nav-item nav-item-has-subnav">
-                            <a href="javascript:void(0)"><i class="mdi mdi-account-key"></i> 账号管理</a>
-                            <ul class="nav nav-subnav">
-                                <li> <a class="multitabs" href="#"> 部门管理</a> </li>
-                                <li> <a class="multitabs" href="#"> 权限管理</a> </li>
-                            </ul>
-                        </li>
+                        {volist name="rules" id="item"}
+                        {if count($item.children) == 0}
+                        <li class="nav-item"> <a class="multitabs" href="{$item.url}"><i class="{$item.icon}"></i> <span>{:lang($item.lang)}</span></a></li>
+                        {else /}
                         <li class="nav-item nav-item-has-subnav">
-                            <a href="javascript:void(0)"><i class="mdi mdi-account-key"></i> 系统设置</a>
+                            <a href="javascript:void(0)"><i class="{$item.icon}"></i> <span>{:lang($item.lang)}</span></a>
                             <ul class="nav nav-subnav">
-                                <li> <a class="multitabs" href="#"> 收款渠道管理</a> </li>
-                                <li> <a class="multitabs" href="#"> 御龙币管理</a> </li>
+                                {volist name="$item.children" id="el"}
+                                <li> <a class="multitabs" href="{$el.url}">{:lang($el.lang)}</a> </li>
+                                {/volist}
                             </ul>
                         </li>
+                        {/if}
+                        {/volist}
                     </ul>
                 </nav>
 

+ 33 - 3
app/common.php

@@ -3,12 +3,42 @@
 
 /**
  * @param bool $bool
- * @param $msg
+ * @param $message
  * @param int $code
  * @throws \app\exception\BaseException
  */
-function predicate(bool $bool, $msg, $code = 1012) {
+function predicate(bool $bool, $message, $code = 1012) {
     if (!$bool) {
-        throw new \app\exception\BaseException($msg, $code);
+        throw new \app\exception\BaseException($message, $code);
     }
 }
+
+/**
+ * 格式化字符串
+ * @param $value
+ * @param null $def
+ * @return null
+ */
+function format_string($value, $def = null) {
+    if(!isset($value) || $value == null || $value == "") return $def;
+    return $value;
+}
+
+/**
+ * @param $array
+ * @param $id
+ * @return array 树状Menu
+ */
+function recursion($array, $id)
+{
+    $resArray = [];
+    foreach ($array as $key => $value)
+    {
+        if ($value['pid'] == $id)
+        {
+            $resArray[$key] = $array[$key];
+            $resArray[$key]['children'] = recursion($array, $value['id']);
+        }
+    }
+    return $resArray;
+}

+ 6 - 2
app/common/model/AdminModel.php

@@ -26,11 +26,15 @@ class AdminModel extends BaseModel
         return $this->where([
             ['account', '=', $username],
             ['password', '=', $password],
+            ['is_delete', '=',0]
         ])->find();
     }
 
     public function refreshToken($adminId,$token) {
-        return $this->where('id',$adminId)->update(['token' => $token]);
+        return $this->where([
+            ['id', '=',$adminId],
+            ['is_delete', '=',0]
+        ])->update(['token' => $token]);
     }
 
     /**
@@ -38,7 +42,7 @@ class AdminModel extends BaseModel
      * @throws \think\db\exception\DbException
      */
     public function findAdmins() {
-        return $this->paginate(10);
+        return $this->where('is_delete',0)->paginate(10);
     }
 
 

+ 18 - 0
app/common/model/AuthGroupAccessModel.php

@@ -0,0 +1,18 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class AuthGroupAccessModel extends BaseModel
+{
+    protected $table = 'erp_auth_group_access';
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+
+
+
+}

+ 16 - 0
app/common/model/AuthGroupModel.php

@@ -0,0 +1,16 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class AuthGroupModel extends BaseModel
+{
+    protected $table = 'erp_auth_group';
+
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+}

+ 15 - 0
app/common/model/AuthRuleModel.php

@@ -0,0 +1,15 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class AuthRuleModel extends BaseModel
+{
+    protected $table = 'erp_auth_rule';
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+}

+ 23 - 3
app/common/model/BaseModel.php

@@ -3,20 +3,23 @@
 
 namespace app\common\model;
 
+use think\Collection;
 use think\Model;
-use think\model\concern\SoftDelete;
 
 abstract class BaseModel extends Model
 {
     protected $autoWriteTimestamp = true;
 
-    use SoftDelete;
-    protected $deleteTime = 'delete_time';
     protected $updateTime = 'update_time';
     protected $createTime = 'create_time';
+    public function __call($method, $args)
+    {
+        return parent::__call($method, $args); // TODO: Change the autogenerated stub
+    }
 
     abstract protected function genSchema(array $schema);
 
+
     public function getCreateTimeAttr($v) {
         if(!$v)return $v;
         return date("Y-m-d H:i:s", $v);
@@ -27,4 +30,21 @@ abstract class BaseModel extends Model
         return date("Y-m-d H:i:s", $v);
     }
 
+
+    public function deleteByIds(array $ids) {
+        return $this->whereIn('id',$ids)->update(['is_delete' => 1]);
+    }
+
+    public function findById($id) {
+        return $this->find([
+            ['id',$id],
+            ['is_delete', 0],
+        ]);
+    }
+
+
+
+
+
+
 }

+ 10 - 4
app/common/model/CustomerModel.php

@@ -13,6 +13,11 @@ class CustomerModel extends BaseModel
         return ['', '男', '女', '未知'][$value];
     }
 
+    public function doesItExist($mobile) {
+        $customer = $this->where("mobile", $mobile)->find();
+        return $customer ? true : false;
+    }
+
 
     protected function genSchema(array $schema)
     {
@@ -43,16 +48,17 @@ class CustomerModel extends BaseModel
      * @throws \think\db\exception\DbException
      */
     public function findCustomerPage(array $params) {
-        $where = [];
+        $where = [
+            'is_delete' => 0
+        ];
         if(isset($params['name'])) {
             array_push($where,['name', 'like', "%".$params['name']."%"]);
         }
         if(count($where) > 0) {
-            return $this->where($where)->paginate(10);
+            return $this->where($where)->order('create_time','desc')->paginate(['list_rows'=>10, "query" => $params]);
         }
-        return $this->paginate(10);
+        return $this->order('create_time','desc')->paginate(['list_rows'=>10, "query" => $params]);
     }
 
 
-
 }

+ 20 - 0
app/common/model/StoreModel.php

@@ -0,0 +1,20 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class StoreModel extends BaseModel
+{
+    protected $table = 'erp_store';
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+
+    public function findAllStore() {
+        return $this->order('id','desc')->select();
+    }
+
+}

+ 2 - 2
config/lang.php

@@ -5,9 +5,9 @@
 
 return [
     // 默认语言
-    'default_lang'    => env('lang.default_lang', 'zh-cn'),
+    'default_lang'    => env('lang.default_lang', 'en-us'),
     // 允许的语言列表
-    'allow_lang_list' => [],
+    'allow_lang_list' => ['zh-cn', 'en-us'],
     // 多语言自动侦测变量名
     'detect_var'      => 'lang',
     // 是否使用Cookie记录