|
@@ -1,9 +1,9 @@
|
|
|
<!DOCTYPE html>
|
|
<!DOCTYPE html>
|
|
|
-<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
|
|
|
|
|
|
|
+<html lang="zh" xmlns:th="http://www.thymeleaf.org">
|
|
|
<head>
|
|
<head>
|
|
|
- <th:block th:include="include :: header('新增卡种信息')" />
|
|
|
|
|
- <th:block th:include="include :: datetimepicker-css" />
|
|
|
|
|
- <th:block th:include="include :: bootstrap-fileinput-css"/>
|
|
|
|
|
|
|
+ <th:block th:include="include :: header('新增卡种信息')"/>
|
|
|
|
|
+ <th:block th:include="include :: datetimepicker-css"/>
|
|
|
|
|
+ <th:block th:include="include :: image-upload-css"/>
|
|
|
<!-- 自定义 CSS -->
|
|
<!-- 自定义 CSS -->
|
|
|
<style>
|
|
<style>
|
|
|
/* 修改文本域的背景颜色和文字颜色 */
|
|
/* 修改文本域的背景颜色和文字颜色 */
|
|
@@ -14,182 +14,197 @@
|
|
|
</style>
|
|
</style>
|
|
|
</head>
|
|
</head>
|
|
|
<body class="white-bg">
|
|
<body class="white-bg">
|
|
|
- <div class="wrapper wrapper-content animated fadeInRight ibox-content">
|
|
|
|
|
- <form class="form-horizontal m" id="form-information-add">
|
|
|
|
|
- <div class="col-xs-12">
|
|
|
|
|
- <div class="form-group">
|
|
|
|
|
- <label class="col-sm-2 control-label is-required">名称:</label>
|
|
|
|
|
- <div class="col-sm-4">
|
|
|
|
|
- <input name="name" class="form-control" type="text" maxlength="20" required>
|
|
|
|
|
- </div>
|
|
|
|
|
- <label class="col-sm-2 control-label is-required">类型:</label>
|
|
|
|
|
- <div class="col-sm-4">
|
|
|
|
|
- <select name="type" class="form-control" th:with="type=${@dict.getType('site_type')}" required>
|
|
|
|
|
- <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
|
|
|
|
|
- </select>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+<div class="wrapper wrapper-content animated fadeInRight ibox-content">
|
|
|
|
|
+ <form class="form-horizontal m" id="form-information-add">
|
|
|
|
|
+ <div class="col-xs-12">
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label class="col-sm-2 control-label is-required">名称:</label>
|
|
|
|
|
+ <div class="col-sm-4">
|
|
|
|
|
+ <input name="name" class="form-control" type="text" maxlength="20" required>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <label class="col-sm-2 control-label is-required">类型:</label>
|
|
|
|
|
+ <div class="col-sm-4">
|
|
|
|
|
+ <select name="type" class="form-control" th:with="type=${@dict.getType('site_type')}" required>
|
|
|
|
|
+ <option th:each="dict : ${type}" th:text="${dict.dictLabel}"
|
|
|
|
|
+ th:value="${dict.dictValue}"></option>
|
|
|
|
|
+ </select>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="col-xs-12">
|
|
|
|
|
- <div class="form-group">
|
|
|
|
|
- <label class="col-sm-2 control-label is-required">可用次数:</label>
|
|
|
|
|
- <div class="col-sm-4">
|
|
|
|
|
- <input name="totalNumber" class="form-control" type="number" min="0" step="1" maxlength="8" required>
|
|
|
|
|
- </div>
|
|
|
|
|
- <label class="col-sm-2 control-label is-required">原价格:</label>
|
|
|
|
|
- <div class="col-sm-4">
|
|
|
|
|
- <input name="originalPrice" class="form-control" type="number" min="0" step="0.01" maxlength="8" required>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="col-xs-12">
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label class="col-sm-2 control-label is-required">可用次数:</label>
|
|
|
|
|
+ <div class="col-sm-4">
|
|
|
|
|
+ <input name="totalNumber" class="form-control" type="number" min="0" step="1" maxlength="8"
|
|
|
|
|
+ required>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <label class="col-sm-2 control-label is-required">原价格:</label>
|
|
|
|
|
+ <div class="col-sm-4">
|
|
|
|
|
+ <input name="originalPrice" class="form-control" type="number" min="0" step="0.01" maxlength="8"
|
|
|
|
|
+ required>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="col-xs-12">
|
|
|
|
|
- <div class="form-group">
|
|
|
|
|
- <!--<label class="col-sm-2 control-label is-required">会员价格:</label>
|
|
|
|
|
- <div class="col-sm-4">
|
|
|
|
|
- <input name="memberPrice" class="form-control" type="number" min="0" step="0.01" maxlength="8" required>
|
|
|
|
|
- </div>-->
|
|
|
|
|
- <label class="col-sm-2 control-label is-required">单次积分:</label>
|
|
|
|
|
- <div class="col-sm-4">
|
|
|
|
|
- <input name="point" class="form-control" type="number" min="0" step="1" maxlength="8" required>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="col-xs-12">
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <!--<label class="col-sm-2 control-label is-required">会员价格:</label>
|
|
|
|
|
+ <div class="col-sm-4">
|
|
|
|
|
+ <input name="memberPrice" class="form-control" type="number" min="0" step="0.01" maxlength="8" required>
|
|
|
|
|
+ </div>-->
|
|
|
|
|
+ <label class="col-sm-2 control-label is-required">单次积分:</label>
|
|
|
|
|
+ <div class="col-sm-4">
|
|
|
|
|
+ <input name="point" class="form-control" type="number" min="0" step="1" maxlength="8" required>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="col-xs-12">
|
|
|
|
|
- <div class="form-group">
|
|
|
|
|
- <label class="col-sm-2 control-label">使用规则:</label>
|
|
|
|
|
- <div class="col-sm-8">
|
|
|
|
|
- <input name="notes" class="form-control" type="hidden" maxlength="255">
|
|
|
|
|
- <div class="summernote" id = "notes"></div>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="col-xs-12">
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label class="col-sm-2 control-label">使用规则:</label>
|
|
|
|
|
+ <div class="col-sm-8">
|
|
|
|
|
+ <input name="notes" class="form-control" type="hidden" maxlength="255">
|
|
|
|
|
+ <div class="summernote" id="notes"></div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="col-xs-12">
|
|
|
|
|
- <div class="form-group">
|
|
|
|
|
- <label class="col-sm-2 control-label is-required">图片:</label>
|
|
|
|
|
- <div class="col-sm-8">
|
|
|
|
|
- <input type="hidden" name="file">
|
|
|
|
|
- <div class="file-loading">
|
|
|
|
|
- <input class="form-control file-upload" id="file" name="file" type="file">
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="col-xs-12">
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label class="col-sm-2 control-label is-required">图片:</label>
|
|
|
|
|
+ <div class="col-sm-8">
|
|
|
|
|
+ <div id="image-upload-container"></div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- </form>
|
|
|
|
|
- </div>
|
|
|
|
|
- <th:block th:include="include :: footer" />
|
|
|
|
|
- <th:block th:include="include :: datetimepicker-js" />
|
|
|
|
|
- <th:block th:include="include :: summernote-js"/>
|
|
|
|
|
- <th:block th:include="include :: bootstrap-fileinput-js"/>
|
|
|
|
|
- <th:block th:include="include :: summernote-css"/>
|
|
|
|
|
- <script th:inline="javascript">
|
|
|
|
|
- var prefix = ctx + "information"
|
|
|
|
|
- $("#form-information-add").validate({
|
|
|
|
|
- focusCleanup: true,
|
|
|
|
|
- rules: {
|
|
|
|
|
- originalPrice:{
|
|
|
|
|
- required: true, // 必填
|
|
|
|
|
- digits: true, // 必须为整数
|
|
|
|
|
- min: 1 // 最小值为1,确保为正整数
|
|
|
|
|
- },
|
|
|
|
|
- file:{
|
|
|
|
|
- required: true, // 必填
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </form>
|
|
|
|
|
+</div>
|
|
|
|
|
+<th:block th:include="include :: footer"/>
|
|
|
|
|
+<th:block th:include="include :: datetimepicker-js"/>
|
|
|
|
|
+<th:block th:include="include :: summernote-js"/>
|
|
|
|
|
+<th:block th:include="include :: image-upload-js"/>
|
|
|
|
|
+<th:block th:include="include :: summernote-css"/>
|
|
|
|
|
+<script th:inline="javascript">
|
|
|
|
|
+ var prefix = ctx + "information"
|
|
|
|
|
+ $("#form-information-add").validate({
|
|
|
|
|
+ focusCleanup: true,
|
|
|
|
|
+ rules: {
|
|
|
|
|
+ originalPrice: {
|
|
|
|
|
+ required: true, // 必填
|
|
|
|
|
+ digits: true, // 必须为整数
|
|
|
|
|
+ min: 1 // 最小值为1,确保为正整数
|
|
|
},
|
|
},
|
|
|
- messages: {
|
|
|
|
|
- originalPrice: {
|
|
|
|
|
- required: "原价格不能为空",
|
|
|
|
|
- digits: "原价格必须为整数",
|
|
|
|
|
- min: "原价格必须大于0"
|
|
|
|
|
- },
|
|
|
|
|
- file: {
|
|
|
|
|
- required: "图片不能为空",
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ file: {
|
|
|
|
|
+ required: true, // 必填
|
|
|
}
|
|
}
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- function submitHandler() {
|
|
|
|
|
- if ($.validate.form()) {
|
|
|
|
|
- const originalPrice = parseInt(document.getElementsByName("originalPrice")[0].value);
|
|
|
|
|
- // const memberPrice = parseInt(document.getElementsByName("memberPrice")[0].value);
|
|
|
|
|
- // if (memberPrice>originalPrice){
|
|
|
|
|
- // alert("会员价格不能大于原价格")
|
|
|
|
|
- // }else {
|
|
|
|
|
- $.operate.save(prefix + "/add", $('#form-information-add').serialize());
|
|
|
|
|
- // }
|
|
|
|
|
|
|
+ },
|
|
|
|
|
+ messages: {
|
|
|
|
|
+ originalPrice: {
|
|
|
|
|
+ required: "原价格不能为空",
|
|
|
|
|
+ digits: "原价格必须为整数",
|
|
|
|
|
+ min: "原价格必须大于0"
|
|
|
|
|
+ },
|
|
|
|
|
+ file: {
|
|
|
|
|
+ required: "图片不能为空",
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
- $("input[name='expirationDate']").datetimepicker({
|
|
|
|
|
- format: "yyyy-mm-dd",
|
|
|
|
|
- minView: "month",
|
|
|
|
|
- autoclose: true
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ function submitHandler() {
|
|
|
|
|
+ var uploadInstance = $('#image-upload-container').data('imageUpload');
|
|
|
|
|
|
|
|
- $(".file-upload").fileinput({
|
|
|
|
|
- uploadUrl: ctx + 'common/upload',
|
|
|
|
|
- maxFileCount: 1,
|
|
|
|
|
- allowedFileExtensions:['jpg','png'],
|
|
|
|
|
- maxFileSize: 10240,
|
|
|
|
|
- multiple: true,
|
|
|
|
|
- }).on('fileuploaded', function (event, data, previewId, index) {
|
|
|
|
|
- var inputName = event.currentTarget.id;
|
|
|
|
|
- var existingValue = $("input[name='" + inputName + "']").val();
|
|
|
|
|
- var newValue = data.response.url;
|
|
|
|
|
|
|
+ // 检查是否有上传组件实例
|
|
|
|
|
+ if (uploadInstance) {
|
|
|
|
|
+ var uploadedFiles = uploadInstance.getFiles();
|
|
|
|
|
+ console.log('已上传的图片:', uploadedFiles);
|
|
|
|
|
|
|
|
- // 如果已经存在值,则在后面加上逗号分隔的新值
|
|
|
|
|
- if (existingValue) {
|
|
|
|
|
- $("input[name='" + inputName + "']").val(existingValue + ',' + newValue);
|
|
|
|
|
- } else {
|
|
|
|
|
- $("input[name='" + inputName + "']").val(newValue);
|
|
|
|
|
|
|
+ // 如果需要封面必填
|
|
|
|
|
+ if (uploadedFiles.length === 0) {
|
|
|
|
|
+ $.modal.alertWarning("请上传封面图片");
|
|
|
|
|
+ return false;
|
|
|
}
|
|
}
|
|
|
- }).on('fileremoved', function (event, id, index) {
|
|
|
|
|
- var inputName = event.currentTarget.id;
|
|
|
|
|
- var existingValue = $("input[name='" + inputName + "']").val();
|
|
|
|
|
- var fileUrls = existingValue.split(',');
|
|
|
|
|
|
|
|
|
|
- // 移除对应的文件路径
|
|
|
|
|
- fileUrls.splice(index, 1);
|
|
|
|
|
|
|
+ // 将图片URL数组转换为逗号分隔的字符串
|
|
|
|
|
+ var imageUrls = uploadedFiles.join(',');
|
|
|
|
|
+ console.log('图片URL字符串:', imageUrls);
|
|
|
|
|
|
|
|
- // 重新拼接文件路径
|
|
|
|
|
- $("input[name='" + inputName + "']").val(fileUrls.join(','));
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ // 注意:图片上传组件已经通过 addHiddenField 方法添加了隐藏字段
|
|
|
|
|
+ // 我们不需要再次添加,只需要确保所有图片都已被收集
|
|
|
|
|
+ // 组件会自动处理隐藏字段
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 如果没有上传组件实例,直接检查是否有隐藏字段
|
|
|
|
|
+ var existingImages = $('#form-competition-add input[name="competitionImg"]').map(function() {
|
|
|
|
|
+ return $(this).val();
|
|
|
|
|
+ }).get().filter(function(val) {
|
|
|
|
|
+ return val && val.trim() !== '';
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ if (existingImages.length === 0) {
|
|
|
|
|
+ $.modal.alertWarning("请上传封面图片");
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if ($.validate.form()) {
|
|
|
|
|
+ const originalPrice = parseInt(document.getElementsByName("originalPrice")[0].value);
|
|
|
|
|
+ // const memberPrice = parseInt(document.getElementsByName("memberPrice")[0].value);
|
|
|
|
|
+ // if (memberPrice>originalPrice){
|
|
|
|
|
+ // alert("会员价格不能大于原价格")
|
|
|
|
|
+ // }else {
|
|
|
|
|
+ $.operate.save(prefix + "/add", $('#form-information-add').serialize());
|
|
|
|
|
+ // }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $("input[name='expirationDate']").datetimepicker({
|
|
|
|
|
+ format: "yyyy-mm-dd",
|
|
|
|
|
+ minView: "month",
|
|
|
|
|
+ autoclose: true
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
- $(function () {
|
|
|
|
|
- $('.summernote').summernote({
|
|
|
|
|
- lang: 'zh-CN',
|
|
|
|
|
- dialogsInBody: true,
|
|
|
|
|
- height: 150,
|
|
|
|
|
- callbacks: {
|
|
|
|
|
- onChange: function (contents, $edittable) {
|
|
|
|
|
- $("input[name='" + this.id + "']").val(contents);
|
|
|
|
|
- },
|
|
|
|
|
- onImageUpload: function (files) {
|
|
|
|
|
- var obj = this;
|
|
|
|
|
- var data = new FormData();
|
|
|
|
|
- data.append("file", files[0]);
|
|
|
|
|
- $.ajax({
|
|
|
|
|
- type: "post",
|
|
|
|
|
- url: ctx + "common/upload",
|
|
|
|
|
- data: data,
|
|
|
|
|
- cache: false,
|
|
|
|
|
- contentType: false,
|
|
|
|
|
- processData: false,
|
|
|
|
|
- dataType: 'json',
|
|
|
|
|
- success: function (result) {
|
|
|
|
|
- if (result.code == web_status.SUCCESS) {
|
|
|
|
|
- $('#' + obj.id).summernote('insertImage', result.url);
|
|
|
|
|
- } else {
|
|
|
|
|
- $.modal.alertError(result.msg);
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- error: function (error) {
|
|
|
|
|
- $.modal.alertWarning("图片上传失败。");
|
|
|
|
|
|
|
+
|
|
|
|
|
+ $(function () {
|
|
|
|
|
+ $('.summernote').summernote({
|
|
|
|
|
+ lang: 'zh-CN',
|
|
|
|
|
+ dialogsInBody: true,
|
|
|
|
|
+ height: 150,
|
|
|
|
|
+ callbacks: {
|
|
|
|
|
+ onChange: function (contents, $edittable) {
|
|
|
|
|
+ $("input[name='" + this.id + "']").val(contents);
|
|
|
|
|
+ },
|
|
|
|
|
+ onImageUpload: function (files) {
|
|
|
|
|
+ var obj = this;
|
|
|
|
|
+ var data = new FormData();
|
|
|
|
|
+ data.append("file", files[0]);
|
|
|
|
|
+ $.ajax({
|
|
|
|
|
+ type: "post",
|
|
|
|
|
+ url: ctx + "common/upload",
|
|
|
|
|
+ data: data,
|
|
|
|
|
+ cache: false,
|
|
|
|
|
+ contentType: false,
|
|
|
|
|
+ processData: false,
|
|
|
|
|
+ dataType: 'json',
|
|
|
|
|
+ success: function (result) {
|
|
|
|
|
+ if (result.code == web_status.SUCCESS) {
|
|
|
|
|
+ $('#' + obj.id).summernote('insertImage', result.url);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $.modal.alertError(result.msg);
|
|
|
}
|
|
}
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ },
|
|
|
|
|
+ error: function (error) {
|
|
|
|
|
+ $.modal.alertWarning("图片上传失败。");
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
- });
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ // 初始化图片上传组件
|
|
|
|
|
+ $('#image-upload-container').imageUpload({
|
|
|
|
|
+ uploadUrl: ctx + "common/upload",
|
|
|
|
|
+ maxFiles: 1,
|
|
|
|
|
+ maxSize: 5 * 1024 * 1024,
|
|
|
|
|
+ allowedTypes: ['image/jpeg', 'image/png'],
|
|
|
|
|
+ previewWidth: 200,
|
|
|
|
|
+ previewHeight: 150,
|
|
|
|
|
+ inputName: 'file'
|
|
|
});
|
|
});
|
|
|
- </script>
|
|
|
|
|
|
|
+ });
|
|
|
|
|
+</script>
|
|
|
</body>
|
|
</body>
|
|
|
</html>
|
|
</html>
|