This commit is contained in:
2025-10-29 15:32:26 +08:00
parent d90614805b
commit b7462657cd
78921 changed files with 2753938 additions and 71 deletions

View File

@@ -0,0 +1,38 @@
<?php
/**
*/
return [
// 自定义模板页面类型,格式:[ 'title' => '页面类型名称', 'name' => '页面标识', 'path' => '页面路径', 'value' => '页面数据json格式' ]
'template' => [],
// 后台自定义组件——装修
'util' => [],
// 自定义页面路径
'link' => [],
// 自定义图标库
'icon_library' => [],
// uni-app 组件,格式:[ 'name' => '组件名称/文件夹名称', 'path' => '文件路径/目录路径' ]多个逗号隔开自定义组件名称前缀必须是diy-,也可以引用第三方组件
'component' => [],
// uni-app 页面,多个逗号隔开
'pages' => [],
// 模板信息,格式:'title' => '模板名称', 'name' => '模板标识', 'cover' => '模板封面图', 'preview' => '模板预览图', 'desc' => '模板描述'
'info' => [],
// 主题风格配色格式可以自由定义扩展【在uni-app中通过this.themeStyle... 获取定义的颜色字段例如this.themeStyle.main_color】
'theme' => [],
// 自定义页面数据,格式:[ 'title' => '页面名称', 'name' => "页面标识", 'value' => [页面数据json格式] ]
'data' => []
];

View File

@@ -0,0 +1,17 @@
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
//展示活动
'ShowPromotion' => [
'addon\virtualevaluation\event\ShowPromotion',
]
],
'subscribe' => [
],
];

View File

@@ -0,0 +1,20 @@
<?php
/**
*/
return [
'name' => 'virtualevaluation',
'title' => '虚拟评价',
'description' => '创建商品虚拟评价',
'type' => 'tool', //插件类型 system :系统插件(自动安装), promotion:扩展营销插件 tool:工具插件
'status' => 1,
'author' => '',
'version' => '5.3.1',
'version_no' => '525231212001',
'content' => '',
];

View File

@@ -0,0 +1,55 @@
<?php
// +----------------------------------------------------------------------
// | 平台端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'SHOP_VIRTUALEVALUATION_ROOT',
'title' => '虚拟评价',
'url' => 'virtualevaluation://shop/comment/goodslists',
'picture' => 'addon/virtualevaluation/shop/view/public/img/comment.png',
'picture_selected' => 'addon/virtualevaluation/shop/view/public/img/comment_selected.png',
'parent' => 'PROMOTION_TOOL',
'is_show' => 1,
'sort' => 1,
'child_list' => [
[
'name' => 'SHOP_VIRTUALEVALUATION_GOODS',
'title' => '商品列表',
'url' => 'virtualevaluation://shop/comment/goodslists',
'is_show' => 1,
'sort' => 1,
'child_list' => [
[
'name' => 'SHOP_STOCK_BATCH_ADD',
'title' => '批量添加评论',
'url' => 'virtualevaluation://shop/comment/batchadd',
'is_show' => 0,
'sort' => 1,
'child_list' => [
]
],
]
],
[
'name' => 'SHOP_VIRTUAL_STOCK',
'title' => '虚拟评价库',
'url' => 'virtualevaluation://shop/comment/stock',
'is_show' => 1,
'sort' => 1,
'child_list' => [
[
'name' => 'SHOP_STOCK_EDIT',
'title' => '编辑',
'url' => 'virtualevaluation://shop/comment/getcontents',
'is_show' => 0,
'sort' => 1,
'child_list' => [
]
],
]
],
]
]
];

View File

@@ -0,0 +1,26 @@
<?php
/**
*/
namespace addon\virtualevaluation\event;
/**
* 应用安装
*/
class Install
{
/**
* 执行安装
*/
public function handle()
{
return success();
}
}

View File

@@ -0,0 +1,49 @@
<?php
/**
*/
namespace addon\virtualevaluation\event;
/**
* 活动展示
*/
class ShowPromotion
{
/**
* 活动展示
* @return array
*/
public function handle()
{
$data = [
'shop' => [
[
//插件名称
'name' => 'virtualevaluation',
//店铺端展示分类 shop:营销活动 member:互动营销
'show_type' => 'tool',
//展示主题
'title' => '虚拟评价',
//展示介绍
'description' => '优化商品评价内容',
//展示图标
'icon' => 'addon/virtualevaluation/icon.png',
//跳转链接
'url' => 'virtualevaluation://shop/comment/goodslists',
]
]
];
return $data;
}
}

View File

