Browse Source

更新支持亚马逊图片方案

chenjunkai 6 years ago
parent
commit
6a30fa83b7

+ 3 - 0
.gitignore

@@ -5,3 +5,6 @@
 /object/__pycache__
 /langer/__pycache__
 /controller/__pycache__
+/model/__pycache__
+/model/migrations
+/service/__pycache__

+ 151 - 0
controller/AsImg.py

@@ -0,0 +1,151 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: langer
+@software: PyCharm
+@DATE: 2019/6/3 17:29
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: User.py
+@Contact: chanjunkai@163.com
+"""
+import json
+import time
+
+from django.views.generic import TemplateView
+
+from model.models import AsImgModel
+from object.ResponseObject import ResponseObject
+from object.TokenObject import TokenObject
+from service.CommonService import CommonService
+
+
+class addView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        url = request_dict.get('url', None)
+        asin = request_dict.get('asin', None)
+        tko = TokenObject(token)
+        if tko.code == 0:
+            img_md5 = CommonService.get_remote_md5_sum(url=url)
+            nowTime = int(time.time())
+            create_dict = {
+                'asin': asin,
+                'md5': img_md5,
+                'url': url,
+                'addTime': nowTime,
+                'updTime': nowTime
+            }
+            AsImgModel.objects.create(**create_dict)
+            return response.json(0)
+        else:
+            return response.json(tko.code)
+
+
+class queryView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        searchAsin = request_dict.get('searchAsin', None)
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+
+        tko = TokenObject(token)
+        if tko.code == 0:
+            userID = tko.userID
+            ai_qs = AsImgModel.objects.filter()
+            if searchAsin:
+                ai_qs = ai_qs.filter(asin__contains=searchAsin)
+            count = ai_qs.count()
+            ai_qs = ai_qs[(page - 1) * line:page * line]
+            if ai_qs.exists():
+                res = list(ai_qs.values('id', 'addTime', 'updTime', 'asin', 'md5', 'url'))
+                return response.json(0, res, extra={'count': count})
+            else:
+                return response.json(0)
+        else:
+            return response.json(tko.code)
+
+
+class updateView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        id = request_dict.get('id', None)
+        asin = request_dict.get('asin', None)
+        url = request_dict.get('url', None)
+
+        nowTime = int(time.time())
+        tko = TokenObject(token)
+        if tko.code == 0:
+            ai_qs = AsImgModel.objects.filter(id=id)
+            update_dict = {'updTime': nowTime}
+            if asin:
+                update_dict['asin'] = asin
+            if url:
+                update_dict['url'] = url
+                img_md5 = CommonService.get_remote_md5_sum(url=url)
+                update_dict['md5'] = img_md5
+            ai_qs.update(**update_dict)
+            return response.json(0)
+        else:
+            return response.json(tko.code)
+
+
+class deleteView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+        if tko.code == 0:
+            id = request_dict.get('id', None)
+            if id:
+                AsImgModel.objects.filter(id=id).delete()
+                return response.json(0)
+            else:
+                return response.json(0)
+        else:
+            return response.json(tko.code)

+ 94 - 0
controller/SysSet.py

@@ -0,0 +1,94 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: langer
+@software: PyCharm
+@DATE: 2019/9/6 11:02
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: SysSet.py
+@Contact: chanjunkai@163.com
+"""
+import json
+import time
+from var_dump import var_dump
+
+from django.views.generic import TemplateView
+
+from model.models import SysSetModel
+from object.ResponseObject import ResponseObject
+from object.TokenObject import TokenObject
+from service.CommonService import CommonService
+
+
+class queryView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        key_list = request_dict.get('key_list')
+        tko = TokenObject(token)
+        if tko.code == 0:
+            userID = tko.userID
+            if key_list:
+                sys_qs = SysSetModel.objects.filter(key__in=key_list).values('id', 'key', 'val')
+                res = {}
+                for i in sys_qs:
+                    res[i['key']] = i['val']
+                return response.json(0, res)
+            else:
+                pass
+        else:
+            return response.json(tko.code)
+
+
+class updateView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        update_data = request_dict.get('update_data', None)
+        # asinterval = request_dict.get('update_data', None)
+        # asimgEmail = request_dict.get('asimgEmail', None)
+        from var_dump import var_dump
+        var_dump(update_data)
+        if not update_data:
+            return response.json(0)
+        nowTime = int(time.time())
+        tko = TokenObject(token)
+        if tko.code == 0:
+            for i in update_data:
+                sys_qs = SysSetModel.objects.filter(key=i['key'])
+                if sys_qs.exists():
+                    sys_qs.update(val=i['val'], updTime=nowTime)
+                else:
+                    create_dict = {
+                        'addTime': nowTime,
+                        'updTime': nowTime,
+                        'key': i['key'],
+                        'val': i['val'],
+                    }
+                    SysSetModel.objects.create(**create_dict)
+            return response.json(0)
+        else:
+            return response.json(tko.code)

+ 9 - 2
langer/urls.py

@@ -1,6 +1,6 @@
 from django.contrib import admin
 from django.urls import path, re_path
