增加名单导入功能
Showing
5 changed files
with
166 additions
and
20 deletions
| ... | @@ -13,8 +13,14 @@ | ... | @@ -13,8 +13,14 @@ |
| 13 | <div id="tags"> | 13 | <div id="tags"> |
| 14 | <ul v-for="item in datas" :key="item.key"> | 14 | <ul v-for="item in datas" :key="item.key"> |
| 15 | <li> | 15 | <li> |
| 16 | <a href="javascript:void(0);" :style="style(item)"> | 16 | <a |
| 17 | {{ item.key }} | 17 | href="javascript:void(0);" |
| 18 | :style="{ | ||
| 19 | color: | ||
| 20 | !running && allresult.includes(item.key) ? '#ff2200' : '#fff' | ||
| 21 | }" | ||
| 22 | > | ||
| 23 | {{ item.name ? item.name : item.key }} | ||
| 18 | </a> | 24 | </a> |
| 19 | </li> | 25 | </li> |
| 20 | </ul> | 26 | </ul> |
| ... | @@ -22,6 +28,7 @@ | ... | @@ -22,6 +28,7 @@ |
| 22 | <transition name="bounce"> | 28 | <transition name="bounce"> |
| 23 | <div id="resbox" v-show="showRes"> | 29 | <div id="resbox" v-show="showRes"> |
| 24 | <p @click="showRes = false">{{ categoryName }}抽奖结果:</p> | 30 | <p @click="showRes = false">{{ categoryName }}抽奖结果:</p> |
| 31 | <div class="container"> | ||
| 25 | <span | 32 | <span |
| 26 | v-for="item in resArr" | 33 | v-for="item in resArr" |
| 27 | :key="item" | 34 | :key="item" |
| ... | @@ -29,8 +36,32 @@ | ... | @@ -29,8 +36,32 @@ |
| 29 | :style="resCardStyle" | 36 | :style="resCardStyle" |
| 30 | @click="showRes = false" | 37 | @click="showRes = false" |
| 31 | > | 38 | > |
| 39 | <span | ||
| 40 | class="key" | ||
| 41 | :style="{ | ||
| 42 | fontSize: list[item] && list[item].name ? '36px' : null, | ||
| 43 | lineHeight: list[item] && list[item].name ? '80px' : null | ||
| 44 | }" | ||
| 45 | v-if="list[item] && list[item].name" | ||
| 46 | > | ||
| 32 | {{ item }} | 47 | {{ item }} |
| 33 | </span> | 48 | </span> |
| 49 | <span | ||
| 50 | class="cont" | ||
| 51 | :style="{ | ||
| 52 | fontSize: list[item] && list[item].name ? '36px' : null, | ||
| 53 | lineHeight: list[item] && list[item].name ? '80px' : null | ||
| 54 | }" | ||
| 55 | > | ||
| 56 | <span v-if="list[item] && list[item].name"> | ||
| 57 | {{ list[item].name }} | ||
| 58 | </span> | ||
| 59 | <span v-else> | ||
| 60 | {{ item }} | ||
| 61 | </span> | ||
| 62 | </span> | ||
| 63 | </span> | ||
| 64 | </div> | ||
| 34 | </div> | 65 | </div> |
| 35 | </transition> | 66 | </transition> |
| 36 | 67 | ||
| ... | @@ -52,7 +83,8 @@ import { | ... | @@ -52,7 +83,8 @@ import { |
| 52 | configField, | 83 | configField, |
| 53 | resultField, | 84 | resultField, |
| 54 | newLotteryField, | 85 | newLotteryField, |
| 55 | conversionCategoryName | 86 | conversionCategoryName, |
| 87 | listField | ||
| 56 | } from '@/helper/index'; | 88 | } from '@/helper/index'; |
| 57 | import { luckydrawHandler } from '@/helper/algorithm'; | 89 | import { luckydrawHandler } from '@/helper/algorithm'; |
| 58 | import Result from '@/components/Result'; | 90 | import Result from '@/components/Result'; |
| ... | @@ -87,6 +119,9 @@ export default { | ... | @@ -87,6 +119,9 @@ export default { |
| 87 | this.$store.commit('setResult', val); | 119 | this.$store.commit('setResult', val); |
| 88 | } | 120 | } |
| 89 | }, | 121 | }, |
| 122 | list() { | ||
| 123 | return this.$store.state.list; | ||
| 124 | }, | ||
| 90 | allresult() { | 125 | allresult() { |
| 91 | let allresult = []; | 126 | let allresult = []; |
| 92 | for (const key in this.result) { | 127 | for (const key in this.result) { |
| ... | @@ -100,8 +135,10 @@ export default { | ... | @@ -100,8 +135,10 @@ export default { |
| 100 | datas() { | 135 | datas() { |
| 101 | const datas = []; | 136 | const datas = []; |
| 102 | for (let index = 0; index < this.config.number; index++) { | 137 | for (let index = 0; index < this.config.number; index++) { |
| 138 | const listData = this.list.find(d => d.key === index); | ||
| 103 | datas.push({ | 139 | datas.push({ |
| 104 | key: index + 1 | 140 | key: index + 1, |
| 141 | name: listData ? listData.name : '' | ||
| 105 | }); | 142 | }); |
| 106 | } | 143 | } |
| 107 | return datas; | 144 | return datas; |
| ... | @@ -131,6 +168,11 @@ export default { | ... | @@ -131,6 +168,11 @@ export default { |
| 131 | }); | 168 | }); |
| 132 | this.$store.commit('setConfig', config); | 169 | this.$store.commit('setConfig', config); |
| 133 | } | 170 | } |
| 171 | |||
| 172 | const list = getData(listField); | ||
| 173 | if (list) { | ||
| 174 | this.$store.commit('setList', list); | ||
| 175 | } | ||
| 134 | }, | 176 | }, |
| 135 | 177 | ||
| 136 | data() { | 178 | data() { |
| ... | @@ -147,13 +189,6 @@ export default { | ... | @@ -147,13 +189,6 @@ export default { |
| 147 | this.startTagCanvas(); | 189 | this.startTagCanvas(); |
| 148 | }, | 190 | }, |
| 149 | methods: { | 191 | methods: { |
| 150 | style() { | ||
| 151 | const style = { color: '#fff' }; | ||
| 152 | // if (!this.running && this.allresult.includes(item.key)) { | ||
| 153 | // style.color = 'yellow'; | ||
| 154 | // } | ||
| 155 | return style; | ||
| 156 | }, | ||
| 157 | speed() { | 192 | speed() { |
| 158 | return [0.1 * Math.random() + 0.01, -(0.1 * Math.random() + 0.01)]; | 193 | return [0.1 * Math.random() + 0.01, -(0.1 * Math.random() + 0.01)]; |
| 159 | }, | 194 | }, |
| ... | @@ -183,8 +218,10 @@ export default { | ... | @@ -183,8 +218,10 @@ export default { |
| 183 | const { speed, config } = this; | 218 | const { speed, config } = this; |
| 184 | if (this.running) { | 219 | if (this.running) { |
| 185 | window.TagCanvas.SetSpeed('rootcanvas', speed()); | 220 | window.TagCanvas.SetSpeed('rootcanvas', speed()); |
| 186 | this.reloadTagCanvas(); | ||
| 187 | this.showRes = true; | 221 | this.showRes = true; |
| 222 | this.$nextTick(() => { | ||
| 223 | this.reloadTagCanvas(); | ||
| 224 | }); | ||
| 188 | } else { | 225 | } else { |
| 189 | this.showRes = false; | 226 | this.showRes = false; |
| 190 | const { number } = config; | 227 | const { number } = config; |
| ... | @@ -270,7 +307,7 @@ export default { | ... | @@ -270,7 +307,7 @@ export default { |
| 270 | 307 | ||
| 271 | #resbox { | 308 | #resbox { |
| 272 | position: absolute; | 309 | position: absolute; |
| 273 | top: 45%; | 310 | top: 50%; |
| 274 | left: 50%; | 311 | left: 50%; |
| 275 | width: 1000px; | 312 | width: 1000px; |
| 276 | transform: translateX(-50%) translateY(-50%); | 313 | transform: translateX(-50%) translateY(-50%); |
| ... | @@ -280,9 +317,13 @@ export default { | ... | @@ -280,9 +317,13 @@ export default { |
| 280 | font-size: 50px; | 317 | font-size: 50px; |
| 281 | line-height: 120px; | 318 | line-height: 120px; |
| 282 | } | 319 | } |
| 320 | .container { | ||
| 321 | display: flex; | ||
| 322 | justify-content: center; | ||
| 323 | flex-wrap: wrap; | ||
| 324 | } | ||
| 283 | .itemres { | 325 | .itemres { |
| 284 | background: #fff; | 326 | background: #fff; |
| 285 | display: inline-block; | ||
| 286 | width: 160px; | 327 | width: 160px; |
| 287 | height: 160px; | 328 | height: 160px; |
| 288 | border-radius: 4px; | 329 | border-radius: 4px; |
| ... | @@ -292,6 +333,13 @@ export default { | ... | @@ -292,6 +333,13 @@ export default { |
| 292 | margin-right: 20px; | 333 | margin-right: 20px; |
| 293 | margin-top: 20px; | 334 | margin-top: 20px; |
| 294 | cursor: pointer; | 335 | cursor: pointer; |
| 336 | display: flex; | ||
| 337 | flex-direction: column; | ||
| 338 | align-items: center; | ||
| 339 | justify-content: center; | ||
| 340 | .key { | ||
| 341 | color: red; | ||
| 342 | } | ||
| 295 | } | 343 | } |
| 296 | } | 344 | } |
| 297 | </style> | 345 | </style> | ... | ... |
| ... | @@ -150,11 +150,15 @@ export default { | ... | @@ -150,11 +150,15 @@ export default { |
| 150 | onSubmit() { | 150 | onSubmit() { |
| 151 | setData(configField, this.form); | 151 | setData(configField, this.form); |
| 152 | this.$emit('update:visible', false); | 152 | this.$emit('update:visible', false); |
| 153 | this.$emit('resetconfig'); | 153 | |
| 154 | this.$message({ | 154 | this.$message({ |
| 155 | message: '保存成功', | 155 | message: '保存成功', |
| 156 | type: 'success' | 156 | type: 'success' |
| 157 | }); | 157 | }); |
| 158 | |||
| 159 | this.$nextTick(() => { | ||
| 160 | this.$emit('resetconfig'); | ||
| 161 | }); | ||
| 158 | }, | 162 | }, |
| 159 | addLottery() { | 163 | addLottery() { |
| 160 | this.showAddLottery = true; | 164 | this.showAddLottery = true; | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <div id="tool"> | 2 | <div id="tool"> |
| 3 | <el-button @click="startHandler" size="mini">{{ | 3 | <el-button @click="startHandler" type="primary" size="mini">{{ |
| 4 | running ? '停止' : '开始' | 4 | running ? '停止' : '开始' |
| 5 | }}</el-button> | 5 | }}</el-button> |
| 6 | <el-button size="mini" @click="resetConfig"> | 6 | <el-button size="mini" @click="resetConfig"> |
| 7 | 重置 | 7 | 重置 |
| 8 | </el-button> | 8 | </el-button> |
| 9 | <el-button size="mini" @click="showImport = true"> | ||
| 10 | 导入名单 | ||
| 11 | </el-button> | ||
| 9 | <el-dialog | 12 | <el-dialog |
| 10 | :append-to-body="true" | 13 | :append-to-body="true" |
| 11 | :visible.sync="showSetwat" | 14 | :visible.sync="showSetwat" |
| ... | @@ -70,6 +73,30 @@ | ... | @@ -70,6 +73,30 @@ |
| 70 | </el-form-item> | 73 | </el-form-item> |
| 71 | </el-form> | 74 | </el-form> |
| 72 | </el-dialog> | 75 | </el-dialog> |
| 76 | |||
| 77 | <el-dialog | ||
| 78 | :append-to-body="true" | ||
| 79 | :visible.sync="showImport" | ||
| 80 | class="import-dialog" | ||
| 81 | width="400px" | ||
| 82 | > | ||
| 83 | <el-input | ||
| 84 | type="textarea" | ||
| 85 | :rows="10" | ||
| 86 | placeholder="请输入对应的号码和名单(可直接从excel复制),格式(号码 名字),导入的名单将代替号码显示在抽奖中。如: | ||
| 87 | 1 张三 | ||
| 88 | 2 李四 | ||
| 89 | 3 王五 | ||
| 90 | " | ||
| 91 | v-model="listStr" | ||
| 92 | ></el-input> | ||
| 93 | <div class="footer"> | ||
| 94 | <el-button size="mini" type="primary" @click="transformList" | ||
| 95 | >确定</el-button | ||
| 96 | > | ||
| 97 | <el-button size="mini" @click="showImport = false">取消</el-button> | ||
| 98 | </div> | ||
| 99 | </el-dialog> | ||
| 73 | </div> | 100 | </div> |
| 74 | </template> | 101 | </template> |
| 75 | 102 | ||
| ... | @@ -118,12 +145,14 @@ export default { | ... | @@ -118,12 +145,14 @@ export default { |
| 118 | data() { | 145 | data() { |
| 119 | return { | 146 | return { |
| 120 | showSetwat: false, | 147 | showSetwat: false, |
| 148 | showImport: false, | ||
| 121 | form: { | 149 | form: { |
| 122 | category: '', | 150 | category: '', |
| 123 | mode: 1, | 151 | mode: 1, |
| 124 | qty: 1, | 152 | qty: 1, |
| 125 | allin: false | 153 | allin: false |
| 126 | } | 154 | }, |
| 155 | listStr: '' | ||
| 127 | }; | 156 | }; |
| 128 | }, | 157 | }, |
| 129 | methods: { | 158 | methods: { |
| ... | @@ -136,11 +165,15 @@ export default { | ... | @@ -136,11 +165,15 @@ export default { |
| 136 | .then(() => { | 165 | .then(() => { |
| 137 | clearData(); | 166 | clearData(); |
| 138 | this.$store.commit('setClearStore'); | 167 | this.$store.commit('setClearStore'); |
| 139 | this.$emit('resetConfig'); | 168 | |
| 140 | this.$message({ | 169 | this.$message({ |
| 141 | type: 'success', | 170 | type: 'success', |
| 142 | message: '重置成功!' | 171 | message: '重置成功!' |
| 143 | }); | 172 | }); |
| 173 | |||
| 174 | this.$nextTick(() => { | ||
| 175 | this.$emit('resetConfig'); | ||
| 176 | }); | ||
| 144 | }) | 177 | }) |
| 145 | .catch(() => { | 178 | .catch(() => { |
| 146 | this.$message({ | 179 | this.$message({ |
| ... | @@ -181,6 +214,38 @@ export default { | ... | @@ -181,6 +214,38 @@ export default { |
| 181 | } else { | 214 | } else { |
| 182 | this.showSetwat = true; | 215 | this.showSetwat = true; |
| 183 | } | 216 | } |
| 217 | }, | ||
| 218 | transformList() { | ||
| 219 | const { listStr } = this; | ||
| 220 | if (!listStr) { | ||
| 221 | this.$message.error('没有数据'); | ||
| 222 | } | ||
| 223 | const list = []; | ||
| 224 | const rows = listStr.split('\n'); | ||
| 225 | if (rows && rows.length > 0) { | ||
| 226 | rows.forEach(item => { | ||
| 227 | const rowList = item.split('\t'); | ||
| 228 | if (rowList.length >= 2) { | ||
| 229 | const key = Number(rowList[0].trim()); | ||
| 230 | const name = rowList[1].trim(); | ||
| 231 | key && | ||
| 232 | list.push({ | ||
| 233 | key, | ||
| 234 | name | ||
| 235 | }); | ||
| 236 | } | ||
| 237 | }); | ||
| 238 | } | ||
| 239 | this.$store.commit('setList', list); | ||
| 240 | |||
| 241 | this.$message({ | ||
| 242 | message: '保存成功', | ||
| 243 | type: 'success' | ||
| 244 | }); | ||
| 245 | this.showImport = false; | ||
| 246 | this.$nextTick(() => { | ||
| 247 | this.$emit('resetConfig'); | ||
| 248 | }); | ||
| 184 | } | 249 | } |
| 185 | } | 250 | } |
| 186 | }; | 251 | }; |
| ... | @@ -209,4 +274,11 @@ export default { | ... | @@ -209,4 +274,11 @@ export default { |
| 209 | font-weight: bold; | 274 | font-weight: bold; |
| 210 | } | 275 | } |
| 211 | } | 276 | } |
| 277 | .import-dialog { | ||
| 278 | .footer { | ||
| 279 | height: 50px; | ||
| 280 | line-height: 50px; | ||
| 281 | text-align: center; | ||
| 282 | } | ||
| 283 | } | ||
| 212 | </style> | 284 | </style> | ... | ... |
| ... | @@ -36,6 +36,7 @@ export function getDomData(element, dataName) { | ... | @@ -36,6 +36,7 @@ export function getDomData(element, dataName) { |
| 36 | export const configField = 'config'; // 配置数据 | 36 | export const configField = 'config'; // 配置数据 |
| 37 | export const resultField = 'result'; // 抽奖结果 | 37 | export const resultField = 'result'; // 抽奖结果 |
| 38 | export const newLotteryField = 'newLottery'; // 新增奖项 | 38 | export const newLotteryField = 'newLottery'; // 新增奖项 |
| 39 | export const listField = 'list'; // 名单 | ||
| 39 | 40 | ||
| 40 | export function conversionCategoryName(key) { | 41 | export function conversionCategoryName(key) { |
| 41 | let name = ''; | 42 | let name = ''; | ... | ... |
| 1 | import Vue from 'vue'; | 1 | import Vue from 'vue'; |
| 2 | import Vuex from 'vuex'; | 2 | import Vuex from 'vuex'; |
| 3 | import { setData, resultField, newLotteryField } from '@/helper/index'; | 3 | import { |
| 4 | setData, | ||
| 5 | resultField, | ||
| 6 | newLotteryField, | ||
| 7 | listField | ||
| 8 | } from '@/helper/index'; | ||
| 4 | 9 | ||
| 5 | Vue.use(Vuex); | 10 | Vue.use(Vuex); |
| 6 | 11 | ||
| ... | @@ -24,7 +29,8 @@ export default new Vuex.Store({ | ... | @@ -24,7 +29,8 @@ export default new Vuex.Store({ |
| 24 | fourthPrize: [], | 29 | fourthPrize: [], |
| 25 | fifthPrize: [] | 30 | fifthPrize: [] |
| 26 | }, | 31 | }, |
| 27 | newLottery: [] | 32 | newLottery: [], |
| 33 | list: [] | ||
| 28 | }, | 34 | }, |
| 29 | mutations: { | 35 | mutations: { |
| 30 | setClearStore(state) { | 36 | setClearStore(state) { |
| ... | @@ -47,6 +53,7 @@ export default new Vuex.Store({ | ... | @@ -47,6 +53,7 @@ export default new Vuex.Store({ |
| 47 | fifthPrize: [] | 53 | fifthPrize: [] |
| 48 | }; | 54 | }; |
| 49 | state.newLottery = []; | 55 | state.newLottery = []; |
| 56 | state.list = []; | ||
| 50 | }, | 57 | }, |
| 51 | setConfig(state, config) { | 58 | setConfig(state, config) { |
| 52 | state.config = config; | 59 | state.config = config; |
| ... | @@ -62,6 +69,20 @@ export default new Vuex.Store({ | ... | @@ -62,6 +69,20 @@ export default new Vuex.Store({ |
| 62 | } | 69 | } |
| 63 | state.newLottery.push(newLottery); | 70 | state.newLottery.push(newLottery); |
| 64 | setData(newLotteryField, state.newLottery); | 71 | setData(newLotteryField, state.newLottery); |
| 72 | }, | ||
| 73 | setList(state, list) { | ||
| 74 | const arr = state.list; | ||
| 75 | list.forEach(item => { | ||
| 76 | const arrItem = arr.find(data => data.key === item.key); | ||
| 77 | if (arrItem) { | ||
| 78 | arrItem.name === item.name; | ||
| 79 | } else { | ||
| 80 | arr.push(item); | ||
| 81 | } | ||
| 82 | }); | ||
| 83 | state.list = arr; | ||
| 84 | |||
| 85 | setData(listField, arr); | ||
| 65 | } | 86 | } |
| 66 | }, | 87 | }, |
| 67 | actions: {}, | 88 | actions: {}, | ... | ... |
-
Please register or sign in to post a comment