leisure-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/index.js +145 -0
  2. package/le-button/index.js +7 -0
  3. package/le-button/src/main.vue +48 -0
  4. package/le-button-msg/index.js +7 -0
  5. package/le-button-msg/src/main.vue +61 -0
  6. package/le-button-select-media/index.js +7 -0
  7. package/le-button-select-media/src/main.vue +64 -0
  8. package/le-button-upload/index.js +7 -0
  9. package/le-button-upload/src/main.vue +50 -0
  10. package/le-company/index.js +7 -0
  11. package/le-company/src/main.vue +101 -0
  12. package/le-company/src/sub.vue +111 -0
  13. package/le-coupon-give/index.js +7 -0
  14. package/le-coupon-give/src/main.vue +94 -0
  15. package/le-depart/index.js +7 -0
  16. package/le-depart/src/main.vue +162 -0
  17. package/le-dialog-container/index.js +7 -0
  18. package/le-dialog-container/src/main.vue +74 -0
  19. package/le-home/index.js +7 -0
  20. package/le-home/src/main.vue +570 -0
  21. package/le-image/index.js +7 -0
  22. package/le-image/src/main.vue +145 -0
  23. package/le-integral/index.js +7 -0
  24. package/le-integral/src/main.vue +198 -0
  25. package/le-libs/mixins/main.js +37 -0
  26. package/le-login/index.js +7 -0
  27. package/le-login/src/main.vue +181 -0
  28. package/le-media/index.js +7 -0
  29. package/le-media/src/main.vue +267 -0
  30. package/le-media-list/index.js +7 -0
  31. package/le-media-list/src/main.vue +177 -0
  32. package/le-media-upload/index.js +7 -0
  33. package/le-media-upload/src/main.vue +308 -0
  34. package/le-member/index.js +7 -0
  35. package/le-member/src/main.vue +445 -0
  36. package/le-member-level/index.js +7 -0
  37. package/le-member-level/src/main.vue +93 -0
  38. package/le-member-level/src/sub.vue +86 -0
  39. package/le-menu/index.js +7 -0
  40. package/le-menu/src/main.vue +248 -0
  41. package/le-rich-text/index.js +7 -0
  42. package/le-rich-text/src/main.vue +136 -0
  43. package/le-role/index.js +7 -0
  44. package/le-role/src/main.vue +169 -0
  45. package/le-role/src/sub.vue +79 -0
  46. package/le-role-user/index.js +7 -0
  47. package/le-role-user/src/main.vue +158 -0
  48. package/le-role-user/src/sub.vue +90 -0
  49. package/le-theme/common/var.scss +17 -0
  50. package/le-theme/iconfont/iconfont.css +125 -0
  51. package/le-theme/iconfont/iconfont.ttf +0 -0
  52. package/le-theme/iconfont/iconfont.woff +0 -0
  53. package/le-theme/iconfont/iconfont.woff2 +0 -0
  54. package/le-theme/pages/index.css +15 -0
  55. package/le-user/index.js +7 -0
  56. package/le-user/src/add.vue +118 -0
  57. package/le-user/src/main.vue +423 -0
  58. package/le-user/src/sub.vue +214 -0
  59. package/le-user-type/index.js +7 -0
  60. package/le-user-type/src/main.vue +39 -0
  61. package/package.json +51 -0