-from controller import User, LangSet, LangWord, LangArea, WebHook
+from controller import User, LangSet, LangWord, LangArea, WebHook, AsImg, SysSet
 
 urlpatterns = [
     path('admin/', admin.site.urls),
@@ -12,8 +12,15 @@ urlpatterns = [
     re_path('langSet/(?P<operation>.*)', LangSet.LangSetView.as_view()),
     re_path('langWord/(?P<operation>.*)', LangWord.LangWordView.as_view()),
     re_path('langArea/(?P<operation>.*)', LangArea.LangAreaView.as_view()),
-    path('exportLang',LangArea.exportLangView.as_view()),
+    path('exportLang', LangArea.exportLangView.as_view()),
     # 47 hook
     path('hookWeb', WebHook.HookWebView.as_view()),
 
+    path('asimg/add', AsImg.addView.as_view()),
+    path('asimg/query', AsImg.queryView.as_view()),
+    path('asimg/update', AsImg.updateView.as_view()),
+    path('asimg/delete', AsImg.deleteView.as_view()),
+
+    path('sysSet/query', SysSet.queryView.as_view()),
+    path('sysSet/update', SysSet.updateView.as_view()),
 ]

BIN
model/__pycache__/__init__.cpython-36.pyc


BIN
model/__pycache__/admin.cpython-36.pyc


BIN
model/__pycache__/models.cpython-36.pyc


+ 0 - 93
model/migrations/0001_initial.py

@@ -1,93 +0,0 @@
-# Generated by Django 2.1.4 on 2019-06-03 09:12
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    initial = True
-
-    dependencies = [
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='LangAreaModel',
-            fields=[
-                ('id', models.AutoField(primary_key=True, serialize=False)),
-                ('lang', models.CharField(default='', max_length=32, verbose_name='语言')),
-                ('addTime', models.IntegerField(default=0, verbose_name='添加时间')),
-                ('updTime', models.IntegerField(default=0, verbose_name='更新时间')),
-            ],
-            options={
-                'verbose_name': '语种',
-                'db_table': 'lang_area',
-                'ordering': ('-addTime',),
-            },
-        ),
-        migrations.CreateModel(
-            name='LangKeyModel',
-            fields=[
-                ('id', models.AutoField(primary_key=True, serialize=False)),
-                ('word_key', models.CharField(default='', max_length=64, verbose_name='词汇键')),
-                ('addTime', models.IntegerField(default=0, verbose_name='添加时间')),
-                ('updTime', models.IntegerField(default=0, verbose_name='更新时间')),
-            ],
-            options={
-                'verbose_name': '词汇k表',
-                'db_table': 'lang_key',
-                'ordering': ('-addTime',),
-            },
-        ),
-        migrations.CreateModel(
-            name='LangSetModel',
-            fields=[
-                ('id', models.AutoField(primary_key=True, serialize=False)),
-                ('addTime', models.IntegerField(default=0, verbose_name='添加时间')),
-                ('updTime', models.IntegerField(default=0, verbose_name='更新时间')),
-                ('lang', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='model.LangAreaModel', verbose_name='关联语种id')),
-            ],
-            options={
-                'verbose_name': '用户关联语种配置',
-                'db_table': 'lang_set',
-                'ordering': ('-addTime',),
-            },
-        ),
-        migrations.CreateModel(
-            name='LangValModel',
-            fields=[
-                ('id', models.AutoField(primary_key=True, serialize=False)),
-                ('word_val', models.CharField(default='', max_length=64, verbose_name='词汇v')),
-                ('addTime', models.IntegerField(default=0, verbose_name='添加时间')),
-                ('updTime', models.IntegerField(default=0, verbose_name='更新时间')),
-                ('la', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='model.LangAreaModel', verbose_name='词汇k关联语种')),
-                ('lk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='model.LangKeyModel', verbose_name='v关联词汇k')),
-            ],
-            options={
-                'verbose_name': '词汇v表',
-                'db_table': 'lang_val',
-                'ordering': ('-addTime',),
-            },
-        ),
-        migrations.CreateModel(
-            name='UserModel',
-            fields=[
-                ('id', models.AutoField(primary_key=True, serialize=False)),
-                ('username', models.CharField(default='', max_length=64, unique=True, verbose_name='用户名')),
-                ('password', models.CharField(default='', max_length=128, verbose_name='密码')),
-                ('addTime', models.IntegerField(default=0, verbose_name='添加时间')),
-                ('updTime', models.IntegerField(default=0, verbose_name='更新时间')),
-            ],
-            options={
-                'verbose_name': '用户表',
-                'db_table': 'lang_user',
-                'ordering': ('-addTime',),
-            },
-        ),
-        migrations.AddField(
-            model_name='langsetmodel',
-            name='user',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='model.UserModel', verbose_name='用户表id'),
-        ),
-    ]

+ 0 - 18
model/migrations/0002_auto_20190611_1005.py

@@ -1,18 +0,0 @@
-# Generated by Django 2.1.4 on 2019-06-11 02:05
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('model', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='langkeymodel',
-            name='word_key',
-            field=models.CharField(default='', max_length=64, unique=True, verbose_name='词汇键'),
-        ),
-    ]

BIN
model/migrations/__pycache__/0001_initial.cpython-36.pyc


BIN
model/migrations/__pycache__/0002_auto_20190611_1005.cpython-36.pyc


BIN
model/migrations/__pycache__/__init__.cpython-36.pyc


+ 29 - 1
model/models.py

@@ -49,7 +49,7 @@ class LangSetModel(models.Model):
 # 词汇
 class LangKeyModel(models.Model):
     id = models.AutoField(primary_key=True)
-    word_key = models.CharField(default='', max_length=64, verbose_name='词汇键',unique=True)
+    word_key = models.CharField(default='', max_length=64, verbose_name='词汇键', unique=True)
     addTime = models.IntegerField(default=0, verbose_name='添加时间')
     updTime = models.IntegerField(default=0, verbose_name='更新时间')
 
@@ -71,3 +71,31 @@ class LangValModel(models.Model):
         ordering = ('-addTime',)
         verbose_name = '词汇v表'
         db_table = 'lang_val'
+
+
+#
+class AsImgModel(models.Model):
+    id = models.AutoField(primary_key=True)  # 主键
+    asin = models.CharField(default='', max_length=32, verbose_name='产品编码', db_index=True)  # 产品asin吗,唯一
+    url = models.CharField(default='', max_length=128, verbose_name='产品图片url')
+    md5 = models.CharField(default='', max_length=128, verbose_name='图片md5')
+    addTime = models.IntegerField(default=0, verbose_name="添加时间")
+    updTime = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        ordering = ('-addTime',)
+        verbose_name = '亚马逊图片表'
+        db_table = 'as_img'
+
+
+class SysSetModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    key = models.CharField(default='', max_length=64, verbose_name='键名')  # 亚马逊产品图片检测邮箱
+    val = models.CharField(default='', max_length=64, verbose_name='键值')  # 亚马逊产品图片检测邮箱
+    addTime = models.IntegerField(default=0, verbose_name='添加时间')
+    updTime = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        ordering = ('-addTime',)
+        verbose_name = '系统配置表'
+        db_table = 'sys_set'

+ 83 - 0
object/RedisObject.py

