diff --git a/app/admin/controller/News/News.php b/app/admin/controller/News/News.php
new file mode 100644
index 0000000..f6a3384
--- /dev/null
+++ b/app/admin/controller/News/News.php
@@ -0,0 +1,187 @@
+param();
+ $con = [];
+
+ $con = Tool::getOptionalQuery(['news_type','='],['news_title','LIKE'],);
+
+ $query = ModelNews::where($con)
+ ->field([
+'news_id',
+'news_guid',
+'news_type',
+'news_title',
+'news_intro',
+'news_source',
+'news_link',
+'news_issue_date',
+'news_views_num',
+'news_sort',
+'news_content'
+])
+ ->order('news_sort', 'asc');
+
+ return $isExport ? $query->select()->toArray() : msg("获取新闻列表成功!",$query);
+ }
+
+ /**
+ * 添加新闻
+ */
+ public function addNews(Request $request): array
+ {
+ Db::startTrans();
+ Tool::adminLockTableWrite('news');
+ try {
+ $params = $request->param();
+ $this->validate($params, [
+'news_type|新闻类型'=>'require',
+'news_title|新闻标题'=>'require',
+'news_sort|新闻排序'=>'require'
+]);
+ $model = ModelNews::create($params,[
+'news_type',
+'news_title',
+'news_intro',
+'news_source',
+'news_link',
+'news_issue_date',
+'news_views_num',
+'news_sort',
+'news_content',
+'news_guid',
+'news_create_user_guid',
+'news_update_user_guid'
+]);
+ Db::commit();
+ Tool::unlockTable();
+ return msg('添加成功!');
+ } catch (\Throwable $th) {
+ Db::rollback();
+ Tool::unlockTable();
+ throw $th;
+ }
+ }
+
+ /**
+ * 编辑新闻
+ */
+ public function editNews(Request $request): array
+ {
+ Db::startTrans();
+ Tool::adminLockTableWrite('news');
+ try {
+ $params = $request->param();
+ $this->validate($params, [
+'news_type|新闻类型'=>'require',
+'news_title|新闻标题'=>'require',
+'news_sort|新闻排序'=>'require'
+]);
+ $model = ModelNews::where('news_guid',$params['news_guid'])->find();
+ if (!$model) throwErrorMsg("该新闻不存在", 1);
+ $model->allowField([
+'news_type',
+'news_title',
+'news_intro',
+'news_source',
+'news_link',
+'news_issue_date',
+'news_views_num',
+'news_sort',
+'news_content',
+'news_update_user_guid'
+])->save($params);
+ Db::commit();
+ Tool::unlockTable();
+ return msg('编辑成功!');
+ } catch (\Throwable $th) {
+ Db::rollback();
+ Tool::unlockTable();
+ throw $th;
+ }
+ }
+
+ /**
+ * 删除新闻
+ */
+ public function deleteNews(Request $request): array
+ {
+ Db::startTrans();
+ Tool::adminLockTableWrite('news');
+ try {
+ $params = $request->param();
+ $this->validate($params, [
+ 'news_guid' => 'require',
+ ]);
+ $news = ModelNews::where([
+ 'news_guid' => explode(',', $params['news_guid'])
+ ])->select();
+ $news->delete();
+ Db::commit();
+ Tool::unlockTable();
+ return msg('删除成功!');
+ } catch (\Throwable $th) {
+ Db::rollback();
+ Tool::unlockTable();
+ throw $th;
+ }
+ }
+
+ /**
+* 导出Excel
+*/
+ public function exportExcel(Request $request):void
+ {
+ ModelNews::exportExcel(self::getNewsList($request, true));
+ }
+
+ /**
+* 下载导入模板
+*/
+ public function downloadTemplate(Request $request):void
+ {
+ $params = $request->param();
+ $data = [
+ array_values(ModelNews::EXCELFIELD),
+ ['默认值1','默认值2','默认值3','默认值4','默认值5','默认值6','默认值7','默认值8','默认值9',]
+ ];
+ $excel = (new Excel())->exporTsheet($data);
+ $excel->save('新闻导入模板.xlsx');
+ }
+
+ /**
+* 导入excel
+*/
+ public function importExcel(Request $request):array
+ {
+ $file = new UploadFile('uploads', 'fileExt:xlsx');
+ $file->putFile('news');
+ $msg = ModelNews::importExcel($file);
+ return [
+ 'code' => 0,
+ 'msg' => $msg
+ ];
+ }
+
+}
diff --git a/app/admin/controller/Products/Product.php b/app/admin/controller/Products/Product.php
new file mode 100644
index 0000000..777eec1
--- /dev/null
+++ b/app/admin/controller/Products/Product.php
@@ -0,0 +1,163 @@
+param();
+ $con = [];
+
+ $con = Tool::getOptionalQuery(['a.product_type_guid', '='], ['product_name', 'LIKE'],);
+
+ $query = ModelProduct::alias('a')
+ ->leftjoin('product_type b', 'a.product_type_guid = b.product_type_guid')
+ ->where($con)
+ ->field([
+ 'a.product_id',
+ 'a.product_guid',
+ 'a.product_type_guid',
+ 'b.product_type_name',
+ 'a.product_name',
+ 'a.product_img',
+ 'a.product_description',
+ 'a.product_link',
+ 'a.product_details',
+ 'a.product_sort'
+ ])
+ ->order('product_sort', 'asc');
+
+ return $isExport ? $query->select()->toArray() : msg("获取产品列表成功!", $query);
+ }
+
+ /**
+ * 添加产品
+ */
+ public function addProduct(Request $request): array
+ {
+ $params = $request->param();
+ $this->validate($params, [
+ 'product_type_guid|产品类目' => 'require',
+ 'product_name|产品名称' => 'require',
+ 'product_img|产品图片' => 'require',
+ 'product_sort|产品排序' => 'require'
+ ]);
+ $model = ModelProduct::create($params, [
+ 'product_type_guid',
+ 'product_name',
+ 'product_img',
+ 'product_description',
+ 'product_link',
+ 'product_details',
+ 'product_sort',
+ 'product_guid',
+ 'product_create_user_guid',
+ 'product_update_user_guid'
+ ]);
+ return msg('添加成功!');
+ }
+
+ /**
+ * 编辑产品
+ */
+ public function editProduct(Request $request): array
+ {
+ $params = $request->param();
+ $this->validate($params, [
+ 'product_type_guid|产品类目' => 'require',
+ 'product_name|产品名称' => 'require',
+ 'product_img|产品图片' => 'require',
+ 'product_sort|产品排序' => 'require'
+ ]);
+ $model = ModelProduct::where('product_guid', $params['product_guid'])->find();
+ if (!$model) throwErrorMsg("该产品不存在", 1);
+ $model->allowField([
+ 'product_type_guid',
+ 'product_name',
+ 'product_img',
+ 'product_description',
+ 'product_link',
+ 'product_details',
+ 'product_sort',
+ 'product_update_user_guid'
+ ])->save($params);
+ return msg('编辑成功!');
+ }
+
+ /**
+ * 删除产品
+ */
+ public function deleteProduct(Request $request): array
+ {
+ $params = $request->param();
+ $this->validate($params, [
+ 'product_guid' => 'require',
+ ]);
+ $product = ModelProduct::where([
+ 'product_guid' => explode(',', $params['product_guid'])
+ ])->select();
+ $product->delete();
+ return msg('删除成功!');
+ }
+
+ /**
+ * 导出Excel
+ */
+ public function exportExcel(Request $request): void
+ {
+ ModelProduct::exportExcel(self::getProductList($request, true));
+ }
+
+ /**
+ * 下载导入模板
+ */
+ public function downloadTemplate(Request $request): void
+ {
+ $params = $request->param();
+ $data = [
+ array_values(ModelProduct::EXCELFIELD),
+ [
+ '软件工具',
+ 'Arm Development StudioArm',
+ 'http://localhost:3000/uploads/ProductImg/20230628/f5a7065c3db295c1e3e2a26b36cb41ed.jpg',
+ 'Arm全面端到端的嵌入式开发工具',
+ '',
+ '',
+ '1',
+ ]
+ ];
+ $excel = (new Excel())->exporTsheet($data);
+ $excel->save('产品导入模板.xlsx');
+ }
+
+ /**
+ * 导入excel
+ */
+ public function importExcel(Request $request): array
+ {
+ $file = new UploadFile('uploads', 'fileExt:xlsx');
+ $file->putFile('product');
+ $msg = ModelProduct::importExcel($file);
+ return [
+ 'code' => 0,
+ 'msg' => $msg
+ ];
+ }
+}
diff --git a/app/admin/controller/Products/ProductType.php b/app/admin/controller/Products/ProductType.php
new file mode 100644
index 0000000..a2dc94c
--- /dev/null
+++ b/app/admin/controller/Products/ProductType.php
@@ -0,0 +1,237 @@
+ "product_type_parent_name",
+ 'a.product_type_title',
+ 'a.product_type_link',
+ 'a.product_type_icon',
+ 'a.product_type_order',
+ ])
+ ->alias('a')
+ ->leftjoin('product_type b', 'a.product_type_parent_guid = b.product_type_guid')
+ ->where($con)
+ ->order(['product_type_order' => 'asc'])
+ ->select()->toArray();
+
+ $Traverse = new Traverse('product_type_guid', 'product_type_parent_guid');
+ $product_type_tree = $Traverse->tree($product_type, '0', function ($v) {
+ return [
+ 'product_type_guid' => $v['product_type_guid'],
+ 'product_type_parent_guid' => $v['product_type_parent_guid'],
+ 'product_type_name' => $v['product_type_name'],
+ 'product_type_parent_name' => $v['product_type_parent_name'],
+ 'product_type_title' => $v['product_type_title'],
+ 'product_type_link' => $v['product_type_link'],
+ 'product_type_icon' => $v['product_type_icon'],
+ 'product_type_order' => $v['product_type_order'],
+ ];
+ });
+
+ return msg("获取产品类目列表成功!", $product_type_tree);
+ }
+
+ /**
+ * 编辑产品类目接口
+ *
+ * @param Request request
+ * @date 2023-03-25
+ * @example
+ * @author xjh
+ * @since 1.0.0
+ */
+ public function editProductType(Request $request): array
+ {
+ $params = $request->param();
+ $this->validate($params, [
+ 'product_type_guid|产品类目guid' => 'require',
+ 'product_type_name|产品类目名称' => 'require',
+ 'product_type_order|产品类目排序' => 'require',
+ ]);
+
+
+ $model = ModelProductType::where('product_type_guid', $params['product_type_guid'])->find();
+ if (!$model) throwErrorMsg("该产品类目不存在", 1);
+
+ ModelProductType::isDuplicateName($params['product_type_name'], $params['product_type_guid']);
+
+ $params['product_type_ancestors_guid'] = ModelProductType::buildAncestorsGuid($params['product_type_parent_guid']);
+
+ $model->allowField([
+ 'product_type_update_user_guid',
+ 'product_type_name',
+ 'product_type_title',
+ 'product_type_link',
+ 'product_type_icon',
+ 'product_type_ancestors_guid',
+ 'product_type_parent_guid',
+ 'product_type_order',
+ ])->save($params);
+ return msg('编辑成功!');
+ }
+
+
+ /**
+ * 添加产品类目接口
+ *
+ * @param Request request
+ * @date 2023-03-25
+ * @example
+ * @author xjh
+ * @since 1.0.0
+ */
+ public function addProductType(Request $request): array
+ {
+ $params = $request->param();
+ $this->validate($params, [
+ 'product_type_name|产品类型名称' => 'require',
+ 'product_type_order|产品类目排序' => 'require'
+ ]);
+
+ ModelProductType::isDuplicateName($params['product_type_name']);
+
+ $product_type_parent_where = [];
+ if (!empty($params['product_type_parent_guid'])) {
+ $params['product_type_ancestors_guid'] = ModelProductType::buildAncestorsGuid($params['product_type_parent_guid']);
+ $product_type_parent_where['product_type_parent_guid'] = $params['product_type_parent_guid'];
+ }
+
+ ModelProductType::create($params, [
+ 'product_type_guid',
+ 'product_type_create_user_guid',
+ 'product_type_update_user_guid',
+ 'product_type_parent_guid',
+ 'product_type_ancestors_guid',
+ 'product_type_name',
+ 'product_type_title',
+ 'product_type_link',
+ 'product_type_icon',
+ 'product_type_order'
+ ]);
+ return msg('添加成功!');
+ }
+
+ /**
+ * 删除产品类目接口
+ *
+ * @param Request request
+ * @date 2023-03-25
+ * @example
+ * @author xjh
+ * @since 1.0.0
+ */
+ public function deleteProductType(Request $request): array
+ {
+ Db::startTrans();
+ try {
+ $params = $request->param();
+ $this->validate($params, [
+ 'product_type_guid|产品类目guid' => 'require',
+ ]);
+ $guids = explode(',', $params['product_type_guid']);
+
+ ModelProductType::where(['product_type_guid' => $guids])->select()->delete();
+ Db::commit();
+ return msg('删除成功!');
+ } catch (\Throwable $th) {
+ Db::rollback();
+ throw $th;
+ }
+ }
+
+ /**
+ * 导出Excel接口
+ *
+ * @param Request request
+ * @date 2023-03-25
+ * @example
+ * @author xjh
+ * @since 1.0.0
+ */
+ public function exportExcel(Request $request)
+ {
+ $params = $request->param();
+ $select = ModelProductType::field([
+ 'product_type_title',
+ 'product_type_icon',
+ 'product_type_cover'
+ ])
+ ->order('product_type_update_time', 'desc')
+ ->select();
+ return ModelProductType::exportExcel($select);
+ }
+
+ /**
+ * 下载导入模板接口
+ *
+ * @param Request request
+ * @date 2023-03-25
+ * @example
+ * @author xjh
+ * @since 1.0.0
+ */
+ public function downloadTemplate(Request $request)
+ {
+ $params = $request->param();
+ $data = array_values(ModelProductType::EXCELFIELD);
+ $excel = (new Excel())->exporTsheet($data);
+ $excel->save('产品类目导入模板.xlsx');
+ }
+
+ /**
+ * 导入excel接口
+ *
+ * @param Request request
+ * @date 2023-03-25
+ * @example
+ * @author xjh
+ * @since 1.0.0
+ */
+ public function importExcel(Request $request)
+ {
+ $file = new UploadFile('uploads', 'fileExt:xlsx');
+ $file->putFile('product_type');
+
+ $msg = ModelProductType::importExcel($file);
+ return [
+ 'code' => 0,
+ 'msg' => $msg
+ ];
+ }
+}
diff --git a/app/common/model/News/News.php b/app/common/model/News/News.php
new file mode 100644
index 0000000..4cf0182
--- /dev/null
+++ b/app/common/model/News/News.php
@@ -0,0 +1,205 @@
+ 'int' ,
+ 'news_guid' => 'string' ,
+ 'news_type' => 'int' ,
+ 'news_title' => 'string' ,
+ 'news_intro' => 'string' ,
+ 'news_source' => 'string' ,
+ 'news_link' => 'string' ,
+ 'news_issue_date' => '' ,
+ 'news_views_num' => 'int' ,
+ 'news_sort' => 'int' ,
+ 'news_content' => '' ,
+ 'news_create_time' => 'datetime' ,
+ 'news_create_user_guid' => 'string' ,
+ 'news_update_time' => 'datetime' ,
+ 'news_update_user_guid' => 'string' ,
+ 'news_delete_time' => 'datetime' ,
+ 'news_delete_user_guid' => 'string' ,
+
+ ];
+ // 设置json类型字段
+ protected $json = [''];
+ // 开启自动写入时间戳字段
+ protected $autoWriteTimestamp = 'datetime';
+ // 创建时间
+ protected $createTime = 'news_create_time';
+ // 修改时间
+ protected $updateTime = 'news_update_time';
+
+ //排序字段
+ public $order_field = 'news_sort';
+
+ // excel导入/下载模板表头
+ public const EXCELFIELD = [
+'news_type' => '新闻类型',
+'news_title' => '新闻标题',
+'news_intro' => '新闻简介',
+'news_source' => '文章来源',
+'news_link' => '跳转链接',
+'news_issue_date' => '发布日期',
+'news_views_num' => '浏览次数',
+'news_sort' => '新闻排序',
+'news_content' => '新闻内容',
+];
+
+ /**
+ * 新增前
+ */
+ public static function onBeforeInsert(self $model): void
+ {
+ Tool::dataAddSortProc($model);
+ $model->completeCreateField();
+ }
+
+ /**
+ * 更新前
+ */
+ public static function onBeforeUpdate(self $model): void
+ {
+ Tool::dataEditSortProc($model);
+ $model->completeUpdateField();
+ }
+
+ /**
+ * 删除前
+ */
+ public static function onBeforeDelete(self $model): void
+ {
+ Tool::dataDeleteSortProc($model);
+ $model->completeDeleteField();
+ }
+
+
+ /**
+ * 导出Excel
+ *
+ * @param array $select 导出的数据
+ */
+ public static function exportExcel(array $select): void
+ {
+ $data = [[
+'新闻类型',
+'新闻标题',
+'新闻简介',
+'文章来源',
+'跳转链接',
+'发布日期',
+'浏览次数',
+'新闻排序',
+'新闻内容'
+]];
+ foreach ($select as $key => $val) {
+ $data[] = [
+$val['news_type'],
+$val['news_title'],
+$val['news_intro'],
+$val['news_source'],
+$val['news_link'],
+$val['news_issue_date'],
+$val['news_views_num'],
+$val['news_sort'],
+$val['news_content'],
+];
+ }
+ $excel = (new Excel())->exporTsheet($data);
+ $excel->save('新闻.xlsx');
+ }
+
+
+ /**
+ * 导入excel
+ *
+ * @param \app\common\arw\adjfut\src\UploadFile $file excel
+ */
+ public static function importExcel(\app\common\arw\adjfut\src\UploadFile $file): string
+ {
+ $msg = [];
+
+ Db::startTrans();
+ try {
+ $excel = new Excel($file);
+ $data = $excel->parseExcel(
+ Tool::getExcelRule(self::EXCELFIELD),
+ ['titleLine' => [1]]);
+ if (!$data) throwErrorMsg('excel无数据', 1);
+ $msg = [];
+ foreach ($data as $line => $value) {
+ try {
+ $model = self::importExcelInit($value);
+ $msg[] = "{$line} 新增成功!
";
+ } catch (\Throwable $th) {
+ $msg[] = "{$line} {$th->getMessage()}
";
+ }
+ }
+ Db::commit();
+ return implode(', ', $msg);
+ } catch (\Throwable $th) {
+ Db::rollback();
+ throw $th;
+ }
+ }
+
+
+ /**
+ * 导入excel初始化
+ *
+ * @param array $value excel每行数据
+ */
+ public static function importExcelInit(array $value):void
+ {
+ $news_type = $value['news_type'];$news_title = $value['news_title'];$news_intro = $value['news_intro'];$news_source = $value['news_source'];$news_link = $value['news_link'];$news_issue_date = $value['news_issue_date'];$news_views_num = $value['news_views_num'];$news_sort = $value['news_sort'];$news_content = $value['news_content'];
+
+ self::create(
+ ['news_type' => $news_type,
+'news_title' => $news_title,
+'news_intro' => $news_intro,
+'news_source' => $news_source,
+'news_link' => $news_link,
+'news_issue_date' => $news_issue_date,
+'news_views_num' => $news_views_num,
+'news_sort' => $news_sort,
+'news_content' => $news_content,
+],
+ [
+'news_type',
+'news_title',
+'news_intro',
+'news_source',
+'news_link',
+'news_issue_date',
+'news_views_num',
+'news_sort',
+'news_content',
+'news_guid',
+'news_create_user_guid',
+'news_update_user_guid'
+]
+ );
+ }
+
+
+
+}
diff --git a/app/common/model/Products/Product.php b/app/common/model/Products/Product.php
new file mode 100644
index 0000000..0385b21
--- /dev/null
+++ b/app/common/model/Products/Product.php
@@ -0,0 +1,202 @@
+ 'int',
+ 'product_guid' => 'string',
+ 'product_type_guid' => 'string',
+ 'product_name' => 'string',
+ 'product_img' => 'string',
+ 'product_description' => 'string',
+ 'product_link' => 'string',
+ 'product_details' => '',
+ 'product_sort' => 'int',
+ 'product_create_time' => 'datetime',
+ 'product_create_user_guid' => 'string',
+ 'product_update_time' => 'datetime',
+ 'product_update_user_guid' => 'string',
+ 'product_delete_time' => 'datetime',
+ 'product_delete_user_guid' => 'string',
+
+ ];
+ // 设置json类型字段
+ protected $json = [''];
+ // 开启自动写入时间戳字段
+ protected $autoWriteTimestamp = 'datetime';
+ // 创建时间
+ protected $createTime = 'product_create_time';
+ // 修改时间
+ protected $updateTime = 'product_update_time';
+
+ // excel导入/下载模板表头
+ public const EXCELFIELD = [
+ 'product_type_guid' => '产品类目',
+ 'product_name' => '产品名称',
+ 'product_img' => '产品图片',
+ 'product_description' => '产品描述',
+ 'product_link' => '产品跳转链接',
+ 'product_details' => '产品详情',
+ 'product_sort' => '产品排序',
+ ];
+
+ /**
+ * 新增前
+ */
+ public static function onBeforeInsert(self $model): void
+ {
+ // self::checkRepeatData($model);
+ $model->completeCreateField();
+ }
+
+ /**
+ * 更新前
+ */
+ public static function onBeforeUpdate(self $model): void
+ {
+ // self::checkRepeatData($model);
+ $model->completeUpdateField();
+ }
+
+ /**
+ * 删除前
+ */
+ public static function onBeforeDelete(self $model): void
+ {
+ $model->completeDeleteField();
+ }
+
+
+ /**
+ * 导出Excel
+ *
+ * @param array $select 导出的数据
+ */
+ public static function exportExcel(array $select): void
+ {
+ $data = [[
+ '产品类目',
+ '产品名称',
+ '产品图片',
+ '产品描述',
+ '产品跳转链接',
+ '产品排序'
+ ]];
+ foreach ($select as $key => $val) {
+
+ $product_type = ModelProductType::where('product_type_guid',$val['product_type_guid'])->find();
+ if(!$product_type) throwErrorMsg("产品类目:【{$val['product_type_guid']}】不存在");
+ $product_type_name = $product_type->product_type_name;
+
+ $data[] = [
+ $product_type_name,
+ $val['product_name'],
+ Excel::ExportImgFiled($val['product_img']),
+ $val['product_description'],
+ $val['product_link'],
+ $val['product_sort'],
+ ];
+ }
+ $excel = (new Excel())->exporTsheet($data);
+ $excel->save('产品.xlsx');
+ }
+
+
+ /**
+ * 导入excel
+ *
+ * @param \app\common\arw\adjfut\src\UploadFile $file excel
+ */
+ public static function importExcel(\app\common\arw\adjfut\src\UploadFile $file): string
+ {
+ $msg = [];
+
+ Db::startTrans();
+ try {
+ $excel = new Excel($file);
+ $data = $excel->parseExcel(
+ Tool::getExcelRule(self::EXCELFIELD),
+ ['titleLine' => [1]]
+ );
+ if (!$data) throwErrorMsg('excel无数据', 1);
+ $msg = [];
+ foreach ($data as $line => $value) {
+ try {
+ $model = self::importExcelInit($value);
+ $msg[] = "{$line} 商品:【{$value['product_name']}】新增成功!
";
+ } catch (\Throwable $th) {
+ $msg[] = "{$line} {$th->getMessage()}
";
+ }
+ }
+ Db::commit();
+ return implode(', ', $msg);
+ } catch (\Throwable $th) {
+ Db::rollback();
+ throw $th;
+ }
+ }
+
+
+ /**
+ * 导入excel初始化
+ *
+ * @param array $value excel每行数据
+ */
+ public static function importExcelInit(array $value): void
+ {
+ $product_type_guid = $value['product_type_guid'];
+ $product_name = $value['product_name'];
+ $product_img = $value['product_img'];
+ $product_description = $value['product_description'];
+ $product_link = $value['product_link'];
+ $product_details = $value['product_details'];
+ $product_sort = $value['product_sort'];
+
+ $product_type = ModelProductType::where('product_type_name',$product_type_guid)->find();
+ if(!$product_type) throwErrorMsg("产品类目:【{$product_type_guid}】不存在");
+ $product_type_guid = $product_type->product_type_guid;
+
+ self::create(
+ [
+ 'product_type_guid' => $product_type_guid,
+ 'product_name' => $product_name,
+ 'product_img' => $product_img,
+ 'product_description' => $product_description,
+ 'product_link' => $product_link,
+ 'product_details' => $product_details,
+ 'product_sort' => $product_sort,
+ ],
+ [
+ 'product_type_guid',
+ 'product_name',
+ 'product_img',
+ 'product_description',
+ 'product_link',
+ 'product_details',
+ 'product_sort',
+ 'product_guid',
+ 'product_create_user_guid',
+ 'product_update_user_guid'
+ ]
+ );
+ }
+}
diff --git a/app/common/model/Products/ProductType.php b/app/common/model/Products/ProductType.php
new file mode 100644
index 0000000..191cb92
--- /dev/null
+++ b/app/common/model/Products/ProductType.php
@@ -0,0 +1,181 @@
+ "int",
+ "product_type_guid" => "string",
+ "product_type_parent_guid" => "string",
+ "product_type_ancestors_guid" => "string",
+ "product_type_name" => "string",
+ "product_type_icon" => "string",
+ "product_type_title" => "string",
+ "product_type_link" => "string",
+ "product_type_order" => "int",
+ "product_type_create_time" => "datetime",
+ "product_type_create_user_guid" => "string",
+ "product_type_update_time" => "datetime",
+ "product_type_update_user_guid" => "string",
+ "product_type_delete_time" => "datetime",
+ "product_type_delete_user_guid" => "string",
+ ];
+ // 设置json类型字段
+ protected $json = [''];
+ // 开启自动写入时间戳字段
+ protected $autoWriteTimestamp = 'datetime';
+ // 创建时间
+ protected $createTime = 'product_type_create_time';
+ // 修改时间
+ protected $updateTime = 'product_type_update_time';
+
+ // excel导入/下载模板表头
+ public const EXCELFIELD = [
+ 'product_type_name' => '产品类目名称',
+ ];
+
+ /**
+ * 新增前
+ */
+ public static function onBeforeInsert(self $model): void
+ {
+ // self::checkRepeatData($model);
+ $model->completeCreateField();
+ }
+
+ /**
+ * 更新前
+ */
+ public static function onBeforeUpdate(self $model): void
+ {
+ // self::checkRepeatData($model);
+ $model->completeUpdateField();
+ }
+
+ /**
+ * 删除前
+ */
+ public static function onBeforeDelete(self $model): void
+ {
+ $model->completeDeleteField();
+ }
+
+ /**
+ * 产品类目祖级guid构建
+ *
+ * @param string $product_type_parent_guid 产品类目父级guid
+ */
+ public static function buildAncestorsGuid(string $product_type_parent_guid): string
+ {
+ if ($product_type_parent_guid == "0") return $product_type_parent_guid;
+ $product_type = self::where('product_type_guid', $product_type_parent_guid)->find();
+ if (!$product_type) throwErrorMsg('该父级产品类目不存在!');
+ return $product_type->product_type_ancestors_guid . ',' . $product_type_parent_guid;
+ }
+
+ /**
+ * 产品类目重名验证
+ *
+ * @param string $product_type_name 产品类目名称
+ * @param string $product_type_guid 产品类目guid
+ */
+ public static function isDuplicateName(string $product_type_name, string $product_type_guid = null): void
+ {
+ $con = [
+ ['product_type_name', '=', $product_type_name]
+ ];
+ if ($product_type_guid) {
+ $con[] = ['product_type_guid', '<>', $product_type_guid];
+ }
+ if (self::where($con)->find()) {
+ throwErrorMsg('产品类目不可重名!');
+ };
+ }
+
+ /**
+ * 导出Excel
+ */
+ public static function exportExcel($select)
+ {
+ $data = [[
+ '产品类目标题',
+ '产品类目图标',
+ '产品类目封面'
+ ]];
+ foreach ($select as $key => $val) {
+ $data[] = [
+ $val['product_type_title'],
+ $val['product_type_icon'],
+ Excel::ExportImgFiled($val['product_type_cover']),
+ ];
+ }
+ $excel = (new Excel())->exporTsheet($data);
+ $excel->save('产品类目.xlsx');
+ }
+
+ /**
+ * 导入excel
+ */
+ public static function importExcel($file)
+ {
+ $msg = [];
+
+ Db::startTrans();
+ try {
+ $excel = new Excel($file);
+ $data = $excel->parseExcel(
+ Tool::getExcelRule(self::EXCELFIELD),
+ [
+ 'titleLine' => [1]
+ ]
+ );
+ if (!$data) throwErrorMsg('excel无数据', 1);
+ $msg = [];
+ foreach ($data as $line => $value) {
+ try {
+ $model = self::importExcelInit($value);
+ $msg[] = "{$line} 新增成功!
";
+ } catch (\Throwable $th) {
+ $msg[] = "{$line} {$th->getMessage()}
";
+ }
+ }
+ Db::commit();
+ return implode(', ', $msg);
+ } catch (\Throwable $th) {
+ Db::rollback();
+ throw $th;
+ }
+ }
+
+ /**
+ * 导入excel初始化
+ */
+ public static function importExcelInit($value)
+ {
+ $product_type_title = $value['product_type_title'];
+ $product_type_icon = $value['product_type_icon'];
+ $product_type_cover = $value['product_type_cover'];
+ return self::create([
+ 'product_type_title' => $product_type_title,
+ 'product_type_icon' => $product_type_icon,
+ 'product_type_cover' => $product_type_cover,
+ ]);
+ }
+}