Sfoglia il codice sorgente

【前端模版】更新模版文件

evoxwht 3 anni fa
parent
commit
fad3dc189c
38 ha cambiato i file con 1437 aggiunte e 154 eliminazioni
  1. 14 0
      template/admin/.env.dev
  2. 15 0
      template/admin/.env.production
  3. 2 5
      template/admin/package.json
  4. 23 1
      template/admin/src/api/system.js
  5. 21 0
      template/admin/src/api/user.js
  6. BIN
      template/admin/src/assets/images/ag-phone.png
  7. 76 0
      template/admin/src/components/remark/index.vue
  8. 32 53
      template/admin/src/components/wangEditor/index.vue
  9. 6 13
      template/admin/src/pages/marketing/storeIntegral/create.vue
  10. 2 2
      template/admin/src/pages/order/offline/index.vue
  11. 166 0
      template/admin/src/pages/setting/agreement/index.vue
  12. 1 1
      template/admin/src/pages/system/group/pc.vue
  13. 314 0
      template/admin/src/pages/user/cancel/handle/task.vue
  14. 269 0
      template/admin/src/pages/user/cancel/index.vue
  15. 9 0
      template/admin/src/router/modules/setting.js
  16. 19 9
      template/admin/src/router/modules/user.js
  17. 1 2
      template/admin/src/setting.js
  18. 15 2
      template/uni-app-live/pages.json
  19. 5 5
      template/uni-app/androidPrivacy.json
  20. 21 12
      template/uni-app/api/user.js
  21. 1 1
      template/uni-app/components/productConSwiper/index.vue
  22. 2 2
      template/uni-app/manifest.json
  23. 14 1
      template/uni-app/pages.json
  24. 1 1
      template/uni-app/pages/activity/presell_details/index.vue
  25. 39 1
      template/uni-app/pages/admin/orderDetail/index.vue
  26. 37 0
      template/uni-app/pages/columnGoods/static/yszc.html
  27. 8 4
      template/uni-app/pages/goods_details/index.vue
  28. 9 8
      template/uni-app/pages/index/diy/index.vue
  29. 12 11
      template/uni-app/pages/index/visualization/index.vue
  30. 1 1
      template/uni-app/pages/points_mall/integral_goods_details.vue
  31. 1 1
      template/uni-app/pages/user/index.vue
  32. 38 3
      template/uni-app/pages/users/admin_order_detail/index.vue
  33. 1 1
      template/uni-app/pages/users/order_details/index.vue
  34. 9 4
      template/uni-app/pages/users/privacy/index.vue
  35. BIN
      template/uni-app/pages/users/static/address.png
  36. 213 0
      template/uni-app/pages/users/user_cancellation/index.vue
  37. 6 0
      template/uni-app/pages/users/user_info/index.vue
  38. 34 10
      template/uni-app/pages/users/user_integral/index.vue

+ 14 - 0
template/admin/.env.dev

@@ -0,0 +1,14 @@
+# 环境
+NODE_ENV=development
+VUE_APP_ENV='dev'
+# 页面 title
+VUE_APP_TITLE=CRMEB
+# socket 客服连接地址
+VUE_APP_WS_KEFU_URL=""
+# socket 系统连接地址
+VUE_APP_WS_ADMIN_URL=""
+
+
+
+# 接口请求地址
+VUE_APP_API_URL=''

+ 15 - 0
template/admin/.env.production

@@ -0,0 +1,15 @@
+# 环境
+NODE_ENV=production
+VUE_APP_ENV='production'
+
+# 页面 title
+VUE_APP_TITLE=CRMEB
+# socket 客服连接地址
+VUE_APP_WS_KEFU_URL=""
+# socket 系统连接地址
+VUE_APP_WS_ADMIN_URL=""
+
+
+
+# 接口请求地址
+VUE_APP_API_URL=""

+ 2 - 5
template/admin/package.json

@@ -4,11 +4,8 @@
   "author": "Lison<lison16new@163.com>",
   "private": false,
   "scripts": {
-    "serve": "vue-cli-service serve --open",
-    "build": "vue-cli-service build",
-    "lint": "vue-cli-service lint",
-    "test:unit": "vue-cli-service test:unit",
-    "test:e2e": "vue-cli-service test:e2e"
+    "serve": "vue-cli-service serve --open --mode=dev",
+    "build": "vue-cli-service build --mode=production"
   },
   "dependencies": {
     "@babel/polyfill": "^7.8.7",

+ 23 - 1
template/admin/src/api/system.js

@@ -506,4 +506,26 @@ export function setAgreement(data) {
         method: 'post',
         data
     })
-}
+}
+
+/**
+ * @description 获取协议
+ * @param data
+ */
+ export function getAgreements(type) {
+    return request({
+        url: `setting/get_agreement/${type}`,
+        method: 'get',
+    })
+}
+/**
+ * @description 设置隐私协议
+ * @param data
+ */
+ export function setAgreements(data, type) {
+    return request({
+        url: `setting/save_agreement`,
+        method: 'post',
+        data
+    })
+}

+ 21 - 0
template/admin/src/api/user.js

@@ -644,4 +644,25 @@ export function getUserInfo(uid) {
         url: `user/user/user_save_info/${uid}`,
         method: 'get'
     });
+}
+
+/**
+ * 用户注销列表
+ */
+export function userCancelList(data) {
+    return request({
+        url: '/user/cancel_list',
+        method: 'get',
+        params: data
+    });
+}
+/**
+ * 用户注销列表
+ */
+export function userCancelSetMark(data) {
+    return request({
+        url: '/user/cancel/set_mark',
+        method: 'post',
+        data
+    });
 }

BIN
template/admin/src/assets/images/ag-phone.png


+ 76 - 0
template/admin/src/components/remark/index.vue

@@ -0,0 +1,76 @@
+<template>
+  <Modal
+    v-model="modals"
+    scrollable
+    title="备注"
+    class="order_box"
+    :closable="false"
+  >
+    <Form
+      ref="formValidate"
+      :model="formValidate"
+      :rules="ruleValidate"
+      :label-width="80"
+      @submit.native.prevent
+    >
+      <FormItem label="备注:" prop="remark">
+        <Input
+          v-model="formValidate.remark"
+          :maxlength="200"
+          show-word-limit
+          type="textarea"
+          placeholder="请输入备注信息"
+          style="width: 100%"
+        />
+      </FormItem>
+    </Form>
+    <div slot="footer">
+      <Button type="primary" @click="putRemark('formValidate')">提交</Button>
+      <Button @click="cancel('formValidate')">取消</Button>
+    </div>
+  </Modal>
+</template>
+
+<script>
+export default {
+  name: "orderMark",
+  data() {
+    return {
+      formValidate: {
+        remark: "",
+      },
+      modals: false,
+      ruleValidate: {
+        remark: [
+          { required: true, message: "请输入备注信息", trigger: "blur" },
+          // { type: 'string', min: 20, message: 'Introduce no less than 20 words', trigger: 'blur' }
+        ],
+      },
+    };
+  },
+  props: {
+    remark: {
+      default: "",
+      type: String,
+    },
+  },
+  methods: {
+    cancel(name) {
+      this.modals = false;
+      this.$refs[name].resetFields();
+    },
+    putRemark(name) {
+      this.$refs[name].validate((valid) => {
+        if (valid) {
+          this.$emit("submitFail", this.formValidate.remark);
+        } else {
+          this.$Message.warning("请填写备注信息");
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style scoped>
+</style>

+ 32 - 53
template/admin/src/components/wangEditor/index.vue

@@ -4,40 +4,17 @@
       <div ref="wang-editor" class="wang-editor" />
     </div>
     <div v-if="monacoBox">
-      <Button type="primary" class="bottom" @click="getHtmlint"
-        >可视化界面</Button
-      >
+      <Button type="primary" class="bottom" @click="getHtmlint">可视化界面</Button>
       <monaco @change="changeValue" :value="newHtml" />
     </div>
 
-    <Modal
-      v-model="modalPic"
-      width="1024px"
-      scrollable
-      footer-hide
-      closable
-      title="上传图片"
-      :mask-closable="false"
-      :z-index="9"
-    >
-      <uploadPictures
-        v-if="modalPic"
-        :isChoice="isChoice"
-        @getPic="getPic"
-        @getPicD="getPicD"
-      ></uploadPictures>
+    <Modal v-model="modalPic" width="1024px" scrollable footer-hide closable title="上传图片" :mask-closable="false"
+      :z-index="9">
+      <uploadPictures v-if="modalPic" :isChoice="isChoice" @getPic="getPic" @getPicD="getPicD"></uploadPictures>
     </Modal>
-    <Modal
-      v-model="modalVideo"
-      width="1024px"
-      scrollable
-      footer-hide
-      closable
-      title="上传视频"
-      :mask-closable="false"
-      :z-index="9"
-    >
-      <uploadVideo @getVideo="getvideo"></uploadVideo>
+    <Modal v-model="modalVideo" width="800px" scrollable footer-hide closable title="上传视频" :mask-closable="false"
+      :z-index="9">
+      <uploadVideo v-if="modalVideo" @getVideo="getvideo"></uploadVideo>
     </Modal>
   </div>
 </template>
@@ -50,7 +27,7 @@ import uploadPictures from "@/components/uploadPictures";
 import uploadVideo from "@/components/uploadVideo2";
 import { getCookies } from "@/libs/util";
 
-import util from '../../utils/bus'
+import util from "../../utils/bus";
 export default {
   name: "Index",
   components: {
@@ -84,28 +61,22 @@ export default {
     };
   },
   watch: {
-    content: function (val) {
-      if (val !== "") {
-        this.editor.txt.html(val);
-      } else {
-        this.editor.txt.clear();
-      }
+    content(val) {
+      this.editor.txt.html(val);
     },
   },
   created() {
     // window.getvideoint = this.getvideoint;
     // window.getHtmlint = this.getHtmlint;
-    
   },
   mounted() {
     this.createEditor();
-    util.$on('Video',(Video)=>{
-        this.getvideoint();
-    })
-       util.$on('Html',(Html)=>{
-        this.getHtmlint();
-    })
-
+    util.$on("Video", (Video) => {
+      this.getvideoint();
+    });
+    util.$on("Html", (Html) => {
+      this.getHtmlint();
+    });
   },
 
   methods: {
@@ -142,6 +113,8 @@ export default {
     getPicD(data) {
       let _this = this;
       _this.modalPic = false;
+      console.log("222");
+
       data.map((d) => {
         this.editor.cmd.do(
           "insertHTML",
@@ -153,10 +126,16 @@ export default {
       let _this = this;
       _this.modalVideo = false;
       this.video = data;
-      this.editor.cmd.do(
-        "insertHTML",
-        `<video src="${_this.video}" controls style="max-width:100%;"/>`
-      );
+      // this.editor.cmd.do(
+      //   "insertHTML",
+      //   `<video src="${_this.video}" controls style="max-width:100%;"/>`
+      // );
+
+      let videoHTML =
+        '<video src="' +
+        this.video +
+        '" controls style="max-width:100%"></video>';
+      this.editor.cmd.do("insertHTML", videoHTML);
     },
 
     createEditor() {
@@ -213,7 +192,7 @@ export default {
         this.newHtml = newHtml;
         this.$emit("editorContent", newHtml);
       };
-      this.editor.config.onchangeTimeout = 800; // change后多久更新数据
+      this.editor.config.onchangeTimeout = 300; // change后多久更新数据
 
       this.editor.create();
     },
@@ -222,8 +201,8 @@ export default {
 </script>
 
 <style lang="stylus" scoped>
-.bottom{
-  margin-bottom: 10px
-  cursor pointer
+.bottom {
+  margin-bottom: 10px;
+  cursor: pointer;
 }
 </style>

+ 6 - 13
template/admin/src/pages/marketing/storeIntegral/create.vue

@@ -202,15 +202,6 @@
                     highlight-row
                     @on-selection-change="changeCheckbox"
                   >
-                    <template slot-scope="{ row, index }" slot="price">
-                      <InputNumber
-                        v-model="row.price"
-                        :min="0"
-                        :precision="2"
-                        class="priceBox"
-                        :active-change="false"
-                      ></InputNumber>
-                    </template>
                     <template slot-scope="{ row, index }" slot="pic">
                       <div
                         class="acea-row row-middle row-center-wrapper"
@@ -531,18 +522,20 @@ export default {
           title: title,
           key: key,
           align: "center",
-          minWidth: 100,
+          minWidth: 120,
           render: (h, params) => {
             return h("div", [
               h("InputNumber", {
                 props: {
-                  min: 1,
+                  min: 0,
                   precision: 0,
-                  value: params.row.quota,
+                  value: key === "price" ? params.row.price : params.row.quota,
                 },
                 on: {
                   "on-change": (e) => {
-                    params.row.quota = e;
+                    key === "price"
+                      ? (params.row.price = e)
+                      : (params.row.quota = e);
                     that.specsData[params.index] = params.row;
                     if (
                       !!that.formValidate.attrs &&

+ 2 - 2
template/admin/src/pages/order/offline/index.vue

@@ -165,7 +165,7 @@ export default {
       tbody: [],
       loading: false,
       total: 0,
-      animal: 1,
+      animal: 0, // 隐藏装饰边框
       pagination: {
         page: 1,
         limit: 30,
@@ -360,7 +360,7 @@ export default {
 }
 .QRpic {
   width: 180px;
-  height: 259px;
+  // height: 259px;
 
   img {
     width: 100%;

+ 166 - 0
template/admin/src/pages/setting/agreement/index.vue

@@ -0,0 +1,166 @@
+<template>
+  <div class="agreemant">
+    <Card :bordered="false" dis-hover class="ivu-mt" :padding="0">
+      <div class="new_card_pd">
+        <Tabs v-model="currentTab" @on-click="changeTab">
+          <TabPane :label="item.label" :name="item.value.toString()" v-for="(item, index) in headerList" :key="index" />
+        </Tabs>
+      </div>
+    </Card>
+
+    <Row class="mb10 content">
+      <Col span="16">
+      <WangEditor style="width: 100%" :content="formValidate.content" @editorContent="getEditorContent"></WangEditor>
+      </Col>
+      <Col span="6" style="width: 33%">
+      <div class="ifam">
+        <div class="content" v-html="content"></div>
+      </div>
+      </Col>
+    </Row>
+    <!-- <Row class="mb10 content">
+      <Button class="bnt" type="primary" @click="save" :loading="loadingExist"
+        >保存</Button
+      >
+    </Row> -->
+    <Card :bordered="false" dis-hover class="fixed-card"
+      :style="{ left: `${!menuCollapse ? '200px' : isMobile ? '0' : '80px'}` }">
+      <div class="acea-row row-center">
+        <Button class="bnt" type="primary" @click="save" :loading="loadingExist">保存</Button>
+      </div>
+    </Card>
+  </div>
+</template>
+
+<script>
+import { mapState } from "vuex";
+import WangEditor from "@/components/wangEditor/index.vue";
+import { getAgreements, setAgreements } from "@/api/system";
+
+export default {
+  components: { WangEditor },
+  data() {
+    return {
+      loadingExist: false,
+      currentTab: "1",
+      headerList: [
+        { label: "付费会员协议", value: "1" },
+        { label: "代理商协议", value: "2" },
+        { label: "隐私协议", value: "3" },
+        { label: "用户协议", value: "4" },
+        { label: "注销协议", value: "5" },
+        { label: "积分协议", value: "6" },
+      ],
+      ueConfig: {
+        autoHeightEnabled: false,
+        initialFrameHeight: 500,
+        initialFrameWidth: "100%",
+        UEDITOR_HOME_URL: "/admin/UEditor/",
+        serverUrl: "",
+      },
+      id: 0,
+      formValidate: {
+        content: "",
+      },
+      content: "",
+      spinShow: false,
+    };
+  },
+  computed: {
+    ...mapState("admin/layout", ["isMobile", "menuCollapse"]),
+  },
+  created() {
+    this.changeTab(this.currentTab);
+  },
+  methods: {
+    save() {
+      console.log(this.content)
+      this.formValidate.content = this.content;
+      setAgreements(this.formValidate)
+        .then(async (res) => {
+          this.$Message.success(res.msg);
+        })
+        .catch((res) => {
+          this.$Message.error(res.msg);
+        });
+    },
+    getEditorContent(content) {
+      this.content = content;
+    },
+    changeTab(data) {
+      this.formValidate.content = " "
+      getAgreements(data).then((res) => {
+        this.formValidate.id = res.data.id || 0;
+        this.formValidate.type = res.data.type;
+        this.formValidate.title = res.data.title;
+        this.formValidate.content = res.data.content;
+        this.content = res.data.content;
+      });
+    },
+  },
+};
+</script>
+
+<style lang="stylus" scoped>
+.agreemant {
+  background-color: #fff;
+  padding: 5px 15px ;
+  margin-top 10px;
+}
+
+.content {
+  padding: 10px 0px;
+}
+
+.ifam {
+  width: 344px;
+  height: 644px;
+  background: url('../../../assets/images/ag-phone.png') no-repeat center top;
+  background-size: 344px 644px;
+  padding: 40px 20px;
+  padding-top: 50px;
+  margin: 0 auto 0 20px;
+
+  .content {
+    height: 560px;
+    overflow: hidden;
+    scrollbar-width: none; /* firefox */
+    -ms-overflow-style: none; /* IE 10+ */
+    overflow-x: hidden;
+    overflow-y: auto;
+  }
+
+  .content::-webkit-scrollbar {
+    display: none; /* Chrome Safari */
+  }
+}
+
+.new_tab {
+  >>>.ivu-tabs-nav .ivu-tabs-tab {
+    padding: 4px 16px 20px !important;
+    font-weight: 500;
+  }
+}
+
+.fixed-card {
+  position: fixed;
+  right: 0;
+  bottom: 0;
+  left: 200px;
+  z-index: 99;
+  box-shadow: 0 -1px 2px rgb(240, 240, 240);
+
+  /deep/ .ivu-card-body {
+    padding: 15px 16px 14px;
+  }
+
+  .ivu-form-item {
+    margin-bottom: 0;
+  }
+
+  /deep/ .ivu-form-item-content {
+    margin-right: 124px;
+    text-align: center;
+  }
+}
+</style>

+ 1 - 1
template/admin/src/pages/system/group/pc.vue

@@ -121,7 +121,7 @@
 							       <div class="right-box">
 									   <div class="hot_imgs">
 									       <div class="title">页面设置</div>
-										   <div class="title-text">建议尺寸:690 * 240px</div>
+										   <div class="title-text">建议尺寸:140px * 60px</div>
 										   <div class="title-text">除LOGO图标外,页面其他内容仅供参考</div>
 									       <div class="list-box">
 											   

+ 314 - 0
template/admin/src/pages/user/cancel/handle/task.vue

@@ -0,0 +1,314 @@
+<template>
+  <Modal
+    v-model="modals"
+    :z-index="1"
+    scrollable
+    footer-hide
+    closable
+    title="等级任务"
+    :mask-closable="false"
+    width="950"
+    @on-cancel="handleReset"
+  >
+    <Form
+      ref="levelFrom"
+      :model="levelFrom"
+      :label-width="labelWidth"
+      :label-position="labelPosition"
+      @submit.native.prevent
+    >
+      <Row type="flex" :gutter="24">
+        <Col v-bind="grid">
+          <FormItem label="状态:">
+            <Select
+              v-model="levelFrom.is_show"
+              placeholder="是否显示"
+              clearable
+              @on-change="userSearchs"
+            >
+              <Option value="1">显示</Option>
+              <Option value="0">不显示</Option>
+            </Select>
+          </FormItem>
+        </Col>
+        <Col v-bind="grid">
+          <FormItem label="等级名称:" prop="status2" label-for="status2">
+            <Input
+              search
+              enter-button
+              v-model="levelFrom.name"
+              placeholder="请输入等级名称"
+              @on-search="userSearchs"
+              style="width: 100%"
+            />
+          </FormItem>
+        </Col>
+      </Row>
+    </Form>
+    <Divider dashed />
+    <Row type="flex">
+      <Col v-bind="grid" class="mb15">
+        <Button type="primary" icon="md-add" @click="add">添加等级任务</Button>
+      </Col>
+      <Col span="24" class="userAlert">
+        <Alert show-icon closable
+          >添加等级任务,任务类型中的{$num}会自动替换成限定数量+系统预设的单位生成任务名</Alert
+        >
+      </Col>
+    </Row>
+    <Divider dashed />
+    <Table
+      :columns="columns1"
+      :data="levelLists"
+      ref="table"
+      :loading="loading"
+      no-userFrom-text="暂无数据"
+      no-filtered-userFrom-text="暂无筛选结果"
+    >
+      <template slot-scope="{ row, index }" slot="is_shows">
+        <i-switch
+          v-model="row.is_show"
+          :value="row.is_show"
+          :true-value="1"
+          :false-value="0"
+          size="large"
+          @on-change="onchangeIsShow(row)"
+        >
+          <span slot="open">显示</span>
+          <span slot="close">隐藏</span>
+        </i-switch>
+      </template>
+      <template slot-scope="{ row, index }" slot="is_musts">
+        <i-switch
+          v-model="row.is_must"
+          :value="row.is_must"
+          :true-value="1"
+          :false-value="0"
+          size="large"
+          @on-change="onchangeIsMust(row)"
+        >
+          <span slot="open">全部完成</span>
+          <span slot="close">达成其一</span>
+        </i-switch>
+      </template>
+      <template slot-scope="{ row, index }" slot="action">
+        <a @click="edit(row)">编辑 | </a>
+        <a @click="del(row, '删除等级任务', index)"> 删除</a>
+      </template>
+    </Table>
+    <div class="acea-row row-right page">
+      <Page
+        :total="total"
+        show-elevator
+        show-total
+        @on-change="pageChange"
+        :page-size="levelFrom.limit"
+      />
+    </div>
+    <!-- 新建 编辑表单-->
+    <edit-from
+      ref="edits"
+      :FromData="FromData"
+      @submitFail="submitFail"
+      :titleType="titleType"
+    ></edit-from>
+  </Modal>
+</template>
+
+<script>
+import { mapState, mapMutations } from "vuex";
+import {
+  taskListApi,
+  setTaskShowApi,
+  setTaskMustApi,
+  createTaskApi,
+} from "@/api/user";
+import editFrom from "@/components/from/from";
+export default {
+  name: "task",
+  components: { editFrom },
+  data() {
+    return {
+      // levelIds: this.levelId,
+      grid: {
+        xl: 10,
+        lg: 10,
+        md: 12,
+        sm: 24,
+        xs: 24,
+      },
+      modals: false,
+      levelFrom: {
+        is_show: "",
+        name: "",
+        page: 1,
+        limit: 20,
+      },
+      total: 0,
+      levelLists: [],
+      loading: false,
+      columns1: [
+        {
+          title: "ID",
+          key: "id",
+          sortable: true,
+          width: 80,
+        },
+        {
+          title: "等级名称",
+          key: "level_name",
+          minWidth: 100,
+        },
+        {
+          title: "任务名称",
+          key: "name",
+          minWidth: 120,
+        },
+        {
+          title: "排序",
+          sort: "grade",
+          sortable: true,
+          minWidth: 100,
+        },
+        {
+          title: "是否显示",
+          slot: "is_shows",
+          minWidth: 110,
+        },
+        {
+          title: "务必达成",
+          slot: "is_musts",
+          minWidth: 135,
+        },
+        {
+          title: "任务说明",
+          key: "illustrate",
+          minWidth: 120,
+        },
+        {
+          title: "操作",
+          slot: "action",
+          fixed: "right",
+          minWidth: 120,
+        },
+      ],
+      FromData: null,
+      ids: 0,
+      modalTitleSs: "",
+      titleType: "task",
+    };
+  },
+  computed: {
+    ...mapState("media", ["isMobile"]),
+    ...mapState("userLevel", ["levelId"]),
+    labelWidth() {
+      return this.isMobile ? undefined : 75;
+    },
+    labelPosition() {
+      return this.isMobile ? "top" : "right";
+    },
+  },
+  methods: {
+    ...mapMutations("userLevel", ["getTaskId", "getlevelId"]),
+    // 添加
+    add() {
+      this.ids = "";
+      this.getFrom();
+    },
+    // 新建 编辑表单
+    getFrom() {
+      let data = {
+        id: this.ids,
+        level_id: this.levelId,
+      };
+      this.$modalForm(createTaskApi(data)).then(() => this.getList());
+    },
+    // 编辑
+    edit(row) {
+      this.ids = row.id;
+      this.getFrom();
+    },
+    // 关闭模态框
+    handleReset() {
+      this.modals = false;
+    },
+    // 表格搜索
+    userSearchs() {
+      this.getList();
+    },
+    // 任务列表
+    getList() {
+      this.loading = true;
+      this.levelFrom.is_show = this.levelFrom.is_show || "";
+      taskListApi(this.levelId, this.levelFrom)
+        .then(async (res) => {
+          let data = res.data;
+          this.levelLists = data.list;
+          this.total = res.data.count;
+          this.loading = false;
+        })
+        .catch((res) => {
+          this.loading = false;
+          this.$Message.error(res.msg);
+        });
+    },
+    pageChange(index) {
+      this.levelFrom.page = index;
+      this.getList();
+    },
+    // 修改显示隐藏
+    onchangeIsShow(row) {
+      let data = {
+        id: row.id,
+        is_show: row.is_show,
+      };
+      setTaskShowApi(data)
+        .then(async (res) => {
+          this.$Message.success(res.msg);
+        })
+        .catch((res) => {
+          this.$Message.error(res.msg);
+        });
+    },
+    // 设置任务是否达成
+    onchangeIsMust(row) {
+      let data = {
+        id: row.id,
+        is_must: row.is_must,
+      };
+      setTaskMustApi(data)
+        .then(async (res) => {
+          this.$Message.success(res.msg);
+        })
+        .catch((res) => {
+          this.$Message.error(res.msg);
+        });
+    },
+    // 新建编辑提交成功
+    submitFail() {
+      this.getList();
+    },
+    // 删除任务
+    del(row, tit, num) {
+      let delfromData = {
+        title: tit,
+        num: num,
+        url: `user/user_level/delete_task/${row.id}`,
+        method: "DELETE",
+        ids: "",
+      };
+      this.$modalSure(delfromData)
+        .then((res) => {
+          this.$Message.success(res.msg);
+          this.levelLists.splice(num, 1);
+        })
+        .catch((res) => {
+          this.$Message.error(res.msg);
+        });
+    },
+  },
+};
+</script>
+
+<style scoped>
+</style>

+ 269 - 0
template/admin/src/pages/user/cancel/index.vue

@@ -0,0 +1,269 @@
+<template>
+  <div>
+    <div class="i-layout-page-header">
+      <div class="i-layout-page-header">
+        <span class="ivu-page-header-title">{{ $route.meta.title }}</span>
+      </div>
+    </div>
+    <Card :bordered="false" dis-hover class="ivu-mt">
+      <Form
+        ref="levelFrom"
+        :model="levelFrom"
+        :label-width="labelWidth"
+        :label-position="labelPosition"
+        @submit.native.prevent
+      >
+        <Row type="flex" :gutter="24">
+          <Col v-bind="grid">
+            <FormItem label="状态:" label-for="status1">
+              <!-- <Select
+                v-model="levelFrom.status"
+                placeholder="请选择"
+                clearable
+                element-id="status1"
+                @on-change="userSearchs"
+              >
+                <Option value="0">待审核</Option>
+                <Option value="1">通过</Option>
+                <Option value="1">拒绝</Option>
+              </Select> -->
+              <RadioGroup
+                v-model="levelFrom.status"
+                type="button"
+                @on-change="userSearchs(levelFrom.status)"
+              >
+                <Radio label="">全部</Radio>
+                <Radio label="0">待审核</Radio>
+                <Radio label="1">通过</Radio>
+                <Radio label="2">拒绝</Radio>
+              </RadioGroup>
+            </FormItem>
+          </Col>
+          <Col v-bind="grid">
+            <FormItem label="用户搜索:" label-for="title">
+              <Input
+                search
+                enter-button
+                v-model="levelFrom.keywords"
+                placeholder="请输入用户昵称/ID/手机号"
+                @on-search="userSearchs"
+              />
+            </FormItem>
+          </Col>
+        </Row>
+      </Form>
+      <Table
+        :columns="columns1"
+        :data="levelLists"
+        ref="table"
+        class="mt25"
+        :loading="loading"
+        highlight-row
+        no-userFrom-text="暂无数据"
+        no-filtered-userFrom-text="暂无筛选结果"
+      >
+        <template slot-scope="{ row, index }" slot="action">
+          <a @click="agree(row)">同意</a>
+          <Divider type="vertical" />
+          <a @click="refuse(row)">拒绝</a>
+          <Divider type="vertical" />
+          <a @click="remark(row)">备注</a>
+        </template>
+      </Table>
+      <div class="acea-row row-right page">
+        <Page
+          :total="total"
+          :current="levelFrom.page"
+          show-elevator
+          show-total
+          @on-change="pageChange"
+          :page-size="levelFrom.limit"
+        />
+      </div>
+    </Card>
+    <!-- 等级任务-->
+    <remark ref="remark" @submitFail="submitFail"></remark>
+  </div>
+</template>
+<script>
+import { mapState, mapMutations } from "vuex";
+import { userCancelList, userCancelSetMark } from "@/api/user";
+import taskList from "./handle/task";
+import editFrom from "@/components/from/from";
+import remark from "@/components/remark/index";
+export default {
+  name: "user_level",
+  components: { remark },
+  data() {
+    return {
+      grid: {
+        xl: 7,
+        lg: 7,
+        md: 12,
+        sm: 24,
+        xs: 24,
+      },
+      id: "",
+      loading: false,
+      columns1: [
+        {
+          title: "ID",
+          key: "id",
+          width: 80,
+        },
+        {
+          title: "昵称",
+          key: "name",
+          minWidth: 100,
+        },
+        {
+          title: "手机号",
+          key: "phone",
+          minWidth: 100,
+        },
+        {
+          title: "状态",
+          key: "status",
+          minWidth: 120,
+        },
+        {
+          title: "申请时间",
+          key: "add_time",
+          minWidth: 100,
+        },
+        {
+          title: "审核时间",
+          key: "up_time",
+          minWidth: 100,
+        },
+        {
+          title: "备注",
+          key: "remark",
+          minWidth: 100,
+        },
+        {
+          title: "操作",
+          slot: "action",
+          fixed: "right",
+          minWidth: 120,
+        },
+      ],
+      levelFrom: {
+        status: "",
+        keywords: "",
+        page: 1,
+        limit: 15,
+      },
+      levelLists: [],
+      total: 0,
+    };
+  },
+  created() {
+    this.getList();
+  },
+  computed: {
+    ...mapState("media", ["isMobile"]),
+    labelWidth() {
+      return this.isMobile ? undefined : 75;
+    },
+    labelPosition() {
+      return this.isMobile ? "top" : "right";
+    },
+  },
+  methods: {
+    ...mapMutations("userLevel", ["getlevelId"]),
+    remark(row) {
+      console.log(this.$refs);
+      this.id = row.id;
+      this.$refs.remark.formValidate.remark = row.remark;
+      this.$refs.remark.modals = true;
+    },
+    agree(row) {
+      this.delfromData = {
+        title: "注销用户",
+        url: `/user/cancel/agree/${row.id}`,
+        method: "get",
+      };
+      this.$modalSure(this.delfromData)
+        .then((res) => {
+          this.$Message.success(res.msg);
+          this.getList();
+        })
+        .catch((err) => {
+          this.$Message.error(err.msg);
+        });
+    },
+    refuse(row) {
+      this.delfromData = {
+        title: "拒绝注销用户",
+        info: "您确认拒绝注销此用户吗?",
+        url: `/user/cancel/refuse/${row.id}`,
+        method: "get",
+      };
+      this.$modalSure(this.delfromData)
+        .then((res) => {
+          this.$Message.success(res.msg);
+          this.getList();
+        })
+        .catch((err) => {
+          this.$Message.error(err.msg);
+        });
+    },
+    submitFail(text) {
+      let data = {
+        id: this.id,
+        mark: text,
+      };
+      userCancelSetMark(data)
+        .then((res) => {
+          this.$refs.remark.modals = false;
+          this.$Message.success(res.msg);
+          this.getList();
+        })
+        .catch((err) => {
+          this.$refs.remark.modals = false;
+          this.$Message.error(err.msg);
+        });
+    },
+
+    getList() {
+      this.loading = true;
+      this.levelFrom.status = this.levelFrom.status || "";
+      userCancelList(this.levelFrom)
+        .then(async (res) => {
+          let data = res.data;
+          this.levelLists = data.list;
+          this.total = res.data.count;
+          this.loading = false;
+        })
+        .catch((res) => {
+          this.loading = false;
+          this.$Message.error(res.msg);
+        });
+    },
+    pageChange(index) {
+      this.levelFrom.page = index;
+      this.getList();
+    },
+    // 表格搜索
+    userSearchs() {
+      this.levelFrom.page = 1;
+      this.getList();
+    },
+  },
+};
+</script>
+
+<style scoped lang="stylus">
+.tabBox_img {
+  width: 36px;
+  height: 36px;
+  border-radius: 4px;
+  cursor: pointer;
+
+  img {
+    width: 100%;
+    height: 100%;
+  }
+}
+</style>

+ 9 - 0
template/admin/src/router/modules/setting.js

@@ -584,5 +584,14 @@ export default {
       },
       component: () => import('@/pages/setting/setSystem/index')
     },
+    {
+      path: 'agreement',
+      name: `${pre}notification`,
+      meta: {
+        auth: ['setting-agreement'],
+        title: '协议设置'
+      },
+      component: () => import('@/pages/setting/agreement/index')
+    },
   ]
 }

+ 19 - 9
template/admin/src/router/modules/user.js

@@ -65,16 +65,26 @@ export default {
             },
             component: () => import("@/pages/user/label/index")
         },
-      {
-        path: "recharge/:id",
-        name: `${pre}recharge`,
-        meta: {
-          auth: ["user-user-recharge"],
-          footer: true,
-          title: "充值配置"
+        {
+            path: "cancel",
+            name: `${pre}cancel`,
+            meta: {
+                auth: ["user-user-cancel"],
+                footer: true,
+                title: "用户标签"
+            },
+            component: () => import("@/pages/user/cancel/index")
+        },
+        {
+            path: "recharge/:id",
+            name: `${pre}recharge`,
+            meta: {
+                auth: ["user-user-recharge"],
+                footer: true,
+                title: "充值配置"
+            },
+            component: () => import('@/pages/system/group/list')
         },
-        component: () => import('@/pages/system/group/list')
-      },
         {
             path: "grade/type",
             name: `${pre}type`,

+ 1 - 2
template/admin/src/setting.js

@@ -1,6 +1,5 @@
 // 请求接口地址 如果没有配置自动获取当前网址路径
-const Url = ''
-const VUE_APP_API_URL = Url || process.env.VUE_APP_API_URL || `${location.origin}/adminapi`
+const VUE_APP_API_URL = process.env.VUE_APP_API_URL || `${location.origin}/adminapi`
 
 const Setting = {
     // 接口请求地址

+ 15 - 2
template/uni-app-live/pages.json

@@ -237,6 +237,19 @@
 						}
 					}
 				},
+				{
+					"path": "user_cancellation/index",
+					"style": {
+						"navigationBarTitleText": "注销说明",
+						"app-plus": {
+							// #ifdef APP-PLUS
+							"titleNView": {
+								"type": "default"
+							}
+							// #endif
+						}
+					}
+				},
 				{
 					"path": "message_center/index",
 					"style": {
@@ -951,7 +964,7 @@
 			],
 			"plugins": {
 				"live-player-plugin": {
-					"version": "1.3.2",
+					"version": "1.3.4",
 					"provider": "wx2b03c6e691cd7370"
 				}
 			}
@@ -1006,7 +1019,7 @@
 					"style": {
 						// #ifdef MP
 						"navigationBarTitleText": "砍价活动",
-							// #endif
+						// #endif
 						"app-plus": {
 							// #ifdef APP-PLUS
 							"titleNView": {

+ 5 - 5
template/uni-app/androidPrivacy.json

@@ -1,14 +1,14 @@
 {
     "version" : "1",
-    "prompt" : "none",
+    "prompt" : "template",
     "title" : "服务协议与隐私政策",
-    "message" : "\t请务必审慎阅读、充分理解“服务协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。<br>\r\r
-\t\t\t你可以阅读<a href=\"https://baidu.com\">《服务协议与隐私政策》</a>了解详细信息。如你同意,请点击“我同意”开始接受我们的服务。",
+    "message" : "\t请务必审慎阅读、充分理解“服务协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。<br/>
+ 你可以阅读 <a href=\"/pages/columnGoods/static/yszc.html\">《服务协议与隐私政策》</a>了解详细信息。如你同意,请点击“我同意”开始接受我们的服务。",
     "buttonAccept" : "同意并接受",
     "buttonRefuse" : "暂不同意",
     "second" : {
         "title" : "确认提示",
-        "message" : "进入应用前,你需先同意<a href=\"https://baidu.com\">《服务协议与隐私政策》</a>,否则将退出应用。",
+        "message" : "进入应用前,你需先同意<a href=\"pages/columnGoods/static/yszc.html\">《服务协议与隐私政策》</a>,否则将退出应用。",
         "buttonAccept" : "同意并继续",
         "buttonRefuse" : "退出应用"
     },
@@ -16,7 +16,7 @@
         "backgroundColor" : "#fff",
         "borderRadius" : "5px",
         "title" : {
-            "color" : "#ff00ff"
+            "color" : "#000"
         },
         "buttonAccept" : {
             "color" : "#fff"

+ 21 - 12
template/uni-app/api/user.js

@@ -589,8 +589,8 @@ export function appleLogin(data) {
 /*
  * 获取隐私协议
  * */
-export function getUserAgreement() {
-	return request.get("user_agreement", {}, {
+export function getUserAgreement(type) {
+	return request.get(`get_agreement/${type}`, {}, {
 		noAuth: true
 	});
 }
@@ -623,25 +623,34 @@ export function friendDetail(id) {
  * 员工列表
  * @param object data
  * 
-*/
-export function clerkPeople(data){
-  return request.get('agent/get_staff_list',data)
+ */
+export function clerkPeople(data) {
+	return request.get('agent/get_staff_list', data)
 }
 
 /**
  * 
  * 员工比例
  * @param object data
-*/
-export function setClerkPercent(data){
-  return request.post('agent/set_staff_percent',data);
+ */
+export function setClerkPercent(data) {
+	return request.post('agent/set_staff_percent', data);
 }
 
 /**
  * 
  * 删除员工
  * @param object data
-*/
-export function delClerkPercent(id){
-  return request.get(`agent/del_staff/${id}`);
-}
+ */
+export function delClerkPercent(id) {
+	return request.get(`agent/del_staff/${id}`);
+}
+
+/**
+ * 注销用户
+ * @param int id
+ * 
+ */
+export function cancelUser() {
+	return request.get('user_cancel');
+}

+ 1 - 1
template/uni-app/components/productConSwiper/index.vue

@@ -18,7 +18,7 @@
 			<swiper-item v-if="videoline">
 				<view class="item">
 					<view v-show="!controls" style="width:100%;height:100% ">
-						<video id="myVideo" :src='videoline' objectFit="cover" controls style="width:100%;height:100% "
+						<video id="myVideo" :src='videoline' objectFit="contain" controls style="width:100%;height:100% "
 						 show-center-play-btn show-mute-btn="true" auto-pause-if-navigate :custom-cache="false" :enable-progress-gesture="false" :poster="imgUrls[0]" @pause="videoPause"></video>
 					</view>
 					<view class="poster" v-show="controls">

+ 2 - 2
template/uni-app/manifest.json

@@ -52,7 +52,7 @@
                     "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                 ],
-                "abiFilters" : [ "armeabi-v7a" ]
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ]
             },
             /* ios打包配置 */
             "ios" : {
@@ -122,7 +122,7 @@
             "splashscreen" : {
                 "androidStyle" : "common",
                 "iosStyle" : "common",
-                "useOriginalMsgbox" : false
+                "useOriginalMsgbox" : true
             },
             "icons" : {
                 "android" : {

+ 14 - 1
template/uni-app/pages.json

@@ -237,6 +237,19 @@
 						}
 					}
 				},
+				{
+					"path": "user_cancellation/index",
+					"style": {
+						"navigationBarTitleText": "注销说明",
+						"app-plus": {
+							// #ifdef APP-PLUS
+							"titleNView": {
+								"type": "default"
+							}
+							// #endif
+						}
+					}
+				},
 				{
 					"path": "message_center/index",
 					"style": {
@@ -1000,7 +1013,7 @@
 					"style": {
 						// #ifdef MP
 						"navigationBarTitleText": "砍价活动",
-							// #endif
+						// #endif
 						"app-plus": {
 							// #ifdef APP-PLUS
 							"titleNView": {

+ 1 - 1
template/uni-app/pages/activity/presell_details/index.vue

@@ -33,7 +33,7 @@
 							<view class="iconfont icon-fenxiang" @click="listenerActionSheet"></view>
 						</view>
 						<view class="label acea-row row-between-wrapper" style="padding-bottom: 20rpx;">
-							<view v-text="'价:¥' + (storeInfo.ot_price || 0)"></view>
+							<view v-text="'划线价:¥' + (storeInfo.ot_price || 0)"></view>
 							<view v-text="'已预订:' + (storeInfo.sales || 0) + (storeInfo.unit_name || '')"></view>
 						</view>
 						<view class="introduce" v-text="storeInfo.title"></view>

+ 39 - 1
template/uni-app/pages/admin/orderDetail/index.vue

@@ -97,6 +97,18 @@
 				<view class="conter">{{ orderInfo.mark }}</view>
 			</view>
 		</view>
+		<view class='wrapper' v-if="customForm && customForm.length">
+			<view class='item acea-row row-between' v-for="(item,index) in customForm" :key="index">
+				<view class='upload' v-if="item.label == 'img'">
+					<view>{{item.title}}:</view>
+					<view class='pictrue' v-for="(img,index) in item.value" :key="index">
+						<image :src='img'></image>
+					</view>
+				</view>
+				<view v-if="item.label !== 'img'">{{item.title}}:</view>
+				<view v-if="item.label !== 'img'" class='conter'>{{item.value}}</view>
+			</view>
+		</view>
 		<view class="wrapper">
 			<view class="item acea-row row-between">
 				<view>支付金额:</view>
@@ -114,6 +126,7 @@
 				实付款:<span class="money">¥{{ orderInfo.pay_price }}</span>
 			</view>
 		</view>
+
 		<view class="wrapper" v-if="
         orderInfo.delivery_type != 'fictitious' && orderInfo._status._type === 2
       ">
@@ -205,7 +218,8 @@
 				types: "",
 				order_type: "",
 				clickNum: 1,
-				goname: ''
+				goname: '',
+				customForm: []
 			};
 		},
 		watch: {
@@ -262,9 +276,20 @@
 				fn(that.order_id).then(
 					res => {
 						that.orderInfo = res.data;
+						//处理自定义留言非必填项的数据展示
+
 						that.types = res.data._status._type;
 						that.title = res.data._status._title;
 						that.payType = res.data._status._payType;
+						if (that.orderInfo.custom_form && that.orderInfo.custom_form.length) {
+							let arr = []
+							that.orderInfo.custom_form.map(i => {
+								if (i.value != '') {
+									arr.push(i)
+								}
+							})
+							that.$set(that, 'customForm', arr);
+						}
 					},
 					err => {
 						// that.$util.Tips({
@@ -817,4 +842,17 @@
 		margin-left: 12px;
 		height: 20px;
 	}
+
+	.upload .pictrue {
+		display: inline-block;
+		margin: 22rpx 17rpx 20rpx 0;
+		width: 156rpx;
+		height: 156rpx;
+		color: #bbb;
+	}
+
+	.upload .pictrue image {
+		width: 100%;
+		height: 100%;
+	}
 </style>

File diff suppressed because it is too large
+ 37 - 0
template/uni-app/pages/columnGoods/static/yszc.html


+ 8 - 4
template/uni-app/pages/goods_details/index.vue

@@ -58,19 +58,21 @@
 									<text class="vip-money" v-if="
                       storeInfo.vip_price &&
                       storeInfo.vip_price > 0 &&
-                      storeInfo.is_vip == 1
+                      storeInfo.is_vip == 1 &&
+					  svip_price_open == 1
                     ">¥{{ storeInfo.vip_price }}</text>
 									<image v-if="
                       storeInfo.vip_price &&
                       storeInfo.vip_price > 0 &&
-                      storeInfo.is_vip == 1
+                      storeInfo.is_vip == 1 &&
+					  svip_price_open == 1
                     " src="../../static/images/svip.gif"></image>
 								</view>
 								<view class="iconfont icon-fenxiang skeleton-rect" @click="listenerActionSheet"></view>
 							</view>
 							<view class="introduce skeleton-rect" v-text="storeInfo.store_name"></view>
 							<view class="label acea-row row-between-wrapper" style="padding-bottom: 20rpx">
-								<view class="skeleton-rect" v-text="'价:¥' + (storeInfo.ot_price || 0)">
+								<view class="skeleton-rect" v-text="'划线价:¥' + (storeInfo.ot_price || 0)">
 								</view>
 								<view class="skeleton-rect" v-text="
                     '库存:' +
@@ -595,6 +597,7 @@
 				skuArr: [],
 				selectSku: {},
 				currentPage: false,
+				svip_price_open: 1
 			};
 		},
 		computed: mapGetters(["isLogin"]),
@@ -1100,6 +1103,7 @@
 						// }
 						that.$set(that, "navList", navList);
 						that.$set(that, "storeImage", that.storeInfo.image);
+						that.$set(that, "svip_price_open", res.data.svip_price_open);
 						// #ifdef H5
 						if (that.isLogin) {
 							that.ShareInfo();
@@ -1134,7 +1138,7 @@
 						that.getCartCount();
 						setTimeout(() => {
 							this.showSkeleton = false;
-						}, 1000);
+						}, 100);
 					})
 					.catch((err) => {
 						//状态异常返回上级页面

+ 9 - 8
template/uni-app/pages/index/diy/index.vue

@@ -185,7 +185,7 @@
 				<view class="content">
 					请务必审慎阅读、充分理解“服务协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、
 					删除个人信息并管理你的授权。<br>
-					你可以阅读<navigator url="/pages/users/privacy/index">《服务协议与隐私政策》</navigator>了解
+					你可以阅读<navigator url="/pages/users/privacy/index?type=3">《服务协议与隐私政策》</navigator>了解
 					详细信息。如你同意,请点击“我同意”开始接受我们的服务。
 				</view>
 				<view class="btn-box">
@@ -395,12 +395,13 @@
 			let curRoute = routes[routes.length - 1].route //获取当前页面路由
 			this.activeRouter = '/' + curRoute
 			// #ifdef APP-PLUS
-			try {
-				let val = uni.getStorageSync('privacyStatus') || false
-				if (!val) {
-					this.privacyStatus = true
-				}
-			} catch (e) {}
+			uni.setStorageSync("privacyStatus", true);
+			// try {
+			// 	let val = uni.getStorageSync('privacyStatus') || false
+			// 	if (!val) {
+			// 		this.privacyStatus = true
+			// 	}
+			// } catch (e) {}
 			// #endif
 			this.diyData();
 			this.getIndexData();
@@ -762,7 +763,7 @@
 					that.styleConfig = temp;
 					setTimeout(() => {
 						this.showSkeleton = false
-					}, 1000)
+					}, 300)
 					uni.stopPullDownRefresh({
 						success: (e) => {},
 					});

+ 12 - 11
template/uni-app/pages/index/visualization/index.vue

@@ -106,7 +106,7 @@
 				<view class="content">
 					请务必审慎阅读、充分理解“服务协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、
 					删除个人信息并管理你的授权。<br>
-					你可以阅读<navigator url="/pages/users/privacy/index">《服务协议与隐私政策》</navigator>了解
+					你可以阅读<navigator url="/pages/users/privacy/index?type=3">《服务协议与隐私政策》</navigator>了解
 					详细信息。如你同意,请点击“我同意”开始接受我们的服务。
 				</view>
 				<view class="btn-box">
@@ -283,15 +283,16 @@
 		created() {
 			uni.hideTabBar();
 			// #ifdef APP-PLUS
-			try {
-				let val = uni.getStorageSync("privacyStatus") || false;
-				if (!val) {
-					this.privacyStatus = true;
-				}
-			} catch (e) {}
-			this.$nextTick(() => {
-				// this.$refs.appUpdate.update(); //调用子组件 检查更新
-			});
+			uni.setStorageSync("privacyStatus", true);
+			// try {
+			// 	let val = uni.getStorageSync("privacyStatus") || false;
+			// 	if (!val) {
+			// 		this.privacyStatus = true;
+			// 	}
+			// } catch (e) {}
+			// this.$nextTick(() => {
+			// 	// this.$refs.appUpdate.update(); //调用子组件 检查更新
+			// });
 			// #endif
 			let that = this;
 			// #ifdef H5
@@ -526,7 +527,7 @@
 					this.$Cache.set("TAB_BAR", data.tabBar.default.tabBarList);
 					setTimeout(() => {
 						this.showSkeleton = false;
-					}, 1000);
+					}, 300);
 				});
 			},
 			getIndexData() {

+ 1 - 1
template/uni-app/pages/points_mall/integral_goods_details.vue

@@ -55,7 +55,7 @@
 							<view class="infor"> {{ storeInfo.title }}</view>
 						</view>
 						<view class="label acea-row row-middle">
-							<view class="stock">价:{{ storeInfo.product_price }}</view>
+							<view class="stock">划线价:{{ storeInfo.product_price }}</view>
 							<view class="stock">限量:
 								{{ storeInfo.quota_show }}
 							</view>

+ 1 - 1
template/uni-app/pages/user/index.vue

@@ -248,7 +248,7 @@
 						</button>
 						<!-- #endif -->
 						<!-- #ifdef APP-PLUS -->
-						<view class="item" hover-class="none" @click="goMenuPage('/pages/users/privacy/index')">
+						<view class="item" hover-class="none" @click="goMenuPage('/pages/users/privacy/index?type=3')">
 							<image src="/static/images/menu.png"></image>
 							<text>隐私协议</text>
 						</view>

+ 38 - 3
template/uni-app/pages/users/admin_order_detail/index.vue

@@ -23,8 +23,8 @@
 			<image src="/static/images/line.jpg" />
 		</view>
 		<view class="pos-order-goods">
-			<navigator :url="`/pages/goods_details/index?id=${item.productInfo.id}`" hover-class="none" class="goods acea-row row-between-wrapper"
-			 v-for="(item, index) in orderInfo.cartInfo" :key="index">
+			<navigator :url="`/pages/goods_details/index?id=${item.productInfo.id}`" hover-class="none"
+				class="goods acea-row row-between-wrapper" v-for="(item, index) in orderInfo.cartInfo" :key="index">
 				<view class="picTxt acea-row row-between-wrapper">
 					<view class="pictrue">
 						<image :src="item.productInfo.image" />
@@ -77,6 +77,18 @@
 				<view class="conter">{{ orderInfo.mark }}</view>
 			</view>
 		</view>
+		<view class='wrapper' v-if="customForm && customForm.length">
+			<view class='item acea-row row-between' v-for="(item,index) in customForm" :key="index">
+				<view class='upload' v-if="item.label == 'img'">
+					<view>{{item.title}}:</view>
+					<view class='pictrue' v-for="(img,index) in item.value" :key="index">
+						<image :src='img'></image>
+					</view>
+				</view>
+				<view v-if="item.label !== 'img'">{{item.title}}:</view>
+				<view v-if="item.label !== 'img'" class='conter'>{{item.value}}</view>
+			</view>
+		</view>
 		<view class="wrapper">
 			<view class="item acea-row row-between">
 				<view>支付金额:</view>
@@ -143,7 +155,8 @@
 				payType: "",
 				types: "",
 				clickNum: 1,
-				goname: ''
+				goname: '',
+				customForm: []
 			};
 		},
 		watch: {
@@ -170,6 +183,15 @@
 						that.types = res.data._status._type;
 						that.title = res.data._status._title;
 						that.payType = res.data._status._payType;
+						if (that.orderInfo.custom_form && that.orderInfo.custom_form.length) {
+							let arr = []
+							that.orderInfo.custom_form.map(i => {
+								if (i.value != '') {
+									arr.push(i)
+								}
+							})
+							that.$set(that, 'customForm', arr);
+						}
 					},
 					err => {
 						that.$util.Tips({
@@ -579,4 +601,17 @@
 	.public-total .money {
 		color: #ff4c3c;
 	}
+
+	.upload .pictrue {
+		display: inline-block;
+		margin: 22rpx 17rpx 20rpx 0;
+		width: 156rpx;
+		height: 156rpx;
+		color: #bbb;
+	}
+
+	.upload .pictrue image {
+		width: 100%;
+		height: 100%;
+	}
 </style>

+ 1 - 1
template/uni-app/pages/users/order_details/index.vue

@@ -209,7 +209,7 @@
 				</view>
 			</view>
 			<view class='wrapper' v-if="customForm && customForm.length">
-				<view class='item acea-row row-between' v-for="(item,index) in customForm">
+				<view class='item acea-row row-between' v-for="(item,index) in customForm" :key="index">
 					<view class='upload' v-if="item.label == 'img'">
 						<view>{{item.title}}:</view>
 						<view class='pictrue' v-for="(img,index) in item.value" :key="index">

+ 9 - 4
template/uni-app/pages/users/privacy/index.vue

@@ -23,22 +23,27 @@
 				content: ``
 			}
 		},
-		mounted() {
-			getUserAgreement().then(res => {
+		onLoad(options) {
+			getUserAgreement(options.type).then(res => {
 				this.content = res.data.content
+				uni.setNavigationBarTitle({
+					title: res.data.title
+				});
 			}).catch(err => {
 				that.$util.Tips({
-					title: err.msg
+					title: err
 				});
 			})
 		}
+		
 	}
 </script>
 
 <style scoped>
-	page{
+	page {
 		background-color: #fff;
 	}
+
 	.content {
 		padding: 40rpx 30rpx;
 		line-height: 2;

BIN
template/uni-app/pages/users/static/address.png


+ 213 - 0
template/uni-app/pages/users/user_cancellation/index.vue

@@ -0,0 +1,213 @@
+<template>
+	<view class="agreement" :style="colorStyle">
+		<view class="top-msg" v-if="agreementData.avatar">
+			<view class="avatar">
+				<img :src="agreementData.avatar" alt="">
+			</view>
+			<view class="name">{{agreementData.name}}</view>
+		</view>
+		<view class="content" v-html="agreementData.content">
+		</view>
+		<view class="footer">
+			<view class="trip">
+				点击【立即注销】即代表您已经同意《用户注销协议》
+			</view>
+			<view class="cancellation flex-aj-center" @click="isCancellation = true">
+				立即注销
+			</view>
+		</view>
+		<view class="mark" v-show="isCancellation"></view>
+		<view class="tipaddress" v-show="isCancellation">
+			<view class="top"></view>
+			<view class="bottom">
+				<view class="font1">是否确认注销</view>
+				<view class="font2">注销后无法恢复,请谨慎操作</view>
+				<view class="btn">
+					<view class="cancellation-btn btn-sty flex-aj-center" @tap="cancelUser">注销</view>
+					<view class="cancel btn-sty flex-aj-center" @tap="isCancellation = false">
+						取消
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import colors from '@/mixins/color.js';
+	import {
+		getUserAgreement,
+		cancelUser
+	} from '@/api/user.js'
+	export default {
+		mixins: [colors],
+		data() {
+			return {
+				isCancellation: false,
+				agreementData: ''
+			}
+		},
+		onLoad() {
+			this.getAgreement()
+		},
+		methods: {
+			getAgreement() {
+				getUserAgreement(5).then(res => {
+					this.agreementData = res.data
+				})
+			},
+			cancelUser() {
+				cancelUser().then(res => {
+					this.$store.commit("LOGOUT");
+					uni.reLaunch({
+						url: '/pages/index/index'
+					})
+				}).catch(msg => {
+					return this.$util.Tips({
+						title: msg
+					});
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.agreement {
+		background-color: #fff;
+
+		.content {
+			padding: 10rpx 30rpx;
+			overflow-y: scroll;
+			height: calc(100vh - 242rpx);
+		}
+	}
+
+	.top-msg {
+		display: flex;
+		align-items: center;
+		background-color: #fff;
+		padding: 40rpx 30rpx 40rpx 30rpx;
+
+		.avatar {
+			width: 76rpx;
+			height: 76rpx;
+			margin-right: 20rpx;
+
+			img {
+				width: 100%;
+				height: 100%;
+				border-radius: 50%;
+			}
+		}
+	}
+
+	.footer {
+		text-align: center;
+		z-index: 99;
+		width: 100%;
+		background-color: #fafafa;
+		position: fixed;
+		padding: 36rpx 30rpx;
+		box-sizing: border-box;
+		border-top: 1rpx solid #eee;
+		bottom: 0rpx;
+
+		.trip {
+			color: #999999;
+			font-size: 24rpx;
+			margin: 24rpx 0;
+		}
+
+		.cancellation {
+			height: 45px;
+			color: #fff;
+			font-size: 32rpx;
+			background: #E93323;
+			border-radius: 23px;
+		}
+	}
+
+	.tipaddress {
+		position: fixed;
+		left: 13%;
+		top: 25%;
+		// margin-left: -283rpx;
+		width: 560rpx;
+		height: 614rpx;
+		background-color: #fff;
+		border-radius: 10rpx;
+		z-index: 100;
+		text-align: center;
+
+		.top {
+			width: 560rpx;
+			height: 270rpx;
+			border-top-left-radius: 10rpx;
+			border-top-right-radius: 10rpx;
+			background-image: url(../static/address.png);
+			background-repeat: round;
+			background-color: #E93323;
+
+			.tipsphoto {
+				display: inline-block;
+				width: 200rpx;
+				height: 200rpx;
+				margin-top: 73rpx;
+			}
+		}
+
+		.bottom {
+			font-size: 32rpx;
+			font-weight: 400;
+
+			.font1 {
+
+				font-size: 36rpx;
+				font-weight: 600;
+				color: #333333;
+				margin: 32rpx 0rpx 22rpx;
+			}
+
+			.font2 {
+				color: #666666;
+				margin-bottom: 48rpx;
+			}
+
+			.btn {
+				display: flex;
+				margin: 0 20rpx;
+
+				.btn-sty {
+					height: 82rpx;
+					border-radius: 42rpx;
+					line-height: 82rpx;
+					padding: 24rpx 78rpx;
+					margin: 0 auto;
+				}
+
+				.cancellation-btn {
+					background-color: #F5F5F5;
+					color: #333333;
+				}
+
+				.cancel {
+					color: #FFFFFF;
+					background: linear-gradient(90deg, #F67A38 0%, #F11B09 100%);
+				}
+
+			}
+		}
+
+	}
+
+	.mark {
+		position: fixed;
+		top: 0;
+		left: 0;
+		bottom: 0;
+		right: 0;
+		background: rgba(0, 0, 0, 0.5);
+		z-index: 99;
+	}
+</style>

+ 6 - 0
template/uni-app/pages/users/user_info/index.vue

@@ -115,6 +115,12 @@
 							点击前往<text class="iconfont icon-xiangyou"></text>
 						</navigator>
 					</view>
+					<view class="item acea-row row-between-wrapper">
+						<view>账号注销</view>
+						<navigator url="/pages/users/user_cancellation/index" hover-class="none" class="input">
+							注销后无法恢复<text class="iconfont icon-xiangyou"></text>
+						</navigator>
+					</view>
 
 				</view>
 

+ 34 - 10
template/uni-app/pages/users/user_integral/index.vue

@@ -19,6 +19,13 @@
 						<view>冻结积分</view>
 					</view>
 				</view>
+				<view class="apply">
+					<view>
+						<navigator url='/pages/users/privacy/index?type=6' hover-class="none">
+							<view>积分规则</view>
+						</navigator>
+					</view>
+				</view>
 			</view>
 			<view class='wrapper'>
 				<view class='nav acea-row'>
@@ -30,7 +37,8 @@
 					<view class='tip acea-row row-middle' v-if="!isTime"><text
 							class='iconfont icon-shuoming'></text>提示:积分数值的高低会直接影响您的会员等级</view>
 					<view class='tip acea-row row-middle' v-else><text
-							class='iconfont icon-shuoming'></text>提示:你有{{userInfo.clear_integral}}积分在{{ userInfo.clear_time | dateFormat }}过期,请尽快使用</view>
+							class='iconfont icon-shuoming'></text>提示:你有{{userInfo.clear_integral}}积分在{{ userInfo.clear_time | dateFormat }}过期,请尽快使用
+					</view>
 					<view class='item acea-row row-between-wrapper' v-for="(item,index) in integralList" :key="index">
 						<view>
 							<view class='state'>{{item.mark}}</view>
@@ -101,7 +109,7 @@
 				return dayjs(value * 1000).format('YYYY-MM-DD');
 			}
 		},
-		mixins:[colors],
+		mixins: [colors],
 		data() {
 			return {
 				navList: [{
@@ -173,11 +181,11 @@
 				}).then(function(res) {
 					that.$set(that, 'userInfo', res.data);
 					let clearTime = res.data.clear_time;
-					let showTime = clearTime-(86400*14);
-					let timestamp = Date.parse(new Date())/1000;
-					if(showTime < timestamp){
+					let showTime = clearTime - (86400 * 14);
+					let timestamp = Date.parse(new Date()) / 1000;
+					if (showTime < timestamp) {
 						that.isTime = 1
-					}else{
+					} else {
 						that.isTime = 0
 					}
 				});
@@ -287,7 +295,7 @@
 
 	.integral-details .wrapper .nav .item.on {
 		background-color: #fff;
-		color: var( --view-theme);
+		color: var(--view-theme);
 		font-weight: bold;
 		border-radius: 20rpx 0 0 0;
 	}
@@ -342,9 +350,9 @@
 		font-family: 'Guildford Pro';
 		color: #16AC57;
 	}
-	
-	.integral-details .wrapper .list .item .num.font-color{
-		color: #E93323!important;
+
+	.integral-details .wrapper .list .item .num.font-color {
+		color: #E93323 !important;
 	}
 
 	.integral-details .wrapper .list2 {
@@ -393,4 +401,20 @@
 		width: 160rpx;
 		border-radius: 50rpx;
 	}
+
+	.apply {
+		top: 52rpx;
+		right: 0;
+		position: absolute;
+		width: max-content;
+		height: 56rpx;
+		padding: 0 14rpx;
+		background-color: #fff1db;
+		color: #a56a15;
+		font-size: 22rpx;
+		border-radius: 30rpx 0 0 30rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
 </style>