@@ -0,0 +1,83 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerOA
+@software: PyCharm
+@DATE: 2018/8/8 17:00
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: RedisObject.py
+@Contact: chanjunkai@163.com
+"""
+import redis
+
+
+# SERVER_HOST = '192.168.136.45'
+
+'''
+db=3  -> 统计在线人数用
+'''
+# SERVER_HOST = 'localhost'
+SERVER_HOST = '192.168.136.45'
+
+
+class RedisObject:
+
+    def __init__(self, db=0):
+        self.POOL = redis.ConnectionPool(host=SERVER_HOST, port=6379, db=db)
+        self.CONN = redis.Redis(connection_pool=self.POOL)
+
+    def set_data(self, key, val, expire=0):
+        try:
+            self.CONN.set(key, val)
+            if expire > 0:
+                self.CONN.expire(key, expire)
+        except Exception as e:
+            return False
+        else:
+            return True
+
+    def get_data(self, key):
+        try:
+            val = self.CONN.get(key)
+        except Exception as e:
+            print(repr(e))
+            return False
+        else:
+            if val:
+                return val.decode('utf-8')
+            else:
+                return False
+
+    def del_data(self, key):
+        try:
+            val = self.CONN.delete(key)
+        except Exception as e:
+            print(repr(e))
+            return False
+        else:
+            return True
+
+    def get_size(self):
+        return self.CONN.dbsize()
+
+    # 向列表插入数据
+    def rpush(self, name, val):
+        self.CONN.rpush(name, val)
+
+    # 获取列表长度
+    def llen(self, name):
+        return self.CONN.llen(name=name)
+
+    # 获取列表所有数据
+    def lrange(self, name, start, end):
+        return self.CONN.lrange(name, start, end)
+
+    def get_ttl(self, key):
+        ttl = self.CONN.ttl(key)
+        if ttl:
+            return ttl
+        else:
+            return 0

+ 35 - 0
service/CommonService.py

@@ -0,0 +1,35 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: langer
+@software: PyCharm
+@DATE: 2019/9/4 17:18
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: CommonService.py
+@Contact: chanjunkai@163.com
+"""
+
+import hashlib
+from urllib.request import urlopen
+
+
+# 通过url获取文件md5
+class CommonService:
+    @staticmethod
+    def get_remote_md5_sum(url, max_file_size=100 * 1024 * 1024):
+        remote = urlopen(url)
+        hash = hashlib.md5()
+        total_read = 0
+        while True:
+            data = remote.read(4096)
+            total_read += 4096
+
+            if not data or total_read > max_file_size:
+                break
+
+            hash.update(data)
+
+        return hash.hexdigest()

+ 468 - 0
web/imgTab.html

