初始上传

This commit is contained in:
2026-04-04 17:27:12 +08:00
parent 4d80d28eb4
commit b7e11774ee
11191 changed files with 1588469 additions and 0 deletions

View File

@@ -0,0 +1,146 @@
<?php
/**
* Index.php
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2015-2025 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
* @author : niuteam
* @date : 2022.8.8
* @version : v5.0.0.1
*/
namespace addon\notes\api\controller;
use addon\notes\model\Group;
use app\api\controller\BaseApi;
use addon\notes\model\Notes as NotesModel;
use addon\notes\model\Record as RecordModel;
class Notes extends BaseApi
{
/**
* 获取笔记分组
*/
public function group()
{
$model = new Group();
$list = $model->getNotesGroupList([['site_id', '=', $this->site_id]], 'group_id,group_name,notes_num,release_num', 'sort asc');
return $this->response($list);
}
/**
* 获取文章分页列表
*/
public function page()
{
$token = $this->checkToken();
$page = $this->params['page'] ?? 1;
$page_size = $this->params['page_size'] ?? PAGE_LIST_ROWS;
$group_id = $this->params['group_id'] ?? '';
$note_id_arr = $this->params['note_id_arr'] ?? '';
$condition[] = ['pn.site_id', '=', $this->site_id];
if ($group_id) {
$condition[] = ['pn.group_id', '=', $group_id];
}
if(!empty($note_id_arr)){
$condition[] = ['pn.note_id', 'in', $note_id_arr];
}
$note_model = new NotesModel();
$list_result = $note_model->getNotesPageList($condition, $page, $page_size);
if($token['code'] >= 0){
$list = $list_result['data']['list'];
$record_model = new RecordModel();
foreach($list as $k=>$v){
//获取用户是否点赞
$is_dianzan = $record_model->getIsDianzan($v['note_id'],$this->member_id);
$list[$k]['is_dianzan'] = $is_dianzan['data'];
}
$list_result['data']['list'] = $list;
}
return $this->response($list_result);
}
/**
* 获取文章列表
*/
public function lists()
{
$token = $this->checkToken();
$num = $this->params['num'] ?? 0;
$group_id = $this->params['group_id'] ?? '';
$note_id_arr = $this->params['note_id_arr'] ?? '';
$condition[] = ['pn.site_id', '=', $this->site_id];
if ($group_id) {
$condition[] = ['pn.group_id', '=', $group_id];
}
if(!empty($note_id_arr)){
$condition[] = ['pn.note_id', 'in', $note_id_arr];
}
$field = 'pn.*,png.group_name';
$alias = 'pn';
$join = [
[
'notes_group png',
'png.group_id = pn.group_id',
'left'
]
];
$note_model = new NotesModel();
$list_result = $note_model->getNotesList($condition,$field,'pn.sort asc', $num, $alias, $join);
if($token['code'] >= 0){
$list = $list_result['data'];
$record_model = new RecordModel();
$note_type = $note_model->getNoteType();
$note_type = array_column($note_type, 'name', 'type');
foreach($list as $k=>$v){
//获取用户是否点赞
$is_dianzan = $record_model->getIsDianzan($v['note_id'],$this->member_id);
$list[$k]['is_dianzan'] = $is_dianzan['data'];
$list[$k]['note_type_name'] = $note_type[$v['note_type']];
}
$list_result['data'] = $list;
}
return $this->response($list_result);
}
/**
* 文章详情
*/
public function detail()
{
$token = $this->checkToken();
$note_id = $this->params['note_id'] ?? '';
if (empty($note_id)) {
return $this->response($this->error('', 'REQUEST_NOTE_ID'));
}
$condition = [
['site_id', '=', $this->site_id],
['note_id', '=', $note_id]
];
$note_model = new NotesModel();
$info_result = $note_model->getNotesDetailInfo($condition, '*', 2);
if($token['code'] >= 0){
$info = $info_result['data'];
$record_model = new RecordModel();
$is_dianzan = $record_model->getIsDianzan($info['note_id'],$this->member_id);
$info['is_dianzan'] = $is_dianzan['data'];
$info_result['data'] = $info;
}
return $this->response($info_result);
}
}

View File