@@ -0,0 +1,26 @@
<?php
/**
*/
namespace addon\virtualevaluation\event;
/**
* 应用卸载
*/
class UnInstall
{
/**
* 执行卸载
*/
public function handle()
{
return error("系统插件不能删除");
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,305 @@
<?php
/**
*/
namespace addon\virtualevaluation\model;
use app\model\BaseModel;
use app\model\order\Config as ConfigModel;
use think\facade\Cache;
use think\facade\Db;
/**
* 虚拟评价
*/
class VirtualEvaluation extends BaseModel
{
public function addGoodsComment($data, $site_id)
{
$config_model = new ConfigModel();
//订单评价设置
$order_evaluate_config = $config_model->getOrderEvaluateConfig($site_id)[ 'data' ][ 'value' ];
if ($data[ 'dengji' ] == 1) {
$evaluate_type = 3;
} else if ($data[ 'dengji' ] == 2 || $data[ 'dengji' ] == 3) {
$evaluate_type = 2;
} else if ($data[ 'dengji' ] == 4 || $data[ 'dengji' ] == 5) {
$evaluate_type = 1;
}
// 虚拟评价不需要审核
$order_evaluate_config[ 'evaluate_audit' ] = 0;
if (!empty($data[ 'goods_data' ])) {
foreach ($data[ 'goods_data' ] as $k => $v) {
$item = [
'order_id' => 0,
'order_no' => 0,
'member_id' => 0,
'member_name' => $data[ 'member_name' ],
'member_headimg' => $data[ 'member_headimg' ],
'is_anonymous' => 1,
'order_goods_id' => 0,
'goods_id' => $v[ 'goods_id' ],
'sku_id' => $v[ 'sku_id' ],
'site_id' => $site_id,
'sku_name' => $v[ 'goods_name' ],
'sku_price' => $v[ 'price' ],
'sku_image' => explode(',', $v[ 'goods_image' ])[ 0 ],
'content' => !empty($data[ 'content' ]) ? $data[ 'content' ] : '此用户没有填写评价。',
'images' => $data[ 'pingjia_img' ],
'scores' => $data[ 'dengji' ],
'explain_type' => $evaluate_type,
'is_audit' => $order_evaluate_config[ 'evaluate_audit' ] == 1 ? 0 : 1,
'create_time' => date_to_time($data[ 'evaluate_time' ]),
];
$data_arr[] = $item;
$evaluate = 0; //评价
$evaluate_shaitu = 0; //晒图
$evaluate_shipin = 0; //视频
$evaluate_haoping = 0; //好评
$evaluate_zhongping = 0; //中评
$evaluate_chaping = 0; //差评
$wait_evaluate_num = 0; //待审核数
$success_evaluate_num = 1;
if ($order_evaluate_config[ 'evaluate_audit' ] == 1) {
$wait_evaluate_num = 1; //待审核数
$success_evaluate_num = 0;
} else {
if ($evaluate_type == 1) {
//好评
$evaluate = 1; //评价
$evaluate_haoping = 1; //好评
} elseif ($evaluate_type == 2) {
//中评
$evaluate = 1; //评价
$evaluate_zhongping = 1; //中评
} elseif ($evaluate_type == 3) {
//差评
$evaluate = 1; //评价
$evaluate_chaping = 1; //差评
}
if (!empty($data[ 'pingjia_img' ])) {
$evaluate_shaitu = 1; //晒图
}
}
Db::name('goods')->where([ [ 'goods_id', '=', $v[ 'goods_id' ] ] ])
->update(
[
"evaluate" => Db::raw('evaluate+' . $evaluate),
"success_evaluate_num" => Db::raw('success_evaluate_num+' . $success_evaluate_num),
"evaluate_shaitu" => Db::raw('evaluate_shaitu+' . $evaluate_shaitu),
"evaluate_haoping" => Db::raw('evaluate_haoping+' . $evaluate_haoping),
"evaluate_zhongping" => Db::raw('evaluate_zhongping+' . $evaluate_zhongping),
"evaluate_chaping" => Db::raw('evaluate_chaping+' . $evaluate_chaping),
"wait_evaluate_num" => Db::raw('wait_evaluate_num+' . $wait_evaluate_num),
]);
Db::name('goods_sku')->where([ [ 'sku_id', '=', $v[ 'sku_id' ] ] ])
->update(
[
"evaluate" => Db::raw('evaluate+' . $evaluate),
"evaluate_shaitu" => Db::raw('evaluate_shaitu+' . $evaluate_shaitu),
"evaluate_haoping" => Db::raw('evaluate_haoping+' . $evaluate_haoping),
"evaluate_zhongping" => Db::raw('evaluate_zhongping+' . $evaluate_zhongping),
"evaluate_chaping" => Db::raw('evaluate_chaping+' . $evaluate_chaping),
"wait_evaluate_num" => Db::raw('wait_evaluate_num+' . $wait_evaluate_num),
"success_evaluate_num" => Db::raw('success_evaluate_num+' . $success_evaluate_num),
]);
}
$evaluate_id = model('goods_evaluate')->addList($data_arr);
Cache::tag('goods_evaluate')->clear();
return $this->success($evaluate_id);
} else {
return $this->error();
}
}
public function batghAdd($data, $site_id)
{
$config_model = new ConfigModel();
//订单评价设置
$order_evaluate_config = $config_model->getOrderEvaluateConfig($site_id)[ 'data' ][ 'value' ];
//虚拟评价不需要审核
$order_evaluate_config[ 'evaluate_audit' ] = 0;
$content_list = model('stock_content')->getList([ [ 'site_id', '=', $site_id ], [ 'stock_id', '=', $data[ 'stock_id' ] ] ], 'content');
$pic_list = model('album_pic')->getList([ [ 'site_id', '=', $site_id ], [ 'album_id', '=', $data[ 'album_id' ] ] ], 'pic_path');
$goods_data = model('goods')->getInfo([ [ 'goods_id', '=', $data[ 'goods_id' ] ], [ 'site_id', '=', $site_id ] ], 'sku_id,goods_id,goods_name,price,goods_image');
if ($data[ 'number' ] > 100 || $data[ 'number' ] < 1) {
return $this->error([], '评价数量大于1且小于100条');
}
if ($data[ 'number' ] >= 1) {
for ($i = 0; $i < $data[ 'number' ]; $i++) {
$dengji[ $i ] = $data[ 'pingfen' ][ array_rand($data[ 'pingfen' ]) ];
if ($dengji[ $i ] == 1) {
$evaluate_type[ $i ] = 3;
} else if ($dengji[ $i ] == 2 || $dengji[ $i ] == 3) {
$evaluate_type[ $i ] = 2;
} else if ($dengji[ $i ] == 4 || $dengji[ $i ] == 5) {
$evaluate_type[ $i ] = 1;
}
$item = [
'order_id' => 0,
'order_no' => 0,
'member_id' => 0,
'member_name' => $this->randNickName(),
'member_headimg' => $pic_list[ array_rand($pic_list) ][ 'pic_path' ],
'is_anonymous' => 1,
'order_goods_id' => 0,
'goods_id' => $goods_data[ 'goods_id' ],
'sku_id' => $goods_data[ 'sku_id' ],
'site_id' => $site_id,
'sku_name' => $goods_data[ 'goods_name' ],
'sku_price' => $goods_data[ 'price' ],
'sku_image' => explode(',', $goods_data[ 'goods_image' ])[ 0 ],
'content' => $content_list[ array_rand($content_list) ][ 'content' ],
'images' => '',
'scores' => $dengji[ $i ],
'explain_type' => $evaluate_type[ $i ],
'is_audit' => $order_evaluate_config[ 'evaluate_audit' ] == 1 ? 0 : 1,
'create_time' => mt_rand($data[ 'start_time' ], $data[ 'end_time' ]),
];
$data_arr[] = $item;
$evaluate = 0; //评价
$evaluate_shaitu = 0; //晒图
$evaluate_shipin = 0; //视频
$evaluate_haoping = 0; //好评
$evaluate_zhongping = 0; //中评
$evaluate_chaping = 0; //差评
$wait_evaluate_num = 0; //待审核数
$success_evaluate_num = 1;
if ($order_evaluate_config[ 'evaluate_audit' ] == 1) {
$wait_evaluate_num = 1; //待审核数
$success_evaluate_num = 0;
} else {
if ($evaluate_type[ $i ] == 1) {
//好评
$evaluate = 1; //评价
$evaluate_haoping = 1; //好评
} elseif ($evaluate_type[ $i ] == 2) {
//中评
$evaluate = 1; //评价
$evaluate_zhongping = 1; //中评
} elseif ($evaluate_type[ $i ] == 3) {
//差评
$evaluate = 1; //评价
$evaluate_chaping = 1; //差评
}
if (!empty($item[ 'images' ])) {
$evaluate_shaitu = 1; //晒图
}
}
Db::name('goods')->where([ [ 'goods_id', '=', $goods_data[ 'goods_id' ] ] ])
->update(
[
"evaluate" => Db::raw('evaluate+' . $evaluate),
"evaluate_shaitu" => Db::raw('evaluate_shaitu+' . $evaluate_shaitu),
"evaluate_haoping" => Db::raw('evaluate_haoping+' . $evaluate_haoping),
"evaluate_zhongping" => Db::raw('evaluate_zhongping+' . $evaluate_zhongping),
"evaluate_chaping" => Db::raw('evaluate_chaping+' . $evaluate_chaping),
"wait_evaluate_num" => Db::raw('wait_evaluate_num+' . $wait_evaluate_num),
"success_evaluate_num" => Db::raw('success_evaluate_num+' . $success_evaluate_num),
]);
Db::name('goods_sku')->where([ [ 'sku_id', '=', $goods_data[ 'sku_id' ] ] ])
->update(
[
"evaluate" => Db::raw('evaluate+' . $evaluate),
"evaluate_shaitu" => Db::raw('evaluate_shaitu+' . $evaluate_shaitu),
"evaluate_haoping" => Db::raw('evaluate_haoping+' . $evaluate_haoping),
"evaluate_zhongping" => Db::raw('evaluate_zhongping+' . $evaluate_zhongping),
"evaluate_chaping" => Db::raw('evaluate_chaping+' . $evaluate_chaping),
"wait_evaluate_num" => Db::raw('wait_evaluate_num+' . $wait_evaluate_num),
"success_evaluate_num" => Db::raw('success_evaluate_num+' . $success_evaluate_num),
]);
}
$evaluate_id = model('goods_evaluate')->addList($data_arr);
Cache::tag('goods_evaluate')->clear();
return $this->success($evaluate_id);
} else {
return $this->error();
}
}
private function randNickName()
{
$nicheng_tou = array ( '快乐的', '冷静的', '醉熏的', '潇洒的', '糊涂的', '积极的', '冷酷的', '深情的', '粗暴的',
'温柔的', '可爱的', '愉快的', '义气的', '认真的', '威武的', '帅气的', '传统的', '潇洒的', '漂亮的', '自然的',
'专一的', '听话的', '昏睡的', '狂野的', '等待的', '搞怪的', '幽默的', '魁梧的', '活泼的', '开心的', '高兴的',
'超帅的', '留胡子的', '坦率的', '直率的', '轻松的', '痴情的', '完美的', '精明的',
'无聊的', '有魅力的', '丰富的', '繁荣的', '饱满的', '炙热的', '暴躁的', '碧蓝的', '俊逸的',
'英勇的', '健忘的', '故意的', '无心的', '土豪的', '朴实的', '兴奋的', '幸福的', '淡定的', '不安的',
'阔达的', '孤独的', '独特的', '疯狂的', '时尚的', '落后的', '风趣的', '忧伤的', '大胆的', '爱笑的', '矮小的',
'健康的', '合适的', '玩命的', '沉默的', '斯文的', '香蕉', '苹果', '鲤鱼', '鳗鱼', '任性的', '细心的', '粗心的',
'大意的', '甜甜的', '酷酷的', '健壮的', '英俊的', '霸气的', '阳光的', '默默的', '大力的', '孝顺的', '忧虑的', '着急的',
'紧张的', '善良的', '凶狠的', '害怕的', '重要的', '危机的', '欢喜的', '欣慰的', '满意的', '跳跃的', '诚心的', '称心的',
'如意的', '怡然的', '娇气的', '无奈的', '无语的', '激动的', '愤怒的', '美好的', '感动的', '激情的', '激昂的', '震动的',
'虚拟的', '超级的', '寒冷的', '精明的', '明理的', '犹豫的', '忧郁的', '寂寞的', '奋斗的', '勤奋的', '现代的', '过时的',
'稳重的', '热情的', '含蓄的', '开放的', '无辜的', '多情的', '纯真的', '拉长的', '热心的', '从容的', '体贴的', '风中的',
'曾经的', '追寻的', '儒雅的', '优雅的', '开朗的', '外向的', '内向的', '清爽的', '文艺的', '长情的', '平常的', '单身的',
'伶俐的', '高大的', '懦弱的', '柔弱的', '爱笑的', '乐观的', '耍酷的', '酷炫的', '神勇的', '年轻的', '唠叨的', '瘦瘦的',
'无情的', '包容的', '顺心的', '畅快的', '舒适的', '靓丽的', '负责的', '背后的', '简单的', '谦让的', '彩色的', '缥缈的',
'欢呼的', '生动的', '复杂的', '慈祥的', '仁爱的', '魔幻的', '虚幻的', '淡然的', '受伤的', '雪白的', '高高的', '糟糕的',
'顺利的', '闪闪的', '羞涩的', '缓慢的', '迅速的', '优秀的', '聪明的', '含糊的', '俏皮的', '淡淡的', '坚强的', '平淡的',
'欣喜的', '能干的', '灵巧的', '友好的', '机智的', '机灵的', '正直的', '谨慎的', '俭朴的', '殷勤的', '虚心的', '辛勤的',
'自觉的', '无私的', '无限的', '踏实的', '老实的', '现实的', '可靠的', '务实的', '拼搏的', '个性的', '粗犷的', '活力的',
'成就的', '勤劳的', '单纯的', '落寞的', '朴素的', '悲凉的', '忧心的', '洁净的', '清秀的', '自由的', '小巧的', '单薄的',
'贪玩的', '刻苦的', '干净的', '壮观的', '和谐的', '文静的', '调皮的', '害羞的', '安详的', '自信的', '端庄的', '坚定的',
'美满的', '舒心的', '温暖的', '专注的', '勤恳的', '美丽的', '腼腆的', '优美的', '甜美的', '甜蜜的', '整齐的', '动人的',
'典雅的', '尊敬的', '舒服的', '妩媚的', '秀丽的', '喜悦的', '甜美的', '彪壮的', '强健的', '大方的', '俊秀的', '聪慧的',
'迷人的', '陶醉的', '悦耳的', '动听的', '明亮的', '结实的', '魁梧的', '标致的', '清脆的', '敏感的', '光亮的', '大气的',
'老迟到的', '知性的', '冷傲的', '呆萌的', '野性的', '隐形的', '笑点低的', '微笑的', '笨笨的', '难过的', '沉静的', '火星上的',
'失眠的', '安静的', '纯情的', '要减肥的', '迷路的', '烂漫的', '哭泣的', '贤惠的', '苗条的', '温婉的', '发嗲的', '会撒娇的',
'贪玩的', '执着的', '眯眯眼的', '花痴的', '想人陪的', '眼睛大的', '高贵的', '傲娇的', '心灵美的', '爱撒娇的', '细腻的', '天真的',
'怕黑的', '感性的', '飘逸的', '怕孤独的', '忐忑的', '高挑的', '傻傻的', '冷艳的', '爱听歌的', '还单身的', '怕孤单的', '懵懂的' );
$nicheng_wei = array ( '嚓茶', '凉面', '便当', '毛豆', '花生', '可乐', '灯泡', '哈密瓜', '野狼', '背包', '眼神', '缘分', '雪碧',
'人生', '牛排', '蚂蚁', '飞鸟', '灰狼', '斑马', '汉堡', '悟空', '巨人', '绿茶', '自行车', '保温杯', '大碗', '墨镜', '魔镜',
'煎饼', '月饼', '月亮', '星星', '芝麻', '啤酒', '玫瑰', '大叔', '小伙', '哈密瓜,数据线', '太阳', '树叶', '芹菜', '黄蜂', '蜜粉',
'蜜蜂', '信封', '西装', '外套', '裙子', '大象', '猫咪', '母鸡', '路灯', '蓝天', '白云', '星月', '彩虹', '微笑', '摩托', '板栗', '高山',
'大地', '大树', '电灯胆', '砖头', '楼房', '水池', '鸡翅', '蜻蜓', '红牛', '咖啡', '机器猫', '枕头', '大船', '诺言', '钢笔', '刺猬', '天空',
'飞机', '大炮', '冬天', '洋葱', '春天', '夏天', '秋天', '冬日', '航空', '毛衣', '豌豆', '黑米', '玉米', '眼睛', '老鼠', '白羊', '帅哥', '美女',
'季节', '鲜花', '服饰', '裙子', '白开水', '秀发', '大山', '火车', '汽车', '歌曲', '舞蹈', '老师', '导师', '方盒', '大米', '麦片', '水杯', '水壶',
'手套', '鞋子', '自行车', '鼠标', '手机', '电脑', '书本', '奇迹', '身影', '香烟', '夕阳', '台灯', '宝贝', '未来', '皮带', '钥匙', '心锁', '故事',
'花瓣', '滑板', '画笔', '画板', '学姐', '店员', '电源', '饼干', '宝马', '过客', '大白', '时光', '石头', '钻石', '河马', '犀牛', '西牛', '绿草',
'抽屉', '柜子', '往事', '寒风', '路人', '橘子', '耳机', '鸵鸟', '朋友', '苗条', '铅笔', '钢笔', '硬币', '热狗', '大侠', '御姐', '萝莉', '毛巾',
'期待', '盼望', '白昼', '黑夜', '大门', '黑裤', '钢铁侠', '哑铃', '板凳', '枫叶', '荷花', '乌龟', '仙人掌', '衬衫', '大神', '草丛', '早晨', '心情',
'茉莉', '流沙', '蜗牛', '战斗机', '冥王星', '猎豹', '棒球', '篮球', '乐曲', '电话', '网络', '世界', '中心', '鱼', '鸡', '狗', '老虎', '鸭子', '雨',
'羽毛', '翅膀', '外套', '火', '丝袜', '书包', '钢笔', '冷风', '八宝粥', '烤鸡', '大雁', '音响', '招牌', '胡萝卜', '冰棍', '帽子', '菠萝', '蛋挞', '香水',
'泥猴桃', '吐司', '溪流', '黄豆', '樱桃', '小鸽子', '小蝴蝶', '爆米花', '花卷', '小鸭子', '小海豚', '日记本', '小熊猫', '小懒猪', '小懒虫', '荔枝', '镜子',
'曲奇', '金针菇', '小松鼠', '小虾米', '酒窝', '紫菜', '金鱼', '柚子', '果汁', '百褶裙', '项链', '帆布鞋', '火龙果', '奇异果', '煎蛋', '唇彩', '小土豆', '高跟鞋',
'戒指', '雪糕', '睫毛', '铃铛', '手链', '香氛', '红酒', '月光', '酸奶', '银耳汤', '咖啡豆', '小蜜蜂', '小蚂蚁', '蜡烛', '棉花糖', '向日葵', '水蜜桃', '小蝴蝶',
'小刺猬', '小丸子', '指甲油', '康乃馨', '糖豆', '薯片', '口红', '超短裙', '乌冬面', '冰淇淋', '棒棒糖', '长颈鹿', '豆芽', '发箍', '发卡', '发夹', '发带', '铃铛',
'小馒头', '小笼包', '小甜瓜', '冬瓜', '香菇', '小兔子', '含羞草', '短靴', '睫毛膏', '小蘑菇', '跳跳糖', '小白菜', '草莓', '柠檬', '月饼', '百合', '纸鹤', '小天鹅',
'云朵', '芒果', '面包', '海燕', '小猫咪', '龙猫', '唇膏', '鞋垫', '羊', '黑猫', '白猫', '万宝路', '金毛', '山水', '音响' );
$tou_num = rand(0, 331);
$wei_num = rand(0, 325);
$nicheng = $nicheng_tou[ $tou_num ] . $nicheng_wei[ $wei_num ];
return $nicheng; //输出生成的昵称
}
}

View File

@@ -0,0 +1,186 @@
<?php
/**
*/
namespace addon\virtualevaluation\model;
use app\model\BaseModel;
/**
* 虚拟评价
*/
class VirtualStock extends BaseModel
{
/**
* 获取虚拟评价库分页列表
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function getStockPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'create_time desc', $field = 'stock_id,stock_name,num,create_time,modify_time,site_id')
{
$list = model('virtual_stock')->pageList($condition, $field, $order, $page, $page_size);
return $this->success($list);
}
/**
* 添加虚拟评价库分页列表
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function addStock($data)
{
$stock_id = model('virtual_stock')->add($data);
return $this->success($stock_id);
}
/**
* 删除虚拟评价库
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function deleteStock($stock_id, $site_id)
{
$stock_id = model('virtual_stock')->delete([ [ 'stock_id', '=', $stock_id ], [ 'site_id', '=', $site_id ] ]);
return $this->success($stock_id);
}
/**
* 更新虚拟评价库
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function updateStock($data, $site_id)
{
$stock_id = model('virtual_stock')->update($data, [ [ 'stock_id', '=', $data[ 'stock_id' ] ], [ 'site_id', '=', $site_id ] ]);
return $this->success($stock_id);
}
/**
* 获取虚拟评价库信息
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function getStockInfo($stock_id, $site_id)
{
$stock_info = model('virtual_stock')->getInfo([ [ 'stock_id', '=', $stock_id ], [ 'site_id', '=', $site_id ] ], '*');
return $this->success($stock_info);
}
/**
* 获取虚拟评价库信息
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function getContentsPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'create_time desc', $field = '*')
{
$list = model('stock_content')->pageList($condition, $field, $order, $page, $page_size);
return $this->success($list);
}
/**
* 添加虚拟评价库评论
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function addContent($data)
{
$stock_id = model('stock_content')->add($data);
if ($stock_id) {
model("virtual_stock")->setInc([ [ 'stock_id', '=', $data[ 'stock_id' ] ] ], "num", 1);
}
return $this->success($stock_id);
}
/**
* 删除虚拟评价库评论
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function deleteContent($id, $site_id)
{
$stock_data = model('stock_content')->getInfo([ [ 'id', '=', $id ], [ 'site_id', '=', $site_id ] ], 'stock_id');
model("virtual_stock")->setDec([ [ 'stock_id', '=', $stock_data[ 'stock_id' ] ] ], "num", 1);
$stock_id = model('stock_content')->delete([ [ 'id', '=', $id ], [ 'site_id', '=', $site_id ] ]);
return $this->success($stock_id);
}
/**
* 获取虚拟评价库信息
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function getContentInfo($id, $site_id)
{
$stock_info = model('stock_content')->getInfo([ [ 'id', '=', $id ], [ 'site_id', '=', $site_id ] ], '*');
return $this->success($stock_info);
}
/**
* 修改虚拟评价库信息
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function editContentInfo($data, $site_id)
{
$content_info = model('stock_content')->update($data, [ [ 'id', '=', $data[ 'id' ] ], [ 'site_id', '=', $site_id ] ]);
return $this->success($content_info);
}
/**
* 获取评论库列表
* @param array $condition
* @param string $field
* @param string $order
* @param null $limit
* @return array
*/
public function getStockList($condition = [], $field = '*', $order = 'stock_id asc', $limit = null)
{
$list = model('virtual_stock')->getList($condition, $field, $order, '', '', '', $limit);
return $this->success($list);
}
}

View File

@@ -0,0 +1,415 @@
<?php
/**
*/
namespace addon\virtualevaluation\shop\controller;
use addon\virtualevaluation\model\VirtualEvaluation;
use addon\virtualevaluation\model\VirtualStock;
use app\model\express\ExpressTemplate as ExpressTemplateModel;
use app\model\goods\Goods;
use app\model\goods\Goods as GoodsModel;
use app\model\goods\GoodsCategory as GoodsCategoryModel;
use app\model\goods\GoodsLabel as GoodsLabelModel;
use app\model\goods\GoodsService as GoodsServiceModel;
use app\model\upload\Album;
use app\shop\controller\BaseShop;
/**
* 虚拟评价
* Class Virtualgoods
* @package app\shop\controller
*/
class Comment extends BaseShop
{
public function goodsLists()
{
$stockalarm = input('stockalarm', 0);
$goods_model = new GoodsModel();
if (request()->isJson()) {
$page_index = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$search_text = input('search_text', "");
$goods_state = input('goods_state', "");
$start_sale = input('start_sale', 0);
$end_sale = input('end_sale', 0);
$start_price = input('start_price', 0);
$end_price = input('end_price', 0);
$goods_class = input('goods_class', "");
$label_id = input('label_id', "");
$order = input('order', '');
$sort = input('sort', 'asc');
$order_by = 'create_time desc';
if ($order != '') {
if ($order == 'sort') {
$order_by = $order . ' ' . $sort . ',create_time desc';
} else {
$order_by = $order . ' ' . $sort;
}
}
$promotion_type = input('promotion_type', "");
$condition = [ [ 'is_delete', '=', 0 ], [ 'site_id', '=', $this->site_id ] ];
if (!empty($search_text)) {
$condition[] = [ 'goods_name', 'like', '%' . $search_text . '%' ];
}
$category_id = input('category_id', "");
if (!empty($category_id)) {
$condition[] = [ 'category_id', 'like', '%,' . $category_id . ',%' ];
}
if ($goods_class !== "") {
$condition[] = [ 'goods_class', '=', $goods_class ];
}
if (!empty($label_id)) {
$condition[] = [ 'label_id', '=', $label_id ];
}
if (!empty($promotion_type)) {
$condition[] = [ 'promotion_addon', 'like', "%{$promotion_type}%" ];
}
// 上架状态
if ($goods_state !== '') {
$condition[] = [ 'goods_state', '=', $goods_state ];
}
if (!empty($start_sale)) $condition[] = [ 'sale_num', '>=', $start_sale ];
if (!empty($end_sale)) $condition[] = [ 'sale_num', '<=', $end_sale ];
if (!empty($start_price)) $condition[] = [ 'price', '>=', $start_price ];
if (!empty($end_price)) $condition[] = [ 'price', '<=', $end_price ];
// 查询库存预警的商品
if ($stockalarm) {
$stock_alarm = $goods_model->getGoodsStockAlarm($this->site_id);
if (!empty($stock_alarm[ 'data' ])) {
$condition[] = [ 'goods_id', 'in', $stock_alarm[ 'data' ] ];
} else {
return success(0, '', [ 'page_count' => 1, 'count' => 0, 'list' => [] ]);
}
}
$field = 'goods_id,goods_name,site_id,site_name,goods_image,goods_state,price,goods_stock,goods_stock_alarm,create_time,sale_num,is_virtual,goods_class,is_fenxiao,fenxiao_type,promotion_addon,sku_id,is_consume_discount,discount_config,discount_method,sort,evaluate,evaluate_shaitu,success_evaluate_num,fail_evaluate_num,wait_evaluate_num';
$res = $goods_model->getGoodsPageList($condition, $page_index, $page_size, $order_by, $field);
$goods_promotion_type = event('GoodsPromotionType');
if (!empty($res[ 'data' ][ 'list' ])) {
foreach ($res[ 'data' ][ 'list' ] as $k => $v) {
$res[ 'data' ][ 'list' ][ $k ][ 'goods_stock' ] = numberFormat($res[ 'data' ][ 'list' ][ $k ][ 'goods_stock' ]);
$res[ 'data' ][ 'list' ][ $k ][ 'sale_num' ] = numberFormat($res[ 'data' ][ 'list' ][ $k ][ 'sale_num' ]);
if (!empty($v[ 'promotion_addon' ])) {
$v[ 'promotion_addon' ] = json_decode($v[ 'promotion_addon' ], true);
foreach ($v[ 'promotion_addon' ] as $ck => $cv) {
foreach ($goods_promotion_type as $gk => $gv) {
if ($gv[ 'type' ] == $ck) {
$res[ 'data' ][ 'list' ][ $k ][ 'promotion_addon_list' ][] = $gv;
break;
}
}
}
}
}
}
return $res;
} else {
$goods_state = input('state', '');
$this->assign('goods_state', $goods_state);
//获取一级商品分类
$goods_category_model = new GoodsCategoryModel();
$condition = [
[ 'pid', '=', 0 ],
[ 'site_id', '=', $this->site_id ]
];
$goods_category_list = $goods_category_model->getCategoryList($condition, 'category_id,category_name,level,commission_rate');
$goods_category_list = $goods_category_list[ 'data' ];
$this->assign("goods_category_list", $goods_category_list);
// 商品分组
$goods_label_model = new GoodsLabelModel();
$label_list = $goods_label_model->getLabelList([ [ 'site_id', '=', $this->site_id ] ], 'id,label_name', 'create_time desc')[ 'data' ];
$this->assign("label_list", $label_list);
// 商品服务
$goods_service_model = new GoodsServiceModel();
$service_list = $goods_service_model->getServiceList([ [ 'site_id', '=', $this->site_id ] ], 'id,service_name,icon')[ 'data' ];
$this->assign("service_list", $service_list);
//获取运费模板
$express_template_model = new ExpressTemplateModel();
$express_template_list = $express_template_model->getExpressTemplateList([ [ 'site_id', "=", $this->site_id ] ], 'template_id,template_name', 'is_default desc');
$express_template_list = $express_template_list[ 'data' ];
$this->assign("express_template_list", $express_template_list);
//判断会员价插件
$memberprice_is_exit = addon_is_exit('memberprice', $this->site_id);
$this->assign('memberprice_is_exit', $memberprice_is_exit);
// 判断采集插件
$goodsgrab_is_exit = addon_is_exit('goodsgrab', $this->site_id);
$this->assign('goodsgrab_is_exit', $goodsgrab_is_exit);
// 营销活动
$goods_promotion_type = event('GoodsPromotionType');
$this->assign('promotion_type', $goods_promotion_type);
$this->assign('virtualcard_exit', addon_is_exit('virtualcard', $this->site_id));
$this->assign('stockalarm', $stockalarm);
return $this->fetch("comment/goods_lists");
}
}
/**
* 创建虚拟评价
* Class Virtualgoods
* @package app\shop\controller
*/
public function setting()
{
$goods_ids = input('goods_ids', 0);
$goods_model = new Goods();
$goods_data = $goods_model->getGoodsList([ [ 'goods_id', 'in', $goods_ids ], [ 'site_id', '=', $this->site_id ] ], 'sku_id,goods_id,goods_name,price,goods_image');
$data = json_decode(input('field'), true);
if (!empty($data[ 'member_headimg' ])) {
$data[ 'member_headimg' ] = $data[ 'member_headimg' ][ 0 ];
}
$pingjia_img = '';
if (!empty($data[ 'pingjia_img' ])) {
foreach ($data[ 'pingjia_img' ] as $k => $val) {
$pingjia_img = $pingjia_img . ',' . $val;
}
$pingjia_img = trim($pingjia_img, ',');
}
$data[ 'pingjia_img' ] = $pingjia_img;
$data[ 'goods_data' ] = '';
if (!empty($goods_data[ 'data' ])) {
$data[ 'goods_data' ] = $goods_data[ 'data' ];
}
$VirtualEvaluation_model = new VirtualEvaluation();
$res = $VirtualEvaluation_model->addGoodsComment($data, $this->site_id);
return $res;
}
/**
* 虚拟评价库
* Class Virtualgoods
* @package app\shop\controller
*/
public function stock()
{
if (request()->isJson()) {
$stock_model = new VirtualStock();
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$condition = [
'site_id' => $this->site_id
];
$stock_data = $stock_model->getStockPageList($condition, $page, $page_size, '', '');
return $stock_data;
} else {
return $this->fetch("comment/stock");
}
}
/**
* 添加虚拟评价库
* Class Virtualgoods
* @package app\shop\controller
*/
public function addStock()
{
$stock_model = new VirtualStock();
$stock_name = input('stock_name', '');
$data = [
'stock_name' => $stock_name,
'site_id' => $this->site_id,
'create_time' => time(),
];
return $stock_model->addStock($data);
}
/**
* 删除虚拟评价库
* Class Virtualgoods
* @package app\shop\controller
*/
public function deleteStock()
{
$stock_model = new VirtualStock();
$stock_id = input('stock_id', '');
return $stock_model->deleteStock($stock_id, $this->site_id);
}
/**
* 获取虚拟评价库信息
* Class Virtualgoods
* @package app\shop\controller
*/
public function getStockInfo()
{
$stock_model = new VirtualStock();
$stock_id = input('stock_id', '');
return $stock_model->getStockInfo($stock_id, $this->site_id);
}
/**
* 编辑虚拟评价库
* Class Virtualgoods
* @package app\shop\controller
*/
public function editStock()
{
$stock_model = new VirtualStock();
$stock_id = input('stock_id', 0);
$stock_name = input('stock_name', '');
$data = [
'stock_name' => $stock_name,
'modify_time' => time(),
'stock_id' => $stock_id
];
return $stock_model->updateStock($data, $this->site_id);
}
/**
* 获取虚拟评价库里的评论信息
* Class Virtualgoods
* @package app\shop\controller
*/
public function getContents()
{
$stock_id = input('stock_id', 0);
if (request()->isJson()) {
$stock_model = new VirtualStock();
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$condition = [
'site_id' => $this->site_id,
'stock_id' => $stock_id,
];
$stock_data = $stock_model->getContentsPageList($condition, $page, $page_size, '', '');
return $stock_data;
} else {
$this->assign('stock_id', $stock_id);
return $this->fetch("comment/contents");
}
}
/**
* 添加虚拟评价库评论
* Class Virtualgoods
* @package app\shop\controller
*/
public function addContent()
{
$stock_model = new VirtualStock();
$stock_id = input('stock_id', 0);
$content = input('content', '');
$data = [
'stock_id' => $stock_id,
'site_id' => $this->site_id,
'content' => $content,
'create_time' => time(),
];
return $stock_model->addContent($data);
}
/**
* 删除虚拟评价库评论
* Class Virtualgoods
* @package app\shop\controller
*/
public function deleteContent()
{
$stock_model = new VirtualStock();
$id = input('id', 0);
return $stock_model->deleteContent($id, $this->site_id);
}
/**
* 获取虚拟评价库评论信息
* Class Virtualgoods
* @package app\shop\controller
*/
public function getContentInfo()
{
$stock_model = new VirtualStock();
$id = input('id', 0);
return $stock_model->getContentInfo($id, $this->site_id);
}
/**
* 修改虚拟评价库评论信息
* Class Virtualgoods
* @package app\shop\controller
*/
public function editContent()
{
$stock_model = new VirtualStock();
$id = input('id', 0);
$content = input('content', '');
$data = [
'content' => $content,
'id' => $id
];
return $stock_model->editContentInfo($data, $this->site_id);
}
/**
* 批量添加单个商品的评论
* Class Virtualgoods
* @package app\shop\controller
*/
public function batchAdd()
{
$album_model = new Album();
$stock_model = new VirtualStock();
$goods_id = input('goods_id', 0);
if (request()->isJson()) {
$start_time = date_to_time(input('start_time'));
$end_time = date_to_time(input('end_time'));
if ($start_time == '' || $end_time == '' || $end_time < $start_time) return error('-1', '时间格式不正确');
$virtual_evaluation_model = new VirtualEvaluation();
$data = [
'goods_id' => input('goods_id', 0),
'number' => input('number', 0),
'pingfen' => input('pingfen', ''),
'start_time' => $start_time,
'end_time' => $end_time,
'album_id' => input('album_id', 0),
'stock_id' => input('stock_id', 0)
];
$res = $virtual_evaluation_model->batghAdd($data, $this->site_id);
return $res;
} else {
//获取相册
$album_list = $album_model->getAlbumList([ [ 'site_id', '=', $this->site_id ], [ 'num', '>', 0 ] ]);
$this->assign('album_list', $album_list[ 'data' ]);
//获取评论库
$stock_list = $stock_model->getStockList([ [ 'site_id', '=', $this->site_id ], [ 'num', '>', 0 ] ]);
$this->assign('stock_list', $stock_list[ 'data' ]);
$this->assign('goods_id', $goods_id);
return $this->fetch("comment/batchadd");
}
}
}

View File

@@ -0,0 +1,250 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<style>
/*底部按钮*/
.fixed-btn {
width: 100%;
text-align: center;
position: fixed;
bottom: 0;
margin: 0 0 0 -15px !important;
background: #F9F9F9;
line-height: 80px;
z-index: 1000;
border-top: 1px solid #e5e5e5;
}
.fixed-btn > button {
vertical-align: middle;
}
.fixed-btn > button:first-child {
display: none;
}
</style>
<div class="layui-form">
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
<div class="layui-tab-content">
<!-- 基础设置 -->
<div class="layui-tab-item layui-show">
<div class="layui-card card-common">
<div class="layui-card-header">
<span class="card-title">添加条数</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>添加条数:</label>
<div class="layui-input-inline">
<input name="number" onchange="maxNum(this)" type="number" placeholder="请输入整数" max="100" autocomplete="off" lay-verify="number" class="layui-input len-long">
</div>
</div>
<div class="word-aux">将按此条数随机生成虚拟评论每次上限100条</div>
</div>
</div>
<div class="layui-card card-common">
<div class="layui-card-header">
<span class="card-title">会员信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">生成方式:</label>
<div class="layui-input-inline">
<p>随机生成</p>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label"><span class="required">*</span>头像来源:</label>
<div class="layui-input-inline">
<select name="album_id" id="album_id">
<option value="">请选择头像来源</option>
{foreach name="$album_list" item="vo"}
<option value="{$vo['album_id']}">{$vo['album_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="word-aux">头像来源分组来自【商品-相册管理】中的图片分组,生成每条评论时,用户头像将从此分组中随机抽取</div>
</div>
</div>
</div>
<div class="layui-card card-common">
<div class="layui-card-header">
<span class="card-title">评价内容</span>
</div>
<div class="layui-card-body">
<div class="layui-inline">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>评价级别:</label>
<div class="layui-input-inline">
<input type="checkbox" name="pingfen" value="1" title="1分">
<input type="checkbox" name="pingfen" value="2" title="2分">
<input type="checkbox" name="pingfen" value="3" title="3分">
<input type="checkbox" name="pingfen" value="4" title="4分">
<input type="checkbox" name="pingfen" value="5" title="5分">
</div>
</div>
<div class="word-aux">生成每条评论时,从所勾选的评分中随机选择</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label"><span class="required">*</span>评论来源:</label>
<div class="layui-input-inline">
<select name="stock_id" id="stock_id">
<option value="">请选择评论来源</option>
{foreach name="$stock_list" item="vo"}
<option value="{$vo['stock_id']}">{$vo['stock_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="word-aux">评论来源来自【虚拟评价库】,生成每条评论时,评论内容将从此评价库随机抽取</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label"><span class="required">*</span>时间范围:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
<div class="word-aux">生成每条评论时,评论时间将从此时间段中选取</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="fixed-btn">
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-submit="" lay-filter="prev">上一步</button>
<input type="hidden" name="goods_id" value="{$goods_id}">
<button class="layui-btn js-save" lay-submit="save" lay-filter="save">保存</button>
</div>
</div>
<script>
var save_flag = false,form;
layui.use(['form','layer','laytpl' ,'element','laydate'], function() {
form = layui.form;
laytpl = layui.laytpl;
var laydate = layui.laydate;
var layer = layui.layer;
element = layui.element;
form.render();
var myDate = ns.time_to_date(new Date().getTime() / 1000);
//渲染时间
laydate.render({
elem: '#start_time'
,type: 'datetime',
max: myDate
});
laydate.render({
elem: '#end_time'
,type: 'datetime',
max: myDate
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
/**
* 保存添加评价库
*/
form.on('submit(save)', function (data) {
var pingfen =[];
if (save_flag) return;
save_flag = true;
var goods_id = {$goods_id};
// var goods_id = $("input[name='goods_id']").val();
var number = $("input[name='number']").val();
$("[name='pingfen']:checked").each(function(){
pingfen.push($(this).val())
});
var start_time = $("input[name='start_time']").val();
var end_time = $("input[name='end_time']").val() ;
var album_id = $("#album_id").val();
var stock_id = $("#stock_id").val();
if(goods_id==''){
return layer.msg('必要参数不能为空');
}
if(number=='' || number<0){
return layer.msg('条数不能为空且大于零的正整数');
}
if(stock_id==''){
return layer.msg('评论内容来源不能为空');
}
if(pingfen==''){
return layer.msg('评分不能不勾选');
}
if(album_id==''){
return layer.msg('会员头像来源不能为空');
}
if(start_time=='' || end_time=='' || end_time < start_time){
return layer.msg('时间格式不对');
}
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("virtualevaluation://shop/comment/batchadd"),
data: {number:number,pingfen:pingfen,start_time:start_time,end_time:end_time,album_id:album_id,stock_id:stock_id,goods_id:goods_id},
success: function (res) {
save_flag = false;
if (res.code == 0) {
layer.confirm('操作成功', {
title: '操作提示',
btn: ['返回列表','继续操作'],
yes: function (index, layero) {
location.hash = ns.hash("virtualevaluation://shop/comment/goodslists")
layer.close(index);
},
btn2: function (index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
})
})
});
function maxNum(el){
var value = $(el).val();
if(value > 100) {
$(el).val(100);
layer.msg('添加条数不能超过100条');
}
}
</script>

View File

@@ -0,0 +1,54 @@
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<style>
.goods-category-container {display: inline-block;position: relative;z-index: 10}
</style>
<div class="goods-category-container">
<input type="text" autocomplete="off" show="false" class="layui-input select-category" placeholder="选择商品分类" readonly />
<input type="hidden" name="category_id">
</div>
<script>
var form, layCascader, goodsCategory = [];
$(function() {
layui.use(['form', 'layCascader'], function () {
form = layui.form;
layCascader = layui.layCascader;
form.render();
fetchCategory($('.goods-category-container .select-category'), function (value, node) {
$('[name="category_id"]').val(value);
})
});
});
/**
* 渲染分类选择
* @param elem
* @param callback
*/
function fetchCategory(elem, callback){
if (!goodsCategory.length) {
$.ajax({
url : ns.url("shop/goodscategory/lists"),
dataType: 'JSON',
type: 'POST',
async: false,
success: function(res) {
goodsCategory = res.data;
}
})
}
if($('.select-category').length) {
var _cascader = layCascader({
elem: $('.select-category'),
options: goodsCategory,
props: {
value: 'category_id',
label: 'category_name',
children: 'child_list'
}
});
_cascader.changeEvent(function (value, node) {
typeof callback == 'function' && callback(value, node)
});
}
}
</script>

View File

@@ -0,0 +1,258 @@
<style>
.single-filter-box{display: flex; justify-content: space-between}
.item-right select {margin-right: 20px;width: 80px; height: 25px;}
.layui-form-label{width: 205px}
.layui-form-item{display: flex;justify-content: center;}
.layui-form-label{width: auto;}
.layui-input-inline textarea{border:1px solid rgba(135,135,135,.2);}
.layui-input-block textarea{border:1px solid rgba(135,135,135,.2);}
textarea{padding: 6px;box-sizing: border-box;height: 156px;}
</style>
<div class="single-filter-box">
<button class="layui-btn" onclick="addContent()">添加评价</button>
</div>
<table id="content_list" lay-filter="content_list"></table>
<!-- 搜索 -->
<!-- 创建评论库弹出层 -->
<script type="text/html" id="create_content">
<div class="goods-service">
<div class="layui-form-item">
<label class="layui-form-label">评价内容</label>
<div class="layui-input-inline">
<textarea name="content" id="content" cols="30" rows="10" maxlength="150"></textarea>
</div>
</div>
<div class="form-row mid">
<input type="hidden" name="stock_id" value="{$stock_id}">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAddStockLayer()">返回</button>
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="rename">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script>
var laytpl,save_flag = false;
var layer;
var form,table,element,syncClick = false,repeat_flag = false;
layui.use(['form','layer','laytpl' ,'element'], function() {
form = layui.form;
laytpl = layui.laytpl;
var layer = layui.layer;
element = layui.element;
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
table = new Table({
elem: '#content_list',
url: ns.url("virtualevaluation://shop/comment/getContents"),
where: {
'stock_id': {$stock_id}
},
cols: [
[{
title: '评价内容',
unresize: 'false',
width: '35%',
field: 'content'
}, {
title: '创建时间',
unresize: 'false',
width: '35%',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'rename': //重命名
rename(data.id)
break;
case 'delete': //删除
deleteContent(data.id);
break;
}
});
/**
* 保存添加评价库
*/
form.on('submit(save)', function (data) {
if (save_flag) return;
save_flag = true;
var stock_id = $("input[name='stock_id']").val();
var content = $("#content").val();
if(stock_id ==''){
return layer.msg('必备参数不具有');
}
if(content ==''){
return layer.msg('内容不能为空');
}
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("virtualevaluation://shop/comment/addcontent"),
data: {content:content,stock_id:stock_id},
success: function (res) {
save_flag = false;
layer.msg(res.message);
listenerHash(); // 刷新页面
layer.closeAll();
}
})
})
/**
* 保存添加评价库
*/
form.on('submit(editSave)', function (data) {
if (save_flag) return;
save_flag = true;
var content = $("#editcontent").val();
var id = $("input[name='id']").val();
if(id==''){
return layer.msg('必须参数不可少');
}
if(content==''){
return layer.msg('评价不能为空');
}
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("virtualevaluation://shop/comment/editcontent"),
data: {content:content,id:id},
success: function (res) {
save_flag = false;
layer.msg(res.message);
listenerHash(); // 刷新页面
layer.closeAll();
}
})
})
});
function closeAddStockLayer() {
layer.close(add_stock_layer);
}
/**
* 添加
*/
function addContent() {
laytpl($("#create_content").html()).render({}, function(html) {
add_stock_layer = layer.open({
type: 1,
title: '添加评价',
area: ['500px', '300px'],
content: html,
success: function(layero, index) {
form.render();
}
});
})
}
function rename(id){
$.ajax({
url: ns.url("virtualevaluation://shop/comment/getcontentinfo"),
data: {
id:id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
var id = res.data.id;
var content = res.data.content;
var html = `<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label" style="width:auto"><span class="required">*</span>评价内容:</label>
<div class="layui-input-block" style="margin-left: 0;">
<input name="id" type="hidden" lay-verify="required" value="`+ id +`" class="layui-input len-mid">
<textarea name="editcontent" id="editcontent" cols="30" rows="10" >`+content+`</textarea>
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="editSave">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAddStockLayer()">返回</button>
</div>
</div>`;
add_stock_layer=layer.open({
type: 1,
shadeClose: true,
shade: 0.3,
offset: 'auto',
scrollbar: true,
fixed: false,
title: "编辑评价",
area: ['450px', 'auto'],
content: html,
});
}
});
}
/**
* 删除
*/
function deleteContent(id){
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该评价吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("virtualevaluation://shop/comment/deletecontent"),
data: {
id:id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
</script>

View File

@@ -0,0 +1,949 @@
<link rel="stylesheet" href="SHOP_CSS/goods_lists.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<style>
.batch-set-wrap{height: auto;}
.layui-input-block textarea{border: 1px solid #D2D2D2;}
.layui-input-block textarea:focus{border: 1px solid rgb(255,106,0);}
/* 底部btn位置 */
.content-box{position: relative;}
.footer-btn{width: 100%;position: absolute;left: -20px;bottom: 20px;}
.layui-layout-admin.admin-style-2 .layui-body .body-content{padding-top:15px !important;}
</style>
<!-- 筛选面板 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品名称:</label>
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入商品名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品分类:</label>
<div class="layui-input-inline">
{include file="comment/category_select" /}
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">销量:</label>
<div class="layui-input-inline">
<input type="number" name="start_sale" id="start_sale" lay-verify="int" placeholder="最低销量" class="layui-input" autocomplete="off">
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="number" name="end_sale" id="end_sale" lay-verify="int" placeholder="最高销量" class="layui-input" autocomplete="off">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品类型:</label>
<div class="layui-input-inline">
<select name="goods_class" lay-filter="goods_class">
<option value="">全部</option>
<option value="1">实物商品</option>
<option value="2">虚拟商品</option>
{if $virtualcard_exit}<option value="3">电子卡密</option>{/if}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品分组:</label>
<div class="layui-input-inline">
<select name="label_id" lay-filter="label_id">
<option value="">全部</option>
{foreach name="$label_list" item="vo"}
<option value="{$vo['id']}">{$vo['label_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">营销活动:</label>
<div class="layui-input-inline">
<select name="promotion_type" lay-filter="promotion_type">
<option value="">全部</option>
{foreach name="$promotion_type" item="vo"}
<option value="{$vo['type']}">{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<input type="hidden" name="stockalarm" value="{$stockalarm}"/>
<input type="hidden" name="goods_state" value="{$goods_state}"/>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="goods_list_tab">
<ul class="layui-tab-title">
<li {if $goods_state == '' && $stockalarm == 0}class="layui-this"{/if} lay-id="">全部</li>
<li {if $goods_state == '1'}class="layui-this"{/if} lay-id="1" data-type="goods_state">销售中</li>
<li {if $goods_state == '0'}class="layui-this"{/if} lay-id="0" data-type="goods_state">仓库中</li>
<li {if $stockalarm == '1'} class="layui-this"{/if} lay-id="1" data-type="stockalarm">预警中</li>
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="goods_list" lay-filter="goods_list"></table>
</div>
</div>
<!-- 商品信息 -->
<script type="text/html" id="goods_info">
<div class="table-title">
<div class="contraction" data-goods-id="{{d.goods_id}}" data-open="0"></div>
<div class="title-pic" id="goods_img_{{d.goods_id}}">
<img layer-src="{{ns.img(d.goods_image.split(',')[0], 'big')}}" src="{{ns.img(d.goods_image.split(',')[0], 'small')}}"/>
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.goods_name}}" lay-event="preview">{{d.goods_name}}</a>
{{# if(d.promotion_addon && d.promotion_addon_list){ }}
<span class="promotion-addon">
{{# for(var i=0;i<d.promotion_addon_list.length;i++){ }}
<a href="{{ns.href( d.promotion_addon_list[i].url )}}" target="_blank"><span class="bg-color" title="{{d.promotion_addon_list[i].name}}">{{ d.promotion_addon_list[i].short }}</span></a>
{{# } }}
</span>
{{# } }}
{{# if(d.is_consume_discount ==1){ }}
<span class="promotion-addon vips_price" data-goods-id="{{d.goods_id}}" data-open="0">
<span class="layui-bg-black " title="会员价"><span class="iconfont iconhuiyuan icon">svip</span></span>
</span>
{{# } }}
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="operation-wrap" id="goods_id" data-goods-id="{{d.goods_id}}">
<div class="popup-qrcode-wrap"><img class="popup-qrcode-loadimg" src="__STATIC__/loading/loading.gif" /></div>
<div class="table-btn">
<a class="layui-btn" lay-event="batch_set">添加评论</a>
<a class="layui-btn" lay-event="batch_add">批量添加</a>
</div>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="batch_set">批量评论</button>
</script>
<!-- 批量操作 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="batch_set">批量评论</button>
</script>
<!-- SKU商品列表 -->
<script type="text/html" id="skuList">
<tr class="js-sku-list-{{d.index}}" id="sku_img_{{d.index}}">
<td></td>
{{# if (d.member_price_is_exit == 1) { }}
<td colspan="9">
{{# } else { }}
<td colspan="8">
{{# } }}
<ul class="sku-list">
{{# for(var i=0;i<d.list.length;i++){ }}
<li>
<div class="img-wrap">
<img layer-src src="{{ns.img(d.list[i].sku_image, 'small')}}">
</div>
<div class="info-wrap">
<span class="sku-name">{{d.list[i].sku_name}}</span>
<div>
{{# if(d.list[i].stock_alarm> 0 && d.list[i].stock<=d.list[i].stock_alarm){ }}
<span class="stock" >库存<label style="color:red;">{{d.list[i].stock}}库存不足</label></span>
{{# }else{ }}
<span class="stock">库存{{d.list[i].stock}}</span>
{{# } }}
<span class="sale_num">销量{{d.list[i].sale_num}}</span>
</div>
</div>
<div class="prices">
原价: {{d.list[i].price}}
{{# if (d.list[i].member_price_list) { }}
{{# layui.each(d.list[i].member_price_list, function(index, item){ }}
<p class="vip_price">{{ item.level_name }}: {{ item.member_price }}</p>
{{# }); }}
{{# } }}
</div>
</li>
{{# } }}
</ul>
</td>
</tr>
</script>
<!-- 编辑库存html -->
<script type="text/html" id="edit_stock">
<div class="layui-form" id="edit_stock_block" lay-filter="form">
<table class="layui-table" lay-skin="line">
<colgroup>
<col width="16%">
<col width="12%">
<col width="12%">
<col width="12%">
<col width="12%">
<col width="12%">
<col width="12%">
<col width="12%">
</colgroup>
<thead>
<tr>
<th>sku名称</th>
<th>销售价</th>
<th>划线价</th>
<th>成本价</th>
<th>库存</th>
<th>重量(kg)</th>
<th>体积()</th>
<th>sku编码</th>
</tr>
</thead>
<tbody>
{{# layui.each(d, function(index, item){ }}
<tr>
<td><input type="hidden" name="sku_list[{{index}}][sku_id]" value="{{ item.sku_id }}" class="layui-input">{{ item.sku_name }}</td>
<td><input type="number" name="sku_list[{{index}}][price]" value="{{ item.price }}" class="layui-input" lay-verify="flo"></td>
<td><input type="number" name="sku_list[{{index}}][market_price]" value="{{ item.market_price }}" class="layui-input" lay-verify="flo"></td>
<td><input type="number" name="sku_list[{{index}}][cost_price]" value="{{ item.cost_price }}" class="layui-input" lay-verify="flo"></td>
<td><input type="number" name="sku_list[{{index}}][stock]" value="{{ item.stock }}" class="layui-input" lay-verify="int"></td>
<td><input type="number" name="sku_list[{{index}}][weight]" value="{{ item.weight }}" class="layui-input" lay-verify="flo"></td>
<td><input type="number" name="sku_list[{{index}}][volume]" value="{{ item.volume }}" class="layui-input" lay-verify="flo"></td>
<td><input type="text" name="sku_list[{{index}}][sku_no]" value="{{ item.sku_no }}" class="layui-input"></td>
</tr>
{{# }); }}
</tbody>
</table>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="edit_stock">确定</button>
<button class="layui-btn layui-btn-primary" onclick="closeStock()">返回</button>
</div>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="batchSet">
<div class="batch-set-wrap">
<div class="set-wrap">
<div class="content-wrap content-box">
<div class="tab-item tab-show group">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="evaluate_time" id="evaluate_time" placeholder="评价时间" class="layui-input" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="layui-form-item goods-image-wrap" >
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<div class="js-goods-image">+</div>
</div>
</div>
<div class="layui-form-item layui-inline" >
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<input type="hidden" id="test" value="{{d.goods_id}}">
<input type="text" name="member_name" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline" >
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<div id="test2"></div>
</div>
</div>
<div class="layui-form-item goods-image-wrap" >
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<textarea name="content" id="content" cols="30" rows="10" maxlength="150"></textarea>
</div>
</div>
<div class="layui-form-item goods-image-wrap">
<label class="layui-form-label">评价图</label>
<div class="layui-input-block">
<!--商品主图项-->
<div class="pj-goods-image">+</div>
</div>
</div>
</div>
</div>
<div class="tab-item result">
<img src="SHOP_IMG/success.png">
<div class="text">设置成功</div>
</div>
</div>
</div>
<div class="footer-wrap footer-btn">
<button class="layui-btn layui-btn-primary" onclick="layer.closeAll()">取消</button>
<button class="layui-btn" onclick="batchSetting()">保存</button>
</div>
</div>
</script>
<!--商品主图列表-->
<script type="text/html" id="goodsImage">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src>
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
</script>
<!--选择商品分类-->
<script type="text/html" id="selectedCategory">
<div class="category-list">
<div class="item">
<!--后续做搜索-->
<ul>
{foreach name="$goods_category_list" item="vo"}
{{# if(d.category_id_1 == '{$vo['category_id']}' ){ }}
<li data-category-id="{$vo['category_id']}" data-commission-rate="{$vo['commission_rate']}" data-level="{$vo['level']}" class="selected">
{{# }else{ }}
<li data-category-id="{$vo['category_id']}" data-commission-rate="{$vo['commission_rate']}" data-level="{$vo['level']}">
{{# } }}
<span class="category-name">{$vo['category_name']}</span>
<span class="right-arrow">&gt;</span>
</li>
{/foreach}
</ul>
</div>
<div class="item" data-level="2">
<!--后续做搜索-->
<ul></ul>
</div>
<div class="item" data-level="3">
<!--后续做搜索-->
<ul></ul>
</div>
</div>
<div class="selected-category-wrap">
<label>您当前选择的是</label>
<span class="js-selected-category"></span>
</div>
</script>
<script>
var member_price_is_exit ="{$memberprice_is_exit}";
</script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var goodsImage = null;
var pggoodsImage = null;
var laytpl, form, element, table;
$(function () {
$("body").off("click", ".vips_price").on("click", ".vips_price", function () {
var goods_id = $(this).attr("data-goods-id");
var open = $(this).attr("data-open");
var open_t = $(this).parent().siblings('.contraction').attr("data-open");
var tr = $(this).parent().parent().parent().parent().parent();
var index = tr.attr("data-index");
if ((parseInt(open)+parseInt(open_t)) > 0) {
$(this).parent().siblings('.contraction').children("span").text("+");
$(".js-sku-list-" + index).remove();
} else {
$(this).parent().siblings('.contraction').children("span").text("-");
$.ajax({
url: ns.url("shop/goods/getGoodsSkuList"),
data: {goods_id: goods_id},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
var list = res.data;
var sku_list = $("#skuList").html();
var data = {
list: list,
index: index,
member_price_is_exit: member_price_is_exit
};
laytpl(sku_list).render(data, function (html) {
tr.after(html);
});
layer.photos({
photos: '.img-wrap',
anim: 5
});
}
});
}
$(this).attr("data-open", (open == 0 ? 1 : 0));
$(this).parent().siblings('.contraction').attr("data-open", (open == 0 ? 1 : 0))
});
layui.use(['form', 'laytpl', 'element'], function () {
form = layui.form;
element = layui.element;
laytpl = layui.laytpl;
form.render();
refreshTable();
element.on('tab(goods_list_tab)', function () {
var type = this.getAttribute('data-type');
$("input[name='goods_state']").val("");
if (type) {
if (type == "goods_state") {
$("input[name='stockalarm']").val("");
}
var id = this.getAttribute('lay-id');
$("input[name='" + type + "']").val(id);
} else {
$("input[name='stockalarm']").val("");
}
var html = '<button class="layui-btn layui-btn-primary" lay-event="batch_set">批量评价</button>';
$("#toolbarOperation").html(html);
$("#batchOperation").html(html);
refreshTable();
});
// 监听工具栏操作
table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'batch_set':
laytpl($("#batchSet").html()).render(data, function (html) {
layer.open({
title: "评价设置",
type: 1,
area: ['600px', '750px'],
content: html,
success: function(){
layui.use(['form', 'laydate','rate'], function() {
var form = layui.form,
laydate = layui.laydate;
form.render();
var myDate = ns.time_to_date(new Date().getTime() / 1000);
laydate.render({
elem: '#evaluate_time',
type: 'datetime',
max: myDate
});
var rate = layui.rate;
//显示文字
dengji = '';
rate.render({
elem: '#test2'
,choose: function(value){
dengji = value;
}
,text: true //开启文本
});
});
goodsImage = [];
pggoodsImage = [];
//渲染商品主图列表
refreshGoodsImage(goodsImage,1,'js-goods-image');
refreshGoodsImage(pggoodsImage,5,'pj-goods-image');
}
});
});
break;
case 'batch_add':
batchAdd(data.goods_id);
break
;
}
});
// 批量操作
table.bottomToolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].goods_id);
switch (obj.event) {
case 'batch_set':
layer.open({
title: "评价设置",
type: 1,
area: ['600px', '750px'],
content: $('#batchSet').html(),
success: function(){
layui.use(['form', 'laydate','rate'], function() {
var form = layui.form,
laydate = layui.laydate;
form.render();
laydate.render({
elem: '#evaluate_time',
type: 'datetime'
});
var rate = layui.rate;
//显示文字
dengji = '';
rate.render({
elem: '#test2'
,choose: function(value){
dengji = value
}
,text: true //开启文本
});
});
goodsImage = [];
pggoodsImage = [];
//渲染商品主图列表
refreshGoodsImage(goodsImage,1,'js-goods-image');
refreshGoodsImage(pggoodsImage,5,'pj-goods-image');
}
});
break;
}
});
table.toolbar(function(obj){
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].goods_id);
switch (obj.event) {
case 'batch_set':
layer.open({
title: "评价设置",
type: 1,
area: ['600px', '750px'],
content: $('#batchSet').html(),
success: function(){
layui.use(['form', 'laydate','rate'], function() {
var form = layui.form,
laydate = layui.laydate;
form.render();
laydate.render({
elem: '#evaluate_time',
type: 'datetime'
});
});
var rate = layui.rate;
//显示文字
dengji = 5;
rate.render({
elem: '#test2'
,value: 5 //初始值
// ,text: true //开启文本
// ,choose: function(value){
// dengji = value
// },
});
goodsImage = [];
pggoodsImage = [];
//渲染商品主图列表
refreshGoodsImage(goodsImage,1,'js-goods-image');
refreshGoodsImage(pggoodsImage,5,'pj-goods-image');
}
});
break;
}
});
// 搜索功能
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
// 验证
form.verify({
int: function (value) {
if (value < 0) {
return '销量不能小于0!'
}
if (value % 1 != 0) {
return '销量不能为小数!'
}
},
})
});
});
/**
* 刷新表格列表
*/
function refreshTable() {
var cols = [
[{
type: 'checkbox',
unresize: 'false',
width: '3%'
}, {
title: '商品信息',
unresize: 'false',
width: '31%',
templet: '#goods_info'
}, {
field: 'price',
title: '价格',
unresize: 'false',
width: '7%',
align: 'right',
templet: function (data) {
return '¥' + data.price;
}
},{
field: 'sale_num',
title: '销量',
unresize: 'false',
width: '4%',
sort: true
},{
field: 'evaluate',
title: '评价数',
unresize: 'false',
width: '5%',
}, {
field: 'success_evaluate_num',
title: '审核通过',
unresize: 'false',
width: '5%',
}, {
field: 'fail_evaluate_num',
unresize:'false',
title: `审核未通过`,
width: '5%',
align: 'center',
}, {
title: '创建时间',
unresize: 'false',
width: '12%',
templet: function (data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '状态',
unresize: 'false',
width: '9%',
templet: function (data) {
var str = '';
if (data.goods_state == 1) {
str = '销售中';
} else if (data.goods_state == 0) {
str = '仓库中';
}
return str;
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
];
if(member_price_is_exit == 1){
cols = [
[{
type: 'checkbox',
unresize: 'false',
width: '3%'
}, {
title: '商品信息',
unresize: 'false',
width: '33%',
templet: '#goods_info'
}, {
field: 'price',
title: '价格',
unresize: 'false',
width: '7%',
align: 'right',
templet: function (data) {
return '¥' + data.price;
}
}, {
field: 'sale_num',
title: '销量',
unresize: 'false',
width: '4%',
sort: true
}, {
field: 'evaluate',
title: '评价数',
unresize: 'false',
width: '5%',
},{
field: 'success_evaluate_num',
title: '审核通过',
unresize: 'false',
width: '5%',
},{
field: 'fail_evaluate_num',
unresize:'false',
title: `审核未通过`,
width: '5%',
align: 'center',
}, {
title: '创建时间',
unresize: 'false',
width: '12%',
templet: function (data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '状态',
unresize: 'false',
width: '6%',
templet: function (data) {
var str = '';
if (data.goods_state == 1) {
str = '销售中';
} else if (data.goods_state == 0) {
str = '仓库中';
}
return str;
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
];
}
table = new Table({
id: 'goods_list',
elem: '#goods_list',
url: ns.url("virtualevaluation://shop/comment/goodslists"),
cols: cols,
toolbar: '#toolbarOperation',
bottomToolbar: "#batchOperation",
where: {
search_text: $("input[name='search_text']").val(),
goods_state: $("input[name='goods_state']").val(),
start_sale: $("input[name='start_sale']").val(),
end_sale: $("input[name='end_sale']").val(),
category_id: $("input[name='category_id']").val(),
goods_class: $("select[name='goods_class'] option:checked").val(),
label_id: $("select[name='label_id'] option:checked").val(),
promotion_type: $("select[name='promotion_type'] option:checked").val(),
stockalarm: $("input[name='stockalarm']").val()
}
});
}
function closeStock() {
layer.close(layer_stock);
}
// 批量设置
var setSub = false;
function batchSetting(){
var id_array = new Array(),
setType = $('.batch-set-wrap .tab-wrap .active').attr('data-type'),
checkedData = table.checkStatus('goods_list').data,
field = {}
var goods_id = $("#test").val();
for (i in checkedData) id_array.push(checkedData[i].goods_id);
if (id_array.toString()==''){
id_array = goods_id;
}
field.evaluate_time = $("input[name='evaluate_time']").val();
field.member_headimg = goodsImage;
field.member_name = $("input[name='member_name']").val();
field.content = $("#content").val();
field.dengji = dengji;
field.pingjia_img = pggoodsImage;
if(field.evaluate_time ==''){
layer.msg('请输入时间');
return false
}else if(field.member_headimg==''){
layer.msg('请选择头像');
return false
}else if(field.member_name==''){
layer.msg('请输入昵称');
return false
}else if(field.content==''){
layer.msg('请输入内容');
return false
}else if(field.dengji==''){
layer.msg('请选择等级');
return false
}
if (setSub) return;
setSub = true;
$.ajax({
type: "POST",
url: ns.url("virtualevaluation://shop/comment/setting"),
data: {
'type': setType,
'goods_ids': id_array.toString(),
'field' : JSON.stringify(field)
},
dataType: 'JSON',
success: function (res) {
setSub = false;
if (res.code >= 0) {
$('.batch-set-wrap .footer-wrap').hide();
$('.batch-set-wrap .content-wrap .tab-item.result').addClass('tab-show').siblings('.tab-item').removeClass('tab-show');
table.reload();
} else {
layer.msg(res.message);
}
}
})
}
// 监听单元格编辑
$(".layui-colla-title").on("click", function(){
if($(".layui-colla-title>i").hasClass("layui-icon-down") === false && $(".layui-colla-title>i").hasClass("layui-icon-up") === false){
$(".layui-colla-title .put-open").html("展开");
}else if($(".layui-colla-title>i").hasClass("layui-icon-down") === true){
$(".layui-colla-title .put-open").html("展开");
}else if($(".layui-colla-title>i").hasClass("layui-icon-up") === true){
$(".layui-colla-title .put-open").html("收起");
}
});
/***
* @param imgArr 存储图片集合
* @param imgMax 最大图片数量
* @param imgDom 图片dom
*/
function refreshGoodsImage(imgArr,imgMax,imgDom) {
var goods_image_template = $("#goodsImage").html();
var data = {
list: imgArr,
max: imgMax
};
var imageDom = "." + imgDom;
laytpl(goods_image_template).render(data, function (html) {
$(imageDom).html(html);
$(imageDom).find(".js-add-goods-image").click(function (){
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imgArr.length < imgMax) imgArr.push(data[i].pic_path);
}
refreshGoodsImage(imgArr,imgMax,imgDom);
}, imgMax);
});
//加载图片放大
loadImgMagnify();
if (imgArr.length) {
//预览
$(imageDom).find('.js-preview').click(function () {
$(this).parent().prev().find("img").click();
});
//图片删除
$(imageDom).find('.js-delete').click(function () {
var index = $(this).attr("data-index");
imgArr.splice(index, 1);
refreshGoodsImage(imgArr,imgMax,imgDom);
});
//图片替换
$(imageDom).find('.replace_img').click(function () {
var index = $(this).attr("data-index");
openAlbum(function (data) {
imgArr[index] = data[0].pic_path;
refreshGoodsImage(imgArr,imgMax,imgDom);
}, 1);
});
}
});
}
function batchAdd(goods_id){
location.hash = ns.hash("virtualevaluation://shop/comment/batchadd?goods_id=" + goods_id)
}
</script>
<script>
layui.use(['form', 'laydate','rate'], function() {
var form = layui.form;
var laydate = layui.laydate;
form.render();
laydate.render({
elem: '#evaluate_time',
type: 'datetime'
});
});
</script>

View File

@@ -0,0 +1,314 @@
<style>
.single-filter-box{display: flex; justify-content: space-between}
.item-right select {margin-right: 20px;width: 80px; height: 25px;}
.layui-form-label{width: 205px}
.layui-input-inline>textarea{min-width:462px;max-width: 462px;min-height:20px;max-height: 68px;background:rgba(135,135,135,.2);border:none;}
.layui-layer-content{height: auto !important; }
.layui-form-item {margin-bottom: 30px;}
.layui-layout-admin .single-filter-box {
padding-top: 14px !important;
}
</style>
<div class="single-filter-box">
<button class="layui-btn" onclick="addStock()">添加评价库</button>
</div>
<table id="stock_list" lay-filter="stock_list"></table>
<!-- 创建评论库弹出层 -->
<script type="text/html" id="create_stock">
<div class="goods-service">
<div class="layui-form-item">
<label class="layui-form-label">评价库名称</label>
<div class="layui-input-inline">
<input type="text" name="stock_name" class="layui-input" autocomplete="off">
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAddStockLayer()">返回</button>
</div>
</div>
</script>
<script type="text/html" id="edit_stock">
<div class="goods-service">
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-inline">
<input type="text" name="stock_name" class="layui-input" autocomplete="off">
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAddStockLayer()">返回</button>
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">评价管理</a>
<a class="layui-btn" lay-event="rename">重命名</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script>
var laytpl, save_flag = false;
var layer;
var form, table, element, syncClick = false,
repeat_flag = false;
layui.use(['form', 'layer', 'laytpl', 'element'], function() {
form = layui.form;
laytpl = layui.laytpl;
var layer = layui.layer;
element = layui.element;
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
table = new Table({
elem: '#stock_list',
url: ns.url("virtualevaluation://shop/comment/stock"),
cols: [
[{
title: '评价库名称',
unresize: 'false',
width: '15%',
field: 'stock_name'
}, {
title: '评价条数',
unresize: 'false',
width: '15%',
field: 'num'
}, {
title: '创建时间',
unresize: 'false',
width: '15%',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
table.tool(function(obj) {
var data = obj.data;
num=data.num;
switch (obj.event) {
case 'rename': //重命名
rename(data.stock_id);
break;
case 'delete': //删除
deleteStock(data.stock_id,num);
break;
case 'edit': //编辑
editStock(data.stock_id);
break;
}
});
/**
* 保存添加评价库
*/
form.on('submit(save)', function(data) {
if (save_flag) return;
save_flag = true;
var stock_name = $("input[name='stock_name']").val();
if (stock_name == '') {
return layer.msg('请填写名称');
}
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("virtualevaluation://shop/comment/addstock"),
data: {
stock_name: stock_name
},
success: function(res) {
save_flag = false;
layer.msg(res.message);
listenerHash(); // 刷新页面
layer.closeAll();
}
})
});
/**
* 保存添加评价库
*/
form.on('submit(editSave)', function(data) {
if (save_flag) return;
save_flag = true;
var stock_name = $("input[name='stockname']").val();
var stock_id = $("input[name='stock_id']").val();
if (stock_id == '') {
return layer.msg('必须参数不可少');
}
if (stock_name == '') {
return layer.msg('请填写名称');
}
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("virtualevaluation://shop/comment/editstock"),
data: {
stock_name: stock_name,
stock_id: stock_id
},
success: function(res) {
save_flag = false;
layer.msg(res.message);
listenerHash(); // 刷新页面
layer.closeAll();
}
})
})
});
function closeAddStockLayer() {
layer.close(add_stock_layer);
}
/**
* 添加
*/
function addStock() {
laytpl($("#create_stock").html()).render({}, function(html) {
add_stock_layer = layer.open({
type: 1,
title: '添加评价库',
area: ['500px', '200px'],
content: html,
success: function(layero, index) {
form.render();
}
});
})
}
function rename(stock_id) {
$.ajax({
url: ns.url("virtualevaluation://shop/comment/getstockinfo"),
data: {
stock_id: stock_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
var stock_id = res.data.stock_id;
var stock_name = res.data.stock_name;
var html =
`<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label" style="width:auto"><span class="required">*</span>评价库名称:</label>
<div class="layui-input-block" style="margin-left: 0;">
<input name="stock_id" type="hidden" lay-verify="required" value="` +
stock_id +
`" class="layui-input len-mid">
<input name="stockname" type="text" lay-verify="required" value="` +
stock_name +
`" class="layui-input len-mid">
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="editSave">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAddStockLayer()">返回</button>
</div>
</div>`;
add_stock_layer = layer.open({
type: 1,
shadeClose: true,
shade: 0.3,
offset: 'auto',
scrollbar: true,
fixed: false,
title: "编辑评价库",
area: ['450px', 'auto'],
content: html,
});
}
});
}
/**
* 删除
*/
function deleteStock(stock_id,num) {
if(num>0){
layer.confirm('本操作将删除评论库及其评价,确定要删除吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("virtualevaluation://shop/comment/deletestock"),
data: {
stock_id: stock_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload({
page: {
curr: 1
},
});
}
}
});
}, function() {
layer.close();
repeat_flag = false;
});
return false
}
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该评价库吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("virtualevaluation://shop/comment/deletestock"),
data: {
stock_id: stock_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
}, function() {
layer.close();
repeat_flag = false;
});
}
function editStock(stock_id) {
location.hash = ns.hash("virtualevaluation://shop/comment/getContents?stock_id=" + stock_id)
}
</script>

View File

@@ -0,0 +1,2 @@
.add-carmichael .head{font-weight: bolder;margin-bottom: 15px;}
.add-carmichael .layui-textarea {height: 190px;}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,152 @@
<?php
/**
*/
namespace addon\virtualcard\shopapi\controller;
use addon\virtualcard\model\VirtualGoods as VirtualGoodsModel;
use app\shopapi\controller\BaseApi;
/**
* 卡密商品
* Class Virtualgoods
* @package app\shop\controller
*/
class Virtualgoods extends BaseApi
{
public function __construct()
{
//执行父类构造函数
parent::__construct();
$token = $this->checkToken();
if ($token[ 'code' ] < 0) {
echo $this->response($token);
exit;
}
}
/**
* 添加商品
* @return mixed
*/
public function addGoods()
{
$data = [
'goods_name' => $this->params['goods_name'] ?? '',// 商品名称,
'goods_attr_class' => $this->params['goods_attr_class'] ?? '',// 商品类型id,
'goods_attr_name' => $this->params['goods_attr_name'] ?? '',// 商品类型名称,
'site_id' => $this->site_id,
'category_id' => $this->params[ 'category_id' ] ?? '',
'category_json' => $this->params[ 'category_json' ] ?? '',
'goods_image' => $this->params['goods_image'] ?? '',// 商品主图路径
'goods_content' => $this->params['goods_content'] ?? '',// 商品详情
'goods_state' => $this->params['goods_state'] ?? '',// 商品状态1.正常0下架
'price' => $this->params['price'] ?? 0,// 商品价格取第一个sku
'market_price' => $this->params['market_price'] ?? '',// 市场价格取第一个sku
'cost_price' => $this->params['cost_price'] ?? 0,// 成本价取第一个sku
'sku_no' => $this->params['sku_no'] ?? '',// 商品sku编码
'weight' => $this->params['weight'] ?? '',// 重量
'volume' => $this->params['volume'] ?? '',// 体积
'goods_stock' => $this->params['goods_stock'] ?? 0,// 商品库存(总和)
'goods_stock_alarm' => $this->params['goods_stock_alarm'] ?? 0,// 库存预警
'is_free_shipping' => $this->params['is_free_shipping'] ?? 1,// 是否免邮
'shipping_template' => $this->params['shipping_template'] ?? 0,// 指定运费模板
'goods_spec_format' => $this->params['goods_spec_format'] ?? '',// 商品规格格式
'goods_attr_format' => $this->params['goods_attr_format'] ?? '',// 商品参数格式
'introduction' => $this->params['introduction'] ?? '',// 促销语
'keywords' => $this->params['keywords'] ?? '',// 关键词
'unit' => $this->params['unit'] ?? '',// 单位
'sort' => $this->params['sort'] ?? 0,// 排序,
'video_url' => $this->params['video_url'] ?? '',// 视频
'goods_sku_data' => $this->params['goods_sku_data'] ?? '',// SKU商品数据
'label_id' => $this->params['label_id'] ?? '',// 商品分组id
'max_buy' => $this->params['max_buy'] ?? '',// 限购
'min_buy' => $this->params['min_buy'] ?? '',// 起售
'timer_on' => isset($this->params[ 'timer_on' ]) ? strtotime($this->params[ 'timer_on' ]) : 0,//定时上架
'timer_off' => isset($this->params[ 'timer_off' ]) ? strtotime($this->params[ 'timer_off' ]) : 0,//定时下架
'site_name' => $this->shop_info[ 'site_name' ],//店铺名
'virtual_sale' => $this->params[ 'virtual_sale' ] ?? 0,// 虚拟销量
'is_consume_discount' => $this->params[ 'is_consume_discount' ] ?? 0, //是否参与会员折扣
'goods_service_ids' => $this->params[ 'goods_service_ids' ] ?? '',// 商品服务id集合
'recommend_way' => $this->params[ 'recommend_way' ] ?? 0, // 推荐方式1新品2精品3推荐
'is_limit' => $this->params[ 'is_limit' ] ?? 0,// 商品是否限购,
'limit_type' => $this->params[ 'limit_type' ] ?? 1 // 商品限购类型,
];
$virtual_goods_model = new VirtualGoodsModel();
$res = $virtual_goods_model->addGoods($data);
return $this->response($res);
}
/**
* 编辑商品
* @return mixed
*/
public function editGoods()
{
$virtual_goods_model = new VirtualGoodsModel();
$data = [
'goods_id' => $this->params['goods_id'] ?? 0,// 商品id
'goods_name' => $this->params['goods_name'] ?? '',// 商品名称,
'goods_attr_class' => $this->params['goods_attr_class'] ?? '',// 商品类型id,
'goods_attr_name' => $this->params['goods_attr_name'] ?? '',// 商品类型名称,
'site_id' => $this->site_id,
'category_id' => $this->params[ 'category_id' ] ?? '',
'category_json' => $this->params[ 'category_json' ] ?? '',
'goods_image' => $this->params['goods_image'] ?? '',// 商品主图路径
'goods_content' => $this->params['goods_content'] ?? '',// 商品详情
'goods_state' => $this->params['goods_state'] ?? '',// 商品状态1.正常0下架
'price' => $this->params['price'] ?? 0,// 商品价格取第一个sku
'market_price' => $this->params['market_price'] ?? '',// 市场价格取第一个sku
'cost_price' => $this->params['cost_price'] ?? 0,// 成本价取第一个sku
'sku_no' => $this->params['sku_no'] ?? '',// 商品sku编码
'weight' => $this->params['weight'] ?? '',// 重量
'volume' => $this->params['volume'] ?? '',// 体积
'goods_stock' => $this->params['goods_stock'] ?? 0,// 商品库存(总和)
'goods_stock_alarm' => $this->params['goods_stock_alarm'] ?? 0,// 库存预警
'is_free_shipping' => $this->params['is_free_shipping'] ?? 1,// 是否免邮
'shipping_template' => $this->params['shipping_template'] ?? 0,// 指定运费模板
'goods_spec_format' => $this->params['goods_spec_format'] ?? '',// 商品规格格式
'goods_attr_format' => $this->params['goods_attr_format'] ?? '',// 商品参数格式
'introduction' => $this->params['introduction'] ?? '',// 促销语
'keywords' => $this->params['keywords'] ?? '',// 关键词
'unit' => $this->params['unit'] ?? '',// 单位
'sort' => $this->params['sort'] ?? 0,// 排序,
'video_url' => $this->params['video_url'] ?? '',// 视频
'goods_sku_data' => $this->params['goods_sku_data'] ?? '',// SKU商品数据
'label_id' => $this->params['label_id'] ?? '',// 商品分组id
'max_buy' => $this->params['max_buy'] ?? '',// 限购
'min_buy' => $this->params['min_buy'] ?? '',// 起售
'timer_on' => isset($this->params[ 'timer_on' ]) ? strtotime($this->params[ 'timer_on' ]) : 0,//定时上架
'timer_off' => isset($this->params[ 'timer_off' ]) ? strtotime($this->params[ 'timer_off' ]) : 0,//定时下架
'spec_type_status' => isset($this->params[ 'spec_type_status' ]) ? strtotime($this->params[ 'spec_type_status' ]) : 0,
'site_name' => $this->shop_info[ 'site_name' ] ?? '',//店铺名
'virtual_sale' => $this->params[ 'virtual_sale' ] ?? 0,// 虚拟销量
'is_consume_discount' => $this->params[ 'is_consume_discount' ] ?? 0, //是否参与会员折扣
'goods_service_ids' => $this->params[ 'goods_service_ids' ] ?? '',// 商品服务id集合
'recommend_way' => $this->params[ 'recommend_way' ] ?? 0, // 推荐方式1新品2精品3推荐
'is_limit' => $this->params[ 'is_limit' ] ?? 0,// 商品是否限购,
'limit_type' => $this->params[ 'limit_type' ] ?? 1 // 商品限购类型,
];
$res = $virtual_goods_model->editGoods($data);
return $this->response($res);
}
}

View File

@@ -0,0 +1,5 @@
<?php
return [
];

View File

@@ -0,0 +1,5 @@
<?php
return [
];

View File

@@ -0,0 +1,5 @@
<?php
return [
];