@@ -0,0 +1,468 @@
+<!doctype html>
+<html lang="zh">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>afaa</title>
+    <link rel="stylesheet" type="text/css" href="css/normalize.css"/>
+    <link rel="stylesheet" type="text/css" href="css/default.css">
+    <link rel="stylesheet" href="css/style.css">
+    <link href="http://cdn.bootcss.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet">
+    <link href="css/bootstrap.min.css" rel="stylesheet">
+    <link href="http://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css" rel="stylesheet">
+
+    <script src="https://npmcdn.com/tether@1.2.4/dist/js/tether.min.js"></script>
+    <script src="js/jquery.min.js"></script>
+    <script src="js/bootstrap.min.js"></script>
+    <script src="js/jquery_cookie_min.js"></script>
+    <script src="js/scripts.js"></script>
+    <script src="js/jqhttpsdk.js"></script>
+    <script src="js/jkcor.js"></script>
+    <script src="js/pages.js"></script>
+    <script src="js/datachange.js"></script>
+    <script src="http://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js" type="text/javascript"></script>
+</head>
+<body>
+<div class="clear-backend">
+    <div class="avatar">
+        <div>
+            <a href="javascript:void(0);" target="_blank">
+                <img src="img/admin.png" alt="">
+            </a>
+        </div>
+    </div>
+    <input type="radio" class="tab-1" name="tab" onclick="location.href='index.html'">
+    <span>Home</span><i class="fa fa-home"></i>
+
+    <input type="radio" class="tab-2" name="tab" onclick="location.href='langTab.html'">
+    <span>Lang</span><i class="fa fa-medium"></i>
+
+    <input type="radio" class="tab-3" name="tab" onclick="location.href='imgTab.html'">
+    <span>Users</span><i class="fa fa-user"></i>
+
+    <input type="radio" class="tab-4" name="tab" checked="checked">
+    <span>Azimg</span><i class="fa fa-image"></i>
+
+    <!-- tab-top-bar -->
+    <div class="top-bar">
+        <ul>
+            <li>
+                <a href="login.html" title="Log Out">
+                    <i class="fa fa-sign-out"></i>
+                </a>
+            </li>
+            <!--
+            <li>
+                <a href="javascript:void(0);" title="Messages">
+                    <i class="fa fa-envelope"></i>
+                </a>
+            </li>
+            -->
+            <li>
+                <a href="javascript:void(0);" title="Edit" onclick="editSysFunc()">
+                    <i class="fa fa-edit"></i>
+                </a>
+            </li>
+        </ul>
+    </div>
+
+    <!-- tab-content -->
+    <div class="tab-content" style="overflow: auto">
+        <section class="tab-item-4" style="height: 100%;width: 100%">
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-md-12">
+                        <form class="form-inline" role="form">
+                            <div class="form-group">
+                                <label class="sr-only" for="asin_add_input">ASIN</label>
+                                <input type="text" class="form-control" id="asin_add_input"
+                                       placeholder="请输入ASIN">
+                            </div>
+                            <div class="form-group">
+                                <label class="sr-only" for="url_add_input">链接</label>
+                                <input type="text" class="form-control" id="url_add_input"
+                                       placeholder="请输入图片url">
+                            </div>
+                            <button type="submit" class="btn btn-primary" onclick="subAddImgAction();return false;">
+                                保存
+                            </button>
+                        </form>
+                    </div>
+                    <div class="col-md-12">
+                        <form class="form-inline float-right" role="form">
+                            <div class="form-group">
+                                <input type="text" class="form-control" id="searchInput" placeholder="请输入搜索的ASIN">
+                            </div>
+                            <button type="submit" class="btn btn-primary" onclick="subSearchAsinAction();return false;">
+                                搜索
+                            </button>
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <hr>
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-md-12">
+                        <table class="table table-bordered table-hover">
+                            <thead id="tabHead">
+                            <tr>
+                                <th>编号</th>
+                                <th>ASIN</th>
+                                <th>图片URL</th>
+                                <th>MD5</th>
+                                <th>添加时间</th>
+                                <th>更新时间</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                            <tbody id="tabBody"></tbody>
+                        </table>
+                    </div>
+                </div>
+                <div id="pagination"></div>
+            </div>
+            <!--模态框start-->
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-md-12">
+                        <div class="modal fade" id="modal-container-edit" role="dialog"
+                             aria-labelledby="myModalLabel"
+                             aria-hidden="true">
+                            <div class="modal-dialog" role="document">
+                                <div class="modal-content">
+                                    <div class="modal-header">
+                                        <h5 class="modal-title" id="myModalLabel">
+                                            编辑
+                                        </h5>
+                                        <button type="button" class="close" data-dismiss="modal">
+                                            <span aria-hidden="true">×</span>
+                                        </button>
+                                    </div>
+                                    <div class="modal-body">
+                                        <div class="form-group" id="edit_model_form">
+                                        </div>
+                                    </div>
+                                    <div class="modal-footer">
+
+                                        <button type="button" class="btn btn-primary editRowSaveBtn"
+                                                onclick="editRow(this);return false;">
+                                            保存
+                                        </button>
+                                        <button type="button" class="btn btn-secondary" data-dismiss="modal">
+                                            关闭
+                                        </button>
+                                    </div>
+                                </div>
+
+                            </div>
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!--模态框end-->
+
+
+            <!--修改推送邮箱 模态框start -->
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-md-12">
+                        <div class="modal fade" id="modal-sys-edit" role="dialog"
+                             aria-labelledby="myModalLabel"
+                             aria-hidden="true">
+                            <div class="modal-dialog" role="document">
+                                <div class="modal-content">
+                                    <div class="modal-header">
+                                        <h5 class="modal-title" id="myModalLabel">
+                                            编辑
+                                        </h5>
+                                        <button type="button" class="close" data-dismiss="modal">
+                                            <span aria-hidden="true">×</span>
+                                        </button>
+                                    </div>
+                                    <div class="modal-body">
+                                        <div class="form-group" id="edit_model_form">
+                                            <label for="asimgMsgEmailInput">通知邮箱:</label>
+                                            <input type="text" class="form-control" id="asimgMsgEmailInput">
+                                            <label for="asIntervalINput">时间间隔(小时):</label>
+                                            <input type="text" class="form-control" id="asIntervalINput">
+                                        </div>
+                                    </div>
+                                    <div class="modal-footer">
+
+                                        <button type="button" class="btn btn-primary editRowSaveBtn"
+                                                onclick="SaveSysFunc(this);return false;">
+                                            保存
+                                        </button>
+                                        <button type="button" class="btn btn-secondary" data-dismiss="modal">
+                                            关闭
+                                        </button>
+                                    </div>
+                                </div>
+
+                            </div>
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!--模态框end-->
+
+        </section>
+    </div>
+</div>
+
+<script type="text/javascript">
+    let index_data;
+    var line = 10;
+    $(function () {
+        toastr.options = {
+            "closeButton": true,
+            "debug": false,
+            "newestOnTop": false,
+            "progressBar": true,
+            "positionClass": "toast-top-right",
+            "preventDuplicates": false,
+            "onclick": null,
+            "showDuration": "300",
+            "hideDuration": "500",
+            "timeOut": "5000",
+            "extendedTimeOut": "1000",
+            "showEasing": "swing",
+            "hideEasing": "linear",
+            "showMethod": "fadeIn",
+            "hideMethod": "fadeOut"
+        };
+        InitIndex()
+    });
+
+    function InitIndex() {
+        var page = GetUrlParam('page');
+        page = page.replace('#', '');
+        if (!page) {
+            page = 1
+        }
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'page': page,
+            'line': line
+        }
+        console.log(isNaN(page))
+        let searchAsin = $('#searchInput').val()
+        if (searchAsin) {
+            post_data['searchAsin'] = searchAsin
+        }
+        $('#pagination').empty()
+        $.postJSON(
+            http_ip_prot + 'asimg/query', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    console.log(data)
+                    addTable(data['res']);
+                    let count_page = Math.ceil(data['count'] / line);
+                    $('#pagination').pagination({
+                        pages: count_page, //总页数
+                        // pages: 10000, //总页数
+                        edges: 2,
+                        cssStyle: 'pagination', //按纽大小pagination-lg或写入自定义css
+                        displayedPages: 5, //显示几个
+                        onPageClick: function (pageNumber, event) {
+                            //点击时调用
+                            // alert(pageNumber);
+                            queryData(pageNumber)
+                        },
+                        onInit: function (getid) {
+                            //刷新时或初始化调用
+                            // alert(getid);
+                        }
+                    });
+                } else {
+                    alert(data['msg'])
+                }
+            }
+        );
+    }
+
+    function queryData(page) {
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'page': page,
+            'line': line
+        };
+        let searchAsin = $('#searchInput').val()
+        if (searchAsin) {
+            post_data['searchAsin'] = searchAsin
+        }
+        $.postJSON(
+            http_ip_prot + 'asimg/query', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    // console.log(data['res'])
+                    console.log(data)
+                    addTable(data['res'])
+                } else {
+                    alert(data['msg'])
+                }
+            }
+        );
+    }
+
+    function addTable(data) {
+        index_data = data
+
+        let body_html = ''
+        $.each(data, function (idx, obj) {
+            let edit_btn = '<a href="javascript:void(0);" title="Edit" onclick="editFunc(\'' + obj['id'] + '\')"><i class="fa fa-edit"></i></a>';
+            let del_btn = '<a href="javascript:void(0);" title="Delete" onclick="delAsImg(\'' + obj['id'] + '\')"><i class="fa fa-ban"></i></a>';
+            body_html += '<tr>' +
+                '<td>' + obj['id'] + '</td>' +
+                '<td>' + obj['asin'] + '</td>' +
+                //'<td>' + obj['url'] + '</td>' +
+                '<td><img width="50px" src="' + obj['url'] + '"/></td>' +
+                '<td>' + obj['md5'] + '</td>' +
+                '<td>' + $.DateChange.UnixToDate(obj['addTime'], true, 8) + '</td>' +
+                '<td>' + $.DateChange.UnixToDate(obj['updTime'], true, 8) + '</td>' +
+                '<td>' + edit_btn + '&nbsp;&nbsp;&nbsp;' + del_btn + '</td></tr>'
+        })
+        $('#tabBody').html(body_html)
+    }
+
+    function delAsImg(id) {
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'id': id
+        }
+        let cr = confirm('delete it ?')
+        if (cr) {
+            $.postJSON(
+                http_ip_prot + 'asimg/delete', JSON.stringify(post_data),
+                function (data) {
+                    if (data['code'] == 0) {
+                        console.log(data)
+                        // alert(data['msg'])
+                        window.location.reload()
+                    } else {
+                        alert(data['msg'])
+                    }
+                }
+            );
+        }
+    }
+
+    function editFunc(id) {
+        // alert(langKey)
+        $('#modal-container-edit').modal('show')
+        let html_edit = ''
+        $.each(index_data, function (idx, obj) {
+            if (id == obj['id']) {
+                html_edit = '<input id="editIDInput" type="hidden" value="' + id + '"/>'
+                html_edit += '<label for="editAsinInput">ASIN</label><input type="text" class="form-control" id="editAsinInput" value="' + obj['asin'] + '">'
+                html_edit += '<label for="editUrlInput">图片URL</label><input type="text" class="form-control" id="editUrlInput" value="' + obj['url'] + '">'
+            }
+        });
+        $('#edit_model_form').html(html_edit)
+    }
+
+    function editRow() {
+        let asin = $('#editAsinInput').val()
+        let url = $('#editUrlInput').val()
+        let id = $('#editIDInput').val()
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'asin': asin,
+            'url': url,
+            'id': id
+        }
+        console.log(post_data)
+        $.postJSON(
+            http_ip_prot + 'asimg/update', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    console.log(data)
+                    // alert(data['msg'])
+                    window.location.reload()
+                } else {
+                    alert(data['msg'])
+                }
+            }
+        );
+    }
+
+    function subAddImgAction() {
+        let url = $("#url_add_input").val();
+        let asin = $("#asin_add_input").val();
+        let post_data = {
+            'url': url,
+            'asin': asin,
+            'token': $.cookie('access_token'),
+        };
+        $.postJSON(
+            http_ip_prot + 'asimg/add',
+            JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    //                  alert(data['msg'])
+                    toastr["success"]('保存成功')
+                    InitIndex()
+//                    window.location.reload()
+                } else {
+                    toastr["success"]('保存失败')
+                    console.log(data['msg'])
+                }
+            }
+        );
+    }
+
+    function subSearchAsinAction() {
+        InitIndex()
+    }
+
+    function editSysFunc() {
+        $('#modal-sys-edit').modal('show')
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'key_list': ['asimgEmail', 'asinterval']
+        }
+        $.postJSON(
+            http_ip_prot + 'sysSet/query', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    console.log('-------------------------------')
+                    console.log(data)
+                    console.log('===============================')
+                    $('#asIntervalINput').val(data['res']['asinterval']/3600)
+                    $('#asimgMsgEmailInput').val(data['res']['asimgEmail'])
+                } else {
+                    alert(data['msg'])
+                }
+            }
+        );
+    }
+
+    function SaveSysFunc() {
+        let asinterval = $('#asIntervalINput').val()
+        let asimgEmail = $('#asimgMsgEmailInput').val()
+        let post_data = {
+            'update_data': [
+                {'key': 'asimgEmail', 'val': asimgEmail},
+                {'key': 'asinterval', 'val': asinterval}
+            ],
+            'token': $.cookie('access_token'),
+        }
+        $.postJSON(
+            http_ip_prot + 'sysSet/update', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    console.log(data);
+                    $('#modal-sys-edit').modal('hide')
+                } else {
+                    console.log(data)
+                }
+            }
+        )
+    }
+</script>
+</body>
+</html>