@@ -0,0 +1,75 @@
<?php
namespace addon\notes\api\controller;
use app\api\controller\BaseApi;
use addon\notes\model\Record as RecordModel;
/**
* 文章点赞
* @author Administrator
*
*/
class Record extends BaseApi
{
/**
* 添加点赞
*/
public function add()
{
$token = $this->checkToken();
if ($token['code'] < 0) return $this->response($token);
$note_id = $this->params['note_id'] ?? 0;
if (empty($note_id)) {
return $this->response($this->error('', 'REQUEST_NOTE_ID'));
}
$record_model = new RecordModel();
$data = [
'member_id' => $token['data']['member_id'],
'note_id' => $note_id
];
$res = $record_model->addRecord($data);
return $this->response($res);
}
/**
* 删除点赞
*/
public function delete()
{
$token = $this->checkToken();
if ($token['code'] < 0) return $this->response($token);
$note_id = $this->params['note_id'] ?? 0;
if (empty($note_id)) {
return $this->response($this->error('', 'REQUEST_NOTE_ID'));
}
$record_model = new RecordModel();
$res = $record_model->deleteRecord($token['data']['member_id'], $note_id);
return $this->response($res);
}
/**
* 是否点赞
* @return string
*/
public function isDianzan()
{
$token = $this->checkToken();
if ($token['code'] < 0) return $this->response($token);
$note_id = $this->params['note_id'] ?? 0;
if (empty($note_id)) {
return $this->response($this->error('', 'REQUEST_NOTE_ID'));
}
$record_model = new RecordModel();
$res = $record_model->getIsDianzan($note_id, $token['data']['member_id']);
return $this->response($res);
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace addon\notes\component\controller;
use app\component\controller\BaseDiyView;
/**
* 店铺笔记·组件
*
*/
class Notes extends BaseDiyView
{
/**
* 设计界面
*/
public function design()
{
return $this->fetch("notes/design.html");
}
}

View File

@@ -0,0 +1,51 @@
@CHARSET "UTF-8";
.component-notes .goods-head {display: -webkit-box;display: -webkit-flex;display: flex;-webkit-box-pack: justify;-webkit-justify-content: space-between;justify-content: space-between;-webkit-box-align: center;-webkit-align-items: center;align-items: center;margin-bottom: 10px;padding: 10px;}
.component-notes .goods-head .title-wrap {display: -webkit-box;display: -webkit-flex;display: flex;-webkit-box-align: center;-webkit-align-items: center;align-items: center;width: calc(100% - 75px);}
.component-notes .goods-head .title-wrap .name {font-size: 14px;margin-right: 8px; font-weight: 600;}
.component-notes .goods-head .more {display: -webkit-box;display: -webkit-flex;display: flex;-webkit-box-align: center;-webkit-align-items: center;align-items: center;justify-content: flex-end;}
.component-notes .goods-head .more {font-size: 12px;width: 75px;}
.component-notes .goods-head .left-icon, .component-notes .goods-head .right-icon {display: inline-block; height: 20px; line-height: 20px; flex-shrink: 0;}
.component-notes .goods-head .iconfont {flex-shrink: 0;}
.component-notes .goods-head .more span, .component-notes .goods-head .title-wrap .name {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.component-notes .goods-head .more span {text-align: right;}
.component-notes .goods-head .more i {font-size: 12px; margin-left: 2px;}
.component-notes .goods-head .title-wrap .name {max-width: 180px;}
.component-notes .goods-head .left-icon img, .component-notes .goods-head .right-icon img {max-height: 20px;vertical-align: top;}
.component-notes .goods-head .left-icon img {margin-right: 5px;}
.component-notes .goods-head .right-icon img {margin-left: 5px;}
.component-notes .goods-head .time {font-size: 12px; color: #777777;}
.component-notes .goods-head .time span {display: inline-block; width: 18px; height: 18px; line-height: 18px; text-align: center; background-color: #383838; color: #FFFFFF; border-radius: 3px; margin: 0 3px;}
.component-notes .goods-head .time .second {background-color: #FF4544;}
/* 风格一 */
.component-notes .list-wrap {width: 100%;}
.component-notes .list-wrap .item {width: 100%; height: 100%; border-radius: 5px; overflow: hidden; margin-top: 15px; box-sizing: border-box; -moz-box-shadow: 1px 2px 4px rgba(0, 0, 0, .1); -webkit-box-shadow: 1px 2px 4px rgba(0, 0, 0, .1); box-shadow: 1px 2px 4px rgba(0, 0, 0, .1);}
.component-notes .list-wrap .item:first-child{margin-top: 0;}
.component-notes .list-wrap .item .img-wrap {width: 100%; height: 130px; padding: 0 10px; box-sizing: border-box;}
.component-notes .list-wrap .item .img-wrap img {width: 100%; height: 100%; object-fit: cover; padding: 0; margin: 0;}
.component-notes .list-wrap .item .img-wrap-boxs {display: flex; justify-content: space-between; flex-wrap: wrap; height: auto;}
.component-notes .list-wrap .item .img-wrap-boxs img {display: inline-block; width: 31%; height: 100px; margin-top: 10px;}
.component-notes .list-wrap .item .img-wrap-boxs img:nth-child(-n+3) {margin-top: 0;}
.component-notes .list-wrap .item .item-con {padding: 10px;}
.component-notes .list-wrap .item .item-con .notes-title {font-size: 16px; font-weight: 600; line-height: 22px;}
.component-notes .list-wrap .item .item-con .notes-highlights-list {margin-top: 5px;}
.component-notes .list-wrap .item .item-con .notes-highlights-list span {display: inline-block; color: #FFFFFF; font-size: 12px; line-height: 18px; padding: 0 5px; border-radius: 2px;}
.component-notes .list-wrap .item .item-con .notes-intro {margin-top: 5px; font-size: 14px;}
.component-notes .list-wrap .item .item-con .notes-intro span {float: left; margin-right: 7px;}
.component-notes .list-wrap .item .item-con .notes-info {display: flex; justify-content: space-between; align-items: center; margin-top: 3px;}
.component-notes .list-wrap .item .item-con .notes-info span {color: #969799; font-size: 12px; display: flex; align-items: center;}
.component-notes .list-wrap .item .item-con .notes-info span img {width: 11px; margin-right: 3px;}
.component-notes .list-wrap .item .new-price {font-size: 14px;display: block;}
.component-notes .list-wrap .item .old-price {font-size: 12px;color: #898989;text-decoration: line-through;}
.component-notes .list-wrap .item .good-name {margin-top: 5px;}
.component-notes .list-wrap .item .good-desc {color: #898989; font-size: 12px;}
.component-notes .list-wrap .item .good-stock {color: #898989; font-size: 12px;}
.component-notes .goods-show-box .layui-input-inline {padding-left: 20px;}
/* 风格 */
.component-notes .notes-list-style{display: none;}
.style-list-con-notes{display: flex;flex-wrap: wrap;}
.style-list-con-notes .style-li-notes{width: 32%;height: 300px;line-height: 300px;margin-right: 2%;margin-bottom: 15px;cursor: pointer;border: 1px solid #ededed;background: #f7f8fa;box-sizing: border-box;}
.style-list-con-notes .style-li-notes:nth-child(3n){margin-right: 0;}
.style-list-con-notes .style-li-notes img{width: 100%;}
.layui-layer-page .layui-layer-content{overflow: auto !important;}

View File

@@ -0,0 +1,196 @@
<nc-component :data="data[index]" class="component-notes">
<!-- 预览 -->
<template slot="preview">
<div class="preview-box">
<div class="notes-list-preview" :class="'text-title-'+ nc.style" :style="{ backgroundColor : nc.componentBgColor }">
<div class="goods-head">
<div class="title-wrap">
<span class="name" :style="{color: nc.titleTextColor || 'rgba(0,0,0,0)'}">{{nc.title}}</span>
</div>
<div class="more red-color" v-if="nc.more">
<span :style="{color: nc.moreTextColor || 'rgba(0,0,0,0)'}">{{nc.more}}</span>
<i class="iconfont iconyoujiantou" :style="{color: nc.moreTextColor || 'rgba(0,0,0,0)'}"></i>
</div>
</div>
<div class="list-wrap" v-if="nc.style==1">
<div class="item" :style="{
backgroundColor : nc.contentBgColor,
borderTopLeftRadius: (nc.elementAngle == 'round' ? nc.topElementAroundRadius + 'px' : 0),
borderTopRightRadius: (nc.elementAngle == 'round' ? nc.topElementAroundRadius + 'px' : 0),
borderBottomLeftRadius: (nc.elementAngle == 'round' ? nc.bottomElementAroundRadius + 'px' : 0),
borderBottomRightRadius: (nc.elementAngle == 'round' ? nc.bottomElementAroundRadius + 'px' : 0)
}">
<div class="item-con">
<p class="notes-title multi-line-hiding">这里显示笔记标题最多显示2行</p>
<div class="notes-highlights-list" v-show="nc.notesLabel == 1">
<span class="bg-color">亮点</span>
</div>
<div class="notes-intro">
<span class="notes-label text-color">#掌柜说#</span>
<p>笔记内容介绍</p>
</div>
</div>
<div class="img-wrap">
<img :src="changeImgUrl('public/static/img/default_img/figure.png')" />
</div>
<div class="item-con">
<div class="notes-info">
<div class="notes-num"><span v-show="nc.uploadTime == 1">2020-01-01</span></div>
<div class="notes-num"><span v-show="nc.readNum == 1">阅读 1000</span></div>
<!-- <div class="notes-num"><span v-show="nc.thumbsUpNum == 1"><img src="{$resource_path}/img/thumbs_up.png" /><span>1000</span></span></div> -->
</div>
</div>
</div>
<div class="item" :style="{
backgroundColor : nc.contentBgColor,
borderTopLeftRadius: (nc.elementAngle == 'round' ? nc.topElementAroundRadius + 'px' : 0),
borderTopRightRadius: (nc.elementAngle == 'round' ? nc.topElementAroundRadius + 'px' : 0),
borderBottomLeftRadius: (nc.elementAngle == 'round' ? nc.bottomElementAroundRadius + 'px' : 0),
borderBottomRightRadius: (nc.elementAngle == 'round' ? nc.bottomElementAroundRadius + 'px' : 0)
}">
<div class="item-con">
<p class="notes-title multi-line-hiding">这里显示笔记标题最多显示2行</p>
<div class="notes-highlights-list" v-show="nc.notesLabel == 1">
<span class="bg-color">亮点</span>
</div>
<div class="notes-intro">
<span class="notes-label text-color">#掌柜说#</span>
<p>笔记内容介绍</p>
</div>
</div>
<div class="img-wrap img-wrap-boxs">
<img :src="changeImgUrl('public/static/img/default_img/square.png')" />
<img :src="changeImgUrl('public/static/img/default_img/square.png')" />
<img :src="changeImgUrl('public/static/img/default_img/square.png')" />
</div>
<div class="item-con">
<div class="notes-info">
<div class="notes-num"><span v-show="nc.uploadTime == 1">2020-01-01</span></div>
<div class="notes-num"><span v-show="nc.readNum == 1">阅读 1000</span></div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<!-- 内容编辑 -->
<template slot="edit-content">
<template v-if="nc.lazyLoad">
<notes-set></notes-set>
<div class="template-edit-title">
<h3>风格选择</h3>
<div class="layui-form-item">
<label class="layui-form-label sm">风格</label>
<div class="layui-input-block" v-if="nc.tempData.methods">
<div class="text-color selected-style" @click="nc.tempData.methods.selectStyle()">
<span>{{nc.styleName}}</span>
<i class="layui-icon layui-icon-right"></i>
</div>
</div>
</div>
</div>
<div class="template-edit-title">
<h3>笔记数据</h3>
<div class="layui-form-item" v-if="nc.tempData.goodsSources">
<label class="layui-form-label sm">数据来源</label>
<div class="layui-input-block">
<div class="source-selected">
<div class="source">{{ nc.tempData.goodsSources[nc.sources].text }}</div>
<div v-for="(item,sourcesKey) in nc.tempData.goodsSources" :key="sourcesKey" class="source-item" :title="item.text" @click="nc.sources=sourcesKey" :class="{ 'text-color border-color' : (nc.sources == sourcesKey) }">
<i class='iconfont' :class='item.icon'></i>
</div>
</div>
</div>
</div>
<slide v-if="nc.sources != 'diy'" :data="{ field : 'count', label : '显示数量', max: 9, min: 1 }"></slide>
<div class="layui-form-item" v-if="nc.sources == 'diy'">
<label class="layui-form-label sm">手动选择</label>
<div class="layui-input-block">
<div class="selected-style" @click="nc.tempData.methods.addNotes()">
<span v-if="nc.noteId.length == 0">请选择</span>
<span v-if="nc.noteId.length > 0" class="text-color">已选{{ nc.noteId.length }}个</span>
<i class="iconfont iconyoujiantou"></i>
</div>
</div>
</div>
</div>
<div class="template-edit-title">
<h3>顶部标题</h3>
<div class="layui-form-item">
<label class="layui-form-label sm">标题</label>
<div class="layui-input-block">
<input type="text" name='title' v-model="nc.title" class="layui-input" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label sm">文本内容</label>
<div class="layui-input-block">
<input type="text" name='title' v-model="nc.more" class="layui-input" />
</div>
</div>
</div>
<div class="template-edit-title">
<h3>显示内容</h3>
<div class="layui-form-item" v-for="item in nc.tempData.showContentList">
<label class="layui-form-label sm">{{item.title}}</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="nc.tempData.methods.changeStatus(item.name)" :class="{ 'layui-form-checked' : nc[item.name] }">
<span>{{ nc[item.name] ? '显示' : '隐藏' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
</div>
</template>
<!-- 弹框 -->
<article class="notes-list-style">
<div class="style-list-notes layui-form">
<div class="style-list-con-notes">
<div class="style-li-notes" :class="{'selected border-color': nc.style == 1}">
<img src="{$resource_path}/img/notes_style_1.png" />
<span class="layui-hide">风格一</span>
</div>
</div>
<input type="hidden" name="style">
<input type="hidden" name="style_name">
</div>
</article>
</template>
<!-- 样式编辑 -->
<template slot="edit-style">
<div class="template-edit-title">
<h3>顶部标题</h3>
<color :data="{ field : 'titleTextColor', label : '标题颜色', defaultColor : '#333333' }"></color>
<color :data="{ field : 'moreTextColor', defaultColor: '#858585' }"></color>
</div>
<div class="template-edit-title">
<h3>笔记内容</h3>
<color :data="{ field : 'contentBgColor', 'label' : '背景颜色' , defaultColor : '#FFFFFF'}"></color>
<slide v-show="nc.elementAngle == 'round'" :data="{ field : 'topElementAroundRadius', label : '上圆角', max : 50 }"></slide>
<slide v-show="nc.elementAngle == 'round'" :data="{ field : 'bottomElementAroundRadius', label : '下圆角', max : 50 }"></slide>
</div>
</template>
<!-- 资源 -->
<template slot="resource">
<js>
var notesResourcePath = "{$resource_path}"; // http路径
var notesRelativePath = "{$relative_path}"; // 相对路径
</js>
<js src="{$resource_path}/js/design.js"></js>
<css src="{$resource_path}/css/design.css"></css>
</template>
</nc-component>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -0,0 +1,90 @@
var notesSetHtml = '<div style="display:none;"></div>';
Vue.component("notes-set", {
template: notesSetHtml,
data: function () {
return {
data: this.$parent.data,
goodsSources: {
initial: {
text: "默认",
icon: "iconmofang"
},
diy: {
text: "手动选择",
icon: "iconshoudongxuanze"
},
},
showContentList: [
{
title: "亮点",
name: "notesLabel"
},
{
title: "阅读数",
name: "readNum"
},
{
title: "更新时间",
name: "uploadTime"
}
]
}
},
created: function () {
if (!this.$parent.data.verify) this.$parent.data.verify = [];
this.$parent.data.verify.push(this.verify);//加载验证方法
this.$parent.data.ignore = ['textColor', 'componentAngle', 'elementBgColor']; //加载忽略内容 -- 其他设置中的属性设置
this.$parent.data.ignoreLoad = true; // 等待忽略数组赋值后加载
// 组件所需的临时数据
this.$parent.data.tempData = {
goodsSources: this.goodsSources,
showContentList: this.showContentList,
methods: {
selectStyle: this.selectStyle,
addNotes: this.addNotes,
changeStatus: this.changeStatus
}
};
},
methods: {
changeStatus: function (field) {
this.$parent.data[field] = this.$parent.data[field] ? 0 : 1;
},
addNotes: function () {
var self = this;
notesSelect(function (res) {
self.$parent.data.noteId = [];
for (var i = 0; i < res.length; i++) {
self.$parent.data.noteId.push(res[i]);
}
}, self.$parent.data.noteId, {});
},
selectStyle: function () {
var self = this;
layer.open({
type: 1,
title: '风格选择',
area: ['930px', '630px'],
btn: ['确定', '返回'],
content: $(".draggable-element[data-index='" + self.data.index + "'] .edit-attribute .notes-list-style").html(),
success: function (layero, index) {
$(".layui-layer-content input[name='style']").val(self.data.style);
$(".layui-layer-content input[name='style_name']").val(self.data.styleName);
$("body").off("click", ".layui-layer-content .style-list-con-notes .style-li-notes").on("click", ".layui-layer-content .style-list-con-notes .style-li-notes", function () {
$(this).addClass("selected border-color").siblings().removeClass("selected border-color");
$(".layui-layer-content input[name='style']").val($(this).index() + 1);
$(".layui-layer-content input[name='style_name']").val($(this).find("span").text());
});
},
yes: function (index, layero) {
self.data.style = $(".layui-layer-content input[name='style']").val();
self.data.styleName = $(".layui-layer-content input[name='style_name']").val();
layer.closeAll()
}
});
}
}
});

68
addon/notes/config/diy_view.php Executable file
View File

@@ -0,0 +1,68 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
return [
// 自定义模板页面类型,格式:[ 'title' => '页面类型名称', 'name' => '页面标识', 'path' => '页面路径', 'value' => '页面数据json格式' ]
'template' => [],
// 后台自定义组件——装修
'util' => [
[
'name' => 'Notes',
'title' => '店铺笔记',
'type' => 'SYSTEM',
'value' => '{"style":1,"styleName": "风格一","sources":"initial","noteId":[],"count":"3","notesLabel":1,"readNum":1,"uploadTime":1,"titleTextColor":"#333333","moreTextColor":"#858585","title":"店铺笔记","more":"查看更多","contentBgColor":"#FFFFFF"}',
'sort' => '10050',
'support_diy_view' => '',
'max_count' => 1,
'icon' => 'iconfont iconbiji',
]
],
// 自定义页面路径
'link' => [
[
'name' => 'NOTES',
'title' => '店铺笔记',
'parent' => 'MARKETING_LINK',
'wap_url' => '',
'web_url' => '',
'sort' => 0,
'child_list' => [
[
'name' => 'NOTES_PREFECTURE',
'title' => '店铺笔记',
'wap_url' => '/pages_tool/store_notes/note_list',
'web_url' => '',
'sort' => 0
]
]
]
],
// 自定义图标库
'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' => []
];

21
addon/notes/config/event.php Executable file
View File

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

20
addon/notes/config/info.php Executable file
View File

@@ -0,0 +1,20 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
return [
'name' => 'notes',
'title' => '店铺笔记',
'description' => '店铺笔记管理活动',
'type' => 'promotion', //插件类型 system :系统插件(自动安装), promotion:扩展营销插件 tool:工具插件
'status' => 1,
'author' => '',
'version' => '5.5.3',
'version_no' => '553250709001',
'content' => '',
];

110
addon/notes/config/menu_shop.php Executable file
View File

@@ -0,0 +1,110 @@
<?php
// +----------------------------------------------------------------------
// | 店铺端菜单设置
// +----------------------------------------------------------------------
return [
[
'name' => 'PROMOTION_NOTES',
'title' => '店铺笔记',
'url' => 'notes://shop/notes/lists',
'parent' => 'PROMOTION_TOOL',
'picture' => 'addon/notes/shop/view/public/img/distribution_new.png',
'picture_selected' => 'addon/notes/shop/view/public/img/distribution_select.png',
'is_show' => 1,
'sort' => 1,
'child_list' => [
[
'name' => 'PROMOTION_NOTES_LISTS',
'title' => '笔记列表',
'url' => 'notes://shop/notes/lists',
'is_show' => 1,
'sort' => 1,
'child_list' => [
[
'name' => 'PROMOTION_NOTES_ADD',
'title' => '添加笔记',
'url' => 'notes://shop/notes/add',
'sort' => 1,
'is_show' => 0,
'type' => 'button',
],
[
'name' => 'PROMOTION_NOTES_EDIT',
'title' => '编辑笔记',
'url' => 'notes://shop/notes/edit',
'sort' => 2,
'is_show' => 0,
'type' => 'button',
],
[
'name' => 'PROMOTION_NOTES_DELETE',
'title' => '删除笔记',
'url' => 'notes://shop/notes/delete',
'sort' => 3,
'is_show' => 0,
'type' => 'button',
],
[
'name' => 'PROMOTION_NOTES_MODIFYSORT',
'title' => '修改排序',
'url' => 'notes://shop/notes/modifySort',
'sort' => 4,
'is_show' => 0,
'type' => 'button',
],
]
],
[
'name' => 'PROMOTION_NOTES_DRAFTS',
'title' => '草稿箱',
'url' => 'notes://shop/notes/drafts',
'is_show' => 1,
'is_control' => 1,
'sort' => 2,
'child_list' => []
],
[
'name' => 'PROMOTION_NOTES_GROUP',
'title' => '笔记分组',
'url' => 'notes://shop/group/lists',
'is_show' => 1,
'sort' => 3,
'child_list' => [
[
'name' => 'PROMOTION_NOTES_GROUP_ADD',
'title' => '添加分组',
'url' => 'notes://shop/group/add',
'sort' => 1,
'is_show' => 0,
'type' => 'button',
],
[
'name' => 'PROMOTION_NOTES_GROUP_EDIT',
'title' => '编辑分组',
'url' => 'notes://shop/group/edit',
'sort' => 2,
'is_show' => 0,
'type' => 'button',
],
[
'name' => 'PROMOTION_NOTES_GROUP_DELETE',
'title' => '删除分组',
'url' => 'notes://shop/group/delete',
'sort' => 3,
'is_show' => 0,
'type' => 'button',
],
[
'name' => 'PROMOTION_NOTES_GROUP_MODIFYSORT',
'title' => '修改排序',
'url' => 'notes://shop/group/modifySort',
'sort' => 4,
'is_show' => 0,
'type' => 'button',
],
]
]
]
],
];

1
addon/notes/data/install.sql Executable file
View File

@@ -0,0 +1 @@
SET NAMES 'utf8';

1
addon/notes/data/uninstall.sql Executable file
View File

@@ -0,0 +1 @@
SET NAMES 'utf8';

25
addon/notes/event/Install.php Executable file
View File

@@ -0,0 +1,25 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\event;
/**
* 应用安装
*/
class Install
{
/**
* 执行安装
*/
public function handle()
{
return success();
}
}

View File

@@ -0,0 +1,28 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\event;
/**
* 活动类型
*/
class PromotionType
{
/**
* 活动类型
* @return array
*/
public function handle()
{
return ["name" => "店铺笔记", "type" => "notes"];
}
}

View File

@@ -0,0 +1,46 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\event;
/**
* 活动展示
*/
class ShowPromotion
{
/**
* 活动展示
* @return array
*/
public function handle()
{
$data = [
'shop' => [
[
//插件名称
'name' => 'notes',
//店铺端展示分类 shop:营销活动 member:互动营销
'show_type' => 'tool',
//展示主题
'title' => '店铺笔记',
//展示介绍
'description' => '好物分享引流促成交易',
//展示图标
'icon' => 'addon/notes/icon.png',
//跳转链接
'url' => 'notes://shop/notes/lists',
]
]
];
return $data;
}
}

25
addon/notes/event/UnInstall.php Executable file
View File

@@ -0,0 +1,25 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\event;
/**
* 应用卸载
*/
class UnInstall
{
/**
* 执行卸载
*/
public function handle()
{
return success();
}
}

BIN
addon/notes/icon.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

104
addon/notes/model/Group.php Executable file
View File

@@ -0,0 +1,104 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\model;
use app\model\BaseModel;
/**
* 笔记分组
*/
class Group extends BaseModel
{
/**
* 添加笔记分组
* @param $data
* @return array
*/
public function addNotesGroup($data)
{
$data['create_time'] = time();
$res = model('notes_group')->add($data);
return $this->success($res);
}
/**
* 编辑笔记分组
* @param $condition
* @param $data
* @return array
*/
public function editNotesGroup($condition, $data)
{
$data['update_time'] = time();
$res = model('notes_group')->update($data, $condition);
return $this->success($res);
}
/**
* 删除笔记分组
* @param $group_id
* @param $site_id
* @return array|\multitype
*/
public function deleteNotesGroup($group_id, $site_id)
{
//笔记数
$notes_count = model('notes')->getCount([['group_id', '=', $group_id], ['site_id', '=', $site_id]]);
if ($notes_count > 0) {
return $this->error('', '该分组下存在店铺笔记,暂不能删除');
} else {
$res = model('notes_group')->delete([['group_id', '=', $group_id], ['site_id', '=', $site_id]]);
return $this->success($res);
}
}
/**
* 获取笔记分组信息
* @param array $condition
* @param string $field
* @return array
*/
public function getNotesGroupInfo($condition = [], $field = '*')
{
$info = model('notes_group')->getInfo($condition, $field);
return $this->success($info);
}
/**
* 获取笔记分组列表
* @param array $condition
* @param string $field
* @param string $order
* @param string $limit
*/
public function getNotesGroupList($condition = [], $field = '*', $order = '', $limit = null)
{
$list = model('notes_group')->getList($condition, $field, $order, '', '', '', $limit);
return $this->success($list);
}
/**
* 获取笔记分页列表
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function getNotesGroupPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
{
$list = model('notes_group')->pageList($condition, $field, $order, $page, $page_size);
return $this->success($list);
}
}

299
addon/notes/model/Notes.php Executable file
View File

@@ -0,0 +1,299 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\model;
use app\model\BaseModel;
use extend\WxCrawler;
/**
* 笔记
*/
class Notes extends BaseModel
{
//笔记类型
private $note_type = [
[ 'type' => 'shop_said', 'name' => '掌柜说' ],
[ 'type' => 'goods_item', 'name' => '单品介绍' ],
//['type' => 'article', 'name' => '种草文章'],
//['type' => 'wechat_article', 'name' => '公众号文章'],
//['type' => 'goods_video', 'name' => '短视频']
];
/**
* 获取笔记类型
* @return array
*/
public function getNoteType()
{
return $this->note_type;
}
/**
* 添加笔记
* @param $data
* @return array
*/
public function addNotes($data)
{
$data[ 'create_time' ] = time();
model('notes')->startTrans();
try {
//添加笔记
if ($data[ 'status' ] == 1) {
$data[ 'release_time' ] = time();
}
model('notes')->add($data);
//更新分组笔记数等信息
model('notes_group')->setInc([ [ 'group_id', '=', $data[ 'group_id' ] ] ], 'notes_num');
if ($data[ 'status' ] == 1) {
model('notes_group')->setInc([ [ 'group_id', '=', $data[ 'group_id' ] ] ], 'release_num');
}
model('notes')->commit();
return $this->success();
} catch (\Exception $e) {
model('notes')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 文章发布
* @param $params
*/
public function releaseEvent($params)
{
$site_id = $params[ 'site_id' ] ?? 0;
$note_id = $params[ 'note_id' ];
$status = $params[ 'status' ];
$condition = array (
[ 'note_id', '=', $note_id ],
[ 'site_id', '=', $site_id ]
);
$info = model('notes')->getInfo($condition);
if (!empty($info)) {
if ($info[ 'status' ] != $status) {
if ($status == 1) {
$release_time = time();
model('notes_group')->setInc([ [ 'group_id', '=', $info[ 'group_id' ] ] ], 'release_num');
} else {
$release_time = 0;
model('notes_group')->setDec([ [ 'group_id', '=', $info[ 'group_id' ] ] ], 'release_num');
}
$data = array (
'release_time' => $release_time,
'status' => $status
);
model('notes')->update($data, $condition);
}
return $this->success();
} else {
return $this->error();
}
}
/**
* 编辑笔记
* @param $data
* @return array
*/
public function editNotes($data)
{
$data[ 'update_time' ] = time();
model('notes')->startTrans();
try {
$info = model('notes')->getInfo([ [ 'site_id', '=', $data[ 'site_id' ] ], [ 'note_id', '=', $data[ 'note_id' ] ] ]);
//添加笔记
model('notes')->update($data, [ [ 'site_id', '=', $data[ 'site_id' ] ], [ 'note_id', '=', $data[ 'note_id' ] ] ]);
$release_data = array (
'note_id' => $data[ 'note_id' ],
'site_id' => $data[ 'site_id' ]
);
if ($info[ 'group_id' ] != $data[ 'group_id' ]) {
model('notes_group')->setDec([ [ 'group_id', '=', $info[ 'group_id' ] ] ], 'notes_num');
model('notes_group')->setInc([ [ 'group_id', '=', $data[ 'group_id' ] ] ], 'notes_num');
//减去原分组的发布数
if ($info[ 'status' ] == 1) {
model('notes_group')->setDec([ [ 'group_id', '=', $info[ 'group_id' ] ] ], 'release_num');
}
//增加新分组的发布数
if ($data[ 'status' ] == 1) {
model('notes_group')->setInc([ [ 'group_id', '=', $data[ 'group_id' ] ] ], 'release_num');
}
} else {
$release_data[ 'status' ] = $data[ 'status' ];
$this->releaseEvent($release_data);
}
//更新分组笔记数等信息
if ($data[ 'status' ] == 1) {
model('notes_group')->setInc([ [ 'group_id', '=', $data[ 'group_id' ] ] ], 'release_num');
}
model('notes')->commit();
return $this->success();
} catch (\Exception $e) {
model('notes')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 删除笔记
* @param $condition
* @return array|\multitype
*/
public function deleteNotes($condition)
{
//笔记数
$notes_info = model('notes')->getInfo($condition, 'group_id,status');
if (empty($notes_info)) {
return $this->success('', '数据不合法');
} else {
model('notes')->startTrans();
try {
//删除笔记
model('notes')->delete($condition);
//更新分组笔记数等信息
if ($notes_info[ 'status' ] == 1) {
model('notes_group')->setDec([ [ 'group_id', '=', $notes_info[ 'group_id' ] ] ], 'notes_num');
model('notes_group')->setDec([ [ 'group_id', '=', $notes_info[ 'group_id' ] ] ], 'release_num');
} else {
model('notes_group')->setDec([ [ 'group_id', '=', $notes_info[ 'group_id' ] ] ], 'notes_num');
}
model('notes')->commit();
return $this->success();
} catch (\Exception $e) {
model('notes')->rollback();
return $this->error('', $e->getMessage());
}
}
}
/**
* 修改排序
* @param int $sort
* @param int $class_id
*/
public function modifyNotesSort($sort, $note_id, $site_id)
{
$res = model('notes')->update([ 'sort' => $sort ], [ [ 'note_id', '=', $note_id ], [ 'site_id', '=', $site_id ] ]);
return $this->success($res);
}
/**
* 获取笔记信息
* @param array $condition
* @param string $field
* @return array
*/
public function getNotesInfo($condition = [], $field = '*')
{
$info = model("notes")->getInfo($condition, $field);
return $this->success($info);
}
/**
* 获取笔记信息
* @param array $condition
* @param string $field
* @param int $type
* @return array
*/
public function getNotesDetailInfo($condition = [], $field = '*', $type = 1)
{
$info = model('notes')->getInfo($condition, $field);
if (!empty($info)) {
$goods_field = 'sku_id,goods_name,goods_stock,price,goods_image,goods_id';
$goods_list = model('goods')->getList([ [ 'site_id', '=', $info[ 'site_id' ] ], [ 'goods_id', 'in', $info[ 'goods_ids' ] ], [ 'goods_state', '=', 1 ], [ 'is_delete', '=', 0 ] ], $goods_field);
if (!empty($goods_list)) {
foreach ($goods_list as $k => $v) {
$goods_list[ $k ][ 'goods_stock' ] = numberFormat($goods_list[ $k ][ 'goods_stock' ]);
}
}
$info[ 'goods_list' ] = $goods_list;
}
//添加浏览记录
if ($type == 2) {
model('notes')->setInc($condition, 'read_num', 1);
}
return $this->success($info);
}
/**
* 获取笔记列表
* @param array $condition
* @param string $field
* @param string $order
* @param string $limit
*/
public function getNotesList($condition = [], $field = '*', $order = '', $limit = null, $alias = '', $join = [])
{
$list = model('notes')->getList($condition, $field, $order, $alias, $join, '', $limit);
return $this->success($list);
}
/**
* 获取笔记分页列表
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function getNotesPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'pn.sort asc')
{
$field = 'pn.*,png.group_name';
$alias = 'pn';
$join = [
[
'notes_group png',
'png.group_id = pn.group_id',
'left'
]
];
$note_type = $this->getNoteType();
$note_type = array_column($note_type, 'name', 'type');
$list = model('notes')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
foreach ($list[ 'list' ] as $k => $v) {
$list[ 'list' ][ $k ][ 'note_type_name' ] = $note_type[ $v[ 'note_type' ] ];
}
return $this->success($list);
}
/**
* 采集微信公众号的文章信息
* @param $params
*/
public function pullWechatArticle($params)
{
$url = $params[ 'url' ];
$crawler = new WxCrawler();
$data = $crawler->crawByUrl($url);
// echo $data['data']['content_html'];exit();
return $data;
}
}

70
addon/notes/model/Record.php Executable file
View File

@@ -0,0 +1,70 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\model;
use app\model\BaseModel;
/**
* 笔记点赞记录
*/
class Record extends BaseModel
{
/**
* 添加点赞记录
* @param $data
* @return array
*/
public function addRecord($data)
{
$info = model('notes_dianzan_record')->getInfo([['member_id', '=', $data['member_id']], ['note_id', '=', $data['note_id']]], 'record_id');
if (empty($info)) {
$res = model('notes_dianzan_record')->add($data);
if ($res) {
model("notes")->setInc([['note_id', '=', $data['note_id']]], 'dianzan_num', 1);
}
return $this->success($res);
} else {
return $this->error();
}
}
/**
* 取消点赞
* @param $member_id
* @param $note_id
* @return array
*/
public function deleteRecord($member_id, $note_id)
{
$res = model('notes_dianzan_record')->delete([['member_id', '=', $member_id], ['note_id', '=', $note_id]]);
if ($res) {
model("notes")->setDec([['note_id', '=', $note_id]], 'dianzan_num', 1);
}
return $this->success($res);
}
/**
* 检测商品是否收藏
* @param $note_id
* @param $member_id
* @return array
*/
public function getIsDianzan($note_id, $member_id)
{
$count = model('notes_dianzan_record')->getCount([['member_id', '=', $member_id], ['note_id', '=', $note_id]]);
return $this->success($count);
}
}

View File

@@ -0,0 +1,134 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\model\share;
use addon\notes\model\Notes as NotesModel;
use app\model\share\WchatShareBase as BaseModel;
use app\model\system\Config as ConfigModel;
/**
* 分享
*/
class WchatShare extends BaseModel
{
protected $config = [
[
'title' => '店铺笔记列表',
'config_key' => 'WCHAT_SHARE_CONFIG_NOTES_LIST',
'path' => [ '/pages_tool/store_notes/note_list' ],
'method_prefix' => 'noteList',
],
[
'title' => '店铺笔记分享',
'config_key' => 'WCHAT_SHARE_CONFIG_NOTES_DETAIL',
'path' => [ '/pages_tool/store_notes/note_detail' ],
'method_prefix' => 'noteDetail',
],
];
protected $sort = 4;
/**
* 店铺笔记列表
* @param $param
* @return array
*/
protected function noteListShareData($param)
{
//跳转路径
$link = $this->getShareLink($param);
$config_data = $this->noteListShareConfig($param)[ 'value' ];
$data = [
'link' => $link,
'desc' => $config_data[ 'desc' ],
'imgUrl' => $config_data[ 'imgUrl' ],
'title' => $config_data[ 'title' ]
];
return [
'permission' => [
'hideOptionMenu' => false,
'hideMenuItems' => [],
],
'data' => $data,//分享内容
];
}
/**
* 店铺笔记分享配置
* @param $param
* @return array
*/
public function noteListShareConfig($param)
{
$site_id = $param[ 'site_id' ];
$config = $param[ 'config' ];
$config_model = new ConfigModel();
$data = $config_model->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', 'shop' ], [ 'config_key', '=', $config[ 'config_key' ] ] ])[ 'data' ];
if (empty($data[ 'value' ])) {
$data[ 'value' ] = [
'title' => "店铺笔记",
'desc' => "好物精选\n向您推荐",
'imgUrl' => ''
];
}
if (empty($data[ 'value' ][ 'imgUrl' ])) {
$data[ 'value' ][ 'imgUrl' ] = img('addon/notes/icon.png');
}
return [
'value' => $data[ 'value' ],
];
}
/**
* 店铺笔记分享数据
* @param $param
* @return array
*/
protected function noteDetailShareData($param)
{
$site_id = $param[ 'site_id' ] ?? 0;
parse_str(parse_url($param[ 'url' ])[ 'query' ] ?? '', $query);
if (isset($query[ 'note_id' ]) || isset($query[ 'id' ])) {
$note_id = $query['id'] ?? $query['note_id'];
$condition = [
[ 'site_id', '=', $site_id ],
[ 'note_id', '=', $note_id ]
];
$note_model = new NotesModel();
$note_detail = $note_model->getNotesDetailInfo($condition, '*', 2)[ 'data' ];
if (!empty($note_detail)) {
$title = $note_detail[ 'note_title' ];
$desc = $note_detail[ 'note_title' ];
$link = $this->getShareLink($param);
$image_url = img(explode(',', $note_detail[ 'cover_img' ])[ 0 ]);
$data = [
'title' => $title,
'desc' => $desc,
'link' => $link,
'imgUrl' => $image_url,
'detail' => $note_detail,
];
return [
'permission' => [
'hideOptionMenu' => false,
'hideMenuItems' => [],
],
'data' => $data,//分享内容
];
}
}
}
}

View File

@@ -0,0 +1,89 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\model\share;
use app\model\share\WeappShareBase;
use app\model\system\Config as ConfigModel;
/**
* 分享
*/
class WeappShare extends WeappShareBase
{
protected $config = [
[
'title' => '店铺笔记列表',
'config_key' => 'WEAPP_SHARE_CONFIG_NOTES_LIST',
'path' => [ '/pages_tool/store_notes/note_list' ],
'method_prefix' => 'noteList',
],
];
protected $sort = 6;
/**
* 拼团返利列表
* @param $param
* @return array
*/
protected function noteListShareData($param)
{
//获取和替换配置数据
$config_data = $this->noteListShareConfig($param);
$title = $config_data[ 'value' ][ 'title' ];
$image_url = $config_data[ 'value' ][ 'imageUrl' ] ? img($config_data[ 'value' ][ 'imageUrl' ]) : '';
$path = $this->getSharePath($param);
$data = [
'title' => $title,
'path' => $path,
'imageUrl' => $image_url,
];
return [
'permission' => [
'onShareAppMessage' => true,
'onShareTimeline' => true,
],
'data' => $data,//分享内容
];
}
/**
* 拼团返利列表
* @param $param
* @return array
*/
protected function noteListShareConfig($param)
{
$site_id = $param[ 'site_id' ];
$config = $param[ 'config' ];
$config_model = new ConfigModel();
$data = $config_model->getConfig([
[ 'site_id', '=', $site_id ],
[ 'app_module', '=', 'shop' ],
[ 'config_key', '=', $config[ 'config_key' ] ],
])[ 'data' ];
if (empty($data[ 'value' ])) {
$data[ 'value' ] = [
'title' => '有一些优选商品向你推荐',
'imageUrl' => '',
];
}
$variable = [];
return [
'value' => $data[ 'value' ],
'variable' => $variable,
];
}
}

View File

@@ -0,0 +1,119 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\shop\controller;
use app\shop\controller\BaseShop;
use addon\notes\model\Group as GroupModel;
/**
* 笔记控制器
*/
class Group extends BaseShop
{
/*
* 笔记分组列表
*/
public function lists()
{
$model = new GroupModel();
$condition[] = ['site_id', '=', $this->site_id];
//获取续签信息
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
//排序
$order = input('order', 'sort');
$sort = input('sort', 'desc');
if($order == 'sort'){
$order_by = $order . ' ' . $sort;
}else{
$order_by = $order . ' ' . $sort.',sort desc';
}
$list = $model->getNotesGroupPageList($condition, $page, $page_size, $order_by);
return $list;
} else {
return $this->fetch('group/lists');
}
}
/**
* 添加分组
*/
public function add()
{
if (request()->isJson()) {
$data = [
'site_id' => $this->site_id,
'group_name' => input('group_name', ''),
'sort' => input('sort'),
];
$notes_model = new GroupModel();
return $notes_model->addNotesGroup($data);
}
}
/**
* 编辑分组
*/
public function edit()
{
if (request()->isJson()) {
$data = [
'group_id' => input('group_id'),
'site_id' => $this->site_id,
'group_name' => input('group_name', ''),
'sort' => input('sort'),
];
$notes_model = new GroupModel();
return $notes_model->editNotesGroup([['site_id', '=', $this->site_id], ['group_id', '=', $data['group_id']]], $data);
}
}
/**
* 编辑分组排序
* @return array
*/
public function modifySort()
{
if (request()->isJson()) {
$data = [
'group_id' => input('group_id'),
'site_id' => $this->site_id,
'sort' => input('sort'),
];
$notes_model = new GroupModel();
return $notes_model->editNotesGroup([['site_id', '=', $this->site_id], ['group_id', '=', $data['group_id']]], $data);
}
}
/*
* 删除分组
*/
public function delete()
{
$group_id = input('group_id', '');
$site_id = $this->site_id;
$notes_model = new GroupModel();
return $notes_model->deleteNotesGroup($group_id, $site_id);
}
}

View File

@@ -0,0 +1,346 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\notes\shop\controller;
use app\shop\controller\BaseShop;
use addon\notes\model\Notes as NotesModel;
use addon\notes\model\Group as GroupModel;
/**
* 笔记控制器
*/
class Notes extends BaseShop
{
/*
* 笔记活动列表
*/
public function lists()
{
$model = new NotesModel();
//获取续签信息
if (request()->isJson()) {
$condition[] = [ 'pn.site_id', '=', $this->site_id ];
//笔记状态
$status = input('status', '');
if ($status !== '') {
$condition[] = [ 'pn.status', '=', $status ];
}
//笔记标题
$note_title = input('note_title', '');
if ($note_title) {
$condition[] = [ 'pn.note_title', 'like', '%' . $note_title . '%' ];
}
//笔记类型
$note_type = input('note_type', '');
if ($note_type) {
$condition[] = [ 'pn.note_type', '=', $note_type ];
}
//分组
$group_id = input('group_id', '');
if ($group_id) {
$condition[] = [ 'pn.group_id', '=', $group_id ];
}
//时间
$start_time = input("start_time", '');
$end_time = input("end_time", '');
if (!empty($start_time) && empty($end_time)) {
$condition[] = [ "pn.create_time", ">=", date_to_time($start_time) ];
} elseif (empty($start_time) && !empty($end_time)) {
$condition[] = [ "pn.create_time", "<=", date_to_time($end_time) ];
} elseif (!empty($start_time) && !empty($end_time)) {
$condition[] = [ 'pn.create_time', 'between', [ date_to_time($start_time), date_to_time($end_time) ] ];
}
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
//排序
// $order = input('order', 'sort');
// $sort = input('sort', 'desc');
// if($order == 'sort'){
// $order_by = 'pn.'.$order . ' ' . $sort;
// }else{
// $order_by = 'pn.'.$order . ' ' . $sort.',pn.sort desc';
// }
$order_by = 'pn.create_time desc';
$list = $model->getNotesPageList($condition, $page, $page_size, $order_by);
return $list;
} else {
//笔记类型
$note_type = $model->getNoteType();
$this->assign('note_type', $note_type);
//笔记分组
$group_model = new GroupModel();
$group_list = $group_model->getNotesGroupList([ [ 'site_id', '=', $this->site_id ] ], 'group_id,group_name');
$this->assign('group_list', $group_list[ 'data' ]);
return $this->fetch("notes/lists");
}
}
/**
* 添加活动
*/
public function add()
{
$note_type = input('note_type', '');
if (request()->isJson()) {
$notes_data = [
'site_id' => $this->site_id,
'note_type' => $note_type,
'note_title' => input('note_title', ''),
'note_abstract' => input('note_abstract', ''),
'group_id' => input('group_id', ''),
'cover_type' => input('cover_type', ''),
'cover_img' => input('cover_img', ''),
'goods_ids' => input('goods_ids', ''),
'goods_highlights' => input('goods_highlights', ''),
'note_content' => htmlspecialchars_decode(input('note_content', '')),
'status' => input('status', ''),
'sort' => input('sort', '0'),
'is_show_release_time' => input('is_show_release_time', ''),
'is_show_read_num' => input('is_show_read_num', ''),
'is_show_dianzan_num' => input('is_show_dianzan_num', ''),
'initial_read_num' => input('initial_read_num', ''),
'initial_dianzan_num' => input('initial_dianzan_num', ''),
'note_link' => input('note_link', ''),
'video_path' => input('video_path', ''),
];
$notes_model = new NotesModel();
return $notes_model->addNotes($notes_data);
} else {
$this->assign('note_type', $note_type);
//笔记分组
$group_model = new GroupModel();
$group_list = $group_model->getNotesGroupList([ [ 'site_id', '=', $this->site_id ] ], 'group_id,group_name');
$this->assign('group_list', $group_list[ 'data' ]);
switch ( $note_type ) {
case 'shop_said':
return $this->fetch('notes/add_shop_said');
case 'goods_item':
return $this->fetch('notes/add_goods_item');
case 'article':
return $this->fetch('notes/add_article');
case 'wechat_article':
return $this->fetch('notes/add_wechat_article');
case 'goods_video':
return $this->fetch('notes/add_goods_video');
default:
$this->error("笔记类型不存在");
}
}
}
/*
* 编辑活动
*/
public function edit()
{
$notes_model = new NotesModel();
$note_id = input('note_id', '');
$note_type = input('note_type', '');
if (request()->isJson()) {
$notes_data = [
'note_id' => $note_id,
'site_id' => $this->site_id,
'note_type' => $note_type,
'note_title' => input('note_title', ''),
'note_abstract' => input('note_abstract', ''),
'group_id' => input('group_id', ''),
'cover_type' => input('cover_type', ''),
'cover_img' => input('cover_img', ''),
'goods_ids' => input('goods_ids', ''),
'goods_highlights' => input('goods_highlights', ''),
'note_content' => htmlspecialchars_decode(input('note_content', '')),
'status' => input('status', ''),
'sort' => input('sort', '0'),
'is_show_release_time' => input('is_show_release_time', ''),
'is_show_read_num' => input('is_show_read_num', ''),
'is_show_dianzan_num' => input('is_show_dianzan_num', ''),
'initial_read_num' => input('initial_read_num', ''),
'initial_dianzan_num' => input('initial_dianzan_num', ''),
'note_link' => input('note_link', ''),
'video_path' => input('video_path', ''),
];
return $notes_model->editNotes($notes_data);
} else {
$this->assign('note_id', $note_id);
$this->assign('note_type', $note_type);
//笔记分组
$group_model = new GroupModel();
$group_list = $group_model->getNotesGroupList([ [ 'site_id', '=', $this->site_id ] ], 'group_id,group_name');
$this->assign('group_list', $group_list[ 'data' ]);
//获取笔记信息
$note_info = $notes_model->getNotesDetailInfo([ [ 'note_id', '=', $note_id ], [ 'site_id', '=', $this->site_id ] ])[ 'data' ] ?? [];
if (empty($note_info)) $this->error('未获取到笔记数据', href_url('notes://shop/notes/lists'));
$note_type = $note_info[ 'note_type' ];
$this->assign('info', $note_info);
switch ( $note_type ) {
case 'shop_said':
return $this->fetch('notes/edit_shop_said');
case 'goods_item':
return $this->fetch('notes/edit_goods_item');
case 'article':
return $this->fetch('notes/edit_article');
case 'wechat_article':
return $this->fetch('notes/edit_wechat_article');
case 'goods_video':
return $this->fetch('notes/edit_goods_video');
default:
$this->error("笔记类型不存在");
}
}
}
/*
* 删除笔记活动
*/
public function delete()
{
$note_id = input('note_id', '');
$notes_model = new NotesModel();
return $notes_model->deleteNotes([ [ 'note_id', '=', $note_id ], [ 'site_id', '=', $this->site_id ] ]);
}
/**
* 草稿箱
* @return mixed
*/
public function drafts()
{
$model = new NotesModel();
//笔记类型
$note_type = $model->getNoteType();
$this->assign('note_type', $note_type);
//笔记分组
$group_model = new GroupModel();
$group_list = $group_model->getNotesGroupList([ [ 'site_id', '=', $this->site_id ] ], 'group_id,group_name');
$this->assign('group_list', $group_list[ 'data' ]);
return $this->fetch("notes/drafts");
}
/**
* 发布或取消发布
* @return array
*/
public function releaseEvent()
{
if (request()->isJson()) {
$note_id = input('note_id', 0);
$notes_model = new NotesModel();
$data = array (
'note_id' => $note_id,
'site_id' => $this->site_id,
'status' => input('status', 0)
);
return $notes_model->releaseEvent($data);
}
}
/**
* 修改商品类型排序
*/
public function modifySort()
{
if (request()->isJson()) {
$sort = input('sort', 0);
$note_id = input('note_id', 0);
$notes_model = new NotesModel();
return $notes_model->modifyNotesSort($sort, $note_id, $this->site_id);
}
}
/**
* 笔记选择组件
* @return \multitype
*/
public function notesSelect()
{
$model = new NotesModel();
if (request()->isJson()) {
$condition[] = [ 'pn.site_id', '=', $this->site_id ];
//笔记状态
$status = input('status', '');
if ($status !== '') {
$condition[] = [ 'pn.status', '=', $status ];
}
//笔记标题
$note_title = input('note_title', '');
if ($note_title) {
$condition[] = [ 'pn.note_title', 'like', '%' . $note_title . '%' ];
}
//笔记类型
$note_type = input('note_type', '');
if ($note_type) {
$condition[] = [ 'pn.note_type', '=', $note_type ];
}
//分组
$group_id = input('group_id', '');
if ($group_id) {
$condition[] = [ 'pn.group_id', '=', $group_id ];
}
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$list = $model->getNotesPageList($condition, $page, $page_size, 'pn.sort asc');
return $list;
} else {
//已经选择的商品sku数据
$select_id = input('select_id', '');
$max_num = input('max_num', 0);
$min_num = input('min_num', 0);
$this->assign('select_id', $select_id);
$this->assign('max_num', $max_num);
$this->assign('min_num', $min_num);
//笔记类型
$note_type = $model->getNoteType();
$this->assign('note_type', $note_type);
//笔记分组
$group_model = new GroupModel();
$group_list = $group_model->getNotesGroupList([ [ 'site_id', '=', $this->site_id ] ], 'group_id,group_name');
$this->assign('group_list', $group_list[ 'data' ]);
return $this->fetch("notes/notes_select");
}
}
/**
* 采集文章
*/
public function pullArticle()
{
$note_model = new NotesModel();
$url = input('wechat_url', 'https://mp.weixin.qq.com/s/uyocVJ4DSGqDbu_BR77XwQ');
$result = $note_model->pullWechatArticle([ 'url' => $url ]);
//['title' => '', 'content' => '']
return $result;
}
}

View File

@@ -0,0 +1,315 @@
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="addGroup()">添加笔记分组</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="group_name" placeholder="请输入笔记分组名称" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="attr_class_list" lay-filter="attr_class_list"></table>
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.group_id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</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="delete">删除</a>
</div>
</script>
<script type="text/html" id="addGroup">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="group_name" type="text" placeholder="请输入笔记分组名称" lay-verify="required" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">排序</label>
<div class="layui-input-block">
<input name="sort" type="number" class="layui-input edit-sort len-short">
</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="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script type="text/html" id="editGroup">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="group_name" type="text" value="{{ d.group_name }}" placeholder="请输入笔记分组名称" lay-verify="required" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">排序</label>
<div class="layui-input-block">
<input name="sort" type="number" value="{{ d.sort }}" class="layui-input edit-sort len-short">
</div>
</div>
<input type="hidden" name="group_id" value="{{ d.group_id }}">
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="edit_save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script>
var laytpl, add_attr_index = -1,
form, table;
layui.use(['form', 'laytpl'], function() {
var repeat_flag = false; //防重复标识
laytpl = layui.laytpl;
form = layui.form;
form.render();
table = new Table({
elem: '#attr_class_list',
url: ns.url("notes://shop/group/lists"),
cols: [
[ {
field: 'group_name',
title: '分组名称',
unresize: 'false'
},{
field: 'notes_num',
title: '店铺笔记总数',
unresize: 'false'
},{
field: 'release_num',
title: '笔记发布数',
unresize: 'false'
},{
field: 'sort',
sort : true,
unresize:'false',
title: '排序',
width: '20%',
align: 'center',
templet: '#editSort'
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit':
editGroup(data);
break;
case 'delete':
deleteGroup(data.group_id);
break;
}
});
/**
* 删除
*/
function deleteGroup(group_id) {
layer.confirm('确认删除该分组吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("notes://shop/group/delete"),
data: {
group_id:group_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload({
page: {
curr: 1
},
});
}
}
});
});
}
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: '{:addon_url("notes://shop/group/add")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
form.on('submit(edit_save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: '{:addon_url("notes://shop/group/edit")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
/**
* 表单验证
*/
form.verify({
num: function(value) {
if (value == '') {
return;
}
if (value % 1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
}
});
});
function addGroup() {
var add_attr = $("#addGroup").html();
laytpl(add_attr).render({}, function(html) {
add_attr_index = layer.open({
title: '添加笔记分组',
skin: 'layer-tips-class',
type: 1,
area: ['500px'],
content: html
});
});
}
function editGroup(data) {
var add_attr = $("#editGroup").html();
laytpl(add_attr).render(data, function(html) {
add_attr_index = layer.open({
title: '编辑笔记分组',
skin: 'layer-tips-class',
type: 1,
area: ['500px'],
content: html
});
});
}
function closeAttrLayer() {
layer.close(add_attr_index);
}
// 监听单元格编辑
function editSort(group_id, event){
var data = $(event).val();
if (data == '') {
$(event).val(0);
data = 0;
}
if(!new RegExp("^-?[0-9]\\d*$").test(data)){
layer.msg("排序号只能是整数");
return ;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("notes://shop/group/modifySort"),
data: {
sort: data,
group_id: group_id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
</script>

View File

@@ -0,0 +1,439 @@
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" lay-verify="required" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-long" maxlength="100"></textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" checked>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type">
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<input type="hidden" name="image" />
<i class="del">x</i>
</div>
<div class="multiple-uploading layui-hide">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}">{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>正文:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:500px;"></script>
<input type="hidden" name="note_content" id="note_content" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" checked>
<input type="radio" name="is_show_release_time" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" checked>
<input type="radio" name="is_show_read_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" checked>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" class="layui-input">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存至草稿箱</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
</div>
<input type="hidden" name="goods_ids" value="" />
<input type="hidden" name="note_type" value="{$note_type}" />
</div>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
//实例化富文本
UE.registerUI('添加商品', function(editor, uiName) {
//注册按钮执行时的command命令使用命令默认就会带有回退操作
editor.registerCommand(uiName, {
execCommand: function() {
alert('execCommand:' + uiName)
}
});
//创建一个button
var btn = new UE.ui.Button({
//按钮的名字
name: uiName,
//提示
title: uiName,
label:'添加商品',
//添加额外样式指定icon图标这里默认使用一个重复的icon
cssRules: 'background-position: -500px 0;',
showIcon:false,
//点击时执行的命令
onclick: function() {
//这里可以不用执行命令,做你自己的操作也可
// editor.execCommand(uiName);
addGoods();
}
});
//当点到编辑内容上时,按钮要做的状态反射
editor.addListener('selectionchange', function() {
var state = editor.queryCommandState(uiName);
if (state == -1) {
btn.setDisabled(true);
btn.setChecked(false);
} else {
btn.setDisabled(false);
btn.setChecked(state);
}
});
//因为你是添加button,所以需要返回这个button
return btn;
});
var ue = UE.getEditor('editor');
if($("#note_content").val()){
ue.ready(function() {
ue.setContent($("#note_content").val());
});
}
var form,repeat_flag,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id = [],
goods_list =[];
layui.use(['form'], function() {
form = layui.form;
repeat_flag = false;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
/* var upload = new Upload({
elem: '#img',
callback:function (res) {
if (res.code >= 0) {
imageCollection = [];
imageCollection.push(res.data.pic_path)
}
},
deleteCallback:function () {
upload.delete();
imageCollection = [];
}
}); */
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX) $("#multiple_uploading").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
var field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
var field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(data)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
data.cover_img = imageCollection.join();
var goodsHighlights = [];
$(".lightspot-item").each(function (index,item) {
goodsHighlights.push($(item).find('input').val());
});
data.goods_highlights = goodsHighlights.toString();
if (!ue.getContent()){
layer.msg("笔记内容不能为空");
return false;
}
if(data.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
data.note_content = ue.getContent();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/add"),
data: data,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(index, layero){
if(data.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
/* 添加商品 */
function addGoods(){
goodsSelect(function (data) {
for (var key in data) {
var item = data[key];
var temp_html = `<div style="margin-bottom:20px;">`;
temp_html += `<div style="width:100%;padding:8px;box-sizing:border-box;border-radius:4px;background:#f8f8f8;display:flex">`;
temp_html += `<img style='width:74px;height:74px;border-radius:4px' src="${item.goods_image ? ns.img(item.goods_image) : ''}">`;
temp_html += `<div style="margin-left: 10px;width: 200px;flex: 1;min-height: 0;min-width: 0;">`;
temp_html += `<div style="font-size:14px;color:#202021;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" >${item.goods_name}</div>`;
temp_html += `<div style="font-size:13px;color:#5e6066;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"></div>`;
temp_html += `<div style="font-size:14px;color:#fd463e;font-weight:700;margin-top:10px"><span>¥</span>${item.price}</div>`;
temp_html += `</div>`;
temp_html += `</div></div>`;
ue.setContent(temp_html, true);
}
},selectedGoodsId, {mode: "spu"});
}
function backNotesList() {
location.hash = ns.hash("notes://shop/notes/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
</script>

View File

@@ -0,0 +1,545 @@
<style>
.layui-form-selected dl {
z-index: 1000;
}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading {
display: flex;
flex-wrap: wrap;
}
.multiple-uploading .multiple-item {
position: relative;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
margin-bottom: 10px;
padding: 10px;
width: 100px;
height: 100px;
border: 1px dashed #ddd;
text-align: center;
box-sizing: border-box;
line-height: 1;
color: #5a5a5a;
}
.multiple-uploading .multiple-item p {
line-height: 20px;
margin-top: 5px;
}
.multiple-uploading .multiple-item span {
display: none;
position: absolute;
top: -10px;
right: -7px;
width: 20px;
height: 20px;
border: 1px solid #999;
color: #999;
background-color: #fff;
border-radius: 50%;
line-height: 1;
font-size: 18px;
cursor: pointer;
}
.multiple-uploading .multiple-item:hover .icon {
display: block;
}
.multiple-uploading .multiple-item ~ .multiple-item {
margin-left: 10px;
}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading {
cursor: pointer;
}
.multiple-item img {
max-width: 100%;
max-height: 100%;
}
.shopping-lightspot {
width: 290px;
}
.shopping-lightspot .add-lightspot {
cursor: pointer;
}
.shopping-lightspot .add-lightspot, .shopping-lightspot .lightspot-item {
padding: 15px;
border: 1px dashed #e5e5e5;
line-height: 1;
}
.shopping-lightspot .lightspot-item {
position: relative;
display: flex;
align-items: center;
margin-bottom: 10px;
white-space: nowrap;
}
.shopping-lightspot .lightspot-item span {
position: absolute;
top: -10px;
right: -9px;
display: none;
text-align: center;
width: 20px;
height: 20px;
border: 1px solid #999;
border-radius: 50%;
font-size: 18px;
color: #999;
background: #fff;
}
.shopping-lightspot .lightspot-item:hover span {
display: block;
cursor: pointer;
}
.shopping-lightspot .lightspot-item input {
margin-left: 5px;
}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<h2 class="layui-colla-title">操作提示</h2>
<ul class="layui-colla-content layui-show">
<li>管理员可以在此页添加店铺笔记</li>
</ul>
</div>
</div>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" lay-verify="required" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-long" maxlength="100"></textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" checked>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<input type="hidden" name="image"/>
<i class="del">x</i>
</div>
<div class="multiple-uploading layui-hide">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}">{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">关联商品:</label>
<div class="layui-input-inline">
<div class="upload-img-block square">
<div class="upload-img-box" id="goodImg" lay-verify="select" onclick="addGoods()">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>选择商品</p>
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品亮点:</label>
<div class="layui-input-block shopping-lightspot">
<div class="add-lightspot">+ 添加亮点</div>
</div>
<div class="word-aux">商品亮点最多可添加3个亮点</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>正文:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:500px;"></script>
<input type="hidden" name="note_content" id="note_content"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" checked>
<input type="radio" name="is_show_release_time" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" checked>
<input type="radio" name="is_show_read_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" checked>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" class="layui-input">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存至草稿箱</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
</div>
<input type="hidden" name="goods_ids" value=""/>
<input type="hidden" name="note_type" value="{$note_type}"/>
</div>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var form, upload, repeat_flag,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
goods_ids = "";
//实例化富文本
var ue = UE.getEditor('editor');
if ($("#note_content").val()) {
ue.ready(function () {
ue.setContent($("#note_content").val());
});
}
layui.use(['form'], function () {
form = layui.form;
repeat_flag = false;
form.render();
//图片切换
form.on('radio(cover_type)', function (data) {
//0单图 1多图
if (data.value == 0) {
if (imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else {
if (imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
/* var upload = new Upload({
elem: '#img',
callback: function (res) {
if (res.code >= 0) {
imageCollection = [];
imageCollection.push(res.data.pic_path)
}
},
deleteCallback: function () {
upload.delete();
imageCollection = [];
}
}); */
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click", "#multiple_uploading").on("click", "#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX) {
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index, 1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX)
$("#multiple_uploading").removeClass("layui-hide");
});
//商品亮点
$("body").off("click", ".shopping-lightspot .add-lightspot").on("click", ".shopping-lightspot .add-lightspot", function () {
var len = 0,
html = "";
html += `<div class="lightspot-item">`;
html += `亮点名称:<input type="text" class="layui-input" maxlength="10" placeholder="最多10个字">`;
html += `<span>x</span>`;
html += `</div>`;
$(this).before(html);
len = $(".shopping-lightspot .lightspot-item").length;
if (len >= 3)
$(this).addClass("layui-hide");
});
$("body").off("click", ".shopping-lightspot .lightspot-item span").on("click", ".shopping-lightspot .lightspot-item span", function () {
$(this).parents(".lightspot-item").remove();
var len = $(".shopping-lightspot .lightspot-item").length;
if (len < 3)
$(".shopping-lightspot .add-lightspot").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function (data) {
field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function (data) {
var field = data.field;
field.status = 0;
formSubmit(field)
});
function formSubmit(data) {
if (selectedGoodsId.length == 0) {
layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
return;
}
data.cover_img = imageCollection.join();
var goodsHighlights = [];
$(".lightspot-item").each(function (index, item) {
goodsHighlights.push($(item).find('input').val());
});
data.goods_highlights = goodsHighlights.toString();
if (!ue.getContent()) {
layer.msg("笔记内容不能为空");
return false;
}
data.note_content = ue.getContent();
if (data.cover_img == '') {
layer.msg("请选择笔记封面");
return false;
}
if(data.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/add"),
data: data,
async: false,
success: function (res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title: '操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function (index, layero) {
location.hash = ns.hash("notes://shop/notes/lists");
layer.close(index);
},
btn2: function (index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
})
}
});
/**
* 添加商品
*/
var selectedGoodsId = [];
function addGoods() {
goodsSelect(function (data) {
if (Object.keys(data).length == 0) {
selectGoodsSkuId = [];
$("#goodImg").html('<div class="upload-default"> <i class="iconfont iconshangchuan"></i> <p>选择商品</p> </div>');
return;
}
selectedGoodsId = [];
for (var key in data) {
var item = data[key];
goods_ids = item.goods_id;
$("input[name=goods_ids]").val(goods_ids);
$("#goodImg").html("<img src=" + ns.img(item.goods_image.split(",")[0], 'SMALL') + " >");
}
selectedGoodsId.push(goods_ids);
}, selectedGoodsId, {mode: "spu", max_num: 1, min_num: 1, disabled: 0});
}
function backNotesList() {
location.hash = ns.hash("notes://shop/notes/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
</script>

View File

@@ -0,0 +1,572 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
/*上传视频相关*/
.video-thumb{display:block;float:left;width:250px;height:120px;position:relative}
.delete-video{width:51px;height:51px;cursor:pointer;position:absolute;right:150px;top:45px;color:#fff;z-index:100}
.replace-video{width:75px;height:51px;cursor:pointer;position:absolute;right:50px;top:45px;color:#fff;z-index:100}
.replace-video2{right:100px}
.mask{position:absolute;left:0;width:250px;height:92px;background:#000;opacity:.6;cursor:pointer;z-index:10}
.del-img{width:14px;margin-right:5px;padding-bottom:2px}
.up-img{width:14px;height:14px;margin-right:5px;padding-bottom:3px}
.up-video{position:absolute;left:0;width:250px;height:92px;cursor:pointer;z-index:10}
.video-thumb .hide{display:none!important}
.video-thumb>#goods_video{width:100%!important;height:121px;background:#fff}
.hide{display:none}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" lay-verify="required" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-long" maxlength="100"></textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" checked>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type">
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<input type="hidden" name="image" />
<i class="del">x</i>
</div>
<div class="multiple-uploading layui-hide">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}">{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label">关联商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>添加视频:</label>
<div class="layui-input-block">
<input type="hidden" name="video_path" placeholder="在此输入外链视频地址" value="" autocomplete="off" class="layui-input len-long">
<div class="video-thumb">
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
</div>
<div id="videoUpload2" class="up-video" title="商品视频" >
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
<span id="" class="replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" checked>
<input type="radio" name="is_show_release_time" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" checked>
<input type="radio" name="is_show_read_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" checked>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" class="layui-input">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存至草稿箱</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
</div>
<input type="hidden" name="goods_ids" value="" />
<input type="hidden" name="note_type" value="{$note_type}" />
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delGoods({{d.goods_id}})">删除</a>
</div>
</script>
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
<script src="__STATIC__/ext/video/video.min.js"></script>
<script>
var form,repeat_flag,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id = [],
goods_list =[];
layui.use(['form'], function() {
form = layui.form;
repeat_flag = false;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
/* var upload = new Upload({
elem: '#img',
callback:function (res) {
if (res.code >= 0) {
imageCollection = [];
imageCollection.push(res.data.pic_path)
}
},
deleteCallback:function () {
upload.delete();
imageCollection = [];
}
}); */
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX) $("#multiple_uploading").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
var field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
var field = data.field;
field.status = 0;
formSubmit(field)
});
var upload = new Upload({
elem: '#videoUpload',
url: ns.url("shop/upload/video"),
accept: "video",
callback:function (res) {
if (res.code >= 0) {
$("input[name='video_path']").val(res.data.path);
loadVideo();
}
}
});
});
/**
* 提交
*/
function formSubmit(data)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
data.cover_img = imageCollection.join();
if(data.video_path == ''){
layer.msg('请选择视频!', {icon: 5, anim: 6});
return;
}
if(data.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/add"),
data: data,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(index, layero){
if(data.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
// 表格渲染
renderTable();
function renderTable(goods_list = []) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
cols: [
[{
field: 'goods_name',
title: '商品名称',
unresize: 'false',
width: '50%'
}, {
field: 'price',
title: '商品价格(元)',
unresize: 'false',
align: 'right',
width: '20%',
templet: function(data) {
return '¥' + data.price;
}
}, {
field: 'goods_stock',
title: '库存',
unresize: 'false',
align: 'center',
width: '20%'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}],
],
data: goods_list
});
}
/* 添加商品 */
function addGoods(){
goodsSelect(function (data) {
goods_id = [];
goods_list = [];
for (var key in data) {
goods_id.push(data[key].goods_id);
goods_list.push(data[key]);
}
renderTable(goods_list);
$("input[name='goods_ids']").val(goods_id.toString());
selectedGoodsId = goods_id;
},selectedGoodsId, {mode: "spu"});
}
// 删除选中商品
function delGoods(id) {
$.each(goods_list, function(index, item) {
var goods_id = item.goods_id;
if (id == Number(goods_id)) {
goods_list.splice(index, 1);
renderTable(goods_list);
}
});
$.each(selectedGoodsId, function(index, item) {
if (id == Number(item)) {
selectedGoodsId.splice(index, 1);
goods_id = selectedGoodsId;
}
});
$("input[name='goods_ids']").val(goods_id.toString());
}
function backNotesList() {
location.hash = ns.hash("notes://shop/notes/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
function deleteVideoClass(){
$('#goods_video').removeClass("vjs-error");
}
//删除已选择的视频
function deleteVideo() {
var src = $("input[name='video_path']").val();
if (src != "") {
var video = 'goods_video';
var myPlayer = videojs(video);
videojs(video).ready(function () {
var myPlayer = this;
myPlayer.pause();
});
$("#goods_video_html5_api").attr('src', "");
$(".vjs-modal-dialog-content").hide();
$(".vjs-error-display").hide();
setTimeout("deleteVideoClass()",30 );
$('#goods_video_html5_api').attr('controls', true);
$(".vjs-poster").hide();
$("input[name='video_path']").val('');
}
}
$('body').off('mouseover', '#videoUpload2').on('mouseover', '#videoUpload2', function () {
$(this).addClass('mask');
var src = $('#goods_video_html5_api').attr('src');
if(src) {
$(".delete-video").removeClass('hide');
$(".replace-video").removeClass('hide').removeClass('replace-video2');
} else {
$(".replace-video").removeClass('hide').addClass('replace-video2');
}
});
$('body').off('mouseout', '#videoUpload2').on('mouseout', '#videoUpload2', function () {
$(this).removeClass('mask');
$(".delete-video").addClass('hide');
$(".replace-video").addClass('hide');
});
//添加商品视频
$("body").off("click", ".js-add-goods-video").on("click", ".js-add-goods-video", function () {
openAlbum(function (data) {
if(data.length > 0) {
$("input[name='video_path']").val(data[0]['pic_path']);
loadVideo();
}
}, 1, 0, 'video');
});
/**
* 加载视频
* @param flag 是否暂停
*/
function loadVideo(flag) {
var video_path = $("input[name='video_path']").val();
if (!video_path.length) return;
var video = "goods_video";
var myPlayer = videojs(video);
var value = ns.img(video_path);
videojs(video).ready(function () {
var myPlayer = this;
myPlayer.src(value);
myPlayer.load(value);
myPlayer.play();
if (flag) {
setTimeout(function () {
myPlayer.pause();
}, 10);
}
setTimeout(function () {
if (!$(".video-thumb .vjs-error-display").hasClass("vjs-hidden")) {
$("input[name='video_path']").val("");//video.js Line:7873
layer.msg("媒体不能加载,要么是因为服务器或网络失败,要么是因为格式不受支持。");
} else {
}
}, 1000);
});
}
</script>

View File

@@ -0,0 +1,471 @@
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" lay-verify="required" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-long" maxlength="100"></textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" checked>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type">
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<input type="hidden" name="image" />
<i class="del">x</i>
</div>
<div class="multiple-uploading layui-hide">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}">{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label">选择商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>正文:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:500px;"></script>
<input type="hidden" name="note_content" id="note_content" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" checked>
<input type="radio" name="is_show_release_time" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" checked>
<input type="radio" name="is_show_read_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" checked>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" class="layui-input">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存至草稿箱</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
</div>
<input type="hidden" name="goods_ids" value="" />
<input type="hidden" name="note_type" value="{$note_type}" />
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delGoods({{d.goods_id}})">删除</a>
</div>
</script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
//实例化富文本
var ue = UE.getEditor('editor');
if($("#note_content").val()){
ue.ready(function() {
ue.setContent($("#note_content").val());
});
}
var form,repeat_flag,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id = [],
goods_list =[];
layui.use(['form'], function() {
form = layui.form;
repeat_flag = false;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
/* var upload = new Upload({
elem: '#img',
callback:function (res) {
if (res.code >= 0) {
imageCollection = [];
imageCollection.push(res.data.pic_path)
}
},
deleteCallback:function () {
upload.delete();
imageCollection = [];
}
}); */
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX) $("#multiple_uploading").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(data)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
data.cover_img = imageCollection.join();
var goodsHighlights = [];
$(".lightspot-item").each(function (index,item) {
goodsHighlights.push($(item).find('input').val());
});
data.goods_highlights = goodsHighlights.toString();
if (!ue.getContent()){
layer.msg("笔记内容不能为空");
return false;
}
if(data.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
data.note_content = ue.getContent();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/add"),
data: data,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(index, layero){
if(data.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
// 表格渲染
renderTable();
function renderTable(goods_list = []) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
cols: [
[{
field: 'goods_name',
title: '商品名称',
unresize: 'false',
width: '50%'
}, {
field: 'price',
title: '商品价格(元)',
unresize: 'false',
align: 'right',
width: '20%',
templet: function(data) {
return '¥' + data.price;
}
}, {
field: 'goods_stock',
title: '库存',
unresize: 'false',
align: 'center',
width: '20%'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}],
],
data: goods_list
});
}
/* 添加商品 */
function addGoods(){
goodsSelect(function (data) {
goods_id = [];
goods_list = [];
for (var key in data) {
goods_id.push(data[key].goods_id);
goods_list.push(data[key]);
}
renderTable(goods_list);
$("input[name='goods_ids']").val(goods_id.toString());
selectedGoodsId = goods_id;
},selectedGoodsId, {mode: "spu"});
}
// 删除选中商品
function delGoods(id) {
$.each(goods_list, function(index, item) {
var goods_id = item.goods_id;
if (id == Number(goods_id)) {
goods_list.splice(index, 1);
renderTable(goods_list);
}
});
$.each(selectedGoodsId, function(index, item) {
if (id == Number(item)) {
selectedGoodsId.splice(index, 1);
goods_id = selectedGoodsId;
}
});
$("input[name='goods_ids']").val(goods_id.toString());
}
function backNotesList() {
location.hash = ns.hash("notes://shop/notes/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
</script>

View File

@@ -0,0 +1,528 @@
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
.form-view .short-label{width:120px}
.form-view .layui-input-block{margin-left:120px}
.form-view .word-aux{margin-left:120px}
.wechat-view{width: 100%;display: flex;}
.content-view{width: 450px;}
.form-view{flex:1;}
.preview-head-div{background:url(STATIC_EXT/diyview/img/preview_head.png) no-repeat 50%/cover;font-size:14px;display:block;height:64px;line-height:82px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer;margin:0 auto}
#title_html{text-align: center;font-size: 16px;font-weight: bold;}
.content-box::-webkit-scrollbar { width: 0 !important }
.content-box { -ms-overflow-style: none; }
.content-box { overflow: -moz-scrollbars-none; }
.pull-disabled-btn{opacity: .6;filter: alpha(opacity=60);color: #fff;}
</style>
<div class="wechat-view">
<div class="content-view" style="padding: 0px 24px;height: 100%;overflow: auto;">
<div style="border: 1px solid rgb(241, 241, 241);width: 375px;">
<div style="padding: 13px 20px; background: rgb(255, 255, 255); box-shadow: rgb(239, 239, 239) 0px -1px 0px inset;">
<div data-v-713f8b68="" class="component-title" style="padding-left: 0px; font-size: 14px; font-weight: bold; color: rgba(0, 0, 0, 0.8);">店铺笔记预览</div>
</div>
<div class="preview-head-div" style="background-color: rgb(255, 255, 255); color: rgb(51, 51, 51); text-align: left;"><span style="text-align: left;"> </span></div>
<div>
<h5 id="title_html"></h5>
</div>
<div class="content-box" style="padding: 9px 12px;box-sizing: border-box;height: 650px;overflow-x: hidden; overflow-y: auto;">
<div id="content_html"></div>
</div>
</div>
</div>
<div class="layui-form form-wrap form-view" style="overflow: auto;background: #fff;position: relative;">
<div class="layui-form-item">
<label class="layui-form-label short-label">文章链接:</label>
<div class="layui-input-inline">
<input type="text" name="note_link" autocomplete="off" placeholder="请输入文章链接" class="layui-input len-mid">
</div>
<div class="layui-input-inline">
<button class="layui-btn pull-btn" onclick="pullArticle(this)">获取文章</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" lay-verify="required" onchange="fetchTitle(this.value)" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-mid" maxlength="100"></textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" checked>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type">
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label short-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<input type="hidden" name="image" />
<i class="del">x</i>
</div>
<div class="multiple-uploading layui-hide">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}">{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label short-label">关联商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" checked>
<input type="radio" name="is_show_release_time" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" checked>
<input type="radio" name="is_show_read_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" checked>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" class="layui-input">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存至草稿箱</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
</div>
<input type="hidden" name="note_content" value=""/>
<input type="hidden" name="goods_ids" value="" />
<input type="hidden" name="note_type" value="{$note_type}" />
</div>
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delGoods({{d.goods_id}})">删除</a>
</div>
</script>
<script>
//实例化富文本
var form,repeat_flag,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id = [],
goods_list =[];
layui.use(['form'], function() {
form = layui.form;
repeat_flag = false;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
/* var upload = new Upload({
elem: '#img',
callback:function (res) {
if (res.code >= 0) {
imageCollection = [];
imageCollection.push(res.data.pic_path)
}
},
deleteCallback:function () {
upload.delete();
imageCollection = [];
}
}); */
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX) $("#multiple_uploading").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
var field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
var field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(data)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
if(data.note_content == ''){
layer.msg('请先获取文章信息!', {icon: 5, anim: 6});
return;
}
data.cover_img = imageCollection.join();
if(data.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/add"),
data: data,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(index, layero){
if(data.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
// 表格渲染
renderTable();
function renderTable(goods_list = []) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
cols: [
[{
field: 'goods_name',
title: '商品名称',
unresize: 'false',
width: '50%'
}, {
field: 'price',
title: '商品价格(元)',
unresize: 'false',
align: 'right',
width: '20%',
templet: function(data) {
return '¥' + data.price;
}
}, {
field: 'goods_stock',
title: '库存',
unresize: 'false',
align: 'center',
width: '20%'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}],
],
data: goods_list
});
}
/* 添加商品 */
function addGoods(){
goodsSelect(function (data) {
goods_id = [];
goods_list = [];
for (var key in data) {
goods_id.push(data[key].goods_id);
goods_list.push(data[key]);
}
renderTable(goods_list);
$("input[name='goods_ids']").val(goods_id.toString());
selectedGoodsId = goods_id;
},selectedGoodsId, {mode: "spu"});
}
// 删除选中商品
function delGoods(id) {
$.each(goods_list, function(index, item) {
var goods_id = item.goods_id;
if (id == Number(goods_id)) {
goods_list.splice(index, 1);
renderTable(goods_list);
}
});
$.each(selectedGoodsId, function(index, item) {
if (id == Number(item)) {
selectedGoodsId.splice(index, 1);
goods_id = selectedGoodsId;
}
});
$("input[name='goods_ids']").val(goods_id.toString());
}
function backNotesList() {
location.hash = ns.hash("notes://shop/notes/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
/**
* 采集公众号文章信息
*/
function pullArticle(self_obj){
if($(self_obj).hasClass('pull-disabled-btn')){
return;
}
var wechat_url = $('input[name=note_link]').val();
if(wechat_url == ''){
layer.msg('文章链接不可为空!', {icon: 5, anim: 6});
return false;
}
$(self_obj).addClass('pull-disabled-btn');
$(self_obj).prepend(`<i class="common-loading-layer layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>`);
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/pullArticle"),
data: {wechat_url:$('input[name=note_link]').val()},
// async: false,
success: function(res){
if (res.code >= 0) {
fetchTitle(res.data.title);
fetchArticle(res.data.content_html);
initPullBtn();
}else{
layer.msg(res.message);
}
}
})
}
function initPullBtn(){
$(".pull-btn").text('获取文章');
$(".pull-btn").removeClass('pull-disabled-btn');
}
//填充标题
function fetchTitle(data){
$('input[name=note_title]').val(data);
$('#title_html').text(data);
}
function fetchArticle(data){
$('input[name=note_content]').val(data);
$("#content_html").html(data);
}
</script>

View File

@@ -0,0 +1,261 @@
<style>
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
</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="note_title" placeholder="请输入笔记名称" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">笔记类型:</label>
<div class="layui-input-inline">
<select name="note_type" lay-filter="status">
<option value="">全部</option>
{foreach $note_type as $v}
<option value="{$v['type']}">{$v['name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-filter="status">
<option value="">全部</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}">{$v['group_name']}</option>
{/foreach}
</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="text" class="layui-input" name="start_time" id="start_time" autocomplete="off" placeholder="开始时间" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" id="end_time" autocomplete="off" placeholder="结束时间" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<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="notes_tab">
<div class="layui-tab-content">
<!-- 列表 -->
<table id="notes_list" lay-filter="notes_list"></table>
</div>
</div>
<!-- 商品 -->
<script type="text/html" id="goods">
<div class="table-title">
<div class="title-pic">
{{# if(d.goods_image){ }}
<img layer-src src="{{ns.img(d.goods_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color" title="{{d.goods_name}}">{{d.goods_name}}</a>
</div>
</div>
</script>
<!-- 时间 -->
<script id="time" type="text/html">
<div class="layui-elip">开始{{ns.time_to_date(d.start_time)}}</div>
<div class="layui-elip">结束{{ns.time_to_date(d.end_time)}}</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="del">删除</a>
{{# if(d.status == 0){ }}
<a class="layui-btn text-color" lay-event="release">发布</a>
{{# }else{ }}
<a class="layui-btn" lay-event="unrelease">取消发布</a>
{{# } }}
</div>
</script>
<script>
var table;
layui.use(['form', 'element','laydate'], function() {
var form = layui.form,
laydate = layui.laydate,
repeat_flag = false; //防重复标识
form.render();
//渲染时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
laydate.render({
elem: '#end_time',
type: 'datetime'
});
table = new Table({
elem: '#notes_list',
url: ns.url("notes://shop/notes/lists"),
where:{
status:0
},
cols: [
[{
field:'note_title',
title: '笔记标题',
unresize: 'false',
width: '23%'
}, {
field: 'group_name',
title: '所属分组',
unresize: 'false'
}, {
title: '添加时间',
unresize: 'false',
templet:function(data){
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("notes://shop/notes/edit", {"note_id": data.note_id});
break;
case 'del': //删除
deleteNotes(data.note_id);
break;
case 'release': //发布
release(data.note_id);
break;
case 'unrelease': //取消发布
unrelease(data.note_id);
break;
}
});
/**
* 删除
*/
function deleteNotes(note_id) {
layer.confirm('确定要删除该笔记吗?', function(index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("notes://shop/notes/delete"),
data: {
note_id: note_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 release(id){
$.ajax({
type: 'POST',
url: ns.url("notes://shop/notes/releaseEvent"),
data: {
status: 1,
note_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
}
function unrelease(id){
$.ajax({
type: 'POST',
url: ns.url("notes://shop/notes/releaseEvent"),
data: {
status: 0,
note_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
}
function add() {
location.hash = ns.hash("notes://shop/notes/add");
}
</script>

View File

@@ -0,0 +1,429 @@
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<h2 class="layui-colla-title">操作提示</h2>
<ul class="layui-colla-content layui-show">
<li>管理员可以在此页编辑店铺笔记</li>
</ul>
</div>
</div>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" value="{$info.note_title}" lay-verify="required" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-long" maxlength="100">{$info.note_abstract}</textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" {if $info.cover_type == 0} checked {/if}>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type" {if $info.cover_type == 1} checked {/if}>
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading {if $info.cover_type != 0}layui-hide{/if}">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="multiple-uploading {if $info.cover_type != 1}layui-hide{/if}">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}" {if $info.group_id == $v.group_id} selected {/if}>{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记内容:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:500px;"></script>
<input type="hidden" name="note_content" id="note_content" value="{$info.note_content}"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" {if $info.is_show_release_time == 1} checked {/if}>
<input type="radio" name="is_show_release_time" value="0" title="不显示" {if $info.is_show_release_time == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" {if $info.is_show_read_num == 1} checked {/if}>
<input type="radio" name="is_show_read_num" value="0" title="不显示" {if $info.is_show_read_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" {if $info.is_show_dianzan_num == 1} checked {/if}>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示" {if $info.is_show_dianzan_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" value="{$info.initial_read_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" value="{$info.initial_dianzan_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" value="{$info.sort}" class="layui-input">
</div>
</div>
<input type="hidden" name="note_id" value="{$info.note_id}" />
<input type="hidden" name="goods_ids" value="{$info.goods_ids}" />
<input type="hidden" name="note_type" value="{$info.note_type}" />
<div class="form-row">
{if $info.status == 1}
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
{else /}
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存</button>
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
{/if}
</div>
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delGoods({{d.LAY_INDEX}})">删除</a>
</div>
</script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var form,upload,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id=[],
repeat_flag = false,
coverType = '{$info.cover_type}',
coverImg = '{$info.cover_img}';
initImg();//初始化图片
function initImg(){
if (coverType == 0){
imageCollection.push(coverImg);
//单图
if (coverImg) $("#img").html("<img src=" + ns.img(coverImg) + " >");
} else if (coverType == 1) {
//多图
var coverImgArr = coverImg.split(','),
html = '';
imageCollection = coverImgArr;
for (var i = 0; i < coverImgArr.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(coverImgArr[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").append(html);
}
}
//实例化富文本
var ue = UE.getEditor('editor');
if($("#note_content").val()){
ue.ready(function() {
ue.setContent($("#note_content").val());
});
}
layui.use(['form'], function() {
form = layui.form;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
var html = '';
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX)
$("#multiple_uploading").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
var field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
var field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(field)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
field.cover_img = imageCollection.join();
if (!ue.getContent()){
layer.msg("笔记内容不能为空");
return false;
}
if(field.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
field.note_content = ue.getContent();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/edit"),
data: field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续编辑'],
yes: function(index, layero){
if(field.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
/* 添加商品 */
function addGoods(){
goodsSelect(function (data) {
for (var key in data) {
var item = data[key];
var temp_html = `<div style="margin-bottom:20px;">`;
temp_html += `<div style="width:100%;padding:8px;box-sizing:border-box;border-radius:4px;background:#f8f8f8;display:flex">`;
temp_html += `<img style='width:74px;height:74px;border-radius:4px' src="${item.goods_image ? ns.img(item.goods_image) : ''}">`;
temp_html += `<div style="margin-left: 10px;width: 200px;flex: 1;min-height: 0;min-width: 0;">`;
temp_html += `<div style="font-size:14px;color:#202021;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" >${item.goods_name}</div>`;
temp_html += `<div style="font-size:13px;color:#5e6066;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"></div>`;
temp_html += `<div style="font-size:14px;color:#fd463e;font-weight:700;margin-top:10px"><span>¥</span>${item.price}</div>`;
temp_html += `</div>`;
temp_html += `</div></div>`;
ue.setContent(temp_html, true);
}
},selectedGoodsId, {mode: "spu"});
}
function backNotesList() {
location.hash = ns.hash("notes://shop/notes/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
</script>

View File

@@ -0,0 +1,515 @@
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
.shopping-lightspot{width: 290px;}
.shopping-lightspot .add-lightspot{cursor: pointer;}
.shopping-lightspot .add-lightspot, .shopping-lightspot .lightspot-item{padding: 15px;border: 1px dashed #e5e5e5;line-height: 1;}
.shopping-lightspot .lightspot-item{position: relative;display: flex;align-items: center;margin-bottom: 10px;white-space: nowrap;}
.shopping-lightspot .lightspot-item span{position: absolute;top: -10px;right: -9px;display: none;text-align: center;width: 20px;height: 20px;border: 1px solid #999;border-radius: 50%;font-size: 18px;color: #999;background: #fff;}
.shopping-lightspot .lightspot-item:hover span{display: block;cursor: pointer;}
.shopping-lightspot .lightspot-item input{margin-left: 5px;}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<h2 class="layui-colla-title">操作提示</h2>
<ul class="layui-colla-content layui-show">
<li>管理员可以在此页编辑店铺笔记</li>
</ul>
</div>
</div>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" value="{$info.note_title}" lay-verify="required" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-long" maxlength="100">{$info.note_abstract}</textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" {if $info.cover_type == 0} checked {/if}>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type" {if $info.cover_type == 1} checked {/if}>
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading {if $info.cover_type != 0}layui-hide{/if}">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="multiple-uploading {if $info.cover_type != 1}layui-hide{/if}">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}" {if $info.group_id == $v.group_id} selected {/if}>{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">关联商品:</label>
<div class="layui-input-inline">
<div class="upload-img-block square">
{if condition="$info.goods_list"}
<div class="upload-img-box" id="goodImg" lay-verify="select" onclick="addGoods()">
<img src="{:img(explode(',', $info.goods_list[0]['goods_image'])[0])}" alt="">
</div>
{else/}
<div class="upload-img-box" id="goodImg" lay-verify="select" onclick="addGoods()">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>选择商品</p>
</div>
</div>
{/if}
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品亮点:</label>
<div class="layui-input-block shopping-lightspot">
<div class="add-lightspot">+ 添加亮点</div>
</div>
<div class="word-aux">商品亮点最多可添加3个亮点</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记内容:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:500px;"></script>
<input type="hidden" name="note_content" id="note_content" value="{$info.note_content}"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" {if $info.is_show_release_time == 1} checked {/if}>
<input type="radio" name="is_show_release_time" value="0" title="不显示" {if $info.is_show_release_time == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" {if $info.is_show_read_num == 1} checked {/if}>
<input type="radio" name="is_show_read_num" value="0" title="不显示" {if $info.is_show_read_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" {if $info.is_show_dianzan_num == 1} checked {/if}>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示" {if $info.is_show_dianzan_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" value="{$info.initial_read_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" value="{$info.initial_dianzan_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" value="{$info.sort}" class="layui-input">
</div>
</div>
<input type="hidden" name="note_id" value="{$info.note_id}" />
<input type="hidden" name="goods_ids" value="{$info.goods_ids}" />
<input type="hidden" name="note_type" value="{$info.note_type}" />
<div class="form-row">
{if $info.status == 1}
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
{else /}
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存</button>
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
{/if}
</div>
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delGoods({{d.goods_id}})">删除</a>
</div>
</script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var form,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
repeat_flag = false,
coverType = '{$info.cover_type}',
coverImg = '{$info.cover_img}',
goods_ids = '{$info.goods_ids}';
initImg();//初始化图片
function initImg(){
if (coverType == 0){
imageCollection.push(coverImg);
//单图
$("#img").html("<img src=" + ns.img(coverImg) + " >");
} else if (coverType == 1) {
//多图
var coverImgArr = coverImg.split(','),
html = '';
imageCollection = coverImgArr;
for (var i = 0; i < coverImgArr.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(coverImgArr[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").append(html);
}
}
//初始化商品亮点
var spotGoods = "{$info.goods_highlights}";
initShoppingLightspot();
function initShoppingLightspot() {
if (!spotGoods) return false;
spotGoods = spotGoods.split(',');
var html = '';
for(var i = 0; i < spotGoods.length; i++){
html += `<div class="lightspot-item">`;
html += `亮点名称:<input type="text" class="layui-input" maxlength="10" placeholder="最多10个字" value="${spotGoods[i]}">`;
html += `<span>x</span>`;
html += `</div>`;
}
if (spotGoods.length == 3) $(".shopping-lightspot").html(html);
else $(".shopping-lightspot .add-lightspot").before(html)
}
//实例化富文本
var ue = UE.getEditor('editor');
if($("#note_content").val()){
ue.ready(function() {
ue.setContent($("#note_content").val());
});
}
layui.use(['form'], function() {
form = layui.form;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX)
$("#multiple_uploading").removeClass("layui-hide");
});
//商品亮点
$("body").off("click", ".shopping-lightspot .add-lightspot").on("click", ".shopping-lightspot .add-lightspot", function () {
var len = 0,
html = "";
html += `<div class="lightspot-item">`;
html += `亮点名称:<input type="text" class="layui-input" maxlength="10" placeholder="最多10个字">`;
html += `<span>x</span>`;
html += `</div>`;
$(this).before(html);
len = $(".shopping-lightspot .lightspot-item").length;
if(len >= 3)
$(this).addClass("layui-hide");
});
$("body").off("click", ".shopping-lightspot .lightspot-item span").on("click", ".shopping-lightspot .lightspot-item span", function () {
$(this).parents(".lightspot-item").remove();
var len = $(".shopping-lightspot .lightspot-item").length;
if(len < 3) $(".shopping-lightspot .add-lightspot").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
var field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
var field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(field)
{
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
field.cover_img = imageCollection.join();
var goodsHighlights = [];
for (var i = 0; i < $(".lightspot-item").length; i++){
if($(".lightspot-item").eq(i).find('input').val()){
goodsHighlights.push($(".lightspot-item").eq(i).find('input').val());
}
// else{
// layer.msg("商品亮点不能为空");
// return false;
// }
}
field.goods_highlights = goodsHighlights.toString();
if (!ue.getContent()){
layer.msg("笔记内容不能为空");
return false;
}
if(field.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
field.note_content = ue.getContent();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/edit"),
data: field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续编辑'],
yes: function(index, layero){
if(field.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
/**
* 添加商品
*/
var selectedGoodsId = ['{$info.goods_ids}'];
function addGoods() {
goodsSelect(function (data) {
if (Object.keys(data).length == 0) {
selectGoodsSkuId = [];
$("#goodImg").html('<div class="upload-default"> <i class="iconfont iconshangchuan"></i> <p>选择商品</p> </div>');
return;
}
selectedGoodsId = [];
for (var key in data) {
var item = data[key];
goods_ids = item.goods_id;
$("input[name=goods_ids]").val(goods_ids);
$("#goodImg").html("<img src=" + ns.img(item.goods_image.split(",")[0],'small') + " >");
$(".good-img").val(item.goods_image);
$(".good-name").text(item.goods_name);
$(".good-price span").text(item.price);
}
selectedGoodsId.push(goods_ids);
}, selectedGoodsId, {mode: "spu", max_num: 1, min_num: 1, disabled:0});
}
function backNotesList() {
location.hash = ns.hash("notes://shop/notes/drafts");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
</script>

View File

@@ -0,0 +1,585 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
/*上传视频相关*/
.video-thumb{display:block;float:left;width:250px;height:120px;position:relative}
.delete-video{width:51px;height:51px;cursor:pointer;position:absolute;right:150px;top:45px;color:#fff;z-index:100}
.replace-video{width:75px;height:51px;cursor:pointer;position:absolute;right:50px;top:45px;color:#fff;z-index:100}
.replace-video2{right:100px}
.mask{position:absolute;left:0;width:250px;height:92px;background:#000;opacity:.6;cursor:pointer;z-index:10}
.del-img{width:14px;margin-right:5px;padding-bottom:2px}
.up-img{width:14px;height:14px;margin-right:5px;padding-bottom:3px}
.up-video{position:absolute;left:0;width:250px;height:92px;cursor:pointer;z-index:10}
.video-thumb .hide{display:none!important}
.video-thumb>#goods_video{width:100%!important;height:121px;background:#fff}
.hide{display:none}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<h2 class="layui-colla-title">操作提示</h2>
<ul class="layui-colla-content layui-show">
<li>管理员可以在此页编辑店铺笔记</li>
</ul>
</div>
</div>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" value="{$info.note_title}" lay-verify="required" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-long" maxlength="100">{$info.note_abstract}</textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" {if $info.cover_type == 0} checked {/if}>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type" {if $info.cover_type == 1} checked {/if}>
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading {if $info.cover_type != 0}layui-hide{/if}">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="multiple-uploading {if $info.cover_type != 1}layui-hide{/if}">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}" {if $info.group_id == $v.group_id} selected {/if}>{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label">关联商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>添加视频:</label>
<div class="layui-input-block">
<input type="hidden" name="video_path" placeholder="在此输入外链视频地址" value="{$info.video_path}" autocomplete="off" class="layui-input len-long">
<div class="video-thumb">
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
</div>
<div id="videoUpload2" class="up-video" title="商品视频" >
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
<span id="" class="replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" {if $info.is_show_release_time == 1} checked {/if}>
<input type="radio" name="is_show_release_time" value="0" title="不显示" {if $info.is_show_release_time == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" {if $info.is_show_read_num == 1} checked {/if}>
<input type="radio" name="is_show_read_num" value="0" title="不显示" {if $info.is_show_read_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" {if $info.is_show_dianzan_num == 1} checked {/if}>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示" {if $info.is_show_dianzan_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" value="{$info.initial_read_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" value="{$info.initial_dianzan_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" value="{$info.sort}" class="layui-input">
</div>
</div>
<input type="hidden" name="note_id" value="{$info.note_id}"/>
<input type="hidden" name="goods_ids" value="{$info.goods_ids}"/>
<input type="hidden" name="note_type" value="{$info.note_type}"/>
<div class="form-row">
{if $info.status == 1}
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesDrafts()">返回</button>
{else /}
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存</button>
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesDrafts()">返回</button>
{/if}
</div>
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delGoods({{d.LAY_INDEX}})">删除</a>
</div>
</script>
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
<script src="__STATIC__/ext/video/video.min.js"></script>
<script>
var form,upload,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id=[],
repeat_flag = false,
coverType = '{$info.cover_type}',
coverImg = '{$info.cover_img}',
goods_list = {:json_encode($info.goods_list, JSON_UNESCAPED_UNICODE)};
initImg();//初始化图片
function initImg(){
if (coverType == 0){
imageCollection.push(coverImg);
//单图
if (coverImg) $("#img").html("<img src=" + ns.img(coverImg) + " >");
} else if (coverType == 1) {
//多图
var coverImgArr = coverImg.split(','), html = '';
imageCollection = coverImgArr;
for (var i = 0; i < coverImgArr.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(coverImgArr[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").append(html);
}
}
loadVideo(true);
//初始化商品
$.each(goods_list, function(index, item) {
var id = item.goods_id;
selectedGoodsId.push(id);
goods_id.push(id);
});
$("input[name='goods_ids']").val(goods_id.toString());
renderTable(goods_list); // 初始化表格
layui.use(['form'], function() {
form = layui.form;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX)
$("#multiple_uploading").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
var field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
var field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(data)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
data.cover_img = imageCollection.join();
if(data.video_path == ''){
layer.msg('请选择视频!', {icon: 5, anim: 6});
return;
}
if(data.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/edit"),
data: data,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续编辑'],
yes: function(index, layero){
if(data.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
// 表格渲染
function renderTable(goods_list) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
cols: [
[{
field: 'goods_name',
title: '商品名称',
unresize: 'false',
width: '50%'
}, {
field: 'price',
title: '商品价格(元)',
unresize: 'false',
align: 'right',
width: '20%',
templet: function(data) {
return '¥' + data.price;
}
}, {
field: 'goods_stock',
title: '库存',
unresize: 'false',
align: 'center',
width: '20%'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}],
],
data: goods_list,
});
}
// 添加商品
function addGoods(){
goodsSelect(function (data) {
goods_id = [];
goods_list = [];
for (var key in data) {
goods_id.push(data[key].goods_id);
goods_list.push(data[key]);
}
renderTable(goods_list);
$("input[name='goods_ids']").val(goods_id.toString());
selectedGoodsId = goods_id;
},selectedGoodsId, {mode: "spu"});
}
// 删除选中商品
function delGoods(index) {
goods_list.splice(index, 1);
renderTable(goods_list);
selectedGoodsId.splice(index, 1);
goods_id = selectedGoodsId;
$("input[name='goods_ids']").val(goods_id.toString());
}
function backNotesDrafts() {
location.hash = ns.hash("notes://shop/notes/drafts");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
function deleteVideoClass(){
$('#goods_video').removeClass("vjs-error");
}
//删除已选择的视频
function deleteVideo() {
var src = $("input[name='video_path']").val();
if (src != "") {
var video = 'goods_video';
var myPlayer = videojs(video);
videojs(video).ready(function () {
var myPlayer = this;
myPlayer.pause();
});
$("#goods_video_html5_api").attr('src', "");
$(".vjs-modal-dialog-content").hide();
$(".vjs-error-display").hide();
setTimeout("deleteVideoClass()",30 );
$('#goods_video_html5_api').attr('controls', true);
$(".vjs-poster").hide();
$("input[name='video_path']").val('');
}
}
$('body').off('mouseover', '#videoUpload2').on('mouseover', '#videoUpload2', function () {
$(this).addClass('mask');
var src = $('#goods_video_html5_api').attr('src');
if(src) {
$(".delete-video").removeClass('hide');
$(".replace-video").removeClass('hide').removeClass('replace-video2');
} else {
$(".replace-video").removeClass('hide').addClass('replace-video2');
}
});
$('body').off('mouseout', '#videoUpload2').on('mouseout', '#videoUpload2', function () {
$(this).removeClass('mask');
$(".delete-video").addClass('hide');
$(".replace-video").addClass('hide');
});
//添加商品视频
$("body").off("click", ".js-add-goods-video").on("click", ".js-add-goods-video", function () {
openAlbum(function (data) {
if(data.length > 0) {
$("input[name='video_path']").val(data[0]['pic_path']);
loadVideo();
}
}, 1, 0, 'video');
});
/**
* 加载视频
* @param flag 是否暂停
*/
function loadVideo(flag) {
var video_path = $("input[name='video_path']").val();
if (!video_path.length) return;
var video = "goods_video";
var myPlayer = videojs(video);
var value = ns.img(video_path);
videojs(video).ready(function () {
var myPlayer = this;
myPlayer.src(value);
myPlayer.load(value);
myPlayer.play();
// if (flag) {
// setTimeout(function () {
// myPlayer.pause();
// }, 10);
// }
setTimeout(function () {
if (!$(".video-thumb .vjs-error-display").hasClass("vjs-hidden")) {
$("input[name='video_path']").val("");//video.js Line:7873
layer.msg("媒体不能加载,要么是因为服务器或网络失败,要么是因为格式不受支持。");
} else {
}
}, 1000);
});
}
</script>

View File

@@ -0,0 +1,491 @@
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<h2 class="layui-colla-title">操作提示</h2>
<ul class="layui-colla-content layui-show">
<li>管理员可以在此页编辑店铺笔记</li>
</ul>
</div>
</div>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" name="note_title" value="{$info.note_title}" lay-verify="required" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-long" maxlength="100">{$info.note_abstract}</textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type" {if $info.cover_type == 0} checked {/if}>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type" {if $info.cover_type == 1} checked {/if}>
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading {if $info.cover_type != 0}layui-hide{/if}">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="multiple-uploading {if $info.cover_type != 1}layui-hide{/if}">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}" {if $info.group_id == $v.group_id} selected {/if}>{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label">选择商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>笔记内容:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:500px;"></script>
<input type="hidden" name="note_content" id="note_content" value="{$info.note_content}"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" {if $info.is_show_release_time == 1} checked {/if}>
<input type="radio" name="is_show_release_time" value="0" title="不显示" {if $info.is_show_release_time == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" {if $info.is_show_read_num == 1} checked {/if}>
<input type="radio" name="is_show_read_num" value="0" title="不显示" {if $info.is_show_read_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" {if $info.is_show_dianzan_num == 1} checked {/if}>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示" {if $info.is_show_dianzan_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" value="{$info.initial_read_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" value="{$info.initial_dianzan_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" value="{$info.sort}" class="layui-input">
</div>
</div>
<input type="hidden" name="note_id" value="{$info.note_id}" />
<input type="hidden" name="goods_ids" value="{$info.goods_ids}" />
<input type="hidden" name="note_type" value="{$info.note_type}" />
<div class="form-row">
{if $info.status == 1}
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesDrafts()">返回</button>
{else /}
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存</button>
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesDrafts()">返回</button>
{/if}
</div>
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delGoods({{d.LAY_INDEX-1}})">删除</a>
</div>
</script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var form,upload,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id=[],
repeat_flag = false,
coverType = '{$info.cover_type}',
coverImg = '{$info.cover_img}',
goods_list = {:json_encode($info.goods_list, JSON_UNESCAPED_UNICODE)};
initImg();//初始化图片
function initImg(){
if (coverType == 0){
imageCollection.push(coverImg);
//单图
if (coverImg) $("#img").html("<img src=" + ns.img(coverImg) + " >");
} else if (coverType == 1) {
//多图
var coverImgArr = coverImg.split(','),
html = '';
imageCollection = coverImgArr;
for (var i = 0; i < coverImgArr.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(coverImgArr[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").append(html);
}
}
//初始化商品
$.each(goods_list, function(index, item) {
var id = item.goods_id;
selectedGoodsId.push(id);
goods_id.push(id);
});
$("input[name='goods_ids']").val(goods_id.toString());
renderTable(goods_list); // 初始化表格
//实例化富文本
var ue = UE.getEditor('editor');
if($("#note_content").val()){
ue.ready(function() {
ue.setContent($("#note_content").val());
});
}
layui.use(['form'], function() {
form = layui.form;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX)
$("#multiple_uploading").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
var field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
var field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(field)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
field.cover_img = imageCollection.join();
if (!ue.getContent()){
layer.msg("笔记内容不能为空");
return false;
}
if(field.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
field.note_content = ue.getContent();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/edit"),
data: field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续编辑'],
yes: function(index, layero){
if(field.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
// 表格渲染
function renderTable(goods_list) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
cols: [
[{
field: 'goods_name',
title: '商品名称',
unresize: 'false',
width: '50%'
}, {
field: 'price',
title: '商品价格(元)',
unresize: 'false',
align: 'right',
width: '20%',
templet: function(data) {
return '¥' + data.price;
}
}, {
field: 'goods_stock',
title: '库存',
unresize: 'false',
align: 'center',
width: '20%'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}],
],
data: goods_list,
});
}
// 添加商品
function addGoods(){
goodsSelect(function (data) {
goods_id = [];
goods_list = [];
for (var key in data) {
goods_id.push(data[key].goods_id);
goods_list.push(data[key]);
}
renderTable(goods_list);
$("input[name='goods_ids']").val(goods_id.toString());
selectedGoodsId = goods_id;
},selectedGoodsId, {mode: "spu"});
}
// 删除选中商品
function delGoods(index) {
goods_list.splice(index, 1);
renderTable(goods_list);
selectedGoodsId.splice(index, 1);
goods_id = selectedGoodsId;
$("input[name='goods_ids']").val(goods_id.toString());
}
function backNotesDrafts() {
location.hash = ns.hash("notes://shop/notes/drafts");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
</script>

View File

@@ -0,0 +1,568 @@
<style>
.layui-form-selected dl{z-index: 1000;}
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
.multiple-uploading{display: flex;flex-wrap: wrap;}
.multiple-uploading .multiple-item{position: relative;display: flex;justify-content: center;align-items: center;flex-direction: column;margin-bottom: 10px;padding: 10px;width: 100px;height: 100px;border: 1px dashed #ddd;text-align: center;box-sizing: border-box;line-height: 1;color: #5a5a5a;}
.multiple-uploading .multiple-item p{line-height: 20px;margin-top: 5px;}
.multiple-uploading .multiple-item span{display: none;position: absolute;top: -10px;right: -7px;width: 20px;height: 20px;border: 1px solid #999;color: #999;background-color: #fff;border-radius: 50%;line-height: 1;font-size: 18px;cursor: pointer;}
.multiple-uploading .multiple-item:hover .icon{display: block;}
.multiple-uploading .multiple-item ~ .multiple-item{margin-left: 10px;}
.multiple-uploading .iconfont{font-size: 30px;color: #6D7278;}
#multiple_uploading{cursor: pointer;}
.multiple-item img{max-width: 100%;max-height: 100%;}
.form-view .short-label{width:120px}
.form-view .layui-input-block{margin-left:120px}
.form-view .word-aux{margin-left:120px}
.wechat-view{width: 100%;display: flex;}
.content-view{width: 450px;}
.form-view{flex:1;}
.preview-head-div{background:url(STATIC_EXT/diyview/img/preview_head.png) no-repeat 50%/cover;font-size:14px;display:block;height:64px;line-height:82px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer;margin:0 auto}
#title_html{text-align: center;font-size: 16px;font-weight: bold;}
.content-box::-webkit-scrollbar { width: 0 !important }
.content-box { -ms-overflow-style: none; }
.content-box { overflow: -moz-scrollbars-none; }
.pull-disabled-btn{opacity: .6;filter: alpha(opacity=60);color: #fff;}
</style>
<div class="wechat-view">
<div class="content-view" style="padding: 0px 24px;height: 100%;overflow: auto;">
<div style=" border: 1px solid rgb(241, 241, 241);width: 375px;">
<div style="padding: 13px 20px; background: rgb(255, 255, 255); box-shadow: rgb(239, 239, 239) 0px -1px 0px inset;">
<div class="component-title" style="padding-left: 0px; font-size: 14px; font-weight: bold; color: rgba(0, 0, 0, 0.8);">店铺笔记预览</div>
</div>
<div class="preview-head-div" style="background-color: rgb(255, 255, 255); color: rgb(51, 51, 51); text-align: left;"><span style="text-align: left;"> </span></div>
<div>
<h5 id="title_html">{$info.note_title}</h5>
</div>
<div class="content-box" style="padding: 9px 12px;box-sizing: border-box;height: 650px;overflow-x: hidden; overflow-y: auto;">
<div id="content_html">{php}echo $info['note_content'];{/php}</div>
</div>
</div>
</div>
<div class="layui-form form-wrap form-view" style="overflow: auto;background: #fff;position: relative;">
<div class="layui-form-item">
<label class="layui-form-label short-label">文章链接:</label>
<div class="layui-input-inline">
<input type="text" name="note_link" value="{$info.note_link}" autocomplete="off" placeholder="请输入文章链接" class="layui-input len-mid">
</div>
<div class="layui-input-inline">
<button class="layui-btn pull-btn" onclick="pullArticle(this)">获取文章</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记标题:</label>
<div class="layui-input-inline">
<input type="text" value="{$info.note_title}"name="note_title" lay-verify="required" onchange="fetchTitle(this.value)" maxlength="40" autocomplete="off" placeholder="笔记标题最多40个字" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="note_abstract" class="layui-textarea len-mid" maxlength="100">{$info.note_abstract}</textarea>
</div>
<div class="word-aux">笔记摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>封面:</label>
<div class="layui-input-inline">
<input type="radio" name="cover_type" value="0" title="单图" lay-filter="cover_type"{if $info.cover_type == 0} checked{/if}>
<input type="radio" name="cover_type" value="1" title="多图" lay-filter="cover_type"{if $info.cover_type == 1} checked{/if}>
</div>
</div>
<!-- 图片上传 -->
<div class="layui-form-item">
<label class="layui-form-label short-label"></label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading {if $info.cover_type != 0}layui-hide{/if}">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="multiple-uploading {if $info.cover_type != 1}layui-hide{/if}">
<div class="multiple-item" id="multiple_uploading">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
<option value="">请选择</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}" {if $info.group_id == $v.group_id} selected {/if}>{$v['group_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label short-label">关联商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" {if $info.is_show_release_time == 1} checked {/if}>
<input type="radio" name="is_show_release_time" value="0" title="不显示" {if $info.is_show_release_time == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" {if $info.is_show_read_num == 1} checked {/if}>
<input type="radio" name="is_show_read_num" value="0" title="不显示" {if $info.is_show_read_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" {if $info.is_show_dianzan_num == 1} checked {/if}>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示" {if $info.is_show_dianzan_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" value="{$info.initial_read_num}" min="0" name="initial_read_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" value="{$info.initial_dianzan_num}" min="0" name="initial_dianzan_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">排序:</label>
<div class="layui-input-inline">
<input type="number" value="{$info.sort}" min="0" name="sort" class="layui-input">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存至草稿箱</button>
<button class="layui-btn layui-btn-primary" onclick="backNotesList()">返回</button>
</div>
<input type="hidden" name="note_content" value="{$info.note_content}"/>
<input type="hidden" name="goods_ids" value="{$info.goods_ids}" />
<input type="hidden" name="note_type" value="{$info.note_type}" />
<input type="hidden" name="note_id" value="{$info.note_id}" />
</div>
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delGoods({{d.goods_id}})">删除</a>
</div>
</script>
<script>
//实例化富文本
var form,repeat_flag,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
coverType = '{$info.cover_type}',
coverImg = '{$info.cover_img}',
selectedGoodsId = [],
goods_id=[],
goods_list = {:json_encode($info.goods_list, JSON_UNESCAPED_UNICODE)};
initImg();//初始化图片
function initImg(){
if (coverType == 0){
imageCollection.push(coverImg);
//单图
$("#img").html("<img src=" + ns.img(coverImg) + " >");
} else if (coverType == 1) {
//多图
var coverImgArr = coverImg.split(','),
html = '';
imageCollection = coverImgArr;
for (var i = 0; i < coverImgArr.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(coverImgArr[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").append(html);
}
}
//初始化商品
$.each(goods_list, function(index, item) {
var id = item.goods_id;
selectedGoodsId.push(id);
goods_id.push(id);
});
$("input[name='goods_ids']").val(goods_id.toString());
renderTable(goods_list); // 初始化表格
layui.use(['form'], function() {
form = layui.form;
repeat_flag = false;
form.render();
/**
* 图片切换
*/
form.on('radio(cover_type)', function(data){
//0单图 1多图
if (data.value == 0){
if(imageCollection.length) {
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}
$(".simple-uploading").removeClass("layui-hide");
$(".multiple-uploading").addClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 750x420 像素的图片 最多上传1张');
} else{
if(imageCollection.length) {
var html = '';
html += `<div class="multiple-item" id="multiple_uploading">`;
html += `<i class="iconfont iconshangchuan"></i>`;
html += `<p>点击上传</p>`;
html += `</div>`;
for (var i = 0; i < imageCollection.length; i++) {
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(imageCollection[i])}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
$(".multiple-uploading").html(html);
}
$(".simple-uploading").addClass("layui-hide");
$(".multiple-uploading").removeClass("layui-hide");
$(".simple-uploading").parents(".layui-form-item").find('.word-aux').text('推荐使用 350x350 像素的图片最多上传9张');
}
});
/* var upload = new Upload({
elem: '#img',
callback:function (res) {
if (res.code >= 0) {
imageCollection = [];
imageCollection.push(res.data.pic_path)
}
},
deleteCallback:function () {
upload.delete();
imageCollection = [];
}
}); */
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
//多图上传
$("body").off("click","#multiple_uploading").on("click","#multiple_uploading", function () {
var html = '';
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (imageCollection.length < IMAGE_MAX){
imageCollection.push(data[i].pic_path);
html += `<div class="multiple-item">`;
html += `<img src="${ns.img(data[i].pic_path)}" alt="">`;
html += `<span class="icon">x</span>`;
html += `</div>`;
}
}
if (imageCollection.length >= IMAGE_MAX)
$("#multiple_uploading").addClass("layui-hide");
$(".multiple-uploading").append(html);
}, IMAGE_MAX);
});
$("body").off('click', '.multiple-item .icon').on('click', '.multiple-item .icon', function () {
var index = $(this).parent().index() - 1;
imageCollection.splice(index,1);
$(this).parent().remove();
if (imageCollection.length < IMAGE_MAX) $("#multiple_uploading").removeClass("layui-hide");
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
var field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
var field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(data)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
// if (selectedGoodsId.length == 0) {
// layer.msg('请选择参与活动的商品!', {icon: 5, anim: 6});
// return;
// }
if(data.note_content == ''){
layer.msg('请先获取文章信息!', {icon: 5, anim: 6});
return;
}
data.cover_img = imageCollection.join();
var goodsHighlights = [];
$(".lightspot-item").each(function (index,item) {
goodsHighlights.push($(item).find('input').val());
});
data.goods_highlights = goodsHighlights.toString();
if(data.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/edit"),
data: data,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续编辑'],
closeBtn: 0,
yes: function(index, layero){
if(data.status == 0){
location.hash = ns.hash("notes://shop/notes/drafts");
}else{
location.hash = ns.hash("notes://shop/notes/lists");
}
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
// 表格渲
function renderTable(goods_list = []) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
cols: [
[{
field: 'goods_name',
title: '商品名称',
unresize: 'false',
width: '50%'
}, {
field: 'price',
title: '商品价格(元)',
unresize: 'false',
align: 'right',
width: '20%',
templet: function(data) {
return '¥' + data.price;
}
}, {
field: 'goods_stock',
title: '库存',
unresize: 'false',
align: 'center',
width: '20%'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}],
],
data: goods_list
});
}
/* 添加商品 */
function addGoods(){
goodsSelect(function (data) {
goods_id = [];
goods_list = [];
for (var key in data) {
goods_id.push(data[key].goods_id);
goods_list.push(data[key]);
}
renderTable(goods_list);
$("input[name='goods_ids']").val(goods_id.toString());
selectedGoodsId = goods_id;
},selectedGoodsId, {mode: "spu"});
}
// 删除选中商品
function delGoods(id) {
$.each(goods_list, function(index, item) {
var goods_id = item.goods_id;
if (id == Number(goods_id)) {
goods_list.splice(index, 1);
renderTable(goods_list);
}
});
$.each(selectedGoodsId, function(index, item) {
if (id == Number(item)) {
selectedGoodsId.splice(index, 1);
goods_id = selectedGoodsId;
}
});
$("input[name='goods_ids']").val(goods_id.toString());
}
function backNotesList() {
location.hash = ns.hash("notes://shop/notes/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
/**
* 采集公众号文章信息
*/
function pullArticle(self_obj){
if($(self_obj).hasClass('pull-disabled-btn')){
return;
}
var wechat_url = $('input[name=note_link]').val();
if(wechat_url == ''){
layer.msg('文章链接不可为空!', {icon: 5, anim: 6});
return false;
}
$(self_obj).addClass('pull-disabled-btn');
$(self_obj).prepend(`<i class="common-loading-layer layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>`);
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("notes://shop/notes/pullArticle"),
data: {wechat_url:$('input[name=note_link]').val()},
// async: false,
success: function(res){
if (res.code >= 0) {
fetchTitle(res.data.title);
fetchArticle(res.data.content_html);
initPullBtn();
}else{
layer.msg(res.message);
}
}
})
}
function initPullBtn(){
$(".pull-btn").text('获取文章');
$(".pull-btn").removeClass('pull-disabled-btn');
}
//填充标题
function fetchTitle(data){
$('input[name=note_title]').val(data);
$('#title_html').text(data);
}
function fetchArticle(data){
$('input[name=note_content]').val(data);
$("#content_html").html(data);
}
</script>

View File

@@ -0,0 +1,427 @@
<style>
.goods-type{display: flex;justify-content: space-between;}
.goods-type .item-type{display: flex;flex-direction: column;align-items: center;padding: 15px;border: 1px solid #e5e5e5;border-radius: 5px;cursor: pointer;}
.goods-type .item-type ~ .item-type{margin-left: 20px;}
.goods-type .item-img{display: flex;justify-content: center;align-content: center;width: 200px;height: 270px;}
.goods-type .item-img img{max-width: 100%;max-height: 100%;}
.goods-type .item-content{margin-top: 15px;text-align: center;}
.goods-type .item-content .description{margin-top: 10px;font-size: 12px;color: #999;line-height: 1.6;}
.layui-layer-page .layui-layer-content{padding: 30px;}
.layui-table-header{overflow: inherit;}
.layui-table-header .layui-table-cell{overflow: inherit;}
.layui-form-item .layui-form-checkbox[lay-skin=primary] {margin-top: 0;}
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
</style>
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加笔记</button>
</div>
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<h2 class="layui-colla-title">筛选</h2>
<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="note_title" placeholder="请输入笔记名称" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">笔记类型:</label>
<div class="layui-input-inline">
<select name="note_type" lay-filter="status">
<option value="">全部</option>
{foreach $note_type as $v}
<option value="{$v['type']}">{$v['name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-filter="status">
<option value="">全部</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}">{$v['group_name']}</option>
{/foreach}
</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="text" class="layui-input" name="start_time" id="start_time" autocomplete="off" placeholder="开始时间" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" id="end_time" autocomplete="off" placeholder="结束时间" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<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="notes_tab">
<div class="layui-tab-content">
<!-- 列表 -->
<table id="notes_list" lay-filter="notes_list"></table>
</div>
</div>
<!-- 商品 -->
<script type="text/html" id="goods">
<!--<ul class="layui-tab-title">-->
<!--<li class="layui-this" data-status="">全部</li>-->
<!--<li data-status="1">正常</li>-->
<!--<li data-status="2">关闭</li>-->
<!--</ul>-->
<div class="table-title">
<div class="title-pic">
{{# if(d.goods_image){ }}
<img layer-src src="{{ns.img(d.goods_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color" title="{{d.goods_name}}">{{d.goods_name}}</a>
</div>
</div>
</script>
<!-- 时间 -->
<script id="time" type="text/html">
<div class="layui-elip">开始{{ns.time_to_date(d.start_time)}}</div>
<div class="layui-elip">结束{{ns.time_to_date(d.end_time)}}</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="del">删除</a>
{{# if(d.status == 0){ }}
<a class="layui-btn text-color" lay-event="release">发布</a>
{{# }else{ }}
<a class="layui-btn" lay-event="unrelease">取消发布</a>
{{# } }}
</div>
</script>
<!-- 添加笔记 -->
<script type="text/html" id="addNote">
<div class="goods-type">
<div class="item-type" onclick="location.hash = ns.hash('notes://shop/notes/add', {'note_type': 'goods_item'})">
<div class="item-img"><img src="SHOP_IMG/notes/item_introduction.png" alt=""></div>
<div class="item-content">
<p class="name">单品介绍</p>
<p class="description">围绕单个商品的亮点使用心得展开介绍好的介绍将让粉丝购买的欲望大增</p>
</div>
</div>
<div class="item-type" onclick="location.hash = ns.hash('notes://shop/notes/add', {'note_type': 'shop_said'})">
<div class="item-img"><img src="SHOP_IMG/notes/shopkeeper_said.png" alt=""></div>
<div class="item-content">
<p class="name">掌柜说</p>
<p class="description">创作自由度高多种组件灵活编辑优质的笔记更容易使消费者产生购买欲望</p>
</div>
</div>
<!-- <div class="item-type" onclick="location.hash = ns.hash('notes://shop/notes/add', {'note_type': 'article'})">-->
<!-- <div class="item-img"><img src="SHOP_IMG/notes/shopkeeper_said.png" alt=""></div>-->
<!-- <div class="item-content">-->
<!-- <p class="name">种草文章</p>-->
<!-- <p class="description">商家将专题爆款等活动展示在一起提升消费者对活动的参与</p>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="item-type" onclick="location.hash = ns.hash('notes://shop/notes/add', {'note_type': 'wechat_article'})">-->
<!-- <div class="item-img"><img src="SHOP_IMG/notes/shopkeeper_said.png" alt=""></div>-->
<!-- <div class="item-content">-->
<!-- <p class="name">公众号文章</p>-->
<!-- <p class="description">在小程序或者公众号内发布公众号文章打通小程序公众号视频号等微信流量</p>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="item-type" onclick="location.hash = ns.hash('notes://shop/notes/add', {'note_type': 'goods_video'})">-->
<!-- <div class="item-img"><img src="SHOP_IMG/notes/shopkeeper_said.png" alt=""></div>-->
<!-- <div class="item-content">-->
<!-- <p class="name">短视频</p>-->
<!-- <p class="description">快速布局短视频导购提升店铺留存促进商品成交转化</p>-->
<!-- </div>-->
<!-- </div>-->
</div>
</script>
<!-- 排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.note_id}},this)" value="{{d.sort}}" placeholder="请输入排序" class="layui-input edit-sort len-short">
</script>
<script>
var laytpl,table,form,laydate,repeat_flag;
layui.use(['form', 'element','laydate','laytpl'], function() {
form = layui.form;
laytpl = layui.laytpl;
laydate = layui.laydate;
repeat_flag = false; //防重复标识
form.render();
//渲染时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
laydate.render({
elem: '#end_time',
type: 'datetime'
});
table = new Table({
elem: '#notes_list',
url: ns.url("notes://shop/notes/lists"),
where:{
status:1
},
cols: [
[{
field:'note_title',
title: '笔记标题',
unresize: 'false',
width: '15%'
},{
field: 'note_type_name',
title: '笔记类型',
unresize: 'false',
width: '8%'
}, {
field: 'group_name',
title: '所属分组',
unresize: 'false',
width: '10%'
}, {
field: 'read_num',
title: '阅读次数',
unresize: 'false',
width: '8%'
}, {
field: 'dianzan_num',
title: '点赞次数',
unresize: 'false',
width: '8%'
}, {
field: 'sort',
title: '排序',
unresize: 'false',
align: 'left',
sort : true,
width: '10%',
templet:'#editSort'
}, {
title: '创建时间',
unresize: 'false',
width: '13%',
templet:function(data){
return ns.time_to_date(data.create_time);
}
}, {
title: '发布时间',
unresize: 'false',
width: '13%',
templet:function(data){
return ns.time_to_date(data.release_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
width: '15%',
align: 'right',
}]
]
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("notes://shop/notes/edit", {"note_id": data.note_id,"note_type": data.note_type});
break;
case 'del': //删除
deleteNotes(data.note_id);
break;
case 'release': //发布
release(data.note_id);
break;
case 'unrelease': //取消发布
unrelease(data.note_id);
break;
}
});
/**
* 删除
*/
function deleteNotes(note_id) {
layer.confirm('确定要删除该笔记吗?', function(index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("notes://shop/notes/delete"),
data: {
note_id: note_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;
});
}
});
// 监听单元格编辑
function editSort(id, event) {
var data = $(event).val();
if (!new RegExp("^-?[1-9]\\d*$").test(data)) {
layer.msg("排序号只能是整数");
return;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("notes://shop/notes/modifySort"),
data: {
sort: data,
note_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
}
function add() {
var html = $("#addNote").html();
laytpl(html).render({}, function (html) {
layer.open({
type: 1,
title: '选择笔记类型',
area: ['800px'],
//area: ['1300px'],
content: html
});
});
}
$("body").off("mouseenter",".goods-type .item-type").on("mouseenter",".goods-type .item-type",function () {
$(this).addClass("border-color");
});
$("body").off("mouseleave",".goods-type .item-type").on("mouseleave",".goods-type .item-type",function () {
$(this).removeClass("border-color");
});
function release(id){
$.ajax({
type: 'POST',
url: ns.url("notes://shop/notes/releaseEvent"),
data: {
status: 1,
note_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
}
function unrelease(id){
$.ajax({
type: 'POST',
url: ns.url("notes://shop/notes/releaseEvent"),
data: {
status: 0,
note_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
}
</script>

View File

@@ -0,0 +1,274 @@
<style>
.notes-list-layer {padding: 20px;}
</style>
<div class="notes-list-layer">
<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="note_title" placeholder="请输入笔记名称" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">笔记类型:</label>
<div class="layui-input-inline">
<select name="note_type" lay-filter="status">
<option value="">全部</option>
{foreach $note_type as $v}
<option value="{$v['type']}">{$v['name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">笔记分组:</label>
<div class="layui-input-inline">
<select name="group_id" lay-filter="status">
<option value="">全部</option>
{foreach $group_list as $v}
<option value="{$v['group_id']}">{$v['group_name']}</option>
{/foreach}
</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="text" class="layui-input" name="start_time" id="start_time" autocomplete="off" placeholder="开始时间" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" id="end_time" autocomplete="off" placeholder="结束时间" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<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>
<table id="notes_list" lay-filter="notes_list"></table>
</div>
<script type="text/html" id="checkbox">
{{# if($.inArray(d.note_id.toString(), selected_id_arr) != -1){ }}
<input type="checkbox" data-note-id="{{d.note_id}}" name="notes_checkbox" lay-skin="primary" lay-filter="notes_checkbox" checked>
{{# }else{ }}
<input type="checkbox" data-note-id="{{d.note_id}}" name="notes_checkbox" lay-skin="primary" lay-filter="notes_checkbox">
{{# } }}
<input type="hidden" data-note-id="{{d.note_id}}" name="notes_json" value='{{ JSON.stringify(d) }}' />
</script>
<!-- 排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.note_id}},this)" value="{{d.sort}}" placeholder="请输入排序" class="layui-input edit-sort len-short">
</script>
<script>
var laytpl, table, form, laydate,
select_id = localStorage.getItem('note_select_id') || '', // "{$select_id}", //选中商品id
max_num = "{$max_num}", //最大商品数量
min_num = "{$min_num}", //最小商品数量
selected_id_arr = select_id.length ? select_id.split(',') : [],
select_list = [], //选中商品所有数据
notesIdArr = selected_id_arr;
layui.use(['form', 'element', 'laydate', 'laytpl'], function() {
form = layui.form;
laytpl = layui.laytpl;
laydate = layui.laydate;
form.render();
//渲染时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
laydate.render({
elem: '#end_time',
type: 'datetime'
});
table = new Table({
elem: '#notes_list',
url: ns.url("notes://shop/notes/notesSelect"),
where:{
status:1
},
cols: [
[{
unresize: 'false',
width: '8%',
templet: '#checkbox'
}, {
field:'note_title',
title: '笔记标题',
unresize: 'false',
width: '20%'
}, {
field: 'group_name',
title: '所属分组',
unresize: 'false',
width: '15%'
}, {
field: 'read_num',
title: '阅读次数',
unresize: 'false',
width: '10%'
}, {
field: 'dianzan_num',
title: '点赞次数',
unresize: 'false',
width: '10%'
}, {
title: '排序',
unresize: 'false',
align: 'left',
templet:'#editSort',
width: '17%'
}, {
title: '发布时间',
unresize: 'false',
templet:function(data){
return ns.time_to_date(data.create_time);
},
width: '20%'
}]
],
callback: function(res) {
// 更新复选框状态
for (var i=0;i<notesIdArr.length;i++) {
var selected_notes = $("input[name='notes_checkbox'][data-note-id='" + notesIdArr[i] + "']");
if (selected_notes.length) {
$("input[name='notes_checkbox'][data-note-id='" + notesIdArr[i] + "']").prop("checked", true);
}
}
initData();
form.render();
}
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
// 勾选商品
form.on('checkbox(notes_checkbox)', function(data) {
var note_id = $(data.elem).attr("data-note-id"),
json = {};
var dataLen = $("input[name='notes_checkbox'][data-note-id="+ note_id +"]:checked").length;
if (dataLen){
json = JSON.parse($("input[name='notes_json'][data-note-id="+ note_id +"]").val());
delete json.LAY_INDEX;
delete json.LAY_TABLE_INDEX;
delete json.create_time;
select_list.push(json);
notesIdArr.push(note_id);
} else {
var temp = "";
$.each(select_list, function(index, item) {
if (note_id == item.note_id) {
temp = index;
}
})
select_list.splice(temp);
notesIdArr.splice(temp);
}
});
//初始化数据
function initData(){
var dataLen = $("input[name='notes_checkbox'][data-note-id]:checked").length;
//父级
for (var i = 0; i < dataLen; i++){
var noteId = $("input[name='notes_checkbox'][data-note-id]:checked").eq(i).attr("data-note-id");
var ident = false;
for (var k = 0; k < select_list.length; k++){
if(select_list[k].note_id == noteId){
ident = true;
break;
}
}
if (ident) return;
json = JSON.parse($("input[name='notes_json'][data-note-id="+ noteId +"]").val());
delete json.LAY_INDEX;
delete json.LAY_TABLE_INDEX;
delete json.create_time;
select_list.push(json);
}
}
});
// 监听单元格编辑
function editSort(id, event) {
var data = $(event).val();
if (!new RegExp("^-?[1-9]\\d*$").test(data)) {
layer.msg("排序号只能是整数");
return;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("notes://shop/notes/modifySort"),
data: {
sort: data,
note_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
}
function selectNotesListener(callback) {
var res = select_list;
var num = notesIdArr.length;
res = notesIdArr;
if (min_num && min_num > 0 && num < min_num) {
layer.msg("所选数量不能少于" + min_num + '条');
return;
}
callback(res);
}
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB