Bläddra i källkod

修改 活动后台修改查看签到列表和查看报名列表

huZhiHao 6 år sedan
förälder
incheckning
178ce5a9cb
22 ändrade filer med 3424 tillägg och 9 borttagningar
  1. 401 0
      src/main/java/platform/common/util/StringUtils.java
  2. 84 0
      src/main/java/platform/common/util/WechatDecoderUtil.java
  3. 111 0
      src/main/java/platform/common/util/WxAppUtil.java
  4. 89 0
      src/main/java/platform/common/util/text/CharsetKit.java
  5. 1002 0
      src/main/java/platform/common/util/text/Convert.java
  6. 93 0
      src/main/java/platform/common/util/text/StrFormatter.java
  7. 11 1
      src/main/java/platform/modules/api/web/ActivityOpenController.java
  8. 2 2
      src/main/java/platform/modules/home/HomeController.java
  9. 16 0
      src/main/java/platform/modules/home/dto/wxapp/WxAccessTokenCacheData.java
  10. 17 0
      src/main/java/platform/modules/home/dto/wxapp/WxAppLoginRet.java
  11. 63 0
      src/main/java/platform/modules/home/service/WxMicroappService.java
  12. 1 0
      src/main/resources/mapper/sys/ActivityDetailDao.xml
  13. 19 1
      src/main/resources/mapper/sys/ActivityRegistrationDao.xml
  14. BIN
      src/main/resources/static/img/btn.png
  15. BIN
      src/main/resources/static/img/marker10.png
  16. BIN
      src/main/resources/static/img/marker_n.png
  17. 8 5
      src/main/resources/templates/admin/government/activity_detail.html
  18. 47 0
      src/main/resources/templates/admin/government/activity_qrcode.html
  19. BIN
      src/main/resources/templates/admin/government/map_component/img/btn.png
  20. BIN
      src/main/resources/templates/admin/government/map_component/img/marker10.png
  21. BIN
      src/main/resources/templates/admin/government/map_component/img/marker_n.png
  22. 1460 0
      src/main/resources/templates/admin/government/map_component/map.html

+ 401 - 0
src/main/java/platform/common/util/StringUtils.java

@@ -0,0 +1,401 @@
+package platform.common.util;
+
+
+
+import platform.common.util.text.StrFormatter;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * 字符串工具类
+ * 
+ * @author ruoyi
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils
+{
+    /** 空字符串 */
+    private static final String NULLSTR = "";
+
+    /** 下划线 */
+    private static final char SEPARATOR = '_';
+
+    /**
+     * 获取参数不为空值
+     * 
+     * @param value defaultValue 要判断的value
+     * @return value 返回值
+     */
+    public static <T> T nvl(T value, T defaultValue)
+    {
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * * 判断一个Collection是否为空, 包含List,Set,Queue
+     * 
+     * @param coll 要判断的Collection
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Collection<?> coll)
+    {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 判断一个Collection是否非空,包含List,Set,Queue
+     * 
+     * @param coll 要判断的Collection
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Collection<?> coll)
+    {
+        return !isEmpty(coll);
+    }
+
+    /**
+     * * 判断一个对象数组是否为空
+     * 
+     * @param objects 要判断的对象数组
+     ** @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Object[] objects)
+    {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 判断一个对象数组是否非空
+     * 
+     * @param objects 要判断的对象数组
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Object[] objects)
+    {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     * 
+     * @param map 要判断的Map
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Map<?, ?> map)
+    {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     * 
+     * @param map 要判断的Map
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Map<?, ?> map)
+    {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 判断一个字符串是否为空串
+     * 
+     * @param str String
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(String str)
+    {
+        return isNull(str) || NULLSTR.equals(str.trim());
+    }
+
+    /**
+     * * 判断一个字符串是否为非空串
+     * 
+     * @param str String
+     * @return true:非空串 false:空串
+     */
+    public static boolean isNotEmpty(String str)
+    {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 判断一个对象是否为空
+     * 
+     * @param object Object
+     * @return true:为空 false:非空
+     */
+    public static boolean isNull(Object object)
+    {
+        return object == null;
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     * 
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object)
+    {
+        return !isNull(object);
+    }
+
+    /**
+     * * 判断一个对象是否是数组类型(Java基本型别的数组)
+     * 
+     * @param object 对象
+     * @return true:是数组 false:不是数组
+     */
+    public static boolean isArray(Object object)
+    {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 去空格
+     */
+    public static String trim(String str)
+    {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 截取字符串
+     * 
+     * @param str 字符串
+     * @param start 开始
+     * @return 结果
+     */
+    public static String substring(final String str, int start)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (start > str.length())
+        {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 截取字符串
+     * 
+     * @param str 字符串
+     * @param start 开始
+     * @param end 结束
+     * @return 结果
+     */
+    public static String substring(final String str, int start, int end)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (end < 0)
+        {
+            end = str.length() + end;
+        }
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (end > str.length())
+        {
+            end = str.length();
+        }
+
+        if (start > end)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (end < 0)
+        {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 格式化文本, {} 表示占位符<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param template 文本模板,被替换的部分用 {} 表示
+     * @param params 参数值
+     * @return 格式化后的文本
+     */
+    public static String format(String template, Object... params)
+    {
+        if (isEmpty(params) || isEmpty(template))
+        {
+            return template;
+        }
+        return StrFormatter.format(template, params);
+    }
+
+    /**
+     * 下划线转驼峰命名
+     */
+    public static String toUnderScoreCase(String str)
+    {
+        if (str == null)
+        {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 前置字符是否大写
+        boolean preCharIsUpperCase = true;
+        // 当前字符是否大写
+        boolean curreCharIsUpperCase = true;
+        // 下一字符是否大写
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++)
+        {
+            char c = str.charAt(i);
+            if (i > 0)
+            {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            }
+            else
+            {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1))
+            {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 是否包含字符串
+     * 
+     * @param str 验证字符串
+     * @param strs 字符串组
+     * @return 包含返回true
+     */
+    public static boolean inStringIgnoreCase(String str, String... strs)
+    {
+        if (str != null && strs != null)
+        {
+            for (String s : strs)
+            {
+                if (str.equalsIgnoreCase(trim(s)))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
+     * 
+     * @param name 转换前的下划线大写方式命名的字符串
+     * @return 转换后的驼峰式命名的字符串
+     */
+    public static String convertToCamelCase(String name)
+    {
+        StringBuilder result = new StringBuilder();
+        // 快速检查
+        if (name == null || name.isEmpty())
+        {
+            // 没必要转换
+            return "";
+        }
+        else if (!name.contains("_"))
+        {
+            // 不含下划线,仅将首字母大写
+            return name.substring(0, 1).toUpperCase() + name.substring(1);
+        }
+        // 用下划线将原始字符串分割
+        String[] camels = name.split("_");
+        for (String camel : camels)
+        {
+            // 跳过原始字符串中开头、结尾的下换线或双重下划线
+            if (camel.isEmpty())
+            {
+                continue;
+            }
+            // 首字母大写
+            result.append(camel.substring(0, 1).toUpperCase());
+            result.append(camel.substring(1).toLowerCase());
+        }
+        return result.toString();
+    }
+
+    /**
+     * 驼峰式命名法 例如:user_name->userName
+     */
+    public static String toCamelCase(String s)
+    {
+        if (s == null)
+        {
+            return null;
+        }
+        s = s.toLowerCase();
+        StringBuilder sb = new StringBuilder(s.length());
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++)
+        {
+            char c = s.charAt(i);
+
+            if (c == SEPARATOR)
+            {
+                upperCase = true;
+            }
+            else if (upperCase)
+            {
+                sb.append(Character.toUpperCase(c));
+                upperCase = false;
+            }
+            else
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+}

+ 84 - 0
src/main/java/platform/common/util/WechatDecoderUtil.java

@@ -0,0 +1,84 @@
+package platform.common.util;
+
+import com.alibaba.fastjson.JSONObject;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.util.encoders.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.Base64Utils;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.*;
+import java.security.spec.InvalidParameterSpecException;
+import java.util.Arrays;
+
+public class WechatDecoderUtil {
+    //日志记录器
+    private static final Logger log = LoggerFactory.getLogger(WechatDecoderUtil.class);
+
+    /**
+     * 解密用户敏感数据获取用户信息
+     *
+     * @param sessionKey    数据进行加密签名的密钥
+     * @param encryptedData 包括敏感数据在内的完整用户信息的加密数据
+     * @param iv            加密算法的初始向量
+     * @return
+     */
+    public static JSONObject getInfo(String encryptedData, String sessionKey, String iv) {
+        // 被加密的数据
+        byte[] dataByte = Base64Utils.decode(encryptedData.getBytes());
+        // 加密秘钥
+        byte[] keyByte = Base64Utils.decode(sessionKey.getBytes());
+        // 偏移量
+        byte[] ivByte = Base64Utils.decode(iv.getBytes());
+        try {
+
+            // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
+            int base = 16;
+            if (keyByte.length % base != 0) {
+                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
+                byte[] temp = new byte[groups * base];
+                Arrays.fill(temp, (byte) 0);
+                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
+                keyByte = temp;
+            }
+            // 初始化
+            Security.addProvider(new BouncyCastleProvider());
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
+            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
+            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
+            parameters.init(new IvParameterSpec(ivByte));
+            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
+            byte[] resultByte = cipher.doFinal(dataByte);
+            if (null != resultByte && resultByte.length > 0) {
+                String result = new String(resultByte, "UTF-8");
+                return JSONObject.parseObject(result);
+            }
+        } catch (NoSuchAlgorithmException e) {
+            log.error(e.getMessage(), e);
+        } catch (NoSuchPaddingException e) {
+            log.error(e.getMessage(), e);
+        } catch (InvalidParameterSpecException e) {
+            log.error(e.getMessage(), e);
+        } catch (IllegalBlockSizeException e) {
+            log.error(e.getMessage(), e);
+        } catch (BadPaddingException e) {
+            log.error(e.getMessage(), e);
+        } catch (UnsupportedEncodingException e) {
+            log.error(e.getMessage(), e);
+        } catch (InvalidKeyException e) {
+            log.error(e.getMessage(), e);
+        } catch (InvalidAlgorithmParameterException e) {
+            log.error(e.getMessage(), e);
+        } catch (NoSuchProviderException e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+}

+ 111 - 0
src/main/java/platform/common/util/WxAppUtil.java

@@ -0,0 +1,111 @@
+package platform.common.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xiaoleilu.hutool.http.HttpUtil;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.protocol.HTTP;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 微信小程序的工具类
+ */
+public class WxAppUtil {
+    // 获取openid的链接
+    public static final String CODE2_SESSION_URL_STRING = "https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code";
+
+    // 获取access_token
+    public static final String ACCESS_TOKEN_URL_STRING = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}";
+
+    // 获取图片地址
+    public static final String CREATE_QRCODE_URL_STRING = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token={}";
+    public static final String GET_QRCODE_URL_STRING = "https://api.weixin.qq.com/wxa/getwxacode?access_token={}";
+    public static final String GET_UNLIMITED_QRCODE_URL_STRING = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={}";
+
+
+    public static final String SESSION_KEY = "session_key";
+
+    // 获取完整获取openid的接口url
+    public static String getCode2SessionURLString(String appid, String appsecret, String code) {
+        return StringUtils.format(CODE2_SESSION_URL_STRING, appid, appsecret, code);
+    }
+
+    // 获取access_token接口返回
+    public static String getAccessToken(String appid, String appSecret) {
+        String realURLString = StringUtils.format(ACCESS_TOKEN_URL_STRING, appid, appSecret);
+        return HttpUtil.get(realURLString);
+    }
+
+    public static String getSessionKey(String appid, String appsecret, String code) {
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtil.get(getCode2SessionURLString(appid, appsecret, code)));
+        System.out.println("appid = " + appid);
+        System.out.println("appsecret = " + appsecret);
+        System.out.println("code = " + code);
+        System.out.println(jsonObject.toString());
+        if (jsonObject.containsKey(SESSION_KEY)) {
+            return (String) jsonObject.get(SESSION_KEY);
+        }
+        return null;
+    }
+
+    /**
+     * 创建二维码
+     *
+     * @param accessToken
+     */
+    public static InputStream createQRCode(String accessToken, String path, String width) throws IOException {
+        Map<String, Object> params = new HashMap<>();
+        params.put("path", path);
+        params.put("width", width);
+        return getInputStreamFromUrl(CREATE_QRCODE_URL_STRING, params, accessToken);
+    }
+
+    public static InputStream getQRCode(String accessToken, String path, String width) throws IOException {
+        Map<String, Object> params = new HashMap<>();
+        params.put("path", path);
+        params.put("width", width);
+
+        return getInputStreamFromUrl(GET_QRCODE_URL_STRING, params, accessToken);
+    }
+
+    public static InputStream getUnlimitedQRCode(String accessToken, String path, String width, String scene) throws IOException {
+        Map<String, Object> params = new HashMap<>();
+        params.put("page", path);
+        params.put("width", width);
+        params.put("scene", scene);
+
+        return getInputStreamFromUrl(GET_UNLIMITED_QRCODE_URL_STRING, params, accessToken);
+
+    }
+
+    private static InputStream getInputStreamFromUrl(String not_parsed_url, Map params, String accessToken) throws IOException {
+        String url = StringUtils.format(not_parsed_url, accessToken);
+
+        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+
+        HttpPost httpPost = new HttpPost(url);  // 接口
+        httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
+        String body = JSON.toJSONString(params);           //必须是json模式的 post
+        StringEntity entity;
+        entity = new StringEntity(body);
+        entity.setContentType("image/png");
+
+        httpPost.setEntity(entity);
+        HttpResponse response;
+
+        response = httpClient.execute(httpPost);
+        InputStream inputStream = response.getEntity().getContent();
+        return inputStream;
+    }
+
+
+}

+ 89 - 0
src/main/java/platform/common/util/text/CharsetKit.java

@@ -0,0 +1,89 @@
+package platform.common.util.text;
+
+
+
+import platform.common.util.StringUtils;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 字符集工具类
+ * 
+ * @author ruoyi
+ */
+public class CharsetKit
+{
+    /** ISO-8859-1 */
+    public static final String ISO_8859_1 = "ISO-8859-1";
+    /** UTF-8 */
+    public static final String UTF_8 = "UTF-8";
+    /** GBK */
+    public static final String GBK = "GBK";
+
+    /** ISO-8859-1 */
+    public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
+    /** UTF-8 */
+    public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
+    /** GBK */
+    public static final Charset CHARSET_GBK = Charset.forName(GBK);
+
+    /**
+     * 转换为Charset对象
+     * 
+     * @param charset 字符集,为空则返回默认字符集
+     * @return Charset
+     */
+    public static Charset charset(String charset)
+    {
+        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     * 
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, String srcCharset, String destCharset)
+    {
+        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     * 
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, Charset srcCharset, Charset destCharset)
+    {
+        if (null == srcCharset)
+        {
+            srcCharset = StandardCharsets.ISO_8859_1;
+        }
+
+        if (null == destCharset)
+        {
+            srcCharset = StandardCharsets.UTF_8;
+        }
+
+        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
+        {
+            return source;
+        }
+        return new String(source.getBytes(srcCharset), destCharset);
+    }
+
+    /**
+     * @return 系统字符集编码
+     */
+    public static String systemCharset()
+    {
+        return Charset.defaultCharset().name();
+    }
+}

+ 1002 - 0
src/main/java/platform/common/util/text/Convert.java

@@ -0,0 +1,1002 @@
+package platform.common.util.text;
+
+
+
+import platform.common.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.text.NumberFormat;
+import java.util.Set;
+
+/**
+ * 类型转换器
+ * 
+ * @author ruoyi
+ */
+public class Convert
+{
+    /**
+     * 转换为字符串<br>
+     * 如果给定的值为null,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static String toStr(Object value, String defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof String)
+        {
+            return (String) value;
+        }
+        return value.toString();
+    }
+
+    /**
+     * 转换为字符串<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static String toStr(Object value)
+    {
+        return toStr(value, null);
+    }
+
+    /**
+     * 转换为字符<br>
+     * 如果给定的值为null,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Character toChar(Object value, Character defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Character)
+        {
+            return (Character) value;
+        }
+
+        final String valueStr = toStr(value, null);
+        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
+    }
+
+    /**
+     * 转换为字符<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Character toChar(Object value)
+    {
+        return toChar(value, null);
+    }
+
+    /**
+     * 转换为byte<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Byte toByte(Object value, Byte defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Byte)
+        {
+            return (Byte) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).byteValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Byte.parseByte(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为byte<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Byte toByte(Object value)
+    {
+        return toByte(value, null);
+    }
+
+    /**
+     * 转换为Short<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Short toShort(Object value, Short defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Short)
+        {
+            return (Short) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).shortValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Short.parseShort(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Short<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Short toShort(Object value)
+    {
+        return toShort(value, null);
+    }
+
+    /**
+     * 转换为Number<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Number toNumber(Object value, Number defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Number)
+        {
+            return (Number) value;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return NumberFormat.getInstance().parse(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Number<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Number toNumber(Object value)
+    {
+        return toNumber(value, null);
+    }
+
+    /**
+     * 转换为int<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Integer toInt(Object value, Integer defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Integer)
+        {
+            return (Integer) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).intValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Integer.parseInt(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为int<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Integer toInt(Object value)
+    {
+        return toInt(value, null);
+    }
+
+    /**
+     * 转换为Integer数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Integer[] toIntArray(String str)
+    {
+        return toIntArray(",", str);
+    }
+
+    /**
+     * 转换为Long数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String str)
+    {
+        return toLongArray(",", str);
+    }
+
+    /**
+     * 转换为Integer数组<br>
+     * 
+     * @param split 分隔符
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static Integer[] toIntArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Integer[] {};
+        }
+        String[] arr = str.split(split);
+        final Integer[] ints = new Integer[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Integer v = toInt(arr[i], 0);
+            ints[i] = v;
+        }
+        return ints;
+    }
+
+    /**
+     * 转换为Long数组<br>
+     * 
+     * @param split 分隔符
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Long[] {};
+        }
+        String[] arr = str.split(split);
+        final Long[] longs = new Long[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Long v = toLong(arr[i], null);
+            longs[i] = v;
+        }
+        return longs;
+    }
+
+    /**
+     * 转换为String数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static String[] toStrArray(String str)
+    {
+        return toStrArray(",", str);
+    }
+
+    /**
+     * 转换为String数组<br>
+     * 
+     * @param split 分隔符
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static String[] toStrArray(String split, String str)
+    {
+        return str.split(split);
+    }
+
+    /**
+     * 转换为long<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Long toLong(Object value, Long defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Long)
+        {
+            return (Long) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).longValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).longValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为long<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Long toLong(Object value)
+    {
+        return toLong(value, null);
+    }
+
+    /**
+     * 转换为double<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Double toDouble(Object value, Double defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Double)
+        {
+            return (Double) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).doubleValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).doubleValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为double<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Double toDouble(Object value)
+    {
+        return toDouble(value, null);
+    }
+
+    /**
+     * 转换为Float<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Float toFloat(Object value, Float defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Float)
+        {
+            return (Float) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).floatValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Float.parseFloat(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Float<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Float toFloat(Object value)
+    {
+        return toFloat(value, null);
+    }
+
+    /**
+     * 转换为boolean<br>
+     * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Boolean toBool(Object value, Boolean defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Boolean)
+        {
+            return (Boolean) value;
+        }
+        String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        valueStr = valueStr.trim().toLowerCase();
+        switch (valueStr)
+        {
+            case "true":
+                return true;
+            case "false":
+                return false;
+            case "yes":
+                return true;
+            case "ok":
+                return true;
+            case "no":
+                return false;
+            case "1":
+                return true;
+            case "0":
+                return false;
+            default:
+                return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为boolean<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Boolean toBool(Object value)
+    {
+        return toBool(value, null);
+    }
+
+    /**
+     * 转换为Enum对象<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 
+     * @param clazz Enum的Class
+     * @param value 值
+     * @param defaultValue 默认值
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (clazz.isAssignableFrom(value.getClass()))
+        {
+            @SuppressWarnings("unchecked")
+            E myE = (E) value;
+            return myE;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Enum.valueOf(clazz, valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Enum对象<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 
+     * @param clazz Enum的Class
+     * @param value 值
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value)
+    {
+        return toEnum(clazz, value, null);
+    }
+
+    /**
+     * 转换为BigInteger<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigInteger)
+        {
+            return (BigInteger) value;
+        }
+        if (value instanceof Long)
+        {
+            return BigInteger.valueOf((Long) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigInteger(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为BigInteger<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static BigInteger toBigInteger(Object value)
+    {
+        return toBigInteger(value, null);
+    }
+
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigDecimal)
+        {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Long)
+        {
+            return new BigDecimal((Long) value);
+        }
+        if (value instanceof Double)
+        {
+            return new BigDecimal((Double) value);
+        }
+        if (value instanceof Integer)
+        {
+            return new BigDecimal((Integer) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigDecimal(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value)
+    {
+        return toBigDecimal(value, null);
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @return 字符串
+     */
+    public static String utf8Str(Object obj)
+    {
+        return str(obj, CharsetKit.CHARSET_UTF_8);
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @param charsetName 字符集
+     * @return 字符串
+     */
+    public static String str(Object obj, String charsetName)
+    {
+        return str(obj, Charset.forName(charsetName));
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @param charset 字符集
+     * @return 字符串
+     */
+    public static String str(Object obj, Charset charset)
+    {
+        if (null == obj)
+        {
+            return null;
+        }
+
+        if (obj instanceof String)
+        {
+            return (String) obj;
+        }
+        else if (obj instanceof byte[] || obj instanceof Byte[])
+        {
+            return str((Byte[]) obj, charset);
+        }
+        else if (obj instanceof ByteBuffer)
+        {
+            return str((ByteBuffer) obj, charset);
+        }
+        return obj.toString();
+    }
+
+    /**
+     * 将byte数组转为字符串
+     * 
+     * @param bytes byte数组
+     * @param charset 字符集
+     * @return 字符串
+     */
+    public static String str(byte[] bytes, String charset)
+    {
+        return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+    }
+
+    /**
+     * 解码字节码
+     * 
+     * @param data 字符串
+     * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+     * @return 解码后的字符串
+     */
+    public static String str(byte[] data, Charset charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        if (null == charset)
+        {
+            return new String(data);
+        }
+        return new String(data, charset);
+    }
+
+    /**
+     * 将编码的byteBuffer数据转换为字符串
+     * 
+     * @param data 数据
+     * @param charset 字符集,如果为空使用当前系统字符集
+     * @return 字符串
+     */
+    public static String str(ByteBuffer data, String charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        return str(data, Charset.forName(charset));
+    }
+
+    /**
+     * 将编码的byteBuffer数据转换为字符串
+     * 
+     * @param data 数据
+     * @param charset 字符集,如果为空使用当前系统字符集
+     * @return 字符串
+     */
+    public static String str(ByteBuffer data, Charset charset)
+    {
+        if (null == charset)
+        {
+            charset = Charset.defaultCharset();
+        }
+        return charset.decode(data).toString();
+    }
+
+    // ----------------------------------------------------------------------- 全角半角转换
+    /**
+     * 半角转全角
+     * 
+     * @param input String.
+     * @return 全角字符串.
+     */
+    public static String toSBC(String input)
+    {
+        return toSBC(input, null);
+    }
+
+    /**
+     * 半角转全角
+     * 
+     * @param input String
+     * @param notConvertSet 不替换的字符集合
+     * @return 全角字符串.
+     */
+    public static String toSBC(String input, Set<Character> notConvertSet)
+    {
+        char c[] = input.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 跳过不替换的字符
+                continue;
+            }
+
+            if (c[i] == ' ')
+            {
+                c[i] = '\u3000';
+            }
+            else if (c[i] < '\177')
+            {
+                c[i] = (char) (c[i] + 65248);
+
+            }
+        }
+        return new String(c);
+    }
+
+    /**
+     * 全角转半角
+     * 
+     * @param input String.
+     * @return 半角字符串
+     */
+    public static String toDBC(String input)
+    {
+        return toDBC(input, null);
+    }
+
+    /**
+     * 替换全角为半角
+     * 
+     * @param text 文本
+     * @param notConvertSet 不替换的字符集合
+     * @return 替换后的字符
+     */
+    public static String toDBC(String text, Set<Character> notConvertSet)
+    {
+        char c[] = text.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 跳过不替换的字符
+                continue;
+            }
+
+            if (c[i] == '\u3000')
+            {
+                c[i] = ' ';
+            }
+            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
+            {
+                c[i] = (char) (c[i] - 65248);
+            }
+        }
+        String returnString = new String(c);
+
+        return returnString;
+    }
+
+    /**
+     * 数字金额大写转换 先写个完整的然后将如零拾替换成零
+     * 
+     * @param n 数字
+     * @return 中文大写数字
+     */
+    public static String digitUppercase(double n)
+    {
+        String[] fraction = { "角", "分" };
+        String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
+        String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };
+
+        String head = n < 0 ? "负" : "";
+        n = Math.abs(n);
+
+        String s = "";
+        for (int i = 0; i < fraction.length; i++)
+        {
+            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
+        }
+        if (s.length() < 1)
+        {
+            s = "整";
+        }
+        int integerPart = (int) Math.floor(n);
+
+        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
+        {
+            String p = "";
+            for (int j = 0; j < unit[1].length && n > 0; j++)
+            {
+                p = digit[integerPart % 10] + unit[1][j] + p;
+                integerPart = integerPart / 10;
+            }
+            s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
+        }
+        return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
+    }
+}

+ 93 - 0
src/main/java/platform/common/util/text/StrFormatter.java

@@ -0,0 +1,93 @@
+package platform.common.util.text;
+
+
+import platform.common.util.StringUtils;
+
+/**
+ * 字符串格式化
+ * 
+ * @author ruoyi
+ */
+public class StrFormatter
+{
+    public static final String EMPTY_JSON = "{}";
+    public static final char C_BACKSLASH = '\\';
+    public static final char C_DELIM_START = '{';
+    public static final char C_DELIM_END = '}';
+
+    /**
+     * 格式化字符串<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param strPattern 字符串模板
+     * @param argArray 参数列表
+     * @return 结果
+     */
+    public static String format(final String strPattern, final Object... argArray)
+    {
+        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
+        {
+            return strPattern;
+        }
+        final int strPatternLength = strPattern.length();
+
+        // 初始化定义好的长度以获得更好的性能
+        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
+
+        int handledPosition = 0;
+        int delimIndex;// 占位符所在位置
+        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
+        {
+            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
+            if (delimIndex == -1)
+            {
+                if (handledPosition == 0)
+                {
+                    return strPattern;
+                }
+                else
+                { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
+                    sbuf.append(strPattern, handledPosition, strPatternLength);
+                    return sbuf.toString();
+                }
+            }
+            else
+            {
+                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
+                {
+                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
+                    {
+                        // 转义符之前还有一个转义符,占位符依旧有效
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                        handledPosition = delimIndex + 2;
+                    }
+                    else
+                    {
+                        // 占位符被转义
+                        argIndex--;
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(C_DELIM_START);
+                        handledPosition = delimIndex + 1;
+                    }
+                }
+                else
+                {
+                    // 正常占位符
+                    sbuf.append(strPattern, handledPosition, delimIndex);
+                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                    handledPosition = delimIndex + 2;
+                }
+            }
+        }
+        // 加入最后一个占位符后所有的字符
+        sbuf.append(strPattern, handledPosition, strPattern.length());
+
+        return sbuf.toString();
+    }
+}

+ 11 - 1
src/main/java/platform/modules/api/web/ActivityOpenController.java

@@ -186,6 +186,16 @@ public class ActivityOpenController extends BaseController {
         return ResponseMessage.success("操作成功!");
     }
 
+    @OperationLog(value = "删除报名")
+    @DeleteMapping(value = "/delete_regist")
+    public ResponseMessage deleteRegist(@RequestParam("regist_id") String registId) {
+        ActivityRegistration activityRegistration = new ActivityRegistration();
+        activityRegistration.setId(Integer.parseInt(registId));
+        activityRegistration.setDel_flag(true);
+        activityRegistrationService.updateSelective(activityRegistration);
+        return ResponseMessage.success("操作成功!");
+    }
+
     /**
      * @Author: huZhiHao
      * @Description: 获取已报名
@@ -290,7 +300,7 @@ public class ActivityOpenController extends BaseController {
             activityRegistrationService.updateState(activityRegistration_n);
             return ResponseMessage.success("签到成功!");
         }
-        return ResponseMessage.success("签到失败!");
+        return ResponseMessage.error("签到失败!");
     }
 
     //根据手机号获取用户信息和企业信息

+ 2 - 2
src/main/java/platform/modules/home/HomeController.java

@@ -1082,7 +1082,7 @@ public class HomeController extends BaseController {
     /**
      * 微信小程序登录
      */
-    @GetMapping("wxapp/login")
+    @GetMapping("/wxapp/login")
     @ResponseBody
     public ResponseMessage wxAppLogin(
             @RequestParam String code
@@ -1093,7 +1093,7 @@ public class HomeController extends BaseController {
     /**
      * 微信小程序获取用户信息
      */
-    @GetMapping("wxapp/phone")
+    @GetMapping("/wxapp/phone")
     @ResponseBody
     public ResponseMessage wxAppUserinfo(
             @RequestParam String code,

+ 16 - 0
src/main/java/platform/modules/home/dto/wxapp/WxAccessTokenCacheData.java

@@ -0,0 +1,16 @@
+package platform.modules.home.dto.wxapp;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用来存放在redis里边的小程序token缓存对象
+ */
+
+@Data
+public class WxAccessTokenCacheData {
+    private String access_token;
+    private Integer expire_in;
+    private Date cacheTime; // 存入时间
+}

+ 17 - 0
src/main/java/platform/modules/home/dto/wxapp/WxAppLoginRet.java

@@ -0,0 +1,17 @@
+package platform.modules.home.dto.wxapp;
+
+import lombok.Data;
+
+@Data
+public class WxAppLoginRet {
+
+    private String session_key; // 会话密钥
+
+    private String openid; // 用户唯一标识
+
+    private String unionid; // 用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,详见 UnionID 机制说明。
+
+    private String errcode;
+
+    private String errmsg;
+}

+ 63 - 0
src/main/java/platform/modules/home/service/WxMicroappService.java

@@ -0,0 +1,63 @@
+package platform.modules.home.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xiaoleilu.hutool.http.HttpUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import platform.common.util.StringUtils;
+import platform.common.util.WechatDecoderUtil;
+import platform.common.util.WxAppUtil;
+import platform.modules.home.dto.wxapp.WxAppLoginRet;
+
+
+@Service
+public class WxMicroappService {
+
+    private static final String WXAPP_ACCESS_TOKEN = "WXAPP_ACCESS_TOKEN";
+
+    @Value("${app_id}")
+    private String APP_ID;
+
+    @Value("${app_sercet}")
+    private String APP_SERCRET;
+
+    /**
+     * 微信小程序登录
+     *
+     * @param code
+     * @return
+     */
+    public WxAppLoginRet wxAppLogin(String code) {
+        String url = WxAppUtil.getCode2SessionURLString(APP_ID, APP_SERCRET, code);
+        // 开始请求
+        String retString = HttpUtil.get(url);
+        JSONObject jsonObject = (JSONObject) JSONObject.parse(retString);
+        WxAppLoginRet ret = new WxAppLoginRet();
+        ret = JSONObject.toJavaObject(jsonObject, WxAppLoginRet.class);
+//        BeanUtils.copyProperties(jsonObject, ret);
+        // session_key 不向前台返回
+        ret.setSession_key(null);
+        return ret;
+    }
+
+    /**
+     * 获取小程序用户信息
+     *
+     * @param code
+     * @param encryptedData
+     * @param iv
+     * @return
+     */
+    public JSONObject getPhoneNumber(String code, String encryptedData, String iv) {
+
+        String sessionKey = WxAppUtil.getSessionKey(APP_ID, APP_SERCRET, code);
+
+        if (StringUtils.isNull(sessionKey)) {
+            throw new RuntimeException("session_key 获取失败");
+        }
+
+        JSONObject jsonObject = WechatDecoderUtil.getInfo(encryptedData, sessionKey, iv);
+
+        return jsonObject;
+    }
+}

+ 1 - 0
src/main/resources/mapper/sys/ActivityDetailDao.xml

@@ -73,6 +73,7 @@
         WHERE
         activity_id = detail.id
         AND sign_state = 0
+        AND review_state != 3
         ) sgin_number
         FROM
         ac_activity_detail detail

+ 19 - 1
src/main/resources/mapper/sys/ActivityRegistrationDao.xml

@@ -71,6 +71,14 @@
                 '5' type
             FROM
                 z_user u
+            UNION
+            SELECT
+                z.id id,
+                a.company_name name,
+                '6' type
+            FROM
+                ac_activity_registration a
+            JOIN z_user z ON z.id = a.user_id
         ) zuser ON reg.user_id = zuser.id
         AND reg.user_type = zuser.type
         WHERE
@@ -127,10 +135,20 @@
             FROM
                 sys_department s
             JOIN z_user z ON z.department_id = s.id
+            UNION
+            SELECT
+                z.id id,
+                a.company_name name,
+                '6' type
+            FROM
+                ac_activity_registration a
+            JOIN z_user z ON z.id = a.user_id
         ) zuser ON reg.user_id = zuser.id
         AND reg.user_type = zuser.type
         WHERE
-            reg.activity_id = #{activityId}
+            reg.del_flag = 0
+            AND reg.activity_id = #{activityId}
+            AND reg.review_state != 3
     </select>
 
     <select id="findMyActivityPage" parameterType="platform.modules.sys.entity.ActivityRegistration"

BIN
src/main/resources/static/img/btn.png


BIN
src/main/resources/static/img/marker10.png


BIN
src/main/resources/static/img/marker_n.png


+ 8 - 5
src/main/resources/templates/admin/government/activity_detail.html

@@ -213,7 +213,10 @@
                     <td th:text="${m.phone}"></td>
                     <td th:text="${m.mail}"></td>
                     <td th:text="${m.position}"></td>
-                    <td>门户</td>
+                    <!--报名途径-->
+                    <td th:if="${m.registration_way=='0'}">门户</td>
+                    <td th:if="${m.registration_way=='1'}">微信</td>
+                    <!--报名途径-->
                     <td th:if="${m.review_state=='0'}">待审核</td>
                     <td th:if="${m.review_state=='1'}">通过</td>
                     <td th:if="${m.review_state=='2'}">驳回</td>
@@ -255,8 +258,8 @@
                 </tr>
                 </tbody>
             </table>
-            <div class="row cl" style="text-align: center">
-                <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
+            <div class="row cl" style="padding-top: 10px">
+                <div style="text-align: center">
                     <a onclick="removeIframe();" class="btn btn-default radius" type="button">返回</a>
                 </div>
             </div>
@@ -274,8 +277,8 @@
                     </ul>
                 </div>
             </div>
-            <div class="row cl" style="text-align: center">
-                <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
+            <div class="row cl" style="padding-top: 10px">
+                <div style="text-align: center">
                     <a onclick="removeIframe();" class="btn btn-default radius" type="button">返回</a>
                 </div>
             </div>

+ 47 - 0
src/main/resources/templates/admin/government/activity_qrcode.html

@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+      layout:decorate="~{admin/common/common}">
+<head>
+    <title>活动二维码</title>
+    <style>
+        .one {
+            display: flex;
+            justify-content: space-around;
+        }
+    </style>
+</head>
+<body layout:fragment="content">
+<input id="activity_id" type="text" th:value="${activity_id}" hidden/>
+<div class="one">
+    <div>
+        <div>
+            <img th:src="${qrcode_detail}">
+        </div>
+        <div style="text-align: center">报名二维码</div>
+        <a class="btn btn-primary radius" style="display: block; text-align: center;" onclick="downloadQrcode(1)">下载</a>
+    </div>
+    <div>
+        <div>
+            <img th:src="${qrcode_sign}">
+        </div>
+        <div style="text-align: center">签到二维码</div>
+        <a class="btn btn-primary radius" style="display: block; text-align: center;" onclick="downloadQrcode(2)">下载</a>
+    </div>
+</div>
+<script>
+
+    function downloadQrcode(type) {
+        location.href = pagePath + "/government/activity/download/qrcode/" + $("#activity_id").val() + "/" + type;
+        // window.open(pagePath + "/government/activity/download/qrcode/" + $("#activity_id").val() + "/" + type);
+    }
+
+    // function getDetailQRcode() {
+    //     window.open(encodeURI(pagePath + "/projectDeclaration/exportExcel?project_type=" + project_type +
+    //         "&street_id=" + street_id + "&project_name=" + project_name + "&company_name=" + company_name +
+    //         "&apply_date_start=" + apply_date_start + "&apply_date_end=" + apply_date_end +
+    //         "&approval_status="+ approval_status + "&project_year=" + project_year));
+    // }
+</script>
+</body>
+</html>

BIN
src/main/resources/templates/admin/government/map_component/img/btn.png


BIN
src/main/resources/templates/admin/government/map_component/img/marker10.png


BIN
src/main/resources/templates/admin/government/map_component/img/marker_n.png


+ 1460 - 0
src/main/resources/templates/admin/government/map_component/map.html

@@ -0,0 +1,1460 @@
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>腾讯地图开放API - 轻快小巧,简单易用!</title>
+    <!--    <link rel="stylesheet" href="common.css">-->
+    <script type="text/javascript" th:src="@{/js/lib/jquery-1.11.0.min.js}"></script>
+    <link rel="stylesheet" href="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.min.css">
+    <link rel="stylesheet" type="text/css" th:href="@{/h-ui/static/h-ui/css/H-ui.min.css}" />
+    <script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.10.4/jquery-ui.min.js"></script>
+    <script charset="utf-8"
+            src="https://map.qq.com/api/js?v=2.exp&amp;key=XQ3BZ-6X2Y6-3HNSL-EDDG3-B2AJQ-6TBIF"></script>
+    <script src="https://3gimg.qq.com/lightmap/api_v2/2/4/126/main.js" type="text/javascript"></script>
+    <style type="text/css">
+        /* start common*/
+        body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td {
+            margin: 0;
+            padding: 0;
+        }
+
+        table {
+            border-collapse: collapse;
+            border-spacing: 0;
+        }
+
+        ul, ol {
+            list-style: none;
+            line-height: 20px;
+        }
+
+        ol li {
+            list-style: decimal;
+            margin-left: 30px;
+        }
+
+        fieldset, img {
+            border: 0;
+        }
+
+        body, button, input, select, textarea {
+            font: 12px/16px Verdana, Helvetica, Arial, sans-serif;
+        }
+
+        h1, h2, h3, h4, h5, h6 {
+            font-size: 100%;
+        }
+
+        address, cite, dfn, em, var {
+            font-style: normal;
+        }
+
+        code, kbd, pre, samp {
+            font-family: Consolas, Courier new, Courier, monospace;
+        }
+
+        small {
+            font-size: 12px;
+        }
+
+        sup {
+            vertical-align: text-top;
+        }
+
+        sub {
+            vertical-align: text-bottom;
+        }
+
+        a {
+            text-decoration: none;
+        }
+
+        a:link {
+            color: #22659A;
+        }
+
+        a:visited {
+            color: #22659A;
+        }
+
+        a:hover {
+            text-decoration: underline;
+        }
+
+        a:active {
+        }
+
+        /*end common*/
+
+        /*start page*/
+
+        .page {
+            width: 910px;
+            margin: 0px auto;
+            overflow: hidden;
+            zoom: 1;
+        }
+
+        /*start header*/
+        .header {
+            overflow: hidden;
+            zoom: 1;
+        }
+
+        /* start top-menu*/
+        .top-menu {
+            float: right;
+        }
+
+        .top-menu li {
+            float: left;
+            padding-left: 17px;
+            height: 24px;
+            line-height: 24px;
+            background: url(https://lbs.qq.com/tool/getpoint/img/dot.png) 7px center no-repeat;
+        }
+
+        .top-menu li.first {
+            background: none;
+        }
+
+        .top-menu li a {
+            color: #727f97;
+        }
+
+        /*end top-menu*/
+
+        /* start banner*/
+        .banner {
+            clear: both;
+            height: 27px;
+            padding: 16px 0px 10px 10px;
+        }
+
+        /*end banner*/
+        /*start nav*/
+        .nav {
+            height: 32px;
+            padding-left: 26px;
+            overflow: hidden;
+            background: url(https://lbs.qq.com/tool/getpoint/img/nav_bar.png) no-repeat;
+        }
+
+        .nav li {
+            float: left;
+            width: 86px;
+            height: 32px;
+            font-size: 14px;
+            line-height: 32px;
+            font-weight: bold;
+            text-align: center;
+            overflow: hidden;
+        }
+
+        .nav li a {
+            width: 92px;
+            height: 36px;
+            line-height: 36px;
+            text-align: center;
+        }
+
+        .nav a:link, .nav a:visited, .nav a:active {
+            color: #FFF;
+        }
+
+        .nav li:hover a, .nav a:hover, .nav a.active {
+            display: block;
+            width: 92px;
+            background: url(https://lbs.qq.com/tool/getpoint/img/nav_hover.png) no-repeat;
+            text-decoration: none;
+            color: #104 !important;
+        }
+
+        .new {
+            width: 92px !important;
+            background: url(https://lbs.qq.com/tool/getpoint/img/new.png) no-repeat 76px 11px;
+        }
+
+        /*end nav*/
+        /*end header*/
+
+        /*start main*/
+        .main {
+            margin-top: 20px;
+            overflow: hidden;
+            zoom: 1;
+        }
+
+        .page_left {
+            width: 260px;
+            margin-right: 10px;
+            float: left;
+            overflow: hidden;
+            zoom: 1;
+        }
+
+        .page_right {
+            width: 640px;
+            overflow: hidden;
+            zoom: 1;
+            float: left;
+        }
+
+        /*end main*/
+
+        /*start footer*/
+        .footer {
+            padding: 20px 0;
+            text-align: center;
+            font-size: 12px;
+            line-height: 30px;
+            overflow: hidden;
+            color: #A3A3A3;
+        }
+
+        /*end footer*/
+        /*end page*/
+
+        * {
+            margin: 0px;
+            padding: 0px;
+        }
+
+        #main {
+            height: 553px;
+            width: 912px;
+            border: 1px solid #5688CB;
+            border-top: 0px;
+        }
+
+        #tooles {
+            height: 23px;
+            background: #5688CB;
+            position: relative;
+            z-index: 100;
+            color: white;
+        }
+
+        #bside_left {
+            width: 260px;
+            height: 510px;
+            padding: 10px 0px 10px 10px;
+            float: left;
+            overflow: auto;
+        }
+
+        #cur_city, #no_value {
+            height: 20px;
+            position: absolute;
+            top: 3px;
+            left: 10px;
+        }
+
+        #cur_city .change_city {
+            margin-left: 5px;
+            cursor: pointer;
+        }
+
+
+        #level {
+            margin-left: 20px;
+        }
+
+
+        .logo_img {
+            width: 172px;
+            height: 23px;
+        }
+
+        .search {
+            width: 280px;
+            height: 53px;
+            padding-left: 10px;
+            float: left;
+            margin-left: 15px;
+            margin-right: 30px;
+        }
+
+        .search_t {
+            /*width: 200px;*/
+            /*height: 18px;*/
+
+            padding: 3px;
+            margin-top: 13px;
+            line-height: 20px;
+        }
+
+        .search_c {
+            width: 220px;
+            height: 40px;
+            float: left;
+        }
+
+        /*.btn, .btn_active {*/
+        /*    width: 49px;*/
+        /*    height: 24px;*/
+        /*    line-height: 24px;*/
+        /*    font-size: 14px;*/
+        /*    float: left;*/
+        /*    background: url(https://lbs.qq.com/tool/getpoint/img/btn.png);*/
+        /*    margin-top: 14px;*/
+        /*    text-align: center;*/
+        /*    cursor: pointer;*/
+        /*}*/
+
+        /*.btn_active {*/
+        /*    background: url(https://lbs.qq.com/tool/getpoint/img/btn.png) -49px 0px;*/
+        /*}*/
+
+        .poi {
+            width: 570px;
+            height: 41;
+            /*padding-top: 13px;*/
+            float: left;
+            position: relative;
+        }
+
+        .poi_note {
+            width: 63px;
+            line-height: 26px;
+            float: left;
+            margin-top: 15px;
+        }
+
+        #poi_cur {
+            width: 160px;
+            /*height: 22px;*/
+            margin-right: 10px;
+            margin-top: 13px;
+            line-height: 26px;
+
+            float: left;
+            text-align: center;
+        }
+
+        #addr_cur {
+            width: 260px;
+            /*height: 22px;*/
+            margin-right: 5px;
+            margin-top: 13px;
+            line-height: 26px;
+
+            float: left;
+            text-align: center;
+        }
+
+        .btn_copy {
+            width: 49px;
+            height: 24px;
+            background: url(https://lbs.qq.com/tool/getpoint/img/btn_cpoy.png) 0px 0px;
+            float: left;
+        }
+
+        .already {
+            width: 52px;
+            line-height: 26px;
+            padding-left: 5px;
+            float: left;
+            color: red;
+            display: none;
+        }
+
+        .info_list {
+            margin-bottom: 5px;
+            cleat: both;
+            cursor: pointer;
+        }
+
+        #txt_pannel {
+            height: 500px;
+        }
+
+        #city {
+            width: 356px;
+            height: 433px;
+            padding: 10px;
+            border: 2px solid #D6D6D6;
+            position: absolute;
+            left: 44px;
+            top: 20px;
+            z-index: 999;
+            background: #fff;
+            overflow: auto;
+            color: black;
+        }
+
+        #city .city_class {
+            font-size: 12px;
+            background: #fff;
+        }
+
+        #city .city_container {
+            margin-top: 10px;
+            margin-bottom: 10px;
+            background: #fff;
+        }
+
+        #city .city_container_left {
+            width: 48px;
+            float: left;
+        }
+
+        #city .city_container_right {
+            width: 289px;
+            float: left;
+        }
+
+        #city .close {
+            width: 20px;
+            height: 20px;
+            display: inline-block;
+            float: right;
+            font-size: 20px;
+            font-weight: normal;
+            cursor: pointer;
+        }
+
+        #city .city_name {
+            line-height: 20px;
+            margin-left: 5px;
+            color: #2F82C4;
+            cursor: pointer;
+            display: inline-block;
+            font-size: 12px;
+        }
+
+        #curCity {
+            margin-right: 5px;
+        }
+
+        .hide {
+            display: none;
+        }
+
+        #bside_rgiht {
+            width: 631px;
+            height: 530px;
+            margin-left: 10px;
+            border-left: 1px solid #5688CB;
+            float: left;
+            font-size: 12px;
+        }
+
+        #container {
+            width: 621px;
+            height: 520px;
+            border: 5px solid #fff;
+        }
+
+        #no_value {
+            color: red;
+            position: relative;
+            width: 200px;
+        }
+    </style>
+
+    <style type="text/css">@media screen {
+        .smnoscreen {
+            display: none
+        }
+    }
+
+    @media print {
+        .smnoprint {
+            display: none
+        }
+    }</style>
+</head>
+
+
+<body>
+<div style="position:relative;margin-left:42px;">
+    <div style="height:53px;">
+        <div class="search">
+            <div class="search_c">
+                <span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span>
+                <input type="text" class="search_t ui-autocomplete-input input-text"
+                       onkeypress="if(event.keyCode==13) {btnSearch.click();return false;}" autocomplete="off"></div>
+            <div id="btn_search" class="btn btn-primary radius" style="margin-top: 13px">搜索</div>
+        </div>
+        <div class="poi">
+            <div class="poi_note">当前坐标:</div>
+            <input disabled type="text" id="poi_cur" class="input-text">
+            <div class="poi_note">当前地址:</div>
+            <input disabled type="text" id="addr_cur" class="input-text">
+        </div>
+    </div>
+    <div id="main">
+        <div id="tooles">
+            <div id="cur_city">
+                <strong>苏州市</strong><span class="change_city">[<span
+                    style="text-decoration:underline;">更换城市</span>]<span id="level">当前缩放等级:10</span></span>
+                <div id="city" class="hide">
+                    <h3 class="city_class">热门城市<span class="close">X</span></h3>
+                    <div class="city_container">
+                        <span class="city_name">北京</span>
+                        <span class="city_name">深圳</span>
+                        <span class="city_name">上海</span>
+                        <span class="city_name">香港</span>
+                        <span class="city_name">澳门</span>
+                        <span class="city_name">广州</span>
+                        <span class="city_name">天津</span>
+                        <span class="city_name">重庆</span>
+                        <span class="city_name">杭州</span>
+                        <span class="city_name">成都</span>
+                        <span class="city_name">武汉</span>
+                        <span class="city_name">青岛</span>
+                    </div>
+                    <h3 class="city_class">全国城市</h3>
+                    <div class="city_container">
+                        <div class="city_container_left">直辖市</div>
+                        <div class="city_container_right">
+                            <span class="city_name">北京</span>
+                            <span class="city_name">上海</span>
+                            <span class="city_name">天津</span>
+                            <span class="city_name">重庆</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">内蒙古</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">呼和浩特</span>
+                            <span class="city_name">包头</span>
+                            <span class="city_name">乌海</span>
+                            <span class="city_name">赤峰</span>
+                            <span class="city_name">通辽</span>
+                            <span class="city_name">鄂尔多斯</span>
+                            <span class="city_name">呼伦贝尔</span>
+                            <span class="city_name">巴彦淖尔</span>
+                            <span class="city_name">乌兰察布</span>
+                            <span class="city_name">兴安盟</span>
+                            <span class="city_name">锡林郭勒盟</span>
+                            <span class="city_name">阿拉善盟</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">山西</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">太原</span>
+                            <span class="city_name">大同</span>
+                            <span class="city_name">阳泉</span>
+                            <span class="city_name">长治</span>
+                            <span class="city_name">晋城</span>
+                            <span class="city_name">朔州</span>
+                            <span class="city_name">晋中</span>
+                            <span class="city_name">运城</span>
+                            <span class="city_name">忻州</span>
+                            <span class="city_name">临汾</span>
+                            <span class="city_name">吕梁</span>
+
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">陕西</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">西安</span>
+                            <span class="city_name">铜川</span>
+                            <span class="city_name">宝鸡</span>
+                            <span class="city_name">咸阳</span>
+                            <span class="city_name">渭南</span>
+                            <span class="city_name">延安</span>
+                            <span class="city_name">汉中</span>
+                            <span class="city_name">榆林</span>
+                            <span class="city_name">安康</span>
+                            <span class="city_name">商洛</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">河北</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">石家庄</span>
+                            <span class="city_name">唐山</span>
+                            <span class="city_name">秦皇岛</span>
+                            <span class="city_name">邯郸</span>
+                            <span class="city_name">邢台</span>
+                            <span class="city_name">保定</span>
+                            <span class="city_name">张家口</span>
+                            <span class="city_name">承德</span>
+                            <span class="city_name">沧州</span>
+                            <span class="city_name">廊坊</span>
+                            <span class="city_name">衡水</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">辽宁</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">沈阳</span>
+                            <span class="city_name">大连</span>
+                            <span class="city_name">鞍山</span>
+                            <span class="city_name">抚顺</span>
+                            <span class="city_name">本溪</span>
+                            <span class="city_name">丹东</span>
+                            <span class="city_name">锦州</span>
+                            <span class="city_name">营口</span>
+                            <span class="city_name">阜新</span>
+                            <span class="city_name">辽阳</span>
+                            <span class="city_name">盘锦</span>
+                            <span class="city_name">铁岭</span>
+                            <span class="city_name">朝阳</span>
+                            <span class="city_name">葫芦岛</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">吉林</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">长春</span>
+                            <span class="city_name">吉林市</span>
+                            <span class="city_name">四平</span>
+                            <span class="city_name">辽源</span>
+                            <span class="city_name">通化</span>
+                            <span class="city_name">白山</span>
+                            <span class="city_name">松原</span>
+                            <span class="city_name">白城</span>
+                            <span class="city_name">延边</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">黑龙江</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">哈尔滨</span>
+                            <span class="city_name">齐齐哈尔</span>
+                            <span class="city_name">鸡西</span>
+                            <span class="city_name">鹤岗</span>
+                            <span class="city_name">双鸭山</span>
+                            <span class="city_name">大庆</span>
+                            <span class="city_name">伊春</span>
+                            <span class="city_name">牡丹江</span>
+                            <span class="city_name">佳木斯</span>
+                            <span class="city_name">七台河</span>
+                            <span class="city_name">黑河</span>
+                            <span class="city_name">绥化</span>
+                            <span class="city_name">大兴安岭</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">江苏</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">南京</span>
+                            <span class="city_name">无锡</span>
+                            <span class="city_name">徐州</span>
+                            <span class="city_name">常州</span>
+                            <span class="city_name">苏州</span>
+                            <span class="city_name">南通</span>
+                            <span class="city_name">连云港</span>
+                            <span class="city_name">淮安</span>
+                            <span class="city_name">盐城</span>
+                            <span class="city_name">扬州</span>
+                            <span class="city_name">镇江</span>
+                            <span class="city_name">泰州</span>
+                            <span class="city_name">宿迁</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">安徽</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">合肥</span>
+                            <span class="city_name">蚌埠</span>
+                            <span class="city_name">芜湖</span>
+                            <span class="city_name">淮南</span>
+                            <span class="city_name">马鞍山</span>
+                            <span class="city_name">淮北</span>
+                            <span class="city_name">铜陵</span>
+                            <span class="city_name">安庆</span>
+                            <span class="city_name">黄山</span>
+                            <span class="city_name">阜阳</span>
+                            <span class="city_name">宿州</span>
+                            <span class="city_name">滁州</span>
+                            <span class="city_name">六安</span>
+                            <span class="city_name">宣城</span>
+                            <span class="city_name">池州</span>
+                            <span class="city_name">亳州</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">山东</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">济南</span>
+                            <span class="city_name">青岛</span>
+                            <span class="city_name">淄博</span>
+                            <span class="city_name">枣庄</span>
+                            <span class="city_name">东营</span>
+                            <span class="city_name">潍坊</span>
+                            <span class="city_name">烟台</span>
+                            <span class="city_name">威海</span>
+                            <span class="city_name">济宁</span>
+                            <span class="city_name">泰安</span>
+                            <span class="city_name">日照</span>
+                            <span class="city_name">临沂</span>
+                            <span class="city_name">德州</span>
+                            <span class="city_name">聊城</span>
+                            <span class="city_name">滨州</span>
+                            <span class="city_name">菏泽</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">浙江</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">杭州</span>
+                            <span class="city_name">宁波</span>
+                            <span class="city_name">温州</span>
+                            <span class="city_name">嘉兴</span>
+                            <span class="city_name">绍兴</span>
+                            <span class="city_name">金华</span>
+                            <span class="city_name">衢州</span>
+                            <span class="city_name">舟山</span>
+                            <span class="city_name">台州</span>
+                            <span class="city_name">丽水</span>
+                            <span class="city_name">湖州</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">江西</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">南昌</span>
+                            <span class="city_name">景德镇</span>
+                            <span class="city_name">萍乡</span>
+                            <span class="city_name">九江</span>
+                            <span class="city_name">新余</span>
+                            <span class="city_name">鹰潭</span>
+                            <span class="city_name">赣州</span>
+                            <span class="city_name">吉安</span>
+                            <span class="city_name">宜春</span>
+                            <span class="city_name">抚州</span>
+                            <span class="city_name">上饶</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">福建</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">福州</span>
+                            <span class="city_name">厦门</span>
+                            <span class="city_name">莆田</span>
+                            <span class="city_name">三明</span>
+                            <span class="city_name">泉州</span>
+                            <span class="city_name">漳州</span>
+                            <span class="city_name">南平</span>
+                            <span class="city_name">龙岩</span>
+                            <span class="city_name">宁德</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">湖南</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">长沙</span>
+                            <span class="city_name">株洲</span>
+                            <span class="city_name">湘潭</span>
+                            <span class="city_name">衡阳</span>
+                            <span class="city_name">邵阳</span>
+                            <span class="city_name">岳阳</span>
+                            <span class="city_name">常德</span>
+                            <span class="city_name">张家界</span>
+                            <span class="city_name">益阳</span>
+                            <span class="city_name">郴州</span>
+                            <span class="city_name">永州</span>
+                            <span class="city_name">怀化</span>
+                            <span class="city_name">娄底</span>
+                            <span class="city_name">湘西</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">湖北</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">武汉</span>
+                            <span class="city_name">黄石</span>
+                            <span class="city_name">襄阳</span>
+                            <span class="city_name">十堰</span>
+                            <span class="city_name">宜昌</span>
+                            <span class="city_name">荆门</span>
+                            <span class="city_name">鄂州</span>
+                            <span class="city_name">孝感</span>
+                            <span class="city_name">荆州</span>
+                            <span class="city_name">黄冈</span>
+                            <span class="city_name">咸宁</span>
+                            <span class="city_name">随州</span>
+                            <span class="city_name">恩施</span>
+                            <span class="city_name">潜江</span>
+                            <span class="city_name">仙桃</span>
+                            <span class="city_name">天门</span>
+                            <span class="city_name">神农架</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">河南</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">郑州</span>
+                            <span class="city_name">开封</span>
+                            <span class="city_name">洛阳</span>
+                            <span class="city_name">平顶山</span>
+                            <span class="city_name">焦作</span>
+                            <span class="city_name">鹤壁</span>
+                            <span class="city_name">新乡</span>
+                            <span class="city_name">安阳</span>
+                            <span class="city_name">濮阳</span>
+                            <span class="city_name">许昌</span>
+                            <span class="city_name">漯河</span>
+                            <span class="city_name">三门峡</span>
+                            <span class="city_name">南阳</span>
+                            <span class="city_name">商丘</span>
+                            <span class="city_name">信阳</span>
+                            <span class="city_name">周口</span>
+                            <span class="city_name">驻马店</span>
+                            <span class="city_name">济源</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">海南</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">海口</span>
+                            <span class="city_name">三亚</span>
+                            <span class="city_name">三沙</span>
+                            <span class="city_name">儋州</span>
+                            <span class="city_name">五指山</span>
+                            <span class="city_name">文昌</span>
+                            <span class="city_name">琼海</span>
+                            <span class="city_name">万宁</span>
+                            <span class="city_name">东方</span>
+                            <span class="city_name">定安</span>
+                            <span class="city_name">屯昌</span>
+                            <span class="city_name">澄迈</span>
+                            <span class="city_name">临高</span>
+                            <span class="city_name">白沙</span>
+                            <span class="city_name">昌江</span>
+                            <span class="city_name">乐东</span>
+                            <span class="city_name">陵水</span>
+                            <span class="city_name">保亭</span>
+                            <span class="city_name">琼中</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">广东</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">广州</span>
+                            <span class="city_name">深圳</span>
+                            <span class="city_name">珠海</span>
+                            <span class="city_name">汕头</span>
+                            <span class="city_name">韶关</span>
+                            <span class="city_name">佛山</span>
+                            <span class="city_name">江门</span>
+                            <span class="city_name">湛江</span>
+                            <span class="city_name">茂名</span>
+                            <span class="city_name">肇庆</span>
+                            <span class="city_name">惠州</span>
+                            <span class="city_name">梅州</span>
+                            <span class="city_name">汕尾</span>
+                            <span class="city_name">河源</span>
+                            <span class="city_name">阳江</span>
+                            <span class="city_name">清远</span>
+                            <span class="city_name">东莞</span>
+                            <span class="city_name">中山</span>
+                            <span class="city_name">潮州</span>
+                            <span class="city_name">揭阳</span>
+                            <span class="city_name">云浮</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">广西</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">南宁</span>
+                            <span class="city_name">柳州</span>
+                            <span class="city_name">桂林</span>
+                            <span class="city_name">梧州</span>
+                            <span class="city_name">北海</span>
+                            <span class="city_name">防城港</span>
+                            <span class="city_name">钦州</span>
+                            <span class="city_name">贵港</span>
+                            <span class="city_name">玉林</span>
+                            <span class="city_name">百色</span>
+                            <span class="city_name">贺州</span>
+                            <span class="city_name">河池</span>
+                            <span class="city_name">来宾</span>
+                            <span class="city_name">崇左</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">贵州</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">贵阳</span>
+                            <span class="city_name">遵义</span>
+                            <span class="city_name">安顺</span>
+                            <span class="city_name">铜仁</span>
+                            <span class="city_name">毕节</span>
+                            <span class="city_name">六盘水</span>
+                            <span class="city_name">黔西南</span>
+                            <span class="city_name">黔东南</span>
+                            <span class="city_name">黔南</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">四川</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">成都</span>
+                            <span class="city_name">自贡</span>
+                            <span class="city_name">攀枝花</span>
+                            <span class="city_name">泸州</span>
+                            <span class="city_name">德阳</span>
+                            <span class="city_name">绵阳</span>
+                            <span class="city_name">广元</span>
+                            <span class="city_name">遂宁</span>
+                            <span class="city_name">内江</span>
+                            <span class="city_name">乐山</span>
+                            <span class="city_name">南充</span>
+                            <span class="city_name">宜宾</span>
+                            <span class="city_name">广安</span>
+                            <span class="city_name">达州</span>
+                            <span class="city_name">眉山</span>
+                            <span class="city_name">雅安</span>
+                            <span class="city_name">巴中</span>
+                            <span class="city_name">资阳</span>
+                            <span class="city_name">阿坝</span>
+                            <span class="city_name">甘孜</span>
+                            <span class="city_name">凉山</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">云南</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">昆明</span>
+                            <span class="city_name">保山</span>
+                            <span class="city_name">昭通</span>
+                            <span class="city_name">丽江</span>
+                            <span class="city_name">普洱</span>
+                            <span class="city_name">临沧</span>
+                            <span class="city_name">曲靖</span>
+                            <span class="city_name">玉溪</span>
+                            <span class="city_name">文山</span>
+                            <span class="city_name">西双版纳</span>
+                            <span class="city_name">楚雄</span>
+                            <span class="city_name">红河</span>
+                            <span class="city_name">德宏</span>
+                            <span class="city_name">大理</span>
+                            <span class="city_name">怒江</span>
+                            <span class="city_name">迪庆</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">甘肃</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">兰州</span>
+                            <span class="city_name">嘉峪关</span>
+                            <span class="city_name">金昌</span>
+                            <span class="city_name">白银</span>
+                            <span class="city_name">天水</span>
+                            <span class="city_name">酒泉</span>
+                            <span class="city_name">张掖</span>
+                            <span class="city_name">武威</span>
+                            <span class="city_name">定西</span>
+                            <span class="city_name">陇南</span>
+                            <span class="city_name">平凉</span>
+                            <span class="city_name">庆阳</span>
+                            <span class="city_name">临夏</span>
+                            <span class="city_name">甘南</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">宁夏</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">银川</span>
+                            <span class="city_name">石嘴山</span>
+                            <span class="city_name">吴忠</span>
+                            <span class="city_name">固原</span>
+                            <span class="city_name">中卫</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">青海</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">西宁</span>
+                            <span class="city_name">玉树</span>
+                            <span class="city_name">果洛</span>
+                            <span class="city_name">海东</span>
+                            <span class="city_name">海西</span>
+                            <span class="city_name">黄南</span>
+                            <span class="city_name">海北</span>
+                            <span class="city_name">海南</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">西藏</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">拉萨</span>
+                            <span class="city_name">那曲</span>
+                            <span class="city_name">昌都</span>
+                            <span class="city_name">山南</span>
+                            <span class="city_name">日喀则</span>
+                            <span class="city_name">阿里</span>
+                            <span class="city_name">林芝</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                    <div class="city_container">
+                        <div class="city_container_left"><span class="style_color">新疆</span></div>
+                        <div class="city_container_right">
+                            <span class="city_name">乌鲁木齐</span>
+                            <span class="city_name">克拉玛依</span>
+                            <span class="city_name">吐鲁番</span>
+                            <span class="city_name">哈密</span>
+                            <span class="city_name">博尔塔拉</span>
+                            <span class="city_name">巴音郭楞</span>
+                            <span class="city_name">克孜勒苏</span>
+                            <span class="city_name">和田</span>
+                            <span class="city_name">阿克苏</span>
+                            <span class="city_name">喀什</span>
+                            <span class="city_name">塔城</span>
+                            <span class="city_name">伊犁</span>
+                            <span class="city_name">昌吉</span>
+                            <span class="city_name">阿勒泰</span>
+                            <span class="city_name">石河子</span>
+                            <span class="city_name">阿拉尔</span>
+                            <span class="city_name">图木舒克</span>
+                            <span class="city_name">五家渠</span>
+                            <span class="city_name">北屯</span>
+                            <span class="city_name">铁门关</span>
+                            <span class="city_name">双河</span>
+                            <span class="city_name">可克达拉</span>
+                            <span class="city_name">昆玉</span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
+                </div>
+            </div>
+
+        </div>
+        <div id="bside_left">
+            <div id="txt_pannel">
+                <!--                <h3>功能简介:</h3>-->
+
+                <!--                <p>1、支持地址 精确/模糊 查询;</p>-->
+
+                <!--                <p>2、支持POI点坐标显示;</p>-->
+
+                <!--                <p>3、坐标鼠标跟随显示;</p>-->
+
+                <!--                <h3>使用说明:</h3>-->
+
+                <!--                <p>在搜索框搜索关键词后,地图上会显示相应poi点,同时左侧显示对应该点的信息,点击某点或某信息,右上角会显示相应该点的坐标和地址。</p>-->
+            </div>
+
+        </div>
+        <div id="bside_rgiht">
+            <div id="container"
+                 style="position: relative; background-color: rgb(229, 227, 223); overflow: hidden; transform: translateZ(0px);">
+            </div>
+        </div>
+        <div class="row" style="margin-top: 540px; text-align: center;">
+            <button onclick="saveItems();" class="btn btn-primary radius">保存</button>
+            <button onclick="removeIframe();" class="btn btn-default radius">取消</button>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+
+    var container = document.getElementById("container");
+    var center
+    var map = new qq.maps.Map(container, {
+            zoom: 12
+        }),
+        label = new qq.maps.Label({
+            map: map,
+            offset: new qq.maps.Size(15, -12),
+            draggable: false,
+            clickable: false
+        }),
+        markerArray = [],
+        curCity = document.getElementById("cur_city"),
+        btnSearch = document.getElementById("btn_search"),
+        bside = document.getElementById("bside_left"),
+        url, query_city,
+        cityservice = new qq.maps.CityService({
+            complete: function (result) {
+
+                if (parent.$("#lat_lng").val() != null && parent.$("#lat_lng").val() != "") {
+                    latLngString = parent.$("#lat_lng").val();
+                    center = new qq.maps.LatLng(Number(latLngString.split(",")[0]), Number(latLngString.split(",")[1]));
+                    document.getElementById("poi_cur").value = latLngString;
+                    url3 = encodeURI("https://apis.map.qq.com/ws/geocoder/v1/?location=" + latLngString.split(",")[0] + "," + latLngString.split(",")[1] + "&key=XQ3BZ-6X2Y6-3HNSL-EDDG3-B2AJQ-6TBIF&output=jsonp&&callback=?");
+                    $.getJSON(url3, function (result) {
+                        if (result.result != undefined) {
+                            document.getElementById("addr_cur").value = result.result.address;
+                        } else {
+                            document.getElementById("addr_cur").value = "";
+                        }
+                    })
+                } else {
+                    center = result.detail.latLng;
+                }
+                curCity.children[0].innerHTML = result.detail.name;
+                map.setCenter(center);
+            }
+        });
+    cityservice.searchLocalCity();
+    //添加定时器
+    map.setOptions({
+        draggableCursor: "crosshair"
+    });
+
+    $(container).mouseenter(function () {
+        label.setMap(map);
+    });
+    $(container).mouseleave(function () {
+        label.setMap(null);
+    });
+
+    qq.maps.event.addListener(map, "mousemove", function (e) {
+        var latlng = e.latLng;
+        label.setPosition(latlng);
+        label.setContent(latlng.getLat().toFixed(6) + "," + latlng.getLng().toFixed(6));
+    });
+    //添加定时器
+    setTimeout(function () {
+        var marker_0 = new qq.maps.Marker({
+            position: center,
+            animation: qq.maps.MarkerAnimation.DROP,
+            map: map
+        });
+        qq.maps.event.addListener(map, 'click', function (event) {
+            marker_0.setMap(null);
+        });
+        //marker.setAnimation(qq.maps.Animation.DROP);
+    }, 2000);
+    //添加监听事件   获取鼠标单击事件
+    qq.maps.event.addListener(map, 'click', function (event) {
+        var marker = new qq.maps.Marker({
+            position: event.latLng,
+            map: map
+        });
+        qq.maps.event.addListener(map, 'click', function (event) {
+            marker.setMap(null);
+        });
+    });
+
+    var url3;
+    qq.maps.event.addListener(map, "click", function (e) {
+        document.getElementById("poi_cur").value = e.latLng.getLat().toFixed(6) + "," + e.latLng.getLng().toFixed(6);
+        url3 = encodeURI("https://apis.map.qq.com/ws/geocoder/v1/?location=" + e.latLng.getLat() + "," + e.latLng.getLng() + "&key=XQ3BZ-6X2Y6-3HNSL-EDDG3-B2AJQ-6TBIF&output=jsonp&&callback=?");
+        $.getJSON(url3, function (result) {
+            if (result.result != undefined) {
+                document.getElementById("addr_cur").value = result.result.address;
+            } else {
+                document.getElementById("addr_cur").value = "";
+            }
+        })
+    });
+
+    qq.maps.event.addListener(map, "zoom_changed", function () {
+        document.getElementById("level").innerHTML = "当前缩放等级:" + map.getZoom();
+    });
+    var listener_arr = [];
+    var isNoValue = false;
+    qq.maps.event.addDomListener(btnSearch, 'click', function () {
+        var value = this.parentNode.getElementsByTagName("input")[0].value;
+        var latlngBounds = new qq.maps.LatLngBounds();
+        for (var i = 0, l = listener_arr.length; i < l; i++) {
+            qq.maps.event.removeListener(listener_arr[i]);
+        }
+        listener_arr.length = 0;
+        query_city = curCity.children[0].innerHTML;
+        url = encodeURI("https://apis.map.qq.com/ws/place/v1/search?keyword=" + value + "&boundary=region(" + query_city + ",0)&page_size=9&page_index=1&key=XQ3BZ-6X2Y6-3HNSL-EDDG3-B2AJQ-6TBIF&output=jsonp&&callback=?");
+        $.getJSON(url, function (result) {
+
+            if (result.count) {
+                isNoValue = false;
+                bside.innerHTML = "";
+                each(markerArray, function (n, ele) {
+                    ele.setMap(null);
+                });
+                markerArray.length = 0;
+                each(result.data, function (n, ele) {
+                    var latlng = new qq.maps.LatLng(ele.location.lat, ele.location.lng);
+                    latlngBounds.extend(latlng);
+                    var left = n * 27;
+                    var marker = new qq.maps.Marker({
+                        map: map,
+                        position: latlng,
+                        zIndex: 10
+                    });
+                    marker.index = n;
+                    marker.isClicked = false;
+                    setAnchor(marker, true);
+                    markerArray.push(marker);
+                    var listener1 = qq.maps.event.addDomListener(marker, "mouseover", function () {
+                        var n = this.index;
+                        setCurrent(markerArray, n, false);
+                        setCurrent(markerArray, n, true);
+                        label.setContent(this.position.getLat().toFixed(6) + "," + this.position.getLng().toFixed(6));
+                        label.setPosition(this.position);
+                        label.setOptions({
+                            offset: new qq.maps.Size(15, -20)
+                        })
+
+                    });
+                    listener_arr.push(listener1);
+                    var listener2 = qq.maps.event.addDomListener(marker, "mouseout", function () {
+                        var n = this.index;
+                        setCurrent(markerArray, n, false);
+                        setCurrent(markerArray, n, true);
+                        label.setOptions({
+                            offset: new qq.maps.Size(15, -12)
+                        })
+                    });
+                    listener_arr.push(listener2);
+                    var listener3 = qq.maps.event.addDomListener(marker, "click", function () {
+                        var n = this.index;
+                        setFlagClicked(markerArray, n);
+                        setCurrent(markerArray, n, false);
+                        setCurrent(markerArray, n, true);
+                        document.getElementById("addr_cur").value = bside.childNodes[n].childNodes[1].childNodes[1].innerHTML.substring(3);
+                    });
+                    listener_arr.push(listener3);
+                    map.fitBounds(latlngBounds);
+                    var div = document.createElement("div");
+                    div.className = "info_list";
+                    var order = document.createElement("div");
+                    var leftn = -54 - 17 * n;
+                    order.style.cssText = "width:17px;height:17px;margin:3px 3px 0px 0px;float:left;background:url(https://lbs.qq.com/tool/getpoint/img/marker_n.png) " + leftn + "px 0px";
+                    div.appendChild(order);
+                    var pannel = document.createElement("div");
+                    pannel.style.cssText = "width:200px;float:left;";
+                    div.appendChild(pannel);
+                    var name = document.createElement("p");
+                    name.style.cssText = "margin:0px;color:#0000CC";
+                    name.innerHTML = ele.title;
+                    pannel.appendChild(name);
+                    var address = document.createElement("p");
+                    address.style.cssText = "margin:0px;";
+                    address.innerHTML = "地址:" + ele.address;
+                    pannel.appendChild(address);
+                    if (ele.tel != undefined) {
+                        var phone = document.createElement("p");
+                        phone.style.cssText = "margin:0px;";
+                        phone.innerHTML = "电话:" + ele.tel;
+                        pannel.appendChild(phone);
+                    }
+                    var position = document.createElement("p");
+                    position.style.cssText = "margin:0px;";
+                    position.innerHTML = "坐标:" + ele.location.lat.toFixed(6) + "," + ele.location.lng.toFixed(6);
+                    pannel.appendChild(position);
+                    bside.appendChild(div);
+                    console.log("pannel.offsetHeight", pannel.offsetHeight)
+                    div.style.height = pannel.offsetHeight + "px";
+                    div.isClicked = false;
+                    div.index = n;
+                    marker.div = div;
+                    div.marker = marker;
+                });
+                $("#bside_left").delegate(".info_list", "mouseover", function (e) {
+
+                    var n = this.index;
+
+                    setCurrent(markerArray, n, false);
+                    setCurrent(markerArray, n, true);
+                });
+                $("#bside_left").delegate(".info_list", "mouseout", function () {
+                    each(markerArray, function (n, ele) {
+                        if (!ele.isClicked) {
+                            setAnchor(ele, true);
+                            ele.div.style.background = "#fff";
+                        }
+                    })
+                });
+                $("#bside_left").delegate(".info_list", "click", function (e) {
+                    var n = this.index;
+                    setFlagClicked(markerArray, n);
+                    setCurrent(markerArray, n, false);
+                    setCurrent(markerArray, n, true);
+                    map.setCenter(markerArray[n].position);
+                    document.getElementById("addr_cur").value = this.childNodes[1].childNodes[1].innerHTML.substring(3);
+                });
+            } else {
+
+                bside.innerHTML = "";
+                each(markerArray, function (n, ele) {
+                    ele.setMap(null);
+                });
+                markerArray.length = 0;
+                var novalue = document.createElement('div');
+                novalue.id = "no_value";
+                novalue.innerHTML = "对不起,没有搜索到您要找的结果!";
+                bside.appendChild(novalue);
+                isNoValue = true;
+            }
+        });
+    });
+
+    btnSearch.onmousedown = function () {
+        this.className = "btn_active";
+    };
+    btnSearch.onmouseup = function () {
+        this.className = "btn";
+    };
+
+    function setAnchor(marker, flag) {
+        var left = marker.index * 27;
+        if (flag == true) {
+            var anchor = new qq.maps.Point(10, 30),
+                origin = new qq.maps.Point(left, 0),
+                size = new qq.maps.Size(27, 33),
+                icon = new qq.maps.MarkerImage("https://lbs.qq.com/tool/getpoint/img/marker10.png", size, origin, anchor);
+            marker.setIcon(icon);
+        } else {
+            var anchor = new qq.maps.Point(10, 30),
+                origin = new qq.maps.Point(left, 35),
+                size = new qq.maps.Size(27, 33),
+                icon = new qq.maps.MarkerImage("https://lbs.qq.com/tool/getpoint/img/marker10.png", size, origin, anchor);
+            marker.setIcon(icon);
+        }
+    }
+
+    function setCurrent(arr, index, isMarker) {
+        if (isMarker) {
+            each(markerArray, function (n, ele) {
+                if (n == index) {
+                    setAnchor(ele, false);
+                    ele.setZIndex(10);
+                } else {
+                    if (!ele.isClicked) {
+                        setAnchor(ele, true);
+                        ele.setZIndex(9);
+                    }
+                }
+            });
+        } else {
+            each(markerArray, function (n, ele) {
+                if (n == index) {
+                    ele.div.style.background = "#DBE4F2";
+                } else {
+                    if (!ele.div.isClicked) {
+                        ele.div.style.background = "#fff";
+                    }
+                }
+            });
+        }
+    }
+
+    function setFlagClicked(arr, index) {
+        each(markerArray, function (n, ele) {
+            if (n == index) {
+                ele.isClicked = true;
+                ele.div.isClicked = true;
+                var str = '<div style="width:250px;">' + ele.div.children[1].innerHTML.toString() + '</div>';
+                var latLng = ele.getPosition();
+                document.getElementById("poi_cur").value = latLng.getLat().toFixed(6) + "," + latLng.getLng().toFixed(6);
+            } else {
+                ele.isClicked = false;
+                ele.div.isClicked = false;
+            }
+        });
+    }
+
+    var city = document.getElementById("city");
+
+    curCity.onclick = function (e) {
+        var e = e || window.event,
+            target = e.target || e.srcElement;
+        if (target.innerHTML == "更换城市") {
+            city.style.display = "block";
+            if (isNoValue) {
+                bside.innerHTML = "";
+                each(markerArray, function (n, ele) {
+                    ele.setMap(null);
+                });
+                markerArray.length = 0;
+            }
+
+        }
+    };
+
+    var url2;
+    city.onclick = function (e) {
+        var e = e || window.event,
+            target = e.target || e.srcElement;
+        if (target.className == "close") {
+            city.style.display = "none";
+        }
+        if (target.className == "city_name") {
+
+            curCity.children[0].innerHTML = target.innerHTML;
+
+            url2 = encodeURI("https://apis.map.qq.com/ws/geocoder/v1/?region=" + curCity.children[0].innerHTML + "&address=" + curCity.children[0].innerHTML + "&key=XQ3BZ-6X2Y6-3HNSL-EDDG3-B2AJQ-6TBIF&output=jsonp&&callback=?");
+            $.getJSON(url2, function (result) {
+                map.setCenter(new qq.maps.LatLng(result.result.location.lat, result.result.location.lng));
+                map.setZoom(10);
+            });
+            city.style.display = "none";
+        }
+    };
+
+    var url4;
+    $(".search_t").autocomplete({
+        source: function (request, response) {
+            url4 = encodeURI("https://apis.map.qq.com/ws/place/v1/suggestion/?keyword=" + request.term + "&region=" + curCity.children[0].innerHTML + "&key=XQ3BZ-6X2Y6-3HNSL-EDDG3-B2AJQ-6TBIF&output=jsonp&&callback=?");
+            $.getJSON(url4, function (result) {
+
+                response($.map(result.data, function (item) {
+                    return ({
+                        label: item.title
+
+                    })
+                }));
+            });
+        }
+    });
+
+    function each(obj, fn) {
+        for (var n = 0, l = obj.length; n < l; n++) {
+            fn.call(obj[n], n, obj[n]);
+        }
+    }
+
+    /**
+     * 保存
+     */
+    function saveItems() {
+
+        parent.$("#activity_location").val($("#addr_cur").val());
+        parent.$("#lat_lng").val($("#poi_cur").val());
+        var index = parent.layer.getFrameIndex(window.name);
+        parent.layer.close(index);
+    }
+
+    /**
+     * 取消
+     */
+    function removeIframe() {
+        var index = parent.layer.getFrameIndex(window.name);
+        parent.layer.close(index);
+    }
+</script>
+<ul class="ui-autocomplete ui-front ui-menu ui-widget ui-widget-content ui-corner-all" id="ui-id-1" tabindex="0"
+    style="display: none;">
+</ul>
+
+
+</body>
+</html>