@@ -0,0 +1,7 @@
1
+ import LeIntegral from "./src/main.vue";
2
+
3
+ LeIntegral.install = function (Vue) {
4
+ Vue.component(LeIntegral.name, LeIntegral);
5
+ };
6
+
7
+ export default LeIntegral;
@@ -0,0 +1,198 @@
1
+ <template>
2
+ <div>
3
+ <el-form :inline="true" :model="searchData">
4
+ <el-form-item label="用户ID"
5
+ ><el-input v-model="searchData.uid" placeholder="用户ID"></el-input
6
+ ></el-form-item>
7
+ <el-form-item label="用户手机号"
8
+ ><el-input
9
+ v-model="searchData.phone"
10
+ placeholder="用户手机号"
11
+ ></el-input
12
+ ></el-form-item>
13
+ <!-- <el-form-item label="积分类型">
14
+ <el-select v-model="searchData.type" clearable placeholder="请选择">
15
+ <el-option label="消费积分" value="1" key="1"></el-option>
16
+ <el-option label="获取积分" value="0" key="0"></el-option>
17
+ </el-select>
18
+ </el-form-item> -->
19
+ <el-form-item
20
+ ><el-button type="primary" @click="list">查询</el-button></el-form-item
21
+ >
22
+ <el-form-item
23
+ ><el-button type="primary" @click="sum">汇总</el-button></el-form-item
24
+ >
25
+ <!-- <el-form-item>
26
+ <el-popconfirm
27
+ :title="`该操作不可逆,将清除所有过期积分!`"
28
+ @confirm="clear()"
29
+ >
30
+ <template #reference>
31
+ <el-button type="danger" size="small" style="margin-left: 10px"
32
+ >积分清零</el-button
33
+ >
34
+ </template>
35
+ </el-popconfirm></el-form-item
36
+ > -->
37
+ </el-form>
38
+ <vxe-table
39
+ :data="tableData"
40
+ :align="'center'"
41
+ :row-config="{ isHover: true }"
42
+ :column-config="{ resizable: true }"
43
+ ref="eltablemain"
44
+ :max-height="elTableMaxHeight"
45
+ border
46
+ stripe
47
+ style="width: 100%"
48
+ >
49
+ <vxe-column field="phone" title="手机号" show-overflow width="110">
50
+ <template slot-scope="scope">
51
+ {{ scope.row.phone ? scope.row.phone : scope.row.uid }}
52
+ </template>
53
+ </vxe-column>
54
+ <vxe-column field="nick" title="昵称" show-overflow width="110">
55
+ </vxe-column>
56
+ <vxe-column field="real_name" title="真实姓名" show-overflow width="110">
57
+ </vxe-column>
58
+ <vxe-column title="赠送积分">
59
+ <template slot-scope="scope">
60
+ {{ scope.row.quantity_r > 0 ? scope.row.quantity_r : "" }}
61
+ </template>
62
+ </vxe-column>
63
+ <vxe-column title="消费积分">
64
+ <template slot-scope="scope">
65
+ {{ scope.row.quantity_c > 0 ? scope.row.quantity_c : "" }}
66
+ </template>
67
+ </vxe-column>
68
+ <vxe-column field="cdate" title="交易日期">
69
+ <template slot-scope="scope">
70
+ {{ dateFormatter(scope.row.cdate) }}
71
+ </template>
72
+ </vxe-column>
73
+ <vxe-column field="cdate_out" title="过期日期" :formatter="dateFormatter">
74
+ <template slot-scope="scope">
75
+ {{ dateFormatter(scope.row.cdate_out) }}
76
+ </template>
77
+ </vxe-column>
78
+ <vxe-column field="note" title="备注"></vxe-column>
79
+ </vxe-table>
80
+ <div style="text-align: center; margin-top: 30px">
81
+ <vxe-pager
82
+ auto-hidden
83
+ align="center"
84
+ :current-page="searchData.pageNo"
85
+ :page-size="10"
86
+ :total="searchData.total"
87
+ :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Total']"
88
+ @page-change="current_change"
89
+ >
90
+ </vxe-pager>
91
+ </div>
92
+ </div>
93
+ </template>
94
+ <script>
95
+ import moment from "moment";
96
+ import { list, sum, clear } from "@/api/integral";
97
+ import leMixins from "leisure-ui/le-libs/mixins/main"; //
98
+ export default {
99
+ name: "le-integral",
100
+ mixins: [leMixins],
101
+ props: {
102
+ uid: {
103
+ type: String,
104
+ default: "",
105
+ },
106
+ },
107
+ data() {
108
+ return {
109
+ tableData: [],
110
+ searchData: {
111
+ uid: "",
112
+ phone: "",
113
+ pageNo: 1,
114
+ total: 1,
115
+ },
116
+ };
117
+ },
118
+ mounted() {
119
+ this.list();
120
+ },
121
+ methods: {
122
+ dateFormatter(data) {
123
+ if (data) {
124
+ return moment.unix(data).format("YYYY-MM-DD HH:mm:ss");
125
+ }
126
+ return "";
127
+ },
128
+ filterParams(obj) {
129
+ var _newPar = {};
130
+ for (var key in obj) {
131
+ if (
132
+ (obj[key] === false || obj[key]) &&
133
+ obj[key].toString().replace(/(^\s*)|(\s*$)/g, "") !== ""
134
+ ) {
135
+ _newPar[key] = obj[key];
136
+ }
137
+ }
138
+ return _newPar;
139
+ },
140
+ footerMethod() {
141
+ let footDatas = [];
142
+ if (this.tableData && this.tableData.length > 0) {
143
+ let footParam = [];
144
+ footParam.push("合计");
145
+ footParam.push("");
146
+ footParam.push("");
147
+ footParam.push("");
148
+ footParam.push(this.footerData.totalSaleNum);
149
+ footParam.push(this.footerData.totalSale / 100);
150
+ footDatas.push(footParam);
151
+ }
152
+ return footDatas;
153
+ },
154
+ current_change({ currentPage }) {
155
+ this.searchData.pageNo = currentPage;
156
+ this.list();
157
+ },
158
+ clear() {
159
+ clear().then(() => {
160
+ this.$message.success("所有用户过期积分已经全部清零");
161
+ });
162
+ },
163
+ sum() {
164
+ let params = this.filterParams(this.searchData);
165
+ if (!params.phone && !params.uid) {
166
+ this.$message.success("必须先输入uid或者手机号");
167
+ } else {
168
+ sum(params).then((res) => {
169
+ this.tableData = res.data.data;
170
+ this.searchData.total = 1;
171
+ });
172
+ }
173
+ },
174
+ list() {
175
+ let params = this.filterParams(this.searchData);
176
+ if (
177
+ this.uid &&
178
+ this.uid.length > 0 &&
179
+ (!params.uid || params.uid.length <= 0)
180
+ ) {
181
+ params.uid = this.uid;
182
+ }
183
+ list(params).then((res) => {
184
+ this.tableData = res.data.data.list;
185
+ this.searchData.total = res.data.data.count;
186
+ });
187
+ // if (!params.phone && !params.uid) {
188
+ // info("必须先输入uid或者手机号", this);
189
+ // } else {
190
+ // list(params).then((res) => {
191
+ // this.tableData = res.data.data.list;
192
+ // this.searchData.total = res.data.data.count;
193
+ // });
194
+ // }
195
+ },
196
+ },
197
+ };
198
+ </script>
@@ -0,0 +1,37 @@
1
+ const leMixins = {
2
+ data() {
3
+ return {
4
+ elTableMaxHeight: 200,
5
+ };
6
+ },
7
+
8
+ mounted() {
9
+ this.$nextTick(() => {
10
+ if (!this.$refs.eltablemain) return;
11
+ this.elTableMaxHeight =
12
+ window.innerHeight -
13
+ this.$refs.eltablemain.$el.getBoundingClientRect().top -
14
+ 90;
15
+ });
16
+ },
17
+
18
+ methods: {
19
+ renderHeader(h, { column, $index }) {
20
+ const opts = document.getElementsByClassName("le-table-btn-container");
21
+ let widthArr = [];
22
+ Array.prototype.forEach.call(opts, function (item) {
23
+ widthArr.push(item.offsetWidth);
24
+ });
25
+ if (widthArr.length > 0) {
26
+ let width = Math.max(...widthArr) + 24;
27
+ column.width = width;
28
+ return h("span", column.label);
29
+ } else {
30
+ column.width = 0;
31
+ return h("span", column.label);
32
+ }
33
+ },
34
+ },
35
+ };
36
+
37
+ export default leMixins;
@@ -0,0 +1,7 @@
1
+ import LeLogin from "./src/main.vue";
2
+
3
+ LeLogin.install = function (Vue) {
4
+ Vue.component(LeLogin.name, LeLogin);
5
+ };
6
+
7
+ export default LeLogin;
@@ -0,0 +1,181 @@
1
+ <template>
2
+ <el-form
3
+ class="le-login-cp"
4
+ ref="loginForm"
5
+ label-position="top"
6
+ label-width="80px"
7
+ :model="formdata"
8
+ :rules="rules"
9
+ >
10
+ <h2>用户登录</h2>
11
+ <el-form-item label="用户名" prop="account">
12
+ <el-input
13
+ v-model="formdata.account"
14
+ @keydown.enter.native="nextFocus(0)"
15
+ ></el-input>
16
+ </el-form-item>
17
+ <el-form-item label="密码" prop="pwd">
18
+ <el-input
19
+ show-password
20
+ v-model="formdata.pwd"
21
+ @keydown.enter.native="nextFocus(1)"
22
+ ></el-input>
23
+ </el-form-item>
24
+ <!-- <el-form-item label="验证码" prop="code">
25
+ <div class="verify">
26
+ <el-input
27
+ v-model="formdata.code"
28
+ @keydown.enter.native="nextFocus(2)"
29
+ style="flex: 1"
30
+ ></el-input>
31
+ <img class="verify-img" :src="verifyCodeImg" @click="getImg()" />
32
+ </div>
33
+ </el-form-item> -->
34
+ <el-button
35
+ class="btn"
36
+ type="primary"
37
+ @keydown.enter="handleLodin()"
38
+ @click="handleLodin()"
39
+ >登录</el-button
40
+ >
41
+ </el-form>
42
+ </template>
43
+ <script>
44
+ import { setToken } from "leisure-js/common/tokens";
45
+ export default {
46
+ name: "le-login",
47
+ props: {
48
+ home: {
49
+ type: String,
50
+ default: "/home",
51
+ },
52
+ isCode: {
53
+ //是否启用验证码
54
+ type: String,
55
+ default: "0", //0:否 1:启用
56
+ },
57
+ },
58
+ data() {
59
+ var checkCode = (rule, value, callback) => {
60
+ if (!value) {
61
+ return callback(new Error("请输入验证码"));
62
+ } else {
63
+ if (value.toUpperCase() == this.verifyCode.toUpperCase()) {
64
+ return callback();
65
+ } else {
66
+ return callback(new Error("验证码不正确"));
67
+ }
68
+ }
69
+ };
70
+ return {
71
+ to: "",
72
+ formdata: {
73
+ account: "",
74
+ pwd: "",
75
+ },
76
+ rules: {
77
+ account: [
78
+ { required: true, message: "请输入账号(手机号)", trigger: "blur" },
79
+ {
80
+ min: 1,
81
+ max: 13,
82
+ message: "长度在 1 到 13 个字符",
83
+ trigger: "blur",
84
+ },
85
+ ],
86
+ pwd: [
87
+ { required: true, message: "请输入密码", trigger: "blur" },
88
+ {
89
+ min: 2,
90
+ max: 12,
91
+ message: "长度在 1 到 10 个字符",
92
+ trigger: "blur",
93
+ },
94
+ ],
95
+ code: [{ required: true, validator: checkCode, trigger: "blur" }],
96
+ },
97
+ verifyCode: "",
98
+ verifyCodeImg: "",
99
+ };
100
+ },
101
+ mounted() {
102
+ this.getImg();
103
+ this.to = this.$route.params.to;
104
+ this.$nextTick(() => {
105
+ this.$refs.loginForm.$el[0].focus();
106
+ });
107
+ },
108
+ methods: {
109
+ getImg() {
110
+ if (this.isCode) {
111
+ this.$emit("handleVerifyImage"); //验证码验证
112
+ }
113
+ },
114
+ nextFocus(index) {
115
+ if (index < 1) {
116
+ this.$refs["loginForm"].$el[index + 1].focus();
117
+ } else {
118
+ this.handleLodin();
119
+ }
120
+ },
121
+ handleLodin() {
122
+ // this.$refs.loginForm.validateField('code');
123
+ this.$refs["loginForm"].validate((valid) => {
124
+ if (valid) {
125
+ this.$emit(
126
+ "handleLodin",
127
+ {
128
+ account: this.formdata.account,
129
+ pwd: this.formdata.pwd,
130
+ },
131
+ this.loginAfter,
132
+ this.nav2Home
133
+ );
134
+ } else {
135
+ console.log("error submit!!");
136
+ return false;
137
+ }
138
+ });
139
+ return;
140
+ },
141
+
142
+ loginAfter(res) {
143
+ if (res.data.code == "10000") {
144
+ this.$store.commit("setCid", res.data.data.cid);
145
+ this.$store.commit("setUserInfo", res.data.data);
146
+ setToken(res.data.data.token);
147
+ }
148
+ },
149
+ nav2Home() {
150
+ this.$router.push({ path: this.home });
151
+ },
152
+ },
153
+ };
154
+ </script>
155
+ <style lang="scss" scoped>
156
+ .le-login-cp {
157
+ width: 400px;
158
+ background: #fff;
159
+ border-radius: 5px;
160
+ padding: 30px;
161
+
162
+ .btn {
163
+ width: 100%;
164
+ }
165
+
166
+ .verify {
167
+ width: 100%;
168
+ display: flex;
169
+ align-items: center;
170
+ justify-content: space-between;
171
+ }
172
+
173
+ .verify-img {
174
+ width: 120px;
175
+ height: 40px;
176
+ margin-left: 20px;
177
+ cursor: pointer;
178
+ border-radius: 5px;
179
+ }
180
+ }
181
+ </style>
@@ -0,0 +1,7 @@
1
+ import LeMedia from "./src/main.vue";
2
+
3
+ LeMedia.install = function (Vue) {
4
+ Vue.component(LeMedia.name, LeMedia);
5
+ };
6
+
7
+ export default LeMedia;
@@ -0,0 +1,267 @@
1
+ <template>
2
+ <div class="media-container">
3
+ <div class="top-box">
4
+ <!-- <div class="group-box">分组</div> -->
5
+
6
+ <div class="media-list-box">
7
+ <div class="search">
8
+ <el-form :inline="true">
9
+ <el-form-item label="分组名称">
10
+ <el-input v-model="group" placeholder="请输入分组名称"></el-input>
11
+ </el-form-item>
12
+ <el-form-item label="标题名称">
13
+ <el-input v-model="title" placeholder="请输入标题名称"></el-input>
14
+ </el-form-item>
15
+ <el-form-item>
16
+ <el-button type="primary" @click="searchMediaList"
17
+ >查询</el-button
18
+ >
19
+ <el-button type="info" @click="resetSearch">重置</el-button>
20
+ </el-form-item>
21
+ </el-form>
22
+ </div>
23
+ <div class="list">
24
+ <div
25
+ class="list-item"
26
+ v-for="(item, i) in mediaList"
27
+ :key="i + 'media'"
28
+ >
29
+ <img v-if="item.types == 1" :src="item.url" alt="" />
30
+ <video class="video" v-else controls>
31
+ <source :src="item.url" type="video/mp4" />
32
+ </video>
33
+ <div class="name">
34
+ {{ "(" + item.group_name + ")" + item.title }}
35
+ <el-button type="text" @click="editFun(item)">编辑</el-button>
36
+ <el-button type="text" style="color: red" @click="delFun(item)"
37
+ >删除</el-button
38
+ >
39
+ </div>
40
+ </div>
41
+ </div>
42
+ <div class="pagination">
43
+ <span>共计 {{ total }} 条</span>
44
+ <el-pagination
45
+ background
46
+ @current-change="handleCurrentChange"
47
+ :current-page.sync="pageNo"
48
+ :page-size="10"
49
+ layout=" prev, pager, next"
50
+ :total="total"
51
+ >
52
+ </el-pagination>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ <div class="bottom-box">
57
+ <div>
58
+ <el-button type="primary" @click="openUploadDialog">上传素材</el-button>
59
+ </div>
60
+ <div>
61
+ <!-- <el-button type="danger">删除</el-button>
62
+ <el-button type="primary">确认</el-button> -->
63
+ </div>
64
+ </div>
65
+ <el-dialog
66
+ v-el-drag-dialog
67
+ width="60%"
68
+ title="上传素材"
69
+ :visible.sync="uploadMediaShow"
70
+ :close-on-click-modal="false"
71
+ append-to-body
72
+ >
73
+ <le-media-upload
74
+ v-if="uploadMediaShow"
75
+ @cancel="cancelUploadMedia"
76
+ :mediaObj="mediaObj"
77
+ ></le-media-upload>
78
+ </el-dialog>
79
+ </div>
80
+ </template>
81
+ <script>
82
+ import { systemMaterialDel, systemMaterialList } from "@/api/media";
83
+ import { mapGetters } from "vuex";
84
+
85
+ export default {
86
+ name: "le-media",
87
+ data() {
88
+ return {
89
+ tableData: [],
90
+ uploadMediaShow: false,
91
+ group: "",
92
+ title: "",
93
+ total: 100,
94
+ pageNo: 1,
95
+ mediaList: [],
96
+ mediaObj: null,
97
+ };
98
+ },
99
+ computed: {
100
+ ...mapGetters({
101
+ userinfo: "userinfo",
102
+ }),
103
+ },
104
+ mounted() {
105
+ this.list();
106
+ },
107
+ methods: {
108
+ editFun(item) {
109
+ this.mediaObj = JSON.parse(JSON.stringify(item));
110
+ setTimeout(() => {
111
+ this.uploadMediaShow = true;
112
+ }, 10);
113
+ },
114
+ delFun(item) {
115
+ let id = item.id;
116
+ this.$confirm(`是否删除该素材?`, "提示", {
117
+ confirmButtonText: "确定",
118
+ cancelButtonText: "取消",
119
+ type: "error",
120
+ })
121
+ .then(() => {
122
+ systemMaterialDel({ id: id }).then((res) => {
123
+ this.list();
124
+ if (res.data.code == "10000") {
125
+ this.$message.success("删除成功");
126
+ } else {
127
+ this.$message.error(res.data.info);
128
+ }
129
+ });
130
+ })
131
+ .catch(() => {});
132
+ },
133
+ cancelUploadMedia(flag) {
134
+ this.uploadMediaShow = false;
135
+ if (flag) {
136
+ this.pageNo = 1;
137
+ }
138
+ this.mediaObj = null;
139
+ this.list();
140
+ },
141
+ openUploadDialog() {
142
+ this.uploadMediaShow = true;
143
+ },
144
+ handleCurrentChange(page) {
145
+ this.pageNo = page;
146
+ this.list();
147
+ },
148
+ resetSearch() {
149
+ this.group = "";
150
+ this.title = "";
151
+ this.pageNo = 1;
152
+ this.list();
153
+ },
154
+ searchMediaList() {
155
+ this.pageNo = 1;
156
+ this.list();
157
+ },
158
+ list() {
159
+ let params = {
160
+ pageNo: this.pageNo,
161
+ group: this.group,
162
+ title: this.title,
163
+ };
164
+ systemMaterialList(params).then((res) => {
165
+ if (res.data.code == "10000") {
166
+ this.mediaList = res.data.data.list;
167
+ this.total = res.data.data.count;
168
+ } else {
169
+ this.$message.error(res.data.info);
170
+ }
171
+ });
172
+ },
173
+ },
174
+ };
175
+ </script>
176
+ <style lang="less" scoped>
177
+ .media-container {
178
+ width: 100%;
179
+ height: 90%;
180
+
181
+ .top-box {
182
+ width: 100%;
183
+ height: 90%;
184
+ display: flex;
185
+
186
+ .group-box {
187
+ width: 200px;
188
+ border: 1px solid #f4f4f4;
189
+ padding: 10px;
190
+ box-sizing: border-box;
191
+ }
192
+
193
+ .media-list-box {
194
+ flex: 1;
195
+ display: flex;
196
+ flex-direction: column;
197
+ justify-content: space-around;
198
+ border: 1px solid #f4f4f4;
199
+ padding: 10px;
200
+ box-sizing: border-box;
201
+
202
+ .search {
203
+ height: 40px;
204
+ border-bottom: 1px solid #f4f4f4;
205
+ }
206
+
207
+ .list {
208
+ display: flex;
209
+ flex-wrap: wrap;
210
+ overflow: auto;
211
+ height: 590px;
212
+ box-sizing: border-box;
213
+ padding: 10px 0;
214
+
215
+ .list-item {
216
+ width: 200px;
217
+ height: 240px;
218
+ margin-left: 20px;
219
+ margin-top: 20px;
220
+ border: 1px solid #f4f4f4;
221
+ box-sizing: border-box;
222
+
223
+ img {
224
+ width: 200px;
225
+ height: 200px;
226
+ border-bottom: 1px solid #f4f4f4;
227
+ }
228
+ .video {
229
+ width: 200px;
230
+ height: 200px;
231
+ border-bottom: 1px solid #f4f4f4;
232
+ }
233
+
234
+ .name {
235
+ box-sizing: border-box;
236
+ line-height: 30px;
237
+ font-size: 12px;
238
+ text-align: center;
239
+ color: #666;
240
+ }
241
+ }
242
+ }
243
+
244
+ .pagination {
245
+ width: 100%;
246
+ height: 60px;
247
+ display: flex;
248
+ padding: 0 20px;
249
+ justify-content: space-between;
250
+ align-items: center;
251
+ border-top: 1px solid #f4f4f4;
252
+ box-sizing: border-box;
253
+ }
254
+ }
255
+ }
256
+
257
+ .bottom-box {
258
+ width: 100%;
259
+ height: 10%;
260
+ line-height: 1;
261
+ box-sizing: border-box;
262
+ padding: 20px;
263
+ display: flex;
264
+ justify-content: space-between;
265
+ }
266
+ }
267
+ </style>