+ 0 - 1
web/index.back.html

@@ -19,7 +19,6 @@
 			</a>
 		</div>
 	</div>
-
 	<!-- tab-menu -->
 	<input type="radio" class="tab-1" name="tab" checked="checked">
 	<span>Home</span><i class="fa fa-home"></i>

+ 18 - 14
web/index.html

@@ -47,7 +47,9 @@
     <input type="radio" class="tab-3" name="tab" onclick="location.href='userTab.html'">
     <span>Users</span><i class="fa fa-user"></i>
 
-    <span></span>
+    <input type="radio" class="tab-4" name="tab" onclick="location.href='imgTab.html'">
+    <span>Azimg</span><i class="fa fa-image"></i>
+
     <!--
 
 
@@ -78,16 +80,18 @@
                     <i class="fa fa-sign-out"></i>
                 </a>
             </li>
-            <li>
-                <a href="" title="Messages">
-                    <i class="fa fa-envelope"></i>
-                </a>
-            </li>
-            <li>
-                <a href="" title="Edit">
-                    <i class="fa fa-edit"></i>
-                </a>
-            </li>
+            <!--
+<li>
+    <a href="" title="Messages">
+        <i class="fa fa-envelope"></i>
+    </a>
+</li>
+<li>
+    <a href="" title="Edit">
+        <i class="fa fa-edit"></i>
+    </a>
+</li>
+            -->
         </ul>
     </div>
 
@@ -234,7 +238,7 @@
             orderByupdate = 1
         }
         var page = GetUrlParam('page')
-        if(!page){
+        if (!page) {
             page = 1
         }
         let post_data = {
@@ -286,7 +290,7 @@
         let searchKey = $('input[name="optionsRadios"]:checked').val();
         let searchVal = $('#searchInput').val()
         var post_data = {}
-        if(searchVal) {
+        if (searchVal) {
             post_data = {
                 'token': $.cookie('access_token'),
                 'page': page,
@@ -295,7 +299,7 @@
                 'searchKey': searchKey,
                 'searchVal': searchVal
             };
-        }else {
+        } else {
             post_data = {
                 'token': $.cookie('access_token'),
                 'page': page,

+ 557 - 0
web/index2.html

@@ -0,0 +1,557 @@
+<!doctype html>
+<html lang="zh">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>afaa</title>
+    <link rel="stylesheet" type="text/css" href="css/normalize.css"/>
+    <link rel="stylesheet" type="text/css" href="css/default.css">
+    <link rel="stylesheet" href="css/style.css">
+    <link href="http://cdn.bootcss.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet">
+    <link href="css/bootstrap.min.css" rel="stylesheet">
+    <link href="http://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css" rel="stylesheet">
+    <script src="https://npmcdn.com/tether@1.2.4/dist/js/tether.min.js"></script>
+    <script src="js/jquery.min.js"></script>
+    <script src="js/bootstrap.min.js"></script>
+    <script src="js/jquery_cookie_min.js"></script>
+    <script src="js/scripts.js"></script>
+    <script src="js/jqhttpsdk.js"></script>
+    <script src="js/jkcor.js"></script>
+    <script src="js/pages.js"></script>
+    <script src="js/datachange.js"></script>
+    <script src="http://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js" type="text/javascript"></script>
+    <style>
+        td {
+            white-space: nowrap;
+        }
+    </style>
+</head>
+<body>
+<div class="clear-backend">
+    <div class="avatar">
+        <div>
+            <a href="javascript:void(0);" target="_blank">
+                <img src="img/admin.png" alt="">
+            </a>
+        </div>
+    </div>
+
+    <!-- tab-menu -->
+    <input type="radio" class="tab-1" name="tab" checked="checked">
+    <span>Home</span><i class="fa fa-home"></i>
+
+    <input type="radio" class="tab-2" name="tab" onclick="location.href='langTab.html'">
+    <span>Lang</span><i class="fa fa-medium"></i>
+
+    <input type="radio" class="tab-3" name="tab" onclick="location.href='userTab.html'">
+    <span>Users</span><i class="fa fa-user"></i>
+
+    <span></span>
+    <!--
+
+
+
+        <input type="radio" class="tab-5" name="tab">
+        <span>Upload</span><i class="fa fa-cloud-upload"></i>
+
+        <input type="radio" class="tab-6" name="tab">
+        <span>Favorite</span><i class="fa fa-star"></i>
+
+        <input type="radio" class="tab-7" name="tab">
+        <span>Photos</span><i class="fa fa-photo"></i>
+
+        <input type="radio" class="tab-8" name="tab">
+        <span>Analysis</span><i class="fa fa-line-chart"></i>
+
+        <input type="radio" class="tab-9" name="tab">
+        <span>Links</span><i class="fa fa-link"></i>
+
+        <input type="radio" class="tab-10" name="tab">
+        <span>Settings</span><i class="fa fa-cog"></i>-->
+
+    <!-- tab-top-bar -->
+    <div class="top-bar">
+        <ul>
+            <li>
+                <a href="login.html" title="Log Out">
+                    <i class="fa fa-sign-out"></i>
+                </a>
+            </li>
+            <li>
+                <a href="" title="Messages">
+                    <i class="fa fa-envelope"></i>
+                </a>
+            </li>
+            <li>
+                <a href="" title="Edit">
+                    <i class="fa fa-edit"></i>
+                </a>
+            </li>
+        </ul>
+    </div>
+
+    <!-- tab-content -->
+    <div class="tab-content" style="overflow: auto">
+        <section class="tab-item-1" style="height: 100%;width: 100%">
+            <div class="container-fluid">
+                <div class="row">
+                    <div id="searchCheckBox" class="col-md-8"></div>
+                    <div class="col-md-4">
+                        <input type="text" class="form-group form-control" id="searchInput"
+                               style="width: 300px;display: inline"/>
+                        <button class="btn btn-danger form-inline" style="margin-bottom: 5px"
+                                onclick="searchKeyAction()">搜索
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <div class="container-fluid">
+                <div class="row">
+                    <!--add-->
+                    <div class="col-md-12">
+                        <table class="table table-bordered table-hover">
+                            <thead id="langTableHead"></thead>
+                            <tbody id="langTableBody"></tbody>
+                        </table>
+                    </div>
+                </div>
+                <div id="pagination"></div>
+
+            </div>
+
+
+            <!---->
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-md-12">
+                        <div class="modal fade" id="modal-container-593541" role="dialog" aria-labelledby="myModalLabel"
+                             aria-hidden="true">
+                            <div class="modal-dialog" role="document">
+                                <div class="modal-content">
+                                    <div class="modal-header">
+                                        <h5 class="modal-title" id="myModalLabel">
+                                            EDIT
+                                        </h5>
+                                        <button type="button" class="close" data-dismiss="modal">
+                                            <span aria-hidden="true">×</span>
+                                        </button>
+                                    </div>
+                                    <div class="modal-body">
+                                        <div class="form-group" id="edit_model_form">
+                                            <!--<label for="InputLangArea">-->
+                                            <!--langArea-->
+                                            <!--</label>-->
+                                            <!--<input type="text" class="form-control" id="InputLangArea"/>-->
+                                        </div>
+                                    </div>
+                                    <div class="modal-footer">
+
+                                        <button type="button" class="btn btn-primary editRowSaveBtn"
+                                                onclick="editRow(this);return false;">
+                                            Save changes
+                                        </button>
+                                        <button type="button" class="btn btn-secondary" data-dismiss="modal">
+                                            Close
+                                        </button>
+                                    </div>
+                                </div>
+
+                            </div>
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <!---->
+        </section>
+        <section class="tab-item-2">
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-md-12">
+                    </div>
+                </div>
+            </div>
+        </section>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var orderByupdate = 0
+    var page = 1
+    var line = 10
+
+    $(function () {
+        toastr.options = {
+            "closeButton": true,
+            "debug": false,
+            "newestOnTop": false,
+            "progressBar": true,
+            "positionClass": "toast-top-right",
+            "preventDuplicates": false,
+            "onclick": null,
+            "showDuration": "300",
+            "hideDuration": "500",
+            "timeOut": "5000",
+            "extendedTimeOut": "1000",
+            "showEasing": "swing",
+            "hideEasing": "linear",
+            "showMethod": "fadeIn",
+            "hideMethod": "fadeOut"
+        }
+        var page = GetUrlParam('page')
+        if (!page) {
+            page = 1
+        }
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'page': page,
+            'line': line,
+            'orderByupdate': orderByupdate
+        };
+        InitIndex(post_data)
+        // $('#pagination').pagination({
+        //     pages: 50, //总页数
+        //     edges: 2,
+        //     cssStyle: 'pagination-sm', //按纽大小pagination-lg或写入自定义css
+        //     displayedPages: 5, //显示几个
+        //     onPageClick: function(pageNumber, event) {
+        //         //点击时调用
+        //         // alert(pageNumber);
+        //     },
+        //     onInit: function(getid) {
+        //         //刷新时或初始化调用
+        //         // alert(getid);
+        //     }
+        // });
+    });
+
+    function orderByUpdateTimeFunc(status) {
+        if (status === 1) {
+            orderByupdate = 0
+        } else {
+            orderByupdate = 1
+        }
+        var page = GetUrlParam('page')
+        if(!page){
+            page = 1
+        }
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'page': page,
+            'line': 10,
+            'orderByupdate': orderByupdate
+        };
+        InitIndex(post_data)
+    }
+
+    function InitIndex(post_data) {
+
+        $.postJSON(
+            http_ip_prot + 'langWord/query', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    // console.log(data['res'])
+                    console.log(data)
+                    addTable(data['res'])
+                    let count_page = Math.ceil(data['res']['count'] / line)
+                    $('#pagination').pagination({
+                        pages: count_page, //总页数
+                        // pages: 10000, //总页数
+                        edges: 2,
+                        cssStyle: 'pagination', //按纽大小pagination-lg或写入自定义css
+                        displayedPages: 5, //显示几个
+                        onPageClick: function (pageNumber, event) {
+                            //点击时调用
+                            // alert(pageNumber);
+                            queryData(pageNumber)
+                        },
+                        onInit: function (getid) {
+                            //刷新时或初始化调用
+                            // alert(getid);
+                        }
+                    });
+                } else {
+                    alert(data['msg'])
+                }
+            }
+        );
+    }
+
+    let la_list
+    let lw_data
+
+    function queryData(page) {
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'page': page,
+            'line': 10,
+            'orderByupdate': orderByupdate
+        };
+        $.postJSON(
+            http_ip_prot + 'langWord/query', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    // console.log(data['res'])
+                    console.log(data)
+                    addTable(data['res'])
+                } else {
+                    alert(data['msg'])
+                }
+            }
+        );
+    }
+
+    function addTable(data) {
+        //头部多区域语言
+        let head_data = data['la_list'];
+        la_list = head_data
+        // body部详细语言
+        let body_data = data['lw_dict'];
+        lw_data = body_data
+        let head_html = '<tr><th>key</th>';
+        let search_tab = '<label><input type="radio" name="optionsRadios" value="key" checked>key</label>'
+
+        //头部标签添加
+
+        $.each(head_data.reverse(), function (idx, obj) {
+            // console.log(idx)
+            head_html += ('<th>' + obj['lang'] + '</th>')
+            search_tab += '&nbsp;&nbsp;&nbsp;<label><input type="radio" name="optionsRadios" value="' + obj['lang'] + '">' + obj['lang'] + '</label>'
+        });
+        // head_html += '<th>udpateTime &nbsp;<i class="fa fa-arrow-down" aria-hidden="true"></i></td><th width="180px"><a href="#" onclick="addRow()">add</a></th></tr>';
+        head_html += ('<th><a href="javascript:void(0);" onclick="orderByUpdateTimeFunc(' + orderByupdate + ')">udpateTime &nbsp;<i class="fa ' + (orderByupdate == 1 ? 'fa-arrow-up' : 'fa-arrow-down') + '" aria-hidden="true"></i></a></td><th width="180px"><a href="javascript:void(0);" onclick="addRow()">add</a></th></tr>');
+        // search_tab += '<td width="180px"><button class="btn-primary btn">搜索</button></td></tr>';
+        $('#searchCheckBox').html(search_tab)
+        let body_html = '';
+
+        console.log('--------');
+        $.each(body_data, function (idx, obj) {
+            // console.log(idx)
+            console.log(obj)
+            //let edit_btn = '<a href="javascript:void(0);" title="Edit" onclick="editFunc(\'' + idx + '\')"><i class="fa fa-edit"></i></a>';
+            //let del_btn = '<a href="javascript:void(0);" title="Delete" onclick="deleteFunc(\'' + idx + '\')"><i class="fa fa-ban"></i></a>';
+            let edit_btn = '<a href="javascript:void(0);" title="Edit" onclick="editFunc(this)"><i class="fa fa-edit"></i></a>';
+            let del_btn = '<a href="javascript:void(0);" title="Delete" onclick="deleteFunc(this)"><i class="fa fa-ban"></i></a>';
+            // let del_btn = '';
+            body_html += '<tr>';
+            body_html += ('<td>' + idx + '</td>');
+
+            $.each(la_list, function (x, y) {
+                if (obj[y['lang']]) {
+                    body_html += ('<td>' + obj[y['lang']] + '</td>')
+                } else {
+                    body_html += ('<td></td>')
+                }
+            });
+            let updTime = $.DateChange.UnixToDate(obj['updTime'], true, 8);
+            body_html += ('<td>' + updTime + '<span class="arrow dsc"></td><td>' + edit_btn + '&nbsp;&nbsp;&nbsp;' + del_btn + '</td></tr>');
+        });
+
+        $('#langTableHead').empty().html(head_html);
+        $('#langTableBody').empty().html(body_html);
+        addDelFunc()
+    }
+
+    function addRow() {
+
+        let newRow = '<tr><td><input class="form-control" type="text" langID="key" id="newRow_key"></td>'
+        $.each(la_list, function (idx, obj) {
+            // console.log(idx)
+            // newRow += ('<td>' + obj['id'] + '</td>')
+            newRow += ('<td>' +
+                '<input class="form-control" type="text" langID="' + obj['id'] + '" id="newRow_lang_' + obj['id'] + '">' +
+                '</td>')
+        })
+        let save_btn = '<a href="javascript:void(0);" title="Save" class="save_row"><i class="fa fa-check-circle-o"></i></a>';
+        let del_btn = '<a href="javascript:void(0);" title="Delete" class="del_row"><i class="fa fa-ban"></i></a>';
+
+        newRow += '<td></td><td>' + save_btn + '&nbsp;&nbsp;&nbsp;' + del_btn + '</td></tr>'
+        $('#langTableBody').prepend(newRow)
+        addDelFunc()
+        addSaveFunc()
+    }
+
+    function addDelFunc() {
+        $(".del_row").bind("click", function () {
+            let trRow = $(this).parent().parent()
+            trRow.remove()
+        });
+    }
+
+    function addSaveFunc() {
+        $(".save_row").bind("click", function () {
+            let post_data = {
+                'token': $.cookie('access_token')
+            }
+            let post_list = []
+            let trRow = $(this).parent().parent()
+            trRow.find('input').each(function () {
+                // console.log($(this).attr('id'))
+                // console.log($(this).attr('langID'))
+                let inputVal = $(this).val()
+                let langID = $(this).attr('langID')
+                if (langID === 'key') {
+                    post_data['word_key'] = inputVal
+                } else {
+                    post_list.push({'la_id': langID, 'val': inputVal})
+                }
+            })
+            post_data['word_arr'] = post_list
+            console.log(post_data)
+            $.postJSON(
+                http_ip_prot + 'langWord/add', JSON.stringify(post_data),
+                function (data) {
+                    if (data['code'] == 0) {
+                        // console.log(data['res'])
+                        window.location.reload();
+                        console.log(data)
+                    } else {
+                        alert(data['msg'])
+                    }
+                }
+            )
+        })
+    }
+
+
+    // 编辑模态框
+    function editFunc($this) {
+
+        let langKey = $($this).parent().parent().children().eq(0).text()
+        $('#modal-container-593541').modal('show')
+        // let post_data = {'token': $.cookie('access_token')};
+        let html_per = '<label for="lang_key_edit">KEY</label><input class="form-control" type="text" id="lang_key_edit" oldkey="' + langKey + '" value="' + langKey + '"> '
+        $.each(la_list, function (idx, obj) {
+            console.log(obj);
+            html_per += ('<label for="InputLangArea">' + obj['lang'] + ':</label>' +
+                '<input type="text" class="form-control" lang="' + obj['lang'] + '" value="' + (lw_data[langKey][obj['lang']] ? lw_data[langKey][obj['lang']] : '') + '"/>')
+        });
+        // console.log(html_per)
+        $('#edit_model_form').html(html_per)
+    }
+
+    function deleteFunc($this) {
+        let langKey = $($this).parent().parent().children().eq(0).text()
+
+        var r = confirm("Press a button")
+        if (r) {
+            let post_data = {
+                'token': $.cookie('access_token'),
+                'word_key': langKey
+            }
+            console.log(post_data)
+            $.postJSON(
+                http_ip_prot + 'langWord/delete', JSON.stringify(post_data),
+                function (data) {
+                    if (data['code'] == 0) {
+                        // console.log(data['res'])
+                        console.log(data);
+                        alert(data['msg']);
+                        window.location.reload();
+                    } else {
+                        alert(data['msg'])
+                    }
+                }
+            )
+        }
+    }
+
+    /*post_data = {
+        word_key_id:1,
+        word_key:xxx,
+        word_arr:[
+            {'lang':'','val':''},
+            {'lang':'','val':''},
+            {'lang':'','val':''}
+        ]
+    }*/
+    function editRow() {
+        let post_data = {}
+        post_data['token'] = $.cookie('access_token')
+        post_data['word_key'] = $('#lang_key_edit').val()
+        post_data['old_word_key'] = $('#lang_key_edit').attr('oldkey')
+        post_data['word_arr'] = {}
+        $('#edit_model_form').find('input').each(function () {
+            let langArea = $(this).attr('lang')
+            if (langArea) {
+                post_data['word_arr'][langArea] = $(this).val()
+            }
+        })
+        console.log(post_data)
+        $.postJSON(
+            http_ip_prot + 'langWord/update', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    // console.log(data['res'])
+                    console.log(data)
+                    toastr["success"](data['msg'])
+                    $('#modal-container-593541').modal('hide')
+                    IndexTable()
+                    //window.location.reload();
+                } else {
+                    alert(data['msg'])
+                }
+            }
+        )
+        // $('.editRowSaveBtn').bind('click', function () {
+        //     console.log('adjslkfjsdalkfj')
+        // })
+    }
+
+    function IndexTable() {
+        var page = GetUrlParam('page')
+        if (!page) {
+            page = 1
+        }
+        let post_data = {
+            'token': $.cookie('access_token'),
+            'page': page,
+            'line': line,
+            'orderByupdate': orderByupdate
+        };
+        $.postJSON(
+            http_ip_prot + 'langWord/query', JSON.stringify(post_data),
+            function (data) {
+                if (data['code'] == 0) {
+                    // console.log(data['res'])
+                    console.log(data)
+                    addTable(data['res'])
+                    let count_page = Math.ceil(data['res']['count'] / line)
+                    queryData(page)
+                } else {
+                    alert(data['msg'])
+                }
+            }
+        );
+    }
+
+    function searchKeyAction() {
+        let searchKey = $('input[name="optionsRadios"]:checked').val();
+        let searchVal = $('#searchInput').val()
+        console.log('-------------------------------')
+        console.log(searchKey)
+        console.log(searchVal)
+        console.log('-------------------------------')
+        let post_data = {}
+        if (searchVal && searchKey) {
+            post_data = {
+                'token': $.cookie('access_token'),
+                'page': 1,
+                'line': 10,
+                'searchKey': searchKey,
+                'searchVal': searchVal
+            };
+        } else {
+            post_data = {
+                'token': $.cookie('access_token'),
+                'page': 1,
+                'line': 10,
+            };
+        }
+        InitIndex(post_data)
+    }
+</script>
+</body>
+</html>

+ 9 - 2
web/langTab.html

@@ -36,6 +36,10 @@
 
     <input type="radio" class="tab-3" name="tab" onclick="location.href='userTab.html'">
     <span>Users</span><i class="fa fa-user"></i>
+
+    <input type="radio" class="tab-4" name="tab" onclick="location.href='imgTab.html'">
+    <span>Azimg</span><i class="fa fa-image"></i>
+
     <!-- tab-top-bar -->
     <div class="top-bar">
         <ul>
@@ -44,6 +48,8 @@
                     <i class="fa fa-sign-out"></i>
                 </a>
             </li>
+                        <!--
+
             <li>
                 <a href="" title="Messages">
                     <i class="fa fa-envelope"></i>
@@ -54,12 +60,13 @@
                     <i class="fa fa-edit"></i>
                 </a>
             </li>
+            -->
         </ul>
     </div>
 
     <!-- tab-content -->
-    <div class="tab-content">
-        <section class="tab-item-2">
+    <div class="tab-content" style="overflow: auto">
+        <section class="tab-item-2" style="height: 100%;width: 100%">
             <div class="container-fluid">
                 <div class="row">
                     <div class="col-md-12">

+ 0 - 0
model/migrations/__init__.py → web/tt.html


+ 7 - 2
web/userTab.html

@@ -37,6 +37,9 @@
     <input type="radio" class="tab-3" name="tab" checked="checked">
     <span>Users</span><i class="fa fa-user"></i>
 
+    <input type="radio" class="tab-4" name="tab" onclick="location.href='imgTab.html'">
+    <span>Azimg</span><i class="fa fa-image"></i>
+
     <!-- tab-top-bar -->
     <div class="top-bar">
         <ul>
@@ -45,6 +48,7 @@
                     <i class="fa fa-sign-out"></i>
                 </a>
             </li>
+            <!--
             <li>
                 <a href="" title="Messages">
                     <i class="fa fa-envelope"></i>
@@ -55,12 +59,13 @@
                     <i class="fa fa-edit"></i>
                 </a>
             </li>
+            -->
         </ul>
     </div>
 
     <!-- tab-content -->
-    <div class="tab-content">
-        <section class="tab-item-3">
+    <div class="tab-content" style="overflow: auto">
+        <section class="tab-item-3" style="height: 100%;width: 100%">
             <div class="container-fluid">
                 <div class="row">
                     <div class="col-md-12">