| | |
| | | @layout("/common/_container.html"){ |
| | | <style>.app-guide-section{margin-bottom:25px}.qr{width:90px;height:90px}.table td{vertical-align:middle}</style> |
| | | <div class="row"><div class="col-sm-12"><div class="ibox float-e-margins"><div class="ibox-title"><h5>APP 下载引导与场地订场二维码</h5></div><div class="ibox-content"> |
| | | <div class="app-guide-section"><h4>下载配置</h4><form id="configForm" class="form-inline"> |
| | | <input type="hidden" name="id" id="configId"><p><input class="form-control" name="appName" placeholder="APP 名称"> <input class="form-control" name="androidPackage" placeholder="Android 包名,例如 com.sinata.wepark"> <input class="form-control" name="iosPackage" placeholder="iOS 包名,例如 com.sinata.wepark"></p> |
| | | <p><input class="form-control" name="iosStoreUrl" style="width:350px" placeholder="iOS App Store 地址"> <input class="form-control" name="apkUrl" style="width:350px" placeholder="APK 下载地址"></p> |
| | | <p><input class="form-control" name="androidDeepLink" style="width:350px" placeholder="Android Deep Link"> <input class="form-control" name="iosDeepLink" style="width:350px" placeholder="iOS Deep Link"></p> |
| | | <div class="app-guide-section"><h4>APP 下载链接</h4><form id="configForm" class="form-inline"> |
| | | <input type="hidden" name="id" id="configId"><p><input class="form-control" name="apkUrl" style="width:350px" placeholder="Android 下载链接"> <input class="form-control" name="iosStoreUrl" style="width:350px" placeholder="iOS 下载链接"></p> |
| | | <button type="button" class="btn btn-primary" onclick="saveConfig()">保存下载配置</button></form></div> |
| | | <hr><div class="app-guide-section"><h4>宣传图</h4><form class="form-inline"><input id="bannerFile" type="file" accept="image/*" class="form-control"><input id="bannerUrl" type="hidden"><button type="button" class="btn btn-default" onclick="uploadBanner()">上传图片</button><input id="bannerTitle" class="form-control" placeholder="标题(可选)"><input id="bannerSort" class="form-control" style="width:100px" placeholder="排序"><button type="button" class="btn btn-primary" onclick="addBanner()">添加</button></form><p id="uploadTip" class="text-muted"></p><table class="table table-bordered"><thead><tr><th>预览</th><th>标题</th><th>排序</th><th>状态</th><th>操作</th></tr></thead><tbody id="bannerRows"></tbody></table></div> |
| | | <hr><div class="app-guide-section"><h4>场地订场二维码</h4><p class="text-muted">从现有场地管理数据中选择,每个场地仅允许一个启用二维码。</p><form class="form-inline"><select id="siteSelect" class="form-control" style="min-width:360px"><option value="">请选择场地</option></select><input id="pageName" class="form-control" style="width:360px" placeholder="App页面,例如 com.sinata.wepark.ui.home.PlaceDetailActivity"><input id="channel" class="form-control" placeholder="渠道(可选)"><button type="button" class="btn btn-primary" onclick="createQr()">生成二维码</button></form><table class="table table-bordered"><thead><tr><th>名称</th><th>App页面</th><th>门店/场地</th><th>二维码</th><th>引导链接</th><th>状态</th><th>操作</th></tr></thead><tbody id="linkRows"></tbody></table></div> |
| | | <hr><div class="app-guide-section"><h4>场地订场二维码</h4><p class="text-muted">从现有场地管理数据中选择,每个场地仅允许一个启用二维码。</p><form class="form-inline"><select id="siteSelect" class="form-control" style="min-width:360px"><option value="">请选择场地</option></select><input id="pageName" class="form-control" style="width:360px" value="com.sinata.wepark.ui.home.PlaceDetailActivity" placeholder="App页面"><input id="channel" class="form-control" placeholder="渠道(可选)"><button type="button" class="btn btn-primary" onclick="createQr()">生成二维码</button></form><table class="table table-bordered"><thead><tr><th>名称</th><th>App页面</th><th>门店/场地</th><th>二维码</th><th>引导链接</th><th>状态</th><th>操作</th></tr></thead><tbody id="linkRows"></tbody></table></div> |
| | | </div></div></div></div> |
| | | <script src="${ctxPath}/modular/system/appGuide/appGuide.js"></script> |
| | | @} |
| | |
| | | (function(){ |
| | | function esc(v){return $('<div>').text(v==null?'':v).html()} function val(n,v){$('#configForm [name='+n+']').val(v==null?'':v)} |
| | | window.reloadAppGuide=function(){ $.get(Feng.ctxPath+'/appGuide/data',function(d){var c=d.config||{};['id','appName','androidPackage','iosPackage','iosStoreUrl','apkUrl','androidDeepLink','iosDeepLink'].forEach(function(k){val(k,c[k])});$('#bannerRows').html((d.banners||[]).map(function(x){return '<tr><td><img class="qr" src="'+esc(x.imageUrl)+'"></td><td>'+esc(x.title)+'</td><td>'+esc(x.sort)+'</td><td>'+((x.enabled===1)?'启用':'停用')+'</td><td><button class="btn btn-danger btn-xs" onclick="deleteBanner(\''+x.id+'\')">删除</button></td></tr>'}).join(''));$('#linkRows').html((d.links||[]).map(function(x){var id=String(x.id),q=Feng.ctxPath+'/appGuide/siteQr/'+encodeURIComponent(id)+'.png';return '<tr><td>'+esc(x.name)+'</td><td>'+esc(x.pageName)+'</td><td>'+x.storeId+' / '+x.siteId+'</td><td><a href="'+q+'" target="_blank"><img class="qr" src="'+q+'"></a></td><td><code>'+esc(x.guideUrl)+'</code></td><td>'+((x.enabled===1)?'启用':'停用')+'</td><td><button class="btn btn-warning btn-xs" onclick="changeQr(\''+id+'\','+(x.enabled===1?0:1)+')">'+(x.enabled===1?'停用':'启用')+'</button> <button class="btn btn-danger btn-xs" onclick="deleteQr(\''+id+'\')">删除</button></td></tr>'}).join(''))})}; |
| | | window.reloadAppGuide=function(){ $.get(Feng.ctxPath+'/appGuide/data',function(d){var c=d.config||{};['id','apkUrl','iosStoreUrl'].forEach(function(k){val(k,c[k])});$('#bannerRows').html((d.banners||[]).map(function(x){return '<tr><td><img class="qr" src="'+esc(x.imageUrl)+'"></td><td>'+esc(x.title)+'</td><td>'+esc(x.sort)+'</td><td>'+((x.enabled===1)?'启用':'停用')+'</td><td><button class="btn btn-danger btn-xs" onclick="deleteBanner(\''+x.id+'\')">删除</button></td></tr>'}).join(''));$('#linkRows').html((d.links||[]).map(function(x){var id=String(x.id),q=Feng.ctxPath+'/appGuide/siteQr/'+encodeURIComponent(id)+'.png';return '<tr><td>'+esc(x.name)+'</td><td>'+esc(x.pageName)+'</td><td>'+x.storeId+' / '+x.siteId+'</td><td><a href="'+q+'" target="_blank"><img class="qr" src="'+q+'"></a></td><td><code>'+esc(x.guideUrl)+'</code></td><td>'+((x.enabled===1)?'启用':'停用')+'</td><td><button class="btn btn-warning btn-xs" onclick="changeQr(\''+id+'\','+(x.enabled===1?0:1)+')">'+(x.enabled===1?'停用':'启用')+'</button> <button class="btn btn-danger btn-xs" onclick="deleteQr(\''+id+'\')">删除</button></td></tr>'}).join(''))})}; |
| | | window.saveConfig=function(){$.post(Feng.ctxPath+'/appGuide/config',$('#configForm').serialize(),function(){Feng.success('保存成功');reloadAppGuide()})}; |
| | | window.uploadBanner=function(){var f=$('#bannerFile')[0].files[0];if(!f){Feng.info('请选择图片');return}var d=new FormData();d.append('file',f);$.ajax({url:Feng.ctxPath+'/mgr/uploadFile',data:d,type:'POST',contentType:false,processData:false,success:function(url){$('#bannerUrl').val(url);$('#uploadTip').text('上传成功')}})}; |
| | | window.addBanner=function(){if(!$('#bannerUrl').val()){Feng.info('请先上传图片');return}$.post(Feng.ctxPath+'/appGuide/banner',{imageUrl:$('#bannerUrl').val(),title:$('#bannerTitle').val(),sort:$('#bannerSort').val()||0,enabled:1},function(){reloadAppGuide();$('#bannerUrl,#bannerTitle,#bannerSort,#bannerFile').val('')})}; |
| | |
| | | import com.dsh.other.util.TokenUtil; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | |
| | | QrLink link = validLink(code); |
| | | if (code != null && !code.isEmpty() && link == null) return ResultUtil.error("二维码无效或已失效"); |
| | | Map<String, Object> data = new HashMap<>(); |
| | | data.put("appName", config.getAppName()); |
| | | data.put("androidPackage", config.getAndroidPackage()); |
| | | data.put("iosPackage", config.getIosPackage()); |
| | | data.put("appName", StringUtils.isNotBlank(config.getAppName()) ? config.getAppName() : "玩湃生活"); |
| | | data.put("androidPackage", StringUtils.isNotBlank(config.getAndroidPackage()) ? config.getAndroidPackage() : "com.sinata.wepark"); |
| | | data.put("iosPackage", StringUtils.isNotBlank(config.getIosPackage()) ? config.getIosPackage() : "com.sinata.WeParkLife"); |
| | | data.put("iosStoreUrl", config.getIosStoreUrl()); |
| | | data.put("apkUrl", config.getApkUrl()); |
| | | data.put("androidDeepLink", config.getAndroidDeepLink()); |
| | | data.put("iosDeepLink", config.getIosDeepLink()); |
| | | data.put("androidDeepLink", config.getAndroidDeepLink() + (StringUtils.isNotBlank(code) ? "?route=" + code : "")); |
| | | data.put("iosDeepLink", config.getIosDeepLink() + (StringUtils.isNotBlank(code) ? "/" + code : "")); |
| | | data.put("banners", appGuideBannerMapper.selectList(new QueryWrapper<AppGuideBanner>() |
| | | .eq("enabled", EnableStatusEnum.ENABLED.getCode()).orderByAsc("sort").orderByDesc("id"))); |
| | | // if (link != null) data.put("target", target(